本文转载自: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);
}
分享到:
相关推荐
- **2.2 内核线程A到内核线程B**:在内核态下,通过更新线程控制块(TCB)中的信息,保存当前线程的状态,并加载新线程的TCB,从而切换到另一个内核线程的内核栈。 - **2.3 内核线程B到用户程序**:当内核线程B...
操作系统是计算机科学中的核心课程,而内核级线程(Kernel-Level Threads,KLT)是操作系统中多线程实现的一种重要方式。哈工大的操作系统实验8着重探讨了如何在内核层面实现线程机制,这对于理解和掌握操作系统的...
在深入了解Windows进程的创建与销毁之前,我们首先需要理解什么是进程以及它在操作系统中的作用。简单来说,进程是正在运行的一个程序实例,每个进程都有自己的内存空间和系统资源。在Windows系统中,进程的管理和...
1. **内核创建与管理**:内核线程由操作系统内核直接创建,其生命周期由内核控制,包括创建、销毁、调度等操作。 2. **独立的上下文**:每个内核线程都有自己独立的CPU上下文,包括寄存器状态、栈空间等,切换时无需...
系统线程(内核线程)是由操作系统内核创建和撤销的线程,内核维护进程及线程的上下文信息以及线程切换。系统线程的优点是当有多个处理机时,一个进程的多个线程可以同时执行,缺点是由内核进行调度,创建和销毁系统...
9. **线程池**:线程池是一种优化线程创建和销毁开销的技术,预先创建一组线程,当需要时从中分配,用完后归还。易语言可能通过封装系统API实现线程池功能。 在学习和应用易语言创建线程的过程中,理解这些基本概念...
操作系统对这些线程是无感知的,它们在用户空间中创建、销毁和进行线程切换。用户线程的一个显著特点是其创建和切换速度快,因为不需要涉及用户态和核心态之间的上下文切换。然而,这也带来了几个限制: 1. 当一个...
### Linux2.6内核中的NPTL线程...通过对内核数据结构的调整以及线程创建与销毁逻辑的优化,实现了更高效的线程管理机制。这种改进对于现代高性能应用和服务来说至关重要,使得Linux能够更好地适应复杂多变的应用场景。
在【标题】中提到的实验目的是深入理解线程与进程的区别,并在实际操作系统上设计和实现内核级线程。实验内容分为两部分:在Ubuntu下编写多线程应用程序memtest.c,以及在Linux 0.11的基础上实现POSIX Threads标准。...
1. **线程管理**:LKTL提供了一套完整的线程创建、调度、同步和销毁的机制,使得开发者可以在内核级别高效地控制线程的执行,避免用户态到内核态的频繁切换。 2. **信号量同步**:为了确保线程间的正确通信和资源...
### 操作系统中进程与线程的创建及线程模型 #### 1. 为什么引入线程? 在深入了解为何引入线程之前,我们先明确几个基本概念:程序、进程和线程。 - **程序**:是指为了完成特定任务而编写的一系列有序指令,通常...
在Linux系统中,栈可以分为进程栈、线程栈、内核栈以及中断栈。 首先,我们需要了解栈(Stack)的基本概念。栈是一种后进先出(LIFO, Last In First Out)的数据结构,它允许数据被存储和检索,但只允许在一段称为...
与用户线程相比,内核线程的创建、调度和销毁等操作都需要通过操作系统内核完成,这使得它们对硬件资源的访问更为直接,但也导致了更高的开销。 本章主要关注的是内核线程以及相关的内存管理和数据结构——位图...
这种模型能够提供良好的并发性能,但可能因为每个用户线程都需要一个内核线程而消耗过多的系统资源。 2. 多对一模型:多个用户级线程映射到一个内核级线程。这样可以减少内核级线程的数量,降低系统开销,但并发...
1. 用户级线程:用户级线程由应用程序管理,操作系统内核对它们的创建、调度和销毁并不直接参与。用户级线程的切换速度快,但当某个线程遇到I/O阻塞时,整个进程的其他线程也会被阻塞。 2. 内核级线程:内核支持的...
1. **线程创建与销毁**:通过系统调用如`pthread_create`和`pthread_join`创建和管理线程。理解线程的状态变迁,如就绪、运行、阻塞和终止。 2. **线程同步与通信**:涉及到互斥锁、条件变量、信号量等同步机制,...
Solaris支持多对多模型,可以创建多个内核线程来服务用户级线程。Solaris的线程模型称为LWP,它允许线程并行执行,提高了系统资源的利用率。此外,Solaris的线程调度策略非常灵活,可以根据系统负载动态调整。 总结...
与进程相比,线程的创建和销毁开销较小,能够更快速地进行上下文切换,提高了系统的并发性能。 线程和进程的主要区别在于,进程是操作系统分配资源的基本单位,拥有独立的内存空间和资源,而线程是处理器调度的基本...
本文将深入探讨Linux内核中的线程与进程,以及它们之间的关系。 **一、进程** 1. **进程定义**:进程是正在运行的程序的一个实例,拥有独立的内存空间和系统资源,如打开文件、信号量等。每个进程都有一个唯一的...