:: Visual Foxpro, Foxpro for DOS
Чтение со смарт-карты
Baga
Автор

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Пол-дня потратил на поиск чего-либо по этой теме на форуме.
Не верил, что ничего нет. Все равно не нашел.
Может кто ссылку даст или подскажет, как подключиться, как взять данные с карты средствами VFP?
Вообще с чего начать. Карт-ридер ASR39. Спокойно читает данные из программы стороннего разработчика.
Но хочется чего-то своего.


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

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
forum.foxclub.ru


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

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
Для себя делал подключение и чтение штрих- кода со сканера, подключенного как устройстов HID(USB)
Загвоздка в том, что пока приходиться вручную выставлять индекс MemberIndex=0 (перебором от ноля) в список интерфейсов.
Ну а далее уже со своим "напильником".
#Define SPDRP_DEVICEDESC (0x00000000) && DeviceDesc (R/W)
#DEFINE ERROR_IO_PENDING 997
DECLARE HidD_GetHidGuid IN HID STRING @ HidGuid
HidGuid=REPLICATE(CHR(0),16)
HidD_GetHidGuid(@HidGuid)
#DEFINE DIGCF_PRESENT 0x00000002
#DEFINE DIGCF_INTERFACEDEVICE 0x00000010
#DEFINE INVALID_HANDLE_VALUE -1
DECLARE long SetupDiGetClassDevs IN setupapi ;
STRING @ ClassGuid, ;
STRING @ Enumerator, ;
LONG hwndParent, ;
LONG Flags
ENUM=''
hSetup=SetupDiGetClassDevs(@HidGuid,0, 0, 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, 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
Re: Чтение со смарт-карты
Baga
Автор

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Спасибо. Буду пробовать.


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

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
CreateFile дает ошибку Отказано в доступе.
Почитал немного о kernel.dll
Оказывается Отказ в доступе не единственная его проблема.
Зарегистрировать новый (скачанный, как пишут, для Win-64) файл тоже не получилось.
Можно, конечно, если очень постараться. Но не уверен, что не появится другая ошибка.
Потом у пользователей все налаживать - овчинка выделки стоит?

У меня есть примеры от производителя на C++ или C#. Но как их прикрутить к фоксу не знаю.
Кто хочет посмотреть: во вложении


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

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Baga
Кто хочет посмотреть: во вложении
Осталось только найти сие вложение...

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

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Не знаю... Вроде прикрепил, как положено. Вот еще раз.
Не прикрепляются. Два файла 4 и 20 КБ
Да и по одному их не вижу. В чем может быть проблема?


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

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Вот, теперь понял. Дело в типе файлов. Архив крепится.


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

Сообщений: 34580
Дата регистрации: 28.05.2002
Baga
Почитал немного о kernel.dll
Оказывается Отказ в доступе не единственная его проблема.
Зарегистрировать новый (скачанный, как пишут, для Win-64) файл тоже не получилось.
Что за чушь? Такой глубоко системный файл не подменяют.

Драйвера - возможно, но не kernel32.dll он только при обновлениях винды обновляется. И к проблемам с твоим ридером гарантированно непричастен.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
Baga
Автор

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Igor Korolyov
Что за чушь? Такой глубоко системный файл не подменяют.
Ой не знаю, Игорь. Поиск в Яндексе по выражению Скачать kernel32.dll дает 96 миллионов результатов.
А Исправить - 42 лимона.
Все-таки есть проблемы с ним, если столько внимания к ему в сети.
Igor Korolyov
И к проблемам с твоим ридером гарантированно непричастен.
Я не говорю о причастности его к моему ридеру. Просто код подключения, который привели здесь не сработал на моем компьютере.
А код основан на использовании данной библиотеки


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

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Baga
А код основан на использовании данной библиотеки
На использовании этой библиотеки основана сама винда и ВСЁ, что в ней работает.

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

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну кончено, миллионы леммингов не могут ошибаться

Я тебе скажу (но только по секрету ) что 90% ссылок в интернете для "исправления dll" на самом деле служат единственной цели - распространению вирусов Оставшиеся 10% это простой бред несведущих господ.

kernel32.dll одна из основных системных библиотек - через неё (точнее используя её) работает, пожалуй, 99.9999% прикладных программ. И если бы у тебя были проблемы именно с ней, то ты очень вряд ли смог бы запустить браузер и написать это сообщение


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
dimuhametov

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
Baga
CreateFile дает ошибку Отказано в доступе.
Почитал немного о kernel.dll
Оказывается Отказ в доступе не единственная его проблема.
Зарегистрировать новый (скачанный, как пишут, для Win-64) файл тоже не получилось.
Можно, конечно, если очень постараться. Но не уверен, что не появится другая ошибка.
Потом у пользователей все налаживать - овчинка выделки стоит?

У меня есть примеры от производителя на C++ или C#. Но как их прикрутить к фоксу не знаю.
Кто хочет посмотреть: во вложении
Какой "Тип устройства" для вашего карт-ридера отображает диспетчер устройств ? Как устройство HID или USB или по другому?


------------------
Незнание делает жизнь такой интересной.
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
Baga
Автор

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
dimuhametov
Какой "Тип устройства" для вашего карт-ридера отображает диспетчер устройств ? Как устройство HID или USB или по другому?
Вообще не отображается никак. При включении карт-ридера ничего не происходит.
При вставке смарт-карты пишет ПО для устройства не было установлено.
Но это не мешает корректно читать карты из ПО стронних разработчиков.
Например, на сайте МГФОМС есть програмка EpReader www.mgfoms.ru.
С этой программы карта читается свободно. И в Инструкции у них написано, что появление ошибки установки ПО
не влияет на работоспособность программы.


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

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
Baga
Вообще не отображается никак. При включении карт-ридера ничего не происходит.
такое возможно ли ? тогда я пас ..


------------------
Незнание делает жизнь такой интересной.
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
Baga
Автор

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Ну, возможно, в первый раз когда включал что-то и показывало. Это давно было. Не помню уже.
Сейчас реагирует только при вставке карты.


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

Сообщений: 34580
Дата регистрации: 28.05.2002
Например их ПО устанавливает и запускает драйвер для обращения к этому устройству, поэтому ошибка "автоустановки" им и по боку.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
Baga
Автор

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Igor Korolyov
Например их ПО устанавливает и запускает драйвер для обращения к этому устройству, поэтому ошибка "автоустановки" им и по боку.
Это вряд ли. Не удаляют же они драйвер после изъятия карты.
Может ситуацию прояснит инструкция с их сайта? Выше я давал ссылку.
Или описание подключения от производителя (выше во вложении).


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

Сообщений: 34580
Дата регистрации: 28.05.2002
Baga
Это вряд ли. Не удаляют же они драйвер после изъятия карты.
Его достаточно деактивировать. Хотя вполне можно и удалять.
sc query type= driver
И анализировать что к чему. Желательно ВО время работы этого ПО и после.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Чтение со смарт-карты
Baga
Автор

Сообщений: 535
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Если я правильно понял, в примере выводится список всех подключённых карт.
Затем через специальный dll осуществляется подключение. А через другую библиотеку - чтение
Данных, эцп и его проверка.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive


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

On-line: 25 OlegA Равиль PaulWist Guest (Гостей: 21)

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