:: Visual Foxpro, Foxpro for DOS
Re: Чтение со смарт-карты
_vit

Сообщений: 5176
Дата регистрации: 29.07.2002
declare LONG SCardConnect IN Winscard.dll long hContext, string szReader, long dwShareMode, long dwPreferredProtocols, long @ phCard, long @ pdwActiveProtocol
declare LONG SCardEstablishContext IN Winscard.dll long dwScope, long pvReserved1, long pvReserved2, long @ phContext
declare LONG SCardReleaseContext IN Winscard.dll long phContext
declare LONG SCardListReaders IN Winscard.dll long phContext, string mszGroups, string mszReaders, long @ pcchReaders
declare LONG SCardDisconnect IN Winscard.dll long hCard, long dwDisposition
declare LONG SCardTransmit IN Winscard.dll long hCard, string pioSendPci, string pbSendBuffer, long cbSendLength, string @ pioRecvPci, string @ pbRecvBuffer, long @ pcbRecvLength
#define SCARD_SCOPE_USER 0x0000
#define SCARD_SCOPE_SYSTEM 0x0002
#define SCARD_SHARE_EXCLUSIVE 0x0001
#define SCARD_SHARE_SHARED 0x0002
#define SCARD_PROTOCOL_T0 0x0001
#define SCARD_PROTOCOL_T1 0x0002
#define SCARD_PROTOCOL_ANY 0x0003
#define SCARD_EJECT_CARD 0x0003
LOCAL phContext, lReturn, phCard, pdwActiveProtocol, pcchReaders, pioSendPci, pbSendBuffer, pbSendBuffer, pbRecvBuffer, pcbRecvLength
phContext = 0
phCard = 0
pdwActiveProtocol = 0
pcchReaders = 1
* Подключаемся
lReturn = SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, @phContext)
*lReturn = SCardListReaders(phContext, "SCard$AllReaders\000", 0, @pcchReaders)
lReturn = SCardConnect(phContext, "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0", SCARD_SHARE_SHARED, SCARD_PROTOCOL_ANY, @phCard, @pdwActiveProtocol)
* Тут многа многа типа таких комманд
pbRecvBuffer = SPACE(16)
pbSendBuffer = CHR(0xFC) + CHR(0xB0) + CHR(0x05) + CHR(0x00) + CHR(0x00)
pioSendPci = CHR(02)+ CHR(0x00) + CHR(0x00) + CHR(0x00) + CHR(08)+ CHR(0x00) + CHR(0x00) + CHR(0x00)
pcbRecvLength = 0
lReturn = SCardTransmit(phCard, pioSendPci, pbSendBuffer, len(pbSendBuffer), 0, @pbRecvBuffer, @pcbRecvLength)
*Отключаемся
lReturn = SCardDisconnect(phCard, SCARD_EJECT_CARD)
lReturn = SCardReleaseContext(phContext)

И это в помощь msdn.microsoft.com ;)
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
dimuhametov
Какой "Тип устройства" для вашего карт-ридера отображает диспетчер устройств ? Как устройство HID или USB или по другому?
Сегодня нашел два "чистых" компа, на который раньше не втыкал карт-ридер.
На XP определился как другое устройство с именем ридера.
Скачал драйвер от производителя и установил - в диспетчере устройств появился раздел
Устройства для чтения смврт-карт
ACR39U ICC Reader

На десятке установился автоматом и тоже как устройство чтения смарт-карт.

Но функция CreateFile на XP все равно дает ту же ошибку - Отказано в доступе.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Baga
Но функция CreateFile на XP все равно дает ту же ошибку - Отказано в доступе.
А какое отношение функция создания файла имеет к чтению с устройства?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
dimuhametov

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
Попробуй это (не проверял, не начем). Ну естественно перебором 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


------------------
Незнание делает жизнь такой интересной.
Ratings: 0 negative/0 positive


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

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

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