Попробуй это (не проверял, не начем). Ну естественно перебором MemberIndex от 0 до ...
#DEFINE DIGCF_PRESENT 0x00000002
#DEFINE DIGCF_INTERFACEDEVICE 0x00000010
#DEFINE INVALID_HANDLE_VALUE -1
#Define SPDRP_DEVICEDESC (0x00000000) && DeviceDesc (R/W)
#DEFINE ERROR_IO_PENDING 997
#DEFINE GUID_DEVCLASS_SMARTCARDREADER 0h3052DD508ABAD111BF5D0000F805F530 &&0x50dd5230, 0xba8a, 0x11d1, {0xbf, 0x5d, 0x00, 0x00, 0xf8, 0x05, 0xf5, 0x30
m.HidGuid=GUID_DEVCLASS_SMARTCARDREADER
hSetup=SetupDiGetClassDevs(@HidGuid,0, 0,bitor(DIGCF_PRESENT, DIGCF_INTERFACEDEVICE))
IF hSetup = INVALID_HANDLE_VALUE
DisplayLastError('SetupDiGetClassDevs')
RETURN
ENDIF
DECLARE LONG SetupDiEnumDeviceInterfaces IN setupapi.dll ;
LONG DeviceInfoSet, ; && IN HDEVINFO
LONG DeviceInfoData, ; && IN PSP_DEVINFO_DATA OPTIONAL
STRING InterfaceClassGuid, ; && IN LPGUID
LONG MemberIndex, ; && IN DWORD
STRING @DeviceInterfaceData && PSP_DEVICE_INTERFACE_DATA
MemberIndex=0 && Индекс от 0 до ... выставляем ручками
dia = dword2str(28)+replicate(chr(0),16)+replicate(chr(0),4)+replicate(chr(0),4)
ERR = SetupDiEnumDeviceInterfaces(hSetup, 0,m.HidGuid, MemberIndex, @dia)
IF ERR=0
DisplayLastError('SetupDiEnumDeviceInterfaces')
RETURN
ENDIF
DECLARE LONG SetupDiGetDeviceInterfaceDetail IN setupapi.dll ; && BOOL
LONG DeviceInfoSet, ; && IN HDEVINFO
STRING DeviceInterfaceData, ; && IN PSP_DEVICE_INTERFACE_DATA
STRING @DeviceInterfaceDetailData, ; && OUT PSP_DEVICE_INTERFACE_DETAIL_DATA OPT
LONG DeviceInterfaceDetailDataSize, ;&& IN DWORD
LONG @ RequiredSize, ; && OUT PDWORD OPT
STRING @DeviceInfoData && OUT PSP_DEVINFO_DATA OPT
da = dword2str(28)+replicate(chr(0),16)+replicate(chr(0),4)+replicate(chr(0),4)
didd = dword2str(5)+replicate(chr(0),200)
nBytes = 2048
nRequiredSize = 0
ERR = SetupDiGetDeviceInterfaceDetail(hSetup, dia, @didd, nBytes, @nRequiredSize, @da)
IF ERR=0
DisplayLastError('SetupDiGetDeviceInterfaceDetail')
RETURN
ENDIF
FN=SUBS(LEFT(didd,nRequiredSize),5)
* моя вставка
Declare Integer SetupDiEnumDeviceInfo In Setupapi.Dll ;
Integer DeviceInfoSet, ;
Integer MemberIndex, ;
String @DeviceInfoData
m.DeviceInfoData = 0h1C000000000000000000000000000000000000000000000000000000
m.lnResult = SetupDiEnumDeviceInfo(m.hSetup, m.MemberIndex, @m.DeviceInfoData)
IF m.lnResult = 0
DisplayLastError('SetupDiEnumDeviceInfo')
RETURN
ENDIF
Declare Integer SetupDiGetDeviceRegistryProperty In Setupapi.Dll ;
Integer DeviceInfoSet, ;
String DeviceInfoData, ;
Integer Property, ;
Integer @PropertyRegDataType, ;
String @PropertyBuffer, ;
Integer PropertyBufferSize, ;
Integer @RequiredSize
m.Property = SPDRP_DEVICEDESC
m.PropertyRegDataType = 0
m.PropertyBufferSize = 1024
m.PropertyBuffer = Space(m.PropertyBufferSize)
m.RequiredSize = 0
m.lnResult = SetupDiGetDeviceRegistryProperty(m.hSetup, m.DeviceInfoData, m.Property, @m.PropertyRegDataType, @m.PropertyBuffer, m.PropertyBufferSize, @m.RequiredSize)
If m.lnResult = 0 Then
DisplayLastError('SetupDiGetDeviceRegistryProperty')
RETURN
Endif
m.PropertyBuffer = Left(m.PropertyBuffer, m.RequiredSize - 1) && remove last NUL CHAR
m.lcProperty = m.PropertyBuffer
?m.MemberIndex, m.lcProperty
#DEFINE GENERIC_READ 0x80000000
#DEFINE GENERIC_WRITE 0x40000000
#DEFINE FILE_SHARE_READ 1
#DEFINE FILE_SHARE_WRITE 2
#DEFINE OPEN_EXISTING 3
#DEFINE FILE_FLAG_OVERLAPPED 0x40000000
#DEFINE INVALID_HANDLE_VALUE -1
#DEFINE FILE_ATTRIBUTE_NORMAL 128
DECLARE LONG CreateFile IN Kernel32 ; && HANDLE
STRING lpFileName,; && in LPCTSTR
LONG dwDesiredAccess, ; && in DWORD
LONG dwShareMode, ; && in DWORD
LONG lpSecurityAttributes, ; && in_opt LPSECURITY_ATTRIBUTES
LONG dwCreationDisposition,; && in DWORD dwCreationDisposition
LONG dwFlagsAndAttributes, ; && in DWORD
STRING @hTemplateFile && in_opt HANDLE hTemplateFile
OVER=REPLICATE(CHR(0),20)
H=CreateFile(m.FN,GENERIC_READ,FILE_SHARE_READ+FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0) &&0,0
? h
IF m.H = INVALID_HANDLE_VALUE
DisplayLastError('CreateFile')
RETURN
ENDIF
DECLARE LONG HidD_GetAttributes IN HID LONG, STRING @
ATTR=dword2str(10)+REPLICATE(chr(0),6)
ERR=HidD_GetAttributes(H, @ATTR)
? STRCONV(ATTR,15)
DECLARE LONG CloseHandle IN Kernel32 LONG hObject
IF ERR=0
DisplayLastError('HidD_GetAttributes')
=CloseHandle(H)
RETURN
ENDIF
DECLARE LONG HidD_GetPreparsedData IN HID ; && BOOLEAN
LONG HidDeviceObject, ; && IN HANDLE
STRING @ PreparsedData && OUT PHIDP_PREPARSED_DATA
PPD=replicate(chr(0),2048)
ERR=HidD_GetPreparsedData (H, @PPD)
IF ERR=0
DisplayLastError('HidD_GetPreparsedData')
=CloseHandle(H)
RETURN
ENDIF
DECLARE LONG ReadFile IN Kernel32 ; && BOOL
LONG hFile, ; && in HANDLE
STRING @lpBuffer, ; && out LPVOID
LONG nNumberOfBytesToRead, ; && in DWORD
LONG @lpNumberOfBytesRead, ; && out_opt LPDWORD
STRING @lpOverlapped && inout_opt LPOVERLAPPED
Read=0
BUF=REPLICATE(CHR(0),1024)
ERR=ReadFile(H, @BUF, LEN(BUF),@Read,0)
IF ERR=0
IF ERROR_IO_PENDING!=DisplayLastError('ReadFile')
RETURN
ENDIF
ENDIF
? left(BUF,30)
=CloseHandle(H)
***************************************************************
FUNCTION DisplayLastError(FUNC_NAME)
LOCAL lnErr
DECLARE LONG GetLastError IN WIN32API
lnErr = GetLastError()
?"Error in "+FUNC_NAME+ " " + TRANSFORM(lnErr) + ". " + GetErrorMessage(lnErr)
RETURN lnErr
***************************************************************
FUNCTION GetErrorMessage(lnErr)
#DEFINE FORMAT_MESSAGE_ALLOCATE_BUFFER 256
#DEFINE FORMAT_MESSAGE_FROM_SYSTEM 4096
#DEFINE FORMAT_MESSAGE_IGNORE_INSERTS 512
DECLARE LONG FormatMessage IN kernel32;
LONG dwFlags, LONG lpSource, LONG dwMessageId,;
LONG dwLanguageId, LONG @lpBuffer,;
LONG nSize, LONG Arguments
LOCAL dwFlags, lpBuffer, lnLength, lpResult
dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER +;
FORMAT_MESSAGE_FROM_SYSTEM + FORMAT_MESSAGE_IGNORE_INSERTS
lpBuffer = 0
lnLength = FormatMessage(dwFlags, 0, lnErr, 0, @lpBuffer, 0,0)
IF lnLength <> 0
lpResult = REPLI(Chr(0), 500)
* = CopyMemory (@lpResult, lpBuffer, lnLength)
lpResult=SYS(2600,lpBuffer,lnLength)
RETURN STRTRAN(LEFT(lpResult, lnLength), Chr(13)+Chr(10), "")
ELSE
RETURN "[]"
ENDIF
******************************************
Function dword2str
lparameter m.wrd
local m.wrd1, m.st1
m.wrd1=m.wrd%4294967296
Declare RtlMoveMemory in Win32API String @st1, Integer @wrd1, Integer cnt
m.st1=chr(0)+chr(0)+chr(0)+chr(0)
RtlMoveMemory(@m.st1, @m.wrd1, 4)
Return m.st1