Please Help! Стал дописывать в свой драйвер функции чтения и записи настроек в файл. С записью всё быстро заработало. А вот с чтением какие то проблемы. Перепробована туча вариантов, но всегда одно и тоже: ZwOpenFile или ZwCreateFile нормально открывают файл, а функция ZwReadFile с завидным постоянством отправляет систему в синий экран. Код (Text): HANDLE WWOpenFileR(PWSTR str) { OBJECT_ATTRIBUTES atr; HANDLE hnd; UNICODE_STRING ustr; IO_STATUS_BLOCK st; NTSTATUS status; RtlInitUnicodeString(&ustr,str); InitializeObjectAttributes( &atr, &ustr, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); status = ZwCreateFile( &hnd, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &atr, &st, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, 0, 0); if (status == STATUS_SUCCESS) {return hnd;} else return NULL; } NTSTATUS Load_Config() { HANDLE hnd; LARGE_INTEGER Shift; FILE_STANDARD_INFORMATION fileinfo; NTSTATUS status; IO_STATUS_BLOCK io; PVOID buff; if (hnd = WWOpenFileR(L"\\??\\C:\\driver.ini")) { Shift.QuadPart= 0i64; if (ZwQueryInformationFile( hnd, &io, &fileinfo, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation)==STATUS_SUCCESS) { buff = ExAllocatePool(NonPagedPool, fileinfo.EndOfFile.LowPart+1,); RtlZeroMemory(buff, fileinfo.EndOfFile.LowPart+1); if (ZwReadFile( hnd, NULL, NULL, NULL, &io, buff, fileinfo.EndOfFile.LowPart, NULL, NULL)==STATUS_SUCCESS) { /* здесь бы работали с buff, если б дошли*/ ZwClose(hnd); return STATUS_SUCCESS; } } ZwClose(hnd); } return STATUS_UNSUCCESSFUL; } Никогда по стольку не сидел на месте на такой ерунде. Кому ни лень скажите, где же моя глупая ошибка или приведите работающий код.
а если попытаться дать ZwReadFile - IN PLARGE_INTEGER ByteOffset хотя х.з.. Код (Text): у меня все работает с ZwOpenFile(&m_hFile, GENERIC_READ|SYNCHRONIZE, &oa, &m_Iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT) ZwReadFile(m_hFile, NULL, NULL, NULL, &m_Iosb, pBuff, dwSize, &Offset, NULL);
Lord_De_Seis, вроде как сделано все верно, есть только пару советов, проверять буфер и вместо fileinfo.EndOfFile.LowPart просто переменную ULONG типа.
Может некоректно buff создаётся? Я вот всегда юзаю так: Код (Text): _AllocateHeap proc near arg_0 = dword ptr 4 assume fs:nothing mov eax,fs:18h push [esp+arg_0] mov eax,[eax+30h] push 0 push dword ptr [eax+18h] call RtlAllocateHeap retn 4 _AllocateHeap endp Код (Text): mov eax,fsi.EndOfFile.LowPart inc eax mov fsyze,eax push fsyze call _AllocateHeap mov rfbuf,eax sub esp,2*4 xor eax,eax push eax push eax push fsyze push rfbuf push esp push eax push eax push eax push hFile call ZwReadFile add esp,2*4 push hFile call ZwClose
Расскажи, как ты используешь свои функции. У меня возникает подозрение что ты закрываешь хендл и не переоткрываешь его заново.
2 LuckyDevil с проверками там порядок и с fileinfo.EndOfFile.LowPart то же. 2 rav не и с этим было всё нормально 2 Flasher а я всегда эту(ExAllocatePool) использую и всегда работает Кое что исправил в коде... и всё заработало. Как то странно почему же всё-таки были ошибки. Но одну серьёзную лажу я всё таки нашёл: Код (Text): buff = ExAllocatePool(NonPagedPool, fileinfo.EndOfFile.LowPart+1,); Заметьте в параметрах лишняя запятая и компилятор это съел. Спасибо всем кто пытался мне помочь, я уже несколько дней топтался на месте...