[Win32k|User32]
[reactos.git] / reactos / include / reactos / win32k / ntuser.h
index 6138379..207df62 100644 (file)
@@ -1,9 +1,25 @@
 #ifndef __WIN32K_NTUSER_H
 #define __WIN32K_NTUSER_H
 
-struct _PROCESSINFO;
-struct _THREADINFO;
-struct _WINDOW;
+typedef struct _PROCESSINFO *PPROCESSINFO;
+typedef struct _THREADINFO *PTHREADINFO;
+struct _DESKTOP;
+struct _WND;
+
+typedef enum _USERTHREADINFOCLASS
+{
+    UserThreadShutdownInformation,
+    UserThreadFlags,
+    UserThreadTaskName,
+    UserThreadWOWInformation,
+    UserThreadHungStatus,
+    UserThreadInitiateShutdown,
+    UserThreadEndShutdown,
+    UserThreadUseActiveDesktop,
+    UserThreadUseDesktop,
+    UserThreadRestoreDesktop,
+    UserThreadCsrApiPort,
+} USERTHREADINFOCLASS;
 
 typedef struct _LARGE_UNICODE_STRING
 {
@@ -35,47 +51,17 @@ VOID NTAPI RtlInitLargeAnsiString(IN OUT PLARGE_ANSI_STRING,IN PCSZ,IN INT);
 VOID NTAPI RtlInitLargeUnicodeString(IN OUT PLARGE_UNICODE_STRING,IN PCWSTR,IN INT);
 BOOL NTAPI RtlLargeStringToUnicodeString( PUNICODE_STRING, PLARGE_STRING);
 
-/* FIXME: UserHMGetHandle needs to be updated once the new handle manager is implemented */
-#define UserHMGetHandle(obj) ((obj)->hdr.Handle)
-
-typedef struct _REGISTER_SYSCLASS
-{
-    /* This is a reactos specific class used to initialize the
-       system window classes during user32 initialization */
-    UNICODE_STRING ClassName;
-    UINT Style;
-    WNDPROC ProcW;
-    WNDPROC ProcA;
-    UINT ExtraBytes;
-    HICON hCursor;
-    HBRUSH hBrush;
-    UINT ClassId;
-} REGISTER_SYSCLASS, *PREGISTER_SYSCLASS;
-
-typedef struct _CLSMENUNAME
-{
-  LPSTR     pszClientAnsiMenuName;
-  LPWSTR    pwszClientUnicodeMenuName;
-  PUNICODE_STRING pusMenuName;
-} CLSMENUNAME, *PCLSMENUNAME;
-
-typedef struct _USER_OBJHDR
-{
-    /* This is the common header for all user handle objects */
-    HANDLE Handle;
-} USER_OBJHDR, PUSER_OBJHDR;
-
 typedef struct _DESKTOPINFO
 {
     PVOID pvDesktopBase;
     PVOID pvDesktopLimit;
+    struct _WND *spwnd;
+    DWORD fsHooks;
+    struct tagHOOK * aphkStart[16];
 
-    HANDLE hKernelHeap;
-    ULONG_PTR HeapLimit;
     HWND hTaskManWindow;
     HWND hProgmanWindow;
     HWND hShellWindow;
-    struct _WINDOW *Wnd;
 
     union
     {
@@ -89,105 +75,456 @@ typedef struct _DESKTOPINFO
     WCHAR szDesktopName[1];
 } DESKTOPINFO, *PDESKTOPINFO;
 
-typedef struct _CALLPROC
+#define CTI_INSENDMESSAGE 0x0002
+
+typedef struct _CLIENTTHREADINFO
+{
+    DWORD CTI_flags;
+    WORD  fsChangeBits;
+    WORD  fsWakeBits;
+    WORD  fsWakeBitsJournal;
+    WORD  fsWakeMask;
+    ULONG tickLastMsgChecked;
+    DWORD dwcPumpHook;
+} CLIENTTHREADINFO, *PCLIENTTHREADINFO;
+
+typedef struct _HEAD
+{
+  HANDLE h;
+  DWORD  cLockObj;
+} HEAD, *PHEAD;
+
+typedef struct _THROBJHEAD
 {
-    USER_OBJHDR hdr; /* FIXME: Move out of the structure once new handle manager is implemented */
-    struct _PROCESSINFO *pi;
-    WNDPROC WndProc;
-    struct _CALLPROC *Next;
-    UINT Unicode : 1;
-} CALLPROC, *PCALLPROC;
-
-typedef struct _WINDOWCLASS
+  HEAD;
+  PTHREADINFO pti;
+} THROBJHEAD, *PTHROBJHEAD;
+
+typedef struct _THRDESKHEAD
 {
-    struct _WINDOWCLASS *Next;
-    struct _WINDOWCLASS *Clone;
-    struct _WINDOWCLASS *Base;
-    struct _DESKTOP *rpdeskParent;
-    RTL_ATOM Atom;
-    ULONG Windows;
+  THROBJHEAD;
+  struct _DESKTOP *rpdesk;
+  PVOID       pSelf;
+} THRDESKHEAD, *PTHRDESKHEAD;
+
+typedef struct _PROCDESKHEAD
+{
+  HEAD;
+  DWORD hTaskWow;
+  struct _DESKTOP *rpdesk;
+  PVOID       pSelf;
+} PROCDESKHEAD, *PPROCDESKHEAD;
+
+typedef struct _PROCMARKHEAD
+{
+  HEAD;
+  ULONG hTaskWow;
+  PPROCESSINFO ppi;
+} PROCMARKHEAD, *PPROCMARKHEAD;
+
+#define UserHMGetHandle(obj) ((obj)->head.h)
+
+/* Window Client Information structure */
+struct  _ETHREAD;
+
+typedef struct tagHOOK
+{
+  THRDESKHEAD    head;
+  LIST_ENTRY     Chain;      /* Hook chain entry */
+  struct _ETHREAD* Thread;   /* Thread owning the hook */
+  int            HookId;     /* Hook table index */
+  HOOKPROC       Proc;       /* Hook function */
+  BOOLEAN        Ansi;       /* Is it an Ansi hook? */
+  ULONG          Flags;      /* Some internal flags */
+  UNICODE_STRING ModuleName; /* Module name for global hooks */
+} HOOK, *PHOOK;
+
+/* THREADINFO Flags */
+#define TIF_INCLEANUP               0x00000001
+#define TIF_16BIT                   0x00000002
+#define TIF_SYSTEMTHREAD            0x00000004
+#define TIF_CSRSSTHREAD             0x00000008
+#define TIF_TRACKRECTVISIBLE        0x00000010
+#define TIF_ALLOWFOREGROUNDACTIVATE 0x00000020
+#define TIF_DONTATTACHQUEUE         0x00000040
+#define TIF_DONTJOURNALATTACH       0x00000080
+#define TIF_WOW64                   0x00000100
+#define TIF_INACTIVATEAPPMSG        0x00000200
+#define TIF_SPINNING                0x00000400
+#define TIF_PALETTEAWARE            0x00000800
+#define TIF_SHAREDWOW               0x00001000
+#define TIF_FIRSTIDLE               0x00002000
+#define TIF_WAITFORINPUTIDLE        0x00004000
+#define TIF_MOVESIZETRACKING        0x00008000
+#define TIF_VDMAPP                  0x00010000
+#define TIF_DOSEMULATOR             0x00020000
+#define TIF_GLOBALHOOKER            0x00040000
+#define TIF_DELAYEDEVENT            0x00080000
+#define TIF_MSGPOSCHANGED           0x00100000
+#define TIF_SHUTDOWNCOMPLETE        0x00200000
+#define TIF_IGNOREPLAYBACKDELAY     0x00400000
+#define TIF_ALLOWOTHERACCOUNTHOOK   0x00800000
+#define TIF_GUITHREADINITIALIZED    0x02000000
+#define TIF_DISABLEIME              0x04000000
+#define TIF_INGETTEXTLENGTH         0x08000000
+#define TIF_ANSILENGTH              0x10000000
+#define TIF_DISABLEHOOKS            0x20000000
+
+typedef struct _CALLBACKWND
+{
+     HWND hWnd;
+     PVOID pvWnd;
+} CALLBACKWND, *PCALLBACKWND;
+
+#define CI_TRANSACTION       0x00000001
+#define CI_QUEUEMSG          0x00000002
+#define CI_WOW               0x00000004
+#define CI_INITTHREAD        0x00000008
+#define CI_CURTHPRHOOK       0x00000010
+#define CI_CLASSESREGISTERED 0x00000020
+#define CI_IMMACTIVATE       0x00000040
+
+typedef struct _CLIENTINFO
+{
+    ULONG_PTR CI_flags;
+    ULONG_PTR cSpins;
+    DWORD dwExpWinVer;
+    DWORD dwCompatFlags;
+    DWORD dwCompatFlags2;
+    DWORD dwTIFlags; // ThreadInfo TIF_Xxx flags for User space.
+    PDESKTOPINFO pDeskInfo;
+    ULONG_PTR ulClientDelta;
+    PHOOK phkCurrent;
+    ULONG fsHooks;
+    CALLBACKWND CallbackWnd;
+    DWORD dwHookCurrent;
+    INT cInDDEMLCallback;
+    PCLIENTTHREADINFO pClientThreadInfo;
+    ULONG_PTR dwHookData;
+    DWORD dwKeyCache;
+    BYTE afKeyState[8];
+    DWORD dwAsyncKeyCache;
+    BYTE afAsyncKeyState[8];
+    BYTE afAsyncKeyStateRecentDow[8];
+    HKL hKL;
+    USHORT CodePage;
+    UCHAR achDbcsCF[2];
+    MSG msgDbcsCB;
+    LPDWORD lpdwRegisteredClasses;
+    ULONG Win32ClientInfo3[27];
+/* It's just a pointer reference not to be used w the structure in user space. */
+    PPROCESSINFO ppi;
+} CLIENTINFO, *PCLIENTINFO;
+
+/* Make sure it fits exactly into the TEB */
+C_ASSERT(sizeof(CLIENTINFO) == FIELD_OFFSET(TEB, glDispatchTable) - FIELD_OFFSET(TEB, Win32ClientInfo));
+
+#define GetWin32ClientInfo() ((PCLIENTINFO)(NtCurrentTeb()->Win32ClientInfo))
 
+/* Menu Item fType. */
+#define MFT_RTOL 0x6000
+
+typedef struct tagITEM
+{
+    UINT fType;
+    UINT fState;
+    UINT wID;
+    struct tagMENU* spSubMenu; /* Pop-up menu. */
+    HANDLE hbmpChecked;
+    HANDLE hbmpUnchecked;
+    USHORT* lpstr; /* Item text pointer. */
+    ULONG cch;
+    DWORD_PTR dwItemData;
+    ULONG xItem;   /* Item position. left */
+    ULONG yItem;   /*     "          top */
+    ULONG cxItem;  /* Item Size Width */
+    ULONG cyItem;  /*     "     Height */
+    ULONG dxTab;   /* X position of text after Tab */
+    ULONG ulX;     /* underline.. start position */
+    ULONG ulWidth; /* underline.. width */
+    HBITMAP hbmp;  /* bitmap */
+    INT cxBmp;     /* Width Maximum size of the bitmap items in MIIM_BITMAP state */
+    INT cyBmp;     /* Height " */
+} ITEM, *PITEM;
+
+typedef struct tagMENULIST
+{
+   struct tagMENULIST* pNext;
+   struct tagMENU*     pMenu;
+} MENULIST, *PMENULIST;
+
+/* Menu fFlags, upper byte is MNS_X style flags. */
+#define MNF_POPUP       0x0001
+#define MNF_UNDERLINE   0x0004
+#define MNF_INACTIVE    0x0010
+#define MNF_RTOL        0x0020
+#define MNF_DESKTOPMN   0x0040
+#define MNF_SYSDESKMN   0x0080
+#define MNF_SYSSUBMENU  0x0100
+
+typedef struct tagMENU
+{
+    PROCDESKHEAD head;
+    ULONG fFlags;             /* [Style flags | Menu flags] */
+    INT iItem;                /* nPos of selected item, if -1 not selected. */
+    UINT cAlloced;            /* Number of allocated items. Inc's of 8 */
+    UINT cItems;              /* Number of items in the menu */
+    ULONG cxMenu;             /* Width of the whole menu */
+    ULONG cyMenu;             /* Height of the whole menu */
+    ULONG cxTextAlign;        /* Offset of text when items have both bitmaps and text */
+    struct _WND *spwndNotify; /* window receiving the messages for ownerdraw */
+    PITEM rgItems;            /* Array of menu items */
+    struct tagMENULIST* pParentMenus; /* If this is SubMenu, list of parents. */
+    DWORD dwContextHelpId;
+    ULONG cyMax;              /* max height of the whole menu, 0 is screen height */
+    DWORD_PTR dwMenuData;     /* application defined value */
+    HBRUSH hbrBack;           /* brush for menu background */
+    INT iTop;                 /* Current scroll position Top */
+    INT iMaxTop;              /* Current scroll position Max Top */
+    DWORD dwArrowsOn:2;       /* Arrows: 0 off, 1 on, 2 to the top, 3 to the bottom. */
+} MENU, *PMENU;
+
+typedef struct _REGISTER_SYSCLASS
+{
+    /* This is a reactos specific class used to initialize the
+       system window classes during user32 initialization */
+    PWSTR ClassName;
     UINT Style;
-    WNDPROC WndProc;
-    union
-    {
-        WNDPROC WndProcExtra;
-        PCALLPROC CallProc;
-    };
-    PCALLPROC CallProcList;
-    INT ClsExtra;
-    INT WndExtra;
-    PVOID Dce;
-    DWORD fnID; // New ClassId
-    HINSTANCE hInstance;
-    HANDLE hIcon; /* FIXME - Use pointer! */
-    HANDLE hIconSm; /* FIXME - Use pointer! */
-    HANDLE hCursor; /* FIXME - Use pointer! */
-    HBRUSH hbrBackground;
-    HANDLE hMenu; /* FIXME - Use pointer! */
-    PWSTR MenuName;
-    PSTR AnsiMenuName;
-
-    UINT Destroying : 1;
-    UINT Unicode : 1;
-    UINT System : 1;
-    UINT Global : 1;
-    UINT MenuNameIsString : 1;
-    UINT NotUsed : 27;
-} WINDOWCLASS, *PWINDOWCLASS;
+    WNDPROC ProcW;
+    UINT ExtraBytes;
+    HICON hCursor;
+    HBRUSH hBrush;
+    WORD fiId;
+    WORD iCls;
+} REGISTER_SYSCLASS, *PREGISTER_SYSCLASS;
 
