Получение серийника флеш дисков и прочих USB устройств

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Получение серийника флеш дисков и прочих USB устройств

Сообщение jangle » 24.02.2009 (Вт) 17:48

По-моему Лунатик спрашивал, про код для чтение серийного (заводского) номера USB устройств.
Сварганил небольшую библиотечку DLL на PB9 и пример использования на VB6, вобщем это кусок кода из проекта VB Static Linker ( viewtopic.php?f=15&t=34307 )

Функция GetUSB_SerialCode - возвращает серийники всех найденных USB устройств подключенных в данный момент к хабу. Это список HEX констант, разделенных символом перевода строки. Нужно это сторчку просто распарсить

Функция GetUSB_HashCode - почти тоже самое, только серийники захешированы, вроде как это должно повысить устойчивость к взлому, при привязке программы к USB флешке.

Область применения этой библы - привязка программ к флешке, т.е. использование ее как электронного ключа.
Разумеется, полученный серийник нельзя тупо сравнивать где-нибудь в коде, серийник должен быть ключом для динамической расшифровки собственного кода в рай-тайме. Как это реализовано в VB Static Linker. К сожалению, организовать динамическую (постраничную) расшифровку на VB практически невозможно (а на PB относительно несложно). Если у кого будет желание и время, можете перевести этот код на Visual Basic. Исходник прилагается.
Там все относительно прозрачно, думаю сложностей не будет.
У вас нет доступа для просмотра вложений в этом сообщении.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение jangle » 24.02.2009 (Вт) 18:05

Да если потребуется, можно сбилдить библу и в 8 версии PB, для этого надо только закоментить директиву компилятора: #Optimize Speed

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение MIT » 24.02.2009 (Вт) 18:53

Странный серийник какой-то:

Изображение
У вас нет доступа для просмотра вложений в этом сообщении.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение jangle » 24.02.2009 (Вт) 21:39

MIT писал(а):Странный серийник какой-то:

Изображение



Это к производителю флешки надо обращаться. У меня примерно такую белиберду выдает флеш плеер Qumo Vision. У него какой-то свой формат хранения серийного номера. Однако это никакой роли не играет, т.к. "белиберда" уникальна для каждого аппарата (проверено на 3 экземплярах)

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение jangle » 24.02.2009 (Вт) 22:03

У меня часть устройств определяется правильно, на заднем фоне утилита USBDeview

Изображение

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение SSecurity » 05.04.2009 (Вс) 1:38

Могу ошибаться, но что-то подобное видел в реестре, когда искал привязку локальных папок на расшаренные ресурсы компа. :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение jangle » 05.04.2009 (Вс) 19:25

SSecurity писал(а):Могу ошибаться, но что-то подобное видел в реестре, когда искал привязку локальных папок на расшаренные ресурсы компа. :)


Серийники USB устройств видел?

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение aleksmir » 14.08.2009 (Пт) 5:17

jangle писал(а): Если у кого будет желание и время, можете перевести этот код на Visual Basic. Исходник прилагается.
Там все относительно прозрачно, думаю сложностей не будет.


У меня есть время и желание. Подскажите - типы данных Word и dWord - чему эквивалентны в VB5/6?

Ещё... - как синтаксисом VB5/6 описать эти строки:
Код: Выделить всё
Union unionTS
  Cdb(0 To 15) As Byte
  buffer(0 To 127) As Byte
  Cmd As TCmd
  USB As TCmdUSB
End Union

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4256
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение iGrok » 14.08.2009 (Пт) 12:25

aleksmir писал(а):Подскажите - типы данных Word и dWord - чему эквивалентны в VB5/6?

Ещё... - как синтаксисом VB5/6 описать эти строки:
Код: Выделить всё
Union unionTS
  Cdb(0 To 15) As Byte
  buffer(0 To 127) As Byte
  Cmd As TCmd
  USB As TCmdUSB
End Union

Думается, word = integer, dword = long, union = type.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16116
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение Хакер » 14.08.2009 (Пт) 13:37

union = type.

Точно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4256
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение iGrok » 14.08.2009 (Пт) 14:45

Хакер писал(а):
union = type.

Точно?

Вообще говоря, у меня есть большие сомнения по этому поводу. Хотя бы из-за union'а в C.
Но посмотри на описание этого union'а. Чем он ещё может быть?
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16116
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение Хакер » 14.08.2009 (Пт) 14:46

