win7 x64. Хочу получить структуру PROCESS_DEVICEMAP_INFORMATION. Использую такой код: Код (Text): status = Zw/NtQueryInformationProcess(NtCurrentProcess(), ProcessDeviceMap, &devMap, sizeof(devMap), NULL); Под x32, отлично работает. Под x64 status=C0000004 = STATUS_INFO_LENGTH_MISMATCH; Почему хз. Нагуглил, что работа этой функции в х64 несколько отличается от x32. Что с не можно сделать? Или есть ещё нормальные способы получить эту структуру?
Уверен, что объявил правильно? Код (Text): typedef struct _PROCESS_DEVICEMAP_INFORMATION { union { struct { HANDLE DirectoryHandle; } Set; struct { ULONG DriveMap; UCHAR DriveType[ 32 ]; } Query; }; } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
x64 Ну с этим проблем нет. Она у меня уже объявлена из ntddk.h, да и потом на x32, то работает. Но проверил специально, создал такую структуру с другим именем, подставил и та же картина. На x32 ок, x64 status=C0000004.
как раз с этим и проблема... очень многие структуры различны для x86 и x64... проблема в размере структуры, гуглите, как структуру правильно задать... или выделите заведомо больший буффер и посмотрите по памяти в отладчике, как правильно расположить поля...
Всё, разобрался. Юзаем вот такой вариант структуры: Код (Text): typedef struct _PROCESS_DEVICEMAP_INFORMATION { union { struct { HANDLE DirectoryHandle; } Set; struct { ULONG DriveMap; UCHAR DriveType[32]; } Query; }; #ifdef X64 ULONG Flags; #endif } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
Данное объявление неверно, ибо: Код (Text): typedef struct _PROCESS_DEVICEMAP_INFORMATION { union { struct { HANDLE DirectoryHandle; } Set; struct { ULONG DriveMap; UCHAR DriveType[ 32 ]; } Query; }; } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION; typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX { union { struct { HANDLE DirectoryHandle; } Set; struct { ULONG DriveMap; UCHAR DriveType[ 32 ]; } Query; }; ULONG Flags; // specifies that the query type } PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX; Я не проверял, но, вероятно, твоя проблема связана с тем, что начиная с Windows 7 (или уже с Vista?) допустимо использовать только расширенный вариант структуры.
x64 Пока для себя я оставил решением, использовать расширенный вариант структуры. К сожалению нет под рукой win7 x32, чтобы проверить твоё утверждение. Но под xp, с расширенным вариантом структуры не работает, возвращаемый статус c000000d. Буду признателен если кто-нибудь уточнит этот момент.