
Бывалый

Профиль
Группа: Участник
Сообщений: 203
Регистрация: 18.7.2006
Где: Калининград
Репутация: нет Всего: нет
|
короче код.....ща пришлю смотрите, а потом уточню че хотелось бы , чтоб там было... Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, UsbTypes;
type TForm1 = class(TForm) LogListBox: TListBox; Panel1: TPanel; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormActivate(Sender: TObject); private procedure Log(S : String); public procedure EnumerateHostDevices(hHost : THandle); procedure ShowRootHubInfo(RootHubName : String); procedure ShowRootHubDetail(hRoot : THandle); procedure ShowHubPortDetail(hRoot : THandle; iPort : Integer); procedure ShowDeviceDetail(hRoot : THandle; iPort : Integer); procedure DisplayDescriptorInfo(Data : Array of byte; var IsHid : Boolean); procedure DisplayREPORTDescriptorInfo(Data : Array of byte); end;
var Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.Log(S : String); begin LogListBox.Items.Add(S); LogListBox.ItemIndex:= LogListBox.Items.Count-1; end;
// Íóìåðàöèÿ õîñòîâ procedure TForm1.EnumerateHostDevices(hHost : THandle); var Success : LongBool; DeviceName : TDeviceName; BytesReturned : Cardinal; begin // Ïîëó÷àåì èìÿ õîñò êîíòðîëëåðà (IOCTL_GET_HCD_DRIVERKEY_NAME) Success:= DeviceIoControl(hHost, GetUSBCtlCode(10), @DeviceName, SizeOf(DeviceName), @DeviceName, sizeof(DeviceName), BytesReturned, nil ); If not(Success) then begin Log(' Îøèáêà ïîëó÷åíèÿ èìåíè êîíòðîëëåðà'); Exit; End;
Log(Format(' Èìÿ êîíòðîëëåðà : %s',[WideCharToString(@DeviceName.Name)]));
// Ïîëó÷àåì èìÿ êîðíåâîãî õàáà (IOCTL_USB_GET_ROOT_HUB_NAME) Success:= DeviceIoControl(hHost, GetUSBCtlCode(3), @DeviceName, SizeOf(DeviceName), @DeviceName, sizeof(DeviceName), BytesReturned, nil ); If not(Success) then begin Log(' Îøèáêà ïîëó÷åíèÿ èìåíè õàáà'); Exit; End; Log(Format(' Èìÿ êîðíåâ. õàáà: %s',[WideCharToString(@DeviceName.Name)])); // îòîáðàæåíèå èíôîðìàöèè î êîðíåâîì õàáå ShowRootHubInfo(WideCharToString(@DeviceName.Name)); end; //--------------------------------------------------------------------------
procedure TForm1.ShowRootHubInfo(RootHubName : String); var sRoot : String; hRoot : THandle; SA : SECURITY_ATTRIBUTES; begin // Ôîðìèðîâàíèå SA SA.nLength:= SizeOf(SECURITY_ATTRIBUTES); SA.lpSecurityDescriptor:= nil; SA.bInheritHandle:= False;
// Ïîëó÷àåì ïîëíîå èìÿ êîðíåâîãî õàáà èç PnP-èìåíè sRoot:= Format('\\.\%s', [RootHubName]); // Ïðîáóåì îòêðûòü hRoot:= CreateFile(PChar(@sRoot[1]), GENERIC_WRITE, FILE_SHARE_WRITE, @SA, OPEN_EXISTING, 0, 0 ); If (hRoot <> INVALID_HANDLE_VALUE) then begin // Îòîáðàæåíèå èíôîðìàöèè î êîðíåâîì õàáå ShowRootHubDetail(hRoot); CloseHandle(hRoot); End else begin Log(' Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè îò õàáà'); End; end;
// Îòîáðàæåíèå èíôîðìàöèè î êîðíåâîì õàáå procedure TForm1.ShowRootHubDetail(hRoot : THandle); var Success : LongBool; NodeInformation : TNodeInformation; BytesReturned : Cardinal; iPort : Byte; begin // Ïîëó÷åíèå èíôîðìàöèè î êîðíåâîì õàáå (IOCTL_USB_GET_NODE_INFORMATION) Success:= DeviceIoControl(hRoot, GetUSBCtlCode(3), @NodeInformation, sizeof(NodeInformation), @NodeInformation, sizeof(NodeInformation), BytesReturned, nil ); If not(Success) then begin Log(' Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè î õàáå'); Exit; End; // Îòîáðàæåíèå èíôðîìàöèè î ïîðòàõ õàáà Log(Format(' ×èñëî ïîðòîâ: %d', [NodeInformation.HubDescriptor.bNumberOfPorts])); For iPort:= 0 to NodeInformation.HubDescriptor.bNumberOfPorts-1 do begin // Îòîáðàæåíèå èíôîðìàöèè î ïîðòå ShowHubPortDetail(hRoot, iPort); End; end; //---------------------ShowHubPortDetail------------------------ // Îòîáðàæåíèå èíôîðìàöèè î ïîðòå procedure TForm1.ShowHubPortDetail(hRoot : THandle; iPort : Integer); var Success : LongBool; NodeConnInfo : TNodeConnectionInformation; BytesReturned : Cardinal; PortStatus : Byte; DeviceName : TDeviceName; sRoot : string; SA : SECURITY_ATTRIBUTES; begin // Ôîðìèðîâàíèå SA SA.nLength:= SizeOf(SECURITY_ATTRIBUTES); SA.lpSecurityDescriptor:= nil; SA.bInheritHandle:= False; NodeConnInfo.ConnectionIndex:= iPort+1; // íóìåðàöèÿ ñ 1! // IOCTL_USB_GET_NODE_CONNECTION_INFORMATION Success:= DeviceIoControl(hRoot, GetUSBCtlCode(4), @NodeConnInfo, sizeof(NodeConnInfo), @NodeConnInfo, sizeof(NodeConnInfo), BytesReturned, nil ); If not(Success) then begin Log(' Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè î ïîðòå'); Exit; End;
PortStatus:= NodeConnInfo.ConnectionStatus[1]; If (PortStatus <> Byte(DeviceConnected)) then begin If (PortStatus = Byte(NoDeviceConnected)) then begin Log(Format(' Ê ïîðòó %d óñòðîéñòâ íå ïîäêëþ÷åíî',[iPort])); End else Log(Format(' Ñîñòîÿíèå ïîðòà %d = %d',[iPort, Byte(PortStatus)])); End else begin If not(NodeConnInfo.DeviceIsHub) then begin Log(Format(' Ê ïîðòó %d ïîäêëþ÷åíî óñòðîéñòâî', [iPort])); ShowDeviceDetail(hRoot, iPort); End else If (NodeConnInfo.DeviceIsHub) then begin Log(Format(' Ê ïîðòó %d ïîäêëþ÷åí õàá', [iPort])); // ïîñëàòü IOCTL_USB_GET_NODE_CONNECTION_NAME // ïîëó÷èòü äåñêðèïòîð õàáà è ïîâòîðèòü îïåðàöèþ äëÿ // êàæäîãî ïîðòà ýòîãî õàáà // ðåêóðñèÿ: // ShowRootHubDetail(hRoot {: THandle}); // IOCTL_USB_GET_NODE_CONNECTION_INFORMATION Success:= DeviceIoControl(hRoot, GetUSBCtlCode(3), @NodeConnInfo, sizeof(NodeConnInfo), @NodeConnInfo, sizeof(NodeConnInfo), BytesReturned, nil ); Log(Format(' Èìÿ õàáà: %s',[WideCharToString(@DeviceName.Name)])); //--------->get hub name? sRoot:= Format('\\.\%s', [WideCharToString(@DeviceName.Name)]); // Ïðîáóåì îòêðûòü hRoot:= CreateFile(PChar(@sRoot[1]), GENERIC_WRITE, FILE_SHARE_WRITE, @SA, OPEN_EXISTING, 0, 0 ); If (hRoot <> INVALID_HANDLE_VALUE) then begin // Îòîáðàæåíèå èíôîðìàöèè î êîðíåâîì õàáå ShowRootHubDetail(hRoot); CloseHandle(hRoot); End else begin Log(' Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè îò õàáà'); End; If not(Success) then begin Log(' Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè î ïîðòå'); Exit; End; End; End; end;
// Èíôîðìàöèÿ î ïîäêëþ÷åííîì óñòðîéñòâå procedure TForm1.ShowDeviceDetail(hRoot : THandle; iPort : Integer); Var Success : LongBool; Packet : TDescriptorRequest; BytesReturned : Cardinal; IsHID : Boolean; begin // Ïîëó÷åíèå ñòàíäàðòíîãî äåñêðèïòîðà óñòðîéñòâà ZeroMemory(@Packet, SizeOf(Packet)); Packet.ConnectionIndex := iPort+1; Packet.SetupPacket.bmRequest := $80; Packet.SetupPacket.bRequest := USB_REQUEST_GET_DESCRIPTOR; Packet.SetupPacket.wValue [2]:= USB_DEVICE_DESCRIPTOR_TYPE; Packet.SetupPacket.wLength[2]:= 1; // Èñïîëüçîâàòü áóôåð 2 Êá
// IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION Success:= DeviceIoControl(hRoot, GetUSBCtlCode(5), @Packet, sizeof(Packet), @Packet, sizeof(Packet), BytesReturned, nil );
If not(Success) then begin Log(Format(' Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè îá óñòðîéñòâå %s', [ SysErrorMessage(GetLastError())])); Exit; End;
IsHid:= False;
// îòîáðàæåíèå äåñêðèïòîðà óñòðîéñòâà DisplayDescriptorInfo(Packet.Data, IsHid);
// Ïîëó÷åíèå äåñêðèïòîðîâ êîíôèãóðàöèè ZeroMemory(@Packet, SizeOf(Packet)); Packet.ConnectionIndex := iPort+1; Packet.SetupPacket.bmRequest := $80; Packet.SetupPacket.bRequest := USB_REQUEST_GET_DESCRIPTOR; Packet.SetupPacket.wValue [2]:= USB_CONFIGURATION_DESCRIPTOR_TYPE; Packet.SetupPacket.wLength[2]:= 1; // Èñïîëüçîâàòü áóôåð 2 Êá
// IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION Success:= DeviceIoControl(hRoot, GetUSBCtlCode(5), @Packet, sizeof(Packet), @Packet, sizeof(Packet), BytesReturned, nil );
If not(Success) then begin Log(Format(' Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè îá óñòðîéñòâå %s', [ SysErrorMessage(GetLastError())])); Exit; End;
// îòîáðàæåíèå èíôîðìàöèè î äåñêðèïòîðàõ êîíôèãóðàöèè DisplayDescriptorInfo(Packet.Data, IsHid);
If IsHid then begin // Ïîëó÷åíèå äåñêðèïòîðîâ REPORT ZeroMemory(@Packet, SizeOf(Packet)); Packet.ConnectionIndex := iPort+1; Packet.SetupPacket.bmRequest := $80; Packet.SetupPacket.bRequest := USB_REQUEST_GET_DESCRIPTOR; Packet.SetupPacket.wValue [2]:= USB_REPORT_DESCRIPTOR_TYPE; Packet.SetupPacket.wLength[2]:= 1; // Èñïîëüçîâàòü áóôåð 2 Êá
// IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION Success:= DeviceIoControl(hRoot, GetUSBCtlCode(5), @Packet, sizeof(Packet), @Packet, sizeof(Packet), BytesReturned, nil );
If not(Success) then begin Log(Format(' Îøèáêà ïîëó÷åíèÿ REPORT-äåñêðèïòîðà %s', [ SysErrorMessage(GetLastError())])); Exit; End;
// îòîáðàæåíèå èíôîðìàöèè î äåñêðèïòîðàõ êîíôèãóðàöèè DisplayREPORTDescriptorInfo(Packet.Data); End; end;
procedure TForm1.DisplayDescriptorInfo(Data : Array of byte; var IsHid : Boolean); var iData : Integer; lenDescr, typDescr : Byte; PData : Pointer; begin // Ïðîõîäèì ïî ìàññèâó äåñêðèïòîðîâ // Ïåðâûé áàéò - ðàçìåð äåñêðèïòîðà â áàéòàõ // Âòîðîé áàéò - òèï äåñêðèïòîðà iData:= 0;
Repeat lenDescr:= Data[iData+0]; typDescr:= Data[iData+1]; PData := @Data[iData+0];
Case typDescr of $01: begin // Ñòàíäàðòíûé äåñêðèïòîð Log(' Ñòàíäàðòíûé äåñêðèïòîð óñòðîéñòâà'); With TDeviceDescriptor(PData^) do begin Log(Format(' bcdUSB =%s', [BCD2Str(bcdUSB) ])); Log(Format(' bDeviceClass =%d', [bDeviceClass ])); Log(Format(' bDeviceSubClass =%d', [bDeviceSubClass ])); Log(Format(' bDeviceProtocol =%d', [bDeviceProtocol ])); Log(Format(' bMaxPacketSize0 =%d', [bMaxPacketSize0 ])); Log(Format(' idVendor =%d', [idVendor ])); Log(Format(' idProduct =%d', [idProduct ])); Log(Format(' bcdDevice =%s', [BCD2Str(bcdDevice)])); Log(Format(' iManufacturer =%d', [iManufacturer ])); Log(Format(' iProduct =%d', [iProduct ])); Log(Format(' iSerialNumber =%d', [iSerialNumber ])); Log(Format(' bNumConfigurations=%d', [bNumConfigurations])); End; End; $02: begin // Äåñêðèïòîð êîíôèãóðàöèè Log(' Äåñêðèïòîð êîíôèãóðàöèè'); With TUsbConfigurationDescriptor(PData^) do begin Log(Format(' iConfiguration=%d', [iConfiguration])); Log(Format(' bNumInterfaces=%d', [bNumInterfaces])); Log(Format(' bmAttributes =%d', [bmAttributes ])); Log(Format(' MaxPower(ìÀ) =%d', [MaxPower*2 ])); End; End; $03: begin // Äåñêðèïòîð ñòðîêè Log(' Äåñêðèïòîð ñòðîêè'); End; $04: begin // Äåñêðèïòîð èíòåðôåéñà Log(' Äåñêðèïòîð èíòåðôåéñà'); With TUsbInterfaceDescriptor(PData^) do begin Log(Format(' bInterfaceClass=%d', [bInterfaceClass])); Log(Format(' bNumEndpoints =%d', [bNumEndpoints ])); IsHID:= (bInterfaceClass = 3); End; End; $05: begin // Äåñêðèïòîð êîíå÷íîé òî÷êè Log(' Äåñêðèïòîð êîíå÷íîé òî÷êè'); End; $21: begin // Äåñêðèïòîð HID-óñòðîéñòâà Log(' Äåñêðèïòîð HID-óñòðîéñòâà'); End; End;
iData:= iData + lenDescr; Until (lenDescr = 0) or (iData > High(Data)); end;
// Êíîïêà Ñòàðò! procedure TForm1.Button1Click(Sender: TObject); var sHost : String; iHost : Integer; hHost : THandle; SA : SECURITY_ATTRIBUTES; EndOfSearch : Boolean; begin // Ôîðìèðîâàíèå SA SA.nLength:= SizeOf(SECURITY_ATTRIBUTES); SA.lpSecurityDescriptor:= nil; SA.bInheritHandle:= False;
// Öèêë ïî âñåì õîñòàì iHost:= 0; EndOfSearch:= False; Repeat // Ôîðìèðîâàíèå èìåíè õîñòà sHost:= Format('\\.\HCD%d', [iHost]); Log(Format('Ïðîâåðêà õîñòà <%s>...',[sHost])); // Ïðîáóåì îòêðûòü õîñò-êîíòðîëëåðû hHost:= CreateFile(PChar(@sHost[1]), GENERIC_WRITE, FILE_SHARE_WRITE, @SA, OPEN_EXISTING, 0, 0 ); // Õîñò óñïåøíî îòêðûò If (hHost <> INVALID_HANDLE_VALUE) then begin Log(Format('Õîñò-êîíòðîëëåð %d óñïåøíî îòêðûò',[iHost])); // Ïîèñê óñòðîéñòâ, ïîäêëþ÷åííûõ ê õîñòó EnumerateHostDevices(hHost); CloseHandle(hHost); End else begin Log(Format('Õîñò-êîíòðîëëåð <%s> íå íàéäåí',[sHost])); Label1.Caption:='Ready!'; EndOfSearch:= True; End;
Inc(iHost); Until EndOfSearch; end;
procedure TForm1.DisplayREPORTDescriptorInfo(Data : Array of byte); begin Log(' Äåñêðèïòîð REPORT'); end;
procedure TForm1.FormActivate(Sender: TObject); begin label1.Caption:=''; end;
end.
|
то что иероглифы, это комменты и логи, там ещё юнит с константами если чё не понятно спросите я объясню, начинается с батонклика.... Добавлено @ 13:56 snowy,вот-вот причем ни только несколько дисков, а например ещё один хаб к единств порту которого подключено устройство...в одной-то флэшке.
--------------------
Don't ask me why, ask me how.
|