[ros-dev] [ros-diffs] [gbrunmar] 33689: * Changed to correct signature of NtUserGetClassName() * Implemented correct behaviour in GetRealWindowClass(), but in reality just shifted the todo parts to NtUserGetClassName() instead.
Alex Ionescu
ionucu at videotron.ca
Wed Jun 11 07:57:12 CEST 2008
This change breaks mIRC.
By the way:
1) Congratulations on the fact it took two weeks for someone to report
this on BZ
And
2) Even more congratulations on the fact that it's been another week
since then, and nobody has:
2.1) Emailed the ros-dev about this yet
2.2) And/or reverted this change.
Let's try to ignore this until 0.3.6, to make sure that we ship with a
broken release.
On 25-May-08, at 1:36 AM, gbrunmar at svn.reactos.org wrote:
> Author: gbrunmar
> Date: Sun May 25 03:36:30 2008
> New Revision: 33689
>
> URL: http://svn.reactos.org/svn/reactos?rev=33689&view=rev
> Log:
> * Changed to correct signature of NtUserGetClassName()
> * Implemented correct behaviour in GetRealWindowClass(), but in
> reality just shifted the todo parts to NtUserGetClassName() instead.
>
> 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/class.c?rev=33689&r1=33688&r2=33689&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- trunk/reactos/dll/win32/user32/windows/class.c [iso-8859-1]
> (original)
> +++ trunk/reactos/dll/win32/user32/windows/class.c [iso-8859-1] Sun
> May 25 03:36:30 2008
> @@ -421,15 +421,22 @@
> LPSTR lpClassName,
> int nMaxCount)
> {
> - ANSI_STRING ClassName;
> - int Result;
> -
> - ClassName.MaximumLength = nMaxCount;
> - ClassName.Buffer = lpClassName;
> -
> - Result = NtUserGetClassName(hWnd,
> - (PUNICODE_STRING)&ClassName,
> - TRUE);
> + 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);
>
> TRACE("%p class/atom: %s/%04x %x\n", hWnd,
> IS_ATOM(lpClassName) ? NULL : lpClassName,
> @@ -456,9 +463,7 @@
> ClassName.MaximumLength = nMaxCount * sizeof(WCHAR);
> ClassName.Buffer = lpClassName;
>
> - Result = NtUserGetClassName(hWnd,
> - &ClassName,
> - FALSE);
> + Result = NtUserGetClassName(hWnd, FALSE, &ClassName);
>
> TRACE("%p class/atom: %S/%04x %x\n", hWnd,
> IS_ATOM(lpClassName) ? NULL : lpClassName,
> @@ -629,12 +634,24 @@
> UINT
> STDCALL
> RealGetWindowClassW(
> - HWND hwnd,
> + HWND hWnd,
> LPWSTR pszType,
> UINT cchType)
> {
> - /* FIXME: Implement correct functionality of RealGetWindowClass */
> - return GetClassNameW(hwnd,pszType,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;
> }
>
>
> @@ -644,12 +661,33 @@
> UINT
> STDCALL
> RealGetWindowClassA(
> - HWND hwnd,
> + HWND hWnd,
> LPSTR pszType,
> UINT cchType)
> {
> - /* FIXME: Implement correct functionality of RealGetWindowClass */
> - return GetClassNameA(hwnd,pszType,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;
> }
>
> /*
>
> Modified: trunk/reactos/include/reactos/win32k/ntuser.h
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntuser.h?rev=33689&r1=33688&r2=33689&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1]
> (original)
> +++ trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] Sun
> May 25 03:36:30 2008
> @@ -1160,18 +1160,11 @@
> LPWSTR *ppszMenuName,
> BOOL Ansi);
>
> -INT
> +UINT
> NTAPI
> NtUserGetClassName(HWND hWnd,
> - PUNICODE_STRING ClassName,
> - BOOL Ansi);
> -#if 0 // Real NtUserGetClassName
> -INT
> -NTAPI
> -NtUserGetClassName(HWND hWnd,
> - BOOL Unknown, // 0 GetClassNameW, 1
> RealGetWindowClassA/W
> + BOOL bGetRealClass, // 0 GetClassNameA/W, 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/ntuser/class.c?rev=33689&r1=33688&r2=33689&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- trunk/reactos/subsystems/win32/win32k/ntuser/class.c
> [iso-8859-1] (original)
> +++ trunk/reactos/subsystems/win32/win32k/ntuser/class.c
> [iso-8859-1] Sun May 25 03:36:30 2008
> @@ -1255,118 +1255,39 @@
>
> INT
> UserGetClassName(IN PWINDOWCLASS Class,
> - IN OUT PUNICODE_STRING ClassName,
> - IN BOOL Ansi)
> + IN OUT PUNICODE_STRING ClassName)
> {
> NTSTATUS Status = STATUS_SUCCESS;
> - WCHAR szStaticTemp[32];
> - PWSTR szTemp = NULL;
> - ULONG BufLen = sizeof(szStaticTemp);
> + ULONG BufLen;
> INT Ret = 0;
>
> /* Note: Accessing the buffer in ClassName may raise an
> exception! */
>
> _SEH_TRY
> {
> - 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);
> - }
> + 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;
> }
> @@ -2265,10 +2186,10 @@
>
>
>
> -INT NTAPI
> -NtUserGetClassName (IN HWND hWnd,
> - OUT PUNICODE_STRING ClassName,
> - IN BOOL Ansi)
> +UINT NTAPI
> +NtUserGetClassName(IN HWND hWnd,
> + IN BOOL bGetRealClass, // 0 GetClassNameA/W, 1
> RealGetWindowClassA/W
> + OUT PUNICODE_STRING ClassName)
> {
> PWINDOW_OBJECT Window;
> UNICODE_STRING CapturedClassName;
> @@ -2284,10 +2205,11 @@
> ProbeForWriteUnicodeString(ClassName);
> CapturedClassName = *ClassName;
>
> + /* TODO: Get real class name here if bGetRealClass ==
> TRUE */
> +
> /* get the class name */
> Ret = UserGetClassName(Window->Wnd->Class,
> - &CapturedClassName,
> - Ansi);
> + &CapturedClassName);
>
> if (Ret != 0)
> {
>
Best regards,
Alex Ionescu
More information about the Ros-dev
mailing list