4.4创建线程

使用系统线程,在驱动中停止,等待很容易使整个系统陷入"停顿",最后可能只能重启电脑.但一个单独的线程长期等待也不至于会对系统造成致命的影响.有些任务需要长期不断执行,为这些内容启动一个特殊的线程来执行是最好的方法.在驱动中生成线程一般是系统进程,系统线程所在的进程名是 "System" ,创建线程内核API是:

NTSTATUS

PsCreateSystemThread(

_Out_ PHANDLE ThreadHandle,//返回的线程句柄指针

_In_ ULONG DesiredAccess,//设置为0

_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,//填NULL

_In_opt_  HANDLE ProcessHandle,//填NULL

_Out_opt_ PCLIENT_ID ClientId,//填NULL

_In_ PKSTART_ROUTINE StartRoutine,//用于该线程启动时执行的函数

_In_opt_ _When_(return >= 0, __drv_aliasesMem) PVOID StartContext//传入该函数的参数指针

);

PKSTART_ROUTINE 的原型如下:

VOID

KSTART_ROUTINE (

_In_ PVOID StartContext//StartContext就是PsCreateSystemThread传入的参数

);

需要注意的是,线程的结束应该在线程中自己调用 PsTerminateSystemThread 来完成

得到的线程句柄需要使用 ZwClose 来关闭,注意,关闭句柄并不结束线程

使用的代码:

#include

//全局静态字符串,用来打印,指向 WCHAR 数组应该也可以

UNICODE_STRING str = RTL_CONSTANT_STRING(L"cycle print");

//线程执行函数

VOID misakathreadproc(PVOID StartContext){

PUNICODE_STRING str = (PUNICODE_STRING)StartContext;

KdPrint(("oh:%wZ\r\n",str));

//结束自己

PsTerminateSystemThread(STATUS_SUCCESS);

}

VOID DriverUnload(PDRIVER_OBJECT driver){

DbgPrint("misaka: uninstall driver\r\n");

}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){

//线程句柄

HANDLE thread = NULL;

NTSTATUS status;

//创建线程

status = PsCreateSystemThread(&thread, 0, NULL, NULL, NULL, misakathreadproc,(PVOID)&str);

if (!NT_SUCCESS(status)){

//错误

}

ZwClose(thread);

KdPrint(("misaka:thread create success\r\n"));

driver->DriverUnload = DriverUnload;

return STATUS_SUCCESS;

}

输出结果,第二行是线程执行的:

misaka:thread create success

oh:cycle print

misaka: uninstall driver

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 4.文件,注册表,线程 4.1文件操作内核并不接受用字符串来表示的文件路径,而是使用一个 OBJECT_ATTRI...
    f675b1a02698阅读 1,750评论 0 0
  • 睡眠可以使程序停下来执行一段时间,当需要长期连续执行又不希望占用太多CPU使用率时,就可以加入睡眠.即时什么时间只...
    f675b1a02698阅读 490评论 0 0
  • 今天是2015年2月4日,注册到简书,开启又一轮写作动力。在这个提笔忘字的年代和年岁,总是要靠一点莫名其妙...
    牧霞阅读 146评论 0 1