1) по ZwWriteFile, предпоследний параметр там: так вот если его например выставить в FILE_WRITE_TO_END_OF_FILE (-1) то получаем ошибку STATUS_DATATYPE_MISALIGNMENT_ERROR (0C00002C5h) если поставить в число кратное 4 то получаю STATUS_ACCESS_VIOLATION (0C0000005h), если 0 то всё окейно записывается. Почему получаем такой результат? Из этой функции можно записывать только по смещению кратному 4? код которым это вызывается: Код (Text): invoke ZwCreateFile, offset hFile, SYNCHRONIZE + GENERIC_ALL, offset objattr, offset iosb, 0, FILE_ATTRIBUTE_NORMAL,\ FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, 0, 0 invoke ZwWriteFile, hFile, 0, 0, 0, offset iosb, offset szHey, 9, XX, 0 2) в KmdTut в начальных примерах юзается функция PsLookupProcessByProcessId, мой ддк по индексному поиску на префикс Ps находит только 7 функций, это так и должно быть или я что-то недопонимаю?
по первому, в мсдн все вроде описано. в моем msdn 2006 эта функция недокументирована её прототип NTSTATUS __stdcall PsLookupProcessByProcessId ( IN PVOID ProcessId, OUT PEPROCESS *Process );
rain 1) ... "Pointer to a variable" трактуется, как адрес переменной. Отсюда требование быть выровненным, иначе STATUS_DATATYPE_MISALIGNMENT_ERROR, и быть _настоящим_ адресом, иначе STATUS_ACCESS_VIOLATION.
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. Ну и естественно, структура должна быть выровнена в памяти
ого, нужно спать вовремя ложиться ибо незаметить "P" перед LARGE_INTEGER и "Pointer to " в самом начале описания можно только в таком состоянии EP_X0FF что это у тебя за мсдн вместе с ддк что-ли ?
n0name Ну.. оффлайновая версия мсдн действиельно ддк не включает, по крайней мере у меня тоже. Однако, с DDK вместе идёт хелпарь, там все, что нужно. Ну а онлайн-версия, есесно, включает
такая вот ситуация ZwWriteFile завершается со статусом STATUS_DATATYPE_MISALIGNMENT_ERROR (0C00002C5h) происходит, это просто через раз вызывается эта вот функция, меняется только содержимое буфера(Buffer) и его размер(Size) Код (Text): NTSTATUS NtDiskFileWrite(In HANDLE File, In PVOID Buffer, InOut ULONG *Size, In ULONG_PTR Offset) { NTSTATUS NtStatus = STATUS_SUCCESS; IO_STATUS_BLOCK IoStatBlock = {0}; LARGE_INTEGER Off = {0}; ___try { if(Offset == FILE_POINTER_POSITION) { Off.LowPart = FILE_USE_FILE_POINTER_POSITION; Off.HighPart = -1; } else Off.QuadPart = (ULONG64)Offset; NtStatus = ZwWriteFile_SysCall(File, 0, 0, 0, &IoStatBlock, Buffer, *Size, &Off, 0); if(!NT_SUCCESS(NtStatus)) ___leave; *Size = IoStatBlock.Information; } ___except(EXCEPTION_EXECUTE_HANDLER) { NtStatus = STATUS_UNHANDLED_EXCEPTION; } ___finally return NtStatus; } в чем может быть дело, подскажите