+typedef struct _CLSMENUNAME
+{
+  LPSTR     pszClientAnsiMenuName;
+  LPWSTR    pwszClientUnicodeMenuName;
+  PUNICODE_STRING pusMenuName;
+} CLSMENUNAME, *PCLSMENUNAME;
 
-// Flags !Not Implemented!
-#define WNDF_CALLPROC 0x0004 // Call proc inside win32k.
+typedef struct tagSBDATA
+{
+  INT posMin;
+  INT posMax;  
+  INT page;
+  INT pos;
+} SBDATA, *PSBDATA;
 
-typedef struct _WINDOW
+typedef struct tagSBINFO
 {
-    USER_OBJHDR hdr; /* FIXME: Move out of the structure once new handle manager is implemented */
-
-    /* NOTE: This structure is located in the desktop heap and will
-             eventually replace WINDOW_OBJECT. Right now WINDOW_OBJECT
-             keeps a reference to this structure until all the information
-             is moved to this structure */
-    struct _PROCESSINFO *pi; /* FIXME: Move to object header some day */
-    struct _THREADINFO *ti;
-    struct _DESKTOP *pdesktop;
-    RECT WindowRect;
-    RECT ClientRect;
-
-    WNDPROC WndProc;
-    union
-    {
-        /* Pointer to a call procedure handle */
-        PCALLPROC CallProc;
-        /* Extra Wnd proc (windows of system classes) */
-        WNDPROC WndProcExtra;
-    };
+  INT WSBflags;
+  SBDATA Horz;
+  SBDATA Vert;
+} SBINFO, *PSBINFO;
 
