41 pFirstKL = pti->KeyboardLayout;
55 }
while (pKL != pFirstKL);
64 }
while (pKL != pFirstKL);
75 }
while (pKL != pFirstKL);
86 }
while (pKL != pFirstKL);
107 if (!pWinSta || !pFirstKL)
120 }
while (pKL != pFirstKL);
129 *pHklBuff = pKL->
hkl;
138 }
while (pKL != pFirstKL);
155 DbgPrint(
"Kbd layout: fLocaleFlags %x bMaxVSCtoVK %x\n",
156 pKbdTbl->fLocaleFlags, pKbdTbl->bMaxVSCtoVK);
158 pKbdTbl->pCharModifiers ? pKbdTbl->pCharModifiers->wMaxModBits
161 if (pKbdTbl->pCharModifiers)
163 pVkToBit = pKbdTbl->pCharModifiers->pVkToBit;
166 for (; pVkToBit->
Vk; ++pVkToBit)
172 for (
i = 0;
i <= pKbdTbl->pCharModifiers->wMaxModBits; ++
i)
174 DbgPrint(
"ModNumber %x -> %x\n",
i, pKbdTbl->pCharModifiers->ModNumber[
i]);
178 pVkToWchTbl = pKbdTbl->pVkToWcharTable;
183 PVK_TO_WCHARS1 pVkToWch = pVkToWchTbl->
pVkToWchars;
185 DbgPrint(
"pVkToWchTbl nModifications %x cbSize %x\n",
189 while (pVkToWch->VirtualKey)
191 DbgPrint(
"pVkToWch VirtualKey %x Attributes %x wc { ",
192 pVkToWch->VirtualKey, pVkToWch->Attributes);
198 pVkToWch = (PVK_TO_WCHARS1)(((
PBYTE)pVkToWch) + pVkToWchTbl->
cbSize);
207 if (pKbdTbl->pusVSCtoVK)
209 for (
i = 0;
i < pKbdTbl->bMaxVSCtoVK; ++
i)
211 DbgPrint(
"%x -> %x, ",
i, pKbdTbl->pusVSCtoVK[
i]);
217 pVscVk = pKbdTbl->pVSCtoVK_E0;
220 for (; pVscVk->
Vsc; ++pVscVk)
228 pVscVk = pKbdTbl->pVSCtoVK_E1;
231 for (; pVscVk->
Vsc; ++pVscVk)
257 TRACE(
"Loading Keyboard DLL %ws\n", pwszLayoutPath);
261 ERR(
"Failed to load dll %ws\n", pwszLayoutPath);
266 TRACE(
"Loaded %ws\n", pwszLayoutPath);
272 if (pfnKbdLayerDescriptor)
273 *pKbdTables = pfnKbdLayerDescriptor();
275 ERR(
"Error: %ws has no KbdLayerDescriptor()\n", pwszLayoutPath);
277 if (!pfnKbdLayerDescriptor || !*pKbdTables)
279 ERR(
"Failed to load the keyboard layout.\n");
286 DumpKbdLayout(*pKbdTables);
305 WCHAR wszLayoutRegKey[256] =
L"\\REGISTRY\\Machine\\SYSTEM\\CurrentControlSet\\"
306 L"Control\\Keyboard Layouts\\";
312 ERR(
"Failed to create object!\n");
324 ERR(
"Failed to open keyboard layouts registry key %ws (%lx)\n", wszLayoutRegKey,
Status);
329 cbSize = (
ULONG)(
sizeof(wszLayoutPath) -
wcslen(wszLayoutPath)*
sizeof(
WCHAR));
333 wszLayoutPath +
wcslen(wszLayoutPath),
338 ERR(
"Can't get layout filename for %wZ (%lx)\n", pwszKLID,
Status);
345 ERR(
"Failed to load %ws dll!\n", wszLayoutPath);
387 ERR(
"Failed to create object!\n");
400 ERR(
"UserLoadKbdFile(%wZ) failed!\n", pustrKLID);
408 ERR(
"RtlUnicodeStringToInteger failed for '%wZ'\n", pustrKLID);
413 TRACE(
"Language Identifiers %wZ LCID 0x%x\n", pustrKLID, lCid);
419 TRACE(
"Charset %u Font Sig %lu CodePage %u\n",
454 if (*ppkfLink == pkf)
457 ppkfLink = &(*ppkfLink)->
pkfNext;
460 if (*ppkfLink == pkf)
567 if ((pWinSta->Flags &
WSS_NOIO) || pNewKL == pOldKL)
570 pNewKL->
pklPrev->pklNext = pNewKL->pklNext;
571 pNewKL->pklNext->pklPrev = pNewKL->pklPrev;
572 pNewKL->pklNext = pOldKL;
574 pOldKL->
pklPrev->pklNext = pNewKL;
616 FIXME(
"KLF_SETFORPROCESS\n");
642 if (pti->KeyboardLayout == pKL)
645 pImeWnd = pti->spwndDefaultIme;
656 pti->hklPrev = pti->KeyboardLayout->hkl;
658 if (pti->spDefaultImc)
666 pti->pClientInfo->hKL = pKL->hkl;
667 pti->pClientInfo->CodePage = pKL->CodePage;
676 for (ptiNode = ppi->
ptiList; ptiNode; ptiNode = ptiNext)
697 pClientInfo->
hKL = pKL->
hkl;
713 PWND pTargetWnd, pImeWnd;
714 HWND hTargetWnd, hImeWnd;
726 hOldKL = pOldKL->
hkl;
731 FIXME(
"KLF_RESET\n");
740 pKL->wchDiacritic = 0;
751 else if (bSetForProcess)
830 ERR(
"Invalid HKL %p!\n", hKL);
895 ERR(
"Invalid HKL %p!\n", hKL);
938 if (hOldKL && hOldKL != hNewKL)
966 pNewKL->
pklNext->pklPrev = pNewKL;
967 pNewKL->
pklPrev->pklNext = pNewKL;
1047 ListEntry = pti->
rpdesk->PtiList.Flink;
1052 while(ListEntry != &pti->
rpdesk->PtiList)
1062 ListEntry = ListEntry->
Flink;
1149 ustrNameSafe = *pustrName;
1172 *pustrName = ustrNameSafe;
1218 KLF_RESET|KLF_SHIFTLOCK))
1225 RtlInitEmptyUnicodeString(&uszSafeKLID,
Buffer,
sizeof(
Buffer));
1229 ProbeForRead(puszKLID->Buffer,
sizeof(puszKLID->Length), 1);
#define UlongToHandle(ul)
#define DBG_DEFAULT_CHANNEL(ch)
#define NT_SUCCESS(StatCode)
#define ERROR_INVALID_PARAMETER
#define INVALID_HANDLE_VALUE
static void cleanup(void)
#define ExAllocatePoolWithTag(hernya, size, tag)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define IMS_ACTIVATELAYOUT
#define IMS_SENDNOTIFICATION
#define EXCEPTION_EXECUTE_HANDLER
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define UserHMGetHandle(obj)
struct _THREADINFO * GetW32ThreadInfo(VOID)
#define ExFreePoolWithTag(_P, _T)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
#define UNREFERENCED_PARAMETER(P)
HANDLE NTAPI PsGetThreadId(IN PETHREAD Thread)
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
NTSTRSAFEAPI RtlStringCbCatW(_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
PWINSTATION_OBJECT FASTCALL IntGetProcessWindowStation(HWINSTA *phWinSta OPTIONAL)
VOID FASTCALL UserLeave(VOID)
VOID FASTCALL UserEnterShared(VOID)
VOID FASTCALL UserEnterExclusive(VOID)
static __inline VOID UserDerefObjectCo(PVOID obj)
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
#define ProbeForWriteUnicodeString(Ptr)
struct _LIST_ENTRY * Flink
struct _DESKTOPINFO * pDeskInfo
struct _CLIENTINFO * pClientInfo
struct tagKL * KeyboardLayout
struct _WND * spwndDefaultIme
struct _USER_MESSAGE_QUEUE * MessageQueue
PVK_TO_WCHARS1 pVkToWchars
struct _KBDTABLES * pKbdTbl
struct tagKBDFILE * pkfNext
#define CONTAINING_RECORD(address, type, field)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
#define IntDereferenceThreadInfo(pti)
#define IntReferenceThreadInfo(pti)
VOID FASTCALL SetLastNtError(NTSTATUS Status)
BOOL APIENTRY co_IntGetCharsetInfo(LCID Locale, PCHARSETINFO pCs)
BOOL APIENTRY co_ClientImmLoadLayout(_In_ HKL hKL, _Inout_ PIMEINFOEX pImeInfoEx)
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
PTHREADINFO gptiForeground
UINT APIENTRY NtUserGetKeyboardLayoutList(ULONG nBuff, HKL *pHklBuff)
static BOOL APIENTRY co_IntUnloadKeyboardLayoutEx(_Inout_ PWINSTATION_OBJECT pWinSta, _Inout_ PKL pKL, _In_ DWORD dwFlags)
static UINT APIENTRY IntGetKeyboardLayoutList(_Inout_ PWINSTATION_OBJECT pWinSta, _In_ ULONG nBuff, _Out_ HKL *pHklBuff)
HKL NTAPI NtUserActivateKeyboardLayout(HKL hKL, ULONG Flags)
static BOOL UserLoadKbdDll(WCHAR *pwszLayoutPath, HANDLE *phModule, PKBDTABLES *pKbdTables)
static PKL co_UserActivateKbl(PTHREADINFO pti, PKL pKl, UINT Flags)
VOID FASTCALL IntReorderKeyboardLayouts(_Inout_ PWINSTATION_OBJECT pWinSta, _Inout_ PKL pNewKL)
HKL APIENTRY co_IntActivateKeyboardLayout(_Inout_ PWINSTATION_OBJECT pWinSta, _In_ HKL hKL, _In_ ULONG uFlags, _Inout_ PWND pWnd)
VOID APIENTRY IntImmActivateLayout(_Inout_ PTHREADINFO pti, _Inout_ PKL pKL)
static BOOL APIENTRY IntUnloadKeyboardLayout(_Inout_ PWINSTATION_OBJECT pWinSta, _In_ HKL hKL)
PKL NTAPI UserHklToKbl(HKL hKl)
PKL FASTCALL IntHKLtoPKL(_Inout_ PTHREADINFO pti, _In_ HKL hKL)
static PKL co_UserLoadKbdLayout(PUNICODE_STRING pustrKLID, HKL hKL)
BOOL UserUnloadKbl(PKL pKl)
PVOID(* PFN_KBDLAYERDESCRIPTOR)(VOID)
PIMEINFOEX FASTCALL co_UserImmLoadLayout(_In_ HKL hKL)
static VOID UnloadKbdFile(_In_ PKBDFILE pkf)
HKL APIENTRY co_IntLoadKeyboardLayoutEx(IN OUT PWINSTATION_OBJECT pWinSta, IN HANDLE hSafeFile, IN HKL hOldKL, IN PUNICODE_STRING puszSafeKLID, IN HKL hNewKL, IN UINT Flags)
BOOL APIENTRY NtUserUnloadKeyboardLayout(HKL hKl)
BOOL APIENTRY NtUserGetKeyboardLayoutName(_Inout_ PUNICODE_STRING pustrName)
HKL FASTCALL UserGetKeyboardLayout(DWORD dwThreadId)
static VOID co_IntSetKeyboardLayoutForProcess(PPROCESSINFO ppi, PKL pKL)
PKL W32kGetDefaultKeyLayout(VOID)
HANDLE FASTCALL IntVerifyKeyboardFileHandle(HANDLE hFile)
HKL NTAPI NtUserLoadKeyboardLayoutEx(IN HANDLE hFile, IN DWORD offTable, IN PVOID pTables, IN HKL hOldKL, IN PUNICODE_STRING puszKLID, IN DWORD dwNewKL, IN UINT Flags)
BOOL NTAPI UserSetDefaultInputLang(HKL hKl)
static PKBDFILE UserLoadKbdFile(PUNICODE_STRING pwszKLID)
HKL APIENTRY co_UserActivateKeyboardLayout(_Inout_ PKL pKL, _In_ ULONG uFlags, _Inout_ PWND pWnd)
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
BOOL FASTCALL UserMarkObjectDestroy(PVOID Object)
PVOID FASTCALL UserAssignmentLock(PVOID *ppvObj, PVOID pvNew)
BOOL FASTCALL UserDereferenceObject(PVOID Object)
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
PUSER_HANDLE_TABLE gHandleTable
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
ENGAPI PVOID APIENTRY EngFindImageProcAddress(_In_ HANDLE hModule, _In_ LPSTR lpProcName)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
ENGAPI VOID APIENTRY EngUnloadImage(_In_ HANDLE hModule)
ENGAPI HANDLE APIENTRY EngLoadImage(_In_ LPWSTR pwszDriver)
#define ERROR_INVALID_FLAGS
#define KLF_SETFORPROCESS
#define KLF_SUBSTITUTE_OK
#define KLF_UNLOADPREVIOUS
_Must_inspect_result_ _In_ ULONG Flags
#define ObDereferenceObject