- Make NtUserLoadKeyboardLayoutEx accept 6 params

- Always get default locale from ntoskrnl
- Fix some small bugs


svn path=/trunk/; revision=25797
This commit is contained in:
Saveliy Tretiakov 2007-02-13 19:50:06 +00:00
parent 26b059ca40
commit 4db9f2ba75
7 changed files with 73 additions and 25 deletions

View file

@ -332,6 +332,7 @@ LRESULT MainDialogProc(HWND hDlg,
case WM_INPUTLANGCHANGEREQUEST: case WM_INPUTLANGCHANGEREQUEST:
{ {
FormatMsg(L"dlg WM_INPUTLANGCHANGEREQUEST lParam=%x wParam=%x\n", lParam, wParam); FormatMsg(L"dlg WM_INPUTLANGCHANGEREQUEST lParam=%x wParam=%x\n", lParam, wParam);
UpdateData(hDlg);
return FALSE; return FALSE;
} }

View file

@ -49,6 +49,8 @@
5 = gcc -O3 with -mpreferred-stack-boundary=2 5 = gcc -O3 with -mpreferred-stack-boundary=2
--> -->
<property name="OPTIMIZE" value="1" /> <property name="OPTIMIZE" value="1" />
<!-- <!--
Whether to compile for an uniprocessor or multiprocessor machine. Whether to compile for an uniprocessor or multiprocessor machine.
--> -->

View file

@ -300,7 +300,7 @@ LoadKeyboardLayoutA(LPCSTR pwszKLID,
{ {
return NtUserLoadKeyboardLayoutEx( return NtUserLoadKeyboardLayoutEx(
strtoul(pwszKLID, NULL, 16), strtoul(pwszKLID, NULL, 16),
Flags); Flags, 0, 0, 0, 0);
} }
@ -315,7 +315,7 @@ LoadKeyboardLayoutW(LPCWSTR pwszKLID,
// We will do things our own way. // We will do things our own way.
return NtUserLoadKeyboardLayoutEx( return NtUserLoadKeyboardLayoutEx(
wcstoul(pwszKLID, NULL, 16), wcstoul(pwszKLID, NULL, 16),
Flags); Flags, 0, 0, 0, 0);
} }

View file

@ -1217,10 +1217,14 @@ NtUserKillTimer
); );
HKL HKL
NTAPI STDCALL
NtUserLoadKeyboardLayoutEx( NtUserLoadKeyboardLayoutEx(
LCID LocaleId, IN DWORD dwKLID,
UINT Flags); IN UINT Flags,
IN DWORD Unused1,
IN DWORD Unused2,
IN DWORD Unused3,
IN DWORD Unused4);
BOOL BOOL
NTAPI NTAPI

View file

@ -12,7 +12,7 @@ typedef struct _KBL
HANDLE hModule; HANDLE hModule;
ULONG RefCount; ULONG RefCount;
HKL hkl; HKL hkl;
LCID lcid; DWORD klid; // Low word - language id. High word - device id.
} KBL, *PKBL; } KBL, *PKBL;
#define KBL_UNLOADED 0x20000000 #define KBL_UNLOADED 0x20000000

View file