-    struct _WINDOW *Parent;
-    struct _WINDOW *Owner;
+typedef enum _GETCPD
+{
+    UserGetCPDA2U      = 0x01, // " Unicode "
+    UserGetCPDU2A      = 0X02, // " Ansi "
+    UserGetCPDClass    = 0X10,
+    UserGetCPDWindow   = 0X20,
+    UserGetCPDDialog   = 0X40,
+    UserGetCPDWndtoCls = 0X80
+} GETCPD, *PGETCPD;
+
+typedef struct _CALLPROCDATA
+{
+    PROCDESKHEAD head;
+    struct _CALLPROCDATA *spcpdNext;
+    WNDPROC pfnClientPrevious;
+    GETCPD wType;
+} CALLPROCDATA, *PCALLPROCDATA;
+
+#define CSF_SERVERSIDEPROC      0x0001
+#define CSF_ANSIPROC            0x0002
+#define CSF_WOWDEFERDESTROY     0x0004
+#define CSF_SYSTEMCLASS         0x0008
+#define CSF_WOWCLASS            0x0010
+#define CSF_WOWEXTRA            0x0020
+#define CSF_CACHEDSMICON        0x0040
+#define CSF_WIN40COMPAT         0x0080
+
+typedef struct _CLS
+{
+    struct _CLS *pclsNext;
+    RTL_ATOM atomClassName;
+    ATOM atomNVClassName;
+    DWORD fnid;
+    struct _DESKTOP *rpdeskParent;
+    PVOID pdce;
+    DWORD CSF_flags;
+    PSTR  lpszClientAnsiMenuName;    // For client use
+    PWSTR lpszClientUnicodeMenuName; // "   "      "
+    PCALLPROCDATA spcpdFirst;
+    struct _CLS *pclsBase;
+    struct _CLS *pclsClone;
+    ULONG cWndReferenceCount;
+    UINT style;
+    WNDPROC lpfnWndProc;
+    INT cbclsExtra;
+    INT cbwndExtra;
+    HINSTANCE hModule;
+    HANDLE hIcon; /* FIXME - Use pointer! */
+    //PCURSOR spicn;
+    HANDLE hCursor; /* FIXME - Use pointer! */
+    //PCURSOR spcur;
+    HBRUSH hbrBackground;
+    PWSTR lpszMenuName;     // kernel use
+    PSTR lpszAnsiClassName; // " 
+    HANDLE hIconSm; /* FIXME - Use pointer! */
+    //PCURSOR spicnSm;
 
-    /* Size of the extra data associated with the window. */
-    ULONG ExtraDataSize;
-    /* Style. */
-    DWORD Style;
+    UINT Unicode : 1; // !CSF_ANSIPROC
+    UINT Global : 1;  // CS_GLOBALCLASS or CSF_SERVERSIDEPROC
+    UINT MenuNameIsString : 1;
+    UINT NotUsed : 29;
+} CLS, *PCLS;
+
+
+// State Flags !Not Implemented!
+#define WNDS_HASMENU                 0X00000001
+#define WNDS_HASVERTICALSCROOLLBAR   0X00000002
+#define WNDS_HASHORIZONTALSCROLLBAR  0X00000004
+#define WNDS_HASCAPTION              0X00000008
+#define WNDS_SENDSIZEMOVEMSGS        0X00000010
+#define WNDS_MSGBOX                  0X00000020
+#define WNDS_ACTIVEFRAME             0X00000040
+#define WNDS_HASSPB                  0X00000080
+#define WNDS_NONCPAINT               0X00000100
+#define WNDS_SENDERASEBACKGROUND     0X00000200
+#define WNDS_ERASEBACKGROUND         0X00000400
+#define WNDS_SENDNCPAINT             0X00000800
+#define WNDS_INTERNALPAINT           0X00001000
+#define WNDS_UPDATEDIRTY             0X00002000
+#define WNDS_HIDDENPOPUP             0X00004000
+#define WNDS_FORCEMENUDRAW           0X00008000
+#define WNDS_DIALOGWINDOW            0X00010000
+#define WNDS_HASCREATESTRUCTNAME     0X00020000
+#define WNDS_SERVERSIDEWINDOWPROC    0x00040000 // Call proc inside win32k.
+#define WNDS_ANSIWINDOWPROC          0x00080000
+#define WNDS_BEGINGACTIVATED         0x00100000
+#define WNDS_HASPALETTE              0x00200000
+#define WNDS_PAINTNOTPROCESSED       0x00400000
+#define WNDS_SYNCPAINTPENDING        0x00800000
+#define WNDS_RECIEVEDQUERYSUSPENDMSG 0x01000000
+#define WNDS_RECIEVEDSUSPENDMSG      0x02000000
+#define WNDS_TOGGLETOPMOST           0x04000000
+#define WNDS_REDRAWIFHUNG            0x08000000
+#define WNDS_REDRAWFRAMEIFHUNG       0x10000000
+#define WNDS_ANSICREATOR             0x20000000
+#define WNDS_MAXIMIZESTOMONITOR      0x40000000
+#define WNDS_DESTROYED               0x80000000
+
+// State2 Flags !Not Implemented!
+#define WNDS2_WMPAINTSENT               0X00000001
+#define WNDS2_ENDPAINTINVALIDATE        0X00000002
+#define WNDS2_STARTPAINT                0X00000004
+#define WNDS2_OLDUI                     0X00000008
+#define WNDS2_HASCLIENTEDGE             0X00000010
+#define WNDS2_BOTTOMMOST                0X00000020
+#define WNDS2_FULLSCREEN                0X00000040
+#define WNDS2_INDESTROY                 0X00000080
+#define WNDS2_WIN31COMPAT               0X00000100
+#define WNDS2_WIN40COMPAT               0X00000200
+#define WNDS2_WIN50COMPAT               0X00000400
+#define WNDS2_MAXIMIZEDMONITORREGION    0X00000800
+#define WNDS2_CLOSEBUTTONDOWN           0X00001000
+#define WNDS2_MAXIMIZEBUTTONDOWN        0X00002000
+#define WNDS2_MINIMIZEBUTTONDOWN        0X00004000
+#define WNDS2_HELPBUTTONDOWN            0X00008000
+#define WNDS2_SCROLLBARLINEUPBTNDOWN    0X00010000
+#define WNDS2_SCROLLBARPAGEUPBTNDOWN    0X00020000
+#define WNDS2_SCROLLBARPAGEDOWNBTNDOWN  0X00040000
+#define WNDS2_SCROLLBARLINEDOWNBTNDOWN  0X00080000
+#define WNDS2_ANYSCROLLBUTTONDOWN       0X00100000
+#define WNDS2_SCROLLBARVERTICALTRACKING 0X00200000
+#define WNDS2_FORCENCPAINT              0X00400000
+#define WNDS2_FORCEFULLNCPAINTCLIPRGN   0X00800000
+#define WNDS2_FULLSCREENMODE            0X01000000
+#define WNDS2_CAPTIONTEXTTRUNCATED      0X08000000
+#define WNDS2_NOMINMAXANIMATERECTS      0X10000000
+#define WNDS2_SMALLICONFROMWMQUERYDRAG  0X20000000
+#define WNDS2_SHELLHOOKREGISTERED       0X40000000
+#define WNDS2_WMCREATEMSGPROCESSED      0X80000000
+
+/* Non SDK ExStyles */
+#define WS_EX_MAKEVISIBLEWHENUNGHOSTED 0x00000800
+#define WS_EX_FORCELEGACYRESIZENCMETR  0x00800000
+#define WS_EX_UISTATEACTIVE            0x04000000
+#define WS_EX_REDIRECTED               0X20000000
+#define WS_EX_UISTATEKBACCELHIDDEN     0X40000000
+#define WS_EX_UISTATEFOCUSRECTHIDDEN   0X80000000
+#define WS_EX_SETANSICREATOR           0x80000000 // For WNDS_ANSICREATOR
+
+/* Non SDK Styles */
+#define WS_MAXIMIZED  WS_MAXIMIZE
+#define WS_MINIMIZED  WS_MINIMIZE
+
+/* ExStyles2 */
+#define WS_EX2_CLIPBOARDLISTENER        0X00000001
+#define WS_EX2_LAYEREDINVALIDATE        0X00000002
+#define WS_EX2_REDIRECTEDFORPRINT       0X00000004
+#define WS_EX2_LINKED                   0X00000008
+#define WS_EX2_LAYEREDFORDWM            0X00000010
+#define WS_EX2_LAYEREDLIMBO             0X00000020
+#define WS_EX2_HIGHTDPI_UNAWAR          0X00000040
+#define WS_EX2_VERTICALLYMAXIMIZEDLEFT  0X00000080
+#define WS_EX2_VERTICALLYMAXIMIZEDRIGHT 0X00000100
+#define WS_EX2_HASOVERLAY               0X00000200
+#define WS_EX2_CONSOLEWINDOW            0X00000400
+#define WS_EX2_CHILDNOACTIVATE          0X00000800
+
+typedef struct _WND
+{
+    THRDESKHEAD head;
+    DWORD state;
+    DWORD state2;
     /* Extended style. */
     DWORD ExStyle;
+    /* Style. */
+    DWORD style;
     /* Handle of the module that created the window. */
-    HINSTANCE Instance;
-    /* Window menu handle or window id */
-    UINT IDMenu;
-    LONG UserData;
+    HINSTANCE hModule;
+    DWORD fnid;
+    struct _WND *spwndNext;
+    struct _WND *spwndPrev;
+    struct _WND *spwndParent;
+    struct _WND *spwndChild;
+    struct _WND *spwndOwner;
+    RECT rcWindow;
+    RECT rcClient;
+    WNDPROC lpfnWndProc;
     /* Pointer to the window class. */
-    PWINDOWCLASS Class;
-    /* Window name. */
-    UNICODE_STRING WindowName;
-    /* Context help id */
-    DWORD ContextHelpId;
-
-    HWND hWndLastActive;
+    PCLS pcls;
+    HRGN hrgnUpdate;
     /* Property list head.*/
     LIST_ENTRY PropListHead;
     ULONG PropListItems;
+    /* Scrollbar info */
+    PSBINFO pSBInfo;
+    /* system menu handle. */
+    HMENU SystemMenu;
+    //PMENU spmenuSys;
+    /* Window menu handle or window id */
+    UINT IDMenu; // Use spmenu
+    //PMENU spmenu;
+    HRGN hrgnClip;
+    HRGN hrgnNewFrame;
+    /* Window name. */
+    UNICODE_STRING strName;
+    /* Size of the extra data associated with the window. */
+    ULONG cbwndExtra;
+    HWND hWndLastActive;
+    struct _WND *spwndLastActive;
+    //HIMC hImc; // Input context associated with this window.
+    LONG dwUserData;
+    //PACTIVATION_CONTEXT pActCtx;
+    //PD3DMATRIX pTransForm;
+    struct _WND *spwndClipboardListener;
+    DWORD ExStyle2;
 
     struct
     {
@@ -196,58 +533,72 @@ typedef struct _WINDOW
         POINT MaxPos;
     } InternalPos;
 
-    UINT Unicode : 1;
+    UINT Unicode : 1; // !(WNDS_ANSICREATOR|WNDS_ANSIWINDOWPROC) ?
     /* Indicates whether the window is derived from a system class */
-    UINT IsSystem : 1;
     UINT InternalPosInitialized : 1;
-    UINT HideFocus : 1;
-    UINT HideAccel : 1;
-} WINDOW, *PWINDOW;
+    UINT HideFocus : 1; // WS_EX_UISTATEFOCUSRECTHIDDEN ?
+    UINT HideAccel : 1; // WS_EX_UISTATEKBACCELHIDDEN ?
+} WND, *PWND;
 
 typedef struct _PFNCLIENT
 {
-   PROC pfnScrollBarC;
-   PROC pfnDefWndC;
-   PROC pfnMenuC;
-   PROC pfnDesktopC;
-   PROC pfnDefWnd1C;
-   PROC pfnDefWnd2C;
-   PROC pfnDefWnd3C;
-   PROC pfnButtomC;
-   PROC pfnComboBoxC;
-   PROC pfnComboListBoxC;
-   PROC pfnDefDlgC;
-   PROC pfnEditC;
-   PROC pfnListBoxC;
-   PROC pfnMDIClientC;
-   PROC pfnStaticC;
-   PROC pfnImeC;
-   PROC pfnHkINLPCWPSTRUCT;
-   PROC pfnHkINLPCWPRETSTRUCT;
-   PROC pfnDispatchHookC;
-   PROC pfnDispatchDefC;
+    WNDPROC pfnScrollBarWndProc;
+    WNDPROC pfnTitleWndProc;
+    WNDPROC pfnMenuWndProc;
+    WNDPROC pfnDesktopWndProc;
+    WNDPROC pfnDefWindowProc;
+    WNDPROC pfnMessageWindowProc;
+    WNDPROC pfnSwitchWindowProc;
+    WNDPROC pfnButtonWndProc;
+    WNDPROC pfnComboBoxWndProc;
+    WNDPROC pfnComboListBoxProc;
+    WNDPROC pfnDialogWndProc;
+    WNDPROC pfnEditWndProc;
+    WNDPROC pfnListBoxWndProc;
+    WNDPROC pfnMDIClientWndProc;
+    WNDPROC pfnStaticWndProc;
+    WNDPROC pfnImeWndProc;
+    WNDPROC pfnGhostWndProc;
+    WNDPROC pfnHkINLPCWPSTRUCT;
+    WNDPROC pfnHkINLPCWPRETSTRUCT;
+    WNDPROC pfnDispatchHook;
+    WNDPROC pfnDispatchDefWindowProc;
+    WNDPROC pfnDispatchMessage;
+    WNDPROC pfnMDIActivateDlgProc;
 } PFNCLIENT, *PPFNCLIENT;
 
