- from: http://blog.csdn.net/apxar/article/details/10865635
-
- /*
- 使用事件同步,等待線程中的函數DbgPrint結束之後,外面生成線程的函數再返回。
- */
- #include <ntddk.h>
- static KEVENT event;
- VOID MyThread()//線程調用的函數
- {
- DbgPrint("Create Thread");
- KeSetEvent(&event,0,TRUE);//事件能獲取有信號狀態
- PsTerminateSystemThread(STATUS_SUCCESS);
- }
- void DriverUnload( PDRIVER_OBJECT DriverObject)
- {
- }
- void fun()
- {
- HANDLE threadHandle=NULL;
- NTSTATUS status;
- //KeInitializeEvent() 事件初始化
- //KeWaitForSingleObject()
- //KeSetEvent()
- KeInitializeEvent(
- &event,
- SynchronizationEvent,//SynchronizationEvent爲同步事件
- FALSE// 當是TRUE 時初始化事件是有信號狀態.,當是FALSE時初始化事件是沒信號狀態,如果此處爲TRUE,則爲有信號狀態,KeWaitForSingleObject會直接通過,此時需要調用KeResetEvent來設置爲無信號
- );
- //KeResetEvent(&event);//指定的事件對象設置爲無信號狀態。
- status=PsCreateSystemThread( //創建線程
- &threadHandle,
- THREAD_ALL_ACCESS,
- NULL,
- NULL,
- NULL,
- MyThread,//調用的函數
- NULL //PVOID StartContext 傳遞給函數的參數
- );
- if(!NT_SUCCESS(status))
- return STATUS_UNSUCCESSFUL;
- //等待信號
- KeWaitForSingleObject (
- &event,//可以爲 時間 信號,線程,時鐘,互斥對象
- Executive,//等待
- KernelMode ,
- FALSE,
- 0
- );
- DbgPrint("Create Thread has return");
- ZwClose(threadHandle);
- }
- NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
- {
- DriverObject->DriverUnload = DriverUnload;
- fun();
- return STATUS_SUCCESS;
- }
內核事件通知KeWaitForSingleObject
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.