我想用内核函数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
。
答案 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函数“翻译”为本地函数的答案