首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从DllMain调用IDirect3D9 :: CreateDevice()挂起

从DllMain调用IDirect3D9::CreateDevice()挂起的问题,通常是由于在DLL的加载过程中执行了一些不允许的操作,如创建设备。DLL的加载过程是在加载DLL时执行的,而CreateDevice()方法通常需要与图形适配器进行交互,这可能会导致冲突。

为了解决这个问题,可以考虑以下几种方法:

  1. 延迟创建设备:在DllMain函数中,不要直接调用CreateDevice()方法,而是使用一个标志来表示需要创建设备。然后,在真正需要创建设备的时候再调用CreateDevice()方法。
  2. 使用延迟加载:可以使用延迟加载的方式来加载DLL,这样可以确保在调用CreateDevice()方法之前,DLL已经被正确加载。
  3. 避免在DllMain中执行可能会导致冲突的操作:在DllMain函数中,应该避免执行可能会导致冲突的操作,如创建设备。可以将这些操作移到DLL的初始化函数中,并在需要时调用该函数。

推荐的腾讯云相关产品:

  • 腾讯云云服务器:提供高性能、高可用的云服务器,支持Windows和Linux操作系统,可以满足不同应用场景的需求。
  • 腾讯云对象存储:提供可靠、安全、低成本的云存储服务,支持海量数据的存储和管理,可以用于存储图像、视频等多媒体文件。
  • 腾讯云内容分发网络:通过全球节点的分布,实现数据的快速分发,提高网站的访问速度和稳定性,适用于音视频、直播、游戏等应用场景。
  • 腾讯云人工智能:提供智能语音识别、智能图像识别、自然语言处理等人工智能服务,可以应用于智能客服、智能监控等场景。

