запись данных в файл

Тема в разделе "WASM.NT.KERNEL", создана пользователем Quark, 10 май 2008.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Код драйвера может вызываться в контексте различных процессов и довольно-таки часто. Поэтому не хочется каждый раз открывать его на запись, записывать данные, затем закрывать. Тем более что всё это придётся засовывать в спин-блоки, чтобы не нарушить последовательность данных. Хотелось-бы один раз открыть и работать только с объектом файла, но тогда в контекстах других процессов хендл будет недействителен и вызов ZwWriteFile завершится неудачей. Что здесь можно сделать?
     
  2. VENOM4X

    VENOM4X New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    29
    Я открывал реестр и работал с ним из ядра при открытии использовал в AccessMask OBJ_KERNEL_HANDLE - в DDK так и написано: If the caller is not running in a system thread context, it must set the OBJ_KERNEL_HANDLE attribute when it calls InitializeObjectAttributes.
    Проблем небыло.
     
  3. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Спасибо. Почти работает, несчитая бсодов. Вобщем глупость какая-то получается. открываю файл в DispatchControl обработчике примерно так:
    Код (Text):
    1.     InitializeObjectAttributes(
    2.         &object_attributes,
    3.         &ustr_filename,
    4.         OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
    5.         0,
    6.         0
    7.     );
    8.  
    9.     ntstatus    =   ZwCreateFile(
    10.                         &h_file,
    11.                         FILE_APPEND_DATA | SYNCHRONIZE,
    12.                         &object_attributes,
    13.                         &io_status_block,
    14.                         0,
    15.                         FILE_ATTRIBUTE_NORMAL,
    16.                         FILE_SHARE_READ,
    17.                         FILE_MAXIMUM_DISPOSITION,
    18.                         FILE_SYNCHRONOUS_IO_NONALERT,
    19.                         0,
    20.                         0
    21.                     );
    затем в другом месте записываю данные в этот файл:

    Код (Text):
    1. PACKET_INFO     packet_info;
    2.  
    3.     ZwWriteFile(h_file, 0, 0, 0, &io_status_block, &packet_info, sizeof(packet_info), 0, 0);
    4.     ZwWriteFile(h_file, 0, 0, 0, &io_status_block, p_buffer, ul_buffer_len, 0, 0);
    Бсод вылетает когда этот код вызывается во-второй раз (в третий раз вызывается ZwWriteFile). смотрел в отладчике - где-то в недрах ядра вылазит левый указатель:

    cmp [edi + 4], 0 ; edi = 0