VOID MyProcessThread(IN PVOID pConText)
{
#if DBG
_asm int 3
#endif
//获取信号灯
PKSEMAPHORE pkSemaphore=(PKSEMAPHORE)pConText;
//释放给定信号对象
KeReleaseSemaphore(pkSemaphore,IO_NO_INCREMENT,1,FALSE);
//结束线程
PsTerminateSystemThread(STATUS_SUCCESS);
return ;
}
VOID Test(void)
{
#if DBG
_asm int 3
#endif
HANDLE hMyThread=NULL;
KSEMAPHORE kSemaphore={0};
//初始化内核信号灯状态
KeInitializeSemaphore(&kSemaphore,2,2);
//读取信号灯状态
LONG count=KeReadStateSemaphore(&kSemaphore);
//等待信号灯
KeWaitForSingleObject(&kSemaphore,Executive,KernelMode,FALSE,NULL);
//读取信号灯状态
count=KeReadStateSemaphore(&kSemaphore);
//创建系统线程
NTSTATUS status=PsCreateSystemThread(&hMyThread,NULL,NULL,NtCurrentProcess(),NULL,MyProcessThread,&kSemaphore);
//很重要,如果不等待,则systemThread引用了本函数的栈上变量
//当函数退出,同时栈上变量被回收,systemThread引用的参数会出现错误
KeWaitForSingleObject(&kSemaphore,Executive,KernelMode,FALSE,NULL);
return;
}
内核模式下 信号灯
最新推荐文章于 2022-07-03 19:06:29 发布