在内核模式下创建和终止线程

出处:http://5233studio.bokee.com/6570280.html

//     Globals to communicate with our system thread

PVOID ThreadObjectPointer=NULL;     // Thread pointer

BOOLEAN ExitNow;                      // Set to cause thread to exit

KEVENT ThreadEvent;                          // Set to make thread look at ExitNow.

KEVENT ThreadExiting;                  // Set when thread exiting

 

void SystemWorkThread( IN PVOID Context)

{

       NTSTATUS status;

       LARGE_INTEGER Timeout;

       HANDLE threadHandle;

       Timeout.QuadPart =  -10000*1000; 


       // Lower thread priority      

       KeSetPriorityThread( KeGetCurrentThread(), LOW_REALTIME_PRIORITY);

       while(TRUE)

       {

              // Wait for a request

              KeWaitForSingleObject( &ThreadEvent, Executive, KernelMode, FALSE, &Timeout);

              if( ExitNow)

                     break;

              //Working

              OutputDebugString(".");

       }

      KeSetEvent( &ThreadExiting, 0, FALSE);

       PsTerminateSystemThread(STATUS_SUCCESS);

       return;

}

 

BOOLEAN CreateSystemThread()

{

       HANDLE threadHandle;

       NTSTATUS status;


       // Prepare for thread start

       ExitNow = FALSE;

       KeInitializeEvent(&ThreadEvent, SynchronizationEvent, FALSE);

       KeInitializeEvent(&ThreadExiting, SynchronizationEvent, FALSE);


       // Start system thread

       status = PsCreateSystemThread( &threadHandle, THREAD_ALL_ACCESS, NULL, NULL, NULL,SystemWorkThread, NULL);

       if( !NT_SUCCESS(status))

              return FALSE;

       // Save a pointer to thread and close handle.

       status = ObReferenceObjectByHandle( threadHandle, THREAD_ALL_ACCESS, NULL, KernelMode,

                                                                         &ThreadObjectPointer, NULL);      

       if( NT_SUCCESS(status))

       {

              ZwClose(threadHandle);

       }

       else

       {

              // Uh oh... force thread to exit

              ExitNow = TRUE;

              KeSetEvent( &ThreadEvent, 0, FALSE);

              return FALSE;

       }                  

       return TRUE;

}

 

void CloseSystemThread()

{

       // Tell thread to stop, and wait for it to stop

       ExitNow = TRUE;

       KeSetEvent( &ThreadEvent, 0, FALSE);

       KeWaitForSingleObject( &ThreadExiting, Executive, KernelMode, FALSE, NULL);


       // Dereference thread object

       if( ThreadObjectPointer!=NULL)

       {

              ObDereferenceObject(&ThreadObjectPointer);

              ThreadObjectPointer = NULL;

       }    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值