ZwQueryInformationProcess и x64

Тема в разделе "WASM.NT.KERNEL", создана пользователем lborokl, 20 фев 2011.

  1. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    win7 x64. Хочу получить структуру PROCESS_DEVICEMAP_INFORMATION.
    Использую такой код:
    Код (Text):
    1. status = Zw/NtQueryInformationProcess(NtCurrentProcess(),
    2.                                          ProcessDeviceMap,
    3.                                          &devMap,
    4.                                          sizeof(devMap),
    5.                                          NULL);
    Под x32, отлично работает. Под x64 status=C0000004 = STATUS_INFO_LENGTH_MISMATCH;
    Почему хз. Нагуглил, что работа этой функции в х64 несколько отличается от x32. Что с не можно сделать? Или есть ещё нормальные способы получить эту структуру?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Уверен, что объявил правильно?

    Код (Text):
    1. typedef struct _PROCESS_DEVICEMAP_INFORMATION {
    2.     union {
    3.         struct {
    4.             HANDLE DirectoryHandle;
    5.         } Set;
    6.         struct {
    7.             ULONG DriveMap;
    8.             UCHAR DriveType[ 32 ];
    9.         } Query;
    10.     };
    11. } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
     
  3. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    x64
    Ну с этим проблем нет. Она у меня уже объявлена из ntddk.h, да и потом на x32, то работает. Но проверил специально, создал такую структуру с другим именем, подставил и та же картина. На x32 ок, x64 status=C0000004.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    как раз с этим и проблема...

    очень многие структуры различны для x86 и x64... проблема в размере структуры, гуглите, как структуру правильно задать... или выделите заведомо больший буффер и посмотрите по памяти в отладчике, как правильно расположить поля...
     
  5. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Rel
    Ок.
    НО я задал структуру как написал x64 и изменений нет.
     
  6. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    Всё, разобрался. Юзаем вот такой вариант структуры:
    Код (Text):
    1. typedef struct _PROCESS_DEVICEMAP_INFORMATION {
    2.     union {
    3.         struct {
    4.             HANDLE DirectoryHandle;
    5.         } Set;
    6.         struct {
    7.             ULONG DriveMap;
    8.             UCHAR DriveType[32];
    9.         } Query;
    10.     };
    11. #ifdef X64
    12.     ULONG Flags;
    13. #endif
    14. } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Данное объявление неверно, ибо:

    Код (Text):
    1. typedef struct _PROCESS_DEVICEMAP_INFORMATION {
    2.     union {
    3.         struct {
    4.             HANDLE DirectoryHandle;
    5.         } Set;
    6.         struct {
    7.             ULONG DriveMap;
    8.             UCHAR DriveType[ 32 ];
    9.         } Query;
    10.     };
    11. } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
    12.  
    13. typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX {
    14.     union {
    15.         struct {
    16.             HANDLE DirectoryHandle;
    17.         } Set;
    18.         struct {
    19.             ULONG DriveMap;
    20.             UCHAR DriveType[ 32 ];
    21.         } Query;
    22.     };
    23.     ULONG Flags;    // specifies that the query type
    24. } PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX;
    Я не проверял, но, вероятно, твоя проблема связана с тем, что начиная с Windows 7 (или уже с Vista?) допустимо использовать только расширенный вариант структуры.
     
  8. lborokl

    lborokl New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2011
    Сообщения:
    22
    x64
    Пока для себя я оставил решением, использовать расширенный вариант структуры. К сожалению нет под рукой win7 x32, чтобы проверить твоё утверждение. Но под xp, с расширенным вариантом структуры не работает, возвращаемый статус c000000d. Буду признателен если кто-нибудь уточнит этот момент.