ZwCreateFile

Тема в разделе "WASM.WIN32", создана пользователем ViRUS, 16 авг 2005.

  1. ViRUS

    ViRUS New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    10
    Адрес:
    Russia
    Делаю так:

    InitializeObjectAttributes(&ObjectAttributes, &FileName, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL);

    status = ZwCreateFile(hFile, FILE_WRITE_DATA + SYNCHRONIZE, &ObjectAttributes, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);

    Файл создается, но status не равен STATUS_SUCCESS...

    В чем дело?
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Удачное завершение операции не обязательно происходит с кодом STATUS_SUCCESS. Для проверки удачности пользуйся макросом NT_SUCCESS.
     
  3. ViRUS

    ViRUS New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    10
    Адрес:
    Russia
    Попробую, но почему последующий вызов ZwСlose(hFile); не освобождает файл? После того как драйвер отработал все файлы остаются залочены.
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Я телепатией не обладаю, так что не скажу :)

    Приведи пожалуйста код и возвращаемый статус.
     
  5. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Удачное завершение операции не обязательно происходит с кодом STATUS_SUCCESS.

    У этой функции обязательно,

    #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

    Попробую, но почему последующий вызов ZwСlose(hFile); не освобождает файл? После того как драйвер отработал все файлы остаются залочены.

    Откуда мы знаем, может кто-то перехватил этот вызов, а обработчик кривой. Короче давай еще информацию, и код.
     
  6. ViRUS

    ViRUS New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    10
    Адрес:
    Russia
    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

    {

    NTSTATUS status = STATUS_SUCCESS;



    InitializeObjectAttributes(&ObjectAttributes, &FileName, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL);

    status = ZwCreateFile(hFile, FILE_WRITE_DATA + SYNCHRONIZE, &ObjectAttributes, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);

    DbgPrint("ZwCreateFile: 0x%x!\n", status);

    ZwСlose(hFile);



    return status;

    }



    Возвращаемый статус: STATUS_ACCESS_VIOLATION!!! Как это???

    Файл то создался!
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ ViRUS</font><!--color--><font color="gray]: Возвращаемый статус: STATUS_ACCESS_VIOLATION!!! Как это??? ]</font><!--color-->


    Код (Text):
    1. try {
    2.  
    3.     ProbeAndWriteHandle( hFile, 0 );
    4.  
    5. } except(EXCEPTION_EXECUTE_HANDLER) {
    6.  
    7.     return GetExceptionCode();
    8. }
    1. не ZwCreateFile(hFile,...) а ZwCreateFile(&hFile,...)

    2. OBJ_KERNEL_HANDLE тут не нужен, т.к. DriverEntry выполняется в кнтексте системного процесса и хендл всё равно попадет в его таблицу хендлов
     
  8. ViRUS

    ViRUS New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    10
    Адрес:
    Russia
    Спасибо! Заработало! Но OBJ_KERNEL_HANDLE все таки нужен, ибо я ZwWriteFile делаю в обработчике IRP.