А что за язык-то?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4256
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение iGrok » 14.08.2009 (Пт) 14:54

Хакер писал(а):А что за язык-то?

Кажись, PB9. :)
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16116
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение Хакер » 14.08.2009 (Пт) 14:58

Ну надо в его мануале и смотреть. Если там union имеет такой же смысл, как и в C, то Type не подходит.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4256
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение iGrok » 14.08.2009 (Пт) 15:09

Хакер писал(а):Ну надо в его мануале и смотреть. Если там union имеет такой же смысл, как и в C, то Type не подходит.

Гм. Похоже, ты прав. http://www.vbnet.ru/forum/show.aspx?id=30446

Я не знал, что члены union'а могут иметь разный размер. (

Тогда этот кусок не получится перевести "в лоб". Надо смотреть, где и как этот union используется.
label:
cli
jmp label

alibek
Большой Человек
Большой Человек
 
Сообщения: 14109
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение alibek » 14.08.2009 (Пт) 16:06

iGrok писал(а):Но посмотри на описание этого union'а. Чем он ещё может быть?

Если судить по этому примеру (с сайта PowerBASIC):
Код: Выделить всё
UNION Arrs
  a1(1 TO 1024) AS BYTE
  st AS ASCIIZ * 10
END UNION

FUNCTION PBMAIN
    DIM a AS Arrs
    a.a1(1) = 72
    a.a1(2) = 101
    a.a1(3) = 108
    a.a1(4) = 108
    a.a1(5) = 111
    a.a1(6) = 33
    ' At this point, a.st contains "Hello!"
END FUNCTION

UNION ничего общего с UDT в VB6 не имеет.
Lasciate ogni speranza, voi ch'entrate.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4256
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение iGrok » 14.08.2009 (Пт) 23:10

alibek писал(а):Если судить по этому примеру (с сайта PowerBASIC):
...
UNION ничего общего с UDT в VB6 не имеет.

Да я, кажется, уже поправился постом выше..
iGrok писал(а):...
Тогда этот кусок не получится перевести "в лоб". Надо смотреть, где и как этот union используется.
label:
cli
jmp label

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 2982
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Москва

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение jangle » 24.08.2009 (Пн) 13:25

UNION просто указывает на общую область памяти. А типы это как-бы маски, накладывая которые можно менять представление данных. Например преобразовывать типы.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение 0xy » 26.06.2011 (Вс) 15:02

А есть ли возможность выделить из списка серийник конкретной флешки, исходя из буквы ее диска?
Также интересно узнать, как получить другие поля (VendorID, Firmware Revision и т.п.)

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение 0xy » 06.07.2011 (Ср) 15:48

Вот, перевел сабж на VB.
Косяки наверняка есть (их, походу, и в оригинале немало).
Но РАБОТАЕТ :)
Код: Выделить всё
Option Explicit

Type SECURITY_ATTRIBUTES
        nLength As Long
        lpSecurityDescriptor As Long
        bInheritHandle As Long
End Type
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice&, ByVal dwIoControlCode&, lpInBuffer As Any, ByVal nInBufferSize&, ipOutBuffer As Any, ByVal nOutBufferSize&, lpBytesReturned As Long, Optional ByVal lpOverlapped&) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Any, ByVal source As Any, ByVal Length&)


Type OVERLAPPED
        Internal As Long
        InternalHigh As Long
        offset As Long
        OffsetHigh As Long
        hEvent As Long
End Type
Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
Const OPEN_EXISTING = 3
Const INVALID_HANDLE_VALUE = -1
Const MAX_PATH = 260

'***********************************************************************

Global hPort             As Long
Global SA                As SECURITY_ATTRIBUTES
Global usbSerialCodes    As String
Global LanguageIdS() As Integer

Const METHOD_BUFFERED = 0
Const FILE_ANY_ACCESS = 0
Const FILE_DEVICE_UNKNOWN = 34
Const FILE_DEVICE_USB = FILE_DEVICE_UNKNOWN
Const USB_CONFIGURATION_DESCRIPTOR_TYPE = 2
Const USB_STRING_DESCRIPTOR_TYPE = 3
Const USB_REQUEST_GET_DESCRIPTOR = 6
Const MAXIMUM_USB_STRING_LENGTH = 255
Const USB_GET_NODE_INFORMATION = 258
Const USB_GET_NODE_CONNECTION_INFORMATION = 259
Const USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION = 260
Const USB_GET_NODE_CONNECTION_NAME = 261
Const HCD_GET_ROOT_HUB_NAME = 258
Const HCD_GET_DRIVERKEY_NAME = 265
Const DEVICECONNECTED = 1

