我在我的程序中使用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);
答案 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