Код (Text): #include <windows.h> HHOOK hHook; HINSTANCE hInstance; LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) { if(code == HC_ACTION ) { MessageBox(0, "exit", "exit", 0); } return CallNextHookEx( hHook, code, wParam, lParam ); } BOOL CALLBACK DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) { hInstance = hModule; return 1; } void SetHook() { hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, 0); } Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data hInstance dd 0 msgExit db "Exit",0 .data? hHook dd ? hWnd dd ? .code DllMain proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD push hInst pop hInstance mov eax, 1 ret DllMain Endp KeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD .if nCode == HC_ACTION invoke MessageBox, 0, msgExit, msgExit, 0 .endif invoke CallNextHookEx, hHook, nCode, wParam, lParam ret KeyboardProc endp SetHook proc invoke SetWindowsHookEx, WH_KEYBOARD, addr KeyboardProc, hInstance, 0 mov hHook, eax ret SetHook endp End DllMain Проверять этим: Код (Text): #include <windows.h> int main() { MSG msg; HMODULE hmod = LoadLibrary("dll.dll"); FARPROC SetHook = GetProcAddress(hmod, "SetHook"); SetHook(); while(!GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } Компилю сишниковую так: cl /c dll.c /Fodll.obj link /NOLOGO /DLL dll.obj kernel32.lib user32.lib /EXPORT:KeyboardProc /EXPORT:SetHook Асмовую так: c:\masm32\bin\ml.exe /nologo /c /coff "dll.asm" c:\masm32\bin\link.exe /NOLOGO /DLL dll.obj kernel32.lib user32.lib /EXPORT:KeyboardProc /EXPORT:SetHook
invoke MessageBox, 0, addr msgExit, addr msgExit, 0 /DMASM - непонятно, какое отношение он имеет к этому сорцу.