Thread Win32::API und LibUSB-Win32 (36 answers)
Opened by rosti at 2017-02-03 11:40

rosti
 2017-02-05 19:14
#186039 #186039
User since
2011-03-19
3492 Artikel
BenutzerIn
[Homepage]
user image
Pointer- Akrobatik ;)
===================

Struct zusammenbauen über die Speicheradressen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Win32::API->Import('libusb0', 'int usb_get_busses()');
my $mem_usb_bus = ReadMemory(usb_get_busses(), 532);
my %usb_bus;
@usb_bus{qw(next prev dirname devices location root_dev)} = unpack "VVZ512VVV", $mem_usb_bus;

die Dumper \%usb_bus;
$VAR1 = {
          'devices' => 11880344,
          'dirname' => 'bus-0',
          'location' => 0,
          'next' => 0,
          'prev' => 0,
          'root_dev' => 12579720
        };


Btw., die 32-bit-Integer sind little Endians, war auch nicht schwer, das rauszukriegen. So zeigt 'devices' => 11880344,
auf die Adresse im MEM wo die Devices liegen, und siehe da ist es auch:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$VAR1 = {
          'bDescriptorType' => 1,
          'bDeviceClass' => 0,
          'bDeviceProtocol' => 0,
          'bDeviceSubClass' => 0,
          'bLength' => 18,
          'bMaxPacketSize0' => 8,
          'bNumConfigurations' => 1,
          'bcdDevice' => 1,
          'bcdUSB' => 272,
          'dev' => 0,
          'filename' => '\\\\.\\libusb0-0001--0xffff-0x1122',
          'iManufacturer' => 1,
          'iProduct' => 2,
          'iSerialNumber' => 0,
          'idProduct' => 4386,
          'idVendor' => 65535,
          'next' => 0,
          'prev' => 0,
          'usb_bus' => 9769944,
          'usb_config_descriptor' => 9769760
        };



Allerdings ist der Hash unvollständig. In der usb.h struct-Definition gibt es 2 Einträge, da weiß ich nicht weiter

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct usb_device
{
struct usb_device *next, *prev;

char filename[LIBUSB_PATH_MAX];

struct usb_bus *bus;

struct usb_device_descriptor descriptor; # Frage 1
struct usb_config_descriptor *config;

void *dev; /* Darwin support */ # Frage 2

unsigned char devnum;

unsigned char num_children;
struct usb_device **children;
};


Pointer ist klar, der beansprucht 4 Bytes als little Endian.

Frage 1: Das ist kein Pointer, wieviele Bytes muss ich da veranschlagen? sizeof(usb_device_descriptor) und die Daten als Array?

Frage 2: Vermutlich 0 Bytes?


Ansonsten wird das Device schonmal gefunden und die mit ReadMemory gelesenen Konfig-Daten stimmen auch, s.oben.

Viele Grüße!

View full thread Win32::API und LibUSB-Win32