![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
GenDisk, ⇐ ПредыдущаяСтр 3 из 3
где t* – тип устройства (для USB-накопителей DISK); v(8) – идентификатор производителя из 8 символов; p(16) – идентификатор продукта; r(4) – идентификатор версии разработки. Идентификатор оборудования необходим для точного подбора драйвера для устройства. Кроме идентификатора устройства (device ID) каждый накопитель имеет идентификатор экземпляра (instance ID), который отличает устройство от других устройств того же типа. Идентификатор экземпляра может определять устройство относительно шины (например, учитывать USB-порт, к которому подключено устройство) или представлять глобально уникальный дескриптор (например, серийный номер устройства). Идентификаторы устройства и экземпляра дают идентификатор экземпляра устройства (device instance ID, DIID или код экземпляра устройства), который однозначно идентифицирует экземпляр устройства в системе. Просмотреть код экземпляра устройства можно в диспетчере устройств, выбрав интересующее дисковое устройство и перейдя на вкладку «Сведений» в свойствах этого устройства. Например: код экземпляра устройства USBSTOR\DISK& VEN_JETFLASH& PROD_TS256MJF2A/120& REV_8.07\6& 38D7AE47& 0& 7ZNDZ4S6& 0 содержит идентификатор устройства USBSTOR\DISK& VEN_JETFLASH& PROD_TS256MJF2A/120& REV_8.07 и идентификатор экземпляра 6& 38D7AE47& 0& 7ZNDZ4S6& 0. Идентификатор оборудования для того же устройства содержит: USBSTOR\DiskJetFlashTS256MJF2A/120__8.07 USBSTOR\DiskJetFlashTS256MJF2A/120__ USBSTOR\DiskJetFlash USBSTOR\JetFlashTS256MJF2A/120__8 JetFlashTS256MJF2A/120__8 USBSTOR\GenDisk GenDisk ПРИЛОЖЕНИЕ А Листинг 1 – Программа EjectFlesh program EjectFlesh; {$MODE OBJFPC}
Uses Windows, strings;
Const setupapi = 'SetupApi.dll'; GUID_DEVCLASS_DISKDRIVE: TGUID = (D1: $4D36E967; D2: $E325; D3: $11CE; D4: ($BF, $C1, $08, $00, $2B, $E1, $03, $18)); // GUID класса накопителей GUID_DEVCLASS_USB: TGUID = (D1: $36FC9E60; D2: $C465; D3: $11CF; D4: ($44, $45, $53, $54, $00, $00, $00, $00)); // GUID класса хост-контроллера и USB хабов;
Type HDEVINFO = THandle;
PSP_DEVINFO_DATA = ^SP_DEVINFO_DATA; SP_DEVINFO_DATA = packed record cbSize: DWORD; ClassGuid: TGUID; DevInst: DWORD; Reserved: DWORD; end;
Var q: char; hDevInfoSet: HDEVINFO; DevInfo: SP_DEVINFO_DATA; i: Integer; Parent: DWORD; VetoName: PChar; VetoNameString: String;
// функции из SetupApi.dll function SetupDiGetClassDevsA(ClassGuid: PGUID; Enumerator: PChar; hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall; external setupapi; function SetupDiEnumDeviceInfo(DeviceInfoSet: HDEVINFO; MemberIndex: DWORD; DeviceInfoData: PSP_DEVINFO_DATA): boolean; stdcall; external setupapi; function SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO): boolean; stdcall; external setupapi; function CM_Get_Parent(pdnDevInst: PDWORD; dnDevInst: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi; function CM_Get_Device_ID_Size(pulLen: PDWORD; dnDevInst: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi; function CM_Get_Device_IDA(dnDevInst: DWORD; Buffer: PChar; BufferLen: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi; function CM_Locate_DevNodeA(pdnDevInst: PDWORD; pDeviceID: PChar; ulFlags: DWORD): DWORD; stdcall; external setupapi; function CM_Request_Device_EjectA(dnDevInst: DWORD; pVetoType: Pointer; pszVetoName: PChar; ulNameLength: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi;
function CompareMem(p1, p2: Pointer; len: DWORD): boolean; Var i: DWORD; Begin result: = false; if len = 0 then exit; for i: = 0 to len-1 do if PByte(DWORD(p1) + i)^ < > PByte(DWORD(p2) + i)^ then exit; result: = true; End;
function IsUSBDevice(DevInst: DWORD): boolean; Var IDLen: DWORD; ID: PChar; IDString: String; Begin result: = false; IDString: = ''; if (CM_Get_Device_ID_Size(@IDLen, DevInst, 0) < > 0) or (IDLen = 0) then exit; inc(IDLen); ID: = GetMemory(IDLen); if ID = nil then exit; if ((CM_Get_Device_IDA(DevInst, ID, IDLen, 0) < > 0) or (not (CompareMem(ID, PChar('USBSTOR'), 7)))) then begin IDString: = StrPas(ID); FreeMemory(ID); exit; end; IDString: = StrPas(ID); Write('Eject flash-disk? (y - yes; Any other key - no)'); ReadLn(q); if q = 'y' then result: = true; FreeMemory(ID); End; BEGIN DevInfo.cbSize: = sizeof(SP_DEVINFO_DATA); hDevInfoSet: = SetupDiGetClassDevsA(@GUID_DEVCLASS_DISKDRIVE, nil, 0, 2); if hDevInfoSet = INVALID_HANDLE_VALUE then exit; i: = 0; while (SetupDiEnumDeviceInfo(hDevInfoSet, i, @DevInfo)) do begin if IsUSBDevice(DevInfo.DevInst) then begin if CM_Get_Parent(@Parent, DevInfo.DevInst, 0) = 0 then begin VetoName: = GetMemory(260); if (CM_Request_Device_EjectA(Parent, nil, VetoName, 260, 0) < > 0) then begin if (CM_Locate_DevNodeA(@Parent, VetoName, 0) < > 0) then begin FreeMemory(VetoName); continue; end; FreeMemory(VetoName); if (CM_Request_Device_EjectA(Parent, nil, nil, 0, 0) < > 0) then continue; end; VetoNameString: = StrPas(VetoName); FreeMemory(VetoName); break; end; end; inc(i); end; SetupDiDestroyDeviceInfoList(hDevInfoSet); END.
|