`
yexin218
  • 浏览: 958134 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

内核中线程的创建与销毁

阅读更多

本文转载自: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);
}
 
分享到:
评论

相关推荐

    Java与线程.pdf

    线程的实现有两种方式:用户线程和内核线程。 用户线程是在用户态中实现的,不需要内核的帮助。它的建立、同步、销毁和调度完全在用户态中完成,因此操作速度快且消耗低。然而,用户线程没有系统内核的支持,所有的...

    Java线程池技术详解

    这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 线程池:存放线程。...

    包含LINUX内核同步、信号、内存、调度、文件系统.rar

    进程管理 : 包括 进程创建 , 销毁 , 线程组管理 , 内核线程管理 , 队列等待 ; 进程调度 位于 下图 Linux 内核整体架构图 中的 内核空间 ; 二、内存管理 内存管理 涉及到 物理内存管理 和 虚拟内存管理 , 是 Linux...

    Procexp工具(含32位和64位)

    (2)看到进程的实时创建、销毁情况 (3)查看进程实时加载模块情况 (经常查看我们的钩子dll是否注入) (4)查看进程内句柄 (检查一些命名内核对象是否创建成功、检查是否存在句柄占用) (5)查看进程的相关属性...

    java线程池讲义+代码

    线程池是一种线程使用模式。...这避免了在处理短时间任务时创建与销毁线程的代价。使用线程池不仅能够保证内核的充分利用,还能防止过分调度。WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。

    易语言-易语言真正的线程池简易实现

    3.执行任务的线程等待队列,如果队列中有任务,则执行任务,如果队列中没有任务,则进入内核等待状态,当队列中有任务时继续执行。而不是重复性创建和销毁线程。 具体请看上图。 三.线程句柄的管理 每次新建线程时...

    详解IOS中GCD的使用

    Grand Central Dispatch(GCD)是异步执行任务的技术之一。... GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)  程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码  

    UnixProgramming

    UnixProgramming 这是我学习Unix(主要是linux)系统编程与网络编程的笔记,...线程模型:内核线程、用户线程、双层调度 线程API 创建pthread_create 初始化pthread_once 结束pthread_exit 回收pthread_join 取消pthrea

    android 面试2

     答:Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列  Handler:可以发布或者处理一个消息或者操作一个Runnable,通过...

    《Android系统源代码情景分析》

    13.1 创建线程消息队列 13.2 线程消息循环过程 13.3 线程消息发送过程 13.4 线程消息处理过程 第14章 Android应用程序的键盘消息处理机制 14.1 键盘消息处理模型 14.2 InputManager的启动过程 14.2.1...

    Android系统源代码情景分析-罗升阳-源码

    13.1 创建线程消息队列 13.2 线程消息循环过程 13.3 线程消息发送过程 13.4 线程消息处理过程 第14章 Android应用程序的键盘消息处理机制 14.1 键盘消息处理模型 14.2 InputManager的启动过程 14.2.1 创建...

    windows驱动开发技术详解-part2

     6.1.3 字符初始化与销毁  6.1.4 字符串复制  6.1.5 字符串比较  6.1.6 字符串转化成大写  6.1.7 字符串与整型数字相互转换  6.1.8 ANSI_STRING字符串与UNICODE_STRING字符串相互转换  6.2 内核模式下...

    Windows驱动开发技术详解的光盘-part1

     6.1.3 字符初始化与销毁  6.1.4 字符串复制  6.1.5 字符串比较  6.1.6 字符串转化成大写  6.1.7 字符串与整型数字相互转换  6.1.8 ANSI_STRING字符串与UNICODE_STRING字符串相互转换  6.2 内核模式下...

    精通Windows.API-函数、接口、编程实例.pdf

    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.执行任务的线程等待队列,如果队列中有任务,则执行任务,如果队列中没有任务,则进入内核等待状态,当队列中有任务时继续执行。而不是重复性创建和销毁线程。 具体请看上图。 三.线程句柄的管理 每次新建线程时...

    精通WindowsAPI 函数 接口 编程实例

    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 遍历系统中...

Global site tag (gtag.js) - Google Analytics