Когда можно вызывать IoCreateDevice?

Тема в разделе "WASM.NT.KERNEL", создана пользователем ov4inka, 27 фев 2009.

  1. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Хотел осуществить такую задумку:
    1. при загрузке драйвера создается один Device0 посредством вызова IoCreateDevice.

    IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION1), &device_name, 0, 0, FALSE, &device_object);

    2. при обращении к нему через DeviceIoControl с определенными параметрами создается Device1.

    IoCreateDevice( device_object -> DriverObject, sizeof(DEVICE_EXTENSION2), &device_name, 0, 0, FALSE, &device_object2);

    3. При этом у Device0 и Device1 различные device_extension. И думал что при работе с Device1 будут вызываться
    функции обработки такие же как и у Device0. Но этого не происходит. Device1 создается, но ни на какие функции не реагирует. Как такое может быть? Или есть какое-то вето на момент создания Device'ов?
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Функции обработки IRP, Fast I/O привязаны к DRIVER_OBJECT. Если ты в драйвере создаешь несколько устройств, то обрабатывать их будут одни и те же функции.

    В твоем случае думаю проблема кроется в том, что у тебя для двух различных устройств указывается одно и то же имя. Или device_name хранит разные имена при первом и втором вызове?
     
  3. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Имена разные, это просто в качестве примера. К тому же если бы имена были одинаковы - выдал бы ошибку. После каждого вызова идет проверка статуса выполнения - они STATUS_SUCCESS. Так что они корректно созданы. Но второй device не реагирует.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Блин, ну что за терминология! Не реагирует... Йопт, что значит не реагирует? Девайсы что ли танго должны танцевать при любой системной активности? Выше уже в принципе всё сказали, правда, недостаточно чётко. Ещё раз: объект-девайс (DEVICE_OBJECT) пассивен, вызываются всегда обработчики объекта-драйвера (DRIVER_OBJECT). При чём вызываются всегда для какого-то конкретного девайса (которому предназначается запрос), а не просто так. Это, кстати, распространённое заблуждение большинства современных драйверописателей. Они почему-то думают, что запросы посылаются драйверам, но на самом деле целью запроса всегда является устройство, а обработчики запросов привязаны к драйверам совсем по другой причине - потому что драйвер может обслуживать (да-да, это именно тот термин) несколько устройств одновременно.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    флаг DO_DEVICE_INITIALIZING сбрасывали? вне DriverEntry это обязательно
     
  6. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Great
    Спасибо, вероятно дело в этом. В понедельник обязательно попробую