当前位置: 首页 > 工具软件 > pcsc-lite > 使用案例 >

PCSC那事儿(八--SCardEstablishContext)

汤才捷
2023-12-01

客户端代码分析

前提:至少已经了解 linux 进程和进程间通讯,线程和线程间通讯。

 

 

继续。

Everybody,Oh my god.We 're back again.

...

 

主要目的是分析 PCSC-LITE1.5.5 版本的框架和部分代码。

首先 , 看看到底有几行代码 . 代码量体现工作量 . 不管是否如此,先 wc 下。

不是上 washing room ,是 linux 下粗略测试代码有几行的命令行工具。

/home/wjf/anotherday/pcsc/arm9/pcsc-lite-1.5.5/src # wc -l *.c

 

   252 atrhandler.c

  1974 configfile.c

   144 debug.c

   307 debuglog.c

    85 dyn_hpux.c

   108 dyn_macosx.c

    85 dyn_unix.c

   176 error.c

   480 eventhandler.c

    52 hotplug_generic.c

   604 hotplug_libhal.c

   592 hotplug_libusb.c

   434 hotplug_linux.c

   822 hotplug_macosx.c

   733 ifdwrapper.c

   640 pcscdaemon.c

   458 pcsc-wirecheck-dist.c

   283 pcsc-wirecheck-gen.c

    15 pcsc-wirecheck-main.c

    29 powermgt_generic.c

 

   155 prothandler.c

  1487 readerfactory.c

    63 strlcat.c

    60 strlcpy.c

   427 sys_unix.c

   421 testpcsc.c

   124 thread_unix.c

  1936 tokenparser.c

   213 utils.c

  1718 winscard.c

  3884 winscard_clnt.c

   483 winscard_msg.c

   323 winscard_msg_srv.c

  1952 winscard_scf.c

    836 winscard_svc.c

 

  22355 总计

 

问:这么多行代码,还仅仅是 .c 文件。头大了。

答案是, 22355 行,别嫌行数多。如果是 rmb, 就不会被嫌太多。还被嫌少。

 

 

 

先粗略说说整个框架。后续再深入分析代码。

万里长城万里长,走下去。

 

下面说说主要文件间的关系。

算了,还是说重要文件间的关系。

 

 

尽量简单,通俗,但有实质内容。

 

如果不想看代码分析,只想运筹帷幄,那么请看看下面这个段落,

接着想看什么,就看什么去吧。

 

应用也就是 APPLICATION( 比如 testpcsc.c) ,调用 winscard_cInt.c

提供的 API 和读卡器或卡进行数据交换。 winscard_cInt.c 通过 winscard_msg.c

中实现的本地 socket 来和 ResourceManager(pcscdaemon.c) 通讯 .

ResourceManager 先调用 winscard_msg_svc.c 的例程最好服务器启动前的准备。

接着 ResourceManager ,把 winscard_msg.c 转发来的请求加以稍微处理

就委托给 winscard_svc.c winscard_svc.c 根据数据,解析命令后委托给

winscard.c 处理。处理完成后,原路返回,上报处理结果。

其它的文件都围绕这些文件,辅佐这些文件。

 

pcscdaemon.c ,里面的内容就是在上面提到的资源管理器

ResourceManager.

 

testpcsc.c APPLICATION 的位置。

 

开始了 ...

路有多远,不知道。路在脚下。

从文件 testpcsc.c 开始分析,因为它里面窝藏了 main.

 

int main(/*@unused@*/ int argc, /*@unused@*/ char **argv)

  56 {

  57         SCARDHANDLE hCard;

  58         SCARDCONTEXT hContext;

  59         SCARD_READERSTATE_A rgReaderStates[1];

  60         DWORD dwReaderLen, dwState, dwProt, dwAtrLen;

  61         DWORD dwPref, dwReaders = 0;

  62         char *pcReaders = NULL, *mszReaders;

...

 

 

刹车 , 出现两个重要结构 ,SCARDHANDLE,SCARDCONTEXT.

定义在 PCSC/pcsclite.h

 

  28 typedef long SCARDCONTEXT; /**< /p hContext returned by  SCardEstablishContext() */

  29 typedef SCARDCONTEXT *PSCARDCONTEXT;

  30 typedef SCARDCONTEXT *LPSCARDCONTEXT;

  31 typedef long SCARDHANDLE; /**< /p hCard returned by SCardConnect() */

  32 typedef SCARDHANDLE *PSCARDHANDLE;

  33 typedef SCARDHANDLE *LPSCARDHANDLE;

 

 

先记住 SCARDHANDLE 是连接句柄。 SCARDCONTEXT 是客户端应用上下文句柄。

后面还会结合代码多次谈到这两个重要结构。现在多说,也没有作用。

... 原来是两个 long.

97         rv = SCardEstablishContext (SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);

 

 

SCardEstablishContext ,这可是按照上面提到的卷 5 来实作的原型。

这个函数做了些什么。做了很多,但应用不知道。在 winscard_clnt.c 中实现。

 类似资料: