Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> usb mass storage descriptor, связь буквы и дескриптора 
:(
    Опции темы
artem1987
Дата 9.8.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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.
PM MAIL   Вверх
bems
Дата 9.8.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



artem1987, UsbTypes кинь


--------------------
Обижено школьников: 8
PM MAIL   Вверх
artem1987
Дата 9.8.2006, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 18.7.2006
Где: Калининград

Репутация: нет
Всего: нет



сами напросились
Код

unit UsbTypes;

interface

Uses Windows, Types, SysUtils;


Const
 USB_REQUEST_GET_STATUS        = $00;
 USB_REQUEST_CLEAR_FEATURE     = $01;
 USB_REQUEST_SET_FEATURE       = $03;
 USB_REQUEST_SET_ADDRESS       = $05;
 USB_REQUEST_GET_DESCRIPTOR    = $06;
 USB_REQUEST_SET_DESCRIPTOR    = $07;
 USB_REQUEST_GET_CONFIGURATION = $08;
 USB_REQUEST_SET_CONFIGURATION = $09;
 USB_REQUEST_GET_INTERFACE     = $0A;
 USB_REQUEST_SET_INTERFACE     = $0B;
 USB_REQUEST_SYNC_FRAME        = $0C;

 USB_GETSTATUS_SELF_POWERED          = $01;
 USB_GETSTATUS_REMOTE_WAKEUP_ENABLED = $02;

 USB_DEVICE_DESCRIPTOR_TYPE          = $01;
 USB_CONFIGURATION_DESCRIPTOR_TYPE   = $02;
 USB_STRING_DESCRIPTOR_TYPE          = $03;
 USB_INTERFACE_DESCRIPTOR_TYPE       = $04;
 USB_ENDPOINT_DESCRIPTOR_TYPE        = $05;
 USB_RESERVED_DESCRIPTOR_TYPE        = $06;
 USB_CONFIG_POWER_DESCRIPTOR_TYPE    = $07;
 USB_INTERFACE_POWER_DESCRIPTOR_TYPE = $08;
 USB_HID_DESCRIPTOR_TYPE             = $21;
 USB_REPORT_DESCRIPTOR_TYPE          = $22;

Type
 TDeviceName = packed record
  Length : ULONG;
  Name   : Array [1..256] of WCHAR;
 End;

 TUsbHubNode = (UsbHub, UsbMIParent);

 TUsbConnectionStatus = (
   NoDeviceConnected = 0,   // íåò ïîäêëþ÷åííûõ óñòðîéñòâ
   DeviceConnected,         // óñòðîéñòâî ïîäêëþ÷åíî
   DeviceFailedEnumeration, // îøèáêà íóìåðàöèè
   DeviceGeneralFailure,    // ôàòàëüíàÿ îøèáêà
   DeviceCausedOvercurrent, // ïåðåãðóçêà ïî òîêó
   DeviceNotEnoughPower,    // íå äîñòàòî÷íîå ïèòàíèå
   DeviceNotEnoughBandwidth // íå õâàòàåò ïðîïóñêíîé ñïîñîáíîñòè øèíû
 );

 THubDescriptor = packed record
  bDescriptorLength   : Byte;  // Äëèííà ýòîãî äåñêðèïòîðà
  bDescriptorType     : Byte;  // Òèï õàáà
  bNumberOfPorts      : Byte;  // ×èñëî ïîðòîâ õàáà
  wHubCharacteristics : Word;  // Õàðàêòåðèñòèêè
  bPowerOnToPowerGood : Byte;  // port power on till power good in 2ms
  bHubControlCurrent  : Byte;  // Ìàêñèìàëüíîå ïîòðåáëåíèå (ìÀ)
  bRemoveAndPowerMask : Array [1..64] of Byte;
 End;

 TNodeInformation = packed record
  NodeType        : DWord; { = TUsbHubNode}
  HubDescriptor   : THubDescriptor;
  HubIsBusPowered : BOOL;
 End;

 TDeviceDescriptor = packed record
  bLength            : Byte;
  bDescriptorType    : Byte;
  bcdUSB             : Word;
  bDeviceClass       : Byte;
  bDeviceSubClass    : Byte;
  bDeviceProtocol    : Byte;
  bMaxPacketSize0    : Byte;
  idVendor           : Word;
  idProduct          : Word;
  bcdDevice          : Word;
  iManufacturer      : Byte;
  iProduct           : Byte;
  iSerialNumber      : Byte;
  bNumConfigurations : Byte;
 End;

 TUsbEndPointDescriptor = packed record
  bLength          : UCHAR;
  bDescriptorType  : UCHAR;
  bEndpointAddress : UCHAR;
  bmAttributes     : UCHAR;
  wMaxPacketSize   : SHORT;
  bInterval        : UCHAR;
 End;

 TUsbPipeInfo = packed record
  EndpointDescriptor : TUsbEndPointDescriptor;
  ScheduleOffset     : DWord;
 End;

 TNodeConnectionInformation = packed record
  ConnectionIndex           : DWord;
  DeviceDescriptor          : TDeviceDescriptor;
  CurrentConfigurationValue : Byte;
  LowSpeed                  : Boolean;
  DeviceIsHub               : Boolean;
  DeviceAddress             : Word;
  NumberOfOpenPipes         : Cardinal;
  ConnectionStatus          : Array [1.. 4] of Byte; {TUsbConnectionStatus}
  PipeList                  : Array [1..32] of TUsbPipeInfo;
 End;

 TSetupPacket = packed record
   bmRequest : UCHAR;
   bRequest  : UCHAR;
   wValue    : Array [1..2] of UCHAR; 
   wIndex    : Array [1..2] of UCHAR; 
   wLength   : Array [1..2] of UCHAR; 
 End;

 TDescriptorRequest = packed record
  ConnectionIndex : ULONG;
  SetupPacket     : TSetupPacket;
  Data            : Array [1..2048] of Byte;
 End;

 TUsbDeviceDescriptor = packed record
  bLength            : BYTE;
  bDescriptorType    : BYTE;
  bcdUSB             : WORD;
  bDeviceClass       : BYTE;
  bDeviceSubClass    : BYTE;
  bDeviceProtocol    : BYTE;
  bMaxPacketSize0    : BYTE;
  idVendor           : WORD;
  idProduct          : WORD;
  bcdDevice          : WORD;
  iManufacturer      : BYTE;
  iProduct           : BYTE;
  iSerialNumber      : BYTE;
  bNumConfigurations : BYTE;
 End;

 TUsbConfigurationDescriptor = packed record
  bLength             : BYTE;
  bDescriptorType     : BYTE;
  wTotalLength        : WORD;
  bNumInterfaces      : BYTE;
  bConfigurationValue : BYTE;
  iConfiguration      : BYTE;
  bmAttributes        : BYTE;
  MaxPower            : BYTE;
 End;

 TUsbInterfaceDescriptor = packed record
  bLength            : BYTE;
  bDescriptorType    : BYTE;
  bInterfaceNumber   : BYTE;
  bAlternateSetting  : BYTE;
  bNumEndpoints      : BYTE;
  bInterfaceClass    : BYTE;
  bInterfaceSubClass : BYTE;
  bInterfaceProtocol : BYTE;
  iInterface         : BYTE;
 End;

 TUsbStringDescriptor = packed record
  bLength         : BYTE;
  bDescriptorType : BYTE;
  bString         : Array of Byte;
 End;

function GetUSBClassName(IDClass : Byte) : String;
function GetUSBCtlCode(Code : Integer): Integer;
function BCD2Str(Value : Word) : String;

implementation

Const
 FILE_DEVICE_USB = $00000022;
 METHOD_BUFFERED = $00000000;
 FILE_ANY_ACCESS = $00000000;
 USB_IOCTL_INDEX = $00FF;

function GetUSBCtlCode(Code : Integer): Integer;
begin
  Result:=
     (FILE_DEVICE_USB shl 16) or
     (FILE_ANY_ACCESS shl 14) or
     ((USB_IOCTL_INDEX + Code) shl 2) or
     METHOD_BUFFERED;
end;

function GetUSBClassName(IDClass : Byte) : String;
begin
 Case IDClass of
   0: Result:= 'Reserved';
   1: Result:= 'Audio';
   2: Result:= 'Communications';
   3: Result:= 'Human Interface';
   4: Result:= 'Monitor';
   5: Result:= 'Physical Interface';
   6: Result:= 'Power';
   7: Result:= 'Printer';
   8: Result:= 'Storage';
   9: Result:= 'Hub';
  10: Result:= 'Vendor Specific';
  Else Result:= 'ÎØÈÁÊÀ';
 End;
end;

function BCD2Str(Value : Word) : String;
begin
 Result:= IntToHex(Value shr 8, 2) + '.' + IntToHex(Value and $00FF, 2);
end;

end.

и с рекурсией, я не мучился...соответственно если к хабу подключен хаб...

Добавлено @ 14:10 
извините, промахнулсяsmile))
--------------------
Don't ask me why, ask me how.
PM MAIL   Вверх
dumb
Дата 9.8.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



то, что вспомнил сразу - прочитай HKLM\SYSTEM\CurrentControlSet\MountedDevices: ищешь свой девайс "\??\Volume{твой GUID}", читаешь данные, потом ищешь такие же в "\DosDevices\<буква диска>:".

а вообще, если глянуть в соответствующий раздел msdn, то аж глаза разбегаются от обилия функций, которые могут тебе помочь. smile

edit0: протупил, первая часть поста уже была тут упомянута... smile
edit1: глянул код. создалось ощущение(могу ошибаться), что код писан "кем-то там", и предназначен не для того, для чего его хочет употребить автор топика. можно узнать цели? smile

Это сообщение отредактировал(а) dumb - 9.8.2006, 14:57
PM MAIL   Вверх
artem1987
Дата 14.8.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 18.7.2006
Где: Калининград

Репутация: нет
Всего: нет



там код просто нумерует все юсб устройства подключенные к компу,
но для моей настоящей цели этот код бесполезен, если нет связи устройства в этом дереве(флэшки) и буквы диска.
bems написал , что может их как-то связать и попросил код.
работать с реестром , я даже и не собирался, т.к. полную информацию ВСЕХ дескрипторов там не найти (конечной точки, конфигурации,интерфейса), единственное более или менее полезное это строка vid_xxxx&pid_xxxx но для некоторых флэшей и она не содержит информации, интересен вопрос, можно ли программно связать флэшку подключенную к энному пору корневого хаба энного хоста 
с буквой данной диску.способ значения не имеет...
--------------------
Don't ask me why, ask me how.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.