Hello,
I'm writing a function which load a keyboardlayout using the registry. The whole programm works fine under a 32-Bit windows but it crash on a 64-Bit windows.
#define TYPEDEF_VK_TO_WCHARS(n) typedef struct _VK_TO_WCHARS##n { \
BYTE VirtualKey; \
BYTE Attributes; \
WCHAR wch[n]; \
} VK_TO_WCHARS##n, *KBD_LONG_POINTER PVK_TO_WCHARS##n;
TYPEDEF_VK_TO_WCHARS(1)
TYPEDEF_VK_TO_WCHARS(2)
TYPEDEF_VK_TO_WCHARS(3)
TYPEDEF_VK_TO_WCHARS(4)
TYPEDEF_VK_TO_WCHARS(5)
TYPEDEF_VK_TO_WCHARS(6)
TYPEDEF_VK_TO_WCHARS(7)
TYPEDEF_VK_TO_WCHARS(8)
TYPEDEF_VK_TO_WCHARS(9)
TYPEDEF_VK_TO_WCHARS(10)
typedef struct _VK_TO_WCHAR_TABLE {
PVK_TO_WCHARS1 pVkToWchars;
BYTE nModifications;
BYTE cbSize;
} VK_TO_WCHAR_TABLE, *KBD_LONG_POINTER PVK_TO_WCHAR_TABLE;
#define INIT_PVK_TO_WCHARS(i, n) \
if((pKbd->pVkToWcharTable[i].cbSize - 2) / 2 == n) \
pVkToWchars##n = (PVK_TO_WCHARS##n)pKbd->pVkToWcharTable[i].pVkToWchars; \
HINSTANCE loadKeyboardLayout() {
PKBDTABLES pKbd;
HINSTANCE kbdLibrary;
KbdLayerDescriptor pKbdLayerDescriptor = NULL;
char layoutFile[MAX_PATH];
if (getKeyboardLayoutFile(layoutFile, sizeof(layoutFile)) == -1) return NULL;
char systemDirectory[MAX_PATH];
GetSystemDirectory(systemDirectory, MAX_PATH);
char kbdLayoutFilePath[MAX_PATH];
snprintf(kbdLayoutFilePath, MAX_PATH, "%s\\%s", systemDirectory, layoutFile);
kbdLibrary = LoadLibrary(kbdLayoutFilePath);
pKbdLayerDescriptor
= (KbdLayerDescriptor) GetProcAddress(kbdLibrary, "KbdLayerDescriptor");
if (pKbdLayerDescriptor != NULL) pKbd = pKbdLayerDescriptor();
else return NULL;
int i = 0;
do {
INIT_PVK_TO_WCHARS(i, 1)
INIT_PVK_TO_WCHARS(i, 2)
INIT_PVK_TO_WCHARS(i, 3)
INIT_PVK_TO_WCHARS(i, 4)
INIT_PVK_TO_WCHARS(i, 5)
INIT_PVK_TO_WCHARS(i, 6)
INIT_PVK_TO_WCHARS(i, 7)
INIT_PVK_TO_WCHARS(i, 8)
INIT_PVK_TO_WCHARS(i, 9)
INIT_PVK_TO_WCHARS(i, 10)
i++;
} while (pKbd->pVkToWcharTable[i].cbSize != 0);
return kbdLibrary;
}
int getKeyboardLayoutFile(char* layoutFile, DWORD bufferSize) {
HKEY hKey;
DWORD varType = REG_SZ;
char kbdName[KL_NAMELENGTH];
GetKeyboardLayoutName(kbdName);
char kbdKeyPath[51 + KL_NAMELENGTH];
snprintf(kbdKeyPath, 51 + KL_NAMELENGTH,
"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s", kbdName);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR) kbdKeyPath, 0,
KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) return -1;
if (RegQueryValueEx(hKey, "Layout File", NULL, &varType, (LPBYTE) layoutFile,
&bufferSize) != ERROR_SUCCESS) return -1;
RegCloseKey(hKey);
return 1;
}
I hope anyone can help me. :)
Regards cookieexploit