Global IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION    As Long
Global IOCTL_USB_GET_NODE_CONNECTION_INFORMATION        As Long
Global IOCTL_USB_GET_NODE_CONNECTION_NAME               As Long
Global IOCTL_USB_GET_NODE_INFORMATION                   As Long
Global IOCTL_GET_HCD_DRIVERKEY_NAME   As Long
Global IOCTL_USB_GET_ROOT_HUB_NAME    As Long

Type USB_STRING_DESCRIPTOR 'Ok! Мои художества :)
bLength         As Byte 'Size of Descriptor in Bytes
bDescriptorType As Byte 'Constant, string Descriptor (0x03)
bString(1 To MAXIMUM_USB_STRING_LENGTH - 2) As Byte
End Type

Type USB_DEVICE_DESCRIPTOR 'Ok!(18) 'Packet.Data 1 - USB_CONFIGURATION_DESCRIPTOR_TYPE
bLength            As Byte 'Specifies the length, in bytes, of this descriptor.
bDescriptorType    As Byte 'Specifies the descriptor type. Must be set to USB_DEVICE_DESCRIPTOR_TYPE (1).
bcdUSB             As Integer 'Identifies the version of the USB specification that this descriptor structure complies with. This value is a binary-coded decimal number.
bDeviceClass       As Byte 'Specifies the class code of the device as assigned by the USB specification group.
bDeviceSubClass    As Byte 'Specifies the subclass code of the device as assigned by the USB specification group.
bDeviceProtocol    As Byte 'Specifies the protocol code of the device as assigned by the USB specification group.
bMaxPacketSize0    As Byte 'Specifies the maximum packet size, in bytes, for endpoint zero of the device. The value must be set to 8, 16, 32, or 64.
idVendor           As Integer 'Specifies the vendor identifier for the device as assigned by the USB specification committee.
idProduct          As Integer 'Specifies the product identifier. This value is assigned by the manufacturer and is device-specific.
bcdDevice          As Integer 'Identifies the version of the device. This value is a binary-coded decimal number.
iManufacturer      As Byte 'Specifies a device-defined index of the string descriptor that provides a string containing the name of the manufacturer of this device.
iProduct           As Byte 'Specifies a device-defined index of the string descriptor that provides a string that contains a description of the device.
iSerialNumber      As Byte 'Specifies a device-defined index of the string descriptor that provides a string that contains a manufacturer-determined serial number for the device.
bNumConfigurations As Byte 'Specifies the total number of possible configurations for the device.
End Type

Type USB_CONFIGURATION_DESCRIPTOR '+;9(!) 'Packet.Data 2 - USB_CONFIGURATION_DESCRIPTOR_TYPE
bLength             As Byte 'Size, in bytes, of this structure.
bDescriptorType     As Byte 'Constant value %CONFIGURATION.
wTotalLength        As Integer 'Total length of data returned for this configuration. This includes the combined length of all structures — USB_CONFIGURATION_DESCRIPTOR, USB_INTERFACE,
                             'USB_ENDPOINT_DESCRIPTOR and any class or vendor-specific structures — returned as part of the configuration information.
bNumInterfaces      As Byte 'Number of interfaces supported as part of this configuration.
bConfigurationValue As Byte 'Configuration's value, used when the USB system software of a USB device driver requests this configuration.
iConfiguration      As Byte 'Index of a string descriptor describing this configuration.
bmAttributes        As Byte 'Eight bits of configuration characteristics. Bits zero to four are reserved and should be zero (0). If bit five is set to 1, this configuration supports remote wakeup. If bit six is set to 1,
                             'then in this configuration the USB device uses power both from the bus and from an external source, such as a battery or wall socket. The MaxPower member gives the amount of bus power required during usual operation.
MaxPower            As Byte 'Amount of power required in this configuration when the USB device is fully operational, expressed in units of 2 milliamps. For example, a value of 50 represents power consumption of 100 mA.
                             'This member is used if the bmAttributes member indicates that the device requires bus power.
