1

是否可以在不使用线程的情况下在 dll 函数中使用无限循环?

这是一些示例代码:

BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, (LPCSTR)hModule, &hModule);
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myfunction, 0, NULL, 0); //my current method
        myfunction(); //locks the program at runtime if i do it this way (just an example)
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

这是线程中的函数示例:

void myfunction() {
    //begin the infinite loop after 5 seconds
    Sleep(5000);
    for (;;) //set no condition for breaking the loop
    {
        Sleep(500); //this keeps the cpu from spiking
        //call my functions
        function1();
        function2();
        function3();
        function4();
    }
}

这段代码运行良好。我只是想知道是否有其他选择。例如:函数可以写入进程的内存吗?或稍后调用,而不是 DLL_PROCESS_ATTACH?

4

1 回答 1

1

首要问题

这是未定义的行为:

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myfunction, 0, NULL, 0);

您正在转换函数签名的事实myFunction可能会破坏堆栈。

更改 myFunction 的签名,如下所示:

DWORD __stdcall myfunction(void*) {

当您可以从 CreateThread 中删除可疑演员表时,您就知道自己做对了:

CreateThread(NULL, 0, myfunction, 0, NULL, 0);

第二期

首先,您不应该在 DLL_PROCESS_ATTACH 中做任何有意义的事情。根据 Raymond 的说法,您绝对不应该创建线程

于 2020-04-29T08:45:43.800 回答