пару вопросов по ddk, ZwWriteFile

Тема в разделе "WASM.BEGINNERS", создана пользователем rain, 4 июл 2007.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    1) по ZwWriteFile, предпоследний параметр там:
    так вот если его например выставить в FILE_WRITE_TO_END_OF_FILE (-1) то получаем ошибку STATUS_DATATYPE_MISALIGNMENT_ERROR (0C00002C5h) если поставить в число кратное 4 то получаю STATUS_ACCESS_VIOLATION (0C0000005h), если 0 то всё окейно записывается. Почему получаем такой результат? Из этой функции можно записывать только по смещению кратному 4?
    код которым это вызывается:

    Код (Text):
    1. invoke ZwCreateFile, offset hFile, SYNCHRONIZE + GENERIC_ALL, offset objattr, offset iosb, 0,  FILE_ATTRIBUTE_NORMAL,\
    2.                         FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, 0, 0
    3. invoke ZwWriteFile, hFile, 0, 0, 0, offset iosb, offset szHey, 9, XX, 0
    2) в KmdTut в начальных примерах юзается функция PsLookupProcessByProcessId, мой ддк по индексному поиску на префикс Ps находит только 7 функций, это так и должно быть или я что-то недопонимаю?
     
  2. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    по первому, в мсдн все вроде описано.

    в моем msdn 2006 эта функция недокументирована
    её прототип
    NTSTATUS
    __stdcall
    PsLookupProcessByProcessId (
    IN PVOID ProcessId,
    OUT PEPROCESS *Process
    );
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    rain
    1) ...
    "Pointer to a variable" трактуется, как адрес переменной. Отсюда требование быть выровненным, иначе STATUS_DATATYPE_MISALIGNMENT_ERROR, и быть _настоящим_ адресом, иначе STATUS_ACCESS_VIOLATION.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    NTSTATUS
    ZwWriteFile(
    IN HANDLE FileHandle,
    IN HANDLE Event OPTIONAL,
    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
    IN PVOID ApcContext OPTIONAL,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN PVOID Buffer,
    IN ULONG Length,
    IN PLARGE_INTEGER ByteOffset OPTIONAL,
    IN PULONG Key OPTIONAL
    );

    Это адрес структуры LARGE_INTEGER. Он обязан быть правильным адресом, а не просто числом, кратным 4. Ну и естественно, структура должна быть выровнена в памяти
     
  5. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ого, нужно спать вовремя ложиться ибо незаметить "P" перед LARGE_INTEGER и "Pointer to " в самом начале описания можно только в таком состоянии :dntknw:
    EP_X0FF что это у тебя за мсдн вместе с ддк что-ли ?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    rain
    он по умолчанию включен в MSDN.
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    n0name
    у меня "MSDN Library for Visual Studio 2005" ни намёка там на DDK нет
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name
    Ну.. оффлайновая версия мсдн действиельно ддк не включает, по крайней мере у меня тоже.
    Однако, с DDK вместе идёт хелпарь, там все, что нужно.

    Ну а онлайн-версия, есесно, включает
     
  9. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    такая вот ситуация
    ZwWriteFile завершается со статусом
    STATUS_DATATYPE_MISALIGNMENT_ERROR (0C00002C5h)
    происходит, это просто через раз
    вызывается эта вот функция,
    меняется только содержимое буфера(Buffer) и его размер(Size)
    Код (Text):
    1. NTSTATUS
    2. NtDiskFileWrite(In HANDLE File,
    3.              In PVOID Buffer,
    4.              InOut ULONG *Size,
    5.              In ULONG_PTR Offset)
    6. {
    7.     NTSTATUS NtStatus = STATUS_SUCCESS;
    8.     IO_STATUS_BLOCK IoStatBlock = {0};
    9.     LARGE_INTEGER Off = {0};
    10.     ___try
    11.     {
    12.         if(Offset == FILE_POINTER_POSITION)
    13.         {
    14.             Off.LowPart = FILE_USE_FILE_POINTER_POSITION;
    15.             Off.HighPart = -1;
    16.         }
    17.         else
    18.             Off.QuadPart = (ULONG64)Offset;
    19.         NtStatus = ZwWriteFile_SysCall(File, 0, 0, 0, &IoStatBlock, Buffer, *Size, &Off, 0);
    20.         if(!NT_SUCCESS(NtStatus))
    21.             ___leave;
    22.         *Size = IoStatBlock.Information;
    23.     }
    24.     ___except(EXCEPTION_EXECUTE_HANDLER)
    25.     {
    26.         NtStatus = STATUS_UNHANDLED_EXCEPTION;
    27.     }
    28.     ___finally
    29.     return NtStatus;
    30. }
    в чем может быть дело, подскажите
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ohne
    Выравнивание на 4.
     
  11. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    да, точно. спс