Shuttle中间件共享内存解析

发布时间:2011-2-27 16:32
分类名称:Private


名词:

GUIDs 为中间件oem_cfg.cpp中定义的g_Config. szGUID, 形式诸如:"0CD36B62-D173-42e7-8573-04D1A193E2E3"

 

 

中间件一共创建了5个共享内存。用来管理多进程,多tokenToeknInfo,以及公私有区。

 

1.       NameGUIDs_process_notify_shm

用来实现多进程通讯,在多用户的时候,会有多个进程同时运行,中间件的通信机制为:启动的第一个进程使用隐藏的窗口来监控设备拔插状态(例如响应WM_DEVICECHANGE),当此进程监控的设备拔插动作时,就通过将有用的信息写入此共享内存,然后通过全局的Event内核对象,来通知各个正在运行的进程。使得其他进程也能监控到设备的拔插等事件。

 

Shuttle中间件共享内存解析 - Dsliu - Dspace

 

此共享内存由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)用来存储当前运行进程PID500是怎么算出来的呢?

// 一个PID占用一个CK_ULONG4字节),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即可。

 

Shuttle中间件共享内存解析 - Dsliu - Dspace

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

 Shuttle中间件共享内存解析 - Dsliu - Dspace

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,用来表示每个objToken公私有文件中的偏移量及其大小事多少。

 

4.       GUIDs_%X_%X(slotID, PKI_FILE_PUB_STORAGE),实际形式:GUIDs_1_1

公有区,大小为:上面的TokenInfo中,成员变量ulTotalPublicMemory的值。

 Shuttle中间件共享内存解析 - Dsliu - Dspace

5.       GUIDs_%X_%X(slotID, PKI_FILE_PRV_STORAGE),实际形式:GUIDs_1_2

私有区,大小为:上面的TokenInfo中的,成员变量ulTotalPrivateMemory的值。

 Shuttle中间件共享内存解析 - Dsliu - Dspace