Я не очень хорош на C++, больше из C# и PHP-парня. Мне был назначен проект, который требует, чтобы я использовал GetTickCount
и подключился к приложению. Мне нужна помощь, потому что по какой-то причине она не работает так, как планировалось ... Вот код для подключения, я знаю, что это работает, потому что я использовал его в проектах раньше. Единственное, о чем я не уверен, это часть его GetTickCount
. Я пробовал GetTickCount64
, думая, что это было исправление моей проблемы (это не привело к сбою в том, что я вводил в нее), но выяснил, что вместо этого он просто не работал, поэтому он не разбил его.Захват GetTickCount с C++
bool APIENTRY DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hDll);
CreateThread(0,0, (LPTHREAD_START_ROUTINE)KeyHooks, 0, 0, 0);
GetTickCount_orig = (DWORD (__stdcall *)(void))DetourFunction((PBYTE)GetProcAddress(GetModuleHandle("kernel32.dll"), "GetTickCount"), (PBYTE)GetTickCount_hooked);
case DLL_PROCESS_DETACH:
DetourRemove((PBYTE)GetProcAddress(GetModuleHandle("kernel32.dll"), "GetTickCount"), (PBYTE)GetTickCount_hooked);
break;
}
return true;
}
Вот остальная часть кода, который используется для GetTickCount
DWORD oldtick=0;
DWORD (WINAPI *GetTickCount_orig)(void);
DWORD WINAPI GetTickCount_hooked(void)
{
if(oldtick==0)
{
oldtick=(*GetTickCount_orig)();
return oldtick;
}
DWORD factor;
DWORD ret;
ret = (*GetTickCount_orig)();
factor = 3.0;
DWORD newret;
newret = ret+((oldtick-ret)*(factor-1));
oldtick=ret;
return newret;
}
Вы можете увидеть что-то неправильно или что следует изменить? Любая помощь приветствуется. Спасибо!
В чем проблема? – wj32
Сбой при попытке его ввода. Мой QueryPerformanceCounter легко вводит без проблем. – E3pO
Как насчет ввода 'break;' перед 'case DLL_PROCESS_DETACH'? Потому что, как написано сейчас, вы сразу же удаляете свой крючок после инициализации – valdo