Изменение информации о 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();
}
{
Это ничего не зацепило... Что я делаю не так? Может быть есть другие решения?