Защо тази CBT кука за широка система не работи правилно?

Опитвам се да създам кука за цялата система, за да наблюдавам процесите и да прекратявам нежеланите. Търсих и открих, че трябва да използвам CBT куки, първият ми опит се провали и това е вторият, първият въпрос може да бъде намерен тук обаче.

Следният код се изгражда добре, но изглежда, че куките дори не се извикват, тъй като се опитах да задам точка на прекъсване в DllMain(), но никога не стигам дотам. Други функции обаче изглеждат достъпни!

Ето кодовите фрагменти:

dllmain.cpp

// dllmain.cpp : Defines the entry point for the DLL application.
#pragma once
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;

 HINSTANCE currentProcessHandle;
 HOOKPROC hkprcSysMsg;
 HHOOK hookID;

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    std::ofstream outfile("test.txt");


    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        currentProcessHandle = hModule;
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam)
{
    std::ofstream outfile("test.txt");
    if (nCode >= 0)
    {
        switch (nCode)
        {
        case HCBT_CREATEWND:
            outfile << L"Created!~";
            cout << "Created!~" << endl;
            break;
        case HCBT_DESTROYWND:
            outfile << L"Destroied!~";
            cout << "Destroied!~" << endl;
            break;
        default:
            cout << "sth else" << endl;
            break;
        }
    }
    else
    {
        return CallNextHookEx(hookID, nCode, wparam, lparam);
    }
    outfile.close();
}

__declspec(dllexport) void InstallHook()
{
    hookID = SetWindowsHookEx(WH_CBT, HookProcedure, currentProcessHandle, 0);
}

__declspec(dllexport) void UnistallHook()
{
    UnhookWindowsHookEx(hookID);
}

И това е Потребителското приложение

// Hook Executer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "..\Dll\dllmain.cpp"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int num = -1;
    cout << "1.Install Hook"<<endl
        << "2.Unistall Hook"<<endl
        << "0.Exit";
    do{
        cin >> num;
        if (num ==1)
        {
            InstallHook();

        }
        else
        {
            UnistallHook();
        }
        getchar();
        system("cls");
        cout << "1.Install Hook" << endl
            << "2.Unistall Hook" << endl
            << "0.Exit";
    } while (num != 0 && num < 3);


    return 0;
}

Когато стартирам програмата, няма грешка, дори изключения от какъвто и да е вид, все едно няма DLL или не съм кодирал нищо вътре в този DLL. Какво не е наред с него?


person Rika    schedule 13.12.2013    source източник
comment
:-) include ..\Dll\dllmain.cpp НЕ е правилният начин да имате DLL. Имате ли Visual Studio Solution с 2 проекта, един EXE и един DLL?   -  person manuell    schedule 13.12.2013
comment
Да, аз! ако не направя това, как трябва да извикам dll?   -  person Rika    schedule 13.12.2013
comment
Но вашият EXE не извиква НИКОЙ DLL! Току-що включихте източника на DLL cpp във вашия основен EXE...   -  person manuell    schedule 13.12.2013
comment
Първа стъпка: потиснете линията include ..\Dll\dllmain.cpp! и го заменете с include ..\Dll\dllmain.h В заглавката декларирайте InstallHook и UnistallHook с __declspec(dllimport)   -  person manuell    schedule 13.12.2013
comment
Направих го и това е резултатът: pastebin.com/8Xg4uyiU Сега приложението ми не работи! Просто се срива при изпълнение и казва: Приложението не може да се стартира правилно (0xc0000007b). Щракнете върху OK, за да затворите приложението)   -  person Rika    schedule 13.12.2013
comment
Създадох отново решението и също премахнах dllexport, както е показано тук:pastebin.com/Z0vryTrZ все още нищо не работи! сякаш няма кука!!!(програмата работи добре, но не прави това, което трябва да прави)   -  person Rika    schedule 13.12.2013
comment
Виж, изглежда не знаеш основите на C програмирането с DLL, ще ти е много трудно да се опитваш да използваш CBT Hooks. Pastebin, който сте свързали, показва внедряване на DllMain в заглавката... Може да публикувам отговор I, ако имам малко време по-късно.   -  person manuell    schedule 13.12.2013
comment
благодаря, ще съм благодарен   -  person Rika    schedule 13.12.2013


Отговори (1)


внедрите своя DLL код в CPP файл, а не в заглавка:

//dllmain.cpp
#include "stdafx.h" // include <Windows.h>
                    // and other std headers in stdafx.h, if not already done

HINSTANCE currentProcessHandle;
HHOOK hookID;

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call,
                       LPVOID lpReserved ) {

    if ( ul_reason_for_call == DLL_PROCESS_ATTACH )
        currentProcessHandle = hModule;
    return TRUE;
}

LRESULT CALLBACK HookProcedure( int nCode, WPARAM wparam, LPARAM lparam ) {

    if ( nCode < 0 ) return CallNextHookEx( NULL, nCode, wparam, lparam );

    std::ofstream outfile;
    outfile.open( "test.txt",          // replace with an absolute path
                  std::fstream::app ); // append mode
    if (nCode >= 0) {
        switch( nCode ) {
            case HCBT_CREATEWND:
                outfile << "Created!\n";
                break;
            case HCBT_DESTROYWND:
                outfile << "Destroyed!\n";
                break;
            default:
                break;
        }
    }
    outfile.close();
    return 0;
}

void InstallHook( void ) {
    hookID = SetWindowsHookEx( WH_CBT, HookProcedure, currentProcessHandle, 0 );
}

void UninstallHook( void ) { // NEW NAME
    UnhookWindowsHookEx( hookID );
}    

Декларирайте DLL API в заглавен файл.

// dllapi.h
void InstallHook( void );
void UninstallHook( void ); // NEW NAME

Използвайте DEF файл за експортиране, добавете го към DLL проекта

; Def file
EXPORTS
    InstallHook
    UninstallHook

В проекта EXE включете САМО заглавния файл на DLL

 #include "..\Dll\dllapi.h"

В проекта EXE отидете на properties->Linker->Input->Additional dependencies и добавете lib файла, генериран по време на изграждането на DLL. Алтернатива: направете DLL зависимост от EXE в зависимостите на проекта на решението и в свойствата на EXE задайте Да за Linker->general->Use Library dependency Inputs

person manuell    schedule 13.12.2013
comment
Много благодаря, той компилира и изгражда добре и сега създава текстовия файл, но той е празен! и нищо не се показва на конзолата (може би dll не поддържа конзолни прозорци?) какво друго трябва да направя, за да накарам това да работи? - person Rika; 13.12.2013
comment
Промених го, така че да добавя това, което намери, и сега това е, което получавам в текстовия файл :) 5A4F1B9C 5A4F1B9C 5A4F1BB4 5A4F1BB4 5A4F1BB4 5A4F1B9C 5A4F1B9C 5A4F1B9C 5A4F1B9C Много ви благодаря, сър, ще ровя повече, за да видя какво причинява това. Разбрах, премахнах L и работи добре :) страхотно :) - person Rika; 13.12.2013
comment
Използвахте ли абсолютен път за текстовия файл, като c:\\temp\\test.txt? - person manuell; 13.12.2013
comment
Да, направих точно това, което предложихте и сега работи като Mercedes benz :) - person Rika; 13.12.2013
comment
използвайте wofstream, а не ofstream, когато пишете Lstring. Или не поставяйте префикс с L :-) - person manuell; 13.12.2013