Je me suis dit, il attend le nom du périphérique (que l'on a récupéré précédemment avec la fonction ListReaders(hCTX,0,@Buf,@L)).
Je me suis aperçu aussi qu'en changeant la valeur hCTX par 0, au niveau de la fonction listreaders, le buffer contenait une version plus longue du nom qui correspond parfaitement à celui obtenu par le moniteur fourni par le fabricant (voir un des posts précédents)
En fait, en modifiant ce code (à l'arrache, je l'avoue), j'ai obtenu une avancée remarquable :
Lecteur avec carte (led verte) :
résultat 1 :
Lecteur sans carte (led rouge) :dll ok
Scard : : 0 hCTX: FFFFFFFFCD010000
hCTX: FFFFFFFFCD010000 -Reader : 0 buffer: ACS ACR122 0
Connect : valeur A : 0 : hcard : FFFFFFFFEA010000 : valeur AP : 2
Status : valeur A : 0 : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 0
Disconnect : valeur A : 0
Connect : valeur A : 0
Status : valeur A : 0 : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 1808F3B
Transmit : valeur A : 16 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
...
Eh oui, il y a du changement.dll ok
Scard : : 0 hCTX: FFFFFFFFCD010000
hCTX: FFFFFFFFCD010000 -Reader : 0 buffer: ACS ACR122 0
Connect : valeur A : FFFFFFFF80100069 : hcard : 0 : valeur AP : 0
Status : valeur A : 6 : valeur S : 0 : valeur AP : 0 : valeur ATRL : 0 : valeur ATR : 0
Disconnect : valeur A : 6
Connect : valeur A : FFFFFFFF80100069
Status : valeur A : 6 : valeur S : 0 : valeur AP : 0 : valeur ATRL : 0 : valeur ATR : 0
Transmit : valeur A : 16 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
...
avec une autre carte que la précédente (led verte) :
Ce qui veut dire que l'on détecte ou pas la présence d'une carte mais qu'on n'arrive toujours pas discriminer l'une de l'autre.dll ok
Scard : : 0 hCTX: FFFFFFFFCD010000
hCTX: FFFFFFFFCD010000 -Reader : 0 buffer: ACS ACR122 0
Connect : valeur A : 0 : hcard : FFFFFFFFEA010000 : valeur AP : 2
Status : valeur A : 0 : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 0
Disconnect : valeur A : 0
Connect : valeur A : 0
Status : valeur A : 0 : valeur S : 6 : valeur AP : 2 : valeur ATRL : 14 : valeur ATR : 1808F3B
Transmit : valeur A : 16 : valeur OUT,Outl : 00000000000000000000 : valeur Outl : A
...
Mais je trouve que ça progresse et surtout, ça répond aux sollicitations.
EDIT : un petit détail supplémentaire, quant on compare les 3 sorties du débogueur (avec ou sans carte1 ou 2), la version sans carte fait apparaître un résultat A qui n'existe pas dans les deux autres cas. Quesako?
Comme dans la chanson de regiani, "...Y'a quelque chose qui cloche là-dedans, J'y retourne immédiatement!"
Le code modifié :
Code : Tout sélectionner
;*******************************************************
;
; PureBasic : PCSC Wrapper
; Author : Leo Mijnders
; Date : 29 March 2004
; Doc : http://msdn.microsoft.com/library/en-us/security/security/authentication_functions.asp?frame=true#smart_card_functions
;
;*******************************************************
#SCARD_SHARE_EXCLUSIVE = 1 ; This application is not willing To share this
; // card with other applications.
#SCARD_SHARE_SHARED = 2 ; This application is willing To share this
; // card with other applications.
#SCARD_SHARE_DIRECT = 3 ; // This application demands direct control of
#SCARD_PROTOCOL_T0 =$0001 ;/* T=0 active protocol. */
#SCARD_PROTOCOL_T1 =$0002 ;/* T=1 active protocol. */
#SCARD_PROTOCOL_RAW =$0004 ;/* Raw active protocol. */
#SCARD_UNKNOWN =$0001 ;/* Unknown state */
#SCARD_ABSENT =$0002 ;/* Card is absent */
#SCARD_PRESENT =$0004 ;/* Card is present */
#SCARD_SWALLOWED =$0008 ;/* Card not powered */
#SCARD_POWERED =$0010 ;/* Card is powered */
#SCARD_NEGOTIABLE =$0020 ;/* Ready For PTS */
#SCARD_SPECIFIC =$0040 ;/* PTS has been set */
#SCARD_LEAVE_CARD =$0000 ;/* Do nothing on close */
#SCARD_RESET_CARD =$0001 ;/* Reset on close */
#SCARD_UNPOWER_CARD =$0002 ;/* Power down on close */
#SCARD_EJECT_CARD =$0003 ;/* Eject on close */
#SCARD_S_SUCCESS =$00000000
#SCARD_E_CANCELLED =$80100002
#SCARD_E_CANT_DISPOSE =$8010000E
#SCARD_E_INSUFFICIENT_BUFFER =$80100008
#SCARD_E_INVALID_ATR =$80100015
#SCARD_E_INVALID_HANDLE =$80100003
#SCARD_E_INVALID_PARAMETER =$80100004
#SCARD_E_INVALID_TARGET =$80100005
#SCARD_E_INVALID_VALUE =$80100011
#SCARD_E_NO_MEMORY =$80100006
#SCARD_F_COMM_ERROR =$80100013
#SCARD_F_INTERNAL_ERROR =$80100001
#SCARD_F_UNKNOWN_ERROR =$80100014
#SCARD_F_WAITED_TOO_LONG =$80100007
#SCARD_E_UNKNOWN_READER =$80100009
#SCARD_E_TIMEOUT =$8010000A
#SCARD_E_SHARING_VIOLATION =$8010000B
#SCARD_E_NO_SMARTCARD =$8010000C
#SCARD_E_UNKNOWN_CARD =$8010000D
#SCARD_E_PROTO_MISMATCH =$8010000F
#SCARD_E_NOT_READY =$80100010
#SCARD_E_SYSTEM_CANCELLED =$80100012
#SCARD_E_NOT_TRANSACTED =$80100016
#SCARD_E_READER_UNAVAILABLE =$80100017
Enumeration
#SCARD_SCOPE_USER ; 0x0000/* Scope in user space */
#SCARD_SCOPE_TERMINAL ; 0x0001/* Scope in terminal */
#SCARD_SCOPE_SYSTEM ; 0x0002/* Scope in system */
EndEnumeration
Global fSCardEstablishContext, fSCardConnect, fSCardStatus, fSCardDisconnect, fSCardTransmit
Global fSCardListReaders
Global g_rgSCardT0Pci, g_rgSCardT1Pci, g_rgSCardRawPci
Procedure.l InitPCSC(Lib.l)
If OpenLibrary(Lib, "WinSCard.dll")
Debug "dll ok"
; Pointers to SCARD_IO_REQUEST structures
g_rgSCardT0Pci= GetFunction(Lib,"g_rgSCardT0Pci")
g_rgSCardT1Pci= GetFunction(Lib,"g_rgSCardT1Pci")
g_rgSCardRawPci= GetFunction(Lib,"g_rgSCardRawPci")
; Pointers to Basic PCSC Functions
fSCardEstablishContext= GetFunction(Lib,"SCardEstablishContext")
fSCardConnect= GetFunction(Lib,"SCardConnectA")
fSCardStatus= GetFunction(Lib,"SCardStatusA")
fSCardDisconnect= GetFunction(Lib,"SCardDisconnect")
fSCardTransmit= GetFunction(Lib,"SCardTransmit")
fSCardListReaders= GetFunction(Lib,"SCardListReadersA")
ProcedureReturn 0
EndIf
ProcedureReturn -1
EndProcedure
Procedure.l sSCardEstablishContext(self.l, a.l, b.l, c.l, d.l)
ProcedureReturn CallFunctionFast(fSCardEstablishContext, a, b, c, d)
EndProcedure
Procedure.l sSCardConnect(self.l, a.l, b.l, c.l, d.l, e.l, f.l)
ProcedureReturn CallFunctionFast(fSCardConnect, a, b, c, d, e, f)
EndProcedure
Procedure.l sSCardStatus(self.l, a.l, b.l, c.l, d.l, e.l, f.l, g.l)
ProcedureReturn CallFunctionFast(fSCardStatus, a, b, c, d, e, f, g)
EndProcedure
Procedure.l sSCardDisconnect(self.l, a.l, b.l)
ProcedureReturn CallFunctionFast(fSCardDisconnect, a, b)
EndProcedure
Procedure.l sSCardTransmit(self.l, a.l, b.l, c.l, d.l, e.l, f.l, g.l)
ProcedureReturn CallFunctionFast(fSCardTransmit, a, b, c, d, e, f, g)
EndProcedure
Procedure.l sSCardListReaders(self.l, a.l, b.l, c.l, d.l)
ProcedureReturn CallFunctionFast(fSCardListReaders, a, b, c, d)
EndProcedure
Interface IF_PCSC
EstablishContext(a.l, b.l, c.l, d.l)
Connect(a.l, b.l, c.l, d.l, e.l, f.l)
Status(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
Disconnect(a.l, b.l)
Transmit(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
ListReaders(a.l, b.l, c.l, d.l)
EndInterface
Structure strucInterface
a.l
b.l
c.l
d.l
e.l
f.l
EndStructure
SCard.IF_PCSC
Struc.strucInterface
Struc\a=@sSCardEstablishContext()
Struc\b=@sSCardConnect()
Struc\c=@sSCardStatus()
Struc\d=@sSCardDisconnect()
Struc\e=@sSCardTransmit()
Struc\f=@sSCardListReaders()
AddStruc.l=@Struc
PokeL(@SCard,@AddStruc)
Structure IO_REQ
P.l
A.l
B.b[512]
EndStructure
outPCI_T0.IO_REQ
outPCI_T0\P=1
outPCI_T0\A=512
; *************************** CompilerIf 0 if used as IncludeFile or 1 = if test IncludeFile
Procedure.s StringConvert(stext.s, format.l = #PB_Unicode)
;
Define *mem
Define result.s
*mem = AllocateMemory(StringByteLength(stext, format)+2)
PokeS(*mem, stext, format)
result = PeekS(*mem, StringByteLength(stext, format)+2, format)
;FreeMemory(*mem)
ProcedureReturn result
EndProcedure
Procedure.s HexString(Source.l, L.l)
result.s = ""
For i = 0 To L-1
result = result + Right("00" + Hex(PeekB(Source+i)), 2)
Next i
ProcedureReturn result
EndProcedure
hCTX.l
Buf.s=Space(10000)
ATRL.l
*ATR=AllocateMemory(1000)
hCARD.l
AP.l
L.l
S.L
*IN=AllocateMemory(1000)
*OUT=AllocateMemory(1000)
OutL.l
; APDU to genarate 8 byte Random at TB100 smartcard
PokeB(*IN,$BC)
PokeB(*IN+1,$C4)
PokeB(*IN+2,$00)
PokeB(*IN+3,$00)
PokeB(*IN+4,$08)
If InitPCSC(10)=0
A=SCard\EstablishContext(0,0,0,@hCTX)
;MessageRequester("hCTX", Hex(A)+" "+Hex(hCTX),0)
Debug "Scard :" + " : "+ Hex(A)+ " hCTX: "+Hex(hCTX)
L.l=10000
A=SCard\ListReaders(0,0,@Buf,@L)
;MessageRequester("Reader", Hex(A)+" "+Buf,0)
buf$=StringConvert(buf, #PB_Ascii)
Debug " hCTX: "+Hex(hCTX) + " -Reader" + " : "+ Hex(A)+ " buffer: "+ buf$
A=SCard\Connect(hCTX,@buf,#SCARD_SHARE_SHARED,#SCARD_PROTOCOL_T0 | #SCARD_PROTOCOL_T1,@hCARD,@AP)
;MessageRequester("Connect", Hex(A),0)
Debug "Connect"+ " : valeur A : "+Hex(A)+" : hcard : "+Hex(hCARD)+ " : valeur AP : "+Hex(AP)
A=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
;MessageRequester("Status", Hex(A)+" "+Hex(S)+" "+Hex(AP)+" "+Hex(ATRL)+" "+Hex(PeekL(*ATR)),0)
Debug "Status"+ " : valeur A : "+Hex(A)+ " : valeur S : "+Hex(S)+ " : valeur AP : "+Hex(AP)+ " : valeur ATRL : "+Hex(ATRL)+ " : valeur ATR : "+Hex(PeekL(*ATR))
A=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
;MessageRequester("Disconnect", Hex(A))
Debug "Disconnect"+ " : valeur A : "+Hex(A)
A=SCard\Connect(hCTX,@buf,#SCARD_SHARE_SHARED,#SCARD_PROTOCOL_T0 | #SCARD_PROTOCOL_T1,@hCARD,@AP)
;MessageRequester("Connect", Hex(A),0)
Debug "Connect"+ " : valeur A : "+Hex(A)
A=SCard\Status(hCARD,@Buf,@L,@S,@AP,*ATR,@ATRL)
;MessageRequester("Status", Hex(A)+" "+Hex(S)+" "+Hex(AP)+" "+Hex(ATRL)+" "+HexString(*ATR,ATRL),0)
Debug "Status"+ " : valeur A : "+Hex(A)+ " : valeur S : "+Hex(S)+ " : valeur AP : "+Hex(AP)+ " : valeur ATRL : "+Hex(ATRL)+ " : valeur ATR : "+Hex(PeekL(*ATR))
For I=1 To 10
OutL=10
A=SCard\Transmit(hCARD, g_rgSCardT0Pci, *IN, 5, @outPCI_T0, *OUT, @OutL)
; MessageRequester("Transmit", Hex(A)+" "+HexString(*OUT,OutL)+" "+Hex(OutL),0)
Debug "Transmit"+ " : valeur A : "+Hex(A)+ " : valeur OUT,Outl : "+HexString(*OUT,OutL)+ " : valeur Outl : "+Hex(OutL)
Next
A=SCard\DisConnect(hCARD,#SCARD_RESET_CARD)
;MessageRequester("Disconnect", Hex(A))
Else
MessageRequester("Error", "Lib not loaded",0)
EndIf