ZwReadFile Please help

Тема в разделе "WASM.WIN32", создана пользователем Lord_De_Seis, 16 июл 2006.

  1. Lord_De_Seis

    Lord_De_Seis New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2005
    Сообщения:
    55
    Please Help!
    Стал дописывать в свой драйвер функции чтения и записи настроек в файл. С записью всё быстро заработало. А вот с чтением какие то проблемы. Перепробована туча вариантов, но всегда одно и тоже: ZwOpenFile или ZwCreateFile нормально открывают файл, а функция ZwReadFile с завидным постоянством отправляет систему в синий экран.
    Код (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

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    21
    а если попытаться дать ZwReadFile - IN PLARGE_INTEGER ByteOffset
    хотя х.з..

    Код (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

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Lord_De_Seis, вроде как сделано все верно, есть только пару советов, проверять буфер и вместо fileinfo.EndOfFile.LowPart просто переменную ULONG типа.
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Может некоректно buff создаётся?
    Я вот всегда юзаю так:
    Код (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
    Код (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

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Расскажи, как ты используешь свои функции. У меня возникает подозрение что ты закрываешь хендл и не переоткрываешь его заново.
     
  6. Lord_De_Seis

    Lord_De_Seis New Member

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

    sergei132 New Member

    Публикаций:
    0
    Регистрация:
    23 май 2006
    Сообщения:
    8
    Lord_De_Seis, я столкнулся с той же проблемой.
    можешь сказать что ты в коде еще исправил?