End Type

Type USB_INTERFACE_DESCRIPTOR '+;9(!) 'Packet.Data 4 - USB_CONFIGURATION_DESCRIPTOR_TYPE
bLength            As Byte 'Length, in bytes, of this structure.
bDescriptorType    As Byte 'Constant value INTERFACE.
bInterfaceNumber   As Byte 'Interface's number. This value is a zero-based index into an array of interfaces supported by the relevant configuration.
bAlternateSetting  As Byte 'Value used to select an alternate setting for the interface identified in bInterfaceNumber.
bNumEndpoints      As Byte 'Number of endpoints used by this interface, excluding endpoint zero (0). If this value is zero (0), the interface only uses the default control pipe.
bInterfaceClass    As Byte 'Interface class code. The USB working group defines class codes. The value 0xFF represents a vendor-specific class code.
bInterfaceSubClass As Byte 'Interface subclass code. The USB working group defines subclass codes. The meaning of this member depends on the value of bInterfaceClass.
bInterfaceProtocol As Byte 'Interface protocol code. The USB working group defines protocol codes. The value 0xFF indicates a vendor-specific protocol code.
iInterface         As Byte 'Index of a string descriptor describing this interface.
End Type

Type Word2Bytes 'Добавил
Lo As Byte
Hi As Byte
End Type

Type USB_ENDPOINT_DESCRIPTOR '+;7(!) 'Packet.Data 5 - USB_CONFIGURATION_DESCRIPTOR_TYPE
bLength          As Byte 'Specifies the length, in bytes, of this descriptor.
bDescriptorType  As Byte 'Specifies the descriptor type. Must be set to USB_ENDPOINT_DESCRIPTOR_TYPE.
bEndpointAddress As Byte 'Specifies the USB-defined endpoint address. The four low-order bits specify the endpoint number. The high-order bit specifies the direction of data flow on this endpoint: 1 for in, 0 for out.
bmAttributes     As Byte 'The two low-order bits specify the endpoint type, one of USB_ENDPOINT_TYPE_CONTROL, USB_ENDPOINT_TYPE_ISOCHRONOUS, USB_ENDPOINT_TYPE_BULK, or USB_ENDPOINT_TYPE_INTERRUPT.
wMaxPacketSize   As Word2Bytes 'Integer 'Specifies the maximum packet size that can be sent from or to this endpoint.
bInterval        As Byte 'For interrupt endpoints, bInterval contains the polling interval. For other types of endpoint, this value should be ignored. This value reflects the device's configuration in firmware. Drivers cannot change it.
End Type


Type USB_COMMON_DESCRIPTOR 'Ok! Packet.Data header - USB_CONFIGURATION_DESCRIPTOR_TYPE
bLength         As Byte  'Lenght in bytes of the descriptor.
bDescriptorType As Byte  'The descriptor type. 1 for USB_DEVICE_DESCRIPTOR, 2 for USB_CONFIGURATION_DESCRIPTOR, 4 for USB_INTERFACE_DESCRIPTOR, 5 for USB_ENDPOINT_DESCRIPTOR, 33 for HID_DESCRIPTOR.
End Type

Type w_Value 'Добавил
DescriptorIndex As Byte
DescriptorType As Byte
End Type

Type SETUP_PACKET 'Ok!
bmRequest As Byte 'The type of USB device request, standard, class, or vendor
bRequest  As Byte '0x06 value indicates a request of GET_DESCRIPTOR.
wValue    As w_Value 'Type of descriptor to retrieve in the high byte of wValue and the descriptor index in the low byte.
wIndex    As Integer 'The device-specific index of the descriptor that is to be retrieved.
wLength   As Integer 'The length of the data that is transferred during the second phase of the control transfer.
End Type

Type USB_DESCRIPTOR_REQUEST 'Ok;-!!!
ConnectionIndex As Long                                'The port whose descriptors are retrieved.
SetupPacket     As SETUP_PACKET                        'See SETUP_PACKET type.
Data(1 To MAXIMUM_USB_STRING_LENGTH) As Byte           ' As String *  'On output from the IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION I/O control request, this member contains the retrieved descriptors.
End Type

