2010-06-08 14 views
0

Je veux créer un mutex avec la fonction noyau NtCreateMutant.comment utiliser NtCreateMutant (Zw) pour créer un mutex en C++

Je l'ai fait comme ceci:

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

Mais c'est la valeur qui est retournée NTSTATUS:

C0000024 STATUS_OBJECT_TYPE_MISMATCH 

Avec Windows API OpenMutex(..), il fonctionne très bien ...

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

J'espère que quelqu'un peut m'expliquer comment utiliser la fonction native :)

Je veux faire la même chose que cela, mais avec des fonctions natives:

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

J'espère que quelqu'un peut me aider à appeler NtOpenMutant la bonne façon.

+4

Y a-t-il une bonne raison d'utiliser la fonction native? Ce n'est pas portable, ni recommandé. – nothrow

+0

Oui plus facile de cacher les fonctions pour les débogueurs .. vous devrez utiliser les API natives pour créer votre propre sous pour l'appeler – Simon

+1

Y a-t-il une bonne raison de cacher ceci à un débogueur? Je veux dire, vous ne pouvez pas produire un binaire qui ne peut pas être inversé de toute façon, et même si vous pouvez le rendre plus difficile pour quelqu'un pour le désosser, cela est probablement exagéré et pas à l'épreuve des bugs. – ereOn

Répondre

2

Pourriez-vous me sortir plus de code? 1) Vous commencez par dire que vous créez votre mutex avec NtCreateMutant, mais le code que vous avez publié utilise NtOpenMutant. S'il vous plaît clarifier exactement ce que vous faites ici, de préférence avec un extrait de code plus grand.

2) NtCreateMutant ne prend pas 3 paramètres et NtOpenMutant ne prend pas un paramètre booléen 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); 

On ne sait pas que vous avez l'intention d'être à l'aide, mais il semblerait quel que vous vouliez dire Pour l'utiliser, vous pouvez l'utiliser de manière incorrecte.

Si vous voulez dire vraiment utiliser NtOpenMutant, il semblerait que votre troisième paramètre doit être une structure OBJECT_ATTRIBUTES, définie HERE être:

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

Gardez à l'esprit que les fonctions Nt * ne sont pas des miroirs exacts de l'API Windows publique et documentée. Cela semble être l'endroit où vous rencontrez vos problèmes.

+0

Hey merci, je veux éviter le plus de fois l'exécution de mon fichier exe. atm J'utilise OpenMutex pour vérifier si le mutex est déjà créé -> processus termiante sinon je crée mon mutex avec API CreateMutex. Alors maintenant, je veux utiliser les fonctions natives de ces API. C'est pourquoi je demande si quelqu'un pourrait me donner une direction pour configurer l'appel natif droit. http: //undocumented.ntinternals.net/UserMode/Non documenté% 20Functions/NT% 20Objects/Mutant/NtOpenMutant.html J'ai mes informations sur ce site; il y a 3 params écrits. – Simon

+0

Donc, je dois remplir la structure avec les bonnes choses ... quelqu'un pourrait me montrer la bonne direction? ou dois-je inverser l'appel à OpenMutex – Simon

+0

et merci pour cela :) son expliquant comment remplir la structure :) http://msdn.microsoft.com/fr-fr/library/ff557749%28VS.85%29 .aspx – Simon

Questions connexes