2012-03-06 94 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