+/*
+  Wine Common proc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL Unicode );
+  Windows uses Ansi == TRUE, Wine uses Unicode == TRUE.
+ */
+
+typedef LRESULT(CALLBACK *WNDPROC_EX)(HWND,UINT,WPARAM,LPARAM,BOOL);
+
 typedef struct _PFNCLIENTWORKER
 {
-   PROC pfnButtonCW;
-   PROC pfnComboBoxCW;
-   PROC pfnComboListBoxCW;
-   PROC pfnDefDlgCW;
-   PROC pfnEditCW;
-   PROC pfnListBoxCW;
-   PROC pfnMDIClientCW;
-   PROC pfnStaticCW;
-   PROC pfnImeCW;
+    WNDPROC_EX pfnButtonWndProc;
+    WNDPROC_EX pfnComboBoxWndProc;
+    WNDPROC_EX pfnComboListBoxProc;
+    WNDPROC_EX pfnDialogWndProc;
+    WNDPROC_EX pfnEditWndProc;
+    WNDPROC_EX pfnListBoxWndProc;
+    WNDPROC_EX pfnMDIClientWndProc;
+    WNDPROC_EX pfnStaticWndProc;
+    WNDPROC_EX pfnImeWndProc;
+    WNDPROC_EX pfnGhostWndProc;
+    WNDPROC_EX pfnCtfHookProc;
 } PFNCLIENTWORKER, *PPFNCLIENTWORKER;
 
+typedef LONG_PTR (NTAPI *PFN_FNID)(PWND, UINT, WPARAM, LPARAM, ULONG_PTR);
 
 // FNID's for NtUserSetWindowFNID, NtUserMessageCall
+#define FNID_FIRST                  0x029A
 #define FNID_SCROLLBAR              0x029A
 #define FNID_ICONTITLE              0x029B
 #define FNID_MENU                   0x029C
 #define FNID_DESKTOP                0x029D
 #define FNID_DEFWINDOWPROC          0x029E
