! ==========================================================================
! 目标: 获取加密锁的开发商信息和主卷标信息
! 注意: 为了使例子更清晰，去掉了返回错误处理过程
! 说明:
! (1) Card Info 包括 2 个方面的内容，一个是包含在 ATR 文件中的信息另外一个是
!     卡上文件系统的主卷标。
! (2) ATR 文件是在卡进行格式化的时候自动生成的文件，是每个卡必须有的系统文件，
!     通常我们建议开发商把自己公司有关的信息写入到 ATR 文件中去，这样在 
!     DIC_Open 之后可以立即把这个信息读取出来，以便确定是否是自己的加密锁。
!     注意 ATR 文件中的信息只能在格式化的时候设定，ATR 文件中的开发商信息的最
!     大长度是 15 个字节。
! (3) 在卡内部有一套完整的文件系统，跟我们在计算机上的文件系统类似，也就存在
!     相应的磁盘卷标的概念，在打开锁之后，立刻就能够获得主卷标，主卷标的最大
!     长度是 16 个字节。
! (4) DIC_Get 的时候，如果模式是 ATR 或 VOLUME 的化，不论返回方式设置成什么，
!     总是被认为是 BY_ARRAY 方式，返回的商信息会被放置到 buffer 中，DIC_Get 
!     的返回值是 buffer 中 ATR 信息或 VOLUME 信息的长度。
! (5) 在 DIC_Get 之前，必须调用 DIC_Command 的 GET_CARD_INFO 命令，这个命令用
!     来获取卡中的 ATR 文件和主卷标的信息。
! ==========================================================================

!DEC$FREEFORM

INCLUDE 'head.F90'

integer*4 errcode 			! 错误码
integer*4 num 				! 查找到的读卡器个数
integer*4 hic 				! 设备的句柄
integer*4 i 
integer*4 ret_code
CHARACTER*256 reader_name
CHARACTER*256 cmddata 	! 命令缓冲区
CHARACTER*256 buffer 	! 用户缓冲区

	num = DIC_Find() 
	do i=0 ,num-1
		hic = DIC_Open(i, loc(reader_name)) 
		if (hic >= 0) then
		exit
		endif		! 找到 1 个就不再找了
	enddo

	if (i == num)  then
	stop
	endif

	errcode = DIC_Command(hic, GET_CARD_INFO, loc(cmddata)) 
	ret_code = DIC_Get( loc(cmddata), ATR, BY_ARRAY, loc(buffer)) 	! 从cmddata中提取 ATR 到buffer中
	write(*,'(" 开发商信息: ",A16)') buffer 
	ret_code = DIC_Get( loc(cmddata), VOLUME, BY_ARRAY, loc(buffer))  ! 从cmddata中提取卷标信息到buffer
	write(*,'(" 主卷标:     ",A16)') buffer 

	errcode = DIC_Close(hic) 

end

	