Здравствуйте, argent, Вы писали:
A>Мне нужно такое же действие, какое в юзермоде производит DefineDosDevice. В том числе, рассылая сообщения, например explorer, чтобы он правильно отображал определенные устройства.
Так ведь DefineDosDevice() для удалении линка всё равно в итоге вызовит IoDeleteSymbolicLink().
А>>И совершенно не понимаю зачем создавать эту самую символьную ссылку из Ring3 ?
A>Сейчас я делаю это из юзермода, но если это приложение закроют, было бы не плохо, если бы драйвер умел это делать сам.
Это просто:
// с помощью этого вызова ядра установи свой callback на
// создание/уничтожение процесса
NTSTATUS
PsSetCreateProcessNotifyRoutine(
IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
IN BOOLEAN Remove
);
// когда твой callback в драйвере будет вызван с Create = FALSE,
// это значит процесс с хендлом ProcessId сейчас будет уничтожен.
// проверишь хендл, если твоего app - удаляешь ссылку в драйвере
VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE) (
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
);
А>>Это есть необходимое условие? Если нет, то создавай и удаляй ссылку в драйвере.
A>Да, именно в драйвере мне и нужно это сделать. проблема только с сообщением (WM_DEVICECHANGE,DBT_DEVICEARRIVAL), (ну или WM_DEVICECHANGE , DBT_DEVTYP_VOLUME), как из разослать броадкастом из драйвера?
Возможно, поможет вызов ядра
NTSTATUS
IoReportTargetDeviceChange(
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PVOID NotificationStructure
);