:: Visual Foxpro, Foxpro for DOS
Серийный номер USB
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Коллеги, вроде через WMI наваял на коленке, но по факту сказали не работает на разных флешках.

Может, чтобы не изобретать велосипед (и в помощь не мне, Татьяне - Олега Димухаметова жена, хороший был человек, сейчас сопровождаю его проекты, в целом успешно, но сложность высокого уровня) - кто чем богат. Я нагуглю и решу. Но время против нас.

Стеб и ненужные комментарии - непродуктивно. Лучше пройдите мимо. На Сергеев надеюсь (avvhokink, я по памяти, прошу простить, буду точнее в нике, уважаю Серегу).

Жаль, что не видно корифеев (Серега давно в их числе!) других - Рома, Володя (Aspid)...

Ну или пните в технологию, поди ума хватит. Не жаловался на недостаток.

Я написал, что через WMI на коленке. Оказывается не работает. Не хочется заново изобретать квадратный лисапед, если у кого есть решения.

С уважением к ПО СУЩЕСТВУ.

Спасиб!


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Серийный номер USB
leonid
Автор

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Когда-то такое работало, но давно не проверял

Часть текста скрыта
#DEFINE GENERIC_WRITE 0x40000000
#DEFINE FILE_SHARE_READ 0x1
#DEFINE FILE_SHARE_WRITE 0x2
#DEFINE OPEN_EXISTING 0x3
#DEFINE INVALID_HANDLE_VALUE -1
#DEFINE USB_DEVICE_DESCRIPTOR_TYPE 0x1
#DEFINE USB_STRING_DESCRIPTOR_TYPE 0x3
#DEFINE IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 0x220410
#DEFINE IOCTL_STORAGE_GET_DEVICE_NUMBER 0x2D1080
#DEFINE IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME 0x220420
#DEFINE IOCTL_USB_GET_NODE_INFORMATION 0x220408
#DEFINE IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX 0x220448
#DEFINE GUID_DEVINTERFACE_DISK "53f56307-b6bf-11d0-94f2-00a0c91efb8b"
#DEFINE GUID_DEVINTERFACE_USB_HUB "f18a0e88-c30c-11d0-8815-00a0c906bed8"
#DEFINE SPDRP_DRIVER 9
#DEFINE SPDRP_DEVICEDESC 0
#DEFINE REG_SZ 1
#DEFINE DIGCF_ALLCLASSES 0x4
#DEFINE DIGCF_PRESENT 0x2
#DEFINE DIGCF_DEVICEINTERFACE 0x10
#DEFINE REGSTR_KEY_USB "USB"
#DEFINE MAXIMUM_USB_STRING_LENGTH 255
#DEFINE BUFFER_SIZE 2048
Function usb_sn
lpara m.dr
* Usage:
* ?usb_sn("D")
local i, m.cnt, m.gdk, m.gdd, m.gsd
m.gsd=""
HubDevicePath=repl(chr(0),2048)
InstanceID=repl(chr(0),2048)
=FindDiskDevice(m.dr+":\", @HubDevicePath, @InstanceID)
m.cnt=GetPortCount(HubDevicePath)
for i=1 to m.cnt
m.gdk=GetDriverKeyName(HubDevicePath, i)
if !empty(m.gdk)
if FindInstanceIDByKeyName(m.gdk)==InstanceID
m.gdd=GetDeviceDescriptor(HubDevicePath, i)
if asc(substr(m.gdd,17,1))>0
m.gsd=GetStringDescriptor(HubDevicePath, i, asc(substr(m.gdd,17,1)))
exit
endif
endif
endif
next
return m.gsd
Function TrimEnd
lparameter m.st, m.ch
do while right(m.st,1)=m.ch
m.st=left(m.st,len(m.st)-1)
enddo
return m.st
Function GetDeviceNumber
lparameter DevicePath
Declare Integer CloseHandle in kernel32 Integer hObject
Declare Integer CreateFile in kernel32 String lpFileName, Integer dwDesiredAccess, Integer dwShareMode, ;
Integer lpSecurityAttributes, Integer dwCreationDisposition, Integer dwFlagsAndAttributes, ;
Integer hTemplateFile
Declare Integer DeviceIoControl in kernel32 Integer hDevice, Integer dwIoControlCode, String @lpInBuffer, ;
Long nInBufferSize, String @lpOutBuffer, Long nOutBufferSize, Integer @lpBytesReturned, ;
Integer lpOverlapped
local ans, handle, reqSize, nBytes, ptrSdn
ans = -1
handle = CreateFile(TrimEnd(DevicePath,"\"), 0, 0, 0, OPEN_EXISTING, 0, 0)
If handle <> INVALID_HANDLE_VALUE
reqSize = 0
nBytes = 12
ptrSdn = Replicate(chr(0),nBytes)
If DeviceIoControl(handle, IOCTL_STORAGE_GET_DEVICE_NUMBER, chr(0), 0, @ptrSdn, nBytes, reqSize, 0) <> 0
ans = bitlshift(str2dword(left(ptrSdn,4)),8) + str2dword(substr(ptrSdn,5,4))
EndIf
CloseHandle(handle)
EndIf
Return ans
Function Guid
lparameter m.guid
m.guid=chrtran(m.guid,"{}-","")
return ;
word2str(eval("0x"+substr(m.guid,5,4)))+ ;
word2str(eval("0x"+substr(m.guid,1,4)))+ ;
word2str(eval("0x"+substr(m.guid,9,4)))+ ;
word2str(eval("0x"+substr(m.guid,13,4)))+ ;
chr(eval("0x"+substr(m.guid,17,2)))+ ;
chr(eval("0x"+substr(m.guid,19,2)))+ ;
chr(eval("0x"+substr(m.guid,21,2)))+ ;
chr(eval("0x"+substr(m.guid,23,2)))+ ;
chr(eval("0x"+substr(m.guid,25,2)))+ ;
chr(eval("0x"+substr(m.guid,27,2)))+ ;
chr(eval("0x"+substr(m.guid,29,2)))+ ;
chr(eval("0x"+substr(m.guid,31,2)))
Function FindDiskDevice
lparameter DriveLetter, HubDevicePath, InstanceID
local ans, DeviceNumber, DiskGUID, hSetup, Success, i, dia, da, didd
ans=.f.
DeviceNumber = GetDeviceNumber("\\.\" + TrimEnd(DriveLetter,"\"))
If DeviceNumber < 0
Return ans
EndIf
DiskGUID = guid(GUID_DEVINTERFACE_DISK)
Declare Integer SetupDiGetClassDevs in "setupapi.dll" ;
String @ClassGuid, ;
Integer Enumerator, ;
Integer hwndParent, ;
Integer Flags
Declare Integer SetupDiEnumDeviceInterfaces in "setupapi.dll" ;
Integer DeviceInfoSet, ;
Integer DeviceInfoData, ;
String InterfaceClassGuid, ;
Integer MemberIndex, ;
String @DeviceInterfaceData && As SP_DEVICE_INTERFACE_DATA _
Declare Integer SetupDiDestroyDeviceInfoList in "setupapi.dll" ;
Integer DeviceInfoSet
Declare Integer GetLastError in Win32API
Declare Integer SetupDiEnumDeviceInfo In setupapi;
Integer DeviceInfoSet,;
Integer MemberIndex,;
String @DeviceInfoData
Declare Integer CM_Get_Parent in "setupapi.dll" ;
Integer @pdnDevInst, ;
Integer dnDevInst, ;
Integer ulFlags
Declare Integer CM_Get_Device_ID in "setupapi.dll" ;
Integer pdnDevInst, ;
String @Buffer, ;
Integer BufferLen, ;
Integer ulFlags
hSetup = SetupDiGetClassDevs(DiskGUID, 0, 0, bitor(DIGCF_PRESENT, DIGCF_DEVICEINTERFACE))
m.a = GetLastError()
If hSetup <> INVALID_HANDLE_VALUE
i = 0
Success=1
Do while Success<>0
dia = dword2str(28)+replicate(chr(0),16)+replicate(chr(0),4)+replicate(chr(0),4)
Success = SetupDiEnumDeviceInterfaces(hSetup, 0, DiskGUID, i, @dia)
if Success <> 0
da = dword2str(28)+replicate(chr(0),16)+replicate(chr(0),4)+replicate(chr(0),4)
didd = dword2str(5)+replicate(chr(0),BUFFER_SIZE)
nBytes = BUFFER_SIZE
nRequiredSize = 0
Declare Integer SetupDiGetDeviceInterfaceDetail in "setupapi.dll" ;
Integer DeviceInfoSet, ;
String DeviceInterfaceData, ;
String @DeviceInterfaceDetailData, ;
Integer DeviceInterfaceDetailDataSize, ;
Integer @RequiredSize, ;
String @DeviceInfoData
m.err1 = SetupDiGetDeviceInterfaceDetail(hSetup, dia, @didd, nBytes, @nRequiredSize, @da)
if m.err1 <> 0
m.err2=GetDeviceNumber(substr(didd,5))
if m.err2 = DeviceNumber
ptrPrevious = 0
CM_Get_Parent(@ptrPrevious, str2dword(substr(da,21,4)), 0)
ptrBuf = replicate(chr(0), nBytes)
CM_Get_Device_ID(ptrPrevious, @ptrBuf, nBytes, 0)
InstanceID = chrtran(ptrBuf, chr(0), "")
CM_Get_Parent(@ptrPrevious, ptrPrevious, 0)
ptrBuf = replicate(chr(0), nBytes)
CM_Get_Device_ID(ptrPrevious, @ptrBuf, nBytes, 0)
HubDevicePath = "\\.\" + chrtran(ptrBuf,"\"+chr(0), "#") + "#{" + ; GUID_DEVINTERFACE_USB_HUB + "}"
ans = .t.
Exit
EndIf
EndIf
EndIf
i = i+1
Enddo
Endif
SetupDiDestroyDeviceInfoList(hSetup)
Return ans
Function GetPortCount
lparameter HubDevicePath
Declare Integer CloseHandle in kernel32 Integer hObject
Declare Integer CreateFile in kernel32 String lpFileName, Integer dwDesiredAccess, Integer dwShareMode, ;
Integer lpSecurityAttributes, Integer dwCreationDisposition, Integer dwFlagsAndAttributes, ;
Integer hTemplateFile
Declare Integer DeviceIoControl in kernel32 Integer hDevice, Integer dwIoControlCode, String @lpInBuffer, ;
Long nInBufferSize, String @lpOutBuffer, Long nOutBufferSize, Integer @lpBytesReturned, ;
Integer lpOverlapped
local ans, hHub, nBytesReturned, NodeInfo, nBytes, ptrNodeInfo
ans = 0
hHub = CreateFile(HubDevicePath, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
If hHub <> INVALID_HANDLE_VALUE
nBytesReturned = 0
NodeInfo = Chr(0)+replicate(chr(0),75)
nBytes = 76
m.err3 = DeviceIoControl(hHub, IOCTL_USB_GET_NODE_INFORMATION, @NodeInfo, nBytes, ;
@NodeInfo, nBytes, @nBytesReturned, 0)
if m.err3 <> 0
ans = asc(substr(NodeInfo,7,1))
EndIf
CloseHandle(hHub)
EndIf
Return ans
Function GetDriverKeyName
lparameter HubPath, PortNumber
Declare Integer CloseHandle in kernel32 Integer hObject
Declare Integer CreateFile in kernel32 String lpFileName, Integer dwDesiredAccess, Integer dwShareMode, ;
Integer lpSecurityAttributes, Integer dwCreationDisposition, Integer dwFlagsAndAttributes, ;
Integer hTemplateFile
Declare Integer DeviceIoControl in kernel32 Integer hDevice, Integer dwIoControlCode, String @lpInBuffer, ;
Long nInBufferSize, String @lpOutBuffer, Long nOutBufferSize, Integer @lpBytesReturned, ;
Integer lpOverlapped
local ans, hHub, nBytesReturned, nBytes, NodeConnection, DriverKey
ans = ""
hHub = CreateFile(HubPath, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
If hHub <> INVALID_HANDLE_VALUE
nBytesReturned = 0
nBytes = 35
NodeConnection = dword2str(PortNumber)+chr(18)+replicate(chr(0),30)
m.err4 = DeviceIoControl(hHub, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, ;
@NodeConnection, nBytes, @NodeConnection, nBytes, @nBytesReturned, 0)
if m.err4 <> 0
If str2dword(substr(NodeConnection,32,4)) = 1
DriverKey = dword2str(PortNumber)+dword2str(0)+replicate(chr(0),BUFFER_SIZE)
nBytes = BUFFER_SIZE + 8
m.err5 = DeviceIoControl(hHub, IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, ;
@DriverKey, nBytes, @DriverKey, nBytes, @nBytesReturned, 0)
if m.err5 <> 0
ans = chrtran(substr(DriverKey,9),chr(0),"")
EndIf
EndIf
EndIf
CloseHandle(hHub)
EndIf
Return ans
Function FindInstanceIDByKeyName
lparameter DriverKeyName
Declare Integer SetupDiGetClassDevs in "setupapi.dll" ;
Integer ClassGuid, ; &&As Guid
String Enumerator, ;
Integer hwndParent, ;
Integer Flags
Declare Integer SetupDiEnumDeviceInfo in "setupapi.dll" ;
Integer DeviceInfoSet, ;
Integer MemberIndex, ;
String @DeviceInfoData &&As SP_DEVINFO_DATA _
Declare Integer SetupDiGetDeviceRegistryProperty in "setupapi.dll" ;
Integer DeviceInfoSet, ;
String @DeviceInfoData, ; &&As SP_DEVINFO_DATA, _
Integer iProperty, ;
Integer @PropertyRegDataType, ;
String @PropertyBuffer, ;
Integer PropertyBufferSize, ;
Integer @RequiredSize
Declare Integer SetupDiGetDeviceInstanceId in "setupapi.dll" ;
Integer DeviceInfoSet, ;
String DeviceInfoData, ; &&As SP_DEVINFO_DATA, _
String @DeviceInstanceId, ; &&As StringBuilder, _
Integer DeviceInstanceIdSize, ;
Integer @RequiredSize
Declare Integer SetupDiDestroyDeviceInfoList in "setupapi.dll" ;
Integer DeviceInfoSet
local ans, DevEnum, hndl, ptrBuf, KeyName, Success, i, da, RequiredSize, RegType, nBytes, sb
ans = ""
DevEnum = REGSTR_KEY_USB
hndl = SetupDiGetClassDevs(0, DevEnum, 0, bitor(DIGCF_PRESENT, DIGCF_ALLCLASSES))
If hndl <> INVALID_HANDLE_VALUE
ptrBuf = replicate(chr(0), BUFFER_SIZE)
i = 0
Success=1
Do while Success <>0
da = dword2str(28)+replicate(chr(0),24)
Success = SetupDiEnumDeviceInfo(hndl, i, @da)
If Success <> 0
RequiredSize = 0
RegType = REG_SZ
KeyName = ""
m.err6 = SetupDiGetDeviceRegistryProperty(hndl, @da, SPDRP_DRIVER, @RegType, ;
@ptrBuf, BUFFER_SIZE, @RequiredSize)
if m.err6 <>0
KeyName = chrtran(ptrBuf,chr(0),"")
EndIf
If KeyName = DriverKeyName
nBytes = BUFFER_SIZE
sb = replicate(chr(0), nBytes)
m.err7 = SetupDiGetDeviceInstanceId(hndl, da, @sb, nBytes, @RequiredSize)
if m.err7 <> 0
ans = chrtran(sb, chr(0), "")
endif
Exit
EndIf
EndIf
i = i+1
Enddo
SetupDiDestroyDeviceInfoList(hndl)
CloseHandle(hndl)
EndIf
Return ans
Function GetDeviceDescriptor
lparameter HubPath, PortNumber
Declare Integer CloseHandle in kernel32 Integer hObject
Declare Integer CreateFile in kernel32 String lpFileName, Integer dwDesiredAccess, Integer dwShareMode, ;
Integer lpSecurityAttributes, Integer dwCreationDisposition, Integer dwFlagsAndAttributes, ;
Integer hTemplateFile
Declare Integer DeviceIoControl in kernel32 Integer hDevice, Integer dwIoControlCode, String @lpInBuffer, ;
Long nInBufferSize, String @lpOutBuffer, Long nOutBufferSize, Integer @lpBytesReturned, ;
Integer lpOverlapped
local ans, hHub, ptrDescReq, ptrDevDesc, DescReq, DevDesc, nBytesReturned, nBytes
ans = chr(18)+replicate(chr(0), 17)
hHub = CreateFile(HubPath, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
If hHub <> INVALID_HANDLE_VALUE
nBytes = BUFFER_SIZE
nBytesReturned = 0
DescReq = dword2str(PortNumber)+chr(0)+chr(0)+ ;
word2str(bitlshift(USB_DEVICE_DESCRIPTOR_TYPE, 8))+ ;
chr(0)+chr(0)+word2str(nBytes-12)+replicate(chr(0),nBytes-12)
m.err8 = DeviceIoControl(hHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, ;
@DescReq, nBytes, @DescReq, nBytes, @nBytesReturned, 0)
if m.err8 <> 0
ans = substr(DescReq,13,18)
EndIf
CloseHandle(hHub)
EndIf
Return ans
Function GetStringDescriptor
lparameter HubPath, PortNumber, Index
Declare Integer CloseHandle in kernel32 Integer hObject
Declare Integer CreateFile in kernel32 String lpFileName, Integer dwDesiredAccess, Integer dwShareMode, ;
Integer lpSecurityAttributes, Integer dwCreationDisposition, Integer dwFlagsAndAttributes, ;
Integer hTemplateFile
Declare Integer DeviceIoControl in kernel32 Integer hDevice, Integer dwIoControlCode, String @lpInBuffer, ;
Long nInBufferSize, String @lpOutBuffer, Long nOutBufferSize, Integer @lpBytesReturned, ;
Integer lpOverlapped
local ans, hHub, ptrDescReq, ptrDevDesc, DescReq, DevDesc, nBytesReturned, nBytes, nLen
ans = ""
hHub = CreateFile(HubPath, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)
If hHub <> INVALID_HANDLE_VALUE
nBytes = BUFFER_SIZE
nBytesReturned = 0
DescReq = dword2str(PortNumber)+chr(0)+chr(0)+ ;
word2str(bitlshift(USB_STRING_DESCRIPTOR_TYPE, 8)+Index)+ ;
word2str(0x409)+word2str(nBytes-12)+replicate(chr(0),nBytes-12)
m.err9 = DeviceIoControl(hHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, ;
@DescReq, nBytes, @DescReq, nBytes, @nBytesReturned, 0)
if m.err9 <> 0
ans = strconv(substr(DescReq,15,asc(substr(DescReq,13,1))-2),6)
set safety off
EndIf
CloseHandle(hHub)
EndIf
Return ans
Function dword2str
lparameter m.wrd
local m.wrd1, m.st1
m.wrd1=m.wrd%4294967296
Declare RtlMoveMemory in Win32API String @st1, Integer @wrd, Integer cnt
m.st1=chr(0)+chr(0)+chr(0)+chr(0)
RtlMoveMemory(@m.st1, @m.wrd, 4)
Return m.st1
Function str2dword
lparameter m.st1
local m.st2,m.wrd
if len(m.st1)<4
m.st2=padl(m.st1,4,chr(0))
else
m.st2=left(m.st1,4)
endif
m.wrd=0
Declare RtlMoveMemory in Win32API Integer @wrd, String @st1, Integer cnt
RtlMoveMemory(@m.wrd, @m.st1, 4)
Return m.wrd
Function word2str
lparameter m.wrd
local m.wrd1, m.st1
m.wrd1=m.wrd%65536
Declare RtlMoveMemory in Win32API String @st1, Integer @wrd, Integer cnt
m.st1=chr(0)+chr(0)
RtlMoveMemory(@m.st1, @m.wrd, 2)
Return m.st1
Function str2word
lparameter m.st1
local m.st2,m.wrd
if len(m.st1)<2
m.st2=padl(m.st1,2,chr(0))
else
m.st2=left(m.st1,2)
endif
m.wrd=0
Declare RtlMoveMemory in Win32API Integer @wrd, String @st1, Integer cnt
RtlMoveMemory(@m.wrd, @m.st1, 2)
Return m.wrd

Ratings: 0 negative/1 positive
Re: Серийный номер USB
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Сам никогда таким не занимался, но если бы нужно было сделать это быстро, то сначала просто бы воспользовался какими-нибудь готовыми бесплатными консольными утилитами, выдающими необходимую информацию в виде файла.
Первая же ссылка, которую выдал Гугл - USBDeview.exe - вполне подходит для решения проблемы.

Запускал бы её как-то так:
STRTOFILE('@USBDeview.exe /stext usb.txt /DisplayDisconnected 0 /DisplayNoPortSerial 0','usbinfo.cmd')
ws = CreateObject('WScript.Shell')
ws.Run('usbinfo.cmd',2,.T.)
MODIFY COMMAND usb.txt
А потом, если потребуется, можно спокойно искать, изучать и отлаживать варианты через WinAPI и т.п.
----------

Сейчас посмотрел - эта утилита может явно ответить на вопрос, вставлен ли накопитель с указанным серийным номером в комп (если это и есть конечная цель):
USBDeview.exe /is_connected_by_serial "3384600601" 
echo %ERRORLEVEL%



Исправлено 3 раз(а). Последнее : akvvohinc, 04.03.23 16:47
Ratings: 0 negative/0 positive
Re: Серийный номер USB
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Так по ней и сверял. Сказали код через ВМИ - всегда одно и то же выдает.

Леонид, как всегда выручаешь. Я гляну, должно работать. Правда, спасибо!


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Серийный номер USB
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Цитата:
А потом, если потребуется, можно спокойно искать, изучать и отлаживать варианты через WinAPI и т.п.

Да все так, базара нет.

Можно и через утилиту, инструкции дам, каждые пять минут точно не надо. Но хочется по фен-шую.

Друзья, спасибо.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
Можно и через утилиту, инструкции дам
По поводу инструкций я не понял - пользователю вообще ничего знать о реализации не потребуется - всё будет внутри проги, даже та утилита.
Ratings: 0 negative/0 positive
Re: Серийный номер USB
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Да я на тот случай, если через батник-скриптами. Тогда Тане инструкции. А так да, все в программе.

В общем материал есть, значит меньше поиском.

Все запустим. Какой вариант полетел/остановился - да, напишу. И другим пригодится.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/1 positive
Re: Серийный номер USB
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
sphinx
Да я на тот случай, если через батник-скриптами. Тогда Тане инструкции. А так да, все в программе.
И всё равно не понял - при чем здесь батник и инструкции Тане?
Всё без исключения, включая батник и даже инструкции Тане, будет зашито в программу, и это сделает тот, кто пишет прогу (это Таня или ты?).
Пользователь проги вообще ничего не будет знать ни об утилите, ни о том, каким образом она запускается.

Недавно была похожая тема, где с помощью Powershell что-то там выясняли.
Разница лишь в одном - Powershell-утилита - часть Windows, а утилиту USBDeview надо сначала скачать.



Исправлено 1 раз(а). Последнее : akvvohinc, 06.03.23 01:21
Ratings: 0 negative/0 positive
Re: Серийный номер USB
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Код от Леонида рабочий (в одном месте убрать перенос (;), протестировано.
Проблема закрыта.
Всем, кто обсуждал и пытался помочь - респект!


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Особого смысла не имеет, но всё же дополню.
Леонид писал код, видимо, до появления в Фоксе функций CTOBIN() и BINTOC().
С их помощью можно заменить функцию word2str и прочие подобные функции его кода.

TrimEnd тоже теперь можно заменить стандартной TRIM().



Исправлено 1 раз(а). Последнее : akvvohinc, 11.03.23 02:26
Ratings: 0 negative/0 positive
Re: Серийный номер USB
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Да, я обратил внимание. Дойдут руки - подправлю.
Спасибо!


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Серийный номер USB
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
sphinx
Да, я обратил внимание. Дойдут руки - подправлю.
Спасибо!
А вот тебе для затравки:
Function word2str
Lparameter m.wrd
*ssa* Local m.wrd1, m.st1
*ssa* m.wrd1=m.wrd%65536
*ssa* Declare RtlMoveMemory In Win32API String @st1, Integer @wrd, Integer Cnt
*ssa* m.st1=Chr(0)+Chr(0)
*ssa* RtlMoveMemory(@m.st1, @m.wrd, 2)
*ssa* Return m.st1
Return Left(BinToC(Right(m.wrd,2),'4rs'),2)+Left(BinToC(Left(m.wrd,2),'4rs'),2)
TrimEnd заменяется на Rtrim
Function Guid
Lparameter m.Guid
m.Guid=Chrtran(m.Guid,"{}-","")
Return ;
chr(Eval("0x"+Substr(m.Guid,07,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,05,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,03,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,01,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,11,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,09,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,15,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,13,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,17,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,19,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,21,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,23,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,25,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,27,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,29,2)))+ ;
chr(Eval("0x"+Substr(m.Guid,31,2)))
*ssa* word2str(Eval("0x"+Substr(m.Guid,5,4)))+ ;
*ssa* word2str(Eval("0x"+Substr(m.Guid,1,4)))+ ;
*ssa* word2str(Eval("0x"+Substr(m.Guid,9,4)))+ ;
*ssa* word2str(Eval("0x"+Substr(m.Guid,13,4)))+ ;


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Function word2str
Lparameter m.wrd
Return Left(BinToC(Right(m.wrd,2),'4rs'),2)+Left(BinToC(Left(m.wrd,2),'4rs'),2)
Нет, здесь иначе - функция принимает число и возвращает строку длиной 2:
RETURN LEFT(BINTOC(m.wrd,'4r'),2)
Ratings: 0 negative/0 positive
Re: Серийный номер USB
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
akvvohinc
Цитата:
Function word2str
Lparameter m.wrd
Return Left(BinToC(Right(m.wrd,2),'4rs'),2)+Left(BinToC(Left(m.wrd,2),'4rs'),2)
Нет, здесь иначе - функция принимает число и возвращает строку длиной 2:
RETURN LEFT(BINTOC(m.wrd,'4r'),2)
Угу. Я, оказалось, тестировал не некорректных данных. Недоглядел. Надо бы посыпать голову пеплом, да взять его негде, не курю.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
chr(Eval("0x"+Substr(m.Guid,07,2)))
А так на одну функцию меньше:
Eval("0h"+Substr(m.Guid,07,2))



Исправлено 1 раз(а). Последнее : akvvohinc, 11.03.23 18:34
Ratings: 0 negative/0 positive
Re: Серийный номер USB
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Eval("0h"+Substr(m.Guid,07,2))

? 0h + Substr(m.Guid,07,2) - вернет тоже самое
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
0h + Substr(m.Guid,07,2) - вернет тоже самое
А если проверить?

В первом случае извлекаемые символы трактуются как 16-ричные цифры (каждые 2 символа строки преобразуются в 1 байт),
а во втором - как "просто символы", каждый из которых используется "как есть" (1 байт каждый).

Иными словами, символ и код символа - совсем не одно и то же:
? EVAL('0h'+'0A')  && 0h0A
? 0h+'0A'          && 0h3041



Исправлено 5 раз(а). Последнее : akvvohinc, 12.03.23 03:29
Ratings: 0 negative/1 positive
Re: Серийный номер USB
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> EVAL('0h'+'0A') && 0h0A
естественно - это же 0h0A
она же
x = '0h'+'0A'
? &x && 0h0A
...
да, упустил компиляцию (EVAL) в мозгу, звоночки... )

() я использую конструкцию
x = 0h + строка
? &x && Q-строка, изображается в фоксовом окне как 0haabbcc... - набор 16-ричных пар чисел... удобно, что с левого (младшего) символа... все такое...



Исправлено 1 раз(а). Последнее : of63, 13.03.23 19:51
Ratings: 0 negative/0 positive
Re: Серийный номер USB
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
() я использую конструкцию
x = 0h + строка
? &x
Не может быть.
В макро нельзя использовать переменные с типом Q - только C.
Ratings: 0 negative/0 positive
Re: Серийный номер USB
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
[quote akvvohinc][quote]() я использую конструкцию
x = 0h + строка
? &x[/quote]
Не может быть.
В макро нельзя использовать переменные с типом Q - только C.[/quote]

а да ошибся, блин (
x = "'0h'" + "'"+строка+"'"
? EVAL(x) && задел, Сергей )[/quote]

... туплю



Исправлено 1 раз(а). Последнее : of63, 13.03.23 21:09
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика