Fehler in einem Hook
-
Hallo,
Ich will ein Programm schreiben, welches einen Hook für ein anderes Programm installiert und alle WM_CHAR Nachrichten verändert. Es soll eine Datei in einen globalen char Array geladen und mit einer index Variable durchlaufen werden. In der Hook-Funktion soll danach üperpfüft werden, ob die WM_CHAR Nachricht dem aktuellen char des Array entspicht, falls dies nicht der Fall ist soll der Hook die WM_CHAR nachrichten entsprechend verändern. Die Hookfunktion kann jedoch nicht auf den char Array zuegreifen (das Programm lässt sich zwar fehlerfrei Compilern&Linken, der Array hat in der Hook-Funktion jedoch immer den Wert Null). Wiso ist dies so? Hier der Quellcode der Dll und der exe-Datei:
/*Die Dll enthätlt 3 Funktionen, die eine Lädt eine Datei in einen globalen char Array, die andere installiert den Hook und die dritte ist die HookFunktion*/ #include <windows.h> char Schreibvorlage[1024]; HHOOK hook; HINSTANCE hDllInstance; int zaehler=0; __declspec (dllexport) LRESULT CALLBACK Filtern(int,WPARAM,LPARAM); __declspec (dllexport) LRESULT CALLBACK dateiladen(void); __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void); int APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { hDllInstance=hInstance; return TRUE; } __declspec (dllexport) LRESULT CALLBACK Filtern(int nCode, WPARAM wParam, LPARAM lParam) { /* Die Hook-Funktion kann seltsamerweise nicht auf den Array Schreibvorlage zugrefien, er Array hat den Wert NULL) MSG *Nachricht; char v; if(nCode<0) CallNextHookEx(hook,nCode,wParam,lParam); switch(nCode) { case HC_ACTION: Nachricht=(MSG*) lParam; if(Nachricht->message==WM_CHAR) { v=Nachricht->wParam; if(v!=Schreibvorlage[zaehler]) { Nachricht->wParam=Schreibvorlage[zaehler]); lParam=(LPARAM)Nachricht; zaehler++; CallNextHookEx(hook,nCode,wParam,lParam); return 0; } zaehler++; return 0; } default: break; } return 0; } __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void) { PROCESS_INFORMATION pi; STARTUPINFO su; GetStartupInfo(&su); CreateProcess("C:\\Programme\\Tastaturschreiben\\Tastatur.exe",NULL,0,0,0,0,NULL,NULL,&su,&pi); WaitForInputIdle(pi.hProcess,3000); hook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Filtern,hDllInstance,pi.dwThreadId); return 0; } __declspec (dllexport) LRESULT CALLBACK dateiladen(void) { static OPENFILENAME ofn; HANDLE hFile; int dateigroesse; DWORD gelesenebytes; static char Dateiname[256], Pfad[256]; const char szFilter[] = "Schreibvorlage(*.TXT)\0*.txt\0\0"; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = FindWindow(NULL,"Gosch"); ofn.hInstance=NULL; ofn.lpstrFilter=szFilter; ofn.lpstrCustomFilter=NULL; ofn.nMaxCustFilter=0; ofn.nFilterIndex=0, ofn.lpstrFile=Pfad; ofn.nMaxFile=MAX_PATH; ofn.lpstrFileTitle=NULL; ofn.nMaxFileTitle=MAX_PATH; ofn.lpstrInitialDir=NULL; ofn.lpstrTitle=Dateiname; ofn.Flags=OFN_HIDEREADONLY | OFN_CREATEPROMPT; ofn.nFileOffset=0; ofn.nFileExtension=0; ofn.lpstrDefExt="txt"; ofn.lCustData = 0L; ofn.lpfnHook = NULL; ofn.lpTemplateName =NULL; GetOpenFileName(&ofn); hFile=CreateFile(Pfad,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); dateigroesse=GetFileSize(hFile,NULL); ReadFile(hFile,Schreibvorlage,dateigroesse,&gelesenebytes,NULL); CloseHandle(hFile); return 0; }/* Die Exe ruft die beiden Funktionen dateiladen() und Hooksetzen auf*/ #include <windows.h> __declspec (dllexport) LRESULT CALLBACK Filtern(int,WPARAM,LPARAM); __declspec (dllexport) LRESULT CALLBACK dateiladen(void); __declspec (dllexport) LRESULT CALLBACK Hooksetzen(void); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass; static char szAppName[] = "Gosch"; wndclass.style = NULL; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); hwnd = CreateWindow(szAppName,szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HANDLE hFilterdll; switch (message) { case WM_CREATE: dateiladen(); Hooksetzen(); break; case WM_QUIT: break; } return DefWindowProc (hwnd, message, wParam, lParam); }Ich hoffe ich konnte mein Problem möglichst genau schildern und danke im Voraus für alle Antworten.
-
Gosch schrieb:
Ich hoffe ich konnte mein Problem möglichst genau schildern und danke im Voraus für alle Antworten.
Wer so viel Source-Code postet, kann das Problem ja nicht wirklich eingekreist zu haben, oder? Somit hast Du es auch auch nicht genau beschrieben...
Für Hooks allgemein siehe:
http://www.codeproject.com/system/hooksys.asp