+#define FNID_MESSAGEWND             0x029F
 #define FNID_SWITCH                 0x02A0
 #define FNID_BUTTON                 0x02A1
 #define FNID_COMBOBOX               0x02A2
@@ -258,22 +609,40 @@ typedef struct _PFNCLIENTWORKER
 #define FNID_MDICLIENT              0x02A7
 #define FNID_STATIC                 0x02A8
 #define FNID_IME                    0x02A9
-#define FNID_CALLWNDPROC            0x02AA
-#define FNID_CALLWNDPROCRET         0x02AB
-#define FNID_SENDMESSAGE            0x02B0
+#define FNID_GHOST                  0x02AA
+#define FNID_CALLWNDPROC            0x02AB
+#define FNID_CALLWNDPROCRET         0x02AC
+#define FNID_HKINLPCWPEXSTRUCT      0x02AD
+#define FNID_HKINLPCWPRETEXSTRUCT   0x02AE
+#define FNID_MB_DLGPROC             0x02AF
+#define FNID_MDIACTIVATEDLGPROC     0x02B0
+#define FNID_SENDMESSAGE            0x02B1
+#define FNID_SENDMESSAGEFF          0x02B2
 // Kernel has option to use TimeOut or normal msg send, based on type of msg.
-#define FNID_SENDMESSAGEWTOOPTION   0x02B1
-#define FNID_SENDMESSAGETIMEOUT     0x02B2
-#define FNID_BROADCASTSYSTEMMESSAGE 0x02B4
-#define FNID_TOOLTIPS               0x02B5
-#define FNID_UNKNOWN                0x02B6
+#define FNID_SENDMESSAGEWTOOPTION   0x02B3
+#define FNID_SENDMESSAGETIMEOUT     0x02B4
+#define FNID_BROADCASTSYSTEMMESSAGE 0x02B5
+#define FNID_TOOLTIPS               0x02B6 
 #define FNID_SENDNOTIFYMESSAGE      0x02B7
 #define FNID_SENDMESSAGECALLBACK    0x02B8
+#define FNID_LAST                   0x02B9
+
+#define FNID_NUM FNID_LAST - FNID_FIRST + 1
+#define FNID_NUMSERVERPROC FNID_SWITCH - FNID_FIRST + 1
 
 #define FNID_DDEML       0x2000 // Registers DDEML
 #define FNID_DESTROY     0x4000 // This is sent when WM_NCDESTROY or in the support routine.
                                 // Seen during WM_CREATE on error exit too.
+#define FNID_FREED       0x8000 // Window being Freed...
+
+#define ICLASS_TO_MASK(iCls) (1 << ((iCls)))
+
+#define GETPFNCLIENTA(fnid)\
+ (WNDPROC)(*(((ULONG_PTR *)&gpsi->apfnClientA) + (fnid - FNID_FIRST)))
+#define GETPFNCLIENTW(fnid)\
+ (WNDPROC)(*(((ULONG_PTR *)&gpsi->apfnClientW) + (fnid - FNID_FIRST)))
+
+#define GETPFNSERVER(fnid) gpsi->aStoCidPfn[fnid - FNID_FIRST]
 
 // ICLS's for NtUserGetClassName FNID to ICLS, NtUserInitializeClientPfnArrays
 #define ICLS_BUTTON       0
@@ -292,188 +661,121 @@ typedef struct _PFNCLIENTWORKER
 #define ICLS_DDEMLSERVERA 13
 #define ICLS_DDEMLSERVERW 14
 #define ICLS_IME          15
-#define ICLS_DESKTOP      16
-#define ICLS_DIALOG       17
-#define ICLS_MENU         18
-#define ICLS_SWITCH       19
-#define ICLS_ICONTITLE    20
-#define ICLS_TOOLTIPS     21
+#define ICLS_GHOST        16
+#define ICLS_DESKTOP      17
+#define ICLS_DIALOG       18
+#define ICLS_MENU         19
+#define ICLS_SWITCH       20
+#define ICLS_ICONTITLE    21
+#define ICLS_TOOLTIPS     22
+#if (_WIN32_WINNT <= 0x0501)
 #define ICLS_UNKNOWN      22
 #define ICLS_NOTUSED      23
+#else
+#define ICLS_SYSSHADOW    23
+#define ICLS_HWNDMESSAGE  24
+#define ICLS_NOTUSED      25
+#endif
 #define ICLS_END          31
 
-#define SRVINFO_METRICS 0x0020
-
-typedef struct _SERVERINFO
-{
-  DWORD    SRVINFO_Flags;
-  DWORD    SystemMetrics[SM_CMETRICS];       // System Metrics
-  COLORREF SysColors[COLOR_MENUBAR+1];       // GetSysColor
-  HBRUSH   SysColorBrushes[COLOR_MENUBAR+1]; // GetSysColorBrush
-  HPEN     SysColorPens[COLOR_MENUBAR+1];    // ReactOS exclusive
-  HBRUSH   hbrGray;
-  POINTL   ptCursor;
-  //
-  DWORD    cxSysFontChar;
-  DWORD    cySysFontChar;
-  DWORD    cxMsgFontChar;
-  DWORD    cyMsgFontChar;
-  TEXTMETRICW tmSysFont;
-  //
-  RECTL    rcScreen;
-  WORD     BitCount;
-  WORD     dmLogPixels;
-  BYTE     BitsPixel;
-  BYTE     Planes;
-  WORD     reserved;
-  DWORD    PUSIFlags; // PERUSERSERVERINFO Flags.
-  ULONG    uCaretWidth;
-  LANGID   UILangID;
-  UINT     LastRITWasKeyboard : 1;
-  UINT     bKeyboardPref : 1;
-  DWORD    TimeTick;
-  DWORD    SrvEventActivity;
-} SERVERINFO, *PSERVERINFO;
-
-typedef struct _PROCESSINFO
-{
-    PVOID UserHandleTable;
-    HANDLE hUserHeap;
-    ULONG_PTR UserHeapDelta;
-    HINSTANCE hModUser;
-    PWINDOWCLASS LocalClassList;
-    PWINDOWCLASS GlobalClassList;
-    PWINDOWCLASS SystemClassList;
-
-    UINT RegisteredSysClasses : 1;
-
-} PROCESSINFO, *PPROCESSINFO;
-
-#define CTI_INSENDMESSAGE 0x0002
+#define COLOR_LAST COLOR_MENUBAR
+#define MAX_MB_STRINGS 11
 
-typedef struct _CLIENTTHREADINFO
-{
-    DWORD CTI_flags;
-    WORD  fsChangeBits;
-    WORD  fsWakeBits;
-    WORD  fsWakeBitsJournal;
-    WORD  fsWakeMask;
-    LONG  timeLastRead;
-    DWORD dwcPumpHook;
-} CLIENTTHREADINFO, *PCLIENTTHREADINFO;
-
-
-/* Window Client Information structure */
-struct  _ETHREAD;
-
-
-typedef struct tagHOOK
-{
-  LIST_ENTRY     Chain;      /* Hook chain entry */
-  HHOOK          Self;       /* user handle for this hook */
-  struct _ETHREAD* Thread;   /* Thread owning the hook */
-  int            HookId;     /* Hook table index */
-  HOOKPROC       Proc;       /* Hook function */
-  BOOLEAN        Ansi;       /* Is it an Ansi hook? */
-  ULONG          Flags;      /* Some internal flags */
-  UNICODE_STRING ModuleName; /* Module name for global hooks */
-} HOOK, *PHOOK;
+#define SRVINFO_APIHOOK 0x0010
+#define SRVINFO_METRICS 0x0020
 
-typedef struct _CALLBACKWND
+typedef struct tagOEMBITMAPINFO
 {
-     HWND hWnd;
-     PVOID pvWnd;
-} CALLBACKWND, *PCALLBACKWND;
+    INT x;
+    INT y;
+    INT cx;
+    INT cy;
+} OEMBITMAPINFO, *POEMBITMAPINFO;
 
