Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






GenDisk,






где 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.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.