Encryptlock.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  1. #include "StdAfx.h"
  2. #include "Encryptlock.h"
  3. namespace Encryptlockkernel
  4. {
  5. CHAR *g_pHReadPassWord = NULL;
  6. CHAR *g_pLReadPassWord = NULL;
  7. CHAR *g_pHWritePassWord = NULL;
  8. CHAR *g_pLWritePassWord = NULL;
  9. BOOL g_bUSE_NEWPASSWORD = FALSE;
  10. // 加密解密密钥;
  11. CHAR *g_szEncKey[][4] = {
  12. {"5A11475E", "39F530AD", "DCE97937", "6BCDB275"}, // 儿童全能版;
  13. {"04BBE109", "E3AFEA47", "778414D1", "16785D1F"}, // 儿童座席版;
  14. {"4900364D", "28E42F9C", "CBD86826", "5ACCA264"}, // 儿童企业版;
  15. {"BA7DA71F", "A17DB814", "C411F1AE", "A34531FD"}, // 婚纱全能版;
  16. {"F3A690F8", "828AD936", "667E03C0", "05674C0E"}, // 婚纱座席版;
  17. {"EC9FC9E1", "773E7E16", "0612A764", "A907E0F2"} // 婚纱企业版;
  18. };
  19. CHAR *g_szRom[] = {
  20. "9E5B96F2223FCF8CC12308DABF669CB4", // 000
  21. "873A748B773F7E261623B775A907F0F3", // 033
  22. "7C2359705B1752BEEEFB9B4816785D2F", // 066
  23. "4EF5EF37D1D91881B0CD5D1F44B19659", // 099
  24. "CA7DA7CF9951A0493845DA97DC391325", // 132
  25. "1CD3CD15BFB7F66F9EAB3BFD118E6326", // 165
  26. "3EE5DF32D1991480607D5D0E4F614658", // 198
  27. "4FB2FC03EEAA2592819E2EDC1072676A" // 231
  28. // 264 是座席数使用的地址;
  29. // 297 是域名值使用的地址;
  30. // 330 是医院系统使用的地址;
  31. };
  32. CHAR *g_szPassword[][2] = {
  33. //////////////////////////////////////////////////////////////////////////
  34. // 旧密码;
  35. { "7528527A", "541C5CF4"}, // 读密码 高低;
  36. { "E4F08542", "87E5CED0"}, // 写密码 高低;
  37. //////////////////////////////////////////////////////////////////////////
  38. // 新密码;
  39. { "9201B009", "26B43D72"}, // 读密码 高低;
  40. { "AA679BD9", "302B1952"} // 写密码 高低;
  41. };
  42. // 用户自定义密钥;
  43. CHAR *g_szUserKey = { "20D30D15FFB7F6AF9EAB30FD229F797B" };
  44. //////////////////////////////////////////////////////////////////////////
  45. // 锁内存数据;
  46. BYTE g_byShotVersion[][10] =
  47. {
  48. { 0x06, 0x00, 0xC2, 0xC7, 0xD2, 0x43, 0xB9, 0x01, 0x8A, 0xC3 }, // 儿童全能版;
  49. { 0x06, 0x00, 0x94, 0x0B, 0xCD, 0x32, 0x04, 0xAB, 0x20, 0x27 }, // 儿童座席版;
  50. { 0x06, 0x00, 0x04, 0xBB, 0x67, 0x0A, 0x3B, 0xA9, 0xF0, 0xDC }, // 儿童企业版;
  51. { 0x06, 0x00, 0xBC, 0x91, 0x64, 0x2F, 0x9A, 0xB1, 0x22, 0xCD }, // 婚纱全能版;
  52. { 0x06, 0x00, 0x04, 0x1D, 0x18, 0xF7, 0xBD, 0x5F, 0x53, 0x4C }, // 婚纱座席版;
  53. { 0x06, 0x00, 0x89, 0xA0, 0xE6, 0xAD, 0xCA, 0x02, 0x75, 0x8E } // 婚纱企业版;
  54. };
  55. // start---------------加密表达式加密后的数组----------------------;
  56. CONST BYTE g_byCalExVersion[][114] =
  57. {
  58. // 儿童全能版;
  59. { 109, 0, 26, 222, 0, 239, 199, 199, 188, 225, 180, 168, 178, 208, 21, 79, 62, 90, 51, 31, 88, 128, 180, 105, 53, 137, 230, 254, 244, 50, 195,
  60. 49, 167, 143, 168, 125, 130, 125, 8, 73, 224, 120, 80, 95, 178, 49, 44, 158, 38, 38, 247, 169, 62, 187, 119, 192, 77, 194, 118, 246, 133, 241,
  61. 157, 62, 144, 24, 94, 173, 49, 192, 46, 250, 249, 239, 82, 78, 135, 3, 86, 154, 8, 135, 180, 168, 178, 208, 21, 79, 62, 90, 51, 31, 88,
  62. 128, 180, 105, 53, 137, 230, 254, 244, 50, 195, 49, 167, 143, 241, 214, 38, 180, 198, 3, 158, 165 },
  63. // 儿童座席版;
  64. { 109, 0, 90, 15, 108, 138, 37, 190, 82, 8, 20, 252, 32, 162, 7, 8, 254, 255, 56, 245, 194, 4, 46, 120, 49, 120, 156, 27, 17, 164, 217,
  65. 79, 167, 146, 197, 69, 55, 117, 197, 149, 42, 217, 151, 195, 254, 145, 187, 197, 232, 188, 114, 223, 40, 229, 151, 245, 116, 177, 141, 94, 134, 14,
  66. 13, 169, 165, 94, 5, 216, 235, 60, 176, 38, 174, 121, 187, 174, 16, 30, 17, 20, 246, 34, 20, 252, 32, 162, 7, 8, 254, 255, 56, 245, 194,
  67. 4, 46, 120, 49, 120, 156, 27, 17, 164, 217, 79, 167, 146, 143, 132, 219, 173, 211, 2, 99, 180 },
  68. // 儿童企业版;
  69. { 109, 0, 229, 36, 223, 222, 213, 46, 70, 55, 240, 207, 237, 75, 226, 68, 133, 100, 42, 119, 89, 131, 79, 104, 158, 17, 172, 239, 4, 158, 201,
  70. 51, 62, 51, 94, 232, 14, 124, 81, 64, 100, 141, 187, 85, 156, 59, 205, 116, 200, 24, 108, 218, 145, 22, 7, 36, 45, 7, 156, 255, 170, 130,
  71. 165, 140, 99, 216, 120, 72, 171, 196, 27, 49, 138, 199, 137, 246, 214, 247, 121, 114, 215, 199, 240, 207, 237, 75, 226, 68, 133, 100, 42, 119, 89,
  72. 131, 79, 104, 158, 17, 172, 239, 4, 158, 201, 51, 62, 51, 248, 214, 27, 254, 221, 208, 181, 209 },
  73. // 婚纱全能版;
  74. { 109, 0, 139, 145, 163, 176, 66, 18, 207, 79, 172, 200, 12, 124, 89, 151, 248, 238, 26, 85, 137, 146, 119, 58, 76, 194, 151, 239, 204, 104, 18,
  75. 166, 208, 54, 37, 85, 3, 174, 28, 74, 154, 156, 120, 194, 8, 112, 79, 42, 27, 89, 81, 95, 238, 74, 59, 199, 160, 101, 117, 179, 51, 138,
  76. 70, 176, 239, 182, 160, 212, 11, 33, 224, 74, 155, 143, 216, 10, 220, 71, 8, 168, 18, 175, 172, 200, 12, 124, 89, 151, 248, 238, 26, 85, 137,
  77. 146, 119, 58, 76, 194, 151, 239, 204, 104, 18, 166, 208, 54, 114, 118, 181, 24, 252, 41, 246, 88 },
  78. // 婚纱座席版;
  79. { 109, 0, 128, 13, 164, 143, 252, 87, 30, 48, 20, 21, 145, 114, 160, 96, 49, 127, 181, 32, 144, 213, 109, 99, 142, 219, 71, 26, 22, 220, 177,
  80. 179, 191, 82, 138, 45, 173, 160, 9, 83, 162, 106, 182, 175, 47, 92, 214, 78, 93, 21, 202, 165, 167, 200, 198, 172, 218, 74, 236, 194, 194, 228,
  81. 40, 27, 95, 60, 160, 173, 66, 185, 178, 7, 159, 220, 58, 71, 140, 19, 20, 37, 66, 84, 20, 21, 145, 114, 160, 96, 49, 127, 181, 32, 144,
  82. 213, 109, 99, 142, 219, 71, 26, 22, 220, 177, 179, 191, 82, 232, 182, 45, 27, 13, 195, 225, 204 },
  83. // 婚纱企业版;
  84. { 109, 0, 94, 220, 40, 182, 30, 120, 56, 193, 78, 101, 1, 144, 68, 206, 192, 52, 67, 9, 243, 20, 9, 195, 153, 15, 22, 217, 243, 79, 177,
  85. 22, 24, 171, 185, 157, 172, 67, 117, 124, 153, 165, 3, 41, 218, 47, 149, 150, 48, 152, 75, 250, 204, 253, 92, 53, 121, 147, 242, 140, 80, 66,
  86. 34, 194, 16, 109, 237, 17, 222, 161, 96, 8, 11, 194, 58, 45, 86, 15, 207, 121, 247, 104, 78, 101, 1, 144, 68, 206, 192, 52, 67, 9, 243,
  87. 20, 9, 195, 153, 15, 22, 217, 243, 79, 177, 22, 24, 171, 122, 243, 190, 146, 77, 222, 208, 129 }
  88. };
  89. // endof---------------加密表达式加密后的数组----------------------;
  90. CONST YtError g_YtError[] = {
  91. {-1, _T("未找到返回结果变量\n")},
  92. {-2, _T("未找到 = 符号\n")},
  93. {-3, _T("代表没有找到相应常数\n")},
  94. //{-4, _T("未找到返回结果变量\n")},
  95. {-5, _T("代表找不到字符串的第一个双引号\n")},
  96. {-6, _T("代表找不到字符串的第二个双引号\n")},
  97. {-7, _T("IF语句没有找到goto字符\n")},
  98. {-8, _T("IF语句没有找到第一个比较字符\n")},
  99. {-9, _T("IF语句没有找到比较符号\n")},
  100. {-10, _T("两边变量类型不相符\n")},
  101. {-11, _T("没有找到NOT符号\n")},
  102. {-12, _T("不是整形变量\n")},
  103. {-13, _T("代表没有找到相应整形常数\n")},
  104. {-14, _T("代表没有找到相应字符串常数\n")},
  105. {-15, _T("代表没有找到相应浮点常数\n")},
  106. {-16, _T("代表不支持这个运算\n")},
  107. {-17, _T("代表没有左边括号\n")},
  108. {-18, _T("代表没有变量\n")},
  109. {-19, _T("代表没“,”\n")},
  110. {-20, _T("代表没有右边括号\n")},
  111. {-21, _T("代表常数超过指这定的范围\n")},
  112. {-22, _T("代表储存器的地址超过指定的范围,整数不能超过EEPROM_LEN-4,浮点不能超过EEPROM_LEN-8\n")},
  113. {-23, _T("代表储存器的地址超过指定的范围,字符串不能超过EEPROM_LEN-LEN,其中LEN为字符串的长度\n")},
  114. {-24, _T("除法中,被除数不能为0\n")},
  115. {-25, _T("未知错误\n")},
  116. {-26, _T("第二个变量不在指定的位置\n")},
  117. {-27, _T("字符串常量超过指定的长度\n")},
  118. {-28, _T("不是字符串变量\n")},
  119. {-29, _T("没有第三个变量\n")},
  120. {-30, _T("GOTO的标识语句不能全为数字\n")},
  121. {-31, _T("不能打开ENC文件\n")},
  122. {-32, _T("不能读ENC文件\n")},
  123. {-33, _T("GOTO CALL不能找到指定的跳转位置\n")},
  124. {-34, _T("智能卡运算中,未知数据类型\n")},
  125. {-35, _T("智能卡运算中,未知代码类型\n")},
  126. {-36, _T("字符串长度超出50\n")},
  127. {-37, _T("操作时超长,负长\n")},
  128. {-38, _T("标识重复\n")},
  129. {-39, _T("程序堆栈溢出\n")},
  130. {-40, _T("堆栈溢出\n")},
  131. {-41, _T("不能建立编译文件,请查看文件是否有只读属性,或被其它文件打开\n")},
  132. {-42, _T("不能写文件,请查看文件是否有只读属性,或被其它文件打开\n")},
  133. {-43, _T("程序被中途使用END语句结束\n")},
  134. {-44, _T("程序跳转到外部的空间\n")},
  135. {-45, _T("传送数据失败\n")},
  136. {-46, _T("程序超出运算次数,可能是死循环\n")},
  137. {-47, _T("写密码不正确\n")},
  138. {-48, _T("读密码不正确\n")},
  139. {-49, _T("读写EEPROM时,地址溢出\n")},
  140. {-50, _T("USB操作失败,可能是没有找到相关的指令\n")},
  141. {-51, _T("打开USB文件句柄失败\n")},
  142. {-52, _T("使用加密锁加密自定义表达式,生成加密代码时生产错误\n")},
  143. {-53, _T("无法打开usb设备,可能驱动程序没有安装或没有插入加密锁\n")},
  144. //{-54, _T("未找到返回结果变量\n")},
  145. {-55, _T("要加密的数据少于8个字节\n")},
  146. {-56, _T("返回结果变量错误\n")},
  147. {-57, _T("初始化密钥错误\n")},
  148. {-58, _T("e密钥或n模不能为0\n")},
  149. {-59, _T("初始化MD5错误\n")},
  150. {-60, _T("MD5运算错误\n")},
  151. {-61, _T("计算MD5结果时错误\n")},
  152. {-62, _T("授权次数溢出,不能再进行授权\n")},
  153. {-63, _T("不能打开指定的文件\n")},
  154. {-64, _T("不能建立指定的文件\n")},
  155. {-65, _T("验证码错误,可能是输入解密密钥错误,或注册授权码错误\n")},
  156. {-66, _T("执行TIMEOUT函数时,输入的ID与锁ID不相符\n")},
  157. {-67, _T("执行TIMEOUT函数时,智能卡运行函数已到期\n")},
  158. {-68, _T("操作浮点运算时,输入的参数将会导致返回值是一个无穷值\n")},
  159. {-69, _T("代表没足够的变量参数\n")},
  160. {-70, _T("返回变量与函数不相符\n")},
  161. {-71, _T("浮点数转换字符串时,要转换的数据太大\n")},
  162. {-72, _T("初始化服务器错误\n")},
  163. {-73, _T("对缓冲区进行MD5运算时错误\n")},
  164. {-74, _T("MD5验证IPVAR错误\n")},
  165. {-75, _T("MD5验证IPCount错误\n")},
  166. {-76, _T("没有找到对应的SOCKET连接\n")},
  167. {-77, _T("没有找到要删除的对应的SOCKET连接\n")},
  168. {-78, _T("没有找到要删除的对应的功能模块号连接\n")},
  169. {-79, _T("没有找到要增加的对应的功能模块号连接\n")},
  170. {-80, _T("用户数已超过限制的授权数量\n")},
  171. {-81, _T("找不到对应的INI文件条目\n")},
  172. {-82, _T("没有进行初始化服务工作\n")},
  173. {-83, _T("ref不能应用于常数\n")},
  174. {-84, _T("代表使用scall,ccall等指令时,传递的参数太多\n")},
  175. {-85, _T("表示调用scall,ccall,sloadlib,cloadlib等指令时,不能返回运行代码\n")},
  176. {-86, _T("表示调用scall,ccall,sloadlib,cloadlib等指令时,不能将结果变量返回\n")},
  177. {-87, _T("表示调用外部DLL时,不能读取指定的DLL\n")},
  178. {-88, _T("表示调用外部DLL时,不能获取对应函数所在的地址\n")},
  179. //{-89, _T("未找到返回结果变量\n")},
  180. //////////////////////////////////////////////////////////////////////////
  181. {-252, _T("密码不正确\n")},
  182. {-253, _T("打开加密锁时PIN码错误\n")},
  183. {-254, _T("设置PIN码错误\n")},
  184. {-255, _T("操作加密锁时没有进行PIN操作\n")},
  185. //////////////////////////////////////////////////////////////////////////
  186. {-1052, _T("可能是输入的授权号不正确\n")},
  187. {-1053, _T("系统上没有任何智能锁\n")},
  188. {-1088, _T("发送数据错误\n")},
  189. {-1089, _T("获取数据错误\n")},
  190. {-1092, _T("找不到对应的服务端操作码\n")},
  191. {-1093, _T("表示连接服务时错误\n")},
  192. {-1095, _T("获取主机名称失败\n")},
  193. {-1097, _T("建立套字接错误\n")},
  194. {-1098, _T("绑定套字节端口错误\n")},
  195. {-1099, _T("表示无效连接,不能进行相关的操作\n")},
  196. {-2002, _T("表示监听时产生错误\n")},
  197. {-2003, _T("表示发送的数据长度与接收的数据长度不相符\n")},
  198. {-2005, _T("表示当前服务不存在任何连接\n")},
  199. {-2006, _T("表示当前查询节点超出集合范范围\n")},
  200. {-2009, _T("表示关闭连接错误\n")},
  201. //////////////////////////////////////////////////////////////////////////
  202. {-10000,_T("未知错误代码\n")}
  203. };
  204. CHAR g_szKeyPath[MAX_PATH] = {0};
  205. void ReSetPassWord()
  206. {
  207. if ( !g_bUSE_NEWPASSWORD )
  208. {
  209. g_pHReadPassWord = g_szPassword[0][0];
  210. g_pLReadPassWord = g_szPassword[0][1];
  211. g_pHWritePassWord = g_szPassword[1][0];
  212. g_pLWritePassWord = g_szPassword[1][1];
  213. }
  214. else
  215. {
  216. g_pHReadPassWord = g_szPassword[2][0];
  217. g_pLReadPassWord = g_szPassword[2][1];
  218. g_pHWritePassWord = g_szPassword[3][0];
  219. g_pLWritePassWord = g_szPassword[3][1];
  220. }
  221. }
  222. BOOL ReadYtInfoVer1(IN CONST INT &nUSBStartPos, OUT YtInfoVer1 &Infover1, OUT INT &nUSBPort, OUT CHAR* pszKeyPath, IN CONST INT &nKeypath)
  223. {
  224. INT nRetval = 0;
  225. INT nVal[8] = { 0 };
  226. DOUBLE fVal[8] = { 0.0 };
  227. CHAR s0[50] = "", s1[50] = "", s2[50] = "", s3[50] = "", s4[50] = "", s5[50] = "", s6[50] = "", s7[50] = "";
  228. BOOL bFind = FALSE;
  229. CHAR szKeyPath[MAX_PATH] = "";
  230. for (INT nIndex = nUSBStartPos; nIndex < 256; nIndex++)
  231. {
  232. memset(szKeyPath, 0, sizeof(szKeyPath));
  233. nRetval = FindPort(nIndex, szKeyPath);
  234. if (nRetval != 0 && nIndex == 0)
  235. {
  236. GetYtUSBKey32ErrInfo(nRetval);
  237. continue;
  238. }
  239. if (nRetval != 0)
  240. {
  241. GetYtUSBKey32ErrInfo(nRetval);
  242. continue;
  243. }
  244. for (int i = 0; i < 6; i++)
  245. {
  246. // 使用该设备路径锁进行运算;
  247. nRetval = CalEx(g_byShotVersion[i], 10,
  248. &nVal[0], &nVal[1], &nVal[2], &nVal[3], &nVal[4], &nVal[5], &nVal[6], &nVal[7],
  249. &fVal[0], &fVal[1], &fVal[2], &fVal[3], &fVal[4], &fVal[5], &fVal[6], &fVal[7],
  250. s0, s1, s2, s3, s4, s5, s6, s7, szKeyPath, 20000);
  251. //如果正确,则返回该设备路径供以后使用;
  252. if (nRetval == -63) continue;
  253. if ((nRetval == 0) && (nVal[0] == 123))
  254. {
  255. nUSBPort = nIndex;
  256. if (pszKeyPath)
  257. sprintf_s(pszKeyPath, nKeypath, "%s",szKeyPath);
  258. bFind = TRUE;
  259. Infover1.nSoftVer = i;
  260. // 获取加密锁座席数量;
  261. if ( (nRetval = YtReadString(Infover1.szCCount, 264, ENCRYPT_BLOCK_LEN, g_pHReadPassWord, g_pLReadPassWord, szKeyPath)) != 0 )
  262. GetYtUSBKey32ErrInfo(nRetval);
  263. // 获取加密锁域名值;
  264. if ( (nRetval = YtReadString(Infover1.szBranchId, 297, ENCRYPT_BLOCK_LEN, g_pHReadPassWord, g_pLReadPassWord, szKeyPath)) != 0)
  265. GetYtUSBKey32ErrInfo(nRetval);
  266. // 获取医院跟踪系统;
  267. if ( (nRetval = YtReadString(Infover1.szHospital, 330, ENCRYPT_BLOCK_LEN, g_pHReadPassWord, g_pLReadPassWord, szKeyPath)) != 0)
  268. GetYtUSBKey32ErrInfo(nRetval);
  269. // 返回加密锁已运行时间;
  270. if ( (nRetval = GetRunTimer(Infover1.szHasRunyears, Infover1.szHasRunmonths, Infover1.szHasRundays, Infover1.szHasRunhours, Infover1.szHasRunminutes, Infover1.szHasRunseconds, szKeyPath)) != 0)
  271. GetYtUSBKey32ErrInfo(nRetval);
  272. // 返回加密锁可运行时间;
  273. DWORD dwShortID = 0; // 锁短ID;
  274. CHAR szOutString[100] = {0};
  275. CHAR HKey[50] = {0}, LKey[50] = {0};
  276. // 30000以后的储存空间为公共区域;
  277. if ( (nRetval = ReadTimeAuthFromEprom(HKey, LKey, szOutString, &dwShortID, 30128, "FFFFFFFF", "FFFFFFFF", szKeyPath)) != 0)
  278. GetYtUSBKey32ErrInfo(nRetval);
  279. std::string str = szOutString;
  280. int nStrPos = str.find("年");
  281. if ( nStrPos != std::string::npos )
  282. {
  283. sprintf_s(Infover1.szCanRunyears, "%s", str.substr(0,nStrPos).c_str());
  284. str = str.substr(nStrPos + strlen("年"));
  285. nStrPos = str.find("月");
  286. sprintf_s(Infover1.szCanRunmonths, "%s", str.substr(0,nStrPos).c_str());
  287. str = str.substr(nStrPos + strlen("月"));
  288. nStrPos = str.find("日");
  289. sprintf_s(Infover1.szCanRundays, "%s", str.substr(0,nStrPos).c_str());
  290. str = str.substr(nStrPos + strlen("日"));
  291. nStrPos = str.find("小时");
  292. sprintf_s(Infover1.szCanRunhours, "%s", str.substr(0,nStrPos).c_str());
  293. str = str.substr(nStrPos + strlen("小时"));
  294. nStrPos = str.find("分钟");
  295. sprintf_s(Infover1.szCanRunminutes, "%s", str.substr(0,nStrPos).c_str());
  296. //str = str.substr(nStrPos + strlen("分钟"));
  297. }
  298. break;
  299. }
  300. }
  301. if (bFind) break;
  302. }
  303. return bFind;
  304. }
  305. BOOL ModifyYtVer1Info(IN CHAR* pszKeypath, IN YtInfoVer1 &Infover1, IN CONST INT &nModifyType)
  306. {
  307. // 修改类型有:加减运行时间、加减座席数量、开通或关闭医院功能。
  308. switch(nModifyType)
  309. {
  310. case VER1_ADDCCOUNT:
  311. break;
  312. case VER1_MINUSCCOUNT:
  313. break;
  314. case VER1_HOSPITAL:
  315. break;
  316. case VER1_ADDTIME:
  317. break;
  318. case VER1_MINUSTIME:
  319. break;
  320. default:
  321. break;
  322. }
  323. return TRUE;
  324. }
  325. /************************************************************************/
  326. /*
  327. 函数:ClearEncryptlockInfo
  328. 描述:清空加密所有加密信息;
  329. 参数:
  330. [IN] nStartUSBPort 加密狗起始USB搜索位置;
  331. 返回:清除成功返回TRUE;
  332. */
  333. /************************************************************************/
  334. BOOL ClearEncryptlockInfo(IN const int &nStartUSBPort)
  335. {
  336. int nRet = 0;
  337. int nVersion = -1; // 锁版本;
  338. DWORD dwShortKey = 0; // 锁短ID;
  339. CHAR szKeyPath[MAX_PATH] = { 0 }; // USB锁物理位置;
  340. // 从nStartUSBPort的USB的位置开始查找加密锁;
  341. if (0 != FindPort(nStartUSBPort, szKeyPath))
  342. {
  343. // 返回非0表示失败;
  344. return FALSE;
  345. }
  346. // 返回锁的短ID及版本号;
  347. if (0 != GetIDVersion(&dwShortKey, &nVersion, szKeyPath))
  348. {
  349. // 返回非0表示失败;
  350. return FALSE;
  351. }
  352. if (dwShortKey == -1)
  353. {
  354. // 不是域天智能锁;
  355. return FALSE;
  356. }
  357. // 清空所有版本锁的rom空间地内容;
  358. CHAR szRom[ENCRYPT_BLOCK_LEN] = { 0 }; // 包含结束符;
  359. for (int i = 0; i < 11; i++)
  360. {
  361. nRet = YtWriteString(szRom, i * 33, g_pHWritePassWord, g_pLWritePassWord, szKeyPath);
  362. if (nRet <= 0)
  363. {
  364. // 执行失败;
  365. GetYtUSBKey32ErrInfo(nRet);
  366. }
  367. }
  368. // 清除写密码;
  369. nRet = SetWritePassword(g_pHWritePassWord, g_pLWritePassWord, "FFFFFFFF", "FFFFFFFF", szKeyPath);
  370. if ( nRet != 0)
  371. {
  372. // 执行失败;
  373. GetYtUSBKey32ErrInfo(nRet);
  374. AfxMessageBox(_T("清除写密码失败"));
  375. //return FALSE;
  376. }
  377. // 清除读密码;//设置读密码,必须用写密码;
  378. if ((nRet = SetReadPassword("FFFFFFFF", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", szKeyPath)) != 0)
  379. {
  380. // 执行失败;
  381. GetYtUSBKey32ErrInfo(nRet);
  382. AfxMessageBox(_T("清除读密码失败"));
  383. //return FALSE;
  384. }
  385. // 清空所有版本锁的加密解密的密钥;
  386. BOOL bErased = FALSE;
  387. for (int i = 0; i < 6; i++)
  388. {
  389. if (0 == ( nRet = WriteEncKey(g_szEncKey[i][0], g_szEncKey[i][1], g_szEncKey[i][2], g_szEncKey[i][3], "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", szKeyPath)))
  390. {
  391. bErased = TRUE;
  392. break;
  393. }
  394. else
  395. {
  396. GetYtUSBKey32ErrInfo(nRet);
  397. }
  398. }
  399. if (!bErased)
  400. {
  401. AfxMessageBox(_T("清除加密锁失败,该锁可能已经清除过~"));
  402. }
  403. return TRUE;
  404. }
  405. BOOL FindYtUSB(OUT DWORD &dwShortKey, OUT INT &nVersion, OUT CHAR *pszKeyPath, IN CONST INT &nStartPort)
  406. {
  407. // 从nStartPort的USB的位置开始查找加密锁;
  408. if (0 != FindPort(nStartPort, pszKeyPath))
  409. return FALSE;
  410. // 返回锁的短ID及版本号;
  411. if (0 != GetIDVersion(&dwShortKey, &nVersion, pszKeyPath))
  412. return FALSE;
  413. return TRUE;
  414. }
  415. //////////////////////////////////////////////////////////////////////////
  416. /*
  417. 函数:CreateEncryptlockInfo
  418. 描述:生成指定版本的加密锁;
  419. 参数:
  420. IN: nStartPort 起始USB搜索位置;
  421. IN: nSoftVer 指定生成的加密狗版本信息;
  422. IN: nCCount 座席版连接数量;
  423. IN: bHospital 是否注册医院跟踪系统功能 ;
  424. IN: bAdddate 授权时间是否追加生成;
  425. IN: szRunyears
  426. IN: szRunmonths
  427. IN: szRundays
  428. IN: szRunhours
  429. IN: szRunminutes
  430. OUT: lpHasRundate 返回锁已运行时间;
  431. OUT: lpCouldRundate 返回锁授权时间;
  432. 返回:
  433. */
  434. //////////////////////////////////////////////////////////////////////////
  435. BOOL CreateEncryptlockInfo(IN CONST INT &nStartPort,IN EncryptlockInfo &linfo,OUT LPTSTR lpHasRundate,IN CONST size_t &sizeOfhasrundate,OUT LPTSTR lpCouldRundate,IN CONST size_t &sizeOfcouldrundate, IN BOOL bfixedId /*= FALSE*/ )
  436. {
  437. int nRet = -1;
  438. DWORD dwShortKey = 0;
  439. int nVersion = -1;
  440. CHAR szKeyPath[MAX_PATH] = { 0 };
  441. if (!FindYtUSB(dwShortKey, nVersion, szKeyPath, nStartPort))
  442. return FALSE;
  443. if (dwShortKey == -1)
  444. {
  445. // 不是域天智能锁;
  446. return FALSE;
  447. }
  448. nRet = SetReadPassword("FFFFFFFF", "FFFFFFFF", g_pHReadPassWord, g_pLReadPassWord, szKeyPath);
  449. if (nRet != 0) {
  450. GetYtUSBKey32ErrInfo(nRet);
  451. AfxMessageBox(_T("设置读密码失败"));
  452. }
  453. nRet = SetWritePassword("FFFFFFFF", "FFFFFFFF", g_pHWritePassWord, g_pLWritePassWord, szKeyPath);
  454. if (nRet != 0) {
  455. GetYtUSBKey32ErrInfo(nRet);
  456. AfxMessageBox(_T("设置写密码失败"));
  457. }
  458. // 从地址0~231+32,是所有加密锁共同内容;
  459. for (int i = 0; i < 8; i++)
  460. {
  461. if ((nRet = YtWriteString(g_szRom[i], i * 33, g_pHWritePassWord, g_pLWritePassWord, szKeyPath)) <= 0)
  462. {
  463. // 写区域错误;
  464. GetYtUSBKey32ErrInfo(nRet);
  465. }
  466. }
  467. // 264是座席数量;
  468. if (linfo.nCCount != 0)
  469. {
  470. CHAR szCCount[ENCRYPT_BLOCK_LEN] = { 0 }; // 包含结束符;
  471. sprintf_s(szCCount, "%d", linfo.nCCount);
  472. if ((nRet = YtWriteString(szCCount, 264, g_pHWritePassWord, g_pLWritePassWord, szKeyPath)) <= 0 )
  473. {
  474. // 设置座席数失败;
  475. GetYtUSBKey32ErrInfo(nRet);
  476. return FALSE;
  477. }
  478. }
  479. // 297是域名值;
  480. // 生成域名串 = 日期 + 短ID;
  481. CHAR szDomain[ENCRYPT_BLOCK_LEN] = { 0 }; // 包含结束符;
  482. if ( bfixedId )
  483. {
  484. sprintf_s(szDomain, "20151208000000%d.ly.com", dwShortKey);
  485. }
  486. else
  487. {
  488. CTime tt = CTime::GetCurrentTime();
  489. sprintf_s(szDomain, "%04d%02d%02d%02d%02d%02d%d.ly.com", tt.GetYear(), tt.GetMonth(), tt.GetDay(), tt.GetHour(), tt.GetMinute(), tt.GetSecond(), dwShortKey);
  490. }
  491. if ( ( nRet = YtWriteString(szDomain, 297, g_pHWritePassWord, g_pLWritePassWord, szKeyPath)) <= 0)
  492. {
  493. // 生成域名错误;
  494. GetYtUSBKey32ErrInfo(nRet);
  495. return FALSE;
  496. }
  497. // 330是医院跟踪系统;
  498. if (linfo.bHospital)
  499. {
  500. CHAR szHospital[ENCRYPT_BLOCK_LEN] = { 0 }; // 包含结束符;
  501. sprintf_s(szHospital, "%d", linfo.bHospital);
  502. if ( ( nRet = YtWriteString(szHospital, 330, g_pHWritePassWord, g_pLWritePassWord, szKeyPath)) <= 0 )
  503. {
  504. // 设置医院跟踪系统失败;
  505. GetYtUSBKey32ErrInfo(nRet);
  506. return FALSE;
  507. }
  508. }
  509. // 生成指定软件版本加密解密密钥;
  510. switch (linfo.nSoftVer)
  511. {
  512. case EN_OCHILD:
  513. nRet = WriteEncKey("FFFFFFFF", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", g_szEncKey[EN_OCHILD][0], g_szEncKey[EN_OCHILD][1], g_szEncKey[EN_OCHILD][2], g_szEncKey[EN_OCHILD][3], szKeyPath);
  514. break;
  515. case EN_LCHILD:
  516. nRet = WriteEncKey("FFFFFFFF", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", g_szEncKey[EN_LCHILD][0], g_szEncKey[EN_LCHILD][1], g_szEncKey[EN_LCHILD][2], g_szEncKey[EN_LCHILD][3], szKeyPath);
  517. break;
  518. case EN_ECHILD:
  519. nRet = WriteEncKey("FFFFFFFF", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", g_szEncKey[EN_ECHILD][0], g_szEncKey[EN_ECHILD][1], g_szEncKey[EN_ECHILD][2], g_szEncKey[EN_ECHILD][3], szKeyPath);
  520. break;
  521. case EN_OWDDING:
  522. nRet = WriteEncKey("FFFFFFFF", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", g_szEncKey[EN_OWDDING][0], g_szEncKey[EN_OWDDING][1], g_szEncKey[EN_OWDDING][2], g_szEncKey[EN_OWDDING][3], szKeyPath);
  523. break;
  524. case EN_LWDDING:
  525. nRet = WriteEncKey("FFFFFFFF", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", g_szEncKey[EN_LWDDING][0], g_szEncKey[EN_LWDDING][1], g_szEncKey[EN_LWDDING][2], g_szEncKey[EN_LWDDING][3], szKeyPath);
  526. break;
  527. case EN_EWDDING:
  528. nRet = WriteEncKey("FFFFFFFF", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF", g_szEncKey[EN_EWDDING][0], g_szEncKey[EN_EWDDING][1], g_szEncKey[EN_EWDDING][2], g_szEncKey[EN_EWDDING][3], szKeyPath);
  529. break;
  530. }
  531. if (nRet != 0)
  532. {
  533. // 生成密钥失败;
  534. GetYtUSBKey32ErrInfo(nRet);
  535. return FALSE;
  536. }
  537. //////////////////////////////////////////////////////////////////////////
  538. // 授权时间码;
  539. CHAR szyear[10] = { 0 }, szmonth[10] = { 0 }, szday[10] = { 0 }, szhour[10] = { 0 }, szminute[10] = { 0 }, szsecond[10] = { 0 };
  540. if ( ( nRet = GetRunTimer(szyear, szmonth, szday, szhour, szminute, szsecond, szKeyPath)) != 0 )
  541. {
  542. // 获取运行时间失败;
  543. GetYtUSBKey32ErrInfo(nRet);
  544. return FALSE;
  545. }
  546. _stprintf_s(lpHasRundate, sizeOfhasrundate, _T("已运行 %s年%s月%s天%s时%s分"), szyear, szmonth, szday, szhour, szminute);
  547. if (linfo.bAdddate) // 追加时间;
  548. {
  549. sprintf_s(szyear, "%d", atoi(linfo.szRunyears) + atoi(szyear));
  550. sprintf_s(szmonth, "%d", atoi(linfo.szRunmonths) + atoi(szmonth));
  551. sprintf_s(szday, "%d", atoi(linfo.szRundays) + atoi(szday));
  552. sprintf_s(szhour, "%d", atoi(linfo.szRunhours) + atoi(szday));
  553. sprintf_s(szminute, "%d", atoi(linfo.szRunminutes) + atoi(szminute));
  554. }
  555. else
  556. {
  557. sprintf_s(szyear, "%s", linfo.szRunyears);
  558. sprintf_s(szmonth, "%s", linfo.szRunmonths);
  559. sprintf_s(szday, "%s", linfo.szRundays);
  560. sprintf_s(szhour, "%s", linfo.szRunhours);
  561. sprintf_s(szminute, "%s", linfo.szRunminutes);
  562. }
  563. // 生成时间授权码;
  564. CHAR szOutString[100] = { 0 }; // 返回的时间授权码;
  565. if (( nRet = MakeTimerAuth(g_szUserKey, dwShortKey, szyear, szmonth, szday, szhour, szminute, szOutString, szKeyPath)) != 0)
  566. {
  567. // 生成时间授权码失败;
  568. GetYtUSBKey32ErrInfo(nRet);
  569. return FALSE;
  570. }
  571. CHAR HKey[9] = "FFFFFFFF", LKey[9] = "FFFFFFFF";
  572. CHAR WHKey[41] = "0", WLKey[41] = "0";
  573. memcpy(WHKey, szOutString, 40);
  574. memcpy(WLKey, &szOutString[40], 40);
  575. // 写授权时间到加密锁中;
  576. if ((nRet = WriteTimeAuthToEprom(30128, HKey, LKey, WHKey, WLKey, dwShortKey, szyear, szmonth, szday, szhour, szminute, szKeyPath)) != 0 )
  577. {
  578. // 写授权时间失败;
  579. GetYtUSBKey32ErrInfo(nRet);
  580. return FALSE;
  581. }
  582. DWORD dwID;
  583. // 30000以后的储存空间为公共区域;
  584. if ( ( nRet = ReadTimeAuthFromEprom(WHKey, WLKey, szOutString, &dwID, 30128, "FFFFFFFF", "FFFFFFFF", szKeyPath)) == 0 )
  585. {
  586. #ifdef UNICODE
  587. WCHAR *pOutString = ascii2unicode(szOutString);
  588. _stprintf_s(lpCouldRundate, sizeOfcouldrundate, _T("%s"), pOutString);
  589. delete pOutString;
  590. pOutString = NULL;
  591. #else
  592. _stprintf_s(lpCouldRundate, sizeOfcouldrundate, _T("%s"), szOutString);
  593. #endif
  594. }
  595. else
  596. {
  597. GetYtUSBKey32ErrInfo(nRet);
  598. }
  599. return TRUE;
  600. }
  601. //////////////////////////////////////////////////////////////////////////
  602. // 应用接口;
  603. BOOL GetFirstYtUSBSoftVer(IN INT &nSoftVer, IN CHAR *pBranchIdBuffer, IN size_t sizeOfBranchIdBuffer, IN CONST INT &nUSBStartPos /* = 0 */)
  604. {
  605. INT nRetval = 0;
  606. INT nVal[8] = { 0 };
  607. DOUBLE fVal[8] = { 0.0 };
  608. CHAR s0[50] = "", s1[50] = "", s2[50] = "", s3[50] = "", s4[50] = "", s5[50] = "", s6[50] = "", s7[50] = "";
  609. BOOL bFind = FALSE;
  610. CHAR szKeyPath[MAX_PATH] = "";
  611. for (INT nIndex = nUSBStartPos; nIndex < 256; nIndex++)
  612. {
  613. memset(szKeyPath, 0, sizeof(szKeyPath));
  614. nRetval = FindPort(nIndex, szKeyPath);
  615. if (nRetval != 0 && nIndex == 0) continue;
  616. if (nRetval != 0) continue;
  617. for (int i = 0; i < 6; i++)
  618. {
  619. // 使用该设备路径锁进行运算;
  620. nRetval = CalEx(g_byShotVersion[i], 10,
  621. &nVal[0], &nVal[1], &nVal[2], &nVal[3], &nVal[4], &nVal[5], &nVal[6], &nVal[7],
  622. &fVal[0], &fVal[1], &fVal[2], &fVal[3], &fVal[4], &fVal[5], &fVal[6], &fVal[7],
  623. s0, s1, s2, s3, s4, s5, s6, s7, szKeyPath, 20000);
  624. //如果正确,则返回该设备路径供以后使用;
  625. if (nRetval == -63) continue;
  626. if ((nRetval == 0) && (nVal[0] == 123))
  627. {
  628. bFind = TRUE;
  629. nSoftVer = i;
  630. sprintf_s(pBranchIdBuffer, sizeOfBranchIdBuffer, "%s", s0);
  631. break;
  632. }
  633. }
  634. if (bFind) break;
  635. }
  636. return bFind;
  637. }
  638. CONST TCHAR* GetYtUSBKey32ErrInfo(IN const long lError)
  639. {
  640. INT nIndex = -1;
  641. TCHAR *pErrorDescription = NULL;
  642. while ( g_YtError[++nIndex].nErrorCode != -10000 )
  643. {
  644. if ( lError == g_YtError[nIndex].nErrorCode )
  645. {
  646. pErrorDescription = g_YtError[nIndex].pErrorDescription;
  647. break;
  648. }
  649. }
  650. if ( pErrorDescription == NULL )
  651. pErrorDescription = _T("未知错误!\n");
  652. OutputDebugString(pErrorDescription);
  653. return pErrorDescription;
  654. }
  655. };