Функция NtQueryObject возвращает длину как -8 - PullRequest
0 голосов
/ 07 марта 2012

Я использую NtQueryObject(handle, OBJECT_INFORMATION_CLASS.ObjectTypeInformation, IntPtr.Zero, 0, out length); в своей программе, но она возвращает длину как -8 ... что странно; Я не вижу, как размер буфера может быть отрицательным.

Кто-нибудь знает, почему это происходит и как я могу это исправить?

Спасибо!

Примечание:

Я импортировал объект 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 голосов
/ 27 марта 2012

Полагаю, мне следовало изменить 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 голосов
/ 16 сентября 2017

Это может произойти, если вы встретите недопустимый дескриптор, как правило, если дескриптор ссылается на сетевой ресурс, который больше не доступен.

Убедитесь, что возвращаемый статус NtQueryObject () соответствует ожидаемому.

//
// MessageId: STATUS_INVALID_HANDLE
//
// MessageText:
//
// An invalid HANDLE was specified.
//
#define STATUS_INVALID_HANDLE            ((NTSTATUS)0xC0000008L)    // winnt
0 голосов
/ 07 марта 2012

Этот последний параметр должен иметь длину без знака, поэтому вы должны объявить его просто как long где-то в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...