线程创建

#include <ntifs.h>KEVENT g_kEvent;VOID DriverUnload(PDRIVER_OBJECT pDriver);VOID ThreadProc(PVOID StartContext)
{ULONG uId = (ULONG)PsGetCurrentThreadId();KdPrint(("%wZ,%d\n", StartContext, uId));//执行即将结束,将事件置为激发态。KeSetEvent(&g_kEvent, 0, TRUE);//使用内核线程的时候,需要注意一点,当线程执行完毕的时候,必须主动调用下面//这个函数PsTerminateSystemThread(STATUS_SUCCESS);
}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pPath)
{UNREFERENCED_PARAMETER(pPath);DbgBreakPoint();HANDLE hThread = 0;CLIENT_ID Id = {0};UNICODE_STRING szString;RtlInitUnicodeString(&szString, L"Hello allen");//1 创建一个系统线程,能够执行简单代码,并且验证和主线程不是同一个线程ULONG uId = (ULONG)PsGetCurrentThreadId();KdPrint(("%wZ,Id:%d\n", &szString,uId));// 初始化事件对象KeInitializeEvent(&g_kEvent, SynchronizationEvent, FALSE);PsCreateSystemThread(&hThread,0,NULL,NULL,//这里填写NULL,说明创建的是内核线程&Id,ThreadProc,//回调函数&szString);KeWaitForSingleObject(&g_kEvent,Executive,KernelMode,FALSE,0         //再内核层的等待函数,0是永久等待);pDriver->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}VOID DriverUnload(PDRIVER_OBJECT pDriver)
{UNREFERENCED_PARAMETER(pDriver);}

遍历线程

#include <ntifs.h>
// 根据TID返回线程ETHREAD,失败返回NULL
PETHREAD LookupThread(HANDLE hTid)
{PETHREAD pEThread = NULL;if (NT_SUCCESS(PsLookupThreadByThreadId(hTid,&pEThread)))return pEThread;return NULL;
}
VOID EnumThread(PEPROCESS pEProcess  //要枚举的是哪一个进程的线程
)
{PEPROCESS pEProc = NULL;PETHREAD  pEThrd = NULL;// 循环遍历线程(假设线程的最大值不超过0x25600)ULONG i = 0;for (i = 4; i < 0x25600; i += 4) {// a. 根据TID返回ETHREADpEThrd = LookupThread((HANDLE)i);if (!pEThrd)  continue;// b. 获得线程所属进程,如果相等则打印线程信息pEProc = IoThreadToProcess(pEThrd);if (pEProc == pEProcess) {DbgPrint("[THREAD]ETHREAD=%p TID=%ld\n",pEThrd, (ULONG)PsGetThreadId(pEThrd));}// c. 将线程对象引用计数减1ObDereferenceObject(pEThrd);}
}

结束线程等

#include <ntifs.h>
NTSTATUS ZwOpenThread(_Out_  PHANDLE ThreadHandle,_In_   ACCESS_MASK DesiredAccess,_In_   POBJECT_ATTRIBUTES ObjectAttributes,_In_   PCLIENT_ID ClientId);
typedef NTSTATUS(__fastcall *ZWTERMINATETHREAD)(HANDLE hThread,ULONG uExitCode);
//结束线程,暂停线程,恢复线程,这些函数没有导出,
//就得自己去找   可以先找到它 然后计算他的偏移就可以用代码实现
ZWTERMINATETHREAD ZwTerminateThread = 0x83e79afc; //函数地址,是自己找到的,没有导出
void KernelKillThread(ULONG tID) {HANDLE            hThread = NULL;CLIENT_ID         ClientId = { 0 };OBJECT_ATTRIBUTES objAttribut ={ sizeof(OBJECT_ATTRIBUTES) };ClientId.UniqueProcess = 0;ClientId.UniqueThread = (HANDLE)tID; // TID  //打开线程,如果句柄有效,则结束线程ZwOpenThread(&hThread, 1, &objAttribut, &ClientId);if (hThread) {ZwTerminateThread(hThread, 0);ZwClose(hThread);}
}

转载于:https://blog.51cto.com/haidragon/2131747

win驱动下线程操作相关函数封装相关推荐

  1. HP LaserJet 1010 打印机 - 在 Win 7 下安装驱动

    问题 本文主要介绍HP LaserJet 1010 打印机在 Win 7 下安装驱动. 解决方案 目前hp官方网站暂时没有提供1010打印机在win7系统下的驱动,以下是USB线连接时安装驱动的方法, ...

  2. X64驱动:内核操作进线程/模块

    内核枚举进线程/模块 内核枚举进程: 进程就是活动起来的程序,每一个进程在内核里,都有一个名为 EPROCESS 的结构记录它的详细信息,其中就包括进程名,PID,PPID,进程路径等,通常在应用层枚 ...

  3. 线程间定制化调用通信—— 1 高内聚低耦合的前提下,线程操作资源类 2 判断/干活/通知 3 多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)

    生产者与消费者模式 一个生产者与一个消费者 题目:现在有两个线程,可以操作初始值为0的一个变量,实现一个线程对该变量加1,另一个线程对该变量减1,这两个线程的操作加一.减一交替,进行10轮,变量的初始 ...

  4. linux 查询内存和核心数,Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数...

    1.查看物理CPU的个数 [root@MysqlCluster01 ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc ...

  5. linux+分离线程+退出,Linux下线程终止操作.pdf

    Linux Linux LLiinnuuxx下线程的终止操作 简介: 简介: 简简介介:: 编写Linux下的多线程程序,需要使用头文件pthread.h, 编写Linux下的多线程程序,需要使用头文 ...

  6. mysql函数封装_Mysql对文件操作的封装

    在查看Mysql对文件的操作中发现,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括open.close.seek等,在Win32下的文件和目录操作函数使用了CreatFile.Clo ...

  7. 封装mysql数据库_快速掌握 Mysql数据库对文件操作的封装

    快速掌握 Mysql数据库对文件操作的封装 在查看Mysql对文件的操作中,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括open.close.seek等,在Win32下的文件和目录 ...

  8. C#中利用委托实现多线程跨线程操作

    在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个 ...

  9. 文件/文件夹操作函数封装(使用SHFileOperation和SHCreateDirectory函数实现)

    最近工作中涉及到很多文件和文件夹的处理,包括删除.检测是否存在.移动.复制等,用过CopyFile.MoveFile等函数,也使用过SHFIleOperation()函数,觉得后者比较好用些,参考了C ...

最新文章

  1. 使用OpenCV,Python进行图像哈希(差分哈希 dHash)处理
  2. Django中的Form
  3. 多所高校宣布:延迟开学!
  4. 学习韩立刚老师IT运维课程,成为韩立刚老师正式学生,在全国范围为你就近推荐工作。...
  5. localStorage 真正的本地缓存
  6. ALV的颜色分为行的颜色、列的颜色和CELL的颜色
  7. 如何通过MongoDB自带的Explain功能提高检索性能?
  8. Java Error(四)
  9. 【技术认证题库】SCCA理论aDesk-2考试【初级】
  10. wps的range对象
  11. Matlab 数据类型
  12. 小程序实时货币汇率计算
  13. 立秋后注意脚部保暖 试试量身定制合脚鞋
  14. chemdraw如何改中文_教你如何快速自定义ChemDraw默认设置
  15. elasticsearch7 分组统计
  16. 不选主元Gauss消去法
  17. Java 进程启停及诊断 Jarboot大改版、焕然一新
  18. (译)ABP之Entities
  19. Python下opencv使用笔记(二)(简单几何图像绘制)
  20. 安卓:No static method decodeBase64,commen-code包里报错的信息

热门文章

  1. 全球及中国商业座机电话行业投资潜力及竞争格局展望报告2021-2027年版
  2. 全球及中国霍乱菌苗行业模式分析及前景发展规划建议报告2022-2027年版
  3. Key usage extensions and extended key usage
  4. Java学习笔记(13)
  5. msql 复杂练习
  6. 在LNMP或Nginx上配置NameCheap免费SSL证书
  7. STM32F4 编程手册学习1_编程模型
  8. java的本地文件操作
  9. 移植u-boot1.1.6到友善mini2440学习笔记之环境搭建(系列之一)
  10. 提高网站首页载入速度的常用方法