-#define CI_CURTHPRHOOK    0x00000010
-
-typedef struct _CLIENTINFO
+typedef struct tagMBSTRING
 {
-    ULONG CI_flags;
-    ULONG cSpins;
-    DWORD dwExpWinVer;
-    DWORD dwCompatFlags;
-    DWORD dwCompatFlags2;
-    DWORD dwTIFlags;
-    PDESKTOPINFO pDeskInfo;
-    ULONG_PTR ulClientDelta;
-    PHOOK phkCurrent;
-    ULONG fsHooks;
-    CALLBACKWND CallbackWnd;
-    DWORD dwHookCurrent;
-    INT cInDDEMLCallback;
-    PCLIENTTHREADINFO pClientThreadInfo;
-    ULONG_PTR dwHookData;
-    DWORD dwKeyCache;
-    DWORD afKeyState[2];
-    DWORD dwAsyncKeyCache;
-    DWORD afAsyncKeyState[2];
-    DWORD afAsyncKeyStateRecentDow[2];
-    HKL hKL;
-    USHORT CodePage;
-    USHORT achDbcsCF;
-    MSG msgDbcsCB;
-    ULONG Win32ClientInfo3[28];
-/* It's just a pointer reference not to be used w the structure in user space. */
-    PPROCESSINFO ppi;    
-} CLIENTINFO, *PCLIENTINFO;
-
-/* Make sure it fits exactly into the TEB */
-C_ASSERT(sizeof(CLIENTINFO) == FIELD_OFFSET(TEB, glDispatchTable) - FIELD_OFFSET(TEB, Win32ClientInfo));
-
-#define GetWin32ClientInfo() ((PCLIENTINFO)(NtCurrentTeb()->Win32ClientInfo))
+    WCHAR szName[16];
+    UINT uID;
+    UINT uStr;
+} MBSTRING, *PMBSTRING;
 
-#include <pshpack1.h>
-
-typedef struct _TL
+typedef struct tagDPISERVERINFO
 {
-    struct _TL* next;
-    PVOID pobj;
-    PVOID pfnFree;
-} TL, *PTL;
-
-typedef struct _W32THREAD
+    INT gclBorder;                       /* 000 */
+    HFONT hCaptionFont;                  /* 004 */
+    HFONT hMsgFont;                      /* 008 */
+    INT cxMsgFontChar;                   /* 00C */
+    INT cyMsgFontChar;                   /* 010 */
+    UINT wMaxBtnSize;                    /* 014 */
+} DPISERVERINFO, *PDPISERVERINFO;
+
+typedef struct _PERUSERSERVERINFO
 {
-    struct _ETHREAD* pEThread;
-    ULONG RefCount;
-    PTL ptlW32;
-    PVOID pgdiDcattr;
-    PVOID pgdiBrushAttr;
-    PVOID pUMPDObjs;
-    PVOID pUMPDHeap;
-    DWORD dwEngAcquireCount;
-    PVOID pSemTable;
-    PVOID pUMPDObj;
-} W32THREAD, *PW32THREAD;
-
-typedef struct _THREADINFO
+    INT           aiSysMet[SM_CMETRICS];
+    ULONG         argbSystemUnmatched[COLOR_LAST+1];
+    COLORREF      argbSystem[COLOR_LAST+1];
+    HBRUSH        ahbrSystem[COLOR_LAST+1];
+    HBRUSH        hbrGray;
+    POINT         ptCursor;
+    POINT         ptCursorReal;
+    DWORD         dwLastRITEventTickCount;
+    INT           nEvents;
+    UINT          dtScroll;
+    UINT          dtLBSearch;
+    UINT          dtCaretBlink;
+    UINT          ucWheelScrollLines;
+    UINT          ucWheelScrollChars;
+    INT           wMaxLeftOverlapChars;
+    INT           wMaxRightOverlapChars;
+    INT           cxSysFontChar;
+    INT           cySysFontChar;
+    TEXTMETRICW   tmSysFont;
+    DPISERVERINFO dpiSystem;
+    HICON         hIconSmWindows;
+    HICON         hIcoWindows;
+    DWORD         dwKeyCache;
+    DWORD         dwAsyncKeyCache;
+    ULONG         cCaptures;
+    OEMBITMAPINFO oembmi[93];
+    RECT          rcScreenReal;
+    USHORT        BitCount;
+    USHORT        dmLogPixels;
+    BYTE          Planes;
+    BYTE          BitsPixel;
+    ULONG         PUSIFlags;
+    UINT          uCaretWidth;
+    USHORT        UILangID;
+    DWORD         dwLastSystemRITEventTickCountUpdate;
+    ULONG         adwDBGTAGFlags[35];
+    DWORD         dwTagCount;
+    DWORD         dwRIPFlags;
+} PERUSERSERVERINFO, *PPERUSERSERVERINFO;
+
+typedef struct tagSERVERINFO
 {
-    W32THREAD           XzyxW32Thread; /* Do not use! */
-    PTL                 ptl;
-    PPROCESSINFO        ppi;
-    struct _USER_MESSAGE_QUEUE* MessageQueue;
-    struct _KBL*        KeyboardLayout;
-    PCLIENTTHREADINFO   pcti;
-    struct _DESKTOP*    Desktop;
-    PDESKTOPINFO        pDeskInfo;
-    PCLIENTINFO         pClientInfo;
-    FLONG               TIF_flags;
-    HANDLE              hDesktop;
-    UINT                cPaintsReady; /* Count of paints pending. */
-    UINT                cTimersReady; /* Count of timers pending. */
-    LIST_ENTRY          PtiLink;
-    ULONG               fsHooks;
-
-    CLIENTTHREADINFO    cti;  /* Internal to win32k */
-/* ReactOS */
-  LIST_ENTRY WindowListHead;
-  LIST_ENTRY W32CallbackListHead;
-  BOOLEAN IsExiting;
-  SINGLE_LIST_ENTRY  ReferencesList;
-
-} THREADINFO, *PTHREADINFO;
-
-#include <poppack.h>
+    DWORD           dwSRVIFlags;
+    ULONG_PTR       cHandleEntries;
+    PFN_FNID        mpFnidPfn[FNID_NUM];
+    WNDPROC         aStoCidPfn[FNID_NUMSERVERPROC];
+    USHORT          mpFnid_serverCBWndProc[FNID_NUM];
+    PFNCLIENT       apfnClientA;
+    PFNCLIENT       apfnClientW;
+    PFNCLIENTWORKER apfnClientWorker;
+    ULONG           cbHandleTable;
+    ATOM            atomSysClass[ICLS_NOTUSED+1];
+    DWORD           dwDefaultHeapBase;
+    DWORD           dwDefaultHeapSize;
+    UINT            uiShellMsg;
+    MBSTRING        MBStrings[MAX_MB_STRINGS];
+    ATOM            atomIconSmProp;
+    ATOM            atomIconProp;
+    ATOM            atomContextHelpIdProp;
+    ATOM            atomFrostedWindowProp;
+    CHAR            acOemToAnsi[256];
+    CHAR            acAnsiToOem[256];
+    DWORD           dwInstalledEventHooks;
+    PERUSERSERVERINFO;
+} SERVERINFO, *PSERVERINFO;
 
 
 // Server event activity bits.
@@ -505,7 +807,7 @@ typedef struct _BROADCASTPARM
   DWORD recipients;
   HDESK hDesk;
   HWND  hWnd;
-  LUID  luid;  
+  LUID  luid;
 } BROADCASTPARM, *PBROADCASTPARM;
 
 PTHREADINFO GetW32ThreadInfo(VOID);
@@ -523,7 +825,7 @@ typedef struct _SHAREDINFO
   PVOID       aheList;       // Handle Entry List
   PVOID       pDispInfo;     // global PDISPLAYINFO pointer
   ULONG_PTR   ulSharedDelta; // Heap delta
-  WNDMSG      awmControl[31];
+  WNDMSG      awmControl[FNID_LAST - FNID_FIRST];
   WNDMSG      DefWindowMsgs;
   WNDMSG      DefWindowSpecMsgs;
 } SHAREDINFO, *PSHAREDINFO;
@@ -539,14 +841,25 @@ typedef struct _USERCONNECT
 //
 // Non SDK Window Message types.
 //
