Author: fireball
Date: Wed Jun 11 04:05:39 2008
New Revision: 33928
URL:
http://svn.reactos.org/svn/reactos?rev=33928&view=rev
Log:
- Revert 33689 as breaking mIRC installation.
See issue #3328 for more details.
Modified:
trunk/reactos/dll/win32/user32/windows/class.c
trunk/reactos/include/reactos/win32k/ntuser.h
trunk/reactos/subsystems/win32/win32k/ntuser/class.c
Modified: trunk/reactos/dll/win32/user32/windows/class.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/c…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/class.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/class.c [iso-8859-1] Wed Jun 11 04:05:39 2008
@@ -421,22 +421,15 @@
LPSTR lpClassName,
int nMaxCount)
{
- UNICODE_STRING ClassName;
- INT Result;
-
- ClassName.MaximumLength = nMaxCount * sizeof(WCHAR);
- ClassName.Buffer = LocalAlloc(LMEM_FIXED, ClassName.MaximumLength);
- if (ClassName.Buffer == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return 0;
- }
-
- Result = NtUserGetClassName(hWnd, FALSE, &ClassName);
-
- WideCharToMultiByte(CP_ACP, 0, ClassName.Buffer, Result, lpClassName, nMaxCount - 1,
NULL, NULL);
- lpClassName[nMaxCount - 1] = '\0';
- LocalFree(ClassName.Buffer);
+ ANSI_STRING ClassName;
+ int Result;
+
+ ClassName.MaximumLength = nMaxCount;
+ ClassName.Buffer = lpClassName;
+
+ Result = NtUserGetClassName(hWnd,
+ (PUNICODE_STRING)&ClassName,
+ TRUE);
TRACE("%p class/atom: %s/%04x %x\n", hWnd,
IS_ATOM(lpClassName) ? NULL : lpClassName,
@@ -463,7 +456,9 @@
ClassName.MaximumLength = nMaxCount * sizeof(WCHAR);
ClassName.Buffer = lpClassName;
- Result = NtUserGetClassName(hWnd, FALSE, &ClassName);
+ Result = NtUserGetClassName(hWnd,
+ &ClassName,
+ FALSE);
TRACE("%p class/atom: %S/%04x %x\n", hWnd,
IS_ATOM(lpClassName) ? NULL : lpClassName,
@@ -634,24 +629,12 @@
UINT
STDCALL
RealGetWindowClassW(
- HWND hWnd,
+ HWND hwnd,
LPWSTR pszType,
UINT cchType)
{
- UNICODE_STRING ClassName;
- UINT Length;
-
- ClassName.MaximumLength = cchType * sizeof(WCHAR);
- ClassName.Buffer = pszType;
-
- Length = NtUserGetClassName(hWnd, TRUE, &ClassName);
-
- TRACE("%p class/atom: %S/%04x %x\n", hWnd,
- IS_ATOM(pszType) ? NULL : pszType,
- IS_ATOM(pszType) ? pszType : 0,
- cchType);
-
- return Length;
+ /* FIXME: Implement correct functionality of RealGetWindowClass */
+ return GetClassNameW(hwnd,pszType,cchType);
}
@@ -661,33 +644,12 @@
UINT
STDCALL
RealGetWindowClassA(
- HWND hWnd,
+ HWND hwnd,
LPSTR pszType,
UINT cchType)
{
- UNICODE_STRING ClassName;
- UINT Length;
-
- ClassName.MaximumLength = cchType * sizeof(WCHAR);
- ClassName.Buffer = LocalAlloc(LMEM_FIXED, ClassName.MaximumLength);
- if (ClassName.Buffer == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return 0;
- }
-
- Length = NtUserGetClassName(hWnd, TRUE, &ClassName);
-
- WideCharToMultiByte(CP_ACP, 0, ClassName.Buffer, Length, pszType, cchType - 1, NULL,
NULL);
- pszType[cchType - 1] = '\0';
- LocalFree(ClassName.Buffer);
-
- TRACE("%p class/atom: %s/%04x %x\n", hWnd,
- IS_ATOM(pszType) ? NULL : pszType,
- IS_ATOM(pszType) ? pszType : 0,
- cchType);
-
- return Length;
+ /* FIXME: Implement correct functionality of RealGetWindowClass */
+ return GetClassNameA(hwnd,pszType,cchType);
}
/*
Modified: trunk/reactos/include/reactos/win32k/ntuser.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntu…
==============================================================================
--- trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] Wed Jun 11 04:05:39 2008
@@ -1255,11 +1255,18 @@
LPWSTR *ppszMenuName,
BOOL Ansi);
-UINT
+INT
NTAPI
NtUserGetClassName(HWND hWnd,
- BOOL bGetRealClass, // 0 GetClassNameA/W, 1 RealGetWindowClassA/W
+ PUNICODE_STRING ClassName,
+ BOOL Ansi);
+#if 0 // Real NtUserGetClassName
+INT
+NTAPI
+NtUserGetClassName(HWND hWnd,
+ BOOL Unknown, // 0 GetClassNameW, 1 RealGetWindowClassA/W
PUNICODE_STRING ClassName);
+#endif
HANDLE
NTAPI
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/class.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/class.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/class.c [iso-8859-1] Wed Jun 11 04:05:39
2008
@@ -1264,39 +1264,118 @@
INT
UserGetClassName(IN PWINDOWCLASS Class,
- IN OUT PUNICODE_STRING ClassName)
+ IN OUT PUNICODE_STRING ClassName,
+ IN BOOL Ansi)
{
NTSTATUS Status = STATUS_SUCCESS;
- ULONG BufLen;
+ WCHAR szStaticTemp[32];
+ PWSTR szTemp = NULL;
+ ULONG BufLen = sizeof(szStaticTemp);
INT Ret = 0;
/* Note: Accessing the buffer in ClassName may raise an exception! */
_SEH_TRY
{
- BufLen = ClassName->MaximumLength;
-
- /* query the atom name */
- Status = RtlQueryAtomInAtomTable(gAtomTable,
- Class->Atom,
- NULL,
- NULL,
- ClassName->Buffer,
- &BufLen);
-
- if (!NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- _SEH_LEAVE;
- }
-
- Ret = BufLen / sizeof(WCHAR);
+ if (Ansi)
+ {
+ PANSI_STRING AnsiClassName = (PANSI_STRING)ClassName;
+ UNICODE_STRING UnicodeClassName;
+
+ /* limit the size of the static buffer on the stack to the
+ size of the buffer provided by the caller */
+ if (BufLen / sizeof(WCHAR) > AnsiClassName->MaximumLength)
+ {
+ BufLen = AnsiClassName->MaximumLength * sizeof(WCHAR);
+ }
+
+ /* find out how big the buffer needs to be */
+ Status = RtlQueryAtomInAtomTable(gAtomTable,
+ Class->Atom,
+ NULL,
+ NULL,
+ szStaticTemp,
+ &BufLen);
+ if (Status == STATUS_BUFFER_TOO_SMALL)
+ {
+ if (BufLen / sizeof(WCHAR) > AnsiClassName->MaximumLength)
+ {
+ /* the buffer required exceeds the ansi buffer provided,
+ pretend like we're using the ansi buffer and limit the
+ size to the buffer size provided */
+ BufLen = AnsiClassName->MaximumLength * sizeof(WCHAR);
+ }
+
+ /* allocate a temporary buffer that can hold the unicode class name */
+ szTemp = ExAllocatePool(PagedPool,
+ BufLen);
+ if (szTemp == NULL)
+ {
+ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+ _SEH_LEAVE;
+ }
+
+ /* query the class name */
+ Status = RtlQueryAtomInAtomTable(gAtomTable,
+ Class->Atom,
+ NULL,
+ NULL,
+ szTemp,
+ &BufLen);
+ }
+ else
+ szTemp = szStaticTemp;
+
+ if (NT_SUCCESS(Status))
+ {
+ /* convert the atom name to ansi */
+
+ RtlInitUnicodeString(&UnicodeClassName,
+ szTemp);
+
+ Status = RtlUnicodeStringToAnsiString(AnsiClassName,
+ &UnicodeClassName,
+ FALSE);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ _SEH_LEAVE;
+ }
+ }
+
+ Ret = BufLen / sizeof(WCHAR);
+ }
+ else /* !Ansi */
+ {
+ BufLen = ClassName->MaximumLength;
+
+ /* query the atom name */
+ Status = RtlQueryAtomInAtomTable(gAtomTable,
+ Class->Atom,
+ NULL,
+ NULL,
+ ClassName->Buffer,
+ &BufLen);
+
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ _SEH_LEAVE;
+ }
+
+ Ret = BufLen / sizeof(WCHAR);
+ }
}
_SEH_HANDLE
{
SetLastNtError(_SEH_GetExceptionCode());
}
_SEH_END;
+
+ if (Ansi && szTemp != NULL && szTemp != szStaticTemp)
+ {
+ ExFreePool(szTemp);
+ }
return Ret;
}
@@ -2195,10 +2274,10 @@
-UINT NTAPI
-NtUserGetClassName(IN HWND hWnd,
- IN BOOL bGetRealClass, // 0 GetClassNameA/W, 1 RealGetWindowClassA/W
- OUT PUNICODE_STRING ClassName)
+INT NTAPI
+NtUserGetClassName (IN HWND hWnd,
+ OUT PUNICODE_STRING ClassName,
+ IN BOOL Ansi)
{
PWINDOW_OBJECT Window;
UNICODE_STRING CapturedClassName;
@@ -2214,11 +2293,10 @@
ProbeForWriteUnicodeString(ClassName);
CapturedClassName = *ClassName;
- /* TODO: Get real class name here if bGetRealClass == TRUE */
-
/* get the class name */
Ret = UserGetClassName(Window->Wnd->Class,
- &CapturedClassName);
+ &CapturedClassName,
+ Ansi);
if (Ret != 0)
{