发布时间:2011-2-27 16:32
分类名称:Private
名词:
GUIDs 为中间件oem_cfg.cpp中定义的g_Config. szGUID, 形式诸如:"0CD36B62-D173-42e7-8573-04D1A193E2E3"。
中间件一共创建了5个共享内存。用来管理多进程,多token,ToeknInfo,以及公私有区。
1. Name:GUIDs_process_notify_shm
用来实现多进程通讯,在多用户的时候,会有多个进程同时运行,中间件的通信机制为:启动的第一个进程使用隐藏的窗口来监控设备拔插状态(例如响应WM_DEVICECHANGE),当此进程监控的设备拔插动作时,就通过将有用的信息写入此共享内存,然后通过全局的Event内核对象,来通知各个正在运行的进程。使得其他进程也能监控到设备的拔插等事件。
此共享内存由CProcessNotify来维护,成员变量为:CShareMemory m_ShareMemory;前面附加的那8个字节的统计信息,就是在CShareMemory中附加上的,而CShareMemory使用的是CShareMem中的成员函数来创建共享内存。CShareMem不会附加任何信息。只是简单的封装了系统的创建共享内存的API。
常量:
// 多进程之间通讯使用的共享内存大小(实际上创建的大小为4096+2*sizeof(CK_ULONG))
#define NOTIFY_SHARE_MEMORY_SIZE 4096
// 4096大小被分为两块(2048), 前半块(2048)用来存储消息信息(最大为2048)
#define NOTIFY_MESSAGE_MAX_SIZE 2048
// 后半块(2048)用来存储当前运行进程PID,500是怎么算出来的呢?
// 一个PID占用一个CK_ULONG(4字节),2048 / 4 = 512.
#define NOTIFY_PROCESS_MAX_COUNT 500
2. GUIDs_slotmgr_shm
CSlotManager 在Initialize成员函数里面创建此共享内存,用来统计当前插入的Token数目(slot数目)。例如。当检测到插入设备时,就会往此共享内存中写入一个新的SHM_SLOT_LIST_ITEM。当移除一个Key时,并没有删相应的item,而是将相应的Item成员中的tokenPresent设置为false。下次再次插入的时候,只需要更新此Item即可。
SHM_SLOT_LIST_ITEM 定义如下:
typedef struct SHM_SLOT_LIST_ITEM
{
CK_SLOT_ID slotId;
CK_BBOOL tokenPresent;
WORD nextPubObjId;
WORD nextPrvObjId;
// 缓存PIN相关,目前已经将其舍弃,可以屏蔽掉。免得出现漏洞
// CK_BYTE userPinLen;
// CK_BYTE userPin[31]; // LV style. Length + Value. must encrypted.
// CK_ULONG incUserPinCount;
CK_ULONG lastAccess; // GetTicketCount().
char slotName[64]; //slotDescription
char accessPath[MAX_PATH];// Symblic link or reader name.
CK_ULONG ulReaderType;
} SHM_SLOT_LIST_ITEM;
下面三个共享内存都是由CBuddyStore来创建和维护的。在程序刚刚运行,会建立俩个共享内存,一个是TokenInfo共享区,一个是Public共享区。
常量:
#define TOKEN_INFO_STORAGE_SIZE (sizeof(SM_TOKEN_INFO) + 60*4 + 30*4) // 定义的不严谨
#define PUB_TOTAL_OBJ_COUNT 60
#define PRV_TOTAL_OBJ_COUNT 30
#define BKG_READ_BASE_SIZE 2048
#define TOKEN_INFO_STORAGE 0
#define PKI_FILE_PUB_STORAGE 1
#define PKI_FILE_PRV_STORAGE 2
3. GUIDs_%X_%X(slotID, TOKEN_INFO_STORAGE),实际形式:GUIDs_1_0
TokenInfo共享区,大小为TOKEN_INFO_STORAGE_SIZE + 8。
TOKEN_INFO_STORAGE_SIZE 被计算成:(sizeof(SM_TOKEN_INFO) + 60*4 + 30*4),其实应该是:< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
(sizeof(SM_TOKEN_INFO) + PUB_TOTAL_OBJ_COUNT * sizeof(CK_ULONG) + PRV_TOTAL_OBJ_COUNT * sizeof(CK_ULONG)).
offset-size,用来表示每个obj在Token公私有文件中的偏移量及其大小事多少。
4. GUIDs_%X_%X(slotID, PKI_FILE_PUB_STORAGE),实际形式:GUIDs_1_1
公有区,大小为:上面的TokenInfo中,成员变量ulTotalPublicMemory的值。
5. GUIDs_%X_%X(slotID, PKI_FILE_PRV_STORAGE),实际形式:GUIDs_1_2
私有区,大小为:上面的TokenInfo中的,成员变量ulTotalPrivateMemory的值。