前提:至少已经了解 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 中实现。