Type USB_HUB_DESCRIPTOR 'Ok (Испр.)
bDescriptorLength   As Byte        'The length, in bytes of the descriptor.
bDescriptorType     As Byte        'The descriptor type. For hub descriptors, this value should be 0x29.
bNumberOfPorts      As Byte        'The number of ports on the hub.
'wHubCharacteristics As WORD        'The hub characteristics. For more information about this member, see Universal Serial Bus Specification.
  wHubCharacteristics_Hi As Byte
  wHubCharacteristics_Lo As Byte
bPowerOnToPowerGood As Byte        'The time, in 2-millisecond intervals, that it takes the device to turn on completely. For more information about this member, see Universal Serial Bus Specification.
bHubControlCurrent  As Byte        'The maximum current requirements, in milliamperes, of the controller component of the hub.
bRemoveAndPowerMask As String * 65 'Not currently implemented. Do not use this member. This member implements DeviceRemovable and PortPwrCtrlMask fields of the hub descriptor. For more information about these fields, see Universal Serial Bus
End Type

Type USB_HUB_NODE 'Ok
UsbHub      As Integer 'Indicates that the device is a hub.
UsbMIParent As Integer 'Indicates that the device is a composite device with multiple interfaces.
End Type

Type USB_HUB_INFORMATION 'Ok
HubDescriptor   As USB_HUB_DESCRIPTOR 'A USB_HUB_DESCRIPTOR structure that contains selected information from the hub descriptor.
HubIsBusPowered As Long               'A Boolean value that indicates whether the hub is powered. If TRUE, the hub is powered. If FALSE, the hub is not powered.
End Type

Type USB_MI_PARENT_INFORMATION 'Ok
NumberOfInterfaces As Long 'The number of interfaces on the composite device.
End Type

'Union USB_NODE_INFORMATION_UNION
' HubInformation      As USB_HUB_INFORMATION       'A USB_HUB_INFORMATION structure that contains information about a parent hub device.
' MiParentInformation As USB_MI_PARENT_INFORMATION 'A USB_MI_PARENT_INFORMATION structure that contains information about a parent non-hub, composite device.
'END UNION

Type USB_NODE_INFORMATION 'Ok
NodeType As USB_HUB_NODE   'A USB_HUB_NODE enumerator that indicates whether the parent device is a hub or a non-hub composite device.
'USB_NODE_INFORMATION_UNION 'See USB_NODE_INFORMATION_UNION union
HubInformation      As USB_HUB_INFORMATION       'A USB_HUB_INFORMATION structure that contains information about a parent hub device.
MiParentInformation As USB_MI_PARENT_INFORMATION 'A USB_MI_PARENT_INFORMATION structure that contains information about a parent non-hub, composite device.
End Type

Type USB_HCD_DRIVERKEY_NAME 'Ok;-!!!
ActualLength  As Integer                               'The length, in bytes, of the string in the DriverKeyName member.
DriverKeyName As String * MAXIMUM_USB_STRING_LENGTH 'wChar array, a NULL-terminated Unicode driver key name for the USB host controller.
End Type

Type USB_NODE_CONNECTION_NAME 'Ok;-!!!
ConnectionIndex As Long                                 'A value that is greater than or equal to 1 that specifies the number of the port to which the hub is attached.
ActualLength    As Long                                 'The length, in bytes, of the attached hub's symbolic link.
Name            As String * MAXIMUM_USB_STRING_LENGTH  'A Unicode symbolic link for the downstream hub that is attached to the port that is indicated by ConnectionIndex.
End Type

Type USB_PIPE_INFO '!!! (Вроде исправил)
EndpointDescriptor As USB_ENDPOINT_DESCRIPTOR 'See USB_ENDPOINT_DESCRIPTOR type
ScheduleOffset(0 To 3) As Byte  'DWORD                   'Indicates the schedule offset assigned to the endpoint for this pipe.
End Type

