找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 195|回复: 0

【驱动笔记6】在内核中创建线程

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-10-16 12:09:45 | 显示全部楼层 |阅读模式
在ring3的编程中我们经常使用多线程来提高效率或满足一些特殊的要求,当然在内核中也是一样,我们经常需要使用几个线程来同步完成一些工作。
    使用PsCreateSystemThread函数可以创建一个内核线程,它所属的进程名为system(PID=4),这个函数的第一个参数用来返回线程句柄,最后两个参数分别用于传入线程函数地址及参数。线程函数的格式与ring3的差不多,如下所示:VOID ThreadProc(IN PVOID context),这个VOID指针给了我们非常大的自由度。
    在使用线程的时候,需要注意到一个同步的问题,比如我们把一个地址传递到线程函数中作一些处理,如果没有同步机制,可能等线程函数开始执行一些功能的时候而我们的调用函数已经结束了,这时候就会出现访问内存异常。
    下面的代码我是从楚狂人的驱动教程中抄来的,使用KEVENT来同步,代码基本理解了,不过却没有达到设想的效果,暂时还不会内核调试,先搁下吧。

VOID
CreateThreadTest()
{
HANDLE hThread;
UNICODE_STRING ustrTest = RTL_CONSTANT_STRING(L"This is only a string for test!");
NTSTATUS status;
// 初始化事件
KeInitializeEvent(&kEvent, SynchronizationEvent, TRUE);
// 初始化字符串
RtlInitUnicodeString(&ustrTest, L"This is a string for test!");
status = PsCreateSystemThread(&hThread, 0, NULL, NULL, NULL, MyThreadFunc, (PVOID)&ustrTest);
if (!NT_SUCCESS(status))
{
KdPrint(("CreateThread Test Failed!"));
}
ZwClose(hThread);
// 等待事件
KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, 0);
}
// 线程函数
VOID
MyThreadFunc(
IN PVOID context
)
{
PUNICODE_STRING str = (PUNICODE_STRING)context;
KdPrint(("String In Thread : %wZ", str));
// 楚狂人的代码里面这里只有第一个参数,奇怪啊,DDK的帮助文档里面就是3个参数啊
KeSetEvent(&kEvent, 0, TRUE);
PsTerminateSystemThread(STATUS_SUCCESS);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 16:46 , Processed in 0.118851 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表