NtQueryObject函数返回长度为-8

时间:2012-03-06 20:24:15

标签: c# winapi memory

我在我的程序中使用NtQueryObject(handle, OBJECT_INFORMATION_CLASS.ObjectTypeInformation, IntPtr.Zero, 0, out length);,但这会执行返回长度为-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);

3 个答案:

答案 0 :(得分:0)

最后一个参数应该是unsigned long,所以你必须在代码中的某个地方将它声明为long

答案 1 :(得分: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);

答案 2 :(得分:0)

如果您遇到无效句柄,通常会在句柄引用不再可用的网络资源时发生这种情况。

检查NtQueryObject()返回状态是否符合预期。

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