libIDCertificateLoader.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. // libIDCertificateLoader.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include "libIDCertificateLoader.h"
  6. typedef ErrorCodeEnum(*DevAdaptObjCreateFunc)(DeviceBaseClass*& baseObj);
  7. typedef ErrorCodeEnum(*DevAdaptObjReleaseFunc)(DeviceBaseClass*& pBaseObj);
  8. HINSTANCE hinstLib = NULL;
  9. DevAdaptObjCreateFunc pFuncCreateAdapt = NULL;
  10. DevAdaptObjReleaseFunc pFuncReleaseAdapt = NULL;
  11. IDCerClass* pDevAdapterInstance = NULL;
  12. struct DevErrorInfo errInfoInstance;
  13. void SetLastErrInfo(const char* formatStr, ...)
  14. {
  15. va_list arg;
  16. va_start(arg, formatStr);
  17. vsprintf_s(errInfoInstance.szErrMsg, MAX_DEV_ERROR_MSG_LEN, formatStr, arg);
  18. errInfoInstance.dwErrMsgLen = strlen(errInfoInstance.szErrMsg);
  19. va_end(arg);
  20. }
  21. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_LoadDevObject(const char* libraryPath)
  22. {
  23. ErrorCodeEnum erroCode;
  24. hinstLib = LoadLibraryA(libraryPath);
  25. if (hinstLib != NULL) {
  26. pFuncCreateAdapt = (DevAdaptObjCreateFunc)GetProcAddress(hinstLib, "CreateDevComponent");
  27. if (NULL == pFuncCreateAdapt) {
  28. SetLastErrInfo("{\"ErrCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:GetProcAddress for CreateDevComponent\"}", GetLastError(), __FUNCTION__, __LINE__);
  29. FreeLibrary(hinstLib);
  30. pFuncCreateAdapt = NULL;
  31. pFuncReleaseAdapt = NULL;
  32. return Error_MisMatched;
  33. }
  34. pFuncReleaseAdapt = (DevAdaptObjReleaseFunc)GetProcAddress(hinstLib, "ReleaseDevComponent");
  35. if (NULL == pFuncCreateAdapt) {
  36. SetLastErrInfo("{\"ErrCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:GetProcAddress for ReleaseDevComponent\"}", GetLastError(), __FUNCTION__, __LINE__);
  37. FreeLibrary(hinstLib);
  38. pFuncCreateAdapt = NULL;
  39. pFuncReleaseAdapt = NULL;
  40. return Error_NotIntegrated;
  41. }
  42. erroCode = pFuncCreateAdapt((DeviceBaseClass*&)pDevAdapterInstance);
  43. if (erroCode != Error_Succeed) {
  44. SetLastErrInfo("{\"ErrCode\":%u, \"RetCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:pFuncCreateAdapt for AdapterObject\"}", GetLastError(), erroCode, __FUNCTION__, __LINE__);
  45. pDevAdapterInstance = NULL;
  46. FreeLibrary(hinstLib);
  47. pFuncCreateAdapt = NULL;
  48. pFuncReleaseAdapt = NULL;
  49. return Error_NoTarget;
  50. }
  51. if (pDevAdapterInstance == NULL) {
  52. SetLastErrInfo("{\"ErrCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:pFuncCreateAdapt return Null AdapterObject\"}", GetLastError(), __FUNCTION__, __LINE__);
  53. FreeLibrary(hinstLib);
  54. pFuncCreateAdapt = NULL;
  55. pFuncReleaseAdapt = NULL;
  56. return Error_Null;
  57. }
  58. } else {
  59. SetLastErrInfo("{\"ErrCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:LoadLibraryA current adapter file failed\"}", GetLastError(), __FUNCTION__, __LINE__);
  60. return Error_DevLoadFileFailed;
  61. }
  62. return Error_Succeed;
  63. }
  64. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_ReleaseDevObject()
  65. {
  66. if (pFuncReleaseAdapt != NULL && pDevAdapterInstance != NULL) {
  67. DeviceBaseClass* devBasePtr = static_cast<DeviceBaseClass*>(pDevAdapterInstance);
  68. pFuncReleaseAdapt(devBasePtr);
  69. pDevAdapterInstance = NULL;
  70. }
  71. if (hinstLib != NULL) {
  72. FreeLibrary(hinstLib);
  73. hinstLib = NULL;
  74. }
  75. return Error_Succeed;
  76. }
  77. //////////////////////////////////////////////////////////////////////////
  78. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_GetDevCategory(DevCategoryInfo* pDevCategory)
  79. {
  80. ErrorCodeEnum result;
  81. if (pDevAdapterInstance == NULL) {
  82. return Error_NotInit;
  83. }
  84. DevCategoryInfo inner;
  85. memset(inner.szType, 0, sizeof(char) * MAX_DEV_TYPE_LEN);
  86. memset(inner.szModel, 0, sizeof(char) * MAX_DEV_MODEL_LEN);
  87. memset(inner.szVendor, 0, sizeof(char) * MAX_DEV_VENDOR_LEN);
  88. result = pDevAdapterInstance->GetDevCategory(inner);
  89. if (result == Error_Succeed) {
  90. memset(pDevCategory->szType, 0, sizeof(char) * MAX_DEV_TYPE_LEN);
  91. memset(pDevCategory->szModel, 0, sizeof(char) * MAX_DEV_MODEL_LEN);
  92. memset(pDevCategory->szVendor, 0, sizeof(char) * MAX_DEV_VENDOR_LEN);
  93. strncpy_s(pDevCategory->szType, MAX_DEV_TYPE_LEN, inner.szType, strlen(inner.szType) > MAX_DEV_TYPE_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szType));
  94. strncpy_s(pDevCategory->szModel, MAX_DEV_MODEL_LEN, inner.szModel, strlen(inner.szModel) > MAX_DEV_MODEL_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szModel));
  95. strncpy_s(pDevCategory->szVendor, MAX_DEV_VENDOR_LEN, inner.szVendor, strlen(inner.szVendor) > MAX_DEV_VENDOR_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szVendor));
  96. pDevCategory->eState = inner.eState;
  97. pDevCategory->version.wMajor = inner.version.wMajor;
  98. pDevCategory->version.wMinor = inner.version.wMinor;
  99. pDevCategory->version.wRevision = inner.version.wRevision;
  100. pDevCategory->version.wBuild = inner.version.wBuild;
  101. }
  102. return result;
  103. }
  104. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_Reset()
  105. {
  106. if (pDevAdapterInstance == NULL) {
  107. return Error_NotInit;
  108. }
  109. return pDevAdapterInstance->Reset();
  110. }
  111. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_DevClose()
  112. {
  113. if (pDevAdapterInstance == NULL) {
  114. return Error_NotInit;
  115. }
  116. return pDevAdapterInstance->DevClose();
  117. }
  118. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_GetLastErr(DevErrorInfo* pDevErrInfo)
  119. {
  120. if (pDevAdapterInstance == NULL) {
  121. strcpy_s(pDevErrInfo->szErrMsg, MAX_DEV_ERROR_MSG_LEN, errInfoInstance.szErrMsg);
  122. pDevErrInfo->dwErrMsgLen = errInfoInstance.dwErrMsgLen;
  123. return Error_Succeed;
  124. }
  125. DevErrorInfo inner;
  126. ErrorCodeEnum result = pDevAdapterInstance->GetLastErr(inner);
  127. if (result == Error_Succeed) {
  128. memset(pDevErrInfo->szErrMsg, 0, sizeof(char) * MAX_DEV_ERROR_MSG_LEN);
  129. strncpy_s(pDevErrInfo->szErrMsg, MAX_DEV_ERROR_MSG_LEN, inner.szErrMsg, strlen(inner.szErrMsg) > MAX_DEV_ERROR_MSG_LEN - 1 ? MAX_DEV_ERROR_MSG_LEN - 1 : strlen(inner.szErrMsg));
  130. pDevErrInfo->dwErrMsgLen = inner.dwErrMsgLen;
  131. }
  132. return result;
  133. }
  134. //////////////////////////////////////////////////////////////////////////
  135. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_DevOpen(DWORD dwPort)
  136. {
  137. if (pDevAdapterInstance == NULL) {
  138. return Error_NotInit;
  139. }
  140. return pDevAdapterInstance->DevOpen(dwPort);
  141. }
  142. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_IDCerRFControl(int bControl)
  143. {
  144. if (pDevAdapterInstance == NULL) {
  145. return Error_NotInit;
  146. }
  147. return pDevAdapterInstance->IDCerRFControl(!!bControl);
  148. }
  149. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_IDCerAuthenticate()
  150. {
  151. if (pDevAdapterInstance == NULL) {
  152. return Error_NotInit;
  153. }
  154. return pDevAdapterInstance->IDCerAuthenticate();
  155. }
  156. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_IDCerGetData(Bridge_IDCerInfo* idCerInfo)
  157. {
  158. if (pDevAdapterInstance == NULL) {
  159. return Error_NotInit;
  160. }
  161. IDCerInfo inner;
  162. memset(&inner, 0, sizeof(inner));
  163. ErrorCodeEnum result = pDevAdapterInstance->IDCerGetData(inner);
  164. if (result == Error_Succeed)
  165. {
  166. memcpy(idCerInfo->name.data, inner.name.data, MAX_IDCER_INFO_SIZE);
  167. idCerInfo->name.dwSize = inner.name.dwSize;
  168. memcpy(idCerInfo->sex.data, inner.sex.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  169. idCerInfo->sex.dwSize = inner.sex.dwSize;
  170. memcpy(idCerInfo->nation.data, inner.nation.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  171. idCerInfo->nation.dwSize = inner.nation.dwSize;
  172. memcpy(idCerInfo->birthday.data, inner.birthday.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  173. idCerInfo->birthday.dwSize = inner.birthday.dwSize;
  174. memcpy(idCerInfo->address.data, inner.address.data, MAX_IDCER_INFO_SIZE);
  175. idCerInfo->address.dwSize = inner.address.dwSize;
  176. memcpy(idCerInfo->idno.data, inner.idno.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  177. idCerInfo->idno.dwSize = inner.idno.dwSize;
  178. memcpy(idCerInfo->department.data, inner.department.data, MAX_IDCER_INFO_SIZE);
  179. idCerInfo->department.dwSize = inner.department.dwSize;
  180. memcpy(idCerInfo->startDate.data, inner.startDate.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  181. idCerInfo->startDate.dwSize = inner.startDate.dwSize;
  182. memcpy(idCerInfo->endDate.data, inner.endDate.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  183. idCerInfo->endDate.dwSize = inner.endDate.dwSize;
  184. memcpy(idCerInfo->newAddress.data, inner.newAddress.data, MAX_IDCER_INFO_SIZE);
  185. idCerInfo->newAddress.dwSize = inner.newAddress.dwSize;
  186. memcpy(idCerInfo->photoPath.data, inner.photoPath.data, MAX_IDCER_PHOTO_PATH);
  187. idCerInfo->photoPath.dwSize = inner.photoPath.dwSize;
  188. }
  189. return result;
  190. }
  191. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_IDCerGetDataEx(Bridge_IDCerInfoEx* idCerInfoEx)
  192. {
  193. if (pDevAdapterInstance == NULL) {
  194. return Error_NotInit;
  195. }
  196. IDCerInfoEx inner;
  197. memset(&inner, 0, sizeof(inner));
  198. ErrorCodeEnum result = pDevAdapterInstance->IDCerGetDataEx(inner);
  199. if (result == Error_Succeed)
  200. {
  201. memcpy(idCerInfoEx->name.data, inner.name.data, MAX_IDCER_INFO_SIZE);
  202. idCerInfoEx->name.dwSize = inner.name.dwSize;
  203. memcpy(idCerInfoEx->sex.data, inner.sex.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  204. idCerInfoEx->sex.dwSize = inner.sex.dwSize;
  205. memcpy(idCerInfoEx->nation.data, inner.nation.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  206. idCerInfoEx->nation.dwSize = inner.nation.dwSize;
  207. memcpy(idCerInfoEx->birthday.data, inner.birthday.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  208. idCerInfoEx->birthday.dwSize = inner.birthday.dwSize;
  209. memcpy(idCerInfoEx->address.data, inner.address.data, MAX_IDCER_INFO_SIZE);
  210. idCerInfoEx->address.dwSize = inner.address.dwSize;
  211. memcpy(idCerInfoEx->idno.data, inner.idno.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  212. idCerInfoEx->idno.dwSize = inner.idno.dwSize;
  213. memcpy(idCerInfoEx->department.data, inner.department.data, MAX_IDCER_INFO_SIZE);
  214. idCerInfoEx->department.dwSize = inner.department.dwSize;
  215. memcpy(idCerInfoEx->startDate.data, inner.startDate.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  216. idCerInfoEx->startDate.dwSize = inner.startDate.dwSize;
  217. memcpy(idCerInfoEx->endDate.data, inner.endDate.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  218. idCerInfoEx->endDate.dwSize = inner.endDate.dwSize;
  219. memcpy(idCerInfoEx->newAddress.data, inner.newAddress.data, MAX_IDCER_INFO_SIZE);
  220. idCerInfoEx->newAddress.dwSize = inner.newAddress.dwSize;
  221. memcpy(idCerInfoEx->photoPath.data, inner.photoPath.data, MAX_IDCER_PHOTO_PATH);
  222. idCerInfoEx->photoPath.dwSize = inner.photoPath.dwSize;
  223. memcpy(idCerInfoEx->englishName.data, inner.englishName.data, MAX_IDCER_INFO_SIZE);
  224. idCerInfoEx->englishName.dwSize = inner.englishName.dwSize;
  225. memcpy(idCerInfoEx->nationality.data, inner.nationality.data, IDCER_EIGHT_BYTE_SIZE);
  226. idCerInfoEx->nationality.dwSize = inner.nationality.dwSize;
  227. memcpy(idCerInfoEx->idVersion.data, inner.idVersion.data, IDCER_EIGHT_BYTE_SIZE);
  228. idCerInfoEx->idVersion.dwSize = inner.idVersion.dwSize;
  229. memcpy(idCerInfoEx->idType.data, inner.idType.data, IDCER_EIGHT_BYTE_SIZE);
  230. idCerInfoEx->idType.dwSize = inner.idType.dwSize;
  231. memcpy(idCerInfoEx->reserved.data, inner.reserved.data, IDCER_EIGHT_BYTE_SIZE);
  232. idCerInfoEx->reserved.dwSize = inner.reserved.dwSize;
  233. memcpy(idCerInfoEx->txzCode.data, inner.txzCode.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  234. idCerInfoEx->txzCode.dwSize = inner.txzCode.dwSize;
  235. memcpy(idCerInfoEx->issuedSN.data, inner.issuedSN.data, IDCER_EIGHT_BYTE_SIZE);
  236. idCerInfoEx->issuedSN.dwSize = inner.issuedSN.dwSize;
  237. memcpy(idCerInfoEx->reserved2.data, inner.reserved2.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  238. idCerInfoEx->reserved2.dwSize = inner.reserved2.dwSize;
  239. memcpy(idCerInfoEx->reserved3.data, inner.reserved3.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  240. idCerInfoEx->reserved3.dwSize = inner.reserved3.dwSize;
  241. memcpy(idCerInfoEx->reserved4.data, inner.reserved4.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  242. idCerInfoEx->reserved4.dwSize = inner.reserved4.dwSize;
  243. memcpy(idCerInfoEx->reserved5.data, inner.reserved5.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  244. idCerInfoEx->reserved5.dwSize = inner.reserved5.dwSize;
  245. }
  246. return result;
  247. }
  248. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_ForceIDEject()
  249. {
  250. if (pDevAdapterInstance == NULL) {
  251. return Error_NotInit;
  252. }
  253. return pDevAdapterInstance->ForceIDEject();
  254. }
  255. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_ScanIDAndSaveImage()
  256. {
  257. if (pDevAdapterInstance == NULL) {
  258. return Error_NotInit;
  259. }
  260. return pDevAdapterInstance->ScanIDAndSaveImage();
  261. }
  262. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_QueryCardPos(int* pos)
  263. {
  264. if (pDevAdapterInstance == NULL) {
  265. return Error_NotInit;
  266. }
  267. int inner;
  268. ErrorCodeEnum result = pDevAdapterInstance->QueryCardPos(inner);
  269. if (result == Error_Succeed)
  270. {
  271. *pos = inner;
  272. }
  273. return result;
  274. }
  275. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_IDCerGetDataEx2(Bridge_IDCerInfoEx2* idCerInfoEx2)
  276. {
  277. if (pDevAdapterInstance == NULL) {
  278. return Error_NotInit;
  279. }
  280. IDCerInfoEx2 inner;
  281. memset(&inner, 0, sizeof(inner));
  282. ErrorCodeEnum result = pDevAdapterInstance->IDCerGetDataEx2(inner);
  283. if (result == Error_Succeed)
  284. {
  285. memcpy(idCerInfoEx2->name.data, inner.name.data, MAX_IDCER_INFO_SIZE);
  286. idCerInfoEx2->name.dwSize = inner.name.dwSize;
  287. memcpy(idCerInfoEx2->sex.data, inner.sex.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  288. idCerInfoEx2->sex.dwSize = inner.sex.dwSize;
  289. memcpy(idCerInfoEx2->nation.data, inner.nation.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  290. idCerInfoEx2->nation.dwSize = inner.nation.dwSize;
  291. memcpy(idCerInfoEx2->birthday.data, inner.birthday.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  292. idCerInfoEx2->birthday.dwSize = inner.birthday.dwSize;
  293. memcpy(idCerInfoEx2->address.data, inner.address.data, MAX_IDCER_INFO_SIZE);
  294. idCerInfoEx2->address.dwSize = inner.address.dwSize;
  295. memcpy(idCerInfoEx2->idno.data, inner.idno.data, 2 * MAX_IDCER_SIMPLE_INFO_SIZE);
  296. idCerInfoEx2->idno.dwSize = inner.idno.dwSize;
  297. memcpy(idCerInfoEx2->department.data, inner.department.data, MAX_IDCER_INFO_SIZE);
  298. idCerInfoEx2->department.dwSize = inner.department.dwSize;
  299. memcpy(idCerInfoEx2->startDate.data, inner.startDate.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  300. idCerInfoEx2->startDate.dwSize = inner.startDate.dwSize;
  301. memcpy(idCerInfoEx2->endDate.data, inner.endDate.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  302. idCerInfoEx2->endDate.dwSize = inner.endDate.dwSize;
  303. memcpy(idCerInfoEx2->newAddress.data, inner.newAddress.data, MAX_IDCER_INFO_SIZE);
  304. idCerInfoEx2->newAddress.dwSize = inner.newAddress.dwSize;
  305. memcpy(idCerInfoEx2->photoPath.data, inner.photoPath.data, MAX_IDCER_PHOTO_PATH);
  306. idCerInfoEx2->photoPath.dwSize = inner.photoPath.dwSize;
  307. memcpy(idCerInfoEx2->englishName.data, inner.englishName.data, MAX_IDCER_INFO_SIZE);
  308. idCerInfoEx2->englishName.dwSize = inner.englishName.dwSize;
  309. memcpy(idCerInfoEx2->nationality.data, inner.nationality.data, IDCER_EIGHT_BYTE_SIZE);
  310. idCerInfoEx2->nationality.dwSize = inner.nationality.dwSize;
  311. memcpy(idCerInfoEx2->idVersion.data, inner.idVersion.data, IDCER_EIGHT_BYTE_SIZE);
  312. idCerInfoEx2->idVersion.dwSize = inner.idVersion.dwSize;
  313. memcpy(idCerInfoEx2->idType.data, inner.idType.data, IDCER_EIGHT_BYTE_SIZE);
  314. idCerInfoEx2->idType.dwSize = inner.idType.dwSize;
  315. memcpy(idCerInfoEx2->reserved.data, inner.reserved.data, IDCER_EIGHT_BYTE_SIZE);
  316. idCerInfoEx2->reserved.dwSize = inner.reserved.dwSize;
  317. memcpy(idCerInfoEx2->txzCode.data, inner.txzCode.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  318. idCerInfoEx2->txzCode.dwSize = inner.txzCode.dwSize;
  319. memcpy(idCerInfoEx2->issuedSN.data, inner.issuedSN.data, IDCER_EIGHT_BYTE_SIZE);
  320. idCerInfoEx2->issuedSN.dwSize = inner.issuedSN.dwSize;
  321. memcpy(idCerInfoEx2->reserved2.data, inner.reserved2.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  322. idCerInfoEx2->reserved2.dwSize = inner.reserved2.dwSize;
  323. memcpy(idCerInfoEx2->reserved3.data, inner.reserved3.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  324. idCerInfoEx2->reserved3.dwSize = inner.reserved3.dwSize;
  325. memcpy(idCerInfoEx2->reserved4.data, inner.reserved4.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  326. idCerInfoEx2->reserved4.dwSize = inner.reserved4.dwSize;
  327. memcpy(idCerInfoEx2->reserved5.data, inner.reserved5.data, MAX_IDCER_SIMPLE_INFO_SIZE);
  328. idCerInfoEx2->reserved5.dwSize = inner.reserved5.dwSize;
  329. }
  330. return result;
  331. }