本文转载自:http://hi.baidu.com/sysinternal/blog/item/f2b877084535c532e92488cc.html
用PsCreateSystemThread来在内核中创建线程。读书笔记而已,高手飘过好
了~~~~~
先用KmdManager加载驱动,然后在DebugView中查看。。。。
SysThread.c部分代码
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING regPath
)
{
PDEVICE_OBJECT pDeviceObject = NULL;
NTSTATUS ntStatus;
UNICODE_STRING uniNtNameString, uniWin32NameString;
RtlInitUnicodeString( &uniNtNameString, NT_DEVICE_NAME );
ntStatus = IoCreateDevice (
pDriverObject,
sizeof(SYSTHREAD_DEVICE_EXTENSION), // DeviceExtensionSize
&uniNtNameString,
FILE_DEVICE_UNKNOWN, //
0, // No standard device characteristics
FALSE, // not exclusive device
&pDeviceObject
);
if( !NT_SUCCESS(ntStatus) ) {
return ntStatus;
}
// 派遣函数
pDriverObject->MajorFunction[IRP_MJ_CREATE] = SysThreadOpen;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = SysThreadClose;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SysThreadDeviceIoControl;
pDriverObject->DriverUnload = SysThreadUnload;
pDeviceObject->Flags |= DO_BUFFERED_IO;
RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME );
ntStatus = IoCreateSymbolicLink( &uniWin32NameString, &uniNtNameString );
if (!NT_SUCCESS(ntStatus)){
IoDeleteDevice( pDriverObject->DeviceObject );
}
return ntStatus;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void
SysThreadUnload(
IN PDRIVER_OBJECT pDriverObject
)
{
PDEVICE_OBJECT pDeviceObject;
UNICODE_STRING uniWin32NameString;
pDeviceObject = pDriverObject->DeviceObject;
RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME );
IoDeleteSymbolicLink( &uniWin32NameString );
IoDeleteDevice( pDriverObject->DeviceObject );
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
NTSTATUS
SysThreadOpen(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
)
{
KdPrint((" SysThreadOpen() was Called.... \n"));
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
NTSTATUS
SysThreadClose(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
)
{
KdPrint((" SysThreadClose() was Called.... \n"));
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
NTSTATUS
SysThreadDeviceIoControl(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrpStack;
PSYSTHREAD_DEVICE_EXTENSION pdx;
ULONG dwControlCode;
pdx = (PSYSTHREAD_DEVICE_EXTENSION) pDeviceObject->DeviceExtension;
pIrpStack = IoGetCurrentIrpStackLocation( pIrp );
dwControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
switch(dwControlCode)
{
case IOCTL_SYSTHREAD_START:
StartThread(pdx); //线程开始
break;
case IOCTL_SYSTHREAD_STOP:
StopThread(pdx); //线程结束
break;
default:
break;
}
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return ntStatus;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
NTSTATUS StartThread(PSYSTHREAD_DEVICE_EXTENSION pdx)
{
NTSTATUS status;
HANDLE hthread;
//初始化event对象
KeInitializeEvent(&pdx->evKill,
SynchronizationEvent, // auto reset
FALSE // initial state : FALSE ==> non-signaled
);
//创建ThreadProc
status = PsCreateSystemThread(&hthread,
THREAD_ALL_ACCESS,
NULL,
NULL,
NULL,
(PKSTART_ROUTINE) ThreadProc,
pdx
);
if( !NT_SUCCESS(status))
{
KdPrint(("Fail Start ThreadProc()!\n"));
return status;
}
ObReferenceObjectByHandle( hthread,
THREAD_ALL_ACCESS,
NULL,
KernelMode,
(PVOID *) &pdx->thread,
NULL
);
ZwClose(hthread);
return STATUS_SUCCESS;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
VOID StopThread(PSYSTHREAD_DEVICE_EXTENSION pdx)
{
KeSetEvent(&pdx->evKill, 0, FALSE); //通过KeSetEvent事件结束线程
KeWaitForSingleObject(pdx->thread, Executive, KernelMode, FALSE, NULL);
ObDereferenceObject(pdx->thread);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
VOID ThreadProc(PSYSTHREAD_DEVICE_EXTENSION pdx)
{
NTSTATUS status;
int cnt = 0;
LARGE_INTEGER timeout;
timeout.QuadPart = -1 * 10000000; // 1 second
//通过设置超时,每隔一秒打印一句话
while(1)
{
status = KeWaitForSingleObject(&pdx->evKill, Executive, KernelMode, FALSE, &timeout);
if( status == STATUS_TIMEOUT )
KdPrint(("^_^ ThreadProc()运行了%d秒!\n", cnt++));
else
break;
}
KdPrint(("^_^ ThreadProc()停止!\n"));
PsTerminateSystemThread(STATUS_SUCCESS);
}
分享到:
相关推荐
线程的实现有两种方式:用户线程和内核线程。 用户线程是在用户态中实现的,不需要内核的帮助。它的建立、同步、销毁和调度完全在用户态中完成,因此操作速度快且消耗低。然而,用户线程没有系统内核的支持,所有的...
这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 线程池:存放线程。...
进程管理 : 包括 进程创建 , 销毁 , 线程组管理 , 内核线程管理 , 队列等待 ; 进程调度 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 二、内存管理 内存管理 涉及到 物理内存管理 和 虚拟内存管理 , 是 Linux...
(2)看到进程的实时创建、销毁情况 (3)查看进程实时加载模块情况 (经常查看我们的钩子dll是否注入) (4)查看进程内句柄 (检查一些命名内核对象是否创建成功、检查是否存在句柄占用) (5)查看进程的相关属性...
线程池是一种线程使用模式。...这避免了在处理短时间任务时创建与销毁线程的代价。使用线程池不仅能够保证内核的充分利用,还能防止过分调度。WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。
3.执行任务的线程等待队列,如果队列中有任务,则执行任务,如果队列中没有任务,则进入内核等待状态,当队列中有任务时继续执行。而不是重复性创建和销毁线程。 具体请看上图。 三.线程句柄的管理 每次新建线程时...
Grand Central Dispatch(GCD)是异步执行任务的技术之一。... GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
UnixProgramming 这是我学习Unix(主要是linux)系统编程与网络编程的笔记,...线程模型:内核线程、用户线程、双层调度 线程API 创建pthread_create 初始化pthread_once 结束pthread_exit 回收pthread_join 取消pthrea
答:Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列 Handler:可以发布或者处理一个消息或者操作一个Runnable,通过...
13.1 创建线程消息队列 13.2 线程消息循环过程 13.3 线程消息发送过程 13.4 线程消息处理过程 第14章 Android应用程序的键盘消息处理机制 14.1 键盘消息处理模型 14.2 InputManager的启动过程 14.2.1...
13.1 创建线程消息队列 13.2 线程消息循环过程 13.3 线程消息发送过程 13.4 线程消息处理过程 第14章 Android应用程序的键盘消息处理机制 14.1 键盘消息处理模型 14.2 InputManager的启动过程 14.2.1 创建...
6.1.3 字符初始化与销毁 6.1.4 字符串复制 6.1.5 字符串比较 6.1.6 字符串转化成大写 6.1.7 字符串与整型数字相互转换 6.1.8 ANSI_STRING字符串与UNICODE_STRING字符串相互转换 6.2 内核模式下...
6.1.3 字符初始化与销毁 6.1.4 字符串复制 6.1.5 字符串比较 6.1.6 字符串转化成大写 6.1.7 字符串与整型数字相互转换 6.1.8 ANSI_STRING字符串与UNICODE_STRING字符串相互转换 6.2 内核模式下...
6.3.3 创建远程线程、将代码注入其他进程中执行 167 6.3.4 创建纤程、删除纤程、调度纤程 170 6.3.5 纤程与线程的互相转换 171 6.4 进程状态信息 176 6.4.1 PS API与Tool help API 176 6.4.2 遍历系统中...
3.执行任务的线程等待队列,如果队列中有任务,则执行任务,如果队列中没有任务,则进入内核等待状态,当队列中有任务时继续执行。而不是重复性创建和销毁线程。 具体请看上图。 三.线程句柄的管理 每次新建线程时...
6.3.3 创建远程线程、将代码注入其他进程中执行 167 6.3.4 创建纤程、删除纤程、调度纤程 170 6.3.5 纤程与线程的互相转换 171 6.4 进程状态信息 176 6.4.1 PS API与Tool help API 176 6.4.2 遍历系统中...