PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Работа с биосом флешки, что и где почитать?


Работа с биосом флешки, что и где почитать?

Сообщений 1 страница 15 из 15

1

Программе нужно определить флешку и работать только с неё, а именно с этой самой флешки. Насколько я знаю у флешки есть bios в котором есть PID,VID, SN за сим мои познания заканчиваются.
Что почитать по данному вопросу? Информации крайне мало. Понял что есть некий USBLIB, который крайне проблематично прикрутить  к текущим версиям PB

Что должна делать программа при запуске:
узнать это Запуск с флешки с серийником №123 или нет
Если серийник 123, то работаем дальше, а если не 123 или это вообще не флешка то END

Заранее благодарен зв любую помощь в вопросе

0

2

pozvonok написал(а):

Насколько я знаю у флешки есть bios в котором есть PID,VID, SN за сим мои познания заканчиваются.

У флешек нет того, что называют "BIOS" ;)
Копайте в сторону DeviceIoControl.

0

3

pozvonok написал(а):

Насколько я знаю у флешки есть bios в котором есть PID,VID, SN

Это не биос.
PID, VID и SN относятся к идентификатором USB устройства. Они в прошивке флешки.

Искать нужно по DBT_DEVICEARRIVAL, SetupDiEnumDeviceInfo и т. д.

0

4

https://www.purebasic.fr/english/viewto … 22#p580922
https://www.purebasic.fr/english/viewtopic.php?t=78069

на флешку надо положить файл-метку и проверять, есть ли этот файл, если есть, то работаем, иначе END.

0

5

AZJIO, это я видел немного не то, что надо

Пётр, спасибо за наводку.

Если кому-то потребуется код : Информация о подключенных  USB устройствах VID,PID,SN, NAME и другое

Код:
#CR_SUCCESS = 0
#CM_LOCATE_DEVNODE_NORMAL = 0

#MAX_CLASS_NAME_LEN = 32
#MAX_DEV_NAME_LEN   = 512

#SPDRP_HARDWAREID   = 1
#SPDRP_SERVICE      = 4

#SPDRP_FRIENDLYNAME = $0C
#SPDRP_ENUMERATOR_NAME = $16
#SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = $0E

Structure SP_DEVICE_INTERFACE_DETAIL_DATA
  cbSize.l
  DevicePath.s{255}
EndStructure

Structure SP_DEVINFO_DATA
  cbSize.l 
  ClassGuid.GUID 
  DevInst.l 
  *reserved
EndStructure 


Prototype ptCM_Get_Device_IDW(DevInst.l, *DeviceIdString, BufferLen.l, Flags.l)
Prototype ptCM_Get_Parent(*DevInst, DevInst.l, Flags)
Prototype ptCM_Locate_DevNodeW(*DevInst, *pDeviceID, ulFlags.l)

Global CM_Locate_DevNode.ptCM_Locate_DevNodeW
Global CM_Get_Parent.ptCM_Get_Parent
Global CM_Get_Device_ID.ptCM_Get_Device_IDW

Define setupapi

