ZwReadFile Please help

Discussion in 'WASM.WIN32' started by Lord_De_Seis, Jul 16, 2006.

  1. Lord_De_Seis

    Lord_De_Seis New Member

    Blog Posts:
    0
    Please Help!
    Стал дописывать в свой драйвер функции чтения и записи настроек в файл. С записью всё быстро заработало. А вот с чтением какие то проблемы. Перепробована туча вариантов, но всегда одно и тоже: ZwOpenFile или ZwCreateFile нормально открывают файл, а функция ZwReadFile с завидным постоянством отправляет систему в синий экран.
    Code (Text):
    1. HANDLE WWOpenFileR(PWSTR str)
    2. {
    3.         OBJECT_ATTRIBUTES atr;
    4.         HANDLE hnd;
    5.         UNICODE_STRING ustr;
    6.         IO_STATUS_BLOCK st;
    7.         NTSTATUS status;
    8.         RtlInitUnicodeString(&ustr,str);
    9.         InitializeObjectAttributes( &atr,
    10.                                     &ustr,
    11.                                     OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    12.                                     NULL,
    13.                                     NULL);
    14.         status = ZwCreateFile(  &hnd,
    15.                                 GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
    16.                                 &atr,
    17.                                 &st,
    18.                                 NULL,
    19.                                 FILE_ATTRIBUTE_NORMAL,
    20.                                 FILE_SHARE_READ | FILE_SHARE_WRITE,
    21.                                 FILE_OPEN,
    22.                                 FILE_SYNCHRONOUS_IO_NONALERT,
    23.                                 0,
    24.                                 0);
    25.         if (status == STATUS_SUCCESS) {return hnd;} else return NULL;
    26. }
    27.  
    28. NTSTATUS Load_Config()
    29. {
    30.         HANDLE hnd;
    31.         LARGE_INTEGER Shift;
    32.         FILE_STANDARD_INFORMATION fileinfo;
    33.         NTSTATUS status;
    34.         IO_STATUS_BLOCK io;
    35.         PVOID buff;
    36.         if (hnd = WWOpenFileR(L"\\??\\C:\\driver.ini"))
    37.         {
    38.                 Shift.QuadPart= 0i64;
    39.                 if (ZwQueryInformationFile( hnd,
    40.                                            &io,
    41.                                            &fileinfo,
    42.                                            sizeof(FILE_STANDARD_INFORMATION),
    43.                                            FileStandardInformation)==STATUS_SUCCESS)
    44.                 {
    45.                         buff = ExAllocatePool(NonPagedPool, fileinfo.EndOfFile.LowPart+1,);
    46.                         RtlZeroMemory(buff, fileinfo.EndOfFile.LowPart+1);
    47.                         if (ZwReadFile( hnd,
    48.                                         NULL,
    49.                                         NULL,
    50.                                         NULL,
    51.                                         &io,
    52.                                         buff,
    53.                                         fileinfo.EndOfFile.LowPart,
    54.                                         NULL,
    55.                                         NULL)==STATUS_SUCCESS)
    56.                         {
    57.                                 /* здесь бы работали с buff, если б дошли*/
    58.                                 ZwClose(hnd);
    59.                                 return STATUS_SUCCESS;
    60.                         }
    61.                 }
    62.                 ZwClose(hnd);
    63.         }
    64.         return STATUS_UNSUCCESSFUL;
    65. }
    Никогда по стольку не сидел на месте на такой ерунде. Кому ни лень скажите, где же моя глупая ошибка или приведите работающий код.
     
  2. xdf

    xdf New Member

    Blog Posts:
    0
    а если попытаться дать ZwReadFile - IN PLARGE_INTEGER ByteOffset
    хотя х.з..

    Code (Text):
    1. у меня все работает с
    2. ZwOpenFile(&m_hFile, GENERIC_READ|SYNCHRONIZE, &oa, &m_Iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT)
    3. ZwReadFile(m_hFile, NULL, NULL, NULL, &m_Iosb, pBuff, dwSize, &Offset, NULL);
     
  3. LuckyDevil

    LuckyDevil New Member

    Blog Posts:
    0
    Lord_De_Seis, вроде как сделано все верно, есть только пару советов, проверять буфер и вместо fileinfo.EndOfFile.LowPart просто переменную ULONG типа.
     
  4. Flasher

    Flasher Member

    Blog Posts:
    0
    Может некоректно buff создаётся?
    Я вот всегда юзаю так:
    Code (Text):
    1. _AllocateHeap proc near
    2.     arg_0  = dword ptr  4
    3.        assume fs:nothing
    4.        mov eax,fs:18h
    5.        push [esp+arg_0]
    6.        mov eax,[eax+30h]
    7.        push 0
    8.        push dword ptr [eax+18h]
    9.        call RtlAllocateHeap
    10.        retn 4
    11. _AllocateHeap endp
    Code (Text):
    1.        mov eax,fsi.EndOfFile.LowPart
    2.        inc eax
    3.        mov fsyze,eax
    4.        push fsyze
    5.        call _AllocateHeap
    6.        mov rfbuf,eax
    7.        sub esp,2*4
    8.        xor eax,eax
    9.        push eax
    10.        push eax
    11.        push fsyze
    12.        push rfbuf
    13.        push esp
    14.        push eax
    15.        push eax
    16.        push eax
    17.        push hFile
    18.        call ZwReadFile
    19.        add esp,2*4
    20.        push hFile
    21.        call ZwClose
     
  5. rav

    rav New Member

    Blog Posts:
    0
    Расскажи, как ты используешь свои функции. У меня возникает подозрение что ты закрываешь хендл и не переоткрываешь его заново.
     
  6. Lord_De_Seis

    Lord_De_Seis New Member

    Blog Posts:
    0
    2 LuckyDevil с проверками там порядок и с fileinfo.EndOfFile.LowPart то же.
    2 rav не и с этим было всё нормально
    2 Flasher а я всегда эту(ExAllocatePool) использую и всегда работает
    Кое что исправил в коде... и всё заработало. Как то странно почему же всё-таки были ошибки.
    Но одну серьёзную лажу я всё таки нашёл:
    Code (Text):
    1. buff = ExAllocatePool(NonPagedPool, fileinfo.EndOfFile.LowPart+1,);
    Заметьте в параметрах лишняя запятая и компилятор это съел.
    Спасибо всем кто пытался мне помочь, я уже несколько дней топтался на месте...
     
  7. sergei132

    sergei132 New Member

    Blog Posts:
    0
    Lord_De_Seis, я столкнулся с той же проблемой.
    можешь сказать что ты в коде еще исправил?