2012-03-06 88 views
0

我在我的程序中使用NtQueryObject(handle, OBJECT_INFORMATION_CLASS.ObjectTypeInformation, IntPtr.Zero, 0, out length);,但這個執行返回長度-8 ...這是奇怪的;我不明白緩衝區大小如何可能是負面的。NtQueryObject函數返回長度爲-8

有誰知道爲什麼會這樣,我怎麼可能會糾正呢?

謝謝!

NB:

我進口NtQueryObject使用:

[DllImport("ntdll.dll")] 
internal static extern NT_STATUS NtQueryObject(
[In] IntPtr Handle, 
[In] OBJECT_INFORMATION_CLASS ObjectInformationClass, 
[In] IntPtr ObjectInformation, 
[In] int ObjectInformationLength, 
[Out] out uint ReturnLength); 
+1

根據函數的結果是一個NTSTATUS - 結果是什麼? – Yahia 2012-03-06 20:35:16

回答

0

我想我應該在out改爲ref這樣。

[DllImport("ntdll.dll")] 
public static extern int NtQueryObject(IntPtr ObjectHandle, int ObjectInformationClass, IntPtr ObjectInformation, int ObjectInformationLength, ref int returnLength); 

這些問題似乎來自於我如何進行通話。正確的方法是:

NtQueryObject(pHandle, (int)ObjectInformationClass.ObjectBasicInformation, pBasic, Marshal.SizeOf(objBasic), ref Length); 
+0

使用'out'是正確的。 – 2017-09-15 21:32:46

0

這最後一個參數應該是一個unsigned long,所以你必須有它聲明爲簡單long在你的代碼的某個地方。

+0

不,它是一個無符號的int,它也可以作爲int使用。 – 2012-03-11 10:13:11

+0

'int'是正確的編組 – 2017-09-15 21:33:21

0

如果遇到無效句柄,通常如果句柄引用不再可用的網絡資源,則會發生這種情況。

檢查NtQueryObject()返回狀態是否符合您的期望。

// 
// MessageId: STATUS_INVALID_HANDLE 
// 
// MessageText: 
// 
// An invalid HANDLE was specified. 
// 
#define STATUS_INVALID_HANDLE   ((NTSTATUS)0xC0000008L) // winnt