Очень нужна помощь! Сделал драйвер, установил нотификатор на втыкание/вытыкание usb, получаю DeviceObject, FileObject для соответствующего драйвера, но вот как отключить usb девайс так и не понял. Пытался вызвать IoDeleteDevice - не помогло. BSOD с указанием на usbstor, IoDetachDevice + IoDeleteDevice BSOD с указанием на мой драйвер Пытался Irp = IoBuildAsynchronousFsdRequest(IRP_MJ_SHUTDOWN,deviceObject,NULL,0,0,NULL); IoCallDriver(deviceObject,Irp); выдало STATUS_INVALID_DEVICE_REQUEST Пытался irp = IoBuildDeviceIoControlRequest(FSCTL_LOCK_VOLUME, DeviceObject, NULL, 0, NULL, 0, FALSE, //IRP_MJ_INTERNAL_DEVICE_CONTROL &event, &ioStatus); выдало STATUS_NOT_SUPPORTED Попытался в предыдущем варианте сделать вот такие изменения: irpSp = IoGetСurrentIrpStackLocation(irp); irpSp->MajorFunction = IRP_MJ_FILE_SYSTEM_CONTROL; irpSp->FileObject = FileObject; irpSp->DeviceObject = DeviceObject; Результат - STATUS_NOT_SUPPORTED
x64 IoRegisterPlugPlayNotification с EventCategoryDeviceInterfaceChange + Открытие символической ссылки
tchunya, Вы думаете я не догадался бы выключать в user-mode, если бы так можно было бы?) Просто нужно через драйвер.
Почему бы тогда не сесть верхним фильтром на USB-устройства и фейлить IRP_MJ_PNP с IRP_MN_START_DEVICE для необходимого устройства? Встречный вопрос: зачем всё-таки драйвер?
tchunya В стек устройств тоже не хочется вставать. Задача достаточна специфичная, как до конца её доделаю отвечу на твой вопрос.
Блокировка USB устройств ? http://www.microsoft.com/whdc/driver/tips/remlock.mspx When handling a device-removal request (IRP_MN_REMOVE_DEVICE), a driver releases the remove lock that it acquired in its DispatchPnP routine by calling IoReleaseRemoveLockAndWait. This call does not return until the reference count associated with the remove lock reaches zero, which indicates that all other acquisitions of the remove lock have been released. After IoReleaseRemoveLockAndWait returns, the driver passes the IRP down its device stack (if necessary), calls IoDetachDevice to remove its device object from the device stack, and then frees resources such as pool memory that it allocated in its AddDevice routine. Finally, the driver calls IoDeleteDevice to mark the device object for deletion
Только IRP_MN_REMOVE_DEVICE шлет PnP-менеджер, а если вы зашлете стеку ентот запрос, то это может привести к некорректной работе связанных с данным стеков и ОС. Точно также и с IRP_MN_STOP_DEVICE. Не имея полной информации о реализации драйверов для устройства, а также внутренней структуре ОС, делать такое чревато BSOD.
Можете сделать хак: перехватить MajorFunction[IRP_MJ_PNP] у вашего целевого драйвера (USBSTOR?) и либо: а)фейлить IRP_MJ_START_DEVICE, либо: б) IoInvalidateDeviceState с последующим ответом PNP_DEVICE_FAILED на IRP_MN_QUERY_PNP_DEVICE_STATE (См. http://msdn.microsoft.com/en-us/library/ff546699(VS.85).aspx). Только совместимость с другим софтом, антивирусами, x64 и т.п не гарантируется