Пишу фильтр-драйвер. Мне необходимо, чтобы фильтр драйвер работал или снизу USB устройства, или сверху. Я посчитал, что код будет одинаковый в обоих случаях: поменяется только inf файл. Вот так создаю драйвер и симлинк (ошибок нет): Код (Text): NTSTATUS DDKAPI add_device(DRIVER_OBJECT *driver_object, DEVICE_OBJECT *physical_device_object) { ............................ device_object = IoGetAttachedDeviceReference(physical_device_object); device_type = device_object->DeviceType; ObDereferenceObject(device_object); RtlInitUnicodeString(&nt_device_name, L"\\Device\\myusb"); RtlInitUnicodeString(&symbolic_link_name, L"\\DosDevices\\myusb"); status = IoCreateDevice(driver_object, sizeof(my_type), &nt_device_name, device_type, 0, FALSE, &device_object); status = IoCreateSymbolicLink(&symbolic_link_name, &nt_device_name); ............................ } Вот так читаю из драйвера: Код (Text): int main(int argc, LPCTSTR argv[]) { ............... hDevice = CreateFile("\\\\.\\myusb",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); ............... } Если я создаю верхний фильтр-драйвер, то без проблем открываю и читаю-записываю из своего драйвера. Но если этот же драйвер ставлю снизу устройства, то окрыть не могу. В дебаггере я вижу что IRP_MJ_CREATE не приходит - вообще пустота при попытке открывания. Такое впечатление, что ссылка указывает не на мой драйвер, а на вышестоящее USB устройство. Хотя я смотрю WinObjEx и она показывает, что ссылки указывает на мой драйвер.
запрос все равно идет с вершины стека. так что если ты поставишь снизу свой дров и попробуешь к нему обратиться, по-моему IRP пошлется сначала верхнему устройву и вообще до тебя может не дойти, если драйвер вышестоящий отклонит запрос
Со ссылкой все в порядке, просто 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.