如何在Windows下以内核模式打开命名互斥体?

如何在Windows下以内核模式打开命名互斥体?,windows,kernel,Windows,Kernel,前提是我们有两条线A和B;A是用户模式线程,B是内核模式线程 我们知道,如果A调用CreateEvent来创建命名事件,那么B可以在内核模式下打开命名事件 但是,如果A调用CreateMutex来创建命名互斥体,B如何在内核模式下打开命名互斥体 为什么内核模式中没有类似于zwopenvent的ZwOpenMutant 此外,用户模式互斥体和内核互斥体有什么区别?Ntoskrnl.exe不会导出ZwOpenMutant 您可以使用对应函数 UNICODE_STRING Us; NTSTATUS

前提是我们有两条线A和B;A是用户模式线程,B是内核模式线程

我们知道,如果A调用
CreateEvent
来创建命名事件,那么B可以在内核模式下打开命名事件

但是,如果A调用
CreateMutex
来创建命名互斥体,B如何在内核模式下打开命名互斥体

为什么内核模式中没有类似于
zwopenvent
ZwOpenMutant


此外,用户模式互斥体和内核互斥体有什么区别?

Ntoskrnl.exe不会导出ZwOpenMutant

您可以使用对应函数

UNICODE_STRING Us;

NTSTATUS NtStatus;

OBJECT_ATTRIBUTES Oa;

HANDLE h = NULL;

RtlInitUnicodeString(&Us, L"COOL_MUTEX_HAHA");

InitializeObjectAttributes(&Oa,&Us,0,NULL,NULL);

Nttatus = NtCreateMutant(&h, MUTEX_ALL_ACCESS, &Oa, 0);

if(status == STATUS_OBJECT_NAME_COLLISION)
{
   NtStatus = NtOpenMutant(&h, MUTEX_ALL_ACCESS, &Oa);
}

请注意,由于MSDN中未记录该功能,因此尽可能使用替代机制会更安全。例如,您可以使用事件、单页共享内存和联锁操作实现一个简单的互斥体。我的答案是ZWOPENStation函数存在,但不导出。但是,是的,使用文档化的东西更安全。从文档的行与行之间可以看出,内核互斥体与用户互斥体是完全不同的对象。内核将用户互斥体称为变体。内核互斥体只能在内核模式下使用,并且必须在线程转换回用户模式之前释放。