Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Вниз

usb   Найти похожие ветки 

 
apic ©   (2007-09-27 15:14) [0]

Как программно отключить usb flashdisk


 
Rouse_ ©   (2007-09-27 15:27) [1]

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : USBStateChange
//  * Purpose   : Пример включения.отключения USB накопителей
//  * Author    : Александр (Rouse_) Багель
//  * Copyright : © Fangorn Wizards Lab 1998 - 2007
//  * Version   : 1.00
//  * Home Page : http://rouse.drkb.ru
//  ****************************************************************************
//

unit USBStateChange;

interface

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

type
 TForm6 = class(TForm)
   btnEnable: TButton;
   btnDisable: TButton;
   procedure btnEnableClick(Sender: TObject);
   procedure btnDisableClick(Sender: TObject);
 end;

var
 Form6: TForm6;

implementation

{$R *.dfm}

type
 PSP_CLASSINSTALL_HEADER = ^SP_CLASSINSTALL_HEADER;
 SP_CLASSINSTALL_HEADER = record
   cbSize: DWORD;
   InstallFunction: Cardinal;
 end;

 PSP_PROPCHANGE_PARAMS = ^SP_PROPCHANGE_PARAMS;
 SP_PROPCHANGE_PARAMS = record
   ClassInstallHeader: SP_CLASSINSTALL_HEADER;
   StateChange: DWORD;
   Scope: DWORD;
   HwProfile: DWORD;
 end;

 PSP_DEVINFO_DATA = ^SP_DEVINFO_DATA;
 SP_DEVINFO_DATA = record
   cbSize: DWORD;
   ClassGuid: TGUID;
   DevInst: DWORD;
   Reserved: Longint;
 end;

 function SetupDiGetClassDevs(const ClassGuid: PGUID; Enumerator: PChar;
   hwndParent: HWND; Flags: DWORD): DWORD; stdcall;
   external "Setupapi.dll" name "SetupDiGetClassDevsA";

 function SetupDiDestroyDeviceInfoList(DeviceInfoSet: DWORD): BOOL; stdcall;
   external "Setupapi.dll";

 function SetupDiEnumDeviceInfo(DeviceInfoSet: DWORD; MemberIndex: DWORD;
   DeviceInfoData: PSP_DEVINFO_DATA): BOOL; stdcall;
   external "Setupapi.dll";

 function SetupDiCallClassInstaller(InstallFunction: DWORD;
   DeviceInfoSet: DWORD; DeviceInfoData: PSP_DEVINFO_DATA): BOOL; stdcall;
   external "setupapi.dll";

 function SetupDiGetDeviceRegistryProperty(DeviceInfoSet: DWORD;
   DeviceInfoData: PSP_DEVINFO_DATA; Propertys: DWORD; PropertyRegDataType: PWORD;
   PropertyBuffer: PByte; PropertyBufferSize: DWORD; RequiredSize: PWORD): BOOL; stdcall;
   external "Setupapi.dll" name "SetupDiGetDeviceRegistryPropertyA";

 function SetupDiSetClassInstallParams(DeviceInfoSet: DWORD;
   DeviceInfoData: PSP_DEVINFO_DATA; ClassInstallParams: PSP_CLASSINSTALL_HEADER;
   ClassInstallParamsSize: DWORD): BOOL; stdcall;
   external "setupapi.dll" name "SetupDiSetClassInstallParamsA";

const
 DICS_ENABLE = $00000001;
 DICS_DISABLE = $00000002;
 DIF_PROPERTYCHANGE = $00000012;
 DICS_FLAG_GLOBAL = $00000001;
 DIGCF_PRESENT = $00000002;
 SPDRP_COMPATIBLEIDS = $00000002;

 DISK_GUID: TGUID = "{4D36E967-E325-11CE-BFC1-08002BE10318}";

function ChangeDeviceState(AState: DWORD): Boolean;
var
 pcp: SP_PROPCHANGE_PARAMS;
 DevInfoData: SP_DEVINFO_DATA;
 hDevInfo1:  DWORD;
 I, DataT, Buffersize: DWORD;
 Buffer: PAnsiChar;
begin
 Result := False;
 pcp.ClassInstallHeader.cbSize := sizeof(SP_CLASSINSTALL_HEADER);
 pcp.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
 pcp.StateChange := AState;
 pcp.Scope := DICS_FLAG_GLOBAL;
 pcp.HwProfile := 0;
 hDevInfo1 := SetupDiGetClassDevs(@DISK_GUID, nil, HWND(nil), DIGCF_PRESENT);
 try
   DevInfoData.cbSize := sizeof(SP_DEVINFO_DATA);
   I := 0;
   Buffersize := 500;
   GetMem(Buffer, Buffersize);
   try
     while SetupDiEnumDeviceInfo(hDevInfo1, I, @DevInfoData) do
     begin
       SetupDiGetDeviceRegistryProperty(hDevInfo1, @DevInfoData,
         SPDRP_COMPATIBLEIDS, @DataT, PByte(Buffer), Buffersize, nil);
       if buffer = "USBSTOR\Disk" then
       begin
         if not SetupDiSetClassInstallParams(hDevInfo1,
           @DevInfoData, PSP_CLASSINSTALL_HEADER(@pcp), SizeOf(pcp)) then Exit;
         if not SetupDiCallClassInstaller(
           DIF_PROPERTYCHANGE, hDevInfo1, @DevInfoData) then Exit;
         Result := True;
       end;
       Inc(I);
     end;
   finally
     FreeMem(Buffer);
   end;
 finally
   SetupDiDestroyDeviceInfoList(hDevInfo1);
 end;
end;

procedure TForm6.btnEnableClick(Sender: TObject);
begin
 if ChangeDeviceState(DICS_ENABLE) then
   ShowMessage("Устройство включено");
end;

procedure TForm6.btnDisableClick(Sender: TObject);
begin
 if ChangeDeviceState(DICS_DISABLE) then
   ShowMessage("Устройство отключено");
end;

end.


 
apic ©   (2007-09-27 15:51) [2]

Ты просто монстр, в хорошем смысле слова! Огромное тебе спасибо - это то, что мне нужно!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.041 c
2-1210659659
Михаил (Питер)
2008-05-13 10:20
2008.06.08
Параметры к программе


3-1199809422
Slimer
2008-01-08 19:23
2008.06.08
Zeos & MySQL 4.1+


2-1210956768
Res
2008-05-16 20:52
2008.06.08
ExtractRes


15-1209194604
USB
2008-04-26 11:23
2008.06.08
USB 1.1 или 2.0


15-1209129036
Пробегал2...
2008-04-25 17:10
2008.06.08
Универсальная COM / UDP передача





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский