struct _DESKTOP;
struct _WND;
struct tagPOPUPMENU;
-#ifndef HIMC
-typedef HANDLE HIMC;
-#endif
#define FIRST_USER_HANDLE 0x0020 /* first possible value for low word of user handle */
#define LAST_USER_HANDLE 0xffef /* last possible value for low word of user handle */
#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;
WORD fsWakeBits;
WORD fsWakeBitsJournal;
WORD fsWakeMask;
- ULONG tickLastMsgChecked;
+ ULONG timeLastRead; // Last time the message queue was read.
DWORD dwcPumpHook;
} CLIENTTHREADINFO, *PCLIENTTHREADINFO;
PVOID pSelf;
} THRDESKHEAD, *PTHRDESKHEAD;
+typedef struct tagIMC
+{
+ THRDESKHEAD head;
+ struct tagIMC *pImcNext;
+ ULONG_PTR dwClientImcData;
+ 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_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;
PSBINFOEX pSBInfoex; // convert to PSBINFO
/* Entry in the list of thread windows. */
LIST_ENTRY ThreadListEntry;
+
+ PVOID DialogPointer;
} WND, *PWND;
#define PWND_BOTTOM ((PWND)1)
#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 SRVINFO_DBCSENABLED 0x0002
#define SRVINFO_IMM32 0x0004
#define SRVINFO_APIHOOK 0x0010
-#define SRVINFO_METRICS 0x0020
+#define SRVINFO_CICERO_ENABLED 0x0020
#define SRVINFO_KBDPREF 0x0080
#define NUM_SYSCOLORS 31
#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;
+#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;
DWORD
NTAPI
-NtUserAssociateInputContext(
- DWORD dwUnknown1,
- DWORD dwUnknown2,
- DWORD dwUnknown3);
+NtUserAssociateInputContext(HWND hWnd, HIMC hIMC, DWORD dwFlags);
-DWORD
+NTSTATUS
NTAPI
-NtUserBuildHimcList(
- DWORD dwUnknown1,
- DWORD dwUnknown2,
- DWORD dwUnknown3,
- DWORD dwUnknown4);
+NtUserBuildHimcList(DWORD dwThreadId, DWORD dwCount, HIMC *phList, LPDWORD pdwCount);
DWORD
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(
DWORD dwFlags,
ACCESS_MASK dwDesiredAccess);
-DWORD
+HIMC
NTAPI
-NtUserCreateInputContext(
- DWORD dwUnknown1);
+NtUserCreateInputContext(ULONG_PTR dwClientImcData);
NTSTATUS
NTAPI
_In_ HANDLE Handle,
_In_ BOOL bForce);
-DWORD
+BOOL
NTAPI
-NtUserDestroyInputContext(
- DWORD dwUnknown1);
+NtUserDestroyInputContext(HIMC hIMC);
BOOLEAN
NTAPI
NtUserDestroyWindow(
HWND Wnd);
-DWORD
+BOOL
NTAPI
NtUserDisableThreadIme(
- DWORD dwUnknown1);
+ DWORD dwThreadID);
LRESULT
NTAPI
NTAPI
NtUserEndDeferWindowPosEx(
HDWP WinPosInfo,
- DWORD Unknown1);
+ BOOL bAsync);
BOOL
NTAPI
DWORD
NTAPI
-NtUserGetAppImeLevel(
- DWORD dwUnknown1);
+NtUserGetAppImeLevel(HWND hWnd);
SHORT
NTAPI
LONG *plcx,
LONG *plcy);
-DWORD
+BOOL
NTAPI
-NtUserGetImeHotKey(
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2,
- DWORD Unknown3);
+NtUserGetImeHotKey(DWORD dwHotKeyId,
+ LPUINT lpuModifiers,
+ LPUINT lpuVirtualKey,
+ LPHKL lphKL);
-DWORD
+BOOL
NTAPI
NtUserGetImeInfoEx(
PIMEINFOEX pImeInfoEx,
- DWORD dwUnknown2);
+ IMEINFOEXCLASS SearchType);
DWORD
NTAPI
BOOL
NTAPI
NtUserGetKeyboardLayoutName(
- LPWSTR lpszName);
+ _Inout_ PUNICODE_STRING pustrName);
DWORD
NTAPI
NTAPI
NtUserGetThreadDesktop(
DWORD dwThreadId,
- DWORD Unknown1);
+ HDESK hConsoleDesktop);
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_GETCURSOR,
+ THREADSTATE_CHANGEBITS,
THREADSTATE_UPTIMELASTREAD,
+ THREADSTATE_GETMESSAGEEXTRAINFO,
+ THREADSTATE_INSENDMESSAGE,
+ THREADSTATE_GETMESSAGETIME,
THREADSTATE_FOREGROUNDTHREAD,
- THREADSTATE_GETCURSOR,
- THREADSTATE_GETMESSAGEEXTRAINFO
+ 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(
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2);
+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(
- DWORD dwUnknown1,
- DWORD dwUnknown2);
+ HIMC hIMC,
+ DWORD dwType);
DWORD
NTAPI
#define QUERY_WINDOW_ISHUNG 0x04
#define QUERY_WINDOW_REAL_ID 0x05
#define QUERY_WINDOW_FOREGROUND 0x06
+#define QUERY_WINDOW_DEFAULT_IME 0x07
+#define QUERY_WINDOW_DEFAULT_ICONTEXT 0x08
+#define QUERY_WINDOW_ACTIVE_IME 0x09
DWORD_PTR
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(
- DWORD Unknown0,
- DWORD Unknown1);
+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(
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2);
+ HIMC hIMC,
+ DWORD dwType,
+ DWORD_PTR dwValue);
DWORD
NTAPI
NtUserWaitForInputIdle(
IN HANDLE hProcess,
IN DWORD dwMilliseconds,
- IN BOOL Unknown2); /* Always FALSE */
+ IN BOOL bSharedWow); /* Always FALSE */
DWORD
NTAPI