Type USB_NODE_CONNECTION_INFORMATION '!!!
ConnectionIndex           As Long                  'A value that is greater than or equal to 1 that specifies the number of the port.
DeviceDescriptor          As USB_DEVICE_DESCRIPTOR 'A USB_DEVICE_DESCRIPTOR structure that reports the USB device descriptor that is returned by the attached device during enumeration.
CurrentConfigurationValue As Byte                  'Value used with SetConfiguration request to specify that current configuration of the device that is connected to the indicated port. See Universal Serial Bus Specification.
LowSpeed                  As Byte                  'If TRUE, the port and its connected device are currently operating at a low speed.
DeviceIsHub               As Byte                  'Value that indicates if the device that is attached to the port is a hub. If TRUE, the device that is attached to the port is a hub. If FALSE, the device is not a hub.
DeviceAddress(0 To 1)     As Byte  'WORD           'The USB-assigned, bus-relative address of the device that is attached to the port.
NumberOfOpenPipes(0 To 3) As Byte  'DWORD          'The number of open USB pipes that are associated with the port.
ConnectionStatus(0 To 3)  As Byte 'DWORD                 'A USB_CONNECTION_STATUS-typed enumerator that indicates the connection status.
PipeList(1 To 32)         As USB_PIPE_INFO         'An array of USB_PIPE_INFO structures that describes the open pipes that are associated with the port.
End Type

'______________________________________________________________________________

