S4Time.cpp 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427
  1. #include "S4Time.h"
  2. #include "logfile.h"
  3. #pragma comment(lib, "Sense4ST.lib")
  4. SENSE4_CONTEXT g_s4Ctx;
  5. string m_strRootPIN;
  6. static CLogFile* g_log = new CLogFile("C:\\RVC\\Ukey\\UsbKeyApiLog.log");
  7. S4Time::S4Time(void)
  8. {
  9. //memset(&g_s4Ctx, 0, sizeof(SENSE4_CONTEXT));
  10. //m_strRootPIN = "";
  11. }
  12. S4Time::~S4Time(void)
  13. {
  14. }
  15. DWORD S4Time::FindUsbKey(USBKEY_INFO* pKeyInfo, unsigned int* pCount)
  16. {
  17. SENSE4_CONTEXT * s4CtxList =NULL ;
  18. DWORD dwSize=0;
  19. //枚举系统连接了多少个设备,这一步不用判断返回值,第一个参数输入NULL
  20. DWORD dwRet = S4Enum(NULL,&dwSize);
  21. if (S4_SUCCESS != dwRet && S4_INSUFFICIENT_BUFFER != dwRet)
  22. {
  23. g_log->LOGERROR("S4Enum failed! <error code = 0x%x>", dwRet);
  24. return dwRet;
  25. }
  26. //如果得到的设备上下文内存数量为0或者不为sizeof(SENSE4_CONTEXT)的倍数,
  27. //说明没有找到设备或者列举设备出错。
  28. if ((0 == dwSize) || (dwSize % sizeof(SENSE4_CONTEXT)))
  29. {
  30. g_log->LOGERROR("S4Enum no device! <dwSize = 0x%x>", dwSize);
  31. return S4_NO_LIST;
  32. }
  33. *pCount = dwSize / sizeof(SENSE4_CONTEXT);
  34. //根据返回的设备个数,分配空间给程序使用
  35. s4CtxList = (SENSE4_CONTEXT *)malloc(dwSize);
  36. //根据分配的空间,再次枚举设备,这次要判断函数返回值
  37. dwRet = S4Enum(s4CtxList,&dwSize);
  38. if(S4_SUCCESS == dwRet)
  39. {
  40. //g_s4Ctx.hLock = s4CtxList[0].hLock;
  41. g_s4Ctx.dwIndex = s4CtxList[0].dwIndex;
  42. g_s4Ctx.dwVersion = s4CtxList[0].dwVersion;
  43. g_s4Ctx.dwAtrLen = s4CtxList[0].dwAtrLen;
  44. memcpy(g_s4Ctx.bID, s4CtxList[0].bID, MAX_ID_LEN);
  45. memcpy(g_s4Ctx.bAtr, s4CtxList[0].bAtr, MAX_ATR_LEN);
  46. memcpy(g_s4Ctx.reserve, s4CtxList[0].reserve, RESERVE_NUM);
  47. }
  48. else
  49. {
  50. free(s4CtxList);
  51. s4CtxList = NULL;
  52. printf("Enum device failed.\n");
  53. g_log->LOGERROR("S4Enum failed! <error code = 0x%x>", dwRet);
  54. return dwRet;
  55. }
  56. free(s4CtxList);
  57. s4CtxList = NULL;
  58. S4OPENINFO S4_OpenInfo;
  59. S4_OpenInfo.dwS4OpenInfoSize = sizeof(S4OPENINFO);
  60. S4_OpenInfo.dwShareMode = S4_EXCLUSIZE_MODE;
  61. dwRet = S4OpenEx(&g_s4Ctx, &S4_OpenInfo);
  62. if (S4_SUCCESS != dwRet)
  63. {
  64. if (S4_DEVICE_BUSY == dwRet)
  65. {
  66. printf("device is busy, start to close, and then open.\n");
  67. g_log->LOGERROR("device is busy, start to close, and then open! <error code = 0x%x>", dwRet);
  68. dwRet = S4Close(&g_s4Ctx);
  69. if(S4_SUCCESS != dwRet)
  70. {
  71. free(s4CtxList);
  72. s4CtxList = NULL;
  73. printf("S4Close failure.\n");
  74. g_log->LOGERROR("S4Close failed! <error code = 0x%x>", dwRet);
  75. return dwRet;
  76. }
  77. dwRet = S4OpenEx(&g_s4Ctx, &S4_OpenInfo);
  78. if(S4_SUCCESS != dwRet)
  79. {
  80. free(s4CtxList);
  81. s4CtxList = NULL;
  82. printf("S4OpenEx failure.\n");
  83. g_log->LOGERROR("S4OpenEx failed! <error code = 0x%x>", dwRet);
  84. return dwRet;
  85. }
  86. g_log->LOGERROR("S4OpenEx success");
  87. }
  88. else
  89. {
  90. free(s4CtxList);
  91. s4CtxList = NULL;
  92. printf("S4OpenEx failure.\n");
  93. g_log->LOGERROR("S4OpenEx failed! <error code = 0x%x>", dwRet);
  94. return dwRet;
  95. }
  96. }
  97. //获取设备序列号
  98. DWORD len = 0;
  99. char cSerialNumber[8] = {0};
  100. dwRet = S4Control(&g_s4Ctx, S4_GET_SERIAL_NUMBER, NULL, 0, (void*)cSerialNumber, 8, &len);
  101. if (S4_SUCCESS != dwRet)
  102. {
  103. printf("Get Serial number failed!<error code = %08x>\n", dwRet);
  104. g_log->LOGERROR("Get Serial number failed! <error code = 0x%x>", dwRet);
  105. return dwRet;
  106. }
  107. memcpy(pKeyInfo->m_HID, cSerialNumber, MAX_ID_LEN);
  108. memcpy(g_s4Ctx.bID, cSerialNumber, MAX_ID_LEN);
  109. /*dwRet = S4Close(&g_s4Ctx);
  110. if(S4_SUCCESS != dwRet)
  111. {
  112. printf("S4Close failure.\n");
  113. g_log->LOGERROR("S4Close failed! <error code = 0x%x>", dwRet);
  114. return dwRet;
  115. }*/
  116. free(s4CtxList);
  117. s4CtxList = NULL;
  118. g_log->LOGERROR("Find S4 Time");
  119. return S4_SUCCESS;
  120. }
  121. DWORD S4Time::OpenUsbKey(USBKEY_HANDLE *pHandle,unsigned int Item)
  122. {
  123. SENSE4_CONTEXT * s4CtxList =NULL ;
  124. DWORD dwSize=0;
  125. DWORD dwRet = S4_SUCCESS;
  126. if (((void*)(-1) != g_s4Ctx.hLock)
  127. && (NULL != g_s4Ctx.hLock))
  128. {
  129. g_log->LOGERROR("S4 Time is openning");
  130. }
  131. else
  132. {
  133. g_log->LOGERROR("Open S4 Time");
  134. //枚举系统连接了多少个设备,这一步不用判断返回值,第一个参数输入NULL
  135. dwRet = S4Enum(NULL,&dwSize);
  136. if (S4_SUCCESS != dwRet && S4_INSUFFICIENT_BUFFER != dwRet)
  137. {
  138. return dwRet;
  139. }
  140. //如果得到的设备上下文内存数量为0或者不为sizeof(SENSE4_CONTEXT)的倍数,
  141. //说明没有找到设备或者列举设备出错。
  142. if ((0 == dwSize) || (dwSize % sizeof(SENSE4_CONTEXT)))
  143. {
  144. return S4_NO_LIST;
  145. }
  146. //根据返回的设备个数,分配空间给程序使用
  147. s4CtxList = (SENSE4_CONTEXT *)malloc(dwSize);
  148. //根据分配的空间,再次枚举设备,这次要判断函数返回值
  149. dwRet = S4Enum(s4CtxList,&dwSize);
  150. if(S4_SUCCESS == dwRet)
  151. {
  152. g_s4Ctx.hLock = s4CtxList[0].hLock;
  153. g_s4Ctx.dwIndex = s4CtxList[0].dwIndex;
  154. g_s4Ctx.dwVersion = s4CtxList[0].dwVersion;
  155. g_s4Ctx.dwAtrLen = s4CtxList[0].dwAtrLen;
  156. memcpy(g_s4Ctx.bID, s4CtxList[0].bID, MAX_ID_LEN);
  157. memcpy(g_s4Ctx.bAtr, s4CtxList[0].bAtr, MAX_ATR_LEN);
  158. memcpy(g_s4Ctx.reserve, s4CtxList[0].reserve, RESERVE_NUM);
  159. }
  160. else
  161. {
  162. printf("Enum device failed.\n");
  163. g_log->LOGERROR("S4Enum failed! <error code = 0x%x>", dwRet);
  164. return dwRet;
  165. }
  166. free(s4CtxList);
  167. s4CtxList = NULL;
  168. S4OPENINFO S4_OpenInfo;
  169. S4_OpenInfo.dwS4OpenInfoSize = sizeof(S4OPENINFO);
  170. S4_OpenInfo.dwShareMode = S4_EXCLUSIZE_MODE;
  171. dwRet = S4OpenEx(&g_s4Ctx, &S4_OpenInfo);
  172. if(S4_SUCCESS != dwRet)
  173. {
  174. printf("S4OpenEx failure.\n");
  175. g_log->LOGERROR("S4OpenEx failed! <error code = 0x%x>", dwRet);
  176. return dwRet;
  177. }
  178. }
  179. *pHandle = g_s4Ctx.hLock;
  180. /*检查精锐IV 设备中是否存在根目录*/
  181. dwRet = S4ChangeDir(&g_s4Ctx, "\\");
  182. if (S4_DEVICE_UNSUPPORTED == dwRet)
  183. {
  184. /*如果根目录不存在,创建新的根目录*/
  185. dwRet = S4CreateDir(&g_s4Ctx, "\\", 0, S4_CREATE_ROOT_DIR);
  186. if (dwRet != S4_SUCCESS)
  187. {
  188. printf("Create new root failed! <error code = 0x%08x>\n", dwRet);
  189. g_log->LOGERROR("Create new root failed! <error code = 0x%x>", dwRet);
  190. return dwRet;
  191. }
  192. }
  193. else if (dwRet != S4_SUCCESS)
  194. {
  195. printf("Change to root dir failed! <error code = 0x%08x>\n", dwRet);
  196. g_log->LOGERROR("Change to root dir failed! <error code = 0x%x>", dwRet);
  197. return dwRet;
  198. }
  199. return S4_SUCCESS;
  200. }
  201. DWORD S4Time::CloseUsbKey(USBKEY_HANDLE hHandle)
  202. {
  203. g_log->LOGERROR("Close S4 Time");
  204. DWORD dwRet = S4_SUCCESS;
  205. if (((void*)(-1) != g_s4Ctx.hLock)
  206. && (NULL != g_s4Ctx.hLock))
  207. {
  208. dwRet = S4Close(&g_s4Ctx);
  209. if(S4_SUCCESS != dwRet)
  210. {
  211. g_s4Ctx.hLock = NULL;
  212. printf("S4Close failure.\n");
  213. g_log->LOGERROR("S4Close failed! <error code = 0x%x>", dwRet);
  214. return dwRet;
  215. }
  216. g_s4Ctx.hLock = NULL;
  217. }
  218. return S4_SUCCESS;
  219. }
  220. DWORD S4Time::VerifyUserPIN(USBKEY_HANDLE hHandle, char* pPIN)
  221. {
  222. //验证用户PIN码,默认值"123456789",不修改
  223. DWORD dwRet = S4VerifyPin(&g_s4Ctx, (BYTE*)pPIN, 8, S4_USER_PIN);
  224. if (S4_SUCCESS != dwRet)
  225. {
  226. printf("Verify user PIN failed! <error code = 0x%08x>\n", dwRet);
  227. g_log->LOGERROR("Verify user PIN failed! <error code = 0x%x>", dwRet);
  228. return dwRet;
  229. }
  230. return S4_SUCCESS;
  231. }
  232. DWORD S4Time::VerifyAdminPIN(USBKEY_HANDLE hHandle, char* pPIN)
  233. {
  234. char cNewDevPin[25] = {0};
  235. memcpy(cNewDevPin, pPIN, 8);
  236. memcpy(cNewDevPin+8, "1234567812345678", 16);
  237. if (g_s4Ctx.hLock == NULL)
  238. {
  239. g_log->LOGERROR("g_s4Ctx.hLock is null");
  240. }
  241. DWORD dwRet = S4VerifyPin(&g_s4Ctx, (BYTE*)cNewDevPin, 24, S4_DEV_PIN);
  242. if (S4_SUCCESS != dwRet)
  243. {
  244. printf("verify dir admin PIN failed! <error code = 0x%08x>\n", dwRet);
  245. g_log->LOGERROR("verify dir admin PIN failed!<cNewDevPin = %s>, <error code = 0x%x>", cNewDevPin, dwRet);
  246. return dwRet;
  247. }
  248. g_log->LOGERROR("verify dir admin PIN success! <cNewDevPin = %s>", cNewDevPin);
  249. //保存根目录PIN码
  250. memcpy((void*)m_strRootPIN.c_str(), pPIN, 8);
  251. return S4_SUCCESS;
  252. }
  253. DWORD S4Time::VerifyLogDirAdminPIN(USBKEY_HANDLE hHandle, char* pPIN)
  254. {
  255. char cNewDevPin[25] = {0};
  256. memcpy(cNewDevPin, pPIN, 8);
  257. memcpy(cNewDevPin+8, "1234567812345678", 16);
  258. g_log->LOGERROR("verify log dir admin PIN! <cNewDevPin = %s>", cNewDevPin);
  259. DWORD dwRet = S4VerifyPin(&g_s4Ctx, (BYTE*)cNewDevPin, 24, S4_DEV_PIN);
  260. if (S4_SUCCESS != dwRet)
  261. {
  262. printf("verify log dir admin PIN failed! <error code = 0x%08x>\n", dwRet);
  263. g_log->LOGERROR("verify log dir admin PIN failed! <error code = 0x%x>", dwRet);
  264. return dwRet;
  265. }
  266. return S4_SUCCESS;
  267. }
  268. DWORD S4Time::ChangeAdminPIN(USBKEY_HANDLE hHandle,char* pOldPin, char* pNewPin)
  269. {
  270. char cOldDevPin[25] = {0};
  271. char cNewDevPin[25] = {0};
  272. memcpy(cOldDevPin, pOldPin, 8);
  273. memcpy(cNewDevPin, pNewPin, 8);
  274. memcpy(cOldDevPin+8, "1234567812345678", 16);
  275. memcpy(cNewDevPin+8, "1234567812345678", 16);
  276. DWORD dwRet = S4ChangePin(&g_s4Ctx, (BYTE*)cOldDevPin, 24, (BYTE*)cNewDevPin, 24, S4_DEV_PIN);
  277. if (S4_SUCCESS != dwRet)
  278. {
  279. printf("change dir admin PIN failed! <error code = 0x%08x>\n", dwRet);
  280. g_log->LOGERROR("change dir admin PIN failed! <cOldDevPin = %s>, <cNewDevPin = %s>,<error code = 0x%x>", cOldDevPin, cNewDevPin, dwRet);
  281. return dwRet;
  282. }
  283. g_log->LOGERROR("change dir admin PIN success! <cOldDevPin = %s>, <cNewDevPin = %s>", cOldDevPin, cNewDevPin);
  284. //保存根目录PIN码
  285. memcpy((void*)m_strRootPIN.c_str(), pNewPin, 8);
  286. return S4_SUCCESS;
  287. }
  288. DWORD S4Time::GenUniqueKey(USBKEY_HANDLE hHandle,char* pAdminPin, char* pUserPin)
  289. {
  290. return S4_SUCCESS;
  291. }
  292. DWORD S4Time::CreateDataFile(USBKEY_HANDLE hHandle, unsigned int nFileLength, unsigned int nFileID)
  293. {
  294. return S4_SUCCESS;
  295. }
  296. DWORD S4Time::WriteDataFile(USBKEY_HANDLE hHandle, unsigned int nFileID, unsigned int wOffset, BYTE * pInData, unsigned int nDataLen, unsigned int nFileSize)
  297. {
  298. g_log->LOGERROR("WriteDataFile, <nFileID = %d>", nFileID);
  299. DWORD dwRet = 0;
  300. DWORD dwBytesWritten = 0;
  301. string strInputID;
  302. string strFileID;
  303. string strFileLen;
  304. //写文件前,需先验证开发商PIN码
  305. dwRet = VerifyAdminPIN(hHandle, (char*)m_strRootPIN.c_str());
  306. if (S4_SUCCESS != dwRet)
  307. {
  308. return dwRet;
  309. }
  310. //取4位字节文件ID,比如0x0021中的0021
  311. _itoa_s(nFileID, (char*)strInputID.c_str(), 4,16);
  312. int nIdLen = strlen(strInputID.c_str());
  313. if (4 > nIdLen)
  314. {
  315. //补齐4位数文件ID
  316. for (int i=0;i<4-nIdLen;i++)
  317. {
  318. strFileID += "0";
  319. }
  320. }
  321. strFileID += strInputID.c_str();
  322. //加上4字节的文件头,用于表示文件长度
  323. _itoa_s(nDataLen, (char*)strFileLen.c_str(), 5, 10);
  324. int nLen = strlen(strFileLen.c_str());
  325. if (4 > strlen(strFileLen.c_str()))
  326. {
  327. string strTemp;
  328. //补齐4字节
  329. for (int i=0;i<4-nLen;i++)
  330. {
  331. strTemp += "0";
  332. }
  333. strTemp += strFileLen.c_str();
  334. strFileLen = strTemp;
  335. }
  336. char* pFileData = new char[nDataLen+4];
  337. memset(pFileData, 0, nDataLen+4);
  338. memcpy(pFileData, strFileLen.c_str(), 4);
  339. memcpy(pFileData+4, pInData, nDataLen);
  340. //创建文件
  341. dwRet = S4WriteFile(
  342. &g_s4Ctx,
  343. strFileID.c_str(),
  344. wOffset,
  345. pFileData,
  346. nDataLen+FILE_HEAD_LEN, /* Number of bytes to write. */
  347. nFileSize, /* New file size*/
  348. &dwBytesWritten,
  349. S4_CREATE_NEW,
  350. S4_DATA_FILE);
  351. if (S4_FILE_EXIST == dwRet)
  352. {
  353. //文件已经存在,则覆盖写
  354. dwRet = S4WriteFile(
  355. &g_s4Ctx,
  356. strFileID.c_str(),
  357. wOffset,
  358. pFileData,
  359. nDataLen+FILE_HEAD_LEN, /* Number of bytes to write. */
  360. 0, /* New file size*/
  361. &dwBytesWritten,
  362. S4_UPDATE_FILE,
  363. S4_DATA_FILE);
  364. if (S4_SUCCESS != dwRet)
  365. {
  366. /* Handle error here… */
  367. g_log->LOGERROR("write <fileID=%s> file failed! <error code = 0x%x>", strFileID.c_str(), dwRet);
  368. printf("write <%s> file failed! <error code = 0x%08x>\n", strFileID.c_str(), dwRet);
  369. if (NULL != pFileData)
  370. {
  371. delete pFileData;
  372. pFileData = NULL;
  373. }
  374. return dwRet;
  375. }
  376. }
  377. else if (dwRet != S4_SUCCESS)
  378. {
  379. /* Handle error here… */
  380. g_log->LOGERROR("write <fileID=%s> file failed! <error code = 0x%x>", strFileID.c_str(), dwRet);
  381. printf("write <%s> file failed! <error code = 0x%08x>\n", strFileID.c_str(), dwRet);
  382. if (NULL != pFileData)
  383. {
  384. delete pFileData;
  385. pFileData = NULL;
  386. }
  387. return dwRet;
  388. }
  389. if (NULL != pFileData)
  390. {
  391. delete pFileData;
  392. pFileData = NULL;
  393. }
  394. //实际写入的数据长度和文件长度不一致,返回错误
  395. if (nDataLen+FILE_HEAD_LEN != dwBytesWritten)
  396. {
  397. g_log->LOGERROR("writted file len is not equle to real file len");
  398. return ERR_WRITE_DATA_LEN;
  399. }
  400. return S4_SUCCESS;
  401. }
  402. DWORD S4Time::ReadDataFile(USBKEY_HANDLE hHandle, unsigned int nFileID, unsigned int wOffset, BYTE * pOutData, unsigned int nDataLen)
  403. {
  404. DWORD dwRet = 0;
  405. unsigned int nFileLen = 0;
  406. DWORD dwBytesRead = 0;
  407. string strFileID;
  408. string strInputID;
  409. //读文件前,需先验证用户PIN码,默认"12345678",不做修改
  410. dwRet = VerifyUserPIN(hHandle, DEFAULT_USER_PIN);
  411. if (S4_SUCCESS != dwRet)
  412. {
  413. return dwRet;
  414. }
  415. //取4位字节文件ID,比如0x0021中的0021
  416. _itoa_s(nFileID, (char*)strInputID.c_str(), 4, 16);
  417. int nIdLen = strlen(strInputID.c_str());
  418. if (4 > nIdLen)
  419. {
  420. //补齐4位数文件ID
  421. for (int i=0;i<4-nIdLen;i++)
  422. {
  423. strFileID += "0";
  424. }
  425. }
  426. strFileID += strInputID.c_str();
  427. //如果待数据的数据长度大于274字节,分多次读写
  428. unsigned int nReadLen = nDataLen;
  429. unsigned int nOffset = 0;
  430. BOOL bFristRead = TRUE;
  431. while(nDataLen > MAX_READ_LEN)
  432. {
  433. //读274字节
  434. BYTE outBuffer[MAX_READ_LEN] = {0};
  435. ST_READ_DATAFILE stRead;
  436. memset(&stRead, 0, sizeof(stRead));
  437. if (bFristRead)
  438. {
  439. //第一次读文件,跳过文件头
  440. nOffset += FILE_HEAD_LEN;
  441. bFristRead = FALSE;
  442. printf("\n");
  443. }
  444. stRead.offset = nOffset;
  445. stRead.ucLen = MAX_READ_LEN;
  446. stRead.fid = nFileID;
  447. //执行读文件可执行文件
  448. dwRet = S4Execute(&g_s4Ctx,EXE_READ_DATA_FILE,&stRead,sizeof(ST_READ_DATAFILE),outBuffer,MAX_READ_LEN,&dwBytesRead);
  449. if (S4_SUCCESS != dwRet)
  450. {
  451. printf("执行0x0001 failed! <error code = 0x%08x>\n", dwRet);
  452. g_log->LOGERROR("执行0x0013 failed! <error code = 0x%x>", dwRet);
  453. return dwRet;
  454. }
  455. else
  456. {
  457. /*输出排序后的数据*/
  458. for(int i=0;i<MAX_READ_LEN;i++)
  459. {
  460. printf("%c",outBuffer[i]);
  461. }
  462. if (MAX_READ_LEN != dwBytesRead)
  463. {
  464. g_log->LOGERROR("Read len is not equal to the len that want to read");
  465. return ERR_READ_DATA;
  466. }
  467. }
  468. memcpy(pOutData, outBuffer, MAX_READ_LEN);
  469. pOutData += MAX_READ_LEN;
  470. nOffset += MAX_READ_LEN;
  471. nDataLen -= MAX_READ_LEN;
  472. }
  473. if (nDataLen > 0)
  474. {
  475. //读剩余字节
  476. BYTE outBuffer[MAX_READ_LEN] = {0};
  477. ST_READ_DATAFILE stRead;
  478. memset(&stRead, 0, sizeof(stRead));
  479. if (bFristRead && nDataLen != FILE_HEAD_LEN)
  480. {
  481. //第一次读文件且不是读取文件头是,跳过文件头
  482. nOffset += FILE_HEAD_LEN;
  483. bFristRead = FALSE;
  484. }
  485. stRead.offset = nOffset;
  486. stRead.ucLen = nDataLen;
  487. stRead.fid = nFileID;
  488. //执行读文件可执行文件
  489. dwRet = S4Execute(&g_s4Ctx,EXE_READ_DATA_FILE,&stRead,sizeof(ST_READ_DATAFILE),outBuffer,MAX_READ_LEN,&dwBytesRead);
  490. //dwRet = S4Execute(&m_s4Ctx,EXE_READ_DATA_FILE,(void*)"0021",4,outBuffer,nDataLen,&dwBytesRead);
  491. if (S4_SUCCESS != dwRet)
  492. {
  493. printf("执行0013 failed! <error code = 0x%08x>\n", dwRet);
  494. g_log->LOGERROR("执行0x0013 failed! <error code = 0x%x>", dwRet);
  495. return dwRet;
  496. }
  497. else
  498. {
  499. for(unsigned int i=0;i<nDataLen;i++)
  500. {
  501. printf("%c",outBuffer[i]);
  502. }
  503. printf("\n");
  504. if (nDataLen != dwBytesRead)
  505. {
  506. g_log->LOGERROR("Read len is not equal to the len that want to read");
  507. return ERR_READ_DATA;
  508. }
  509. }
  510. memcpy(pOutData, outBuffer, nDataLen);
  511. }
  512. return S4_SUCCESS;
  513. }
  514. DWORD S4Time::DeleteDataFile(USBKEY_HANDLE hHandle, unsigned int nFileID)
  515. {
  516. if (0)
  517. {
  518. DWORD dwRet = 0;
  519. string strFileID;
  520. string strInputID;
  521. //取4位字节文件ID,比如0x0021中的0021
  522. _itoa_s(nFileID, (char*)strInputID.c_str(), 4, 16);
  523. //_itoa(nFileID, (char*)strInputID.c_str(), 16);
  524. int nIdLen = strlen(strInputID.c_str());
  525. if (4 > nIdLen)
  526. {
  527. //补齐4位数文件ID
  528. for (int i=0;i<4-nIdLen;i++)
  529. {
  530. strFileID += "0";
  531. }
  532. }
  533. strFileID += strInputID.c_str();
  534. //切换目录
  535. dwRet = S4ChangeDir(&g_s4Ctx, strFileID.c_str());
  536. if (S4_SUCCESS != dwRet)
  537. {
  538. printf("Change to <%s> dir failed! <error code = 0x%08x>\n", strFileID.c_str(),dwRet);
  539. return dwRet;
  540. }
  541. //清空目录
  542. dwRet = S4EraseDir(&g_s4Ctx, NULL);
  543. if (S4_SUCCESS != dwRet)
  544. {
  545. printf("Delete <%s> dir failed! <error code = 0x%08x>\n", strFileID.c_str(), dwRet);
  546. return dwRet;
  547. }
  548. //修改PIN码
  549. dwRet = ChangeAdminPIN(hHandle, "12345678", (char*)m_strRootPIN.c_str());
  550. if (S4_SUCCESS != dwRet)
  551. {
  552. printf("change <%s> dir admin PIN failed! <error code = 0x%08x>\n", strFileID.c_str(), dwRet);
  553. return dwRet;
  554. }
  555. }
  556. return S4_SUCCESS;
  557. }
  558. DWORD S4Time::DeleteAllFile(USBKEY_HANDLE hHandle)
  559. {
  560. g_log->LOGERROR("DeleteAllFile");
  561. //通过删除根目录来实现删除所有文件
  562. DWORD dwRet = 0;
  563. /*检查精锐IV 设备中是否存在根目录*/
  564. dwRet = S4ChangeDir(&g_s4Ctx, "\\");
  565. if (S4_DEVICE_UNSUPPORTED == dwRet)
  566. {
  567. /*如果根目录不存在,创建新的根目录*/
  568. dwRet = S4CreateDir(&g_s4Ctx, "\\", 0, S4_CREATE_ROOT_DIR);
  569. if (dwRet != S4_SUCCESS)
  570. {
  571. printf("Create new root failed! <error code = 0x%08x>\n", dwRet);
  572. g_log->LOGERROR("Create new root failed! <error code = 0x%x>", dwRet);
  573. return dwRet;
  574. }
  575. }
  576. else if (dwRet != S4_SUCCESS)
  577. {
  578. printf("Change to root dir failed! <error code = 0x%08x>\n", dwRet);
  579. g_log->LOGERROR("Change to root dir failed! <error code = 0x%x>", dwRet);
  580. return dwRet;
  581. }
  582. //清空根目录前,需先验证开发商PIN码
  583. dwRet = VerifyAdminPIN(hHandle, (char*)m_strRootPIN.c_str());
  584. if (S4_SUCCESS != dwRet)
  585. {
  586. return dwRet;
  587. }
  588. //清空根目录
  589. dwRet = S4EraseDir(&g_s4Ctx, NULL);
  590. if (S4_SUCCESS != dwRet)
  591. {
  592. printf("Delete root dir failed! <error code = 0x%08x>\n", dwRet);
  593. g_log->LOGERROR("Delete root dir failed! <error code = 0x%x>", dwRet);
  594. return dwRet;
  595. }
  596. //创建新的根目录
  597. dwRet = S4CreateDir(&g_s4Ctx, "\\", 0, S4_CREATE_ROOT_DIR);
  598. if (S4_SUCCESS != dwRet)
  599. {
  600. printf("Create new root failed! <error code = 0x%08x>\n", dwRet);
  601. g_log->LOGERROR("Create new root failed! <error code = 0x%x>", dwRet);
  602. return dwRet;
  603. }
  604. //修改开发商PIN码
  605. dwRet = ChangeAdminPIN(hHandle, DEFAULT_ADMIN_PIN, (char*)m_strRootPIN.c_str());
  606. if (S4_SUCCESS != dwRet)
  607. {
  608. printf("Change dev PIN failed! <error code = 0x%08x>\n", dwRet);
  609. g_log->LOGERROR("Change dev PIN failed! <error code = 0x%x>", dwRet);
  610. return dwRet;
  611. }
  612. return S4_SUCCESS;
  613. }
  614. DWORD S4Time::GetFileLen(USBKEY_HANDLE hHandle, unsigned int nFileID, unsigned int* pFileLen)
  615. {
  616. string strFileLen;
  617. DWORD dwRet = ReadDataFile(hHandle, nFileID, 0, (BYTE*)strFileLen.c_str(), 4);
  618. if (S4_SUCCESS != dwRet)
  619. {
  620. return dwRet;
  621. }
  622. *pFileLen = atoi(strFileLen.c_str());
  623. return S4_SUCCESS;
  624. }
  625. DWORD S4Time::WriteExeFile(USBKEY_HANDLE hHandle, unsigned int nFileID, BYTE * pInData, unsigned int nDataLen, unsigned int nFileSize)
  626. {
  627. g_log->LOGERROR("WriteExeFile <nFileID = %d>", nFileID);
  628. DWORD dwRet = 0;
  629. DWORD dwBytesWritten = 0;
  630. string strInputID;
  631. string strFileID;
  632. string strFileLen;
  633. //读日志文件Exe文件因为为目录不同,需要切换目录
  634. if (READ_LOG_FILE_EXE_ID == nFileID)
  635. {
  636. //切换到日志目录
  637. dwRet = S4ChangeDir(&g_s4Ctx, LOG_DIR);
  638. if (S4_DEVICE_UNSUPPORTED == dwRet
  639. || S4_FILE_NOT_FOUND == dwRet)
  640. {
  641. //如果日志目录不存在,创建新的日志目录
  642. dwRet = S4CreateDir(&g_s4Ctx, LOG_DIR, MAX_LOG_DIR_SIZE, S4_CREATE_SUB_DIR);
  643. if (dwRet != S4_SUCCESS)
  644. {
  645. printf("Create d001 dir failed! <error code = 0x%08x>\n", dwRet);
  646. g_log->LOGERROR("Create d001 dir failed! <error code = 0x%x>", dwRet);
  647. return dwRet;
  648. }
  649. }
  650. else if (dwRet != S4_SUCCESS)
  651. {
  652. printf("Change to d001 dir failed! <error code = 0x%08x>\n", dwRet);
  653. g_log->LOGERROR("Change to d001 dir failed! <error code = 0x%x>", dwRet);
  654. return dwRet;
  655. }
  656. dwRet = VerifyLogDirAdminPIN(hHandle, DEFAULT_ADMIN_PIN);
  657. if (S4_SUCCESS != dwRet)
  658. {
  659. return dwRet;
  660. }
  661. }
  662. else
  663. {
  664. //写文件前,需先验证开发商PIN码
  665. dwRet = VerifyAdminPIN(hHandle, (char*)m_strRootPIN.c_str());
  666. if (S4_SUCCESS != dwRet)
  667. {
  668. return dwRet;
  669. }
  670. }
  671. //取4位字节文件ID,比如0x0021中的0021
  672. _itoa_s(nFileID, (char*)strInputID.c_str(), 4, 16);
  673. int nIdLen = strlen(strInputID.c_str());
  674. if (4 > nIdLen)
  675. {
  676. //补齐4位数文件ID
  677. for (int i=0;i<4-nIdLen;i++)
  678. {
  679. strFileID += "0";
  680. }
  681. }
  682. strFileID += strInputID.c_str();
  683. //创建文件
  684. dwRet = S4WriteFile(
  685. &g_s4Ctx,
  686. strFileID.c_str(),
  687. 0,
  688. pInData,
  689. nDataLen, /* Number of bytes to write. */
  690. nFileSize, /* New file size*/
  691. &dwBytesWritten,
  692. S4_CREATE_NEW,
  693. S4_EXE_FILE);
  694. if (dwRet != S4_SUCCESS)
  695. {
  696. /* Handle error here… */
  697. printf("write <fileID=%s> failed! <error code = 0x%08x>\n", strFileID.c_str(), dwRet);
  698. g_log->LOGERROR("write <fileID=%s> file failed! <error code = 0x%x>", strFileID.c_str(), dwRet);
  699. if (READ_LOG_FILE_EXE_ID == nFileID)
  700. {
  701. //切回根目录
  702. dwRet = S4ChangeDir(&g_s4Ctx, "\\");
  703. if (dwRet != S4_SUCCESS)
  704. {
  705. printf("Change to root dir failed! <error code = 0x%08x>\n", dwRet);
  706. g_log->LOGERROR("Change to root dir failed! <error code = 0x%x>", dwRet);
  707. return dwRet;
  708. }
  709. }
  710. return dwRet;
  711. }
  712. //实际写入的数据长度和文件长度不一致,返回错误
  713. if (nDataLen != dwBytesWritten)
  714. {
  715. if (READ_LOG_FILE_EXE_ID == nFileID)
  716. {
  717. //切回根目录
  718. dwRet = S4ChangeDir(&g_s4Ctx, "\\");
  719. if (dwRet != S4_SUCCESS)
  720. {
  721. printf("Change to root dir failed! <error code = 0x%08x>\n", dwRet);
  722. g_log->LOGERROR("Change to root dir failed! <error code = 0x%x>", dwRet);
  723. return dwRet;
  724. }
  725. }
  726. return ERR_WRITE_DATA_LEN;
  727. }
  728. if (READ_LOG_FILE_EXE_ID == nFileID)
  729. {
  730. //切回根目录
  731. dwRet = S4ChangeDir(&g_s4Ctx, "\\");
  732. if (dwRet != S4_SUCCESS)
  733. {
  734. printf("Change to root dir failed! <error code = 0x%08x>\n", dwRet);
  735. g_log->LOGERROR("Change to root dir failed! <error code = 0x%x>", dwRet);
  736. return dwRet;
  737. }
  738. }
  739. return S4_SUCCESS;
  740. }
  741. DWORD S4Time::ReadLogData(USBKEY_HANDLE hHandle, unsigned int wOffset, BYTE * pOutData, unsigned int nDataLen)
  742. {
  743. DWORD dwRet = 0;
  744. unsigned int nFileLen = 0;
  745. DWORD dwBytesRead = 0;
  746. //读文件前,需先验证用户PIN码,默认"12345678",不做修改
  747. dwRet = VerifyUserPIN(hHandle, "12345678");
  748. if (S4_SUCCESS != dwRet)
  749. {
  750. return dwRet;
  751. }
  752. //读文件头,单独处理
  753. if (FILE_HEAD_LEN == nDataLen
  754. && 0 == wOffset)
  755. {
  756. //读4字节文件头
  757. BYTE outBuffer[FILE_HEAD_LEN] = {0};
  758. ST_READ_DATAFILE stRead;
  759. memset(&stRead, 0, sizeof(stRead));
  760. stRead.offset = wOffset;
  761. stRead.ucLen = nDataLen;
  762. stRead.fid = LOG_FILE_ID;
  763. //执行读文件可执行文件
  764. dwRet = S4Execute(&g_s4Ctx,EXE_READ_LOG_FILE,(void*)&stRead,sizeof(ST_READ_DATAFILE),outBuffer,nDataLen,&dwBytesRead);
  765. if (S4_SUCCESS != dwRet)
  766. {
  767. printf("执行0x0014 failed! <error code = 0x%08x>\n", dwRet);
  768. g_log->LOGERROR("执行0x0014 failed! <error code = 0x%x>", dwRet);
  769. return dwRet;
  770. }
  771. else
  772. {
  773. if (nDataLen != dwBytesRead)
  774. {
  775. memcpy(&dwRet, outBuffer, 1);
  776. return dwRet;
  777. }
  778. }
  779. memcpy(pOutData, outBuffer, nDataLen);
  780. return S4_SUCCESS;
  781. }
  782. //如果待数据的数据长度大于274字节,分多次读写
  783. unsigned int nReadLen = nDataLen;
  784. unsigned int nOffset = 0;
  785. BOOL bFristRead = TRUE;
  786. while(nDataLen > MAX_READ_LEN)
  787. {
  788. //读274字节
  789. BYTE outBuffer[MAX_READ_LEN] = {0};
  790. ST_READ_DATAFILE stRead;
  791. memset(&stRead, 0, sizeof(stRead));
  792. if (bFristRead)
  793. {
  794. //第一次读文件,跳过文件头
  795. nOffset += FILE_HEAD_LEN;
  796. bFristRead = FALSE;
  797. }
  798. stRead.offset = nOffset;
  799. stRead.ucLen = MAX_READ_LEN;
  800. stRead.fid = LOG_FILE_ID;
  801. //执行读文件可执行文件
  802. dwRet = S4Execute(&g_s4Ctx,EXE_READ_LOG_FILE,(void*)&stRead,sizeof(ST_READ_DATAFILE),outBuffer,MAX_READ_LEN,&dwBytesRead);
  803. if (S4_SUCCESS != dwRet)
  804. {
  805. printf("执行0x0014 failed! <error code = 0x%08x>\n", dwRet);
  806. g_log->LOGERROR("执行0x0014 failed! <error code = 0x%x>", dwRet);
  807. return dwRet;
  808. }
  809. else
  810. {
  811. if (MAX_READ_LEN != dwBytesRead)
  812. {
  813. memcpy(&dwRet, outBuffer, 1);
  814. return dwRet;
  815. }
  816. }
  817. memcpy(pOutData, outBuffer, MAX_READ_LEN);
  818. pOutData += MAX_READ_LEN;
  819. nOffset += MAX_READ_LEN;
  820. nDataLen -= MAX_READ_LEN;
  821. }
  822. if (nDataLen > 0)
  823. {
  824. //读剩余字节
  825. BYTE outBuffer[MAX_READ_LEN] = {0};
  826. ST_READ_DATAFILE stRead;
  827. memset(&stRead, 0, sizeof(stRead));
  828. if (bFristRead)
  829. {
  830. //第一次读文件,跳过文件头
  831. nOffset += FILE_HEAD_LEN;
  832. bFristRead = FALSE;
  833. }
  834. stRead.offset = nOffset;
  835. stRead.ucLen = nDataLen;
  836. stRead.fid = LOG_FILE_ID;
  837. //执行读文件可执行文件
  838. dwRet = S4Execute(&g_s4Ctx,EXE_READ_LOG_FILE,(void*)&stRead,sizeof(ST_READ_DATAFILE),outBuffer,nDataLen,&dwBytesRead);
  839. if (S4_SUCCESS != dwRet)
  840. {
  841. printf("执行0x0014 failed! <error code = 0x%08x>\n", dwRet);
  842. g_log->LOGERROR("执行0x0014 failed! <error code = 0x%x>", dwRet);
  843. return dwRet;
  844. }
  845. else
  846. {
  847. if (nDataLen != dwBytesRead)
  848. {
  849. memcpy(&dwRet, outBuffer, 1);
  850. return dwRet;
  851. }
  852. }
  853. memcpy(pOutData, outBuffer, nDataLen);
  854. }
  855. return S4_SUCCESS;
  856. }
  857. DWORD S4Time::WriteLogData(USBKEY_HANDLE hHandle, unsigned int wOffset, BYTE * pInData, unsigned int nDataLen)
  858. {
  859. g_log->LOGERROR("WriteLogData");
  860. DWORD dwRet = 0;
  861. DWORD dwBytesWritten = 0;
  862. char* pFileData = NULL;
  863. string strFileLen;
  864. //写文件前,需先验证开发商PIN码
  865. dwRet = VerifyLogDirAdminPIN(hHandle, (char*)DEFAULT_ADMIN_PIN);
  866. if (S4_SUCCESS != dwRet)
  867. {
  868. return dwRet;
  869. }
  870. if (FILE_HEAD_LEN < nDataLen
  871. && 0 == wOffset)
  872. {
  873. //如果不是写文件头,且是第一次写文件,则加上文件头
  874. //加上4字节的文件头,用于表示文件长度
  875. _itoa_s(nDataLen, (char*)strFileLen.c_str(), 5, 10);
  876. int nLen = strlen(strFileLen.c_str());
  877. if (4 > strlen(strFileLen.c_str()))
  878. {
  879. string strTemp;
  880. //补齐4字节
  881. for (int i=0;i<4-nLen;i++)
  882. {
  883. strTemp += "0";
  884. }
  885. strTemp += strFileLen.c_str();
  886. strFileLen = strTemp;
  887. }
  888. pFileData = new char[nDataLen+FILE_HEAD_LEN];
  889. memset(pFileData, 0, nDataLen+FILE_HEAD_LEN);
  890. memcpy(pFileData, strFileLen.c_str(), FILE_HEAD_LEN);
  891. memcpy(pFileData+FILE_HEAD_LEN, pInData, nDataLen);
  892. }
  893. else
  894. {
  895. pFileData = new char[nDataLen];
  896. memset(pFileData, 0, nDataLen);
  897. memcpy(pFileData, pInData, nDataLen);
  898. }
  899. //创建文件
  900. dwRet = S4WriteFile(
  901. &g_s4Ctx,
  902. "0040",
  903. wOffset,
  904. pFileData,
  905. nDataLen+FILE_HEAD_LEN, /* Number of bytes to write. */
  906. S4_MAX_LOG_SIZE, /* New file size*/
  907. &dwBytesWritten,
  908. S4_CREATE_NEW,
  909. S4_DATA_FILE);
  910. if (S4_FILE_EXIST == dwRet)
  911. {
  912. //文件已经存在,则覆盖写
  913. unsigned int offset = 0;
  914. if (FILE_HEAD_LEN != nDataLen)
  915. {
  916. //如果不是写文件头,实际偏移量需要加上文件头长度
  917. offset = wOffset+FILE_HEAD_LEN;
  918. }
  919. else
  920. {
  921. offset = 0;
  922. }
  923. dwRet = S4WriteFile(
  924. &g_s4Ctx,
  925. "0040",
  926. offset,
  927. pFileData,
  928. nDataLen, /* Number of bytes to write. */
  929. 0, /* New file size*/
  930. &dwBytesWritten,
  931. S4_UPDATE_FILE,
  932. S4_DATA_FILE);
  933. if (dwRet != S4_SUCCESS)
  934. {
  935. /* Handle error here… */
  936. printf("write log file failed! <error code = 0x%08x>\n", dwRet);
  937. g_log->LOGERROR("write log file failed! <error code = 0x%x>", dwRet);
  938. if (NULL != pFileData)
  939. {
  940. delete pFileData;
  941. pFileData = NULL;
  942. }
  943. return dwRet;
  944. }
  945. if (NULL != pFileData)
  946. {
  947. delete pFileData;
  948. pFileData = NULL;
  949. }
  950. //实际写入的数据长度和文件长度不一致,返回错误
  951. if (nDataLen != dwBytesWritten)
  952. {
  953. return ERR_WRITE_DATA_LEN;
  954. }
  955. return S4_SUCCESS;
  956. }
  957. else if (dwRet != S4_SUCCESS)
  958. {
  959. /* Handle error here… */
  960. printf("write log file failed! <error code = 0x%08x>\n", dwRet);
  961. g_log->LOGERROR("write log file failed! <error code = 0x%x>", dwRet);
  962. if (NULL != pFileData)
  963. {
  964. delete pFileData;
  965. pFileData = NULL;
  966. }
  967. return dwRet;
  968. }
  969. if (NULL != pFileData)
  970. {
  971. delete pFileData;
  972. pFileData = NULL;
  973. }
  974. //实际写入的数据长度和文件长度不一致,返回错误
  975. if (nDataLen+FILE_HEAD_LEN != dwBytesWritten)
  976. {
  977. return ERR_WRITE_DATA_LEN;
  978. }
  979. return S4_SUCCESS;
  980. }
  981. DWORD S4Time::GetLogFileLength(USBKEY_HANDLE hHandle, int* pFileLen)
  982. {
  983. //切换到日志目录
  984. DWORD dwRet = S4ChangeDir(&g_s4Ctx, LOG_DIR);
  985. if (dwRet != S4_SUCCESS)
  986. {
  987. printf("Change to d001 dir failed! <error code = 0x%08x>\n", dwRet);
  988. g_log->LOGERROR("Change to d001 dir failed! <error code = 0x%x>", dwRet);
  989. return dwRet;
  990. }
  991. BYTE strFileLen[MAX_LOG_END_POS_VALUE_NEEDLEN] = {0};
  992. dwRet = ReadLogData(hHandle, 0, strFileLen, 4);
  993. if(S4_SUCCESS != dwRet)
  994. {
  995. return dwRet;
  996. }
  997. *pFileLen = atoi((const char*)strFileLen);
  998. return S4_SUCCESS;
  999. }
  1000. DWORD S4Time::ReadLogFile(USBKEY_HANDLE hHandle, BYTE* pOutData, int nDataLen)
  1001. {
  1002. //切换到日志目录
  1003. DWORD dwRet = S4ChangeDir(&g_s4Ctx, LOG_DIR);
  1004. if (dwRet != S4_SUCCESS)
  1005. {
  1006. printf("Change to d001 dir failed! <error code = 0x%08x>\n", dwRet);
  1007. g_log->LOGERROR("Change to d001 dir failed! <error code = 0x%x>", dwRet);
  1008. return dwRet;
  1009. }
  1010. //读文件
  1011. dwRet = ReadLogData(hHandle, 0, pOutData, nDataLen);
  1012. if (dwRet != S4_SUCCESS)
  1013. {
  1014. return dwRet;
  1015. }
  1016. //切回根目录
  1017. dwRet = S4ChangeDir(&g_s4Ctx, "\\");
  1018. if (dwRet != S4_SUCCESS)
  1019. {
  1020. printf("Change to root dir failed! <error code = 0x%08x>\n", dwRet);
  1021. g_log->LOGERROR("Change to root dir failed! <error code = 0x%x>", dwRet);
  1022. return dwRet;
  1023. }
  1024. return S4_SUCCESS;
  1025. }
  1026. DWORD S4Time::WriteLogFile(USBKEY_HANDLE hHandle, BYTE* pInData, int nDataLen)
  1027. {
  1028. int nLogLen = 0;
  1029. DWORD dwRet = 0;
  1030. //切换到日志目录
  1031. dwRet = S4ChangeDir(&g_s4Ctx, LOG_DIR);
  1032. if (S4_DEVICE_UNSUPPORTED == dwRet
  1033. || S4_FILE_NOT_FOUND == dwRet)
  1034. {
  1035. //如果日志目录不存在,创建新的日志目录
  1036. dwRet = S4CreateDir(&g_s4Ctx, LOG_DIR, MAX_LOG_DIR_SIZE, S4_CREATE_SUB_DIR);
  1037. if (dwRet != S4_SUCCESS)
  1038. {
  1039. printf("Create d001 dir failed! <error code = 0x%08x>\n", dwRet);
  1040. g_log->LOGERROR("Create d001 dir failed! <error code = 0x%x>", dwRet);
  1041. return dwRet;
  1042. }
  1043. }
  1044. else if (dwRet != S4_SUCCESS)
  1045. {
  1046. printf("Change to d001 dir failed! <error code = 0x%08x>\n", dwRet);
  1047. g_log->LOGERROR("Change to d001 dir failed! <error code = 0x%x>", dwRet);
  1048. return dwRet;
  1049. }
  1050. //获取日志长度
  1051. dwRet = GetLogFileLength(hHandle, &nLogLen);
  1052. if (SES_FILEID == dwRet)
  1053. {
  1054. //日志不存在,则创建新日志文件
  1055. return WriteLogData(hHandle, 0, pInData, nDataLen);
  1056. }
  1057. else if (S4_SUCCESS != dwRet)
  1058. {
  1059. return dwRet;
  1060. }
  1061. //最大日志文件长度为4096字节,如果剩余空间不足以记录下一条日志,则返回错误
  1062. int nNewEndPos = nLogLen + nDataLen;
  1063. if (nNewEndPos > S4_MAX_LOG_SIZE)
  1064. {
  1065. return ERR_LOG_TOO_BIG;
  1066. }
  1067. //写入新日志内容
  1068. dwRet = WriteLogData(hHandle, nLogLen, pInData, nDataLen);
  1069. if (S4_SUCCESS == dwRet)
  1070. {
  1071. //更新文件头,即文件长度
  1072. BYTE strNewEnPos[MAX_LOG_END_POS_VALUE_NEEDLEN+1] = {0};
  1073. sprintf_s((char*)strNewEnPos, FILE_HEAD_LEN,"%d", nNewEndPos);
  1074. dwRet = WriteLogData(hHandle, 0, strNewEnPos, FILE_HEAD_LEN);
  1075. if (dwRet != S4_SUCCESS)
  1076. {
  1077. return dwRet;
  1078. }
  1079. }
  1080. else
  1081. {
  1082. return dwRet;
  1083. }
  1084. //切回根目录
  1085. dwRet = S4ChangeDir(&g_s4Ctx, "\\");
  1086. if (dwRet != S4_SUCCESS)
  1087. {
  1088. printf("Change to root dir failed! <error code = 0x%08x>\n", dwRet);
  1089. g_log->LOGERROR("Change to root dir failed! <error code = 0x%x>", dwRet);
  1090. return dwRet;
  1091. }
  1092. return S4_SUCCESS;
  1093. }
  1094. DWORD S4Time::DeleteLogFile(USBKEY_HANDLE hHandle)
  1095. {
  1096. g_log->LOGERROR("DeleteLogFile");
  1097. //通过日志目录来实现删除日志文件
  1098. DWORD dwRet = 0;
  1099. //切换到日志目录
  1100. dwRet = S4ChangeDir(&g_s4Ctx, LOG_DIR);
  1101. if (S4_DEVICE_UNSUPPORTED == dwRet)
  1102. {
  1103. //如果日志目录不存在,创建新的日志目录
  1104. dwRet = S4CreateDir(&g_s4Ctx, LOG_DIR, MAX_LOG_DIR_SIZE, S4_CREATE_SUB_DIR);
  1105. if (S4_SUCCESS != dwRet)
  1106. {
  1107. printf("Create d001 dir failed! <error code = 0x%08x>\n", dwRet);
  1108. g_log->LOGERROR("Create d001 dir failed! <error code = 0x%x>", dwRet);
  1109. return dwRet;
  1110. }
  1111. }
  1112. else if (S4_SUCCESS != dwRet)
  1113. {
  1114. printf("Change to d001 dir failed! <error code = 0x%08x>\n", dwRet);
  1115. g_log->LOGERROR("Change to d001 dir failed! <error code = 0x%x>", dwRet);
  1116. return dwRet;
  1117. }
  1118. //清空根目录前,需先验证开发商PIN码
  1119. dwRet = VerifyLogDirAdminPIN(hHandle, (char*)DEFAULT_ADMIN_PIN);
  1120. if (S4_SUCCESS != dwRet)
  1121. {
  1122. printf("VerifyLogDirAdminPIN failed! <error code = 0x%08x>\n", dwRet);
  1123. g_log->LOGERROR("VerifyLogDirAdminPINfailed! <error code = 0x%x>", dwRet);
  1124. return dwRet;
  1125. }
  1126. //清空日志目录
  1127. dwRet = S4EraseDir(&g_s4Ctx, NULL);
  1128. if (S4_SUCCESS != dwRet)
  1129. {
  1130. printf("Delete d001 dir failed! <error code = 0x%08x>\n", dwRet);
  1131. g_log->LOGERROR("Delete d001 dir failed! <error code = 0x%x>", dwRet);
  1132. return dwRet;
  1133. }
  1134. //切回根目录
  1135. dwRet = S4ChangeDir(&g_s4Ctx, "\\");
  1136. if (S4_SUCCESS != dwRet)
  1137. {
  1138. printf("Change to root dir failed! <error code = 0x%08x>\n", dwRet);
  1139. g_log->LOGERROR("Change to root dir failed!<error code = 0x%x>", dwRet);
  1140. return dwRet;
  1141. }
  1142. return S4_SUCCESS;
  1143. }
  1144. DWORD S4Time::WritePrivateKey(USBKEY_HANDLE hHandle, BYTE * pInData, int nDataLen)
  1145. {
  1146. DWORD dwRet = WriteDataFile(hHandle, PRIVATE_KEY_ID, 0, pInData, nDataLen, MAX_PRIVATE_KEY_SIZE);
  1147. if (dwRet != S4_SUCCESS)
  1148. {
  1149. return dwRet;
  1150. }
  1151. return S4_SUCCESS;
  1152. }
  1153. DWORD S4Time::CreatePrivateKey(USBKEY_HANDLE hHandle, int nFileLen)
  1154. {
  1155. return S4_SUCCESS;
  1156. }
  1157. DWORD S4Time::DeletePrivateKey(USBKEY_HANDLE hHandle)
  1158. {
  1159. return S4_SUCCESS;
  1160. }
  1161. DWORD S4Time::ProtocolSwitch(USBKEY_HANDLE hHandle, int nFlag)
  1162. {
  1163. return S4_SUCCESS;
  1164. }
  1165. DWORD S4Time::GetHIDFromUKey(char *strHID)
  1166. {
  1167. SENSE4_CONTEXT * s4CtxList =NULL ;
  1168. DWORD dwSize=0;
  1169. DWORD dwRet = 0;
  1170. //枚举系统连接了多少个设备,这一步不用判断返回值,第一个参数输入NULL
  1171. dwRet = S4Enum(NULL,&dwSize);
  1172. if (S4_SUCCESS != dwRet && S4_INSUFFICIENT_BUFFER != dwRet)
  1173. {
  1174. printf("S4Enum failed!<error code = %08x>\n", dwRet);
  1175. return dwRet;
  1176. }
  1177. //如果得到的设备上下文内存数量为0或者不为sizeof(SENSE4_CONTEXT)的倍数,
  1178. //说明没有找到设备或者列举设备出错。
  1179. if ((0 == dwSize) || (dwSize % sizeof(SENSE4_CONTEXT)))
  1180. {
  1181. printf("S4Enum return size err!\n");
  1182. return S4_NO_LIST;
  1183. }
  1184. int nCount = dwSize / sizeof(SENSE4_CONTEXT);
  1185. //根据返回的设备个数,分配空间给程序使用
  1186. s4CtxList = (SENSE4_CONTEXT *)malloc(dwSize);
  1187. //根据分配的空间,再次枚举设备,这次要判断函数返回值
  1188. dwRet = S4Enum(&g_s4Ctx,&dwSize);
  1189. if(S4_SUCCESS != dwRet)
  1190. {
  1191. free(s4CtxList);
  1192. s4CtxList = NULL;
  1193. printf("Enum device failed.<error code = %08x>\n", dwRet);
  1194. return dwRet;
  1195. }
  1196. S4OPENINFO S4_OpenInfo;
  1197. S4_OpenInfo.dwS4OpenInfoSize = sizeof(S4OPENINFO);
  1198. S4_OpenInfo.dwShareMode = S4_EXCLUSIZE_MODE;
  1199. dwRet = S4OpenEx(&g_s4Ctx, &S4_OpenInfo);
  1200. if (S4_SUCCESS != dwRet)
  1201. {
  1202. if (S4_DEVICE_BUSY == dwRet)
  1203. {
  1204. printf("device is busy, start to close, and then open.\n");
  1205. dwRet = S4Close(&g_s4Ctx);
  1206. if(S4_SUCCESS != dwRet)
  1207. {
  1208. free(s4CtxList);
  1209. s4CtxList = NULL;
  1210. printf("S4Close failure.<error code = %08x>\n", dwRet);
  1211. return dwRet;
  1212. }
  1213. dwRet = S4OpenEx(&g_s4Ctx, &S4_OpenInfo);
  1214. if(S4_SUCCESS != dwRet)
  1215. {
  1216. free(s4CtxList);
  1217. s4CtxList = NULL;
  1218. printf("S4OpenEx failure.<error code = %08x>\n", dwRet);
  1219. return dwRet;
  1220. }
  1221. }
  1222. else
  1223. {
  1224. printf("S4OpenEx failure.<error code = %08x>\n", dwRet);
  1225. return dwRet;
  1226. }
  1227. }
  1228. //获取设备序列号
  1229. DWORD len = 0;
  1230. unsigned char cSerialNumber[8] = {0};
  1231. dwRet = S4Control(&g_s4Ctx, S4_GET_SERIAL_NUMBER, NULL, 0, (void*)cSerialNumber, 8, &len);
  1232. if (S4_SUCCESS != dwRet)
  1233. {
  1234. /*free(s4CtxList);
  1235. s4CtxList = NULL;*/
  1236. printf("Get Serial number failed!<error code = %08x>\n", dwRet);
  1237. return dwRet;
  1238. }
  1239. for (int i = 0; i < 8; i++)
  1240. {
  1241. sprintf(strHID+2*i, "%02X ", cSerialNumber[i]);
  1242. }
  1243. free(s4CtxList);
  1244. s4CtxList = NULL;
  1245. return S4_SUCCESS;
  1246. }