+#define WM_CLIENTSHUTDOWN 59
+#define WM_COPYGLOBALDATA 73
 #define WM_SYSTIMER 280
 #define WM_POPUPSYSTEMMENU 787
+#define WM_CBT 1023 // ReactOS only.
+#define WM_MAXIMUM 0x0001FFFF
 
 //
 // Non SDK DCE types.
 //
 #define DCX_USESTYLE     0x00010000
 #define DCX_KEEPCLIPRGN  0x00040000
+#define DCX_KEEPLAYOUT   0x40000000
+#define DCX_PROCESSOWNED 0x80000000
+
+//
+// Non SDK Queue message types.
+//
+#define QS_SMRESULT      0x8000
 
 DWORD
 NTAPI
@@ -1019,22 +1332,22 @@ NtUserCallNextHookEx(
   LPARAM lParam,
   BOOL Ansi);
 
-DWORD
+DWORD_PTR
 NTAPI
 NtUserCallNoParam(
   DWORD Routine);
 
-DWORD
+DWORD_PTR
 NTAPI
 NtUserCallOneParam(
-  DWORD Param,
+  DWORD_PTR Param,
   DWORD Routine);
 
-DWORD
+DWORD_PTR
 NTAPI
 NtUserCallTwoParam(
-  DWORD Param1,
-  DWORD Param2,
+  DWORD_PTR Param1,
+  DWORD_PTR Param2,
   DWORD Routine);
 
 BOOL
@@ -1052,6 +1365,18 @@ NtUserChangeDisplaySettings(
   DWORD dwflags,
   LPVOID lParam);
 
+BOOL
+NTAPI
+NtUserCheckDesktopByThreadId(
+  DWORD dwThreadId);
+
+BOOL
+NTAPI
+NtUserCheckWindowThreadDesktop(
+  HWND hwnd,
+  DWORD dwThreadId,
+  ULONG ReturnValue);
+
 DWORD
 NTAPI
 NtUserCheckImeHotKey(
@@ -1125,11 +1450,11 @@ NtUserCreateCaret(
 HDESK
 NTAPI
 NtUserCreateDesktop(
-  PUNICODE_STRING lpszDesktopName,
+  POBJECT_ATTRIBUTES poa,
+  PUNICODE_STRING lpszDesktopDevice,
+  LPDEVMODEW lpdmw,
   DWORD dwFlags,
-  ACCESS_MASK dwDesiredAccess,
-  LPSECURITY_ATTRIBUTES lpSecurity,
-  HWINSTA hWindowStation);
+  ACCESS_MASK dwDesiredAccess);
 
 DWORD
 NTAPI
@@ -1166,7 +1491,7 @@ NtUserCreateWindowEx(
 HWND
 NTAPI
 NtUserCreateWindowEx(
-  DWORD dwExStyle,
+  DWORD dwExStyle, // |= 0x80000000 == Ansi used to set WNDS_ANSICREATOR
   PLARGE_STRING plstrClassName,
   PLARGE_STRING plstrClsVesrion,
   PLARGE_STRING plstrWindowName,
@@ -1218,14 +1543,16 @@ NtUserDdeSetQualityOfService(
   OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev);
 
 HDWP NTAPI
-NtUserDeferWindowPos(HDWP WinPosInfo,
-                    HWND Wnd,
-                    HWND WndInsertAfter,
-                    int x,
-         int y,
-         int cx,
-         int cy,
-                    UINT Flags);
+NtUserDeferWindowPos(
+  HDWP WinPosInfo,
+  HWND Wnd,
+  HWND WndInsertAfter,
+  int x,
+  int y,
+  int cx,
+  int cy,
+  UINT Flags);
+
 BOOL NTAPI
 NtUserDefSetText(HWND WindowHandle, PLARGE_STRING WindowText);
 
@@ -1299,6 +1626,15 @@ NtUserDrawCaptionTemp(
   const PUNICODE_STRING str,
   UINT uFlags);
 
+// Used with NtUserDrawIconEx, last parameter.
+typedef struct _DRAWICONEXDATA
+{
+  HBITMAP hbmMask;
+  HBITMAP hbmColor;
+  int cx;
+  int cy;
+} DRAWICONEXDATA, *PDRAWICONEXDATA;
+
 BOOL
 NTAPI
 NtUserDrawIconEx(
@@ -1311,8 +1647,8 @@ NtUserDrawIconEx(
   UINT istepIfAniCur,
   HBRUSH hbrFlickerFreeDraw,
   UINT diFlags,
-  DWORD Unknown0,
-  DWORD Unknown1);
+  BOOL bMetaHDC,
+  PVOID pDIXData);
 
 DWORD
 NTAPI
@@ -1519,12 +1855,12 @@ NtUserGetControlColor(
    HDC hdc,
    UINT CtlMsg);
 
-DWORD
+ULONG_PTR
 NTAPI
 NtUserGetCPD(
-  DWORD Unknown0,
-  DWORD Unknown1,
-  DWORD Unknown2);
+  HWND hWnd,
+  GETCPD Flags,   
+  ULONG_PTR Proc);
 
 DWORD
 NTAPI
@@ -1764,10 +2100,12 @@ enum ThreadStateRoutines
     THREADSTATE_ACTIVEWINDOW,
     THREADSTATE_CAPTUREWINDOW,
     THREADSTATE_PROGMANWINDOW,
-    THREADSTATE_TASKMANWINDOW
+    THREADSTATE_TASKMANWINDOW,
+    THREADSTATE_GETMESSAGETIME,
+    THREADSTATE_GETINPUTSTATE
 };
 
-DWORD
+DWORD_PTR
 NTAPI
 NtUserGetThreadState(
   DWORD Routine);
@@ -1799,11 +2137,11 @@ NtUserGetWindowPlacement(
   HWND hWnd,
   WINDOWPLACEMENT *lpwndpl);
 
-DWORD
+PCLS
 NTAPI
 NtUserGetWOWClass(
-  DWORD Unknown0,
-  DWORD Unknown1);
+  HINSTANCE hInstance,
+  PUNICODE_STRING ClassName);
 
 DWORD
 NTAPI
@@ -1828,7 +2166,7 @@ NtUserInitialize(
 NTSTATUS
 NTAPI
 NtUserInitializeClientPfnArrays(
-  PPFNCLIENT pfnClientA, 
+  PPFNCLIENT pfnClientA,
   PPFNCLIENT pfnClientW,
   PPFNCLIENTWORKER pfnClientWorker,
   HINSTANCE hmodUser);
@@ -1914,7 +2252,7 @@ NtUserMapVirtualKeyEx( UINT keyCode,
                       UINT transType,
                       DWORD keyboardId,
                       HKL dwhkl );
-LRESULT
+BOOL
 NTAPI
 NtUserMessageCall(
   HWND hWnd,
@@ -2096,6 +2434,7 @@ NtUserQueryUserCounters(
 #define QUERY_WINDOW_ACTIVE     0x02
 #define QUERY_WINDOW_FOCUS      0x03
 #define QUERY_WINDOW_ISHUNG    0x04
+#define QUERY_WINDOW_REAL_ID   0x05
 DWORD
 NTAPI
 NtUserQueryWindow(
@@ -2153,11 +2492,13 @@ NtUserRegisterRawInputDevices(
     IN UINT uiNumDevices,
     IN UINT cbSize);
 
-DWORD
+BOOL
 NTAPI
 NtUserRegisterUserApiHook(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2);
+    PUNICODE_STRING m_dllname1,
+    PUNICODE_STRING m_funname1,
+    DWORD dwUnknown3,
+    DWORD dwUnknown4);
 
 BOOL
 NTAPI
@@ -2213,13 +2554,13 @@ NTAPI
 NtUserResolveDesktopForWOW(
   DWORD Unknown0);
 
-DWORD
+BOOL
 NTAPI
 NtUserSBGetParms(
-  DWORD Unknown0,
-  DWORD Unknown1,
-  DWORD Unknown2,
-  DWORD Unknown3);
+  HWND hwnd,
+  int fnBar,
+  PSBDATA pSBData,
+  LPSCROLLINFO lpsi);
 
 BOOL
 NTAPI
@@ -2355,13 +2696,14 @@ NtUserSetInformationProcess(
     DWORD dwUnknown3,
     DWORD dwUnknown4);
 
-DWORD
+NTSTATUS
 NTAPI
 NtUserSetInformationThread(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4);
+    IN HANDLE ThreadHandle,
+    IN USERTHREADINFOCLASS ThreadInformationClass,
+    IN PVOID ThreadInformation,
+    IN ULONG ThreadInformationLength
+);
 
 DWORD
 NTAPI
@@ -2669,7 +3011,7 @@ NTAPI
 NtUserUnregisterHotKey(HWND hWnd,
                       int id);
 
-DWORD
+BOOL
 NTAPI
 NtUserUnregisterUserApiHook(VOID);
 
@@ -2698,7 +3040,8 @@ NtUserUpdateLayeredWindow(
   POINT *pptSrc,
   COLORREF crKey,
   BLENDFUNCTION *pblend,
-  DWORD dwFlags);
+  DWORD dwFlags,
+  RECT *prcDirty);
 
 BOOL
 NTAPI
