различие при создании симлинка между верхним и нижним фильтр-драйвером

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

  1. zeo

    zeo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    8
    Пишу фильтр-драйвер. Мне необходимо, чтобы фильтр драйвер работал или снизу USB устройства, или сверху. Я посчитал, что код будет одинаковый в обоих случаях: поменяется только inf файл.

    Вот так создаю драйвер и симлинк (ошибок нет):
    Код (Text):
    1. NTSTATUS DDKAPI add_device(DRIVER_OBJECT *driver_object,
    2.                            DEVICE_OBJECT *physical_device_object)
    3. {
    4. ............................
    5. device_object = IoGetAttachedDeviceReference(physical_device_object);
    6. device_type = device_object->DeviceType;
    7. ObDereferenceObject(device_object);
    8. RtlInitUnicodeString(&nt_device_name, L"\\Device\\myusb");  
    9. RtlInitUnicodeString(&symbolic_link_name, L"\\DosDevices\\myusb");
    10. status = IoCreateDevice(driver_object,
    11.                            sizeof(my_type),
    12.                            &nt_device_name, device_type, 0, FALSE,
    13.                            &device_object);
    14. status = IoCreateSymbolicLink(&symbolic_link_name, &nt_device_name);
    15. ............................
    16. }
    Вот так читаю из драйвера:
    Код (Text):
    1. int main(int argc, LPCTSTR argv[])
    2. {
    3. ...............
    4. hDevice = CreateFile("\\\\.\\myusb",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    5. ...............
    6. }
    Если я создаю верхний фильтр-драйвер, то без проблем открываю и читаю-записываю из своего драйвера.
    Но если этот же драйвер ставлю снизу устройства, то окрыть не могу. В дебаггере я вижу что IRP_MJ_CREATE не приходит - вообще пустота при попытке открывания. Такое впечатление, что ссылка указывает не на мой драйвер, а на вышестоящее USB устройство. Хотя я смотрю WinObjEx и она показывает, что ссылки указывает на мой драйвер.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    запрос все равно идет с вершины стека. так что если ты поставишь снизу свой дров и попробуешь к нему обратиться, по-моему IRP пошлется сначала верхнему устройву и вообще до тебя может не дойти, если драйвер вышестоящий отклонит запрос
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Со ссылкой все в порядке, просто FDO не пропускает вниз IRP_MJ_CREATE и правильно делает. Фильтры вообще не должны быть именованными и не должны делать на себя символьную ссылку. В данном случае надо создать в DriverEntry отдельный девайс (control device object) исключительно для общения с юзером, а фильтр д.б. безымянным и без символьной ссылки. Вобщем вот:

    http://www.wasm.ru/forum/viewtopic.php?id=12643
    http://www.wasm.ru/forum/viewtopic.php?id=18941
    http://msdn2.microsoft.com/en-us/library/aa490288.aspx
    http://msdn2.microsoft.com/en-us/library/ms790750.aspx
    http://support.microsoft.com/kb/262305

    В других источниках CDO еще называют "shadow device" или "extra device object". Можно глянуть для примера исходники FileSpy в DDK.
     
  4. zeo

    zeo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    8
    Большое спасибо.