#define NB_HOOKS (WH_MAXHOOK - WH_MINHOOK + 1)
+/*
+ * DESKTOPINFO structure.
+ * See also: https://reactos.org/wiki/Techwiki:Win32k/DESKTOP
+ */
typedef struct _DESKTOPINFO
{
PVOID pvDesktopBase;
#define CTI_THREADSYSLOCK 0x0001
#define CTI_INSENDMESSAGE 0x0002
+/*
+ * CLIENTTHREADINFO structure.
+ * See also: https://reactos.org/wiki/Techwiki:Win32k/CLIENTTHREADINFO
+ */
typedef struct _CLIENTTHREADINFO
{
DWORD CTI_flags;
HWND hImeWnd;
} IMC, *PIMC;
+#ifndef _WIN64
+C_ASSERT(offsetof(IMC, head.h) == 0x0);
+C_ASSERT(offsetof(IMC, head.cLockObj) == 0x4);
+C_ASSERT(offsetof(IMC, head.pti) == 0x8);
+C_ASSERT(offsetof(IMC, pImcNext) == 0x14);
+C_ASSERT(offsetof(IMC, dwClientImcData) == 0x18);
+C_ASSERT(offsetof(IMC, hImeWnd) == 0x1c);
+#endif
+
typedef struct _PROCDESKHEAD
{
HEAD;
} PROCMARKHEAD, *PPROCMARKHEAD;
#define UserHMGetHandle(obj) ((obj)->head.h)
+#define UserHMSetHandle(obj, handle) ((obj)->head.h = (handle))
/* Window Client Information structure */
struct _ETHREAD;
#define CI_INITTHREAD 0x00000008
#define CI_CURTHPRHOOK 0x00000010
#define CI_CLASSESREGISTERED 0x00000020
-#define CI_IMMACTIVATE 0x00000040
-#define CI_TFSDISABLED 0x00000400
+#define CI_IMMACTIVATE 0x00000040 /* IMM/IME (Asian input) */
+#define CI_CTFCOINIT 0x00000080 /* Did CTF CoInitialize? */
+#define CI_CTFTIM 0x00000100 /* CTF Thread Input Manager (TIM) */
+#define CI_CICERO_STARTED 0x00000200 /* Is Cicero started in the thread? */
+#define CI_TSFDISABLED 0x00000400 /* TSF (Text Services Framework a.k.a. Cicero) */
+#define CI_AIMMACTIVATED 0x00000800 /* Active IMM (AIMM) */
+/*
+ * CLIENTINFO structure.
+ * See also: https://reactos.org/wiki/Techwiki:Win32k/CLIENTINFO
+ */
typedef struct _CLIENTINFO
{
ULONG_PTR CI_flags;
SCROLLINFO ScrollInfo;
} SBINFOEX, *PSBINFOEX;
-/* State Flags !Not Implemented! */
+/* State Flags !Not ALL Implemented! */
#define WNDS_HASMENU 0X00000001
#define WNDS_HASVERTICALSCROOLLBAR 0X00000002
#define WNDS_HASHORIZONTALSCROLLBAR 0X00000004
#define WNDSACTIVEFRAME 0x00000006
-/* State2 Flags !Not Implemented! */
+/* State2 Flags !Not ALL Implemented! */
#define WNDS2_WMPAINTSENT 0X00000001
#define WNDS2_ENDPAINTINVALIDATE 0X00000002
#define WNDS2_STARTPAINT 0X00000004
#define WPF_MININIT 0x0008
#define WPF_MAXINIT 0x0010
+/*
+ * WND structure.
+ * See also: https://reactos.org/wiki/Techwiki:Win32k/WND
+ */
typedef struct _WND
{
THRDESKHEAD head;
#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_LAST FNID_SENDMESSAGECALLBACK
+
+#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. */
#define PUSIF_LISTBOXSMOOTHSCROLLING 0x08
#define PUSIF_KEYBOARDCUES 0x20
+/*
+ * PERUSERSERVERINFO structure.
+ * See also: https://reactos.org/wiki/Techwiki:Win32k/SERVERINFO
+ */
typedef struct _PERUSERSERVERINFO
{
INT aiSysMet[SM_CMETRICS];
DWORD dwRIPFlags;
} PERUSERSERVERINFO, *PPERUSERSERVERINFO;
+/*
+ * SERVERINFO structure.
+ * See also: https://reactos.org/wiki/Techwiki:Win32k/SERVERINFO
+ */
typedef struct tagSERVERINFO
{
DWORD dwSRVIFlags;
PINT abMsgs;
} WNDMSG, *PWNDMSG;
+/*
+ * SHAREDINFO structure.
+ * See also: https://reactos.org/wiki/Techwiki:Win32k/SHAREDINFO
+ */
typedef struct _SHAREDINFO
{
- PSERVERINFO psi; /* global Server Info */
- PVOID aheList; /* Handle Entry List */
- PVOID pDispInfo; /* global PDISPLAYINFO pointer */
- ULONG_PTR ulSharedDelta; /* Heap delta */
- WNDMSG awmControl[FNID_LAST - FNID_FIRST];
+ PSERVERINFO psi; /* Global Server Info */
+ PVOID aheList; /* Handle Entry List */
+ PVOID pDispInfo; /* Global PDISPLAYINFO pointer */
+ ULONG_PTR ulSharedDelta; /* Shared USER mapped section delta */
+ WNDMSG awmControl[FNID_NUM];
WNDMSG DefWindowMsgs;
WNDMSG DefWindowSpecMsgs;
} SHAREDINFO, *PSHAREDINFO;
#define CURSORF_LINKED 0x0100
#define CURSORF_CURRENT 0x0200
-typedef struct tagIMEINFOEX
-{
- HKL hkl;
- IMEINFO ImeInfo;
- WCHAR wszUIClass[16];
- ULONG fdwInitConvMode;
- INT fInitOpen;
- INT fLoadFlag;
- DWORD dwProdVersion;
- DWORD dwImeWinVersion;
- WCHAR wszImeDescription[50];
- WCHAR wszImeFile[80];
- struct
- {
- INT fSysWow64Only:1;
- INT fCUASLayer:1;
- };
-} IMEINFOEX, *PIMEINFOEX;
-
-typedef enum IMEINFOEXCLASS
-{
- ImeInfoExKeyboardLayout,
- ImeInfoExImeWindow,
- ImeInfoExImeFileName
-} IMEINFOEXCLASS;
-
-#define IS_IME_HKL(hkl) ((((ULONG_PTR)(hkl)) & 0xF0000000) == 0xE0000000)
+#define IS_IMM_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_IMM32))
+#define IS_CICERO_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_CICERO_ENABLED))
+#define IS_16BIT_MODE() (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
typedef struct tagIMEUI
{
HWND hwndIMC;
HKL hKL;
HWND hwndUI;
- INT nCntInIMEProc;
+ LONG nCntInIMEProc;
struct {
UINT fShowStatus:1;
UINT fActivate:1;
UINT fCtrlShowStatus:1;
UINT fFreeActiveEvent:1;
};
+ DWORD dwLastStatus;
} IMEUI, *PIMEUI;
/* Window Extra data container. */
typedef struct _IMEWND
{
- WND;
+ WND wnd;
PIMEUI pimeui;
} IMEWND, *PIMEWND;
-typedef struct tagTRANSMSG
-{
- UINT message;
- WPARAM wParam;
- LPARAM lParam;
-} TRANSMSG, *PTRANSMSG, *LPTRANSMSG;
-
-typedef struct tagTRANSMSGLIST
-{
- UINT uMsgCount;
- TRANSMSG TransMsg[ANYSIZE_ARRAY];
-} TRANSMSGLIST, *PTRANSMSGLIST, *LPTRANSMSGLIST;
-
-#define DEFINE_IME_ENTRY(type, name, params, extended) typedef type (WINAPI *FN_##name) params;
-#include "imetable.h"
-#undef DEFINE_IME_ENTRY
-
-typedef struct IMEDPI
-{
- struct IMEDPI *pNext;
- HINSTANCE hInst;
- HKL hKL;
- IMEINFO ImeInfo;
- UINT uCodePage;
- WCHAR szUIClass[16];
- DWORD cLockObj;
- DWORD dwFlags;
-#define DEFINE_IME_ENTRY(type, name, params, extended) FN_##name name;
-#include "imetable.h"
-#undef DEFINE_IME_ENTRY
-} IMEDPI, *PIMEDPI;
-
-#ifndef _WIN64
-C_ASSERT(offsetof(IMEDPI, pNext) == 0x0);
-C_ASSERT(offsetof(IMEDPI, hInst) == 0x4);
-C_ASSERT(offsetof(IMEDPI, hKL) == 0x8);
-C_ASSERT(offsetof(IMEDPI, ImeInfo) == 0xc);
-C_ASSERT(offsetof(IMEDPI, uCodePage) == 0x28);
-C_ASSERT(offsetof(IMEDPI, szUIClass) == 0x2c);
-C_ASSERT(offsetof(IMEDPI, cLockObj) == 0x4c);
-C_ASSERT(offsetof(IMEDPI, dwFlags) == 0x50);
-C_ASSERT(offsetof(IMEDPI, ImeInquire) == 0x54);
-C_ASSERT(offsetof(IMEDPI, ImeConversionList) == 0x58);
-C_ASSERT(offsetof(IMEDPI, ImeRegisterWord) == 0x5c);
-C_ASSERT(offsetof(IMEDPI, ImeUnregisterWord) == 0x60);
-C_ASSERT(offsetof(IMEDPI, ImeGetRegisterWordStyle) == 0x64);
-C_ASSERT(offsetof(IMEDPI, ImeEnumRegisterWord) == 0x68);
-C_ASSERT(offsetof(IMEDPI, ImeConfigure) == 0x6c);
-C_ASSERT(offsetof(IMEDPI, ImeDestroy) == 0x70);
-C_ASSERT(offsetof(IMEDPI, ImeEscape) == 0x74);
-C_ASSERT(offsetof(IMEDPI, ImeProcessKey) == 0x78);
-C_ASSERT(offsetof(IMEDPI, ImeSelect) == 0x7c);
-C_ASSERT(offsetof(IMEDPI, ImeSetActiveContext) == 0x80);
-C_ASSERT(offsetof(IMEDPI, ImeToAsciiEx) == 0x84);
-C_ASSERT(offsetof(IMEDPI, NotifyIME) == 0x88);
-C_ASSERT(offsetof(IMEDPI, ImeSetCompositionString) == 0x8c);
-C_ASSERT(offsetof(IMEDPI, ImeGetImeMenuItems) == 0x90);
-C_ASSERT(offsetof(IMEDPI, CtfImeInquireExW) == 0x94);
-C_ASSERT(offsetof(IMEDPI, CtfImeSelectEx) == 0x98);
-C_ASSERT(offsetof(IMEDPI, CtfImeEscapeEx) == 0x9c);
-C_ASSERT(offsetof(IMEDPI, CtfImeGetGuidAtom) == 0xa0);
-C_ASSERT(offsetof(IMEDPI, CtfImeIsGuidMapEnable) == 0xa4);
-C_ASSERT(sizeof(IMEDPI) == 0xa8);
-#endif
-
-/* flags for IMEDPI.dwFlags */
-#define IMEDPI_FLAG_UNKNOWN 0x1
-#define IMEDPI_FLAG_LOCKED 0x2
-
-/* unconfirmed */
-typedef struct tagCLIENTIMC
-{
- HIMC hImc;
- LONG cLockObj;
- DWORD dwFlags;
- DWORD unknown;
- RTL_CRITICAL_SECTION cs;
- DWORD unknown2;
- HKL hKL;
- BOOL bUnknown4;
-} CLIENTIMC, *PCLIENTIMC;
-
-#ifndef _WIN64
-C_ASSERT(offsetof(CLIENTIMC, hImc) == 0x0);
-C_ASSERT(offsetof(CLIENTIMC, cLockObj) == 0x4);
-C_ASSERT(offsetof(CLIENTIMC, dwFlags) == 0x8);
-C_ASSERT(offsetof(CLIENTIMC, cs) == 0x10);
-C_ASSERT(offsetof(CLIENTIMC, hKL) == 0x2c);
-C_ASSERT(sizeof(CLIENTIMC) == 0x34);
-#endif
-
-/* flags for CLIENTIMC */
-#define CLIENTIMC_WIDE 0x1
-#define CLIENTIMC_UNKNOWN1 0x40
-#define CLIENTIMC_UNKNOWN3 0x80
-#define CLIENTIMC_UNKNOWN2 0x100
-
DWORD
NTAPI
-NtUserAssociateInputContext(
- DWORD dwUnknown1,
- DWORD dwUnknown2,
- DWORD dwUnknown3);
+NtUserAssociateInputContext(HWND hWnd, HIMC hIMC, DWORD dwFlags);
NTSTATUS
NTAPI
DWORD dwUnknown1,
DWORD dwUnknown2,
DWORD dwUnknown3);
-
+
DWORD
APIENTRY
NtUserDbgWin32HeapFail(
HKL
NTAPI
NtUserActivateKeyboardLayout(
- HKL hKl,
+ HKL hKL,
ULONG Flags);
DWORD
HWND hwndParent,
BOOLEAN bChildren,
ULONG dwThreadId,
- ULONG lParam,
- HWND *pWnd,
- ULONG *pBufSize);
+ ULONG cHwnd,
+ HWND *phwndList,
+ ULONG *pcHwndNeeded);
NTSTATUS
NTAPI
HWNDLOCK_ROUTINE_SETSYSMENU,
HWNDLOCK_ROUTINE_UPDATECKIENTRECT,
HWNDLOCK_ROUTINE_UPDATEWINDOW,
- X_ROUTINE_IMESHOWSTATUSCHANGE,
+ TWOPARAM_ROUTINE_IMESHOWSTATUSCHANGE,
TWOPARAM_ROUTINE_ENABLEWINDOW,
TWOPARAM_ROUTINE_REDRAWTITLE,
TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS,
DWORD
NTAPI
NtUserCheckImeHotKey(
- DWORD dwUnknown1,
- LPARAM dwUnknown2);
+ UINT uVirtualKey,
+ LPARAM lParam);
HWND NTAPI
NtUserChildWindowFromPointEx(
HIMC
NTAPI
-NtUserCreateInputContext(PCLIENTIMC pClientImc);
+NtUserCreateInputContext(ULONG_PTR dwClientImcData);
NTSTATUS
NTAPI
NtUserDestroyWindow(
HWND Wnd);
-DWORD
+BOOL
NTAPI
NtUserDisableThreadIme(
- DWORD dwUnknown1);
+ DWORD dwThreadID);
LRESULT
NTAPI
NTAPI
NtUserEndDeferWindowPosEx(
HDWP WinPosInfo,
- DWORD Unknown1);
+ BOOL bAsync);
BOOL
NTAPI
LONG *plcx,
LONG *plcy);
-BOOL NTAPI
-NtUserGetImeHotKey(IN DWORD dwHotKey,
- OUT LPUINT lpuModifiers,
- OUT LPUINT lpuVKey,
- OUT LPHKL lphKL);
+BOOL
+NTAPI
+NtUserGetImeHotKey(DWORD dwHotKeyId,
+ LPUINT lpuModifiers,
+ LPUINT lpuVirtualKey,
+ LPHKL lphKL);
BOOL
NTAPI
BOOL
NTAPI
NtUserGetKeyboardLayoutName(
- LPWSTR lpszName);
+ _Inout_ PUNICODE_STRING pustrName);
DWORD
NTAPI
enum ThreadStateRoutines
{
- THREADSTATE_GETTHREADINFO,
- THREADSTATE_INSENDMESSAGE,
- THREADSTATE_FOCUSWINDOW,
+ THREADSTATE_FOCUSWINDOW = 0,
THREADSTATE_ACTIVEWINDOW,
THREADSTATE_CAPTUREWINDOW,
- THREADSTATE_PROGMANWINDOW,
- THREADSTATE_TASKMANWINDOW,
- THREADSTATE_GETMESSAGETIME,
+ THREADSTATE_DEFAULTIMEWINDOW,
+ THREADSTATE_DEFAULTINPUTCONTEXT,
THREADSTATE_GETINPUTSTATE,
- THREADSTATE_UPTIMELASTREAD,
- THREADSTATE_FOREGROUNDTHREAD,
THREADSTATE_GETCURSOR,
+ THREADSTATE_CHANGEBITS,
+ THREADSTATE_UPTIMELASTREAD,
THREADSTATE_GETMESSAGEEXTRAINFO,
- THREADSTATE_UNKNOWN13
+ THREADSTATE_INSENDMESSAGE,
+ THREADSTATE_GETMESSAGETIME,
+ THREADSTATE_FOREGROUNDTHREAD,
+ THREADSTATE_IMECOMPATFLAGS,
+ THREADSTATE_OLDKEYBOARDLAYOUT,
+ THREADSTATE_ISWINLOGON,
+ THREADSTATE_ISWINLOGON2,
+ THREADSTATE_CHECKCONIME,
+ THREADSTATE_GETTHREADINFO,
+ THREADSTATE_PROGMANWINDOW, /* FIXME: Delete this HACK */
+ THREADSTATE_TASKMANWINDOW, /* FIXME: Delete this HACK */
};
DWORD_PTR
HKL
NTAPI
NtUserLoadKeyboardLayoutEx(
- IN HANDLE Handle,
+ IN HANDLE hFile,
IN DWORD offTable,
- IN PUNICODE_STRING puszKeyboardName,
- IN HKL hKL,
+ IN PVOID pTables,
+ IN HKL hOldKL,
IN PUNICODE_STRING puszKLID,
- IN DWORD dwKLID,
+ IN DWORD dwNewKL,
IN UINT Flags);
BOOL
DWORD
NTAPI
-NtUserNotifyIMEStatus(
- HWND hwnd,
- HIMC hIMC,
- DWORD dwConversion);
+NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion);
BOOL
NTAPI
HDC hDC,
ULONG left, // x,
ULONG right, // width, // Scale the edge thickness, offset?
- ULONG top, // y,
+ ULONG top, // y,
BOOL bActive); // DWORD Flags); DC_ACTIVE or WS_ACTIVECAPTION, by checking WNDS_ACTIVEFRAME and foreground.
BOOL
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength);
-DWORD
+DWORD_PTR
NTAPI
NtUserQueryInputContext(
HIMC hIMC,
- DWORD dwUnknown2);
+ DWORD dwType);
DWORD
NTAPI
NtUserSetActiveWindow(
HWND Wnd);
-DWORD
+BOOL
NTAPI
NtUserSetAppImeLevel(
- DWORD dwUnknown1,
- DWORD dwUnknown2);
+ HWND hWnd,
+ DWORD dwLevel);
HWND
NTAPI
_In_ PUNICODE_STRING pustrRsrc,
_In_ FINDEXISTINGCURICONPARAM *param);
+LONG_PTR
+APIENTRY
+NtUserSetClassLongPtr(
+ VOID);
+
DWORD
NTAPI
NtUserSetDbgTag(
DWORD Unknown0,
DWORD Unknown1);
-
+
DWORD
APIENTRY
NtUserSetDbgTagCount(
NtUserSetFocus(
HWND hWnd);
-DWORD
+BOOL
NTAPI
NtUserSetImeHotKey(
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2,
- DWORD Unknown3,
- DWORD Unknown4);
+ DWORD dwHotKeyId,
+ UINT uModifiers,
+ UINT uVirtualKey,
+ HKL hKL,
+ DWORD dwAction);
-DWORD
+BOOL
NTAPI
NtUserSetImeInfoEx(
PIMEINFOEX pImeInfoEx);
-DWORD
+BOOL
NTAPI
-NtUserSetImeOwnerWindow(PIMEINFOEX pImeInfoEx, BOOL fFlag);
+NtUserSetImeOwnerWindow(HWND hImeWnd, HWND hwndFocus);
DWORD
NTAPI
DWORD
NTAPI
-NtUserSetThreadLayoutHandles(
- DWORD dwUnknown1,
- DWORD dwUnknown2);
+NtUserSetThreadLayoutHandles(HKL hNewKL, HKL hOldKL);
UINT_PTR
NTAPI
DWORD Index,
LONG_PTR NewValue,
BOOL Ansi);
+#else
+#define NtUserSetWindowLongPtr NtUserSetWindowLong
#endif // _WIN64
BOOL
NTAPI
NtUserUnregisterUserApiHook(VOID);
-DWORD
+BOOL
NTAPI
NtUserUpdateInputContext(
HIMC hIMC,
- DWORD Unknown1,
- LPVOID pClientImc);
+ DWORD dwType,
+ DWORD_PTR dwValue);
DWORD
NTAPI