Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отловить попытку безопасного отключения флэшки, Работа с usb flash 
V
    Опции темы
soldatx
Дата 25.8.2008, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Добрый день! Прошу помощи в следующей ситуации ... Нужно отловить событие, когда пользователь пытается отключить usb устройство,  в частонсти флэшку, и до ее отключения совершить определенные действия!

Пробовал WM_DeviceChange +  
  DBT_DEVICEQUERYREMOVE = $8001; 
  DBT_DEVICEQUERYREMOVEFAILED = $8002;

однако ни одно из этих сообщений не приходит!

Подскажите какого типа сообщения могут рассылаться, в том случае если пользователь пытается отключить флэшку, но она занята системой, и выдается сообщение, что "данный том не может быть отключен, попробуйте позднее"

Нашел похожую проблемму Отследить чтение/запись с/на флэшку, однако решения там тоже нет.

Это сообщение отредактировал(а) soldatx - 25.8.2008, 10:52
PM MAIL   Вверх
ama_kid
Дата 25.8.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 19
Всего: 95



Цитата(soldatx @  25.8.2008,  11:42 Найти цитируемый пост)
Пробовал WM_DeviceChange
Вроде как надо зарегистрироваться с типом DBT_DEVTYP_HANDLE на получение этих сообщений
Ну и как вариант - написать свой маленький драйвер-фильтр и отлавливать IRP_MN_QUERY_REMOVE_DEVICE...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Riply
Дата 25.8.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(ama_kid @  25.8.2008,  11:41 Найти цитируемый пост)
Вроде как надо зарегистрироваться с типом DBT_DEVTYP_HANDLE на получение этих сообщений


Вот с этой регистрацией мне не удалось до конца разобраться, когда я с этим возилась.
Дело в том, что приходили сообщения как с ней так и без нее.
В чем причина (работы и без регистрации) я так и не поняла. Это может зависеть от каких нибудь настроек системы ?
(Хотя у меня они почти все по-умолчанию)
PM MAIL   Вверх
ama_kid
Дата 25.8.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 19
Всего: 95



Цитата(Riply @  25.8.2008,  12:50 Найти цитируемый пост)
Дело в том, что приходили сообщения как с ней так и без нее.
Некоторые сообщения приходят и без регистрации:
Цитата(МСДН)
The DBT_DEVICEARRIVAL and DBT_DEVICEREMOVECOMPLETE events are automatically broadcast to all top-level windows for port devices...
На остальные - надо регистрироваться... Хотя сейчас точно не скажу, давно уже этой темой не знанимался, но вроде бы у меня работало...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
soldatx
Дата 25.8.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Цитата
Вроде как надо зарегистрироваться с типом DBT_DEVTYP_HANDLE на получение этих сообщений
Ну и как вариант - написать свой маленький драйвер-фильтр и отлавливать IRP_MN_QUERY_REMOVE_DEVICE...

Спасибо за помощь, буду разбираться дальше! О результатах непременно сообщю. Драйвера правда еще не пробовал писать, но чем не повод  smile 
PM MAIL   Вверх
ama_kid
Дата 25.8.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 19
Всего: 95



Цитата(soldatx @  25.8.2008,  13:50 Найти цитируемый пост)
Драйвера правда еще не пробовал писать, но чем не повод  smile  
Пробуй  smile 



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
soldatx
Дата 26.8.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Так потихоньку продвигаемся, подскажите литературку которая объяснит как

вот это 
Код

typedef struct _DEV_BROADCAST_HANDLE {
  DWORD dbch_size;
  DWORD dbch_devicetype;
  DWORD dbch_reserved;
  HANDLE dbch_handle;
  HDEVNOTIFY dbch_hdevnotify;
  GUID dbch_eventguid;
  LONG dbch_nameoffset;
  BYTE dbch_data[1];
} DEV_BROADCAST_HANDLE *PDEV_BROADCAST_HANDLE;

привести к рабочей структуре в Delphi
PM MAIL   Вверх
ama_kid
Дата 26.8.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 19
Всего: 95



Цитата(soldatx @  26.8.2008,  11:17 Найти цитируемый пост)
подскажите литературку
зачем литература? Переведи сам. Как-то так приерно:
Код
type
  PDEV_BROADCAST_HANDLE = ^DEV_BROADCAST_HANDLE;
  _DEV_BROADCAST_HANDLE = record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
    dbch_handle: THandle;         
    dbch_hdevnotify: HDEVNOTIFY; 
    dbch_eventguid: TGUID;
    dbch_nameoffset: Longint;         
    dbch_data: array [0..0] of BYTE; 
  end;
  DEV_BROADCAST_HANDLE = _DEV_BROADCAST_HANDLE;




--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
soldatx
Дата 26.8.2008, 12:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Ну вот проблемма и решена! Спасибо большое ama_kid. Собственно бился над PDEV_BROADCAST_HANDLE ибо програмлю  всего около месяца,  Вот то что у меня получилось, прозьба поправить если что где забыл или не учел.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;



type
  PDEV_BROADCAST_HANDLE = ^DEV_BROADCAST_HANDLE;
  _DEV_BROADCAST_HANDLE = record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
    dbch_handle: THandle;         
    dbch_hdevnotify: HDEVNOTIFY; 
    dbch_eventguid: TGUID;
    dbch_nameoffset: Longint;         
    dbch_data: array [0..0] of BYTE; 
  end;
  DEV_BROADCAST_HANDLE = _DEV_BROADCAST_HANDLE;




  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
  procedure WMDeviceChange(var Msg: TMessage);message WM_DeviceChange;

    { Public declarations }
  end;


  const
  DBT_DeviceArrival = $8000;
  DBT_DeviceRemoveComplete = $8004;
  DBT_DEVICEQUERYREMOVE = $8001;  // wants to remove, may fail
  DBT_DEVICEQUERYREMOVEFAILED = $8002;
  DBT_DEVTYP_HANDLE = $00000006;


var
  Form1: TForm1;

implementation

{$R *.dfm}
 var
r:pointer;
hdir:Cardinal;
procedure TForm1.WMDeviceChange(var Msg: TMessage);
var
  Drive: string;
begin

  case Msg.wParam of
    DBT_DeviceArrival:ShowMessage('inserted');
    DBT_DeviceRemoveComplete:ShowMessage('removed');
    DBT_DEVICEQUERYREMOVE:
    begin
    ShowMessage('query');
    CloseHandle(hdir);
    end;
    DBT_DEVICEQUERYREMOVEFAILED:
    begin
    ShowMessage('query failed');
    end;

  end;

end;


procedure TForm1.Button1Click(Sender: TObject);
var
dbi: DEV_BROADCAST_HANDLE;
Size: Integer;

begin

Size := SizeOf(DEV_BROADCAST_HANDLE);
ZeroMemory(@dbi, Size);
dbi.dbch_size := Size;
dbi.dbch_devicetype := DBT_DEVTYP_HANDLE;
dbi.dbch_reserved := 0;
hdir:=CreateFile ('j:\',GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE
   or FILE_SHARE_DELETE,nil,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0);
dbi.dbch_handle:=hdir;


r := RegisterDeviceNotification(Form1.Handle, @dbi,
  DEVICE_NOTIFY_WINDOW_HANDLE
  );

if Assigned(r) then ShowMessage('assign') ;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnregisterDeviceNotification(r);
end;

end.

PM MAIL   Вверх
soldatx
Дата 27.8.2008, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2008

Репутация: нет
Всего: нет



Что ж всем спасибо, вопрос считаю решенным!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1314 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.