之前的几篇文章已经讲解了在DllMain中创建并等待线程导致的死锁的原因。是否还记得,我们分析了半天汇编才知道在线程中的死锁位置。如果对于缺乏调试经验的同学来说,可能发现这个位置有点麻烦。那么本文就介绍几个例子,它们会在线程明显的位置死锁掉。(转载请指明出于breaksoftware的csdn博客)

DLL中的代码依旧简单。它获取叫EVENT的命名事件,然后等待这个事件被激活。激活的操作自然放在线程中。这次我们不用在DLL中创建线程,而是在Exe中创建。

    switch (ul_reason_for_call)   {case DLL_PROCESS_ATTACH: {printf("DLL DllGetModuleHandle:\tProcess attach (tid = %d)\n", tid);HANDLE hEvent = CreateEvent( NULL, FALSE, FALSE, L"EVENT" );if ( NULL != hEvent ) {WaitForSingleObject(hEvent, INFINITE);}}break;

1 线程中调用GetModuleFileName死锁

线程函数是

static DWORD WINAPI ThreadGetModuleFileName(LPVOID h) {HMODULE hDll = (HMODULE)h;WCHAR wszFileName[MAX_PATH] = {0};GetModuleFileName( hDll, wszFileName, MAX_PATH );HANDLE hEvent = CreateEvent( NULL, FALSE, FALSE, L"EVENT" );SetEvent( hEvent );return 0;
}

死锁后,DLL中的死锁位置和前几篇文章中一样,本文之后均不再说明。我们关注线程的堆栈,它是

我们看到GetModuleFileName在内部要调用LdrLockLoderLock,以进入PEB的LoaderLock临界区。可是该临界区被主线程占用着(在调用DllMain前进入临界区),主线程还要等待工作线程调用GetModuleFileName后激活事件才退出,于是就死锁了。

2 线程中调用GetModuleHandle死锁

线程函数是

static DWORD WINAPI ThreadGetModuleHandle(LPVOID) {Sleep(1000);GetModuleHandle( L"DllWithoutDisableThreadLibraryCalls_A.dll" );HANDLE hEvent = CreateEvent( NULL, FALSE, FALSE, L"EVENT" );SetEvent( hEvent );return 0;
}

内容我就不说明了,我们直接看线程堆栈。

我们看到GetModuleHandleW底层还是进入了加载器函数中。并在加载器函数中进入了LdrLockLoderLock,该函数内部要进入PEB的LoaderLock临界区。可是该临界区被主线程占用着(在调用DllMain前进入临界区),主线程还要等待工作线程调用GetModuleHandle后激活事件才退出,于是就死锁了。

3 线程中调用LoadLibrary死锁

线程函数

static DWORD WINAPI ThreadLoadLibrary(LPVOID) {Sleep(1000);LoadLibraryW( L"DllWithoutDisableThreadLibraryCalls_A.dll" );HANDLE hEvent = CreateEvent( NULL, FALSE, FALSE, L"EVENT" );SetEvent( hEvent );return 0;
}

死锁后线程堆栈

DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁相关推荐

  1. DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)

    之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因.本文将总结以前文章的结论,并介绍些DllMain中还有哪些操作会导致死锁等问题.(转载请指明出于breaksoftw ...

  2. DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系

    前几篇文章一直没有在源码级证明:DllMain在收到DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH时会进入临界区.这个论证非常重要,因为它是使其他线程不能进入临界区从而导致 ...

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

    本文介绍使用Windbg去验证<DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子>中的结论,调试对象是文中刚开始那个例子.(转载请指明出于breakso ...

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

    有了前面两节的基础,我们现在切入正题:研究下DllMain为什么会因为不当操作导致死锁的问题.首先我们看一段比较经典的"DllMain中死锁"代码.(转载请指明出于breaksof ...

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

    最近在网上看到一些关于在DllMain中不当操作导致死锁的问题,也没找到比较确切的解答,这极大吸引了我研究这个问题的兴趣.我花了一点时间研究了下,正好也趁机研究了下进程对DllMain的调用规律.因为 ...

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

    不知道大家是否思考过一个过程:系统试图运行我们写的程序,它是怎么知道程序起始位置的?很多同学想到,我们在编写程序时有个函数,类似Main这样的名字.是的!这就是系统给我们提供的控制程序最开始的地方(注 ...

  7. 中维报警邮件服务器,主打智能分析,中维世纪智能先锋系列产品来了!

    原标题:主打智能分析,中维世纪智能先锋系列产品来了! 中维世纪智能先锋系列产品主打"智能分析",包含JVS-C-BP1H2M-AG.JVS-C-BP1H2M-PG(支持POE).J ...

  8. (java)创建两个线程,在一个线程中打印输出1-100以内的偶数,在一个线程中输出1-100以内的奇数.

    两个线程测试: package com.ffyc.javaThread.dem1;public class Test {public static void main(String[] args) { ...

  9. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析)

    重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程").Qt GUI必须在这个线 ...

最新文章

  1. python使用pandas基于时间条件查询多个oracle数据表
  2. 技术人员突围就业寒冬的最优途径 | 拿不到AI核心岗位Offer全额退款
  3. maven 批量docker_Spring Boot 整合 docker
  4. oracle普通用户使用dbms函数,oracle使用DBMS_SCHEDULER调度作业
  5. UNIX中的Poll函数
  6. KUKA通信 CREAD问题
  7. oracle如何建pdb,Oracle 12c 命令行创建PDB
  8. 大数据之-Hadoop3.x_MapReduce_ReduceJoin案例Mapper---大数据之hadoop3.x工作笔记0130
  9. foobar2000隐藏桌面悬浮窗头像_多多情侣头像大全app-多多情侣头像大全软件v1.0.1...
  10. Office 2003 打开RMS权限保护文档时出错
  11. 【转载】C/C++预处理指令
  12. 翻译 | 上手 Webpack ? 这篇就够了!
  13. sql语句之case when的用法
  14. Oracle P6培训系列:10增加作业并估算工期
  15. 记一次学习爬取豆瓣数据于Excel表的爬虫
  16. H.264再学习 -- 详解 H.264 NALU语法结构
  17. 《Java语言程序设计与数据结构》编程练习答案(第三章)(三)
  18. 电脑重装系统后台式电脑网卡坏了怎么修复
  19. UOS其他分区及移动硬盘带锁问题处理
  20. 2022年MinGW-w64的安装及配置教程(傻瓜式)

热门文章

  1. cv2.threshholding()简单阈值、自适应阈值,Octus阈值
  2. Flume基础及Flume高质量博客合集
  3. 机器学习中的聚类算法(1):k-means算法
  4. HDU - 3183 A Magic Lamp 线段树
  5. excel:隔行选取复制功能
  6. 状态估计问题学习记录(1)
  7. 剑指offer:面试题37. 序列化二叉树
  8. 剑指offer:面试题21. 调整数组顺序使奇数位于偶数前面
  9. C++ - emplace_back 和 push_back 的区别
  10. OpenGL函数功能glutTimerFunc()