DefineDosDevice-удалить устройство из драйвера?
От: argent  
Дата: 28.08.06 15:22
Оценка:
Доброговремени суток уважаемый All.

Помогите плиз, если кто сможет с такой проблемой.
Есть драйвер — создает устройство.
Есть юзерское приложение — делает на это устройство DefineDosDevice, после чего устройство юзается.
Если из приложения выходят — делаю DefineDosDevice с DDD_REMOVE_DEFINITION, устройство пропадает.

Однако что можно сделать, если приложение снято? Драйвер догадывается, что юзерское приложение мертво, отвечает на все IRP "устройство не готово", но ссылка продолжает висеть.

Может есть возможность связать время жизни этой ссылки с временем жизни приложения, которое ее создало? Или может есть возможность удалить ее из драйвера? ...Либо создать новый юзерский процесс, и проинитить ему окружение, либо атачится к существующему, смотреть пользует ли он crs, и выполнять от его имени? А может есть какой другой путь?

С уважением, argent.
Жить будем плохо, но не долго...
Re: DefineDosDevice-удалить устройство из драйвера?
От: Аноним  
Дата: 28.08.06 16:32
Оценка:
Здравствуйте, argent, Вы писали:

Так в чём проблема-то? Если нужно удалить символьную ссылку из драйвера, то для этого есть

NTSTATUS 
  IoDeleteSymbolicLink(
    IN PUNICODE_STRING  SymbolicLinkName
    );


И совершенно не понимаю зачем создавать эту самую символьную ссылку из Ring3 ? Это есть необходимое условие? Если нет, то создавай и удаляй ссылку в драйвере. Или надо, чтобы только твоё приложение могло его юзать? Так это всё равно не получиться, т.к. пока твоё приложение работает, другое тоже может подключиться по этой же ссылке.
Re[2]: DefineDosDevice-удалить устройство из драйвера?
От: argent  
Дата: 28.08.06 16:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Так в чём проблема-то? Если нужно удалить символьную ссылку из драйвера, то для этого есть


А>
А>NTSTATUS 
А>  IoDeleteSymbolicLink(
А>    IN PUNICODE_STRING  SymbolicLinkName
А>    );
А>


Мне нужно такое же действие, какое в юзермоде производит DefineDosDevice. В том числе, рассылая сообщения, например explorer, чтобы он правильно отображал определенные устройства.

А>И совершенно не понимаю зачем создавать эту самую символьную ссылку из Ring3 ?


Сейчас я делаю это из юзермода, но если это приложение закроют, было бы не плохо, если бы драйвер умел это делать сам.

А>Это есть необходимое условие? Если нет, то создавай и удаляй ссылку в драйвере.


Да, именно в драйвере мне и нужно это сделать. проблема только с сообщением (WM_DEVICECHANGE,DBT_DEVICEARRIVAL), (ну или WM_DEVICECHANGE , DBT_DEVTYP_VOLUME), как из разослать броадкастом из драйвера?

А>Или надо, чтобы только твоё приложение могло его юзать? Так это всё равно не получиться, т.к. пока твоё приложение работает, другое тоже может подключиться по этой же ссылке.


Нет, мое приложение производит данные для этого устройства, а все остальные используют его как диск.

С Уважением, Геннадий.
Жить будем плохо, но не долго...
Re[3]: DefineDosDevice-удалить устройство из драйвера?
От: Аноним  
Дата: 28.08.06 18:14
Оценка:
Здравствуйте, 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
    );
Re: DefineDosDevice-удалить устройство из драйвера?
От: Sergey Storozhevykh Россия  
Дата: 29.08.06 06:29
Оценка:
Здравствуйте, argent, Вы писали:

A> Однако что можно сделать, если приложение снято? Драйвер догадывается, что юзерское приложение мертво, отвечает на все IRP "устройство не готово", но ссылка продолжает висеть.


Я бы ничего не делал. Приложение может завершиться некорректно в двух случаях: 1) ошибка в самом приложении; 2) попытка убить процесс со стороны внешних программ. В первом случае нужно отлаживать свой код, а во втором — вы не виноваты. Task Manager же выдает предупреждение, типа "завершение процесса может привести к непредсказуемым последствиям". Т.е. это "нормально", что у вас остаются хвосты в виде ссылок и т.п. К этому все готовы и "винить" вас никто не будет.
Re[4]: DefineDosDevice-удалить устройство из драйвера?
От: argent  
Дата: 29.08.06 08:34
Оценка:
Здравствуйте, Аноним, Вы писали:
пожалуйста следите за объемом цитирования — модератор
сейчас попробую... хотя сдается мне что PnP здесь совсем ни при чем, мы же просто создаем символическую ссылку, и связываем ее с устройством...
Жить будем плохо, но не долго...
Re[2]: DefineDosDevice-удалить устройство из драйвера?
От: Аноним  
Дата: 29.08.06 09:47
Оценка:
Здравствуйте, Sergey Storozhevykh, Вы писали:

SS>Здравствуйте, argent, Вы писали:


A>> Однако что можно сделать, если приложение снято? Драйвер догадывается, что юзерское приложение мертво, отвечает на все IRP "устройство не готово", но ссылка продолжает висеть.


