*/
#include <win32k.h>
+
+#include <winnls.h>
+
DBG_DEFAULT_CHANNEL(UserKbdLayout);
PKL gspklBaseLayout = NULL;
L"Control\\Keyboard Layouts\\";
/* Create keyboard layout file object */
- pkf = UserCreateObject(gHandleTable, NULL, NULL, otKBDfile, sizeof(KBDFILE));
+ pkf = UserCreateObject(gHandleTable, NULL, NULL, NULL, TYPE_KBDFILE, sizeof(KBDFILE));
if (!pkf)
{
ERR("Failed to create object!\n");
{
/* We have failed - destroy created object */
if (pkf)
- UserDeleteObject(pkf->head.h, otKBDfile);
+ UserDeleteObject(pkf->head.h, TYPE_KBDFILE);
}
return pRet;
static PKL
UserLoadKbdLayout(PUNICODE_STRING pwszKLID, HKL hKL)
{
+ LCID lCid;
+ CHARSETINFO cs;
PKL pKl;
/* Create keyboard layout object */
- pKl = UserCreateObject(gHandleTable, NULL, NULL, otKBDlayout, sizeof(KL));
+ pKl = UserCreateObject(gHandleTable, NULL, NULL, NULL, TYPE_KBDLAYOUT, sizeof(KL));
if (!pKl)
{
ERR("Failed to create object!\n");
if (!pKl->spkf)
{
ERR("UserLoadKbdFile(%wZ) failed!\n", pwszKLID);
- UserDeleteObject(pKl->head.h, otKBDlayout);
+ UserDeleteObject(pKl->head.h, TYPE_KBDLAYOUT);
return NULL;
}
+ // Up to Language Identifiers..
+ RtlUnicodeStringToInteger(pwszKLID, (ULONG)16, (PULONG)&lCid);
+ TRACE("Language Identifiers %wZ LCID 0x%x\n", pwszKLID, lCid);
+ if (co_IntGetCharsetInfo(lCid, &cs))
+ {
+ pKl->iBaseCharset = cs.ciCharset;
+ pKl->dwFontSigs = cs.fs.fsCsb[0];
+ pKl->CodePage = (USHORT)cs.ciACP;
+ TRACE("Charset %u Font Sig %lu CodePage %u\n", pKl->iBaseCharset, pKl->dwFontSigs, pKl->CodePage);
+ }
+ else
+ {
+ pKl->iBaseCharset = ANSI_CHARSET;
+ pKl->dwFontSigs = FS_LATIN1;
+ pKl->CodePage = CP_ACP;
+ }
+
return pKl;
}
*/
static
VOID
-UnloadKbdFile(PKBDFILE pkf)
+UnloadKbdFile(_In_ PKBDFILE pkf)
{
PKBDFILE *ppkfLink = &gpkfList;
+ NT_ASSERT(pkf != NULL);
/* Find previous object */
while (*ppkfLink)
*ppkfLink = pkf->pkfNext;
EngUnloadImage(pkf->hBase);
- UserDeleteObject(pkf->head.h, otKBDfile);
+ UserDeleteObject(pkf->head.h, TYPE_KBDFILE);
}
/*
pKl->pklPrev->pklNext = pKl->pklNext;
pKl->pklNext->pklPrev = pKl->pklPrev;
UnloadKbdFile(pKl->spkf);
- UserDeleteObject(pKl->head.h, otKBDlayout);
+ UserDeleteObject(pKl->head.h, TYPE_KBDLAYOUT);
return TRUE;
}
UserEnterShared();
if (!gspklBaseLayout)
+ {
+ UserLeave();
return 0;
+ }
pKl = gspklBaseLayout;
if (nBuff == 0)
/* Send shell message */
if (!(Flags & KLF_NOTELLSHELL))
- co_IntShellHookNotify(HSHELL_LANGUAGE, (LPARAM)hkl);
+ co_IntShellHookNotify(HSHELL_LANGUAGE, 0, (LPARAM)hkl);
/* Return hkl on success */
hklRet = (HKL)hkl;
if (!pKl)
{
- ERR("Invalid HKL %x!\n", hKl);
+ ERR("Invalid HKL %p!\n", hKl);
goto cleanup;
}
/* Send shell message */
if (!(Flags & KLF_NOTELLSHELL))
- co_IntShellHookNotify(HSHELL_LANGUAGE, (LPARAM)hkl);
+ co_IntShellHookNotify(HSHELL_LANGUAGE, 0, (LPARAM)hkl);
}
cleanup:
if (pKl)
bRet = UserUnloadKbl(pKl);
else
- ERR("Invalid HKL %x!\n", hKl);
+ ERR("Invalid HKL %p!\n", hKl);
UserLeave();
return bRet;