Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / reactos / win32ss / user / user32 / windows / class.c
diff --git a/reactos/win32ss/user/user32/windows/class.c b/reactos/win32ss/user/user32/windows/class.c
deleted file mode 100644 (file)
index caa5931..0000000
+++ /dev/null
@@ -1,1932 +0,0 @@
-/*
- * PROJECT:         ReactOS user32.dll
- * COPYRIGHT:       GPL - See COPYING in the top level directory
- * FILE:            win32ss/user/user32/windows/class.c
- * PURPOSE:         Window classes
- * PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
- * UPDATE HISTORY:
- *      09-05-2001  CSH  Created
- */
-
-#include <user32.h>
-
-#include <wine/debug.h>
-WINE_DEFAULT_DEBUG_CHANNEL(user32);
-
-#define USE_VERSIONED_CLASSES
-
-/* From rtl/actctx.c and must match! */
-struct strsection_header
-{
-    DWORD magic;
-    ULONG size;
-    DWORD unk1[3];
-    ULONG count;
-    ULONG index_offset;
-    DWORD unk2[2];
-    ULONG global_offset;
-    ULONG global_len;
-};
-
-struct wndclass_redirect_data
-{
-    ULONG size;
-    DWORD res;
-    ULONG name_len;
-    ULONG name_offset;  /* versioned name offset */
-    ULONG module_len;
-    ULONG module_offset;/* container name offset */
-};
-
-//
-// Use wine hack to process extended context classes.
-//
-/***********************************************************************
- *           is_comctl32_class
- */
-LPCWSTR is_comctl32_class( const WCHAR *name )
-{
-    static const WCHAR classesW[][20] =
-    {
-        {'C','o','m','b','o','B','o','x','E','x','3','2',0},
-        {'m','s','c','t','l','s','_','h','o','t','k','e','y','3','2',0},
-        {'m','s','c','t','l','s','_','p','r','o','g','r','e','s','s','3','2',0},
-        {'m','s','c','t','l','s','_','s','t','a','t','u','s','b','a','r','3','2',0},
-        {'m','s','c','t','l','s','_','t','r','a','c','k','b','a','r','3','2',0},
-        {'m','s','c','t','l','s','_','u','p','d','o','w','n','3','2',0},
-        {'N','a','t','i','v','e','F','o','n','t','C','t','l',0},
-        {'R','e','B','a','r','W','i','n','d','o','w','3','2',0},
-        {'S','y','s','A','n','i','m','a','t','e','3','2',0},
-        {'S','y','s','D','a','t','e','T','i','m','e','P','i','c','k','3','2',0},
-        {'S','y','s','H','e','a','d','e','r','3','2',0},
-        {'S','y','s','I','P','A','d','d','r','e','s','s','3','2',0},
-        {'S','y','s','L','i','s','t','V','i','e','w','3','2',0},
-        {'S','y','s','M','o','n','t','h','C','a','l','3','2',0},
-        {'S','y','s','P','a','g','e','r',0},
-        {'S','y','s','T','a','b','C','o','n','t','r','o','l','3','2',0},
-        {'S','y','s','T','r','e','e','V','i','e','w','3','2',0},
-        {'T','o','o','l','b','a','r','W','i','n','d','o','w','3','2',0},
-        {'t','o','o','l','t','i','p','s','_','c','l','a','s','s','3','2',0},
-    };
-
-    int min = 0, max = (sizeof(classesW) / sizeof(classesW[0])) - 1;
-
-    while (min <= max)
-    {
-        int res, pos = (min + max) / 2;
-        if (!(res = strcmpiW( name, classesW[pos] ))) return classesW[pos];
-        if (res < 0) max = pos - 1;
-        else min = pos + 1;
-    }
-    return NULL;
-}
-
-LPCWSTR
-FASTCALL
-ClassNameToVersion(
-  const void* lpszClass,
-  LPCWSTR lpszMenuName,
-  LPCWSTR *plpLibFileName,
-  HANDLE *pContext,
-  BOOL bAnsi)
-{
-    LPCWSTR VersionedClass = NULL;
-    NTSTATUS Status;
-    UNICODE_STRING SectionName;
-    WCHAR SectionNameBuf[MAX_PATH] = {0};
-    ACTCTX_SECTION_KEYED_DATA KeyedData = { sizeof(KeyedData) };
-
-    if(!lpszClass)
-    {
-        ERR("Null class given !\n");
-        return NULL;
-    }
-
-    if (IS_ATOM(lpszClass))
-    {
-        RtlInitEmptyUnicodeString(&SectionName, SectionNameBuf, sizeof(SectionNameBuf));
-        if(!NtUserGetAtomName(LOWORD((DWORD_PTR)lpszClass), &SectionName))
-        {
-            ERR("Couldn't get atom name for atom %x !\n", LOWORD((DWORD_PTR)lpszClass));
-            return NULL;
-        }
-        SectionName.Length = wcslen(SectionNameBuf) * sizeof(WCHAR);
-        TRACE("ClassNameToVersion got name %wZ from atom\n", &SectionName);
-    }
-    else
-    {
-        if (bAnsi)
-        {
-            ANSI_STRING AnsiString;
-            RtlInitAnsiString(&AnsiString, lpszClass);
-            RtlInitEmptyUnicodeString(&SectionName, SectionNameBuf, sizeof(SectionNameBuf));
-            RtlAnsiStringToUnicodeString(&SectionName, &AnsiString, FALSE);
-        }
-        else
-        {
-            RtlInitUnicodeString(&SectionName, lpszClass);
-        }
-    }
-    Status = RtlFindActivationContextSectionString( FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX,
-                                                    NULL,
-                                                    ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION,
-                                                   &SectionName,
-                                                   &KeyedData );
-
-#ifdef USE_VERSIONED_CLASSES
-    if (NT_SUCCESS(Status) && KeyedData.ulDataFormatVersion == 1)
-    {
-        struct strsection_header *SectionHeader = KeyedData.lpSectionBase;
-
-        /* Find activation context */
-        if(SectionHeader && SectionHeader->count > 0)
-        {
-            struct wndclass_redirect_data *WindowRedirectionData = KeyedData.lpData;
-            if(WindowRedirectionData && WindowRedirectionData->module_len)
-            {
-                LPCWSTR lpLibFileName;
-
-                VersionedClass = (WCHAR*)((BYTE*)WindowRedirectionData + WindowRedirectionData->name_offset);
-                lpLibFileName = (WCHAR*)((BYTE*)KeyedData.lpSectionBase + WindowRedirectionData->module_offset);
-                TRACE("Returning VersionedClass=%S, plpLibFileName=%S for class %S\n", VersionedClass, lpLibFileName, SectionName.Buffer);
-
-                if (pContext) *pContext = KeyedData.hActCtx;
-                if (plpLibFileName) *plpLibFileName = lpLibFileName;
-
-            }
-        }
-    }
-
-    if (KeyedData.hActCtx)
-        RtlReleaseActivationContext(KeyedData.hActCtx);
-#endif
-
-#ifndef DEFAULT_ACTIVATION_CONTEXTS_SUPPORTED
-    /* This block is a hack! */
-    if (!VersionedClass)
-    {
-        /*
-         * In windows the default activation context always contains comctl32v5
-         * In reactos we don't have a default activation context so we
-         * mimic wine here.
-         */
-        VersionedClass = is_comctl32_class(SectionName.Buffer);
-        if (VersionedClass)
-        {
-            if (pContext) *pContext = 0;
-            if (plpLibFileName) *plpLibFileName = L"comctl32";
-        }
-    }
-#endif
-
-    /*
-     * The returned strings are pointers in the activation context and
-     * will get freed when the activation context gets freed
-     */
-    return VersionedClass;
-}
-
-//
-// Ref: http://yvs-it.blogspot.com/2010/04/initcommoncontrolsex.html
-//
-BOOL
-FASTCALL
-VersionRegisterClass(
-  PCWSTR pszClass,
-  LPCWSTR lpLibFileName,
-  HANDLE Contex,
-  HMODULE * phLibModule)
-{
-    BOOL Ret = FALSE;
-    HMODULE hLibModule = NULL;
-    PREGISTERCLASSNAMEW pRegisterClassNameW;
-    UNICODE_STRING ClassName;
-    WCHAR ClassNameBuf[MAX_PATH] = {0};
-    RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame = { sizeof(Frame), 1 };
-
-    ERR("VersionRegisterClass: Attempting to call RegisterClassNameW in %S\n.", lpLibFileName);
-
-    RtlActivateActivationContextUnsafeFast(&Frame, Contex);
-
-    _SEH2_TRY
-    {
-        hLibModule = LoadLibraryW(lpLibFileName);
-        if (hLibModule)
-        {
-            if ((pRegisterClassNameW = (void*)GetProcAddress(hLibModule, "RegisterClassNameW")))
-            {
-                if (IS_ATOM(pszClass))
-                {
-                    RtlInitEmptyUnicodeString(&ClassName, ClassNameBuf, sizeof(ClassNameBuf));
-                    if (!NtUserGetAtomName(LOWORD((DWORD_PTR)pszClass), &ClassName))
-                    {
-                        ERR("Error while verifying ATOM\n");
-                        _SEH2_YIELD(goto Error_Exit);
-                    }
-                    pszClass = ClassName.Buffer;
-                }
-                Ret = pRegisterClassNameW(pszClass);
-            }
-            else
-            {
-                WARN("No RegisterClassNameW PROC\n");
-            }
-        }
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-    }
-    _SEH2_END
-
-Error_Exit:
-    if (Ret || !hLibModule)
-    {
-        if (phLibModule) *phLibModule = hLibModule;
-    }
-    else
-    {
-        DWORD dwLastError = GetLastError();
-        FreeLibrary(hLibModule);
-        SetLastError(dwLastError);
-    }
-
-    RtlDeactivateActivationContextUnsafeFast(&Frame);
-    return Ret;
-}
-
-/*
- * @implemented
- */
-BOOL
-WINAPI
-GetClassInfoExA(
-  HINSTANCE hInstance,
-  LPCSTR lpszClass,
-  LPWNDCLASSEXA lpwcx)
-{
-    UNICODE_STRING ClassName = {0};
-    LPCSTR pszMenuName;
-    HMODULE hLibModule = NULL;
-    DWORD dwLastError;
-    BOOL Ret, ClassFound = FALSE, ConvertedString = FALSE;
-    LPCWSTR lpszClsVersion;
-    HANDLE pCtx = NULL;
-    LPCWSTR lpLibFileName = NULL;
-
-    TRACE("%p class/atom: %s/%04x %p\n", hInstance,
-        IS_ATOM(lpszClass) ? NULL : lpszClass,
-        IS_ATOM(lpszClass) ? lpszClass : 0,
-        lpwcx);
-
-    if (!lpwcx)
-    {
-        SetLastError(ERROR_NOACCESS);
-        return FALSE;
-    }
-
-    if (hInstance == User32Instance)
-    {
-        hInstance = NULL;
-    }
-
-    if (lpszClass == NULL)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-
-    lpszClsVersion = ClassNameToVersion(lpszClass, NULL, &lpLibFileName, &pCtx, TRUE);
-    if (lpszClsVersion)
-    {
-        RtlInitUnicodeString(&ClassName, lpszClsVersion);
-    }
-    else if (IS_ATOM(lpszClass))
-    {
-        ClassName.Buffer = (PWSTR)((ULONG_PTR)lpszClass);
-    }
-    else
-    {
-        ConvertedString = TRUE;
-        if (!RtlCreateUnicodeStringFromAsciiz(&ClassName, lpszClass))
-        {
-            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-            return FALSE;
-        }
-    }
-
-    if (!RegisterDefaultClasses)
-    {
-        TRACE("RegisterSystemControls\n");
-        RegisterSystemControls();
-    }
-
-    for(;;)
-    {
-        Ret = NtUserGetClassInfo(hInstance,
-                                 &ClassName,
-                                 (LPWNDCLASSEXW)lpwcx,
-                                 (LPWSTR *)&pszMenuName,
-                                 TRUE);
-        if (Ret) break;
-        if (!lpLibFileName) break;
-        if (!ClassFound)
-        {
-            dwLastError = GetLastError();
-            if ( dwLastError == ERROR_CANNOT_FIND_WND_CLASS ||
-                 dwLastError == ERROR_CLASS_DOES_NOT_EXIST )
-            {
-                ClassFound = VersionRegisterClass(ClassName.Buffer, lpLibFileName, pCtx, &hLibModule);
-                if (ClassFound) continue;
-            }
-        }
-        if (hLibModule)
-        {
-            dwLastError = GetLastError();
-            FreeLibrary(hLibModule);
-            SetLastError(dwLastError);
-            hLibModule = 0;
-        }
-        break;
-    }
-
-    if (Ret)
-    {
-        lpwcx->lpszClassName = lpszClass;
-//       lpwcx->lpszMenuName  = pszMenuName;
-    }
-
-    if (ConvertedString)
-    {
-        RtlFreeUnicodeString(&ClassName);
-    }
-
-    return Ret;
-}
-
-
-/*
- * @implemented
- */
-BOOL
-WINAPI
-GetClassInfoExW(
-  HINSTANCE hInstance,
-  LPCWSTR lpszClass,
-  LPWNDCLASSEXW lpwcx)
-{
-    UNICODE_STRING ClassName = {0};
-    LPWSTR pszMenuName;
-    HMODULE hLibModule = NULL;
-    DWORD dwLastError;
-    BOOL Ret, ClassFound = FALSE;
-    LPCWSTR lpszClsVersion;
-    HANDLE pCtx = NULL;
-    LPCWSTR lpLibFileName = NULL;
-
-    TRACE("%p class/atom: %S/%04x %p\n", hInstance,
-        IS_ATOM(lpszClass) ? NULL : lpszClass,
-        IS_ATOM(lpszClass) ? lpszClass : 0,
-        lpwcx);
-
-    /* From wine, for speed only, ReactOS supports the correct return in
-     * Win32k. cbSize is ignored.
-     */
-    if (!lpwcx)
-    {
-       SetLastError( ERROR_NOACCESS );
-       return FALSE;
-    }
-
-    if (hInstance == User32Instance)
-    {
-        hInstance = NULL;
-    }
-
-    if (lpszClass == NULL)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-
-    lpszClsVersion = ClassNameToVersion(lpszClass, NULL, &lpLibFileName, &pCtx, FALSE);
-    if (lpszClsVersion)
-    {
-        RtlInitUnicodeString(&ClassName, lpszClsVersion);
-    }
-    else if (IS_ATOM(lpszClass))
-    {
-        ClassName.Buffer = (PWSTR)((ULONG_PTR)lpszClass);
-    }
-    else
-    {
-        RtlInitUnicodeString(&ClassName, lpszClass);
-    }
-
-    if (!RegisterDefaultClasses)
-    {
-       TRACE("RegisterSystemControls\n");
-       RegisterSystemControls();
-    }
-
-    for(;;)
-    {
-        Ret = NtUserGetClassInfo( hInstance,
-                                 &ClassName,
-                                  lpwcx,
-                                 &pszMenuName,
-                                  FALSE);
-        if (Ret) break;
-        if (!lpLibFileName) break;
-        if (!ClassFound)
-        {
-            dwLastError = GetLastError();
-            if ( dwLastError == ERROR_CANNOT_FIND_WND_CLASS ||
-                 dwLastError == ERROR_CLASS_DOES_NOT_EXIST )
-            {
-                ClassFound = VersionRegisterClass(ClassName.Buffer, lpLibFileName, pCtx, &hLibModule);
-                if (ClassFound) continue;
-            }
-        }
-        if (hLibModule)
-        {
-            dwLastError = GetLastError();
-            FreeLibrary(hLibModule);
-            SetLastError(dwLastError);
-            hLibModule = 0;
-        }
-        break;
-    }
-
-    if (Ret)
-    {
-        lpwcx->lpszClassName = lpszClass;
-//       lpwcx->lpszMenuName  = pszMenuName;
-    }
-    return Ret;
-}
-
-
-/*
- * @implemented
- */
-BOOL
-WINAPI
-GetClassInfoA(
-  HINSTANCE hInstance,
-  LPCSTR lpClassName,
-  LPWNDCLASSA lpWndClass)
-{
-    WNDCLASSEXA wcex;
-    BOOL retval;
-
-    retval = GetClassInfoExA(hInstance, lpClassName, &wcex);
-    if (retval)
-    {
-        lpWndClass->style         = wcex.style;
-        lpWndClass->lpfnWndProc   = wcex.lpfnWndProc;
-        lpWndClass->cbClsExtra    = wcex.cbClsExtra;
-        lpWndClass->cbWndExtra    = wcex.cbWndExtra;
-        lpWndClass->hInstance     = wcex.hInstance;
-        lpWndClass->hIcon         = wcex.hIcon;
-        lpWndClass->hCursor       = wcex.hCursor;
-        lpWndClass->hbrBackground = wcex.hbrBackground;
-        lpWndClass->lpszMenuName  = wcex.lpszMenuName;
-        lpWndClass->lpszClassName = wcex.lpszClassName;
-    }
-
-    return retval;
-}
-
-/*
- * @implemented
- */
-BOOL
-WINAPI
-GetClassInfoW(
-  HINSTANCE hInstance,
-  LPCWSTR lpClassName,
-  LPWNDCLASSW lpWndClass)
-{
-    WNDCLASSEXW wcex;
-    BOOL retval;
-
-    retval = GetClassInfoExW(hInstance, lpClassName, &wcex);
-    if (retval)
-    {
-        lpWndClass->style         = wcex.style;
-        lpWndClass->lpfnWndProc   = wcex.lpfnWndProc;
-        lpWndClass->cbClsExtra    = wcex.cbClsExtra;
-        lpWndClass->cbWndExtra    = wcex.cbWndExtra;
-        lpWndClass->hInstance     = wcex.hInstance;
-        lpWndClass->hIcon         = wcex.hIcon;
-        lpWndClass->hCursor       = wcex.hCursor;
-        lpWndClass->hbrBackground = wcex.hbrBackground;
-        lpWndClass->lpszMenuName  = wcex.lpszMenuName;
-        lpWndClass->lpszClassName = wcex.lpszClassName;
-    }
-    return retval;
-}
-
-//
-// Based on find_winproc... Fixes many whine tests......
-//
-ULONG_PTR FASTCALL
-IntGetClsWndProc(PWND pWnd, PCLS Class, BOOL Ansi)
-{
-    INT i;
-    ULONG_PTR gcpd, Ret = 0;
- // If server side, sweep through proc list and return the client side proc.
-    if (Class->CSF_flags & CSF_SERVERSIDEPROC)
-    {  // Always scan through the list due to wine class "deftest".
-        for ( i = FNID_FIRST; i <= FNID_SWITCH; i++)
-        {
-            if (GETPFNSERVER(i) == Class->lpfnWndProc)
-            {
-                if (Ansi)
-                    Ret = (ULONG_PTR)GETPFNCLIENTA(i);
-                else
-                    Ret = (ULONG_PTR)GETPFNCLIENTW(i);
-            }
-        }
-         return Ret;
-    }
-    // Set return proc.
-    Ret = (ULONG_PTR)Class->lpfnWndProc;
-    // Return the proc if one of the FnId default class type.
-    if (Class->fnid <= FNID_GHOST && Class->fnid >= FNID_BUTTON)
-    {
-        if (Ansi)
-        { // If match return the right proc by type.
-            if (GETPFNCLIENTW(Class->fnid) == Class->lpfnWndProc)
-                Ret = (ULONG_PTR)GETPFNCLIENTA(Class->fnid);
-        }
-        else
-        {
-            if (GETPFNCLIENTA(Class->fnid) == Class->lpfnWndProc)
-               Ret = (ULONG_PTR)GETPFNCLIENTW(Class->fnid);
-        }
-    }
-    // Return on change or Ansi/Unicode proc equal.
-    if ( Ret != (ULONG_PTR)Class->lpfnWndProc ||
-         Ansi == !!(Class->CSF_flags & CSF_ANSIPROC) )
-        return Ret;
-
-    /* We have an Ansi and Unicode swap! If Ansi create Unicode proc handle.
-       This will force CallWindowProc to deal with it. */
-    gcpd = NtUserGetCPD( UserHMGetHandle(pWnd),
-                         (Ansi ? UserGetCPDA2U : UserGetCPDU2A )|UserGetCPDWndtoCls,
-                         Ret);
-
-    return (gcpd ? gcpd : Ret);
-}
-
-//
-// Based on IntGetClsWndProc
-//
-WNDPROC FASTCALL
-IntGetWndProc(PWND pWnd, BOOL Ansi)
-{
-    INT i;
-    WNDPROC gcpd, Ret = 0;
-    PCLS Class = DesktopPtrToUser(pWnd->pcls);
-
-    if (!Class) return Ret;
-
-    if (pWnd->state & WNDS_SERVERSIDEWINDOWPROC)
-    {
-        for ( i = FNID_FIRST; i <= FNID_SWITCH; i++)
-        {
-            if (GETPFNSERVER(i) == pWnd->lpfnWndProc)
-            {
-                if (Ansi)
-                    Ret = GETPFNCLIENTA(i);
-                else
-                    Ret = GETPFNCLIENTW(i);
-            }
-        }
-        return Ret;
-    }
-    // Wine Class tests:
-    /*  Edit controls are special - they return a wndproc handle when
-        GetWindowLongPtr is called with a different A/W.
-        On the other hand there is no W->A->W conversion so this control
-        is treated specially.
-     */
-    if (Class->fnid == FNID_EDIT)
-        Ret = pWnd->lpfnWndProc;
-    else
-    {
-        // Set return proc.
-        Ret = pWnd->lpfnWndProc;
-
-        if (Class->fnid <= FNID_GHOST && Class->fnid >= FNID_BUTTON)
-        {
-            if (Ansi)
-            {
-                if (GETPFNCLIENTW(Class->fnid) == pWnd->lpfnWndProc)
-                    Ret = GETPFNCLIENTA(Class->fnid);
-            }
-            else
-            {
-                if (GETPFNCLIENTA(Class->fnid) == pWnd->lpfnWndProc)
-                    Ret = GETPFNCLIENTW(Class->fnid);
-            }
-        }
-        // Return on the change.
-        if ( Ret != pWnd->lpfnWndProc)
-            return Ret;
-    }
-
-    if ( Ansi == !!(pWnd->state & WNDS_ANSIWINDOWPROC) )
-        return Ret;
-
-    gcpd = (WNDPROC)NtUserGetCPD( UserHMGetHandle(pWnd),
-                                  (Ansi ? UserGetCPDA2U : UserGetCPDU2A )|UserGetCPDWindow,
-                                  (ULONG_PTR)Ret);
-
-    return (gcpd ? gcpd : Ret);
-}
-
-static ULONG_PTR FASTCALL
-IntGetClassLongA(PWND Wnd, PCLS Class, int nIndex)
-{
-    ULONG_PTR Ret = 0;
-
-    if (nIndex >= 0)
-    {
-        if (nIndex + sizeof(ULONG_PTR) < nIndex ||
-            nIndex + sizeof(ULONG_PTR) > Class->cbclsExtra)
-        {
-            SetLastError(ERROR_INVALID_PARAMETER);
-        }
-        else
-            Ret = *(PULONG_PTR)((ULONG_PTR)(Class + 1) + nIndex);
-    }
-    else
-    {
-        switch (nIndex)
-        {
-            case GCL_CBWNDEXTRA:
-                Ret = (ULONG_PTR)Class->cbwndExtra;
-                break;
-
-            case GCL_CBCLSEXTRA:
-                Ret = (ULONG_PTR)Class->cbclsExtra;
-                break;
-
-            case GCL_HBRBACKGROUND:
-                Ret = (ULONG_PTR)Class->hbrBackground;
-                if (Ret != 0 && Ret < 0x4000)
-                    Ret = (ULONG_PTR)GetSysColorBrush((ULONG)Ret - 1);
-                break;
-
-            case GCL_HMODULE:
-                //ERR("Cls 0x%x GCL_HMODULE 0x%x\n", Wnd->pcls, Class->hModule);
-                Ret = (ULONG_PTR)Class->hModule;
-                break;
-
-            case GCL_MENUNAME:
-                Ret = (ULONG_PTR)Class->lpszClientAnsiMenuName;
-                break;
-
-            case GCL_STYLE:
-                Ret = (ULONG_PTR)Class->style;
-                break;
-
-            case GCW_ATOM:
-                Ret = (ULONG_PTR)Class->atomNVClassName;
-                break;
-
-            case GCLP_HCURSOR:
-                Ret = Class->spcur ? (ULONG_PTR)((PPROCMARKHEAD)SharedPtrToUser(Class->spcur))->h : 0;
-                break;
-
-            case GCLP_HICON:
-                Ret = Class->spicn ? (ULONG_PTR)((PPROCMARKHEAD)SharedPtrToUser(Class->spicn))->h : 0;
-                break;
-
-            case GCLP_HICONSM:
-                Ret = Class->spicnSm ? (ULONG_PTR)((PPROCMARKHEAD)SharedPtrToUser(Class->spicnSm))->h : 0;
-                break;
-
-            case GCLP_WNDPROC:
-                Ret = IntGetClsWndProc(Wnd, Class, TRUE);
-                break;
-
-            default:
-                SetLastError(ERROR_INVALID_INDEX);
-                break;
-        }
-    }
-
-    return Ret;
-}
-
-static ULONG_PTR FASTCALL
-IntGetClassLongW (PWND Wnd, PCLS Class, int nIndex)
-{
-    ULONG_PTR Ret = 0;
-
-    if (nIndex >= 0)
-    {
-        if (nIndex + sizeof(ULONG_PTR) < nIndex ||
-            nIndex + sizeof(ULONG_PTR) > Class->cbclsExtra)
-        {
-            SetLastError(ERROR_INVALID_PARAMETER);
-        }
-        else
-            Ret = *(PULONG_PTR)((ULONG_PTR)(Class + 1) + nIndex);
-    }
-    else
-    {
-        switch (nIndex)
-        {
-            case GCL_CBWNDEXTRA:
-                Ret = (ULONG_PTR)Class->cbwndExtra;
-                break;
-
-            case GCL_CBCLSEXTRA:
-                Ret = (ULONG_PTR)Class->cbclsExtra;
-                break;
-
-            case GCLP_HBRBACKGROUND:
-                Ret = (ULONG_PTR)Class->hbrBackground;
-                if (Ret != 0 && Ret < 0x4000)
-                    Ret = (ULONG_PTR)GetSysColorBrush((ULONG)Ret - 1);
-                break;
-
-            case GCL_HMODULE:
-                Ret = (ULONG_PTR)Class->hModule;
-                break;
-
-            case GCLP_MENUNAME:
-                Ret = (ULONG_PTR)Class->lpszClientUnicodeMenuName;
-                break;
-
-            case GCL_STYLE:
-                Ret = (ULONG_PTR)Class->style;
-                break;
-
-            case GCW_ATOM:
-                Ret = (ULONG_PTR)Class->atomNVClassName;
-                break;
-
-            case GCLP_HCURSOR:
-                Ret = Class->spcur ? (ULONG_PTR)((PPROCMARKHEAD)SharedPtrToUser(Class->spcur))->h : 0;
-                break;
-
-            case GCLP_HICON:
-                Ret = Class->spicn ? (ULONG_PTR)((PPROCMARKHEAD)SharedPtrToUser(Class->spicn))->h : 0;
-                break;
-
-            case GCLP_HICONSM:
-                Ret = Class->spicnSm ? (ULONG_PTR)((PPROCMARKHEAD)SharedPtrToUser(Class->spicnSm))->h : 0;
-                break;
-
-            case GCLP_WNDPROC:
-                Ret = IntGetClsWndProc(Wnd, Class, FALSE);
-                break;
-
-            default:
-                SetLastError(ERROR_INVALID_INDEX);
-                break;
-        }
-    }
-
-    return Ret;
-}
-
-/*
- * @implemented
- */
-DWORD WINAPI
-GetClassLongA(HWND hWnd, int nIndex)
-{
-    PWND Wnd;
-    PCLS Class;
-    ULONG_PTR Ret = 0;
-
-    TRACE("%p %d\n", hWnd, nIndex);
-
-    Wnd = ValidateHwnd(hWnd);
-    if (!Wnd)
-        return 0;
-
-    _SEH2_TRY
-    {
-        Class = DesktopPtrToUser(Wnd->pcls);
-        if (Class != NULL)
-        {
-#ifdef _WIN64
-            switch (nIndex)
-            {
-                case GCLP_HBRBACKGROUND:
-                case GCLP_HCURSOR:
-                case GCLP_HICON:
-                case GCLP_HICONSM:
-                case GCLP_HMODULE:
-                case GCLP_MENUNAME:
-                case GCLP_WNDPROC:
-                    SetLastError(ERROR_INVALID_INDEX);
-                    break;
-
-                default:
-                    Ret = IntGetClassLongA(Wnd, Class, nIndex);
-                    break;
-            }
-#else
-            Ret = IntGetClassLongA(Wnd, Class, nIndex);
-#endif
-        }
-        else
-        {
-            WARN("Invalid class for hwnd 0x%p!\n", hWnd);
-        }
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-        Ret = 0;
-    }
-    _SEH2_END;
-
-    return (DWORD)Ret;
-}
-
-/*
- * @implemented
- */
-DWORD WINAPI
-GetClassLongW ( HWND hWnd, int nIndex )
-{
-    PWND Wnd;
-    PCLS Class;
-    ULONG_PTR Ret = 0;
-
-    TRACE("%p %d\n", hWnd, nIndex);
-
-    Wnd = ValidateHwnd(hWnd);
-    if (!Wnd)
-        return 0;
-
-    _SEH2_TRY
-    {
-        Class = DesktopPtrToUser(Wnd->pcls);
-        if (Class != NULL)
-        {
-#ifdef _WIN64
-            switch (nIndex)
-            {
-                case GCLP_HBRBACKGROUND:
-                case GCLP_HCURSOR:
-                case GCLP_HICON:
-                case GCLP_HICONSM:
-                case GCLP_HMODULE:
-                case GCLP_MENUNAME:
-                case GCLP_WNDPROC:
-                    SetLastError(ERROR_INVALID_INDEX);
-                    break;
-
-                default:
-                    Ret = IntGetClassLongW(Wnd, Class, nIndex);
-                    break;
-            }
-#else
-            Ret = IntGetClassLongW(Wnd, Class, nIndex);
-#endif
-        }
-        else
-        {
-            WARN("Invalid class for hwnd 0x%p!\n", hWnd);
-        }
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-        Ret = 0;
-    }
-    _SEH2_END;
-
-    return (DWORD)Ret;
-}
-
-#ifdef _WIN64
-/*
- * @implemented
- */
-ULONG_PTR
-WINAPI
-GetClassLongPtrA(HWND hWnd,
-                 INT nIndex)
-{
-    PWND Wnd;
-    PCLS Class;
-    ULONG_PTR Ret = 0;
-
-    TRACE("%p %d\n", hWnd, nIndex);
-
-    Wnd = ValidateHwnd(hWnd);
-    if (!Wnd)
-        return 0;
-
-    _SEH2_TRY
-    {
-        Class = DesktopPtrToUser(Wnd->pcls);
-        if (Class != NULL)
-        {
-            Ret = IntGetClassLongA(Wnd, Class, nIndex);
-        }
-        else
-        {
-            WARN("Invalid class for hwnd 0x%p!\n", hWnd);
-        }
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-        Ret = 0;
-    }
-    _SEH2_END;
-
-    return Ret;
-}
-
-/*
- * @implemented
- */
-ULONG_PTR
-WINAPI
-GetClassLongPtrW(HWND hWnd,
-                 INT nIndex)
-{
-    PWND Wnd;
-    PCLS Class;
-    ULONG_PTR Ret = 0;
-
-    TRACE("%p %d\n", hWnd, nIndex);
-
-    Wnd = ValidateHwnd(hWnd);
-    if (!Wnd)
-        return 0;
-
-    _SEH2_TRY
-    {
-        Class = DesktopPtrToUser(Wnd->pcls);
-        if (Class != NULL)
-        {
-            Ret = IntGetClassLongW(Wnd, Class, nIndex);
-        }
-        else
-        {
-            WARN("Invalid class for hwnd 0x%p!\n", hWnd);
-        }
-    }
-    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-    {
-        Ret = 0;
-    }
-    _SEH2_END;
-
-    return Ret;
-}
-#endif
-
-
-/*
- * @implemented
- */
-int WINAPI
-GetClassNameA(
-  HWND hWnd,
-  LPSTR lpClassName,
-  int nMaxCount)
-{
-    WCHAR tmpbuf[MAX_ATOM_LEN + 1];
-    int len;
-
-    if (nMaxCount <= 0) return 0;
-    if (!GetClassNameW( hWnd, tmpbuf, sizeof(tmpbuf)/sizeof(WCHAR) )) return 0;
-    RtlUnicodeToMultiByteN( lpClassName, nMaxCount - 1, (PULONG)&len, tmpbuf, strlenW(tmpbuf) * sizeof(WCHAR) );
-    lpClassName[len] = 0;
-
-    TRACE("%p class/atom: %s/%04x %x\n", hWnd,
-        IS_ATOM(lpClassName) ? NULL : lpClassName,
-        IS_ATOM(lpClassName) ? lpClassName : 0,
-        nMaxCount);
-
-    return len;
-}
-
-
-/*
- * @implemented
- */
-int
-WINAPI
-GetClassNameW(
-  HWND hWnd,
-  LPWSTR lpClassName,
-  int nMaxCount)
-{
-    UNICODE_STRING ClassName;
-    int Result;
-
-    RtlInitEmptyUnicodeString(&ClassName,
-                              lpClassName,
-                              nMaxCount * sizeof(WCHAR));
-
-    Result = NtUserGetClassName(hWnd,
-                                FALSE,
-                                &ClassName);
-
-    TRACE("%p class/atom: %S/%04x %x\n", hWnd,
-        IS_ATOM(lpClassName) ? NULL : lpClassName,
-        IS_ATOM(lpClassName) ? lpClassName : 0,
-        nMaxCount);
-
-    return Result;
-}
-
-
-/*
- * @implemented
- */
-WORD
-WINAPI
-GetClassWord(
-  HWND hwnd,
-  int offset)
-{
-    PWND Wnd;
-    PCLS class;
-    WORD retvalue = 0;
-
-    if (offset < 0) return GetClassLongA( hwnd, offset );
-
-    Wnd = ValidateHwnd(hwnd);
-    if (!Wnd)
-        return 0;
-
-    class = DesktopPtrToUser(Wnd->pcls);
-    if (class == NULL) return 0;
-
-    if (offset <= class->cbclsExtra - sizeof(WORD))
-        memcpy( &retvalue, (char *)(class + 1) + offset, sizeof(retvalue) );
-    else
-        SetLastError( ERROR_INVALID_INDEX );
-
-    return retvalue;
-}
-
-
-LONG_PTR IntGetWindowLong( HWND hwnd, INT offset, UINT size, BOOL unicode )
-{
-    LONG_PTR retvalue = 0;
-    WND *wndPtr;
-
-    if (offset == GWLP_HWNDPARENT)
-    {
-        HWND parent = GetAncestor( hwnd, GA_PARENT );
-        if (parent == GetDesktopWindow()) parent = GetWindow( hwnd, GW_OWNER );
-        return (ULONG_PTR)parent;
-    }
-
-    if (!(wndPtr = ValidateHwnd( hwnd )))
-    {
-        SetLastError( ERROR_INVALID_WINDOW_HANDLE );
-        return 0;
-    }
-
-    if (offset >= 0 && wndPtr->fnid != FNID_DESKTOP)
-    {
-        if (offset > (int)(wndPtr->cbwndExtra - size))
-        {
-            WARN("Invalid offset %d\n", offset );
-            SetLastError( ERROR_INVALID_INDEX );
-            return 0;
-        }
-        retvalue = *((LONG_PTR *)((PCHAR)(wndPtr + 1) + offset));
-
-        /* WINE: special case for dialog window procedure */
-        //if ((offset == DWLP_DLGPROC) && (size == sizeof(LONG_PTR)) && (wndPtr->flags & WIN_ISDIALOG))
-        //    retvalue = (LONG_PTR)IntGetWndProc( (WNDPROC)retvalue, unicode );
-        return retvalue;
-    }
-
-    switch(offset)
-    {
-    case GWLP_USERDATA:  retvalue = wndPtr->dwUserData; break;
-    case GWL_STYLE:      retvalue = wndPtr->style; break;
-    case GWL_EXSTYLE:    retvalue = wndPtr->ExStyle; break;
-    case GWLP_ID:        retvalue = wndPtr->IDMenu; break;
-    case GWLP_HINSTANCE: retvalue = (ULONG_PTR)wndPtr->hModule; break;
-    case GWLP_WNDPROC:
-    {
-        if (!TestWindowProcess(wndPtr))
-        {
-            SetLastError(ERROR_ACCESS_DENIED);
-            retvalue = 0;
-        }
-        retvalue = (ULONG_PTR)IntGetWndProc(wndPtr, !unicode);
-        break;
-    }
-    default:
-        WARN("Unknown offset %d\n", offset );
-        SetLastError( ERROR_INVALID_INDEX );
-        break;
-    }
-    return retvalue;
-
-}
-/*
- * @implemented
- */
-LONG
-WINAPI
-GetWindowLongA ( HWND hWnd, int nIndex )
-{
-    return IntGetWindowLong( hWnd, nIndex, sizeof(LONG), FALSE );
-}
-
-/*
- * @implemented
- */
-LONG
-WINAPI
-GetWindowLongW(HWND hWnd, int nIndex)
-{
-    return IntGetWindowLong( hWnd, nIndex, sizeof(LONG), TRUE );
-}
-
-#ifdef _WIN64
-/*
- * @implemented
- */
-LONG_PTR
-WINAPI
-GetWindowLongPtrA(HWND hWnd,
-                  INT nIndex)
-{
-    return IntGetWindowLong( hWnd, nIndex, sizeof(LONG_PTR), FALSE );
-}
-
-/*
- * @implemented
- */
-LONG_PTR
-WINAPI
-GetWindowLongPtrW(HWND hWnd,
-                  INT nIndex)
-{
-    return IntGetWindowLong( hWnd, nIndex, sizeof(LONG_PTR), TRUE );
-
-}
-#endif // _WIN64
-
-/*
- * @implemented
- */
-WORD
-WINAPI
-GetWindowWord(HWND hWnd, int nIndex)
-{
-    switch(nIndex)
-    {
-    case GWLP_ID:
-    case GWLP_HINSTANCE:
-    case GWLP_HWNDPARENT:
-        break;
-    default:
-        if (nIndex < 0)
-        {
-            WARN("Invalid offset %d\n", nIndex );
-            SetLastError( ERROR_INVALID_INDEX );
-            return 0;
-        }
-        break;
-    }
-    return IntGetWindowLong( hWnd, nIndex, sizeof(WORD), FALSE );
-}
-
-/*
- * @implemented
- */
-UINT
-WINAPI
-RealGetWindowClassW(
-  HWND  hwnd,
-  LPWSTR pszType,
-  UINT  cchType)
-{
-    UNICODE_STRING ClassName;
-
-    RtlInitEmptyUnicodeString(&ClassName,
-                              pszType,
-                              cchType * sizeof(WCHAR));
-
-    return NtUserGetClassName(hwnd,TRUE,&ClassName);
-}
-
-
-/*
- * @implemented
- */
-UINT
-WINAPI
-RealGetWindowClassA(
-  HWND  hwnd,
-  LPSTR pszType,
-  UINT  cchType)
-{
-    WCHAR tmpbuf[MAX_ATOM_LEN + 1];
-    UINT len;
-
-    if ((INT)cchType <= 0) return 0;
-    if (!RealGetWindowClassW( hwnd, tmpbuf, sizeof(tmpbuf)/sizeof(WCHAR) )) return 0;
-    RtlUnicodeToMultiByteN( pszType, cchType - 1, (PULONG)&len, tmpbuf, strlenW(tmpbuf) * sizeof(WCHAR) );
-    pszType[len] = 0;
-    return len;
-}
-
-/*
- * Create a small icon based on a standard icon
- */
-#if 0 // Keep vintage code from revision 18764 by GvG!
-static HICON
-CreateSmallIcon(HICON StdIcon)
-{
-    HICON SmallIcon = NULL;
-    ICONINFO StdInfo;
-    int SmallIconWidth;
-    int SmallIconHeight;
-    BITMAP StdBitmapInfo;
-    HDC hSourceDc = NULL;
-    HDC hDestDc = NULL;
-    ICONINFO SmallInfo;
-    HBITMAP OldSourceBitmap = NULL;
-    HBITMAP OldDestBitmap = NULL;
-
-    SmallInfo.hbmColor = NULL;
-    SmallInfo.hbmMask = NULL;
-
-    /* We need something to work with... */
-    if (NULL == StdIcon)
-    {
-        goto cleanup;
-    }
-
-    SmallIconWidth = GetSystemMetrics(SM_CXSMICON);
-    SmallIconHeight = GetSystemMetrics(SM_CYSMICON);
-    if (! GetIconInfo(StdIcon, &StdInfo))
-    {
-        ERR("Failed to get icon info for icon 0x%x\n", StdIcon);
-        goto cleanup;
-    }
-   if (! GetObjectW(StdInfo.hbmMask, sizeof(BITMAP), &StdBitmapInfo))
-    {
-        ERR("Failed to get bitmap info for icon 0x%x bitmap 0x%x\n",
-                StdIcon, StdInfo.hbmColor);
-        goto cleanup;
-    }
-    if (StdBitmapInfo.bmWidth == SmallIconWidth &&
-        StdBitmapInfo.bmHeight == SmallIconHeight)
-    {
-        /* Icon already has the correct dimensions */
-        return StdIcon;
-    }
-
-    hSourceDc = CreateCompatibleDC(NULL);
-    if (NULL == hSourceDc)
-    {
-        ERR("Failed to create source DC\n");
-        goto cleanup;
-    }
-    hDestDc = CreateCompatibleDC(NULL);
-    if (NULL == hDestDc)
-    {
-        ERR("Failed to create dest DC\n");
-        goto cleanup;
-    }
-
-    OldSourceBitmap = SelectObject(hSourceDc, StdInfo.hbmColor);
-    if (NULL == OldSourceBitmap)
-    {
-        ERR("Failed to select source color bitmap\n");
-        goto cleanup;
-    }
-    SmallInfo.hbmColor = CreateCompatibleBitmap(hSourceDc, SmallIconWidth,
-                                                SmallIconHeight);
-    if (NULL == SmallInfo.hbmColor)
-    {
-        ERR("Failed to create color bitmap\n");
-        goto cleanup;
-    }
-    OldDestBitmap = SelectObject(hDestDc, SmallInfo.hbmColor);
-    if (NULL == OldDestBitmap)
-    {
-        ERR("Failed to select dest color bitmap\n");
-        goto cleanup;
-    }
-    if (! StretchBlt(hDestDc, 0, 0, SmallIconWidth, SmallIconHeight,
-                     hSourceDc, 0, 0, StdBitmapInfo.bmWidth,
-                     StdBitmapInfo.bmHeight, SRCCOPY))
-    {
-        ERR("Failed to stretch color bitmap\n");
-        goto cleanup;
-    }
-
-    if (NULL == SelectObject(hSourceDc, StdInfo.hbmMask))
-    {
-        ERR("Failed to select source mask bitmap\n");
-        goto cleanup;
-    }
-    SmallInfo.hbmMask = CreateCompatibleBitmap(hSourceDc, SmallIconWidth, SmallIconHeight);
-    if (NULL == SmallInfo.hbmMask)
-    {
-        ERR("Failed to create mask bitmap\n");
-        goto cleanup;
-    }
-    if (NULL == SelectObject(hDestDc, SmallInfo.hbmMask))
-    {
-        ERR("Failed to select dest mask bitmap\n");
-        goto cleanup;
-    }
-    if (! StretchBlt(hDestDc, 0, 0, SmallIconWidth, SmallIconHeight,
-                     hSourceDc, 0, 0, StdBitmapInfo.bmWidth,
-                     StdBitmapInfo.bmHeight, SRCCOPY))
-    {
-        ERR("Failed to stretch mask bitmap\n");
-        goto cleanup;
-    }
-
-    SmallInfo.fIcon = TRUE;
-    SmallInfo.xHotspot = SmallIconWidth / 2;
-    SmallInfo.yHotspot = SmallIconHeight / 2;
-    SmallIcon = CreateIconIndirect(&SmallInfo);
-    if (NULL == SmallIcon)
-    {
-        ERR("Failed to create icon\n");
-        goto cleanup;
-    }
-
-cleanup:
-    if (NULL != SmallInfo.hbmMask)
-    {
-        DeleteObject(SmallInfo.hbmMask);
-    }
-    if (NULL != OldDestBitmap)
-    {
-        SelectObject(hDestDc, OldDestBitmap);
-    }
-    if (NULL != SmallInfo.hbmColor)
-    {
-        DeleteObject(SmallInfo.hbmColor);
-    }
-    if (NULL != hDestDc)
-    {
-        DeleteDC(hDestDc);
-    }
-    if (NULL != OldSourceBitmap)
-    {
-        SelectObject(hSourceDc, OldSourceBitmap);
-    }
-    if (NULL != hSourceDc)
-    {
-        DeleteDC(hSourceDc);
-    }
-
-    return SmallIcon;
-}
-#endif
-
-ATOM WINAPI
-RegisterClassExWOWW(WNDCLASSEXW *lpwcx,
-                    LPDWORD pdwWowData,
-                    WORD fnID,
-                    DWORD dwFlags,
-                    BOOL ChkRegCls)
-{
-    ATOM Atom;
-    WNDCLASSEXW WndClass;
-    UNICODE_STRING ClassName;
-    UNICODE_STRING ClassVersion;
-    UNICODE_STRING MenuName = {0};
-    CLSMENUNAME clsMenuName;
-    ANSI_STRING AnsiMenuName;
-    LPCWSTR lpszClsVersion;
-
-    if (lpwcx == NULL || lpwcx->cbSize != sizeof(WNDCLASSEXW) ||
-        lpwcx->cbClsExtra < 0 || lpwcx->cbWndExtra < 0 ||
-        lpwcx->lpszClassName == NULL)
-    {
-        TRACE("RegisterClassExWOWW Invalid Parameter Error!\n");
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    if (ChkRegCls)
-    {
-        if (!RegisterDefaultClasses) RegisterSystemControls();
-    }
-    /*
-     * On real Windows this looks more like:
-     *    if (lpwcx->hInstance == User32Instance &&
-     *        *(PULONG)((ULONG_PTR)NtCurrentTeb() + 0x6D4) & 0x400)
-     * But since I have no idea what the magic field in the
-     * TEB structure means, I rather decided to omit that.
-     * -- Filip Navara
-
-        GetWin32ClientInfo()->dwExpWinVer & (WINVER == 0x400)
-     */
-    if (lpwcx->hInstance == User32Instance)
-    {
-        TRACE("RegisterClassExWOWW User32Instance!\n");
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-    /* Yes, this is correct. We should modify the passed structure. */
-    if (lpwcx->hInstance == NULL)
-       ((WNDCLASSEXW*)lpwcx)->hInstance = GetModuleHandleW(NULL);
-
-    RtlCopyMemory(&WndClass, lpwcx, sizeof(WNDCLASSEXW));
-/*
-    if (NULL == WndClass.hIconSm)
-    {
-        WndClass.hIconSm = CreateSmallIcon(WndClass.hIcon);
-    }
-*/
-    RtlInitEmptyAnsiString(&AnsiMenuName, NULL, 0);
-    if (WndClass.lpszMenuName != NULL)
-    {
-        if (!IS_INTRESOURCE(WndClass.lpszMenuName))
-        {
-            if (WndClass.lpszMenuName[0])
-            {
-               RtlInitUnicodeString(&MenuName, WndClass.lpszMenuName);
-               RtlUnicodeStringToAnsiString( &AnsiMenuName, &MenuName, TRUE);
-            }
-        }
-        else
-        {
-            MenuName.Buffer = (LPWSTR)WndClass.lpszMenuName;
-             AnsiMenuName.Buffer = (PCHAR)WndClass.lpszMenuName;
-        }
-    }
-
-    if (IS_ATOM(WndClass.lpszClassName))
-    {
-        ClassName.Length =
-        ClassName.MaximumLength = 0;
-        ClassName.Buffer = (LPWSTR)WndClass.lpszClassName;
-    }
-    else
-    {
-        RtlInitUnicodeString(&ClassName, WndClass.lpszClassName);
-    }
-
-    ClassVersion = ClassName;
-    if (fnID == 0)
-    {
-        lpszClsVersion = ClassNameToVersion(lpwcx->lpszClassName, NULL, NULL, NULL, FALSE);
-        if (lpszClsVersion)
-        {
-            RtlInitUnicodeString(&ClassVersion, lpszClsVersion);
-        }
-    }
-
-    clsMenuName.pszClientAnsiMenuName = AnsiMenuName.Buffer;
-    clsMenuName.pwszClientUnicodeMenuName = MenuName.Buffer;
-    clsMenuName.pusMenuName = &MenuName;
-
-    Atom = NtUserRegisterClassExWOW( &WndClass,
-                                     &ClassName,
-                                     &ClassVersion,
-                                     &clsMenuName,
-                                     fnID,
-                                     dwFlags,
-                                     pdwWowData);
-
-    TRACE("atom=%04x wndproc=%p hinst=%p bg=%p style=%08x clsExt=%d winExt=%d class=%p\n",
-           Atom, lpwcx->lpfnWndProc, lpwcx->hInstance, lpwcx->hbrBackground,
-           lpwcx->style, lpwcx->cbClsExtra, lpwcx->cbWndExtra, WndClass);
-
-    return Atom;
-}
-
-/*
- * @implemented
- */
-ATOM WINAPI
-RegisterClassExA(CONST WNDCLASSEXA *lpwcx)
-{
-    RTL_ATOM Atom;
-    WNDCLASSEXW WndClass;
-    WCHAR mname[MAX_BUFFER_LEN];
-    WCHAR cname[MAX_BUFFER_LEN];
-
-    RtlCopyMemory(&WndClass, lpwcx, sizeof(WNDCLASSEXA));
-
-    if (WndClass.lpszMenuName != NULL)
-    {
-        if (!IS_INTRESOURCE(WndClass.lpszMenuName))
-        {
-            if (WndClass.lpszMenuName[0])
-            {
-                if (!MultiByteToWideChar( CP_ACP, 0, lpwcx->lpszMenuName, -1, mname, MAX_ATOM_LEN + 1 )) return 0;
-
-                WndClass.lpszMenuName = mname;
-            }
-        }
-    }
-
-    if (!IS_ATOM(WndClass.lpszClassName))
-    {
-        if (!MultiByteToWideChar( CP_ACP, 0, lpwcx->lpszClassName, -1, cname, MAX_ATOM_LEN + 1 )) return 0;
-
-        WndClass.lpszClassName = cname;
-    }
-
-    Atom = RegisterClassExWOWW( &WndClass,
-                                0,
-                                0,
-                                CSF_ANSIPROC,
-                                TRUE);
-
-    TRACE("A atom=%04x wndproc=%p hinst=%p bg=%p style=%08x clsExt=%d winExt=%d class=%p\n",
-           Atom, lpwcx->lpfnWndProc, lpwcx->hInstance, lpwcx->hbrBackground,
-           lpwcx->style, lpwcx->cbClsExtra, lpwcx->cbWndExtra, WndClass);
-
-    return (ATOM)Atom;
-}
-
-/*
- * @implemented
- */
-ATOM WINAPI
-RegisterClassExW(CONST WNDCLASSEXW *lpwcx)
-{
-    ATOM Atom;
-
-    Atom = RegisterClassExWOWW( (WNDCLASSEXW *)lpwcx, 0, 0, 0, TRUE);
-
-    TRACE("W atom=%04x wndproc=%p hinst=%p bg=%p style=%08x clsExt=%d winExt=%d\n",
-          Atom, lpwcx->lpfnWndProc, lpwcx->hInstance, lpwcx->hbrBackground,
-          lpwcx->style, lpwcx->cbClsExtra, lpwcx->cbWndExtra);
-
-    return Atom;
-}
-
-/*
- * @implemented
- */
-ATOM WINAPI
-RegisterClassA(CONST WNDCLASSA *lpWndClass)
-{
-    WNDCLASSEXA Class;
-
-    if (lpWndClass == NULL)
-        return 0;
-
-    RtlCopyMemory(&Class.style, lpWndClass, sizeof(WNDCLASSA));
-    Class.cbSize = sizeof(WNDCLASSEXA);
-    Class.hIconSm = NULL;
-
-    return RegisterClassExA(&Class);
-}
-
-/*
- * @implemented
- */
-ATOM WINAPI
-RegisterClassW(CONST WNDCLASSW *lpWndClass)
-{
-    WNDCLASSEXW Class;
-
-    if (lpWndClass == NULL)
-        return 0;
-
-    RtlCopyMemory(&Class.style, lpWndClass, sizeof(WNDCLASSW));
-    Class.cbSize = sizeof(WNDCLASSEXW);
-    Class.hIconSm = NULL;
-
-    return RegisterClassExW(&Class);
-}
-
-/*
- * @implemented
- */
-DWORD
-WINAPI
-SetClassLongA (HWND hWnd,
-               int nIndex,
-               LONG dwNewLong)
-{
-    PSTR lpStr = (PSTR)(ULONG_PTR)dwNewLong;
-    UNICODE_STRING Value = {0};
-    BOOL Allocated = FALSE;
-    DWORD Ret;
-
-    /* FIXME - portability!!!! */
-
-    if (nIndex == GCL_MENUNAME && lpStr != NULL)
-    {
-        if (!IS_INTRESOURCE(lpStr))
-        {
-            if (!RtlCreateUnicodeStringFromAsciiz(&Value,
-                                                  lpStr))
-            {
-                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-                return 0;
-            }
-
-            Allocated = TRUE;
-        }
-        else
-            Value.Buffer = (PWSTR)lpStr;
-
-        dwNewLong = (LONG_PTR)&Value;
-    }
-    else if (nIndex == GCW_ATOM && lpStr != NULL)
-    {
-        if (!IS_ATOM(lpStr))
-        {
-            if (!RtlCreateUnicodeStringFromAsciiz(&Value,
-                                                  lpStr))
-            {
-                SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-                return 0;
-            }
-
-            Allocated = TRUE;
-        }
-        else
-            Value.Buffer = (PWSTR)lpStr;
-
-        dwNewLong = (LONG_PTR)&Value;
-    }
-
-    Ret = (DWORD)NtUserSetClassLong(hWnd,
-                                    nIndex,
-                                    dwNewLong,
-                                    TRUE);
-
-    if (Allocated)
-    {
-        RtlFreeUnicodeString(&Value);
-    }
-
-    return Ret;
-}
-
-
-/*
- * @implemented
- */
-DWORD
-WINAPI
-SetClassLongW(HWND hWnd,
-              int nIndex,
-              LONG dwNewLong)
-{
-    PWSTR lpStr = (PWSTR)(ULONG_PTR)dwNewLong;
-    UNICODE_STRING Value = {0};
-
-    TRACE("%p %d %lx\n", hWnd, nIndex, dwNewLong);
-
-    /* FIXME - portability!!!! */
-
-    if (nIndex == GCL_MENUNAME && lpStr != NULL)
-    {
-        if (!IS_INTRESOURCE(lpStr))
-        {
-            RtlInitUnicodeString(&Value,
-                                 lpStr);
-        }
-        else
-            Value.Buffer = lpStr;
-
-        dwNewLong = (LONG_PTR)&Value;
-    }
-    else if (nIndex == GCW_ATOM && lpStr != NULL)
-    {
-        if (!IS_ATOM(lpStr))
-        {
-            RtlInitUnicodeString(&Value,
-                                 lpStr);
-        }
-        else
-            Value.Buffer = lpStr;
-
-        dwNewLong = (LONG_PTR)&Value;
-    }
-
-    return (DWORD)NtUserSetClassLong(hWnd,
-                                     nIndex,
-                                     dwNewLong,
-                                     FALSE);
-}
-
-#ifdef _WIN64
-/*
- * @unimplemented
- */
-ULONG_PTR
-WINAPI
-SetClassLongPtrA(HWND hWnd,
-                 INT nIndex,
-                 LONG_PTR dwNewLong)
-{
-    UNIMPLEMENTED;
-    return 0;
-}
-
-/*
- * @unimplemented
- */
-ULONG_PTR
-WINAPI
-SetClassLongPtrW(HWND hWnd,
-                 INT nIndex,
-                 LONG_PTR dwNewLong)
-{
-    UNIMPLEMENTED;
-    return 0;
-}
-#endif // _WIN64
-
-/*
- * @implemented
- */
-WORD
-WINAPI
-SetClassWord(
-  HWND hWnd,
-  int nIndex,
-  WORD wNewWord)
-/*
- * NOTE: Obsoleted in 32-bit windows
- */
-{
-    if ((nIndex < 0) && (nIndex != GCW_ATOM))
-        return 0;
-
-    return (WORD) SetClassLongW ( hWnd, nIndex, wNewWord );
-}
-
-/*
- * @implemented
- */
-WORD
-WINAPI
-SetWindowWord ( HWND hWnd,int nIndex,WORD wNewWord )
-{
-    switch(nIndex)
-    {
-    case GWLP_ID:
-    case GWLP_HINSTANCE:
-    case GWLP_HWNDPARENT:
-        break;
-    default:
-        if (nIndex < 0)
-        {
-            WARN("Invalid offset %d\n", nIndex );
-            SetLastError( ERROR_INVALID_INDEX );
-            return 0;
-        }
-        break;
-    }
-    return NtUserSetWindowLong( hWnd, nIndex, wNewWord, FALSE );
-}
-
-/*
- * @implemented
- */
-LONG
-WINAPI
-DECLSPEC_HOTPATCH
-SetWindowLongA(
-  HWND hWnd,
-  int nIndex,
-  LONG dwNewLong)
-{
-    return NtUserSetWindowLong(hWnd, nIndex, dwNewLong, TRUE);
-}
-
-/*
- * @implemented
- */
-LONG
-WINAPI
-SetWindowLongW(
-  HWND hWnd,
-  int nIndex,
-  LONG dwNewLong)
-{
-    return NtUserSetWindowLong(hWnd, nIndex, dwNewLong, FALSE);
-}
-
-#ifdef _WIN64
-/*
- * @implemented
- */
-LONG_PTR
-WINAPI
-SetWindowLongPtrA(HWND hWnd,
-                  INT nIndex,
-                  LONG_PTR dwNewLong)
-{
-    return NtUserSetWindowLong(hWnd, nIndex, dwNewLong, FALSE);
-}
-
-/*
- * @implemented
- */
-LONG_PTR
-WINAPI
-SetWindowLongPtrW(HWND hWnd,
-                  INT nIndex,
-                  LONG_PTR dwNewLong)
-{
-    return NtUserSetWindowLong(hWnd, nIndex, dwNewLong, FALSE);
-}
-#endif
-
-/*
- * @implemented
- */
-BOOL
-WINAPI
-UnregisterClassA(
-  LPCSTR lpClassName,
-  HINSTANCE hInstance)
-{
-    UNICODE_STRING ClassName = {0};
-    BOOL Ret;
-    LPCWSTR lpszClsVersion;
-    BOOL ConvertedString = FALSE;
-
-    TRACE("class/atom: %s/%04x %p\n",
-        IS_ATOM(lpClassName) ? NULL : lpClassName,
-        IS_ATOM(lpClassName) ? lpClassName : 0,
-        hInstance);
-
-    lpszClsVersion = ClassNameToVersion(lpClassName, NULL, NULL, NULL, TRUE);
-    if (lpszClsVersion)
-    {
-        RtlInitUnicodeString(&ClassName, lpszClsVersion);
-    }
-    else if (!IS_ATOM(lpClassName))
-    {
-        ConvertedString = TRUE;
-        if (!RtlCreateUnicodeStringFromAsciiz(&ClassName, lpClassName))
-        {
-            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
-            return 0;
-        }
-    }
-    else
-    {
-        ClassName.Buffer = (PWSTR)((ULONG_PTR)lpClassName);
-    }
-
-    Ret = NtUserUnregisterClass(&ClassName, hInstance, 0);
-
-    if (ConvertedString)
-        RtlFreeUnicodeString(&ClassName);
-
-    return Ret;
-}
-
-
-/*
- * @implemented
- */
-BOOL
-WINAPI
-UnregisterClassW(
-  LPCWSTR lpClassName,
-  HINSTANCE hInstance)
-{
-    UNICODE_STRING ClassName = {0};
-    LPCWSTR lpszClsVersion;
-
-    TRACE("class/atom: %S/%04x %p\n",
-        IS_ATOM(lpClassName) ? NULL : lpClassName,
-        IS_ATOM(lpClassName) ? lpClassName : 0,
-        hInstance);
-
-    lpszClsVersion = ClassNameToVersion(lpClassName, NULL, NULL, NULL, FALSE);
-    if (lpszClsVersion)
-    {
-        RtlInitUnicodeString(&ClassName, lpszClsVersion);
-    }
-    else if (!IS_ATOM(lpClassName))
-    {
-        RtlInitUnicodeString(&ClassName, lpClassName);
-    }
-    else
-    {
-        ClassName.Buffer = (PWSTR)((ULONG_PTR)lpClassName);
-    }
-
-    return NtUserUnregisterClass(&ClassName, hInstance, 0);
-}
-
-/* EOF */