Асинхронный вызов ZwDeviceIoControlFile

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

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    NTSTATUS
    ZwDeviceIoControlFile(
    IN HANDLE FileHandle,
    IN HANDLE Event,
    IN PIO_APC_ROUTINE ApcRoutine,
    IN PVOID ApcContext,
    OUT PIO_STATUS_BLOCK IoStatusBlock,
    IN ULONG IoControlCode,
    IN PVOID InputBuffer,
    IN ULONG InputBufferLength,
    OUT PVOID OutputBuffer,
    IN ULONG OutputBufferLength
    );

    ApcRoutine
    Address of an optional, caller-supplied APC routine to be called when the requested operation completes. This parameter can be NULL. It must be NULL if there is an I/O completion object associated with the file object.

    Я из user-mode вызываю эту функцию, получаю STATUS_PENDING, но обработчик ApcRoutine так и не вызывается. Работает ли вообще ApcRoutine в юзер-моде?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кодес в студию
     
  3. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Код (Text):
    1. h_device = CreateFile(wz_dev_name, GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
    2. ntstatus = ZwDeviceIoControlFile(
    3.                 h_device,
    4.                 0,
    5.                 ApcComplete,
    6.                 p,
    7.                 &status_block,
    8.                 SOME_REQUEST,
    9.                 wz_name,
    10.                 wcslen(wz_adapter_name) * sizeof(wchar_t) + sizeof(wchar_t),
    11.                 0,
    12.                 0
    13.             );
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а дальше есть ожидание на FileHandle если Status == STATUS_PENDING?
     
  5. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Так ведь по идее по завершении операции должна быть вызвана ApcComplete.. дальше я просто проверяю результат и там незначитальные дейтвия, типа SetDlgItemText(..."wait...") или SetDlgItemText(..."success");
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вообще да, должна вроде..
     
  7. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Странно, что этой возможности нет в DeviceIoControl - поэтому и складывается такое такое ощущение, что в третьем кольце работает только событие, а асинхронный вызов работает только в нулевом кольце...
     
  8. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Проблемма рашена. Спасибо TarasCo.

    When a user-mode APC is queued, the thread is not directed to call the APC function unless it is in an alertable state. After the thread is in an alertable state, the thread handles all pending APCs in first in, first out (FIFO) order, and the wait operation returns WAIT_IO_COMPLETION. A thread enters an alertable state by using SleepEx, SignalObjectAndWait, WaitForSingleObjectEx, WaitForMultipleObjectsEx, or MsgWaitForMultipleObjectsEx to perform an alertable wait operation.