产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁

    这样就是同步操作了,如此操作不如将线程函数内容放在DllMain中直接执行,何必再去启动一个线程呢?...DllMain中SetEvent之后,工作线程挂起状态复活,并执行完了return 0。那么另一个死锁因素是出现在线程退出的逻辑中。我们查看堆栈 ?        ...我们看到是在ExitThread中调用了LdrShutDownThread。我用IDA看了下LdrShutDownThread函数,并和网传的win2K源码做了比较。...RtlLeaveCriticalSection(&LoaderLock); } }         我们看第23行,发现该函数一开始便进入了临界区,也就是说不管该线程是否需要对某DLL调用...因为主线程正在调用DllMain,所以它先进入了临界区,并一直占用了它。而工作线程退出前也要进入这个临界区做点事,所以它一直进不去,并被系统挂起

    84330

    Windows注入与拦截(1) — DLL注入的基本原理「建议收藏」

    理论上任何DLL都可以被注入到其他进程之中,但是大多数情况下,我们注入到其他进程之中是为了实现某些功能、做某些事情的,所以我们需要在我们的DLL被注入之后,DLL中的功能代码能够被调用执行。...我们知道DLL被首次载入到进程中时,会收到DLL_PROCESS_ATTACH的通知,即调用DllMain函数,并且参数fdwReason的值被设为DLL_PROCESS_ATTACH。...下面是一个最简单的dll的源码,在被注入成功后(即收到DLL_PROCESS_ATTACH通知时)弹出消息提示框: BOOL APIENTRY DllMain(HMODULE hModule, DWORD...: { break; } } return TRUE; } 但是,如果DLL_PROCESS_ATTACH通知处理过程中的操作被挂起...case DLL_PROCESS_DETACH: { break; } } return TRUE; } 另外,当DLL被目标进程卸载时

    1.5K20

    IRP的同步

    在派遣函数中可以调用IoCompleteRequest函数来结束IRP的处理或者调用IoMarkIrpPending来暂时挂起IRP,将IRP进行异步处理。...UNREFERENCED_PARAMETER(RegistryPath); DriverObject->DriverUnload = DriverUnload; status = CreateDevice...IoMarkIrpPending,将IRP挂起。...一般的IRP_MJ_CLOSE用来关闭内核创建的内核对象,对应用层来说也就是句柄,而IRP_MJ_CLEANUP用来处理被挂起的IRP,所以在这我们需要对CLEANUP的IRP进行处理,在处理它时,我们链表中依次取出...这个API传入的是设备的句柄,当调用它时所有针对该设备的被挂起的IRP都会调用对应的取消例程,在这就不需要像上面那样保存被挂起的IRP,每当有READ请求过来时都会调用case里面的内容,将该IRP和取消例程绑定

    62140

    DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2

    本文介绍使用Windbg去验证《DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子》中的结论,调试对象是文中刚开始那个例子。...26 kb 工作线程(1)要进入临界区,可是它不会进去的,因为它会被挂起 ?         27 g 死锁了 ?        ...31 kb 查看主线程调用堆栈,确实是在等工作线程结束 ?         32 ~1s 切换到工作线程,发现它也在内核态中出不来了 ?        ...33 kb 查看工作线程调用堆栈 ?        ...34 dt _RTL_CRITICAL_SECTION 0x7c99e174  查看临界区所有权,线程TID中我们可以看到,临界区的确是被主线程占着。 ?

    72830

    DllMain中不当操作导致死锁问题的分析--死锁介绍

    我花了一点时间研究了下,正好也趁机研究了下进程对DllMain调用规律。因为整个研究篇幅比较长,我觉得还是分开写比较能突出重点。本文先说说死锁。...然后绳的另一头放在学生的手中,告知他们要迅速将自己手中绳子捆住的粉笔瓶子中拽出来。中国学生经过讨论后,决定出他们的方案。于是123之后,“聪明谦让”的中国学生“一个个”并迅速的将各自的粉笔拽了出来。...系统看不得它们不工作而傻等,于是就把它们都挂起了。它们就死锁了。...这个时候,当A线程FunA1()中退出后,试图进入临界区g_csB时是进入不了的,因为此时B线程还在运行FunB1(),B还在g_csB临界区中,于是A线程等待B退出临界区g_csB。...请大家记住这两个例子,我们会在之后分析的DllMain中不当操作导致死锁的案例中再次看到它们的身影。

    87720

    DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析

    该过程导致DllMain中输出的信息包括那些线程TID的记录,则说明存在影响(其他线程调用DllMain),否则说明不存在影响(其他线程不调用DllMain)。        ...7 8 9 验证对不同DLL的DllMain调用情况可能存在不同的线程,在退出时,是否会调用DllMain,以及它们对DllMain调用规律。        ...并得出以下结论         七 DLL进程空间中卸载出去前,会被卸载其的线程调用DllMain,且调用原因是DLL_PROCESS_DETACH。        ...以上我们可以看出Terminate(101、103)类型函数比Exit(102、104)类型函数暴力。        ...可以见得,在一个线程中对DLL产生了DllMain调用后,就不会因为Loadlibrary再发生DllMain调用

    1.2K20

    白加黑免杀制作(详细)

    本文就会 dll 开发基础讲起,如何开发和调试 dll,到如何在 dll 中上线木马,dllmain 中上线与 exe 上线的不同,如何在 dll 导出函数中执行上线,以及可能遇见的问题如何解决等。...入口函数(DllMainDllMain是动态链接库的可选入口点。当系统启动或终止进程或线程时,它会使用进程的第一个线程为每个加载的 dll 调用入口点函数。...(3)DLL_PROCESS_DETACH 当 dll 被进程的地址空间解除映射时调用。...以下情况 dll 会被进程的地址空间中解除映射: 调用 FreeLibrary 进程结束 传入 DLL_PROCESS_ATTACH 的 DllMain 返回 FALSE 如果调用了 TerminateProcess...(3)DllMain 是否会执行 静态调用及动态调用时使用 LoadLibrary 函数时 DllMain 如果存在的话默认会被执行,如果动态调用使用的是 LoadLibraryEx 函数加载 dll,

    5.9K71

    DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子

    这样逻辑和效率上看,都不会因为我们的工作线程写的有问题而导致死锁。然后我们在DllMain中等待这个线程结束才返回。         粗略看这个问题,我们很难看出这个逻辑会导致死锁。...我们关注一下14~17这段对WaitForSingleObject的调用逻辑。...《windows核心编程》中有关于DllMain序列化执行的讲解,大致意思是:线程在调用DllMain之前,要先获取锁,等DllMain执行完再解开这个锁。这样不同线程加载DLL就可以实现序列化操作。...结合《DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析》中介绍的规律 二 线程创建后会调用已经加载了的DLL的DllMain,且调用原因是DLL_THREAD_ATTACH...DllMain时进入了临界区,而工作线程也要进入临界区去执行DllMain

    1.5K20
    领券