2010-06-08 82 views
0

我想創建一個帶有內核函數NtCreateMutant的互斥體。如何使用NtCreateMutant(Zw)在C++中創建一個互斥體

我做了這樣的:

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的正確方法。

+4

使用本地函數是否有很好的理由?它不是便攜式的,也不推薦。 – nothrow 2010-06-08 12:45:54

+0

是更容易隱藏調試器的功能..你將不得不使用本地API來創建你自己的子組來調用它 – Simon 2010-06-08 12:55:38

+1

是否有任何理由將其隱藏到調試器?我的意思是,無法生成無法反向設計的二進制文件,即使可以讓某人對其進行反向工程更難,但這樣做可能是過度的,而不是防錯的。 – ereOn 2010-06-08 13:55:20

回答

2

請問您能發表更多的代碼嗎?目前還不完全清楚這裏發生了什麼,但這裏有幾點想法:

1)您首先說您使用NtCreateMutant創建了互斥鎖,但是您發佈的代碼使用NtOpenMutant。請詳細說明你在這裏實際做了什麼,最好是使用更大的代碼片段。

2)NtCreateMutant用不了3個參數,並NtOpenMutant並不需要一個布爾第三個參數:

+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。這似乎是您遇到問題的地方。

+0

嘿謝謝,我想避免執行我的exe文件。 atm我正在使用OpenMutex來檢查互斥量是否已經創建 - > termiante進程否則我使用CreateMutex API創建我的互斥量。 所以現在我想使用這些API的本地功能。 這就是爲什麼我問是否有人可以給我一個方向來設置本地呼叫權。 http://undocumented.ntinternals。net/UserMode/Undocumented%20Functions/NT%20Objects/Mutant/NtOpenMutant.html 我從本網站獲得我的信息;有3個params寫。 – Simon 2010-06-08 13:06:06

+0

所以我必須用正確的東西來填充結構......有人能告訴我正確的方向嗎?或者我必須扭轉呼籲OpenMutex – Simon 2010-06-08 13:08:09

+0

並感謝這:)其解釋如何填充結構:) http://msdn.microsoft.com/en-us/library/ff557749%28VS.85%29 .aspx – Simon 2010-06-08 13:10:38