在用户模式下使用的互斥对象貌似也是经过内核的一层包装....
VOID MyThread1(PVOID pContext){ KdPrint(("Enter MyThread1")); KMUTEX *pkMutex=(KMUTEX*)pContext; KdPrint(("MyThread1 KeWaitForSingleObject...")); KeWaitForSingleObject(pkMutex,Executive,KernelMode,FALSE,0); KdPrint(("MyThread1 KeWaitForSingleObject...ok")); KeStallExecutionProcessor(50);//强迫停止50ms,模拟耗时执行一段代码 KeReleaseMutex(pkMutex,FALSE); KdPrint(("Leave MyThread1")); PsTerminateSystemThread(STATUS_SUCCESS); } VOID MyThread2(PVOID pContext){ KdPrint(("Enter MyThread2")); KMUTEX *pkMutex=(KMUTEX*)pContext; KdPrint(("MyThread2 KeWaitForSingleObject...")); KeWaitForSingleObject(pkMutex,Executive,KernelMode,FALSE,0); KdPrint(("MyThread2 KeWaitForSingleObject...ok")); KeStallExecutionProcessor(50);//强迫停止50ms,模拟耗时执行一段代码 KeReleaseMutex(pkMutex,FALSE); KdPrint(("Leave MyThread2")); PsTerminateSystemThread(STATUS_SUCCESS); }
KdPrint(("Testing........hahaha..... MemoryCat.com")); HANDLE hThread1,hThread2; KMUTEX kMutex; KeInitializeMutex(&kMutex,0); PsCreateSystemThread(&hThread1,NULL,NULL,NtCurrentProcess(),NULL,MyThread1,&kMutex); PsCreateSystemThread(&hThread2,NULL,NULL,NtCurrentProcess(),NULL,MyThread2,&kMutex); VOID *pArray[2]; ObReferenceObjectByHandle(hThread1,0,NULL,KernelMode,&pArray[0],NULL); ObReferenceObjectByHandle(hThread2,0,NULL,KernelMode,&pArray[1],NULL); KeWaitForMultipleObjects(2,pArray,WaitAll,Executive,KernelMode,FALSE,NULL,NULL); ObDereferenceObject(pArray[0]); ObDereferenceObject(pArray[1]); KdPrint(("KeWaitForMultipleObjects ,,,end...."));