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


Anmelden zum Antworten