|
14 | 14 |
|
15 | 15 | static DWORD GenerateContainerMapFile(CK_SESSION_HANDLE_PTR pSession, PBYTE *ppbData, PDWORD pcbData); |
16 | 16 |
|
| 17 | +static BOOL cmapCached = FALSE; |
| 18 | +static BYTE cmap[1024]; |
| 19 | +static DWORD cmapSize = 0; |
| 20 | + |
17 | 21 | // The CardReadFile function reads the entire file at the specified location into the user-supplied buffer. |
18 | 22 | DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, __in LPSTR pszDirectoryName, __in LPSTR pszFileName, |
19 | 23 | __in DWORD dwFlags, __deref_out_bcount_opt(*pcbData) PBYTE *ppbData, __out PDWORD pcbData) { |
@@ -89,6 +93,19 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, __in LPSTR pszDirectoryName |
89 | 93 | // Generate the container map file content by enumerating all private keys, |
90 | 94 | // hashing public key data to produce a GUID, and marking CKA_ID==2 as default. |
91 | 95 | static DWORD GenerateContainerMapFile(CK_SESSION_HANDLE_PTR pSession, PBYTE *ppbData, PDWORD pcbData) { |
| 96 | + CMD_LOG_FUNC(" pSession %p, ppbData %p, pcbData %p", pSession, ppbData, pcbData); |
| 97 | + |
| 98 | + if (cmapCached) { |
| 99 | + CMD_DEBUG("cmap is cached"); |
| 100 | + *ppbData = (PBYTE)g_pfnCspAlloc(cmapSize); |
| 101 | + if (!*ppbData) |
| 102 | + return SCARD_E_NO_MEMORY; |
| 103 | + memcpy(*ppbData, cmap, cmapSize); |
| 104 | + *pcbData = cmapSize; |
| 105 | + CMD_DEBUG("return cached container map, size: %d", cmapSize); |
| 106 | + CMD_RET_OK; |
| 107 | + } |
| 108 | + |
92 | 109 | const CK_SESSION_HANDLE hSession = *pSession; |
93 | 110 | const CK_ULONG maxObjects = 64; |
94 | 111 |
|
@@ -165,7 +182,13 @@ static DWORD GenerateContainerMapFile(CK_SESSION_HANDLE_PTR pSession, PBYTE *ppb |
165 | 182 | CMD_DEBUG("Container %d: %ls", i, rec->wszGuid); |
166 | 183 | } |
167 | 184 | *pcbData = (DWORD)total; |
168 | | - return SCARD_S_SUCCESS; |
| 185 | + |
| 186 | + cmapCached = TRUE; |
| 187 | + cmapSize = (DWORD)total; |
| 188 | + memcpy(cmap, recs, total); |
| 189 | + CMD_DEBUG("Container map generated, size: %d", total); |
| 190 | + |
| 191 | + CMD_RET_OK; |
169 | 192 | } |
170 | 193 |
|
171 | 194 | /* |
|
0 commit comments