@@ -2737,7 +3080,7 @@ NTAPI
 NtUserVkKeyScanEx(
   WCHAR wChar,
   HKL KeyboardLayout,
-  DWORD Unknown2);
+  BOOL bUsehHK);
 
 DWORD
 NTAPI
@@ -2765,6 +3108,11 @@ NtUserWin32PoolAllocationStats(
   DWORD Unknown4,
   DWORD Unknown5);
 
+HWND
+NTAPI
+NtUserWindowFromPhysicalPoint(      
+  POINT Point);
+
 HWND
 NTAPI
 NtUserWindowFromPoint(
@@ -2809,23 +3157,16 @@ typedef struct tagKMDDELPARAM
 #define NOPARAM_ROUTINE_ANYPOPUP              0xffff0006
 #define NOPARAM_ROUTINE_CSRSS_INITIALIZED     0xffff0007
 #define ONEPARAM_ROUTINE_CSRSS_GUICHECK       0xffff0008
-#define ONEPARAM_ROUTINE_GETMENU              0xfffe0001 // usermode
-#define ONEPARAM_ROUTINE_ISWINDOWUNICODE      0xfffe0002
-#define ONEPARAM_ROUTINE_GETCARETINFO         0xfffe0007
 #define ONEPARAM_ROUTINE_SWITCHCARETSHOWING   0xfffe0008
 #define ONEPARAM_ROUTINE_ISWINDOWINDESTROY    0xfffe000c
 #define ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING 0xfffe000d
 #define ONEPARAM_ROUTINE_GETDESKTOPMAPPING    0xfffe000e
-#define ONEPARAM_ROUTINE_GETWINDOWINSTANCE    0xfffe0010
 #define ONEPARAM_ROUTINE_CREATECURICONHANDLE  0xfffe0025 // CREATE_EMPTY_CURSOR_OBJECT ?
 #define ONEPARAM_ROUTINE_MSQSETWAKEMASK       0xfffe0027
-#define ONEPARAM_ROUTINE_REGISTERUSERMODULE   0xfffe0031
-#define ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID   0xfffe0047 // use HWND_ROUTINE_GETWNDCONTEXTHLPID
 #define ONEPARAM_ROUTINE_GETCURSORPOSITION    0xfffe0048 // use ONEPARAM_ or TWOPARAM routine ?
 #define TWOPARAM_ROUTINE_GETWINDOWRGNBOX    0xfffd0048 // user mode
 #define TWOPARAM_ROUTINE_GETWINDOWRGN       0xfffd0049 // user mode
 #define TWOPARAM_ROUTINE_SETMENUBARHEIGHT   0xfffd0050
-#define TWOPARAM_ROUTINE_SETMENUITEMRECT    0xfffd0051
 #define TWOPARAM_ROUTINE_SETGUITHRDHANDLE   0xfffd0052
   #define MSQ_STATE_CAPTURE    0x1
   #define MSQ_STATE_ACTIVE     0x2
@@ -2833,16 +3174,8 @@ typedef struct tagKMDDELPARAM
   #define MSQ_STATE_MENUOWNER  0x4
   #define MSQ_STATE_MOVESIZE   0x5
   #define MSQ_STATE_CARET      0x6
-#define TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID 0xfffd0058 // use HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
 #define TWOPARAM_ROUTINE_SETCARETPOS        0xfffd0060
-#define TWOPARAM_ROUTINE_GETWINDOWINFO      0xfffd0061
 #define TWOPARAM_ROUTINE_REGISTERLOGONPROC  0xfffd0062
-#define TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES 0xfffd0063
-#define TWOPARAM_ROUTINE_GETSYSCOLORPENS    0xfffd0064
-#define TWOPARAM_ROUTINE_GETSYSCOLORS       0xfffd0065
-#define TWOPARAM_ROUTINE_ROS_ISACTIVEICON   0x1001
-#define TWOPARAM_ROUTINE_ROS_NCDESTROY      0x1002
-#define TWOPARAM_ROUTINE_ROS_REGSYSCLASSES  0x1003
 #define TWOPARAM_ROUTINE_ROS_UPDATEUISTATE  0x1004
 
 DWORD
@@ -2861,7 +3194,7 @@ NtUserCreateCursorIconHandle(
   BOOL Indirect);
 
 
-/* Should be done in usermode */
+/* Should be done in usermode and use NtUserGetCPD. */
 ULONG_PTR
 NTAPI
 NtUserGetClassLong(HWND hWnd, INT Offset, BOOL Ansi);
@@ -2892,22 +3225,6 @@ NtUserGetMonitorInfo(
   OUT LPMONITORINFO pMonitorInfo);
 
 /* Should be done in usermode */
-BOOL
-NTAPI
-NtUserGetScrollInfo(
-  HWND hwnd,
-  int fnBar,
-  LPSCROLLINFO lpsi);
-
-HWND
-NTAPI
-NtUserGetWindow(HWND hWnd, UINT Relationship);
-
-/* Should be done in usermode */
-LONG
-NTAPI
-NtUserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi);
-
 
 /* (other FocusedItem values give the position of the focused item) */
 #define NO_SELECTED_ITEM  0xffff
@@ -2962,8 +3279,8 @@ typedef struct tagROSMENUITEMINFO
     HBITMAP hbmpItem;
     /* ----------- Extra ----------- */
     RECT Rect;      /* Item area (relative to menu window) */
-    UINT XTab;      /* X position of text after Tab */
-    LPWSTR Text;    /* Copy of the text pointer in MenuItem->Text */
+    UINT dxTab;      /* X position of text after Tab */
+    LPWSTR lpstr;    /* Copy of the text pointer in MenuItem->Text */
 } ROSMENUITEMINFO, *PROSMENUITEMINFO;
 
 BOOL
@@ -2995,22 +3312,6 @@ NtUserMonitorFromWindow(
   IN DWORD dwFlags);
 
 
-/* FIXME: These flag constans aren't what Windows uses. */
-#define REGISTERCLASS_ANSI     2
-#define REGISTERCLASS_ALL      (REGISTERCLASS_ANSI)
-
-RTL_ATOM
-NTAPI
-NtUserRegisterClassEx(   // Need to use NtUserRegisterClassExWOW.
-   CONST WNDCLASSEXW* lpwcx,
-   PUNICODE_STRING ClassName,
-   PUNICODE_STRING MenuName,
-   WNDPROC wpExtra,
-   DWORD Flags,
-   HMENU hMenu);
-
-
-
 typedef struct tagNTUSERSENDMESSAGEINFO
 {
   BOOL HandledByKernel;
@@ -3037,16 +3338,6 @@ NtUserSendMessageTimeout(HWND hWnd,
                         ULONG_PTR *uResult,
              PNTUSERSENDMESSAGEINFO Info);
 
-/* use NtUserMessageCall */
-BOOL
-NTAPI
-NtUserSendNotifyMessage(
-  HWND hWnd,
-  UINT Msg,
-  WPARAM wParam,
-  LPARAM lParam);
-
-
 typedef struct _SETSCROLLBARINFO
 {
   int nTrackPos;