Sub Init()
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION = CTL_Code(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS)
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION = CTL_Code(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
IOCTL_USB_GET_NODE_CONNECTION_NAME = CTL_Code(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
IOCTL_USB_GET_NODE_INFORMATION = CTL_Code(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)
IOCTL_GET_HCD_DRIVERKEY_NAME = CTL_Code(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
IOCTL_USB_GET_ROOT_HUB_NAME = CTL_Code(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)
'Reset SA
SA.nLength = Len(SA)
End Sub
'______________________________________________________________________________

Function CTL_Code&(ByVal dwDeviceType As Long, ByVal dwFunction As Long, _
                  ByVal dwMethod As Long, ByVal dwAccess As Long)  'Thank to Erwin van de Wiel
dwDeviceType = SHL(dwDeviceType, 16) 'xxxxxxxxxxxxxxxx---------------- 16 bits
dwAccess = SHL(dwAccess, 14)         '----------------xx--------------  2 bits
dwFunction = SHL(dwFunction, 2)      '------------------xxxxxxxxxxxx-- 12 bits
'Method                              '------------------------------xx  2 bits
CTL_Code = dwDeviceType Or dwAccess Or dwFunction Or dwMethod
End Function
'______________________________________________________________________________

Function usbDeviceLanguageId(hHub&, PortIndex&) As Long
Dim Request                                       As USB_DESCRIPTOR_REQUEST
Dim UsbLanguageId                                 As USB_COMMON_DESCRIPTOR 'POINTER
Dim zLanguage                                     As String * MAX_PATH 'ASCIIZ
Dim BytesReturned                                 As Long 'DWORD
Dim Success                                       As Long

If UBound(LanguageIdS) = 0 Then 'Get the languages ids
   Request.ConnectionIndex = PortIndex
   Request.SetupPacket.bmRequest = &H80
   Request.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR
   Request.SetupPacket.wValue.DescriptorType = USB_STRING_DESCRIPTOR_TYPE 'MAK...
   Request.SetupPacket.wLength = MAXIMUM_USB_STRING_LENGTH
   Success = DeviceIoControl(hHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, Request, _
                            Len(Request), Request, Len(Request), BytesReturned, 0)
   If Success Then
     CopyMemory VarPtr(UsbLanguageId), VarPtr(Request.Data(1)), Len(UsbLanguageId) 'pUsbLanguageId = VarPtr(Request.Data)
     If UsbLanguageId.bDescriptorType = 3 Then 'Constant, string Descriptor = 3
       ReDim LanguageIdS(0 To (UsbLanguageId.bLength \ 2) - 1) 'AS WORD AT VARPTR(Request.DATA) + 2
       CopyMemory VarPtr(LanguageIdS(1)), VarPtr(Request.Data(1)) + 2, UBound(LanguageIdS) * 2
     End If
   End If
End If

End Function

'______________________________________________________________________________

Function usbDeviceString(hHub&, PortIndex As Long, Index As Byte) As String
Dim Request                                       As USB_DESCRIPTOR_REQUEST
Dim pBuffer                                       As USB_COMMON_DESCRIPTOR 'POINTER
Dim sBuffer                                       As String
Dim BytesReturned&, Success&, i&

usbDeviceLanguageId hHub, PortIndex
For i = 0 To UBound(LanguageIdS) 'Перебираем все доступные языки, включая Neytral(0)
    Request.SetupPacket.wIndex = LanguageIdS(i) 'в надежде получить данные хоть на каком-то.
    Request.ConnectionIndex = PortIndex
    Request.SetupPacket.bmRequest = &H80
    Request.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR
    Request.SetupPacket.wValue.DescriptorType = USB_STRING_DESCRIPTOR_TYPE
    Request.SetupPacket.wValue.DescriptorIndex = Index
    Request.SetupPacket.wLength = MAXIMUM_USB_STRING_LENGTH
    Success = DeviceIoControl(hHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, Request, _
                          Len(Request), Request, Len(Request), BytesReturned, 0)
    If Success Then
       CopyMemory VarPtr(pBuffer), VarPtr(Request.Data(1)), Len(pBuffer)
       sBuffer = Request.Data
       sBuffer = Mid(sBuffer, 2, pBuffer.bLength / 2 - 1)
       usbDeviceString = Trim(sBuffer)
       If Len(usbDeviceString) Then Exit For
    End If
Next i
End Function


'______________________________________________________________________________

Function usbDeviceInfo&(hHub&, PortIndex&, pBuffer As USB_DEVICE_DESCRIPTOR)
     Dim sManufacturer      As String
     Dim sProduct           As String
     Dim iSerialNumber      As String
     ReDim LanguageIdS(0)
     
     sManufacturer = usbDeviceString(hHub, PortIndex, pBuffer.iManufacturer)
     sProduct = usbDeviceString(hHub, PortIndex, pBuffer.iProduct)
     iSerialNumber = usbDeviceString(hHub, PortIndex, pBuffer.iSerialNumber)
     usbSerialCodes = usbSerialCodes & sProduct & " (" & sManufacturer & ");   S/N:  " & iSerialNumber & vbCrLf

End Function
'______________________________________________________________________________

Function usbPortEnum(hHub&, PortCount As Byte) As Long
Dim ConnectionInformation                     As USB_NODE_CONNECTION_INFORMATION
Dim NodeInformation                           As USB_NODE_INFORMATION
Dim NodeConnection                            As USB_NODE_CONNECTION_NAME
Dim NodeConnectionName                        As String 'ASCIIZ * MAXIMUM_USB_STRING_LENGTH
Dim sData                                     As String
Dim hNodeConnection                           As Long
Dim BytesReturned                             As Long
Dim Success                                   As Long
Dim ConnectionStatus                          As Long
Dim PortIndex                                 As Long

For PortIndex = 1 To PortCount '
   ConnectionInformation.ConnectionIndex = PortIndex
   Success = DeviceIoControl(hHub, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION, _
                             ByVal VarPtr(ConnectionInformation), Len(ConnectionInformation), _
                             ByVal VarPtr(ConnectionInformation), Len(ConnectionInformation), _
                             BytesReturned, 0)

   If Success Then
        CopyMemory VarPtr(ConnectionStatus), VarPtr(ConnectionInformation.ConnectionStatus(0)), 4
     If ConnectionStatus = DEVICECONNECTED Then
       If ConnectionInformation.DeviceIsHub Then
         NodeConnection.ConnectionIndex = PortIndex
         Success = DeviceIoControl(hHub, IOCTL_USB_GET_NODE_CONNECTION_NAME, NodeConnection, _
                                   Len(NodeConnection), NodeConnection, Len(NodeConnection), _
                                   BytesReturned, 0)
         If Success Then
           NodeConnectionName = Mid(NodeConnection.Name, 2, NodeConnection.ActualLength / 2 - 2)
           sData = Mid$(sData, 1 + InStr(sData, ";"))
           NodeConnectionName = "\\.\" & NodeConnectionName
           hNodeConnection = CreateFile(NodeConnectionName, GENERIC_READ, FILE_SHARE_READ, SA, OPEN_EXISTING, 0, 0)

           Success = DeviceIoControl(hNodeConnection, IOCTL_USB_GET_NODE_INFORMATION, _
                                     NodeInformation, Len(NodeInformation), NodeInformation, _
                                     Len(NodeInformation), BytesReturned, 0)
           If Success Then
             usbDeviceInfo hHub, PortIndex, ConnectionInformation.DeviceDescriptor
             usbPortEnum hNodeConnection, NodeInformation.HubInformation.HubDescriptor.bNumberOfPorts
           End If
           CloseHandle hNodeConnection

         End If
       Else
         usbDeviceInfo hHub, PortIndex, ConnectionInformation.DeviceDescriptor
       End If
     End If
   End If
Next

End Function
'______________________________________________________________________________

Function usbHostControllerInfo&(hHostController&)
Dim NodeInformation                As USB_NODE_INFORMATION
Dim DriverKeyName                  As USB_HCD_DRIVERKEY_NAME
Dim RootHubName                    As String 'ASCIIZ * %MAXIMUM_USB_STRING_LENGTH  'RootHubName must start with "\\.\"
Dim SystemName                     As String
Dim hRootHub                       As Long
Dim BytesReturned                  As Long
Dim Success                        As Long

Success = DeviceIoControl(hHostController, IOCTL_GET_HCD_DRIVERKEY_NAME, ByVal VarPtr(DriverKeyName), _
                           Len(DriverKeyName), ByVal VarPtr(DriverKeyName), Len(DriverKeyName), _
                           BytesReturned, 0)
If Success Then
   SystemName = Mid(DriverKeyName.DriverKeyName, 2, (DriverKeyName.ActualLength - 2) / 2)
   Success = DeviceIoControl(hHostController, IOCTL_USB_GET_ROOT_HUB_NAME, ByVal VarPtr(DriverKeyName), _
                             Len(DriverKeyName), ByVal VarPtr(DriverKeyName), Len(DriverKeyName), _
                             BytesReturned, 0)
    If Success Then
     RootHubName = Mid(DriverKeyName.DriverKeyName, 2, DriverKeyName.ActualLength / 2)
     RootHubName = "\\.\" & RootHubName
     hRootHub = CreateFile(RootHubName, GENERIC_READ, FILE_SHARE_READ, _
                           SA, OPEN_EXISTING, 0, 0)

     If hRootHub <> INVALID_HANDLE_VALUE Then

       Success = DeviceIoControl(hRootHub, IOCTL_USB_GET_NODE_INFORMATION, ByVal VarPtr(NodeInformation), _
                                 Len(NodeInformation), ByVal VarPtr(NodeInformation), Len(NodeInformation), _
                                 BytesReturned, 0)
       If Success Then
         usbPortEnum hRootHub, NodeInformation.HubInformation.HubDescriptor.bNumberOfPorts
         CloseHandle hRootHub
       End If
     End If
   End If
End If

End Function
'_______________

Function usbHostControllerEnum() As Long
Dim HostControllerName      As String
Dim hHostController         As Long
Dim Looper                  As Long

HostControllerName = "\\.\HCDx"
For Looper = 0 To 9
   Mid$(HostControllerName, 8, 1) = Chr$(Looper + 48) '"\\.\HCD0" to "\\.\HCD9"
   hHostController = CreateFile(HostControllerName, GENERIC_READ, FILE_SHARE_READ, SA, OPEN_EXISTING, 0, 0)
   If Err.LastDllError = 0 And (hHostController <> INVALID_HANDLE_VALUE) Then
       usbHostControllerInfo hHostController
       CloseHandle hHostController
   End If
Next
End Function

Sub Main()
Init
usbHostControllerEnum
MsgBox usbSerialCodes
End Sub

Последний раз редактировалось 0xy 08.07.2011 (Пт) 8:12, всего редактировалось 6 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16116
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение Хакер » 06.07.2011 (Ср) 17:38

Что за ернел?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение 0xy » 07.07.2011 (Чт) 5:04

Хакер писал(а):Что за ернел?

Исправил (это было для отладки).
Вообще, в коде много неиспользуемых типов и переменных. Потом почищу...

Хакер
Если не лениво--глянь Type USB_NODE_CONNECTION_INFORMATION ан предмет косяков--уж больно тяжко с ним пришлось!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16116
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение Хакер » 07.07.2011 (Чт) 14:03

0xy писал(а):Исправил (это было для отладки).

Вот уж интересно, как это можно было использовать для отладки?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение 0xy » 08.07.2011 (Пт) 0:22

Хакер писал(а):
0xy писал(а):Исправил (это было для отладки).

Вот уж интересно, как это можно было использовать для отладки?

Тебе действительно интересно, или "интересно" :D
_kernel -- либа-переходник на kernel--нужна для того, чтобы спокойно ставить бряки на функции kernel в 98-й винде.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16116
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Получение серийника флеш дисков и прочих USB устройств

Сообщение Хакер » 08.07.2011 (Пт) 0:23

Почему бы не ставить их прямо в своём проекте?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList