43 TRACE(
"Loading Keyboard DLL %ws\n", pwszLayoutPath);
47 ERR(
"Failed to load dll %ws\n", pwszLayoutPath);
52 TRACE(
"Loaded %ws\n", pwszLayoutPath);
58 if (pfnKbdLayerDescriptor)
59 *pKbdTables = pfnKbdLayerDescriptor();
61 ERR(
"Error: %ws has no KbdLayerDescriptor()\n", pwszLayoutPath);
63 if (!pfnKbdLayerDescriptor || !*pKbdTables)
65 ERR(
"Failed to load the keyboard layout.\n");
73 PVK_TO_BIT pVkToBit = (*pKbdTables)->pCharModifiers->pVkToBit;
75 PVSC_VK pVscVk = (*pKbdTables)->pVSCtoVK_E0;
76 DbgPrint(
"Kbd layout: fLocaleFlags %x bMaxVSCtoVK %x\n", (*pKbdTables)->fLocaleFlags, (*pKbdTables)->bMaxVSCtoVK);
77 DbgPrint(
"wMaxModBits %x\n", (*pKbdTables)->pCharModifiers->wMaxModBits);
83 for (
i = 0;
i <= (*pKbdTables)->pCharModifiers->wMaxModBits; ++
i)
84 DbgPrint(
"ModNumber %x -> %x\n",
i, (*pKbdTables)->pCharModifiers->ModNumber[
i]);
89 while (pVkToWch->VirtualKey)
91 DbgPrint(
"pVkToWch VirtualKey %x Attributes %x wc { ", pVkToWch->VirtualKey, pVkToWch->Attributes);
95 pVkToWch = (PVK_TO_WCHARS1)(((
PBYTE)pVkToWch) + pVkToWchTbl->
cbSize);
100 for (
i = 0;
i < (*pKbdTables)->bMaxVSCtoVK; ++
i)
101 DbgPrint(
"%x -> %x, ",
i, (*pKbdTables)->pusVSCtoVK[
i]);
110 pVscVk = (*pKbdTables)->pVSCtoVK_E1;
138 WCHAR wszLayoutRegKey[256] =
L"\\REGISTRY\\Machine\\SYSTEM\\CurrentControlSet\\" 139 L"Control\\Keyboard Layouts\\";
145 ERR(
"Failed to create object!\n");
157 ERR(
"Failed to open keyboard layouts registry key %ws (%lx)\n", wszLayoutRegKey,
Status);
162 cbSize = (
ULONG)(
sizeof(wszLayoutPath) -
wcslen(wszLayoutPath)*
sizeof(
WCHAR));
166 wszLayoutPath +
wcslen(wszLayoutPath),
171 ERR(
"Can't get layout filename for %wZ (%lx)\n", pwszKLID,
Status);
178 ERR(
"Failed to load %ws dll!\n", wszLayoutPath);
220 ERR(
"Failed to create object!\n");
233 ERR(
"UserLoadKbdFile(%wZ) failed!\n", pustrKLID);
241 ERR(
"RtlUnicodeStringToInteger failed for '%wZ'\n", pustrKLID);
246 TRACE(
"Language Identifiers %wZ LCID 0x%x\n", pustrKLID, lCid);
252 TRACE(
"Charset %u Font Sig %lu CodePage %u\n",
287 if (*ppkfLink == pkf)
290 ppkfLink = &(*ppkfLink)->
pkfNext;
293 if (*ppkfLink == pkf)
468 ListEntry = pti->
rpdesk->PtiList.Flink;
473 while(ListEntry != &pti->
rpdesk->PtiList)
483 ListEntry = ListEntry->
Flink;
531 pHklBuff[uRet] = pKl->
hkl;
612 KLF_RESET|KLF_SHIFTLOCK))
621 RtlInitEmptyUnicodeString(&ustrSafeKLID,
Buffer,
sizeof(
Buffer));
625 ProbeForRead(pustrKLID->Buffer,
sizeof(pustrKLID->Length), 1);
659 pklLast = pklLast->pklPrev;
662 pKl->
pklNext = pklLast->pklNext;
735 ERR(
"Invalid HKL %p!\n", hKl);
781 ERR(
"Invalid HKL %p!\n", hKl);
static BOOL UserLoadKbdDll(WCHAR *pwszLayoutPath, HANDLE *phModule, PKBDTABLES *pKbdTables)
VOID FASTCALL UserEnterShared(VOID)
PVK_TO_WCHARS1 pVkToWchars
DBG_DEFAULT_CHANNEL(UserKbdLayout)
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
BOOL UserUnloadKbl(PKL pKl)
BOOL APIENTRY co_IntGetCharsetInfo(LCID Locale, PCHARSETINFO pCs)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
BOOL FASTCALL UserDereferenceObject(PVOID Object)
HKL APIENTRY NtUserLoadKeyboardLayoutEx(IN HANDLE Handle, IN DWORD offTable, IN PUNICODE_STRING puszKeyboardName, IN HKL hklUnload, IN PUNICODE_STRING pustrKLID, IN DWORD hkl, IN UINT Flags)
NTSTRSAFEAPI RtlStringCbCatW(_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, PDESKTOP pDesktop, PTHREADINFO pti, HANDLE *h, HANDLE_TYPE type, ULONG size)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
BOOL APIENTRY NtUserGetKeyboardLayoutName(LPWSTR pwszName)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define EXCEPTION_EXECUTE_HANDLER
#define KLF_UNLOADPREVIOUS
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define KLF_SUBSTITUTE_OK
VOID FASTCALL UserEnterExclusive(VOID)
#define UserHMGetHandle(obj)
struct _LIST_ENTRY * Flink
_Must_inspect_result_ _In_ ULONG Flags
#define _SEH2_YIELD(STMT_)
PKL W32kGetDefaultKeyLayout(VOID)
HKL FASTCALL UserGetKeyboardLayout(DWORD dwThreadId)
#define NT_SUCCESS(StatCode)
#define UlongToHandle(ul)
struct tagKBDFILE * pkfNext
BOOL APIENTRY NtUserUnloadKeyboardLayout(HKL hKl)
ENGAPI HANDLE APIENTRY EngLoadImage(_In_ LPWSTR pwszDriver)
struct _CLIENTINFO * pClientInfo
struct _KBDTABLES * pKbdTbl
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
static PKL co_UserActivateKbl(PTHREADINFO pti, PKL pKl, UINT Flags)
HANDLE NTAPI PsGetThreadId(IN PETHREAD Thread)
struct tagKL * KeyboardLayout
VOID FASTCALL SetLastNtError(NTSTATUS Status)
struct _USER_MESSAGE_QUEUE * MessageQueue
VOID FASTCALL UserLeave(VOID)
BOOL NTAPI UserSetDefaultInputLang(HKL hKl)
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 KLF_SETFORPROCESS
ENGAPI PVOID APIENTRY EngFindImageProcAddress(_In_ HANDLE hModule, _In_ LPSTR lpProcName)
PVOID(* PFN_KBDLAYERDESCRIPTOR)(VOID)
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
PKL NTAPI UserHklToKbl(HKL hKl)
ENGAPI VOID APIENTRY EngUnloadImage(_In_ HANDLE hModule)
char * cleanup(char *str)
#define _SEH2_EXCEPT(...)
static PKBDFILE UserLoadKbdFile(PUNICODE_STRING pwszKLID)
#define _SEH2_GetExceptionCode()
static VOID UnloadKbdFile(_In_ PKBDFILE pkf)
UINT APIENTRY NtUserGetKeyboardLayoutList(ULONG nBuff, HKL *pHklBuff)
PUSER_HANDLE_TABLE gHandleTable
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define ERROR_INVALID_FLAGS
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
static PKL UserLoadKbdLayout(PUNICODE_STRING pustrKLID, HKL hKL)
VOID FASTCALL UserReferenceObject(PVOID obj)
HKL APIENTRY NtUserActivateKeyboardLayout(HKL hKl, ULONG Flags)