如何使用NtCreateMutant(Zw)在C ++中创建互斥锁

时间:2010-06-08 12:42:13

标签: c++ mutex

我想用内核函数NtCreateMutant创建一个互斥锁。

我是这样做的:

Handle hMutex;
NTSTATUS ntMutex = NtOpenMutant(&hMutex,MUTEX_ALL_ACCESS,false);

但这是返回的NTSTATUS值:

C0000024    STATUS_OBJECT_TYPE_MISMATCH

使用Windows API OpenMutex(..),它工作得很好......

HANDLE hMutex;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Name");

希望有人能解释我如何使用原生函数:)

所以我想做同样的事情,但是使用原生函数:

HANDLE hMutex;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "NameOfMyMutex");
if(hMutex == NULL)
{
    hMutex = CreateMutex(NULL, FALSE, "NameOfMyMutex");
}
else
{
    return FALSE;
}

我希望有人可以帮助我以正确的方式致电NtOpenMutant

2 个答案:

答案 0 :(得分:2)

您能发布更多代码吗?现在还不完全清楚这里发生了什么,但这里有一些想法:

1)您首先要说的是使用NtCreateMutant创建互斥锁,但您发布的代码使用的是NtOpenMutant。请详细说明您在这里的实际操作,最好使用更大的代码段。

2)NtCreateMutant不接受3个参数,NtOpenMutant不接受布尔第3个参数:

+NTSTATUS SERVICECALL
+NtCreateMutant(OUT PHANDLE MutantHandle,
+               IN ACCESS_MASK DesiredAccess,
+               IN POBJECT_ATTRIBUTES ObjectAttributes  OPTIONAL,
+               IN BOOLEAN InitialOwner);
+
+NTSTATUS SERVICECALL
+NtOpenMutant(OUT PHANDLE       MutantHandle,
+             IN  ACCESS_MASK       DesiredAccess,
+             IN  POBJECT_ATTRIBUTES    ObjectAttributes);

目前尚不清楚您打算使用哪种方式,但无论您打算使用哪种方式,它都会出现,您可能会错误地使用它。

如果你真的想使用NtOpenMutant,你的第三个参数似乎需要是一个OBJECT_ATTRIBUTES结构,定义为HERE

typedef struct _OBJECT_ATTRIBUTES {
  ULONG           Length;
  HANDLE          RootDirectory;
  PUNICODE_STRING ObjectName;
  ULONG           Attributes;
  PVOID           SecurityDescriptor;
  PVOID           SecurityQualityOfService;
}  OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;

请记住,Nt *函数不是公共和记录的Windows API的精确镜像。这似乎是您遇到问题的地方。

答案 1 :(得分:0)

我相信您想要的是模仿您用winapi发布的代码, 即尝试打开,如果不存在,请创建。

我建议您查看ReactO,并寻找实现 OpenMutex和CreateMutex

这应该为您提供有关如何将winapi函数“翻译”为本地函数的答案