Изменение информации о GPU с помощью MS Detours 3.0

Я пытаюсь подключить функции WMI с помощью Microsoft Detours 3.0 и изменить информацию о графическом процессоре. Но у меня проблемы...

Обычно информация о графическом процессоре возвращается следующим способом:

IWbemServices* services = NULL;
...
IEnumWbemClassObject* instanceEnum = NULL;
services->CreateInstanceEnum(
                            _bstr_t("Win32_VideoController"),
                            WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
                            NULL, 
                            &instanceEnum);

Где вся информация о GPU помещается в сущность IEnumWbemClassObject через указатель &instanceEnum.

Так что мне нужно это зацепить. Я попытался сделать это следующим образом:

Попытка получить указатель на исходную функцию-класс:

typedef HRESULT(WINAPI IWbemServices::*tm_CreateInstanceEnum)(
                                                           const BSTR strClass, 
                                                           LONG lFlags, 
                                                           IWbemContext *pCtx, 
                                                           IEnumWbemClassObject **ppEnum);
tm_CreateInstanceEnum True_CreateInstanceEnum = &IWbemServices::CreateInstanceEnum;

Моя функция:

__declspec(dllexport) HRESULT WINAPI Hooked_CreateInstanceEnum(const BSTR strClass, LONG lFlags, IWbemContext *pCtx, IEnumWbemClassObject **ppEnum)
{
       MessageBox(0, L" Hooked!!!", L"Oh yeah, you did it !", MB_OK);
       //return True_CreateInstanceEnum(strClass, lFlags, pCtx, ppEnum); // this is wrong and I don't know why...
       return 0;
}

Вводить:

BOOL APIENTRY DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
            DetourRestoreAfterWith();
            DetourTransactionBegin();
            DetourAttach((PVOID*)&True_CreateInstanceEnum, Hooked_CreateInstanceEnum);
        DetourTransactionCommit();
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourDetach((PVOID*)&True_CreateInstanceEnum, Hooked_CreateInstanceEnum);
            DetourTransactionCommit();
    }
{

Это ничего не зацепило... Что я делаю не так? Может быть есть другие решения?

0 ответов

Другие вопросы по тегам