Как использовать NtCreateMutant (Zw) для создания мьютекса в C ++ - PullRequest
0 голосов
/ 08 июня 2010

Я хочу создать мьютекс с функцией ядра 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 ]

2 голосов
/ 08 июня 2010

Не могли бы вы опубликовать больше кода?Пока не совсем ясно, что здесь происходит, но вот несколько соображений:

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, определенная ЗДЕСЬ :

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

Имейте в виду, что функции Nt * не являются точными зеркаламиобщедоступный и документированный Windows API.Кажется, именно здесь вы испытываете свои проблемы.

0 голосов
/ 14 августа 2018

Я считаю, что вы хотите, чтобы имитировать код, который вы опубликовали с Winapi, то есть, чтобы попытаться открыть, и, если не существует, создать.OpenMutex и CreateMutex

Это должно дать вам ответ о том, как "преобразовать" функции winapi в нативные

...