@ -17,7 +17,6 @@
#include <debug.h> #include <debug.h>
PKBL KBLList = NULL; // Keyboard layout list. PKBL KBLList = NULL; // Keyboard layout list.
PKBL DefaultKL = NULL;
typedef PVOID (*KbdLayerDescriptor)(VOID); typedef PVOID (*KbdLayerDescriptor)(VOID);
NTSTATUS STDCALL LdrGetProcedureAddress(PVOID module, NTSTATUS STDCALL LdrGetProcedureAddress(PVOID module,
@ -193,13 +192,13 @@ static BOOL UserLoadKbdDll(WCHAR *wsKLID,
return TRUE; return TRUE;
} }
static PKBL UserLoadDllAndCreateKbl(LCID LocaleId) static PKBL UserLoadDllAndCreateKbl(DWORD LocaleId)
{ {
PKBL NewKbl; PKBL NewKbl;
ULONG hKl; ULONG hKl;
LANGID langid; LANGID langid;
NewKbl = ExAllocatePool(PagedPool, sizeof(NewKbl)); NewKbl = ExAllocatePool(PagedPool, sizeof(KBL));
if(!NewKbl) if(!NewKbl)
{ {
@ -229,7 +228,7 @@ static PKBL UserLoadDllAndCreateKbl(LCID LocaleId)
else hKl |= hKl << 16; else hKl |= hKl << 16;
NewKbl->hkl = (HKL) hKl; NewKbl->hkl = (HKL) hKl;
NewKbl->lcid = LocaleId; NewKbl->klid = LocaleId;
NewKbl->Flags = 0; NewKbl->Flags = 0;
NewKbl->RefCount = 0; NewKbl->RefCount = 0;
@ -238,7 +237,6 @@ static PKBL UserLoadDllAndCreateKbl(LCID LocaleId)
BOOL UserInitDefaultKeyboardLayout() BOOL UserInitDefaultKeyboardLayout()
{ {
LCID LocaleId; LCID LocaleId;
NTSTATUS Status; NTSTATUS Status;
@ -252,27 +250,60 @@ BOOL UserInitDefaultKeyboardLayout()
DPRINT("DefaultLocale = %08lx\n", LocaleId); DPRINT("DefaultLocale = %08lx\n", LocaleId);
} }
if(!NT_SUCCESS(Status) || !(DefaultKL = UserLoadDllAndCreateKbl(LocaleId))) if(!NT_SUCCESS(Status) || !(KBLList = UserLoadDllAndCreateKbl(LocaleId)))
{ {
DPRINT1("Trying to load US Keyboard Layout.\n"); DPRINT1("Trying to load US Keyboard Layout.\n");
LocaleId = 0x409; LocaleId = 0x409;
if(!(DefaultKL = UserLoadDllAndCreateKbl(LocaleId))) if(!(KBLList = UserLoadDllAndCreateKbl(LocaleId)))
{ {
DPRINT1("Failed to load any Keyboard Layout\n"); DPRINT1("Failed to load any Keyboard Layout\n");
return FALSE; return FALSE;
} }
} }
InitializeListHead(&DefaultKL->List); InitializeListHead(&KBLList->List);
KBLList = DefaultKL;
return TRUE; return TRUE;
} }
PKBL W32kGetDefaultKeyLayout(VOID) PKBL W32kGetDefaultKeyLayout(VOID)
{ {
return DefaultKL; LCID LocaleId;
NTSTATUS Status;
PKBL pKbl;
// This is probably wrong...
// I need to do more research.
Status = ZwQueryDefaultLocale(FALSE, &LocaleId);
if (!NT_SUCCESS(Status))
{
DPRINT1("Could not get default locale (%08lx).\n", Status);
DPRINT1("Assuming default locale = 0x409 (US).\n");
LocaleId = 0x409;
}
pKbl = KBLList;
do
{
if(pKbl->klid == LocaleId)
{
return pKbl;
}
pKbl = (PKBL) pKbl->List.Flink;
} while(pKbl != KBLList);
DPRINT("Loading new default keyboard layout.\n");
pKbl = UserLoadDllAndCreateKbl(LocaleId);
if(!pKbl)
{
DPRINT1("Failed to load %x!!! Returning any availableKL.\n", LocaleId);
return KBLList;
}
InsertTailList(&KBLList->List, &pKbl->List);
return pKbl;
} }
static PKBL UserHklToKbl(HKL hKl) static PKBL UserHklToKbl(HKL hKl)
@ -299,6 +330,8 @@ static PKBL UserActivateKbl(PW32THREAD Thread, PKBL pKbl)
return Prev; return Prev;
} }
/* EXPORTS *******************************************************************/
HKL FASTCALL HKL FASTCALL
UserGetKeyboardLayout( UserGetKeyboardLayout(
DWORD dwThreadId) DWORD dwThreadId)
@ -327,8 +360,6 @@ UserGetKeyboardLayout(
return Ret; return Ret;
} }
/* EXPORTS *******************************************************************/
UINT UINT
STDCALL STDCALL
NtUserGetKeyboardLayoutList( NtUserGetKeyboardLayoutList(
@ -408,8 +439,12 @@ NtUserGetKeyboardLayoutName(
HKL HKL
STDCALL STDCALL
NtUserLoadKeyboardLayoutEx( NtUserLoadKeyboardLayoutEx(
IN LCID LocaleId, IN DWORD dwKLID,
IN UINT Flags) IN UINT Flags,
IN DWORD Unused1,
IN DWORD Unused2,
IN DWORD Unused3,
IN DWORD Unused4)
{ {
HKL Ret = NULL; HKL Ret = NULL;
PKBL pKbl; PKBL pKbl;
@ -419,7 +454,7 @@ NtUserLoadKeyboardLayoutEx(
pKbl = KBLList; pKbl = KBLList;
do do
{ {
if(pKbl->lcid == LocaleId) if(pKbl->klid == dwKLID)
{ {
Ret = pKbl->hkl; Ret = pKbl->hkl;
goto the_end; goto the_end;
@ -428,7 +463,13 @@ NtUserLoadKeyboardLayoutEx(
pKbl = (PKBL) pKbl->List.Flink; pKbl = (PKBL) pKbl->List.Flink;
} while(pKbl != KBLList); } while(pKbl != KBLList);
pKbl = UserLoadDllAndCreateKbl(LocaleId); pKbl = UserLoadDllAndCreateKbl(dwKLID);
if(!pKbl)
{
goto the_end;
}
InsertTailList(&KBLList->List, &pKbl->List); InsertTailList(&KBLList->List, &pKbl->List);
Ret = pKbl->hkl; Ret = pKbl->hkl;

View file

@ -428,7 +428,7 @@ NtUserInternalGetWindowText 3
NtUserIsClipboardFormatAvailable 1 NtUserIsClipboardFormatAvailable 1
NtUserKillSystemTimer 2 NtUserKillSystemTimer 2
NtUserKillTimer 2 NtUserKillTimer 2
NtUserLoadKeyboardLayoutEx 2 NtUserLoadKeyboardLayoutEx 6
NtUserLockWindowStation 1 NtUserLockWindowStation 1
NtUserLockWindowUpdate 1 NtUserLockWindowUpdate 1
NtUserLockWorkStation 0 NtUserLockWorkStation 0