SS>Я бы ничего не делал. Приложение может завершиться некорректно в двух случаях: 1) ошибка в самом приложении; 2) попытка убить процесс со стороны внешних программ. В первом случае нужно отлаживать свой код, а во втором — вы не виноваты. Task Manager же выдает предупреждение, типа "завершение процесса может привести к непредсказуемым последствиям". Т.е. это "нормально", что у вас остаются хвосты в виде ссылок и т.п. К этому все готовы и "винить" вас никто не будет.


Вы не правы. Это тоже самое, если бы Microsoft сказали, что "мы не виноваты, что случаются утечки памяти у криворуких программистов, пусть они отлаживают свои программы!". Но тем не менее Windows старается прибрать за завершённым/убитым процессом, и тем не менее Microsoft разработали .NET Framework. Автор стремится к идеалу, и он прав.
Re[5]: DefineDosDevice-удалить устройство из драйвера?
От: Аноним  
Дата: 29.08.06 10:09
Оценка:
Здравствуйте, argent, Вы писали:

пожалуйста следите за объемом цитирования — модератор

A>сейчас попробую... хотя сдается мне что PnP здесь совсем ни при чем, мы же просто создаем символическую ссылку, и связываем ее с устройством...


Некоторые выдержки из документации про этот вызов, на которые хотел бы обратить внимание:

Do not use this routine to report system PnP events, such as GUID_TARGET_DEVICE_REMOVE_COMPLETE.


Это значит, что нельзя использовать системные события, т.е. драйвер должен уведомлять только о конкретных событиях своего девайса.

Custom notification can be used for events like a volume label change.


Ну, уж если этот вызов используется, чтобы уведомить систему о смене метки тома (volume label), то уж для уведомления о создании/удалении тома тоже подойдёт. Я думаю, сначала нужно удалить символьную ссылку, затем уведомить систему о том, что том уничтожен.

IoReportTargetDeviceChange is not supported on Windows 98/Me; it returns STATUS_NOT_IMPLEMENTED.


Не поддерживается для Windows 9x.

To report a target device change from raised IRQL, call IoReportTargetDeviceChangeAsynchronous.


На повышенном IRQ уровне использовать

NTSTATUS 
  IoReportTargetDeviceChangeAsynchronous(
    IN PDEVICE_OBJECT  PhysicalDeviceObject,
    IN PVOID  NotificationStructure,
    IN PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  OPTIONAL,
    IN PVOID  Context  OPTIONAL
    );


Да, и в качестве евента там надо сгенерить свой гуид.
Re[3]: DefineDosDevice-удалить устройство из драйвера?
От: Sergey Storozhevykh Россия  
Дата: 29.08.06 11:07
Оценка:
Здравствуйте, Аноним, Вы писали:

SS>>Я бы ничего не делал. Приложение может завершиться некорректно в двух случаях: 1) ошибка в самом приложении; 2) попытка убить процесс со стороны внешних программ. В первом случае нужно отлаживать свой код, а во втором — вы не виноваты. Task Manager же выдает предупреждение, типа "завершение процесса может привести к непредсказуемым последствиям". Т.е. это "нормально", что у вас остаются хвосты в виде ссылок и т.п. К этому все готовы и "винить" вас никто не будет.


А>Вы не правы. Это тоже самое, если бы Microsoft сказали, что "мы не виноваты, что случаются утечки памяти у криворуких программистов, пусть они отлаживают свои программы!". Но тем не менее Windows старается прибрать за завершённым/убитым процессом, и тем не менее Microsoft разработали .NET Framework. Автор стремится к идеалу, и он прав.


Не согласен. Аналогия кривая. Не про криворуких прораммистов речь, О пользователях. Которые киляют процессы, будучи предупреждены о возможных негативных последствиях. Тут, простите, и Microsoft бессильна. Попробуйте убить winlogon, smss и еще чего-нибудь из разряда system support processes.

Я не спорю, автор должен стремиться к идеалу, но заниматься восстановлением работоспособности системы после сбоя, к тому же инициированного извне, это тема отдельная. И все сценарии тут все равно не предусмотришь. Что если тот же пользователь выгрузит драйвер? Приложение будет его обратно загружать? Этих "если" может быть очень много. И целенаправленно заниматься этой проблемой можно и нужно, когда это настолько критично, что иначе капец. В security-решениях, например.
Re[6]: DefineDosDevice-удалить устройство из драйвера?
От: straightener Россия  
Дата: 30.08.06 10:31
Оценка:
Люди, вы по-аккуратней используйте пнпшные функции с легаси девайсами. Эти функции ожидают увидеть внутри девайса указатель на девноду и если он будет нулевым, то неприятно может быть... А у легаси устройств отродясь девноды не было...
Re[7]: DefineDosDevice-удалить устройство из драйвера?
От: argent  
Дата: 30.08.06 20:32
Оценка:
Здравствуйте, straightener, Вы писали:

S>Люди, вы по-аккуратней используйте пнпшные функции с легаси девайсами. Эти функции ожидают увидеть внутри девайса указатель на девноду и если он будет нулевым, то неприятно может быть... А у легаси устройств отродясь девноды не было...


дык как же быть с легаси девайсами? как удалить на них ссылку писали в "SymbolicLink и XP (29-10-2004) asm", но какую и кому нотификацию полсе этого нужно послать, чтобы диск исчез из списка дисков всех файловых менеджеров?
Жить будем плохо, но не долго...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.