setupapi = OpenLibrary(#PB_Any, "setupapi.dll")
If setupapi
  CM_Get_Device_ID = GetFunction(setupapi, "CM_Get_Device_IDW")
  CM_Get_Parent = GetFunction(setupapi, "CM_Get_Parent")
  CM_Locate_DevNode = GetFunction(setupapi, "CM_Locate_DevNodeW")
Else
  MessageRequester("Error", "Can't open library setupapi.dll")
  End
EndIf

Define Index.i, cbRequired.l
Define DeviceInfoData.SP_DEVICE_INTERFACE_DATA

Define pdidd.SP_DEVICE_INTERFACE_DETAIL_DATA
Define spdd.SP_DEVINFO_DATA

Define hDevInfo
Define *pGUID = ?GUID_USB_DEVICE

Define Buffer.s{512}

DeviceInfoData\cbSize = SizeOf(SP_DEVICE_INTERFACE_DATA)


hDevInfo = SetupDiGetClassDevs_(*pGUID, #Null, #Null, #DIGCF_PRESENT | #DIGCF_DEVICEINTERFACE)
If hDevInfo = #INVALID_HANDLE_VALUE
  MessageRequester("Error", "Inavlid handle value")
  End
EndIf

While SetupDiEnumDeviceInterfaces_(hDevInfo, 0, *pGUID, Index, @DeviceInfoData)
  
  SetupDiGetDeviceInterfaceDetail_(hDevInfo, @DeviceInfoData, 0, 0, @cbRequired, 0)
  If cbRequired > 0 And cbRequired < 255
    
    CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
      pdidd\cbSize = 8      ; x86(Unicode=6, ASCII=5), x64=8
    CompilerElse
      pdidd\cbSize = 4 + SizeOf(Character)   ; x86(Unicode=6, ASCII=5), x64=8
    CompilerEndIf
    
    spdd\cbSize = SizeOf(SP_DEVINFO_DATA)
    
    If SetupDiGetDeviceInterfaceDetail_(hDevInfo, @DeviceInfoData, @pdidd, cbRequired, 0, @spdd)
      
      If FindString(pdidd\DevicePath, "USBSTOR", 1, #PB_String_NoCase)
        
        CM_Get_Parent(@DevInstParent, spdd\DevInst, 0)
        Debug "Parent DevInst: " + DevInstParent
        
        CM_Get_Device_ID(DevInstParent, @Buffer, 512, 0)
        Debug "Parent DeviceId: " + Buffer
        
        Debug ""
        
        Debug "DevicePath: " + pdidd\DevicePath
        Debug "DevInst: " + spdd\DevInst
        
        CM_Get_Device_ID(spdd\DevInst, @Buffer, 512, 0)
        Debug "DeviceId: " + Buffer
        
        CM_Locate_DevNode(@id, @Buffer, #CM_LOCATE_DEVNODE_NORMAL)
        Debug "DevInst: " + id
        
        SetupDiGetDeviceRegistryProperty_(hDevInfo, @spdd, #SPDRP_FRIENDLYNAME, 0, @Buffer, 512, 0)
        Debug "Friendly name: " + Buffer
        
        SetupDiGetDeviceRegistryProperty_(hDevInfo, @spdd, #SPDRP_ENUMERATOR_NAME, 0, @Buffer, 512, 0)
        Debug "SPDRP_ENUMERATOR_NAME: " + Buffer
        
        SetupDiGetDeviceRegistryProperty_(hDevInfo, @spdd, #SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, 0, @Buffer, 512, 0)
        Debug "SPDRP_PHYSICAL_DEVICE_OBJECT_NAME: " + Buffer
        
        SetupDiGetDeviceRegistryProperty_(hDevInfo, @spdd, #SPDRP_HARDWAREID, 0, @Buffer, 512, 0)
        Debug "SPDRP_HARDWAREID: "
        Debug Buffer
        
        StrLength = StringByteLength(Buffer)
        *p = @Buffer + StrLength + 2
        While PeekC(*p)
          s.s = PeekS(*p)
          Debug s
          StrLength = StringByteLength(s)
          *p + StrLength + 2
        Wend
        
        Debug "----------------------------------------"
        
      EndIf
    EndIf
  EndIf
  
  Index + 1
Wend

SetupDiDestroyDeviceInfoList_(hDevInfo)
CloseLibrary(setupapi)


DataSection
  GUID_USB_DEVICE:
  Data.l $53f56307
  Data.w $b6bf, $11d0
  Data.b $94, $f2, $00, $a0, $c9, $1e, $fb, $8b
EndDataSection

Осталось понять, как зная Букву диска, определить его номер для того чтобы знать, какая информация нужная вот тут что-то я в тупик зашел с поиском. Все что угодно уже знаю как узнать, но не номер)

Отредактировано pozvonok (26.09.2022 18:53:47)

0

6

pozvonok написал(а):

зная Букву диска, определить его номер

DriveGetNumber - https://www.purebasic.fr/english/viewtopic.php?t=78880
там же DriveGetName.

pozvonok написал(а):

Если кому-то потребуется код : Информация о подключенных  USB устройствах VID,PID,SN, NAME и другое

у меня на 2-х флешках этот код ничего не даёт, на других двух выводит инфу.
Проще давать ссылку откуда вы его взяли, или на основе чего использовали. Тогда можно увидеть оригинал и почитать обсуждение, а не в глухую тестировать на своём компе.
Отсюда?, там в первом посте в отличии от другого видит все мои флешки, то есть USB\VID даёт на все, а имя производителя я получаю другим способом, тоже надёжным (DriveGetName выше ссылка).

pozvonok написал(а):

Информация о подключенных  USB устройствах VID,PID,SN, NAME и другое

а где там SN?
В функции WinAPI GetVolumeInformation_ есть SN 4-ым параметром.

Отредактировано AZJIO (27.09.2022 06:11:09)

0

7

Код:
DriveGetNumber - https://www.purebasic.fr/english/viewtopic.php?t=78880
там же DriveGetName.

Спасибо, но нужен номер под которым смонтирован, а не какой посчету для пользователя отображается.

Код:
у меня на 2-х флешках этот код ничего не даёт, на других двух выводит инфу.
Проще давать ссылку откуда вы его взяли

Учту, сейчас уже не вспомню. У меня выдало сразу на 2х флешках. SN Это последнее значение  в DeviceId после /

Отредактировано pozvonok (27.09.2022 09:35:25)

0

8

pozvonok написал(а):

SN Это последнее значение  в DeviceId после /

а почему он не сходится с SN из GetVolumeInformation (параметр lpVolumeSerialNumber)?
Даже переведя его в Hex
Проверил в usbdeview от nirsoft, там номер флешки сходится с DeviceId. Не уверен но я изначально предполагал, что SN это номер устройства присваиваемый ОС устройству, в отличии от кода зашитого во флешку. Что-то вроде UUID присваиваемый диску как точный идентификатор диска. Внимательно прочитал, серийный номер, но не имеет отношения к флешке, он имеет отношение к тому, то есть диску/разделу на флешке для идентификации. Если переводить DeviceId на русский, то это не серийник, а идентификатор устройства, хотя его тоже можно рассматривать как серийник, только устройства, а не диска рассматривая его как устройство, а не как раздел/том/буква_диска.

Проверь

Код:
EnableExplicit

Procedure.s GetDriveInfo(Drive2$)
	Protected.s Lfwrk, FileSystem, VolName
	Protected SN
	Lfwrk = Drive2$ + ":\"
	FileSystem = Space(256)
	VolName = Space(256)
; 	SN = Space(256)
	If GetVolumeInformation_(@Lfwrk, @VolName, 255, @SN, 0, 0, @FileSystem, 255)
    Debug "диск = " + Lfwrk
    Debug "имя = " + VolName
    Debug "серийник = " + SN
    Debug "серийник HEX = " + Hex(SN)
    Debug "фс = " + FileSystem
	EndIf
EndProcedure

GetDriveInfo("E")

Отредактировано AZJIO (27.09.2022 09:40:55)

0

9

AZJIO написал(а):

Не уверен но я изначально предполагал, что SN это номер устройства присваиваемый ОС устройству, в отличии от кода зашитого во флешку. Что-то вроде UUID присваиваемый диску как точный идентификатор диска.

Не уверен но я изначально предполагал, что SN это номер устройства присваиваемый ОС устройству, в отличии от кода зашитого во флешку. Что-то вроде UUID присваиваемый диску как точный идентификатор диска...
Хороший вопрос. Если это SN от системы, то он тогда нафиг не нужен. Нужен именно зашийтый в флешку и тогда надо юзать GetVolumeInformation. Пойду проверю на другом компе, что это за номер в реестре прописывается

DriveGetName.

Да работает, но нужен номер под которым смонтирован, а не какой посчету для пользователя отображается.

0

10

pozvonok
я добавил уточнение, в свой предыдущий пост что это можно назвать серийником, но не тома/раздела/буквы_диска, а устройства, и гуглится у некоторых как серийник, а не как идентификатор устройства если читать DeviceId с англ. на русс.

pozvonok написал(а):

Нужен именно зашийтый в флешку и тогда надо юзать GetVolumeInformation

не как раз таки наоборот

AZJIO написал(а):

Да работает, но нужен номер под которым смонтирован, а не какой посчету для пользователя отображается.

а разве номер под котором смонтирован и под которым отображается пользователю не одно и тоже?
DriveGetNumber (а не DriveGetName) возвращает уникальный номер (0 ,1, 2 и т.д.) физического устройства, под которым диски подключены к Windows, и номера разделов (1,2,3) которые подключены как разделы физического, отсюда номер и раздел составляют уникальный номер, не могут быть два физических диска с номером 1, это как считать 10 яблок в корзине и каждый назвать номером 1 и сказать одно яблоко в корзине потому что все 1.

Отредактировано AZJIO (27.09.2022 09:55:21)

0

11

добавил уточнение, в свой предыдущий пост что это можно назвать серийником, но не тома/раздела/буквы_диска, а устройства, и гуглится у некоторых как серийник, а не как идентификатор устройства если читать DeviceId с англ. на русс.

Да на разных компах одинаковый.
Но что тогда выдает серийник я уже запутался

0

12

AZJIO написал(а):

pozvonok

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

(Сегодня 09:55:21)

Нет, если говорим про мой компьютьер и C,D, E  то это будет 1,2,3 по тому коду, который вы дали.
Однако если мы зайдем в диспетчер дисков, то D может быть 3, а E 2
В данном случае код, который я приводил выше, выдает правильный номер под DevInst:

У меня много дисков и вставлено три флешки для тестов. Поэтому и обнаружил расхожения в показаниях  вашего кода и который я постил

0

13

pozvonok написал(а):

Нет, если говорим про мой компьютьер и C,D, E  то это будет 1,2,3 по тому коду, который вы дали.

Именно так и работает DriveGetNumber, он не связывает буквы дисков с номерами от слова совсем. Если у меня диск С = 0 и диск S тоже равен 0, потому что это один и тот же физический диск, но я дал ему букву S чтобы он был последним, так как это загрузочный.

pozvonok написал(а):

Но что тогда выдает серийник я уже запутался

мне он не нужен, поэтому и не ищу что он выдаёт, либо идентификатор для ОС, чтобы не путать диски/разделы между собой, либо идентификатор тома на жёстком диске. Но так как это отличается от UUID, то это какой то собственный идентификатор, потому что идентификатор тома на жёстком диске в Linux и в Crub2 является UUID, а это длинное число, как GUID в Windows.

Там же была ссылка на ChkDskGui со скрином, на котором видны номера дисков, что они не повторяют буквы диска.

Примерно так выглядит UUID 340a7cc9-17f1-41be-add3-10baabec0cd4

Отредактировано AZJIO (27.09.2022 10:22:51)

0

14

Я, конечно, могу ошибаться, но GetVolumeInformation даст sn ТОМА (Volume), который присваивается случайным образом при форматировании.
Для получения "железного" серийного номера нужен DeviceIoControl.

0

15

https://learn.microsoft.com/ru-ru/windo … in-windows
Вот пишут что сирийник в guid контейнера форматируют значит он в реестре уникальный,по нему и отслеживать?

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Работа с биосом флешки, что и где почитать?