Небходимо перехватить подключение USB-FLASH и отключить USB порт к которому подключена эта флэха. Помогите кто чем может.
Здравствуйте, SaZaN, Вы писали:
SZN>Небходимо перехватить подключение USB-FLASH и отключить USB порт к которому подключена эта флэха. Помогите кто чем может.
По поводу перехватить — читаем МСДН про сообщение WM_DEVICECHANGE
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Panel1: TPanel;
rgDeviceType: TRadioGroup;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Uses SetupApi;
procedure TForm1.Button2Click(Sender: TObject);
var
Guid : TGUID;
PnPHandle: HDevInfo;
DeviceInfoData : SP_DEVINFO_DATA;
DeviceInterfaceData: SP_DEVICE_INTERFACE_DATA;
i : Cardinal;
Success: LongBool;
DataT, buffersize: Cardinal;
buffer : PByte;
Const
DisplayGuid : TGUID = '{4d36e968-e325-11ce-bfc1-08002be10318}';
HidGuid : TGUID = '{745a17a0-74d3-11d0-b6fe-00a0c90f57da}';
USBGuid : TGUID = '{36FC9E60-C465-11CF-8056-444553540000}';
begin
ListBox1.Clear;
If rgDeviceType.ItemIndex = 0 then begin // Все устройства
PnPHandle:= SetupDiGetClassDevs(nil, nil, 0, DIGCF_PRESENT or DIGCF_ALLCLASSES);
End else begin
Case rgDeviceType.ItemIndex of
1: Guid:= DisplayGuid; // Все видеоадаптеры
2: Guid:= USBGuid; // Все USB-устройства
3: Guid:= HidGuid; // Все HID-устройства
End;
PnPHandle:= SetupDiGetClassDevs(@Guid, nil, 0, DIGCF_PRESENT);
End;
Try
i:= 0;
DeviceInfoData.cbSize:= SizeOf(SP_DEVINFO_DATA);
DeviceInterfaceData.cbSize := SizeOf(SP_DEVICE_INTERFACE_DATA);
Repeat
Success:= SetupDiEnumDeviceInfo(PnPHandle, i, DeviceInfoData);
If Success then begin
buffer:= nil;
buffersize:= 0;
while not SetupDiGetDeviceRegistryProperty
(
PnPHandle,
DeviceInfoData,
SPDRP_DEVICEDESC,
DataT,
buffer,
buffersize,
buffersize
)
do begin
if (GetLastError() = ERROR_INSUFFICIENT_BUFFER) then begin
if (buffer <> nil) then FreeMem(buffer);
buffer:= AllocMem(buffersize);
end else begin
break;
end;
end;
ListBox1.Items.Add(Format('%d: %s',[i, StrPas(PChar(buffer))]));
if (buffer <> nil) then FreeMem(buffer);
End;
Inc(i);
Application.ProcessMessages;
until not Success;
Finally
SetupDiDestroyDeviceInfoList(PnPHandle);
End;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// если используется динамическая загрузка библиотеки
// LoadSetupApi;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// если используется динамическая загрузка библиотеки
// UnloadSetupApi;
end;
end.