【问题标题】:c++ dll infinite loop without using a threadc++ dll无限循环不使用线程
【发布时间】:2020-08-13 06:56:05
【问题描述】:

是否可以在不使用线程的情况下在 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?

【问题讨论】:

  • 这能回答你的问题吗? How to start a thread in DLLMain?
  • 如果您从远程进程注入此 DLL,请考虑使用 CreateRemoteThread 来绕过此限制。如果进程自愿加载你的 DLL,让它在你的 DLL 中调用某种init 函数。
  • 自愿。我会研究你的建议。

标签: c++ multithreading for-loop dll dllmain


【解决方案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 中做任何有意义的事情。根据雷蒙德的说法,you definitely shouldn't be creating a thread

【讨论】:

  • 如果你真的仔细阅读了Raymond所说的内容,以及read the documentation,只要你不在新线程上同步,在DllMain中调用CreateThread是可以的。 不推荐创建线程,但也不禁止。只是启动线程并继续前进就可以了。
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多