Advertisement
Guest User

AccountingServerEmulator source

a guest
Sep 29th, 2015
884
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 497.25 KB | None | 0 0
  1. /* This file has been generated by the Hex-Rays decompiler.
  2.    Copyright (c) 2007-2011 Hex-Rays <info@hex-rays.com>
  3.  
  4.    Detected compiler: Visual C++
  5. */
  6.  
  7. #include <windows.h>
  8. #include <defs.h>
  9.  
  10.  
  11. //-------------------------------------------------------------------------
  12. // Data declarations
  13.  
  14. extern char aLtc_mp_nameNul[20]; // weak
  15. extern char aKeyNull[12]; // weak
  16. extern char aInNull[11]; // weak
  17. extern char aCCrDocLibsLibt[51]; // weak
  18. extern int dword_430060[]; // weak
  19. extern int dword_430064[]; // weak
  20. extern char *off_430078; // weak
  21. extern char aANull[10]; // weak
  22. extern char aCCrDocLibsLi_0[64]; // weak
  23. extern char aAVoid0[17]; // weak
  24. extern char aBNull[10]; // weak
  25. extern char aCNull[10]; // weak
  26. extern char aDNull[10]; // weak
  27. extern char aCipherNull[15]; // weak
  28. extern char aCCrDocLibsLi_1[68]; // weak
  29. extern char aCtrNull[12]; // weak
  30. extern char aCtNull[11]; // weak
  31. extern char aPtNull[11]; // weak
  32. extern char aCCrDocLibsLi_2[55]; // weak
  33. extern char aCCrDocLibsLi_3[55]; // weak
  34. extern char aIvNull[11]; // weak
  35. extern char aCCrDocLibsLi_4[53]; // weak
  36. extern char aNameNull[13]; // weak
  37. extern char aCCrDocLibsLi_5[62]; // weak
  38. extern char aCCrDocLibsLi_6[66]; // weak
  39. extern char *cipherDescriptor; // weak
  40. extern int dword_430450[]; // weak
  41. extern int dword_430C50[]; // weak
  42. extern int dword_431050[]; // weak
  43. extern int dword_431450[]; // weak
  44. extern int dword_431850[]; // weak
  45. extern int dword_431C50[]; // weak
  46. extern int dword_432050[]; // weak
  47. extern int dword_432450[]; // weak
  48. extern int dword_432850[]; // weak
  49. extern int dword_432C50[]; // weak
  50. extern int dword_433050[]; // weak
  51. extern int dword_433450[]; // weak
  52. extern int dword_433850[]; // weak
  53. extern int dword_433C50[]; // weak
  54. extern int dword_434050[]; // weak
  55. extern int dword_434450[]; // weak
  56. extern int dword_434850[]; // weak
  57. extern int dword_434C50[]; // weak
  58. extern int dword_434C78[]; // weak
  59. extern _UNKNOWN unk_434C7C; // weak
  60. extern _UNKNOWN unk_434C9C; // weak
  61. extern _UNKNOWN unk_434CAC; // weak
  62. extern char aSkeyNull[13]; // weak
  63. extern char aCCrDocLibsLi_7[49]; // weak
  64. extern char aKeysizeNull[16]; // weak
  65. extern char aHashNull[13]; // weak
  66. extern char aCCrDocLibsLi_8[66]; // weak
  67. extern char aOutlenNull[15]; // weak
  68. extern char aOutNull[12]; // weak
  69. extern char aCCrDocLibsLi_9[56]; // weak
  70. extern char aCCrDocLibsL_10[60]; // weak
  71. extern char aCCrDocLibsL_11[64]; // weak
  72. extern char *hashDescriptor; // weak
  73. extern char *off_4351A8; // weak
  74. extern _UNKNOWN unk_4351AC; // weak
  75. extern char *off_435298; // weak
  76. extern _UNKNOWN unk_43529C; // weak
  77. extern char aMdNull[11]; // weak
  78. extern char aCCrDocLibsL_12[52]; // weak
  79. extern char aCCrDocLibsL_13[52]; // weak
  80. extern int dword_4353F8[]; // weak
  81. extern char aCCrDocLibsL_14[80]; // weak
  82. extern char aLtc_argchkSFai[]; // idb
  83. extern char aCCrDocLibsL_15[52]; // weak
  84. extern char aCCrDocLibsL_16[53]; // weak
  85. extern char aModulusNull[16]; // weak
  86. extern char aKbNull[11]; // weak
  87. extern char aKaNull[11]; // weak
  88. extern char aCNull_0[10]; // weak
  89. extern char aBNull_0[10]; // weak
  90. extern char aANull_0[10]; // weak
  91. extern char aCCrDocLibsL_17[56]; // weak
  92. extern char aMpNull[11]; // weak
  93. extern char aPNull[10]; // weak
  94. extern char aCCrDocLibsL_18[52]; // weak
  95. extern char aRNull[10]; // weak
  96. extern char aCCrDocLibsL_19[69]; // weak
  97. extern char aQNull[10]; // weak
  98. extern char aCCrDocLibsL_20[69]; // weak
  99. extern char aGNull[10]; // weak
  100. extern char aKNull[10]; // weak
  101. extern char aCCrDocLibsL_21[55]; // weak
  102. extern char aOutVoid0[19]; // weak
  103. extern char aCCrDocLibsL_22[46]; // weak
  104. extern char aCCrDocLibsL_23[59]; // weak
  105. extern char aKeyVoid0[19]; // weak
  106. extern char aCCrDocLibsL_24[49]; // weak
  107. extern char aPublic_keyNull[19]; // weak
  108. extern char aPrivate_keyNul[20]; // weak
  109. extern char aCCrDocLibsL_25[58]; // weak
  110. extern char aIdNull[11]; // weak
  111. extern char aCCrDocLibsL_26[64]; // weak
  112. extern char aListNull[13]; // weak
  113. extern char aCCrDocLibsL_27[77]; // weak
  114. extern char aNNull[10]; // weak
  115. extern char aCCrDocLibsL_28[49]; // weak
  116. extern char aInlenNull[14]; // weak
  117. extern char aCCrDocLibsL_29[70]; // weak
  118. extern char aCCrDocLibsL_30[74]; // weak
  119. extern char aCCrDocLibsL_31[72]; // weak
  120. extern char aCCrDocLibsL_32[73]; // weak
  121. extern char aCCrDocLibsL_33[73]; // weak
  122. extern int dword_4365C8[]; // weak
  123. extern int dword_4365CC[]; // weak
  124. extern char aOctetsNull[15]; // weak
  125. extern char aCCrDocLibsL_34[90]; // weak
  126. extern char aCCrDocLibsL_35[90]; // weak
  127. extern int dword_4368E0[]; // weak
  128. extern int dword_4368E4[]; // weak
  129. extern char aCCrDocLibsL_36[71]; // weak
  130. extern char aCCrDocLibsL_37[71]; // weak
  131. extern char aWordsNull[14]; // weak
  132. extern char aCCrDocLibsL_38[92]; // weak
  133. extern char aCCrDocLibsL_39[92]; // weak
  134. extern char aCCrDocLibsL_40[75]; // weak
  135. extern char aCCrDocLibsL_41[75]; // weak
  136. extern char aCCrDocLibsL_42[71]; // weak
  137. extern char aCCrDocLibsL_43[71]; // weak
  138. extern char aCCrDocLibsL_44[84]; // weak
  139. extern char aNumNull[12]; // weak
  140. extern char aCCrDocLibsL_45[84]; // weak
  141. extern char aCCrDocLibsL_46[72]; // weak
  142. extern char aCCrDocLibsL_47[72]; // weak
  143. extern char aCCrDocLibsL_48[72]; // weak
  144. extern char aCCrDocLibsL_49[72]; // weak
  145. extern char aUtctimeNull[16]; // weak
  146. extern char aCCrDocLibsL_50[72]; // weak
  147. extern char aS[]; // idb
  148. extern char aDbgheap_c[10]; // weak
  149. extern char a_crtcheckmemor[]; // idb
  150. extern char a_crtisvalidhea[]; // idb
  151. extern char a_pfirstblockPh[]; // idb
  152. extern char a_plastblockPhe[]; // idb
  153. extern char aPheadNblockuse[]; // idb
  154. extern char aPheadNlineIgno[]; // idb
  155. extern char aDamageAfterHsB[]; // idb
  156. extern char aDamageBeforeHs[]; // idb
  157. extern char a_block_type_is[]; // idb
  158. extern char aClientHookFree[27]; // weak
  159. extern char aHsLocatedAt0x0[]; // idb
  160. extern char aHsAllocatedAtF[]; // idb
  161. extern char aDamageOnTopOfF[]; // idb
  162. extern char aDamaged[8]; // weak
  163. extern char a_heapchkFail_3[43]; // weak
  164. extern char a_heapchkFail_2[34]; // weak
  165. extern char a_heapchkFail_1[34]; // weak
  166. extern char a_heapchkFail_0[35]; // weak
  167. extern char a_heapchkFailsW[36]; // weak
  168. extern char aI386Chkesp_c[14]; // weak
  169. extern char aTheValueOfEspW[]; // idb
  170. extern char Str1[]; // idb
  171. extern char Name[]; // idb
  172. extern int dword_4381A4[]; // weak
  173. extern _UNKNOWN unk_4381E4; // weak
  174. extern _UNKNOWN unk_4385E4; // weak
  175. extern _UNKNOWN serverKeyPtr; // weak
  176. extern char aAcceptFailedCo[]; // idb
  177. extern char aCanTListenCode[24]; // weak
  178. extern char aCanTBindSocket[29]; // weak
  179. extern char aCanTBuildSocke[30]; // weak
  180. extern char aErrorNetworkin[31]; // weak
  181. extern char aOhNoesCouldNot[]; // idb
  182. extern char aPDefineListeni[]; // idb
  183. extern char aSSilentModeNoL[]; // idb
  184. extern char aFFileDefineLog[]; // idb
  185. extern char a_HelpPrintThis[]; // idb
  186. extern char aCMesmerize2011[]; // idb
  187. extern char aTeamspeak3Acco[]; // idb
  188. extern char Format[]; // idb
  189. extern char aP[3]; // weak
  190. extern char aS_0[3]; // weak
  191. extern char asc_43BD04[3]; // weak
  192. extern char a_[3]; // weak
  193. extern char aHelp[7]; // weak
  194. extern char a_Ts3accservere[]; // idb
  195. extern char aEndClientHandl[25]; // weak
  196. extern char aThisMustBeTheL[75]; // weak
  197. extern char aItSAVserverChe[22]; // weak
  198. extern char aSendingServerR[34]; // weak
  199. extern char aThisMustBeTh_1[50]; // weak
  200. extern char aThisMustBeTh_0[57]; // weak
  201. extern char aSettingUpLocal[33]; // weak
  202. extern char asc_43BE98[]; // idb
  203. extern char aRijndael[]; // idb
  204. extern int dword_43BEA8; // weak
  205. extern char aKeyFromClientS[42]; // weak
  206. extern char aOhNoesCouldN_0[]; // idb
  207. extern char aSha512[]; // idb
  208. extern char aThisMustBeTheE[50]; // weak
  209. extern char aNotATs3ServerR[28]; // weak
  210. extern char aTs3c[5]; // weak
  211. extern char aThisMustBeTheH[49]; // weak
  212. extern char aReceivedClient[26]; // weak
  213. extern char aAwaitingPacket[31]; // weak
  214. extern char aMemoryAllocati[57]; // weak
  215. extern char aAllocatingMemo[38]; // weak
  216. extern char aServerKeyDataS[44]; // weak
  217. extern char aBeginClientHan[27]; // weak
  218. extern char Mode[2]; // idb
  219. extern char aSS[]; // idb
  220. extern __int16 word_43C0F8; // weak
  221. extern __int16 word_43C0FC; // weak
  222. extern __int16 word_43C100; // weak
  223. extern __int16 word_43C104; // weak
  224. extern __int16 word_43C108; // weak
  225. extern __int16 word_43C10C; // weak
  226. extern __int16 word_43C110; // weak
  227. extern __int16 word_43C114; // weak
  228. extern __int16 word_43C118; // weak
  229. extern __int16 word_43C11C; // weak
  230. extern __int16 word_43C120; // weak
  231. extern __int16 word_43C124; // weak
  232. extern __int16 word_43C128; // weak
  233. extern __int16 word_43C12C; // weak
  234. extern __int16 word_43C130; // weak
  235. extern __int16 word_43C134; // weak
  236. extern __int16 word_43C138; // weak
  237. extern __int16 word_43C13C; // weak
  238. extern __int16 word_43C140; // weak
  239. extern __int16 word_43C144; // weak
  240. extern __int16 word_43C148; // weak
  241. extern __int16 word_43C14C; // weak
  242. extern __int16 word_43C150; // weak
  243. extern __int16 word_43C154; // weak
  244. extern __int16 word_43C158; // weak
  245. extern __int16 word_43C15C; // weak
  246. extern __int16 word_43C160; // weak
  247. extern __int16 word_43C164; // weak
  248. extern __int16 word_43C168; // weak
  249. extern __int16 word_43C16C; // weak
  250. extern __int16 word_43C170; // weak
  251. extern __int16 word_43C174; // weak
  252. extern __int16 word_43C178; // weak
  253. extern __int16 word_43C17C; // weak
  254. extern __int16 word_43C180; // weak
  255. extern __int16 word_43C184; // weak
  256. extern __int16 word_43C188; // weak
  257. extern __int16 word_43C18C; // weak
  258. extern __int16 word_43C190; // weak
  259. extern __int16 word_43C194; // weak
  260. extern __int16 word_43C198; // weak
  261. extern __int16 word_43C19C; // weak
  262. extern __int16 word_43C1A0; // weak
  263. extern __int16 word_43C1A4; // weak
  264. extern __int16 word_43C1A8; // weak
  265. extern __int16 word_43C1AC; // weak
  266. extern __int16 word_43C1B0; // weak
  267. extern __int16 word_43C1B4; // weak
  268. extern __int16 word_43C1B8; // weak
  269. extern __int16 word_43C1BC; // weak
  270. extern __int16 word_43C1C0; // weak
  271. extern __int16 word_43C1C4; // weak
  272. extern __int16 word_43C1C8; // weak
  273. extern __int16 word_43C1CC; // weak
  274. extern __int16 word_43C1D0; // weak
  275. extern __int16 word_43C1D4; // weak
  276. extern __int16 word_43C1D8; // weak
  277. extern __int16 word_43C1DC; // weak
  278. extern __int16 word_43C1E0; // weak
  279. extern __int16 word_43C1E4; // weak
  280. extern __int16 word_43C1E8; // weak
  281. extern __int16 word_43C1EC; // weak
  282. extern __int16 word_43C1F0; // weak
  283. extern __int16 word_43C1F4; // weak
  284. extern __int16 word_43C1F8; // weak
  285. extern __int16 word_43C1FC; // weak
  286. extern __int16 word_43C200; // weak
  287. extern __int16 word_43C204; // weak
  288. extern __int16 word_43C208; // weak
  289. extern __int16 word_43C20C; // weak
  290. extern __int16 word_43C210; // weak
  291. extern __int16 word_43C214; // weak
  292. extern __int16 word_43C218; // weak
  293. extern __int16 word_43C21C; // weak
  294. extern __int16 word_43C220; // weak
  295. extern __int16 word_43C224; // weak
  296. extern __int16 word_43C228; // weak
  297. extern __int16 word_43C22C; // weak
  298. extern __int16 word_43C230; // weak
  299. extern __int16 word_43C234; // weak
  300. extern __int16 word_43C238; // weak
  301. extern __int16 word_43C23C; // weak
  302. extern __int16 word_43C240; // weak
  303. extern __int16 word_43C244; // weak
  304. extern __int16 word_43C248; // weak
  305. extern __int16 word_43C24C; // weak
  306. extern __int16 word_43C250; // weak
  307. extern __int16 word_43C254; // weak
  308. extern __int16 word_43C258; // weak
  309. extern __int16 word_43C25C; // weak
  310. extern __int16 word_43C260; // weak
  311. extern __int16 word_43C264; // weak
  312. extern int dword_43C268; // weak
  313. extern char byte_43C274; // weak
  314. extern char byte_43C275; // weak
  315. extern char off_43C278[]; // idb
  316. extern FILE stru_43C2E0; // idb
  317. extern int (__cdecl *off_43C520)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
  318. extern int dword_43E574; // weak
  319. extern int dword_43E7A0; // weak
  320. extern int dword_43E830; // weak
  321. extern int dword_43E834; // weak
  322. extern int dword_43E838; // weak
  323. extern int dword_43E840; // weak
  324. extern int dword_43E844; // weak
  325. extern int dword_43E848; // weak
  326. extern char *off_43EC68; // weak
  327. extern int dword_43ECB0; // weak
  328. extern int dword_43ECB4; // weak
  329. extern int dword_43ECB8; // weak
  330. extern int dword_43ECBC; // weak
  331. extern FILE *logFilePtr; // idb
  332. extern int listeningPort; // weak
  333. extern struct sockaddr name; // idb
  334. extern int logFilePathPtr; // weak
  335. extern SOCKET wsaSocket; // idb
  336. extern int dword_43F6C8[]; // weak
  337. extern char byte_43F6CC[]; // weak
  338. extern int dword_43F6D8[]; // weak
  339. extern int dword_43F6E0[]; // weak
  340. extern int dword_43F6E4[]; // weak
  341. extern int dword_43F708[]; // weak
  342. extern int dword_4402C8[]; // weak
  343. extern int dword_4402D0[]; // weak
  344. extern _UNKNOWN unk_4402D8; // weak
  345. extern int dword_440318[]; // weak
  346. extern int dword_44031C[]; // weak
  347. extern int dword_440320[]; // weak
  348. extern int dword_440324[]; // weak
  349. extern int dword_440FC8[]; // weak
  350. extern int dword_440FDC[]; // weak
  351. extern int dword_4414C8; // weak
  352. extern int dword_4414D0; // weak
  353. extern int dword_4414D4; // weak
  354. extern int dword_441534; // idb
  355. extern int dword_441544; // weak
  356. extern int dword_441548; // weak
  357. extern int dword_441550; // weak
  358. extern int dword_4415A0; // weak
  359. extern struct _TIME_ZONE_INFORMATION TimeZoneInformation; // idb
  360. extern int dword_4417E0; // weak
  361. extern int dword_4417E4; // weak
  362. extern int (__cdecl *dword_4417E8)(_DWORD); // weak
  363. extern int (__cdecl *dword_4417F0)(_DWORD); // weak
  364. extern int (__cdecl *dword_4417F8)(_DWORD, _DWORD); // weak
  365. extern int (__cdecl *dword_4417FC)(_DWORD, _DWORD); // weak
  366. extern int (__cdecl *dword_441804)(_DWORD, _DWORD); // weak
  367. extern int (__cdecl *dword_441808)(_DWORD); // weak
  368. extern int (__cdecl *dword_44180C)(_DWORD, _DWORD); // weak
  369. extern int (__cdecl *dword_441810)(_DWORD, _DWORD); // weak
  370. extern int (__cdecl *dword_441814)(_DWORD); // weak
  371. extern int (__cdecl *dword_441818)(_DWORD); // weak
  372. extern int (__cdecl *dword_44181C)(_DWORD, _DWORD); // weak
  373. extern int (__cdecl *dword_441820)(_DWORD, _DWORD, _DWORD); // weak
  374. extern int (__cdecl *dword_441828)(_DWORD); // weak
  375. extern int (__cdecl *dword_44182C)(_DWORD, _DWORD); // weak
  376. extern int (__cdecl *dword_441830)(_DWORD, _DWORD, _DWORD); // weak
  377. extern int (__cdecl *dword_441834)(_DWORD, _DWORD, _DWORD); // weak
  378. extern int (__cdecl *dword_44183C)(_DWORD, _DWORD, _DWORD); // weak
  379. extern int (__cdecl *dword_441840)(_DWORD, _DWORD, _DWORD); // weak
  380. extern int (__cdecl *dword_441844)(_DWORD, _DWORD, _DWORD); // weak
  381. extern int (__cdecl *dword_44184C)(_DWORD, _DWORD); // weak
  382. extern int (__cdecl *dword_441850)(_DWORD, _DWORD, _DWORD, _DWORD); // weak
  383. extern int (__cdecl *dword_441854)(_DWORD, _DWORD); // weak
  384. extern int (__cdecl *dword_44185C)(_DWORD, _DWORD, _DWORD); // weak
  385. extern int (__cdecl *dword_441860)(_DWORD, _DWORD, _DWORD); // weak
  386. extern int (__cdecl *dword_441864)(_DWORD, _DWORD, _DWORD, _DWORD); // weak
  387. extern int (__cdecl *dword_44186C)(_DWORD, _DWORD, _DWORD); // weak
  388. extern int (__cdecl *dword_441870)(_DWORD, _DWORD); // weak
  389. extern int (__cdecl *dword_441874)(_DWORD, _DWORD); // weak
  390. extern int (__cdecl *dword_441878)(_DWORD, _DWORD, _DWORD); // weak
  391. extern int (__cdecl *dword_44187C)(_DWORD); // weak
  392. extern int (__cdecl *dword_441880)(_DWORD, _DWORD, _DWORD, _DWORD); // weak
  393. extern int (__cdecl *dword_441884)(_DWORD, _DWORD); // weak
  394. extern int (__cdecl *dword_441888)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
  395. extern int (__cdecl *dword_44188C)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
  396. extern int (__cdecl *dword_441890)(_DWORD, _DWORD, _DWORD, _DWORD); // weak
  397. extern HANDLE hHeap; // idb
  398. extern int dword_441CF0; // weak
  399. extern int dword_441D08; // weak
  400. extern int dword_441D0C; // weak
  401. extern void *Dst; // idb
  402. extern int dword_441D18; // weak
  403. extern LPVOID lpMem; // idb
  404. extern int dword_441D20; // weak
  405.  
  406. //-------------------------------------------------------------------------
  407. // Function declarations
  408.  
  409. #define __thiscall __cdecl // Test compile in C mode
  410.  
  411. int __cdecl WSAStartupWrapperWrapper();
  412. int __cdecl networkLoopWrapper(SOCKET s); // idb
  413. FILE *__cdecl fopenWrapperWrapper(const char *Filename);
  414. int __cdecl main(int argc, const char **argv, const char **envp);
  415. _DWORD __cdecl logToFile(_DWORD); // weak
  416. signed int __cdecl mainLoop(int argc, const char **argv);
  417. int __cdecl WSAStartupWrapper();
  418. signed int __cdecl networkLoop(SOCKET networkSocket); // idb
  419. FILE *__cdecl fopenWrapper(const char *Filename);
  420. int __cdecl sub_401D50(int a1);
  421. int __cdecl tomcrypt_ecc_import(int in, int inLength, int key); // idb
  422. int __cdecl tomcrypt_ecc_import_ex(int a1, int a2, int a3, int a4);
  423. int __cdecl sub_4020D0(int a1);
  424. int __cdecl sub_402400(int *a1);
  425. int __cdecl sub_4024A0(int a1);
  426. int __cdecl sub_402500(int a1);
  427. int __cdecl sub_402570(int a1, int a2);
  428. int __cdecl sub_402600(int a1, int a2);
  429. int __cdecl sub_402690(int *a1, int a2);
  430. int __cdecl sub_4026F0(unsigned int a1, unsigned int a2);
  431. int __cdecl sub_402760(int a1);
  432. int __cdecl sub_4027C0(int a1, int a2);
  433. int __cdecl sub_402840(int a1);
  434. int __cdecl sub_4028A0(int a1, int a2);
  435. int __cdecl sub_402950(int a1, unsigned int a2);
  436. int __cdecl sub_4029E0(int a1);
  437. int __cdecl sub_402A40(int a1);
  438. int __cdecl sub_402AA0(unsigned int a1, signed int a2);
  439. int __cdecl sub_402B10(unsigned int a1, int a2, int a3);
  440. int __cdecl sub_402BA0(int a1, int a2, signed int a3);
  441. int __cdecl sub_402C30(int a1);
  442. int __cdecl sub_402C90(int a1, int a2);
  443. int __cdecl sub_402D20(unsigned int a1, int a2, int a3);
  444. int __cdecl sub_402DB0(int a1, int a2, int a3);
  445. int __cdecl sub_402E60(int a1, int a2, int a3);
  446. int __cdecl sub_402EF0(int a1, int a2, int a3);
  447. int __cdecl sub_402FA0(int a1, int a2, int a3);
  448. int __cdecl sub_403030(int a1, int a2, int a3);
  449. int __cdecl sub_4030E0(int a1, int a2, int a3);
  450. int __cdecl sub_403170(int a1, int a2);
  451. int __cdecl sub_403200(int a1, int a2, unsigned int a3, int a4);
  452. int __cdecl sub_403290(int a1, int a2);
  453. int __cdecl sub_403320(int a1, int a2, int a3);
  454. int __cdecl sub_4033D0(int a1, int a2, int a3);
  455. int __cdecl sub_403480(int a1, int a2, int a3);
  456. int __cdecl sub_403530(int a1, int a2, int a3, int a4);
  457. int __cdecl sub_403610(int a1, int a2, int a3);
  458. int __cdecl sub_4036C0(int a1, int a2, int a3);
  459. int __cdecl sub_403770(int a1, int *a2);
  460. int __cdecl sub_403840(unsigned int a1, signed int *a2);
  461. int __cdecl sub_4038D0(int a1, int a2, int *a3);
  462. int __cdecl sub_403990(int a1);
  463. int __cdecl sub_4039D0(int a1, int a2, int a3, int a4);
  464. int __cdecl sub_403AB0(int a1, int a2);
  465. int __cdecl tomcrypt_unregister_cipher(const void *Buf2);
  466. _DWORD __cdecl tomcrypt_ctr_decrypt(_DWORD, _DWORD, _DWORD, _DWORD); // weak
  467. _DWORD __cdecl tomcrypt_ctr_encrypt(_DWORD, _DWORD, _DWORD, _DWORD); // weak
  468. int __cdecl tomcrypt_ctr_start(signed int a1, int a2, int a3, int a4, int a5, __int16 a6, int a7);
  469. int __cdecl tomcrypt_find_cypher(const char *Str2);
  470. int __cdecl tomcrypt_register_cipher(void *Src); // idb
  471. int __cdecl sub_404470(int a1, signed int a2, int a3, int a4);
  472. int __cdecl sub_404D20(unsigned int a1);
  473. int __cdecl sub_404D90(int a1, int a2, int a3);
  474. int __cdecl sub_405480(int a1, int a2, int a3);
  475. int __cdecl sub_405BF0();
  476. signed int __cdecl sub_405E50();
  477. int __cdecl sub_405E70(int a1);
  478. int __cdecl tomcrypt_unregister_hash(const void *Buf2);
  479. _DWORD __cdecl tomcrypt_ecc_decrypt_key(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
  480. int __cdecl tomcrypt_find_hash(const char *Str2);
  481. int __cdecl tomcrypt_register_hash(const void *Src);
  482. int __cdecl sub_4065F0(int a1);
  483. int __cdecl sub_4066E0(int a1, char *Src, unsigned int a3);
  484. _DWORD __cdecl sub_406890(_DWORD, _DWORD); // weak
  485. int __cdecl sub_407D90(int a1, int a2);
  486. int __cdecl sub_408160();
  487. int __cdecl sub_408230(int a1);
  488. int __cdecl sub_408320(int, void *Dst); // idb
  489. int __cdecl sub_4083C0();
  490. int __cdecl sub_408490(int a1, char a2);
  491. int __cdecl sub_408570(int a1, char a2);
  492. int __cdecl sub_4085E0(int a1, int a2, char a3);
  493. int __cdecl errorFunctionMaybe(int a1, int a2, int a3);
  494. int __cdecl sub_408830(int a1, int a2, int a3, int a4, int a5, int a6);
  495. int __cdecl sub_408C00(int a1, signed int a2, signed int a3, signed int a4, int a5);
  496. int __cdecl sub_409140(int a1, int a2, int a3, int a4, int a5, int a6);
  497. int __cdecl sub_409960(int a1, int a2, int a3);
  498. int __cdecl sub_409C20(int a1, int a2, int a3, int a4);
  499. int __cdecl sub_40A630(int a1, int a2, int a3, int a4, int a5);
  500. int __cdecl sub_40B430(int a1, int a2, int a3, int a4, int a5);
  501. signed int __cdecl sub_40BD00(signed int a1);
  502. int __cdecl sub_40BD50(int a1, int a2);
  503. int __cdecl tomcrypt_hash_memory(signed int a1, int a2, int a3, int a4, int a5);
  504. int __cdecl tomcrypt_ecc_free(int a1);
  505. int __cdecl tomcrypt_ecc_shared_secret(int a1, int a2, int a3, int a4);
  506. signed int __cdecl tomcrypt_hash_is_valid(signed int a1);
  507. int __cdecl tomcrypt_find_hash_oid(const void *Buf2, int a2);
  508. _DWORD __cdecl tomcrypt_der_decode_sequence(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
  509. int __cdecl sub_40CC20(int, size_t SizeOfElements, int, int); // idb
  510. signed int __cdecl sub_40CDE0(signed int a1);
  511. int __cdecl sub_40CE30();
  512. int __cdecl sub_40CEB0(int a1);
  513. bool __cdecl sub_40CF10(signed int a1);
  514. int __cdecl sub_40CF70(int a1, unsigned int *a2, int a3, unsigned int a4);
  515. _DWORD __cdecl sub_40D500(_DWORD, _DWORD, _DWORD); // weak
  516. int __cdecl sub_40D8B0(int a1, int a2, int a3);
  517. signed int __cdecl sub_40DDB0(unsigned __int8 a1);
  518. signed int __cdecl sub_40DE70(unsigned __int16 a1);
  519. int __cdecl sub_40DEE0(int a1, unsigned int a2, int a3);
  520. int __cdecl sub_40E020(int a1, unsigned int a2, int a3, int a4);
  521. int __cdecl sub_40E2E0(int a1);
  522. int __cdecl sub_40E340(int a1);
  523. int __cdecl sub_40E3A0(int a1, unsigned int a2, int a3);
  524. int __cdecl sub_40E4B0(int a1, unsigned int a2, int a3, int a4);
  525. int __cdecl sub_40E6A0(int a1);
  526. int __cdecl sub_40E700(int a1);
  527. int __cdecl sub_40E760(int a1, unsigned int a2, int a3);
  528. int __cdecl sub_40E870(int a1, unsigned int a2, int a3, int a4);
  529. int __cdecl sub_40EA60(unsigned int a1);
  530. int __cdecl sub_40EAB0(int a1, unsigned int a2, int a3);
  531. int __cdecl sub_40EC30(int a1, unsigned int a2, int a3, int a4);
  532. int __cdecl sub_40EEA0(unsigned int a1, int a2);
  533. int __cdecl sub_40EF50(int a1, unsigned int a2, int a3, int a4);
  534. int __cdecl sub_40F120(unsigned int a1, int a2);
  535. int __cdecl sub_40F1D0(int a1, unsigned int a2, int a3, int a4);
  536. int __cdecl sub_40F3F0(unsigned int a1, int a2);
  537. int __cdecl sub_40F4C0(int a1, unsigned int a2, int a3);
  538. int __cdecl sub_40F5E0(int a1, int a2);
  539. int __cdecl sub_40F7D0(int a1, unsigned int a2, int a3);
  540. int __cdecl sub_40FA60(int a1);
  541. int __cdecl sub_40FAC0(int a1, int a2, int a3);
  542. int __cdecl sub_40FB90(int a1, int a2);
  543. // int __stdcall WSAGetLastError();
  544. // int __stdcall closesocket(SOCKET s);
  545. // SOCKET __stdcall accept(SOCKET s, struct sockaddr *addr, int *addrlen);
  546. // int __stdcall listen(SOCKET s, int backlog);
  547. // int __stdcall bind(SOCKET s, const struct sockaddr *name, int namelen);
  548. // u_short __stdcall htons(u_short hostshort);
  549. // SOCKET __stdcall socket(int af, int type, int protocol);
  550. // int __stdcall WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
  551. // int __stdcall send(SOCKET s, const char *buf, int len, int flags);
  552. // int __stdcall recvWrapper(SOCKET s, char *buf, int len, int flags);
  553. // void *__cdecl malloc(size_t Size);
  554. // void *__cdecl calloc(size_t NumOfElements, size_t SizeOfElements);
  555. // void *__cdecl realloc(void *Memory, size_t NewSize);
  556. void __cdecl CrtCheckMemoryWrapperWrapper(int a1);
  557. void __cdecl CrtCheckMemoryWrapper(int a1, signed int a2);
  558. // _DWORD __cdecl CheckBytes(_DWORD, _DWORD, _DWORD); weak
  559. signed int __cdecl sub_410DD0();
  560. // int __cdecl _CrtIsValidPointer(void *lp, UINT_PTR ucb, int); idb
  561. BOOL __cdecl sub_411210(int a1);
  562. // int printf(const char *Format, ...);
  563. // int __cdecl atoi(const char *Str);
  564. // int __cdecl rand();
  565. // int sprintf(char *Dest, const char *Format, ...);
  566. // FILE *__cdecl fopen(const char *Filename, const char *Mode);
  567. // int __cdecl fflush(FILE *File);
  568. // int __cdecl fputs(const char *Str, FILE *File);
  569. // char *__cdecl asctime(const struct tm *Tm);
  570. // struct tm *__cdecl localtime(const time_t *Time);
  571. // time_t __cdecl time(time_t *Time);
  572. // int __usercall sub_412AB8<eax>(int a1<ebp>);
  573. // void __usercall sub_412AD3(int a1<ebp>);
  574. // int __usercall _chkesp<eax>(char a1<zf>, int result<eax>, char a3<dil>);
  575. // int __cdecl memcmp(const void *Buf1, const void *Buf2, size_t Size);
  576. // int __cdecl strcmp(const char *Str1, const char *Str2);
  577. // void *__cdecl memcpy(void *Dst, const void *Src, size_t Size);
  578. // int __thiscall unknown_libname_1(_DWORD); weak
  579. // size_t __cdecl strlen(const char *Str);
  580. // _DWORD __cdecl raise(_DWORD); weak
  581. // int fprintf(FILE *File, const char *Format, ...);
  582. // _DWORD __cdecl _callnewh(_DWORD); weak
  583. // void *__cdecl memset(void *Dst, int Val, size_t Size);
  584. // int __cdecl _malloc_base(SIZE_T dwBytes); idb
  585. LPVOID __cdecl sub_413880(signed int dwBytes);
  586. // int __cdecl _CrtDbgReport(int, int, int Value, int, char *Format, char); idb
  587. LPVOID __cdecl sub_414110(LPVOID lpMem, signed int dwBytes);
  588. void *__cdecl sub_414290(LPVOID lpMem, signed int dwBytes);
  589. void __cdecl sub_4146B0(LPVOID lpMem);
  590. signed int __cdecl sub_414780();
  591. // _DWORD __cdecl __sbh_heap_init(_DWORD); weak
  592. // _DWORD __cdecl __sbh_find_block(_DWORD); weak
  593. // _DWORD __cdecl __sbh_verify_block(_DWORD, _DWORD); weak
  594. int __cdecl sub_414A90(unsigned int a1, int a2);
  595. // _DWORD __cdecl __sbh_alloc_block(_DWORD); weak
  596. // _DWORD __cdecl __sbh_resize_block(_DWORD, _DWORD, _DWORD); weak
  597. // int __cdecl __sbh_heap_check(_DWORD); weak
  598. // int __sbh_new_region(void); weak
  599. // _DWORD __cdecl __sbh_find_block_0(_DWORD, _DWORD, _DWORD); weak
  600. // _DWORD __cdecl __sbh_free_block(_DWORD, _DWORD, _DWORD); weak
  601. // _DWORD __cdecl __sbh_alloc_block_0(_DWORD); weak
  602. // _DWORD __cdecl __sbh_resize_block_0(_DWORD, _DWORD, _DWORD, _DWORD); weak
  603. // int __sbh_heap_check_0(void); weak
  604. HMODULE __cdecl sub_417510(HMODULE a1);
  605. signed int __cdecl sub_417570();
  606. signed int __cdecl sub_4177A0(int a1);
  607. // void __cdecl _exit(int Code);
  608. signed int __cdecl sub_419CA0(int a1);
  609. // _DWORD __cdecl cvtdate(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
  610. // int __cdecl _XcptFilter(int, struct _EXCEPTION_POINTERS *ExceptionInfo); idb
  611. // void *__cdecl memcpy_0(void *Dst, const void *Src, size_t Size);
  612. // __int32 __cdecl strtol(const char *Str, char **EndPtr, int Radix);
  613. // char *__cdecl strchr(const char *Str, int Val);
  614. // char *__cdecl strstr(const char *Str, const char *SubStr);
  615. // int __cdecl strncmp(const char *Str1, const char *Str2, size_t MaxCount);
  616. // int __cdecl toupper(int C);
  617. signed int __cdecl sub_41F810(int a1);
  618. void __cdecl sub_41F860(int a1);
  619. signed int __cdecl sub_41F8B0(int a1, int a2);
  620. signed int __cdecl sub_41F8F0(int a1, int a2);
  621. signed int __cdecl sub_41F960(unsigned int a1, unsigned int a2);
  622. int __cdecl sub_41F9C0(int a1);
  623. signed int __cdecl sub_41FA00(int a1, int a2);
  624. int __cdecl sub_41FA40(int a1, unsigned int a2);
  625. int __cdecl sub_41FA70(int a1);
  626. int __cdecl sub_41FAA0(int a1);
  627. signed int __cdecl sub_41FB00(unsigned int a1, signed int a2);
  628. signed int __cdecl sub_41FB60(unsigned int a1, int a2, int a3);
  629. signed int __cdecl sub_41FC20(int a1, int a2, signed int a3);
  630. int __cdecl sub_41FD10(int a1);
  631. signed int __cdecl sub_41FD40(int a1, int a2);
  632. signed int __cdecl sub_41FDD0(unsigned int a1, int a2, int a3);
  633. signed int __cdecl sub_41FE40(int a1, int a2, int a3);
  634. _DWORD __cdecl sub_41FEB0(_DWORD, _DWORD, _DWORD); // weak
  635. signed int __cdecl sub_41FFD0(int a1, int a2, int a3);
  636. signed int __cdecl sub_420040(int a1, int a2, int a3);
  637. _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD); // weak
  638. signed int __cdecl sub_420220(int a1, int a2, int a3);
  639. _DWORD __cdecl sub_4202E0(_DWORD, _DWORD); // weak
  640. signed int __cdecl sub_420370(int a1, int a2, unsigned int a3, int a4);
  641. signed int __cdecl sub_420890(int a1, int a2);
  642. signed int __cdecl sub_420930(int a1, int a2, int a3);
  643. signed int __cdecl sub_420950(int a1, int a2, int a3);
  644. signed int __cdecl sub_420B40(int a1, int a2, int a3);
  645. signed int __cdecl sub_420C00(int a1, int a2, int a3, int a4);
  646. signed int __cdecl sub_420C70(int a1, int a2, int a3);
  647. signed int __cdecl sub_420CE0(int a1, int a2, int a3);
  648. signed int __cdecl sub_420D30(int a1, int a2);
  649. signed int __cdecl sub_420D90(unsigned int a1, signed int *a2);
  650. signed int __cdecl sub_420E30(int a1, int a2, int a3);
  651. _DWORD __cdecl sub_420FA0(_DWORD, _DWORD, _DWORD, _DWORD); // weak
  652. signed int __cdecl sub_421130(int a1, signed int a2, int a3);
  653. signed int __cdecl sub_421250(int a1, signed int a2);
  654. int __cdecl sub_4212C0(int a1);
  655. signed int __cdecl sub_4212F0(int a1, signed int a2, int a3);
  656. int __cdecl sub_4213F0(unsigned int a1);
  657. signed int __cdecl sub_421430(int a1, int a2);
  658. int __cdecl sub_421490(int a1, int a2);
  659. signed int __cdecl sub_4214C0(int a1, int a2, unsigned int a3, int a4);
  660. signed int __cdecl sub_421680(int a1, int a2);
  661. signed int __cdecl sub_4216B0(int a1, int a2);
  662. signed int __cdecl sub_4216E0(int a1, int a2, unsigned int a3, unsigned int a4);
  663. signed int __cdecl sub_421850(signed int *a1, signed int *a2, int a3);
  664. signed int __cdecl sub_421920(int a1, int a2, int a3);
  665. signed int __cdecl sub_421A30(int a1, int a2, int a3, signed int a4);
  666. signed int __cdecl sub_421B90(int a1, int a2, int a3, signed int a4);
  667. signed int __cdecl sub_421CF0(int a1, int a2, int a3);
  668. signed int __cdecl sub_422020(int a1, int a2, int a3);
  669. signed int __cdecl sub_4228C0(int a1, int a2);
  670. signed int __cdecl sub_422A50(int a1, int a2);
  671. signed int __cdecl sub_422C10(int a1, int a2);
  672. signed int __cdecl sub_422E70(int a1, int a2);
  673. int __cdecl sub_4234B0(int a1, int a2);
  674. void __cdecl sub_423500(unsigned int a1, int a2);
  675. signed int __cdecl sub_423560(int a1, int a2);
  676. signed int __cdecl sub_4235D0(int a1, signed int a2);
  677. signed int __cdecl sub_423640(int a1, int a2);
  678. int __cdecl sub_423670(int a1);
  679. signed int __cdecl sub_4236A0(int a1);
  680. signed int __cdecl sub_423700(int a1, int a2, int a3);
  681. signed int __cdecl sub_423780(int a1, int a2, int a3);
  682. signed int __cdecl sub_423C50(int a1, int a2, int a3);
  683. signed int __cdecl sub_423F60(int a1, int a2);
  684. int __cdecl sub_424010(unsigned int a1, int a2);
  685. signed int __cdecl sub_424040(int a1, int a2, int a3);
  686. signed int __cdecl sub_424250(int a1, int a2, int a3, int a4, int a5);
  687. signed int __cdecl sub_424810(int a1);
  688. signed int __cdecl sub_424870(int a1);
  689. signed int __cdecl sub_4248B0(int a1, int a2, int a3, int a4, int a5);
  690. signed int __cdecl sub_424E00(int a1);
  691. signed int __cdecl sub_424E40(int a1, int a2, int a3);
  692. signed int __cdecl sub_424FF0(int a1, int a2);
  693. signed int __cdecl sub_425040(int a1, int a2, int a3);
  694. signed int __cdecl sub_425160(int a1, int a2, unsigned int a3);
  695. signed int __cdecl sub_425230(unsigned int a1, int a2, int a3);
  696. signed int __cdecl sub_4252F0(int a1, int a2);
  697. signed int __cdecl sub_425380(int a1, signed int *a2, int a3);
  698. int __cdecl sub_425470(int a1, int a2);
  699. signed int __cdecl sub_425490(unsigned int a1, int a2, int a3);
  700. signed int __cdecl sub_425550(int a1, int a2);
  701. signed int __cdecl sub_4255B0(unsigned int a1, signed int *a2, int a3);
  702. signed int __cdecl sub_425720(unsigned int a1, int a2);
  703. signed int __cdecl sub_425760(int a1, int a2, int a3, int a4);
  704. signed int __cdecl sub_4258D0(int a1, int a2, int a3, int a4);
  705. // BOOL __stdcall VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);
  706. // void __stdcall Sleep(DWORD dwMilliseconds);
  707. // BOOL __stdcall HeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem);
  708. // DWORD __stdcall GetLastError();
  709. // LPVOID __stdcall HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);
  710. // DWORD __stdcall GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize);
  711. // LPVOID __stdcall HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes);
  712. // BOOL __stdcall HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
  713. // HMODULE __stdcall GetModuleHandleA(LPCSTR lpModuleName);
  714. // DWORD __stdcall GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize);
  715. // BOOL __stdcall GetVersionExA(LPOSVERSIONINFOA lpVersionInformation);
  716. // BOOL __stdcall HeapDestroy(HANDLE hHeap);
  717. // HANDLE __stdcall HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize);
  718. // int __stdcall recv(SOCKET s, char *buf, int len, int flags);
  719.  
  720.  
  721. //----- (00401050) --------------------------------------------------------
  722. signed int __cdecl mainLoop(int argc, const char **argv)
  723. {
  724.   const char *logFilePath; // eax@1
  725.   const char **curParam; // ebp@2
  726.   signed int result; // eax@20
  727.   int wsaSuccess; // eax@24
  728.   SOCKET socketDescriptor; // eax@29
  729.   SOCKET socketDescriptor2; // esi@29
  730.   const char *wsaErrorMessage; // [sp-8h] [bp-38h]@25
  731.   int wsaErrorCode; // [sp-4h] [bp-34h]@25
  732.   int argumentCtr; // [sp+10h] [bp-20h]@2
  733.   char key; // [sp+14h] [bp-1Ch]@22
  734.  
  735.   logFilePath = "./ts3accserveremu.log";
  736.   listeningPort = 2008;
  737.   logFilePathPtr = (int)"./ts3accserveremu.log";
  738.   logFilePtr = 0;
  739.   if ( argc <= 0 )
  740.   {
  741. retryNetworkLoop:
  742.     if ( !logFilePath || (logFilePtr = fopenWrapperWrapper(logFilePath)) != 0 )
  743.     {
  744.       malloc(0x1000000u);
  745.       memcpy(&dword_4417E0, &off_430078, 0xC4u);
  746.       if ( tomcrypt_ecc_import((int)&serverKeyPtr, 161, (int)&key) )
  747.       {
  748.         printf("Oh noes, could not read server key data...");
  749.         result = -1;
  750.       }
  751.       else
  752.       {
  753.         wsaSuccess = WSAStartupWrapperWrapper();
  754.         if ( wsaSuccess )
  755.         {
  756.           wsaErrorCode = wsaSuccess;
  757.           wsaErrorMessage = "Error: Networking problem: %d\n";
  758.         }
  759.         else
  760.         {
  761.           while ( 1 )
  762.           {
  763.             wsaSocket = socket(2, 1, 0);
  764.             if ( wsaSocket == -1 )
  765.             {
  766.               wsaErrorCode = WSAGetLastError();
  767.               wsaErrorMessage = "Can't build socket, code: %d\n";
  768.               goto crashLabel;
  769.             }
  770.             *(_DWORD *)&name.sa_family = 0;
  771.             name.sa_family = 2;
  772.             *(_DWORD *)&name.sa_data[2] = 0;
  773.             *(_DWORD *)&name.sa_data[6] = 0;
  774.             *(_DWORD *)&name.sa_data[10] = 0;
  775.             *(_WORD *)&name.sa_data[0] = htons(0x7D8u);
  776.             *(_DWORD *)&name.sa_data[2] = 0;
  777.             if ( bind(wsaSocket, &name, 16) == -1 )
  778.             {
  779.               wsaErrorCode = WSAGetLastError();
  780.               wsaErrorMessage = "Can't bind socket, code: %d\n";
  781.               goto crashLabel;
  782.             }
  783.             if ( listen(wsaSocket, 10) == -1 )
  784.             {
  785.               wsaErrorCode = WSAGetLastError();
  786.               wsaErrorMessage = "Can't listen, code: %d\n";
  787.               goto crashLabel;
  788.             }
  789.             socketDescriptor = accept(wsaSocket, 0, 0);
  790.             socketDescriptor2 = socketDescriptor;
  791.             if ( socketDescriptor == -1 )
  792.               break;
  793.             networkLoopWrapper(socketDescriptor);
  794.             closesocket(socketDescriptor2);
  795.             closesocket(wsaSocket);
  796.           }
  797.           wsaErrorCode = WSAGetLastError();
  798.           wsaErrorMessage = "Accept failed, code: %d\n";
  799.         }
  800. crashLabel:
  801.         printf(wsaErrorMessage, wsaErrorCode);
  802.         result = 1;
  803.       }
  804.     }
  805.     else
  806.     {
  807.       printf("Could not create log file...\n");
  808.       result = -1;
  809.     }
  810.   }
  811.   else
  812.   {
  813.     curParam = argv;
  814.     argumentCtr = 1;
  815.     while ( strcmp(*curParam, "--help") && strcmp(*curParam, "-?") )
  816.     {
  817.       if ( strcmp(*curParam, "-f") )
  818.       {
  819.         if ( strcmp(*curParam, "-s") )
  820.         {
  821.           if ( !strcmp(*curParam, "-p") )
  822.           {
  823.             if ( argumentCtr < argc )
  824.               listeningPort = atoi(curParam[1]);
  825.             if ( !listeningPort || listeningPort == -1 )
  826.               listeningPort = 2008;
  827.           }
  828.         }
  829.         else
  830.         {
  831.           logFilePathPtr = 0;
  832.         }
  833.       }
  834.       else
  835.       {
  836.         if ( argumentCtr < argc )
  837.           logFilePathPtr = (int)curParam[1];
  838.       }
  839.       ++curParam;
  840.       ++argumentCtr;
  841.       if ( argumentCtr - 1 >= argc )
  842.       {
  843.         logFilePath = (const char *)logFilePathPtr;
  844.         goto retryNetworkLoop;
  845.       }
  846.     }
  847.     printf("TeamSpeak 3 Accounting Server Emulator v0.1 - Windows");
  848.     printf("\n(c) MESMERiZE 2011\n\n");
  849.     printf("-? / --help\t\t- Print this\n");
  850.     printf("-f <file>\t- define logfile\n");
  851.     printf("-s\t\t- silent mode, no logging\n");
  852.     printf("-p\t\t- define listening port (don't use this yet)\n");
  853.     result = 0;
  854.   }
  855.   return result;
  856. }
  857. // 430078: using guessed type char *off_430078;
  858. // 43F6A4: using guessed type int listeningPort;
  859. // 43F6B8: using guessed type int logFilePathPtr;
  860. // 4417E0: using guessed type int dword_4417E0;
  861.  
  862. //----- (004014F0) --------------------------------------------------------
  863. int __cdecl WSAStartupWrapper()
  864. {
  865.   struct WSAData WSAData; // [sp+0h] [bp-190h]@1
  866.  
  867.   return WSAStartup(2u, &WSAData);
  868. }
  869.  
  870. //----- (00401520) --------------------------------------------------------
  871. signed int __cdecl networkLoop(SOCKET networkSocket)
  872. {
  873.   signed int result; // eax@2
  874.   void *packetDataBuffer; // ebp@3
  875.   SOCKET v3; // ebx@5
  876.   int packetDataLength; // edi@7
  877.   int decryptResult; // eax@7
  878.   signed int index; // esi@9
  879.   int cipherIndex1; // eax@11
  880.   int cipherIndex2; // eax@11
  881.   int ctrLength1; // esi@11
  882.   int ctrLength2; // esi@11
  883.   unsigned int v11; // ebx@13
  884.   int v12; // esi@13
  885.   unsigned int v13; // ecx@13
  886.   int v14; // edi@13
  887.   int i; // ecx@13
  888.   int v16; // eax@16
  889.   int v17; // edi@17
  890.   int j; // ecx@17
  891.   int v19; // esi@21
  892.   int temp1; // [sp+10h] [bp-284Ch]@12
  893.   int temp2; // [sp+14h] [bp-2848h]@12
  894.   int v22; // [sp+18h] [bp-2844h]@12
  895.   int v23; // [sp+1Ch] [bp-2840h]@12
  896.   int v24; // [sp+20h] [bp-283Ch]@13
  897.   int len; // [sp+24h] [bp-2838h]@13
  898.   int outputLength; // [sp+28h] [bp-2834h]@7
  899.   char buf; // [sp+2Ch] [bp-2830h]@9
  900.   int v28; // [sp+30h] [bp-282Ch]@9
  901.   char v29; // [sp+34h] [bp-2828h]@9
  902.   char randomDataArr[88]; // [sp+38h] [bp-2824h]@9
  903.   char key; // [sp+90h] [bp-27CCh]@1
  904.   char outputPtr2; // [sp+ACh] [bp-27B0h]@11
  905.   char tomcrypt_iv2; // [sp+CCh] [bp-2790h]@11
  906.   char outputPtr; // [sp+ECh] [bp-2770h]@7
  907.   char tomcrypt_iv1; // [sp+10Ch] [bp-2750h]@11
  908.   char symmetricCTR1; // [sp+4ECh] [bp-2370h]@11
  909.   char symmetricCTR2; // [sp+16A4h] [bp-11B8h]@11
  910.  
  911.   logToFile("---begin client handler---");
  912.   if ( tomcrypt_ecc_import((int)&serverKeyPtr, 161, (int)&key) )
  913.   {
  914.     logToFile("Oh noes, could not read server key data...");
  915.     result = -1;
  916.   }
  917.   else
  918.   {
  919.     logToFile("Server key data successfully initialized...");
  920.     logToFile("allocating memory for input buffer...");
  921.     packetDataBuffer = malloc(0x100000u);
  922.     if ( packetDataBuffer )
  923.     {
  924.       memset(packetDataBuffer, 0, 0x100000u);
  925.       logToFile("Awaiting packet from client...");
  926.       v3 = networkSocket;
  927.       recvWrapper(networkSocket, (char *)packetDataBuffer, 4, 0);// Read 4 Bytes (Header Length)
  928.       logToFile("Received client packet...");
  929.       logToFile("This must be the Hello-Packet from the client...");
  930.       if ( strcmp((const char *)packetDataBuffer, "TS3C") )// Check if it is a Client Packet
  931.       {
  932.         logToFile("Not a TS3-Server-Request...");
  933.         result = -1;
  934.       }
  935.       else
  936.       {                                         // It's a client packet.
  937.         Sleep(0xFAu);
  938.         packetDataLength = recvWrapper(networkSocket, (char *)packetDataBuffer, 1024, 0);// Recieve the remaining data
  939.         logToFile("Received client packet...");
  940.         logToFile("This must be the encrypted key from the client...");
  941.         Sleep(0xFAu);
  942.         outputLength = 1024;
  943.         tomcrypt_register_hash(&hashDescriptor);
  944.         tomcrypt_find_hash("sha512");
  945.         decryptResult = tomcrypt_ecc_decrypt_key(
  946.                           (char *)packetDataBuffer + 7,
  947.                           packetDataLength - 7,
  948.                           &outputPtr,
  949.                           &outputLength,
  950.                           &key);
  951.         if ( decryptResult )
  952.         {
  953.           sprintf(&outputPtr, "Oh noes, could not decrypt the client key, error %X...", decryptResult);
  954.           logToFile(&outputPtr);
  955.           result = -1;
  956.         }
  957.         else
  958.         {
  959.           logToFile("Key from client successfully decrypted...");
  960.           tomcrypt_unregister_hash(&hashDescriptor);
  961.           tomcrypt_register_cipher(&cipherDescriptor);
  962.           memset(&buf, 0, 0x4Cu);
  963.           index = 0;
  964.           randomDataArr[64] = 0;
  965.           buf = 73;
  966.           v28 = dword_43BEA8;
  967.           v29 = 4;
  968.           do
  969.             randomDataArr[index++] = rand();
  970.           while ( index < 64 );
  971.           memcpy(&outputPtr2, randomDataArr, 0x40u);
  972.           cipherIndex1 = tomcrypt_find_cypher("rijndael");
  973.           tomcrypt_ctr_start(cipherIndex1, (int)&tomcrypt_iv1, (int)&outputPtr, 32, 0, 0, (int)&symmetricCTR1);
  974.           tomcrypt_ctr_encrypt(&buf, &buf, 4, &symmetricCTR1);
  975.           tomcrypt_ctr_encrypt(&v28, &v28, 73, &symmetricCTR1);
  976.           send(networkSocket, &buf, 77, 0);
  977.           printf("\n");
  978.           Sleep(0xFAu);
  979.           logToFile("Setting up local key material...");
  980.           tomcrypt_register_cipher(&cipherDescriptor);
  981.           cipherIndex2 = tomcrypt_find_cypher("rijndael");
  982.           tomcrypt_ctr_start(cipherIndex2, (int)&tomcrypt_iv2, (int)&outputPtr2, 32, 0, 0, (int)&symmetricCTR2);
  983.           ctrLength1 = recvWrapper(networkSocket, (char *)packetDataBuffer, 4, 0);
  984.           logToFile("Received client packet...");
  985.           logToFile("This must be the encrypted client license data header...");
  986.           tomcrypt_ctr_decrypt(packetDataBuffer, packetDataBuffer, ctrLength1, &symmetricCTR2);
  987.           Sleep(0xFAu);
  988.           ctrLength2 = recvWrapper(networkSocket, (char *)packetDataBuffer, 16777216, 0);
  989.           logToFile("Received client packet...");
  990.           logToFile("This must be the encrypted client license data...");
  991.           tomcrypt_ctr_decrypt(packetDataBuffer, packetDataBuffer, ctrLength2, &symmetricCTR2);
  992.           if ( (unsigned int)ctrLength2 > 0x19 )
  993.           {
  994.             logToFile("It's a vserver check!");
  995.             v11 = (ctrLength2 - 49) / 0x1Cu + 1;
  996.             v12 = (int)malloc((ctrLength2 - 49) / 0x1Cu + 8);
  997.             v24 = v11 + 3;
  998.             len = v11 + 7;
  999.             v13 = (v11 + 7) >> 2;
  1000.             memset((void *)v12, 0, 4 * v13);
  1001.             v14 = v12 + 4 * v13;
  1002.             for ( i = ((_BYTE)v11 + 7) & 3; i; --i )
  1003.               *(_BYTE *)v14++ = 0;
  1004.             v16 = v24;
  1005.             *(_BYTE *)(v12 + 4) = 0;
  1006.             *(_DWORD *)v12 = v16;
  1007.             *(_BYTE *)(v12 + 5) = 2;
  1008.             *(_BYTE *)(v12 + 6) = 2;
  1009.             if ( v11 )
  1010.             {
  1011.               memset((void *)(v12 + 7), 0, 4 * (v11 >> 2));
  1012.               v17 = v12 + 7 + 4 * (v11 >> 2);
  1013.               for ( j = v11 & 3; j; --j )
  1014.                 *(_BYTE *)v17++ = 0;
  1015.             }
  1016.             tomcrypt_ctr_encrypt(v12, v12, 4, &symmetricCTR1);
  1017.             tomcrypt_ctr_encrypt(v12 + 4, v12 + 4, v24, &symmetricCTR1);
  1018.             tomcrypt_unregister_cipher(&cipherDescriptor);
  1019.             logToFile("Sending server response to client");
  1020.             send(networkSocket, (const char *)v12, len, 0);
  1021.             CrtCheckMemoryWrapperWrapper(v12);
  1022.             v3 = networkSocket;
  1023.           }
  1024.           else
  1025.           {
  1026.             temp1 = 0;
  1027.             LOBYTE(temp2) = 1;
  1028.             BYTE3(temp2) = 1;
  1029.             v22 = 0;
  1030.             v23 = 0;
  1031.             *(_WORD *)((char *)&temp2 + 1) = 256;
  1032.             LOBYTE(temp1) = 4;
  1033.             tomcrypt_ctr_encrypt(&temp1, &temp1, 4, &symmetricCTR1);
  1034.             tomcrypt_ctr_encrypt(&temp2, &temp2, 4, &symmetricCTR1);
  1035.             tomcrypt_unregister_cipher(&cipherDescriptor);
  1036.             logToFile("Sending server response to client");
  1037.             send(networkSocket, (const char *)&temp1, 8, 0);
  1038.           }
  1039.           v19 = recvWrapper(v3, (char *)packetDataBuffer, 1024, 0);
  1040.           logToFile("Received client packet...");
  1041.           logToFile("This must be the last message the client sends to the accounting server...");
  1042.           tomcrypt_ctr_decrypt(packetDataBuffer, packetDataBuffer, v19, &symmetricCTR2);
  1043.           tomcrypt_unregister_cipher(&cipherDescriptor);
  1044.           CrtCheckMemoryWrapperWrapper((int)packetDataBuffer);
  1045.           logToFile("---end client handler---");
  1046.           result = 0;
  1047.         }
  1048.       }
  1049.     }
  1050.     else
  1051.     {
  1052.       logToFile("Memory allocation error, free some memory and try again!");
  1053.       result = -1;
  1054.     }
  1055.   }
  1056.   return result;
  1057. }
  1058. // 40101E: using guessed type _DWORD __cdecl logToFile(_DWORD);
  1059. // 403C00: using guessed type _DWORD __cdecl tomcrypt_ctr_decrypt(_DWORD, _DWORD, _DWORD, _DWORD);
  1060. // 403CB0: using guessed type _DWORD __cdecl tomcrypt_ctr_encrypt(_DWORD, _DWORD, _DWORD, _DWORD);
  1061. // 405FA0: using guessed type _DWORD __cdecl tomcrypt_ecc_decrypt_key(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  1062. // 430390: using guessed type char *cipherDescriptor;
  1063. // 434EC0: using guessed type char *hashDescriptor;
  1064. // 43BEA8: using guessed type int dword_43BEA8;
  1065. // 401520: using guessed type char randomDataArr[88];
  1066.  
  1067. //----- (00401D20) --------------------------------------------------------
  1068. FILE *__cdecl fopenWrapper(const char *Filename)
  1069. {
  1070.   return fopen(Filename, "w");
  1071. }
  1072.  
  1073. //----- (00401D50) --------------------------------------------------------
  1074. int __cdecl sub_401D50(int a1)
  1075. {
  1076.   struct tm *v1; // eax@1
  1077.   char *v2; // eax@1
  1078.   int result; // eax@1
  1079.   const char Time[1028]; // [sp+0h] [bp-404h]@1
  1080.  
  1081.   time((time_t *)Time);
  1082.   v1 = localtime((const time_t *)Time);
  1083.   v2 = asctime(v1);
  1084.   sprintf((char *)&Time[4], "%s%s\n", v2, a1);
  1085.   result = (int)logFilePtr;
  1086.   if ( logFilePtr )
  1087.   {
  1088.     fputs(&Time[4], logFilePtr);
  1089.     result = fflush(logFilePtr);
  1090.   }
  1091.   return result;
  1092. }
  1093.  
  1094. //----- (00401DE0) --------------------------------------------------------
  1095. int __cdecl tomcrypt_ecc_import(int in, int inLength, int key)
  1096. {
  1097.   int ecc_import_ex_result; // eax@1
  1098.   char v5; // [sp+0h] [bp-4Ch]@0
  1099.   char temp; // [sp+Ch] [bp-40h]@1
  1100.  
  1101.   memset(&temp, -858993460, 0x40u);
  1102.   ecc_import_ex_result = tomcrypt_ecc_import_ex(in, inLength, key, 0);
  1103.   return _chkesp(1, ecc_import_ex_result, v5);
  1104. }
  1105.  
  1106. //----- (00401E20) --------------------------------------------------------
  1107. int __cdecl tomcrypt_ecc_import_ex(int a1, int a2, int a3, int a4)
  1108. {
  1109.   int v4; // eax@8
  1110.   int v5; // eax@23
  1111.   char v7; // [sp+0h] [bp-58h]@23
  1112.   char v8; // [sp+Ch] [bp-4Ch]@1
  1113.   int v9; // [sp+4Ch] [bp-Ch]@9
  1114.   int v10; // [sp+50h] [bp-8h]@10
  1115.   int v11; // [sp+54h] [bp-4h]@18
  1116.   int v12; // [sp+58h] [bp+0h]@23
  1117.  
  1118.   memset(&v8, -858993460, 0x4Cu);
  1119.   if ( !a1 )
  1120.     errorFunctionMaybe(
  1121.       (int)"in != NULL",
  1122.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_import.c",
  1123.       word_43C0F8 + 5);
  1124.   if ( !a3 )
  1125.     errorFunctionMaybe(
  1126.       (int)"key != NULL",
  1127.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_import.c",
  1128.       word_43C0F8 + 6);
  1129.   if ( !dword_4417E0 )
  1130.     errorFunctionMaybe(
  1131.       (int)"ltc_mp.name != NULL",
  1132.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_import.c",
  1133.       word_43C0F8 + 7);
  1134.   if ( !sub_408490(a3 + 12, a3 + 16) )
  1135.   {
  1136.     v9 = sub_4085E0(a1, a2, 4);
  1137.     if ( !v9 )
  1138.     {
  1139.       if ( (unsigned __int8)v10 == 1 )
  1140.       {
  1141.         *(_DWORD *)a3 = 1;
  1142.         v9 = sub_4085E0(a1, a2, 4);
  1143.         if ( v9 )
  1144.           goto LABEL_26;
  1145.       }
  1146.       else
  1147.       {
  1148.         *(_DWORD *)a3 = 0;
  1149.         v9 = sub_4085E0(a1, a2, 4);
  1150.         if ( v9 )
  1151.           goto LABEL_26;
  1152.       }
  1153.       if ( a4 )
  1154.       {
  1155.         *(_DWORD *)(a3 + 4) = -1;
  1156.         *(_DWORD *)(a3 + 8) = a4;
  1157.       }
  1158.       else
  1159.       {
  1160.         for ( *(_DWORD *)(a3 + 4) = 0;
  1161.               dword_4353F8[7 * *(_DWORD *)(a3 + 4)] && dword_4353F8[7 * *(_DWORD *)(a3 + 4)] != v11;
  1162.               ++*(_DWORD *)(a3 + 4) )
  1163.           ;
  1164.         if ( !dword_4353F8[7 * *(_DWORD *)(a3 + 4)] )
  1165.         {
  1166.           v9 = 7;
  1167.           goto LABEL_26;
  1168.         }
  1169.         *(_DWORD *)(a3 + 8) = &dword_4353F8[7 * *(_DWORD *)(a3 + 4)];
  1170.       }
  1171.       v5 = dword_4417FC(*(_DWORD *)(a3 + 20), 1);
  1172.       v9 = _chkesp(&v7 == &v7, v5, (unsigned int)&v12);
  1173.       if ( !v9 )
  1174.       {
  1175.         v9 = sub_4020D0(a3);
  1176.         if ( !v9 )
  1177.         {
  1178.           v4 = 0;
  1179.           return _chkesp(1, v4, v7);
  1180.         }
  1181.       }
  1182.     }
  1183. LABEL_26:
  1184.     sub_408570(*(_DWORD *)(a3 + 12), *(_DWORD *)(a3 + 16));
  1185.     v4 = v9;
  1186.     return _chkesp(1, v4, v7);
  1187.   }
  1188.   v4 = 13;
  1189.   return _chkesp(1, v4, v7);
  1190. }
  1191. // 4353F8: using guessed type int dword_4353F8[];
  1192. // 43C0F8: using guessed type __int16 word_43C0F8;
  1193. // 4417E0: using guessed type int dword_4417E0;
  1194. // 4417FC: using guessed type int (__cdecl *dword_4417FC)(_DWORD, _DWORD);
  1195.  
  1196. //----- (004020D0) --------------------------------------------------------
  1197. int __cdecl sub_4020D0(int a1)
  1198. {
  1199.   int v1; // eax@2
  1200.   int v2; // eax@3
  1201.   int v3; // eax@4
  1202.   int v4; // eax@5
  1203.   int v5; // eax@6
  1204.   int v6; // eax@7
  1205.   int v7; // eax@8
  1206.   int v8; // eax@9
  1207.   int v9; // eax@10
  1208.   int v10; // eax@11
  1209.   int v11; // eax@12
  1210.   int v12; // eax@13
  1211.   int v13; // eax@14
  1212.   int v14; // eax@15
  1213.   int v15; // eax@17
  1214.   int v16; // eax@18
  1215.   int v17; // eax@20
  1216.   char v19; // [sp+0h] [bp-60h]@3
  1217.   char v20; // [sp+Ch] [bp-54h]@1
  1218.   int v21; // [sp+4Ch] [bp-14h]@1
  1219.   int v22; // [sp+50h] [bp-10h]@6
  1220.   int v23; // [sp+54h] [bp-Ch]@5
  1221.   int v24; // [sp+58h] [bp-8h]@1
  1222.   int v25; // [sp+5Ch] [bp-4h]@1
  1223.   int v26; // [sp+60h] [bp+0h]@3
  1224.  
  1225.   memset(&v20, -858993460, 0x54u);
  1226.   v21 = sub_408490((int)&v25, (unsigned int)&v24);
  1227.   if ( v21 )
  1228.   {
  1229.     v1 = v21;
  1230.   }
  1231.   else
  1232.   {
  1233.     v2 = dword_441820(v25, *(_DWORD *)(*(_DWORD *)(a1 + 8) + 8), 16);
  1234.     v21 = _chkesp(&v19 == &v19, v2, (unsigned int)&v26);
  1235.     if ( !v21 )
  1236.     {
  1237.       v3 = dword_441820(v24, *(_DWORD *)(*(_DWORD *)(a1 + 8) + 12), 16);
  1238.       v21 = _chkesp(&v19 == &v19, v3, (unsigned int)&v26);
  1239.       if ( !v21 )
  1240.       {
  1241.         v4 = dword_44184C(*(_DWORD *)(a1 + 16), v23);
  1242.         v21 = _chkesp(&v19 == &v19, v4, (unsigned int)&v26);
  1243.         if ( !v21 )
  1244.         {
  1245.           v5 = dword_44184C(*(_DWORD *)(a1 + 12), v22);
  1246.           v21 = _chkesp(&v19 == &v19, v5, (unsigned int)&v26);
  1247.           if ( !v21 )
  1248.           {
  1249.             v6 = dword_441850(v22, v25, 0, v22);
  1250.             v21 = _chkesp(&v19 == &v19, v6, (unsigned int)&v26);
  1251.             if ( !v21 )
  1252.             {
  1253.               v7 = dword_441844(*(_DWORD *)(a1 + 12), v22, v22);
  1254.               v21 = _chkesp(&v19 == &v19, v7, (unsigned int)&v26);
  1255.               if ( !v21 )
  1256.               {
  1257.                 v8 = dword_44183C(v23, v22, v23);
  1258.                 v21 = _chkesp(&v19 == &v19, v8, (unsigned int)&v26);
  1259.                 if ( !v21 )
  1260.                 {
  1261.                   v9 = dword_441834(v23, *(_DWORD *)(a1 + 12), v23);
  1262.                   v21 = _chkesp(&v19 == &v19, v9, (unsigned int)&v26);
  1263.                   if ( !v21 )
  1264.                   {
  1265.                     v10 = dword_441834(v23, *(_DWORD *)(a1 + 12), v23);
  1266.                     v21 = _chkesp(&v19 == &v19, v10, (unsigned int)&v26);
  1267.                     if ( !v21 )
  1268.                     {
  1269.                       v11 = dword_441834(v23, *(_DWORD *)(a1 + 12), v23);
  1270.                       v21 = _chkesp(&v19 == &v19, v11, (unsigned int)&v26);
  1271.                       if ( !v21 )
  1272.                       {
  1273.                         v12 = dword_441850(v23, v25, 0, v23);
  1274.                         v21 = _chkesp(&v19 == &v19, v12, (unsigned int)&v26);
  1275.                         if ( !v21 )
  1276.                         {
  1277.                           while ( 1 )
  1278.                           {
  1279.                             v13 = dword_441810(v23, 0);
  1280.                             if ( _chkesp(&v19 == &v19, v13, (unsigned int)&v26) != -1 )
  1281.                               break;
  1282.                             v14 = dword_441834(v23, v25, v23);
  1283.                             v21 = _chkesp(&v19 == &v19, v14, (unsigned int)&v26);
  1284.                             if ( v21 )
  1285.                               goto LABEL_23;
  1286.                           }
  1287.                           while ( 1 )
  1288.                           {
  1289.                             v15 = dword_44180C(v23, v25);
  1290.                             if ( _chkesp(&v19 == &v19, v15, (unsigned int)&v26) == -1 )
  1291.                               break;
  1292.                             v16 = dword_44183C(v23, v25, v23);
  1293.                             v21 = _chkesp(&v19 == &v19, v16, (unsigned int)&v26);
  1294.                             if ( v21 )
  1295.                               goto LABEL_23;
  1296.                           }
  1297.                           v17 = dword_44180C(v23, v24);
  1298.                           if ( _chkesp(&v19 == &v19, v17, (unsigned int)&v26) )
  1299.                             v21 = 7;
  1300.                           else
  1301.                             v21 = 0;
  1302.                         }
  1303.                       }
  1304.                     }
  1305.                   }
  1306.                 }
  1307.               }
  1308.             }
  1309.           }
  1310.         }
  1311.       }
  1312.     }
  1313. LABEL_23:
  1314.     sub_408570(v25, v24);
  1315.     v1 = v21;
  1316.   }
  1317.   return _chkesp(1, v1, v19);
  1318. }
  1319. // 44180C: using guessed type int (__cdecl *dword_44180C)(_DWORD, _DWORD);
  1320. // 441810: using guessed type int (__cdecl *dword_441810)(_DWORD, _DWORD);
  1321. // 441820: using guessed type int (__cdecl *dword_441820)(_DWORD, _DWORD, _DWORD);
  1322. // 441834: using guessed type int (__cdecl *dword_441834)(_DWORD, _DWORD, _DWORD);
  1323. // 44183C: using guessed type int (__cdecl *dword_44183C)(_DWORD, _DWORD, _DWORD);
  1324. // 441844: using guessed type int (__cdecl *dword_441844)(_DWORD, _DWORD, _DWORD);
  1325. // 44184C: using guessed type int (__cdecl *dword_44184C)(_DWORD, _DWORD);
  1326. // 441850: using guessed type int (__cdecl *dword_441850)(_DWORD, _DWORD, _DWORD, _DWORD);
  1327.  
  1328. //----- (00402400) --------------------------------------------------------
  1329. int __cdecl sub_402400(int *a1)
  1330. {
  1331.   int v1; // eax@4
  1332.   int v2; // eax@5
  1333.   char v4; // [sp+0h] [bp-50h]@0
  1334.   char v5; // [sp+Ch] [bp-44h]@1
  1335.   int v6; // [sp+4Ch] [bp-4h]@5
  1336.  
  1337.   memset(&v5, -858993460, 0x44u);
  1338.   if ( !a1 )
  1339.     errorFunctionMaybe(
  1340.       (int)"a != NULL",
  1341.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1342.       word_43C0FC + 3);
  1343.   *a1 = (int)calloc(1u, 0x10u);
  1344.   if ( *a1 )
  1345.   {
  1346.     v2 = sub_41F810(*a1);
  1347.     v6 = sub_4024A0(v2);
  1348.     if ( v6 )
  1349.       CrtCheckMemoryWrapperWrapper(*a1);
  1350.     v1 = v6;
  1351.   }
  1352.   else
  1353.   {
  1354.     v1 = 13;
  1355.   }
  1356.   return _chkesp(1, v1, v4);
  1357. }
  1358. // 43C0FC: using guessed type __int16 word_43C0FC;
  1359.  
  1360. //----- (004024A0) --------------------------------------------------------
  1361. int __cdecl sub_4024A0(int a1)
  1362. {
  1363.   char v2; // [sp+Ch] [bp-44h]@1
  1364.   int i; // [sp+4Ch] [bp-4h]@1
  1365.  
  1366.   memset(&v2, -858993460, 0x44u);
  1367.   for ( i = 0; i < 3; ++i )
  1368.   {
  1369.     if ( a1 == dword_430060[2 * i] )
  1370.       return dword_430064[2 * i];
  1371.   }
  1372.   return 1;
  1373. }
  1374. // 430060: using guessed type int dword_430060[];
  1375. // 430064: using guessed type int dword_430064[];
  1376.  
  1377. //----- (00402500) --------------------------------------------------------
  1378. int __cdecl sub_402500(int a1)
  1379. {
  1380.   int v1; // eax@3
  1381.   char v3; // [sp+0h] [bp-4Ch]@0
  1382.   char v4; // [sp+Ch] [bp-40h]@1
  1383.  
  1384.   memset(&v4, -858993460, 0x40u);
  1385.   if ( !a1 )
  1386.     errorFunctionMaybe(
  1387.       (int)"a != ((void *)0)",
  1388.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1389.       word_43C100 + 1);
  1390.   sub_41F860(a1);
  1391.   CrtCheckMemoryWrapperWrapper(a1);
  1392.   return _chkesp(1, v1, v3);
  1393. }
  1394. // 43C100: using guessed type __int16 word_43C100;
  1395.  
  1396. //----- (00402570) --------------------------------------------------------
  1397. int __cdecl sub_402570(int a1, int a2)
  1398. {
  1399.   int v2; // eax@5
  1400.   int v3; // eax@5
  1401.   char v5; // [sp+0h] [bp-4Ch]@0
  1402.   char v6; // [sp+Ch] [bp-40h]@1
  1403.  
  1404.   memset(&v6, -858993460, 0x40u);
  1405.   if ( !a1 )
  1406.     errorFunctionMaybe(
  1407.       (int)"a != NULL",
  1408.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1409.       word_43C104 + 1);
  1410.   if ( !a2 )
  1411.     errorFunctionMaybe(
  1412.       (int)"b != NULL",
  1413.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1414.       word_43C104 + 2);
  1415.   v2 = sub_41F8B0(a1, a2);
  1416.   v3 = sub_4024A0(v2);
  1417.   return _chkesp(1, v3, v5);
  1418. }
  1419. // 43C104: using guessed type __int16 word_43C104;
  1420.  
  1421. //----- (00402600) --------------------------------------------------------
  1422. int __cdecl sub_402600(int a1, int a2)
  1423. {
  1424.   int v2; // eax@5
  1425.   int v3; // eax@5
  1426.   char v5; // [sp+0h] [bp-4Ch]@0
  1427.   char v6; // [sp+Ch] [bp-40h]@1
  1428.  
  1429.   memset(&v6, -858993460, 0x40u);
  1430.   if ( !a1 )
  1431.     errorFunctionMaybe(
  1432.       (int)"a != NULL",
  1433.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1434.       word_43C108 + 1);
  1435.   if ( !a2 )
  1436.     errorFunctionMaybe(
  1437.       (int)"b != NULL",
  1438.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1439.       word_43C108 + 2);
  1440.   v2 = sub_41F8F0(a1, a2);
  1441.   v3 = sub_4024A0(v2);
  1442.   return _chkesp(1, v3, v5);
  1443. }
  1444. // 43C108: using guessed type __int16 word_43C108;
  1445.  
  1446. //----- (00402690) --------------------------------------------------------
  1447. int __cdecl sub_402690(int *a1, int a2)
  1448. {
  1449.   signed int v2; // eax@2
  1450.   char v4; // [sp+0h] [bp-4Ch]@0
  1451.   char v5; // [sp+Ch] [bp-40h]@1
  1452.  
  1453.   memset(&v5, -858993460, 0x40u);
  1454.   if ( sub_402400(a1) )
  1455.     v2 = 13;
  1456.   else
  1457.     v2 = sub_402600(a2, *a1);
  1458.   return _chkesp(1, v2, v4);
  1459. }
  1460.  
  1461. //----- (004026F0) --------------------------------------------------------
  1462. int __cdecl sub_4026F0(unsigned int a1, unsigned int a2)
  1463. {
  1464.   int v2; // eax@3
  1465.   int v3; // eax@3
  1466.   char v5; // [sp+0h] [bp-4Ch]@0
  1467.   char v6; // [sp+Ch] [bp-40h]@1
  1468.  
  1469.   memset(&v6, -858993460, 0x40u);
  1470.   if ( !a1 )
  1471.     errorFunctionMaybe(
  1472.       (int)"a != NULL",
  1473.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1474.       word_43C10C + 1);
  1475.   v2 = sub_41F960(a1, a2);
  1476.   v3 = sub_4024A0(v2);
  1477.   return _chkesp(1, v3, v5);
  1478. }
  1479. // 43C10C: using guessed type __int16 word_43C10C;
  1480.  
  1481. //----- (00402760) --------------------------------------------------------
  1482. int __cdecl sub_402760(int a1)
  1483. {
  1484.   int v1; // eax@3
  1485.   char v3; // [sp+0h] [bp-4Ch]@0
  1486.   char v4; // [sp+Ch] [bp-40h]@1
  1487.  
  1488.   memset(&v4, -858993460, 0x40u);
  1489.   if ( !a1 )
  1490.     errorFunctionMaybe(
  1491.       (int)"a != NULL",
  1492.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1493.       word_43C110 + 1);
  1494.   v1 = sub_41F9C0(a1);
  1495.   return _chkesp(1, v1, v3);
  1496. }
  1497. // 43C110: using guessed type __int16 word_43C110;
  1498.  
  1499. //----- (004027C0) --------------------------------------------------------
  1500. int __cdecl sub_4027C0(int a1, int a2)
  1501. {
  1502.   char v3; // [sp+0h] [bp-54h]@0
  1503.   char v4; // [sp+Ch] [bp-48h]@1
  1504.   int v5; // [sp+4Ch] [bp-8h]@5
  1505.   int v6; // [sp+50h] [bp-4h]@3
  1506.  
  1507.   memset(&v4, -858993460, 0x48u);
  1508.   if ( !a1 )
  1509.     errorFunctionMaybe(
  1510.       (int)"a != NULL",
  1511.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1512.       word_43C114 + 2);
  1513.   v6 = a1;
  1514.   if ( a2 >= *(_DWORD *)a1 || a2 < 0 )
  1515.     v5 = 0;
  1516.   else
  1517.     v5 = *(_DWORD *)(*(_DWORD *)(v6 + 12) + 4 * a2);
  1518.   return _chkesp(1, v5, v3);
  1519. }
  1520. // 43C114: using guessed type __int16 word_43C114;
  1521.  
  1522. //----- (00402840) --------------------------------------------------------
  1523. int __cdecl sub_402840(int a1)
  1524. {
  1525.   char v2; // [sp+0h] [bp-50h]@0
  1526.   char v3; // [sp+Ch] [bp-44h]@1
  1527.   int v4; // [sp+4Ch] [bp-4h]@3
  1528.  
  1529.   memset(&v3, -858993460, 0x44u);
  1530.   if ( !a1 )
  1531.     errorFunctionMaybe(
  1532.       (int)"a != NULL",
  1533.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1534.       word_43C118 + 2);
  1535.   v4 = a1;
  1536.   return _chkesp(1, *(_DWORD *)a1, v2);
  1537. }
  1538. // 43C118: using guessed type __int16 word_43C118;
  1539.  
  1540. //----- (004028A0) --------------------------------------------------------
  1541. int __cdecl sub_4028A0(int a1, int a2)
  1542. {
  1543.   int v2; // eax@8
  1544.   char v4; // [sp+0h] [bp-54h]@0
  1545.   char v5; // [sp+Ch] [bp-48h]@1
  1546.   int v6; // [sp+4Ch] [bp-8h]@5
  1547.   int v7; // [sp+50h] [bp-4h]@5
  1548.  
  1549.   memset(&v5, -858993460, 0x48u);
  1550.   if ( !a1 )
  1551.     errorFunctionMaybe(
  1552.       (int)"a != NULL",
  1553.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1554.       word_43C11C + 2);
  1555.   if ( !a2 )
  1556.     errorFunctionMaybe(
  1557.       (int)"b != NULL",
  1558.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1559.       word_43C11C + 3);
  1560.   v7 = sub_41FA00(a1, a2);
  1561.   v6 = v7;
  1562.   if ( v7 == -1 )
  1563.   {
  1564.     v2 = -1;
  1565.   }
  1566.   else
  1567.   {
  1568.     if ( v6 )
  1569.       v2 = v6 == 1;
  1570.     else
  1571.       v2 = 0;
  1572.   }
  1573.   return _chkesp(1, v2, v4);
  1574. }
  1575. // 43C11C: using guessed type __int16 word_43C11C;
  1576.  
  1577. //----- (00402950) --------------------------------------------------------
  1578. int __cdecl sub_402950(int a1, unsigned int a2)
  1579. {
  1580.   int v2; // eax@6
  1581.   char v4; // [sp+0h] [bp-54h]@0
  1582.   char v5; // [sp+Ch] [bp-48h]@1
  1583.   int v6; // [sp+4Ch] [bp-8h]@3
  1584.   int v7; // [sp+50h] [bp-4h]@3
  1585.  
  1586.   memset(&v5, -858993460, 0x48u);
  1587.   if ( !a1 )
  1588.     errorFunctionMaybe(
  1589.       (int)"a != NULL",
  1590.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1591.       word_43C120 + 2);
  1592.   v7 = sub_41FA40(a1, a2);
  1593.   v6 = v7;
  1594.   if ( v7 == -1 )
  1595.   {
  1596.     v2 = -1;
  1597.   }
  1598.   else
  1599.   {
  1600.     if ( v6 )
  1601.       v2 = v6 == 1;
  1602.     else
  1603.       v2 = 0;
  1604.   }
  1605.   return _chkesp(1, v2, v4);
  1606. }
  1607. // 43C120: using guessed type __int16 word_43C120;
  1608.  
  1609. //----- (004029E0) --------------------------------------------------------
  1610. int __cdecl sub_4029E0(int a1)
  1611. {
  1612.   int v1; // eax@3
  1613.   char v3; // [sp+0h] [bp-4Ch]@0
  1614.   char v4; // [sp+Ch] [bp-40h]@1
  1615.  
  1616.   memset(&v4, -858993460, 0x40u);
  1617.   if ( !a1 )
  1618.     errorFunctionMaybe(
  1619.       (int)"a != NULL",
  1620.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1621.       word_43C124 + 1);
  1622.   v1 = sub_41FA70(a1);
  1623.   return _chkesp(1, v1, v3);
  1624. }
  1625. // 43C124: using guessed type __int16 word_43C124;
  1626.  
  1627. //----- (00402A40) --------------------------------------------------------
  1628. int __cdecl sub_402A40(int a1)
  1629. {
  1630.   int v1; // eax@3
  1631.   char v3; // [sp+0h] [bp-4Ch]@0
  1632.   char v4; // [sp+Ch] [bp-40h]@1
  1633.  
  1634.   memset(&v4, -858993460, 0x40u);
  1635.   if ( !a1 )
  1636.     errorFunctionMaybe(
  1637.       (int)"a != NULL",
  1638.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1639.       word_43C128 + 1);
  1640.   v1 = sub_41FAA0(a1);
  1641.   return _chkesp(1, v1, v3);
  1642. }
  1643. // 43C128: using guessed type __int16 word_43C128;
  1644.  
  1645. //----- (00402AA0) --------------------------------------------------------
  1646. int __cdecl sub_402AA0(unsigned int a1, signed int a2)
  1647. {
  1648.   int v2; // eax@3
  1649.   int v3; // eax@3
  1650.   char v5; // [sp+0h] [bp-4Ch]@0
  1651.   char v6; // [sp+Ch] [bp-40h]@1
  1652.  
  1653.   memset(&v6, -858993460, 0x40u);
  1654.   if ( !a1 )
  1655.     errorFunctionMaybe(
  1656.       (int)"a != NULL",
  1657.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1658.       word_43C12C + 1);
  1659.   v2 = sub_41FB00(a1, a2);
  1660.   v3 = sub_4024A0(v2);
  1661.   return _chkesp(1, v3, v5);
  1662. }
  1663. // 43C12C: using guessed type __int16 word_43C12C;
  1664.  
  1665. //----- (00402B10) --------------------------------------------------------
  1666. int __cdecl sub_402B10(unsigned int a1, int a2, int a3)
  1667. {
  1668.   int v3; // eax@5
  1669.   int v4; // eax@5
  1670.   char v6; // [sp+0h] [bp-4Ch]@0
  1671.   char v7; // [sp+Ch] [bp-40h]@1
  1672.  
  1673.   memset(&v7, -858993460, 0x40u);
  1674.   if ( !a1 )
  1675.     errorFunctionMaybe(
  1676.       (int)"a != NULL",
  1677.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1678.       word_43C130 + 1);
  1679.   if ( !a2 )
  1680.     errorFunctionMaybe(
  1681.       (int)"b != NULL",
  1682.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1683.       word_43C130 + 2);
  1684.   v3 = sub_41FB60(a1, a2, a3);
  1685.   v4 = sub_4024A0(v3);
  1686.   return _chkesp(1, v4, v6);
  1687. }
  1688. // 43C130: using guessed type __int16 word_43C130;
  1689.  
  1690. //----- (00402BA0) --------------------------------------------------------
  1691. int __cdecl sub_402BA0(int a1, int a2, signed int a3)
  1692. {
  1693.   int v3; // eax@5
  1694.   int v4; // eax@5
  1695.   char v6; // [sp+0h] [bp-4Ch]@0
  1696.   char v7; // [sp+Ch] [bp-40h]@1
  1697.  
  1698.   memset(&v7, -858993460, 0x40u);
  1699.   if ( !a1 )
  1700.     errorFunctionMaybe(
  1701.       (int)"a != NULL",
  1702.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1703.       word_43C134 + 1);
  1704.   if ( !a2 )
  1705.     errorFunctionMaybe(
  1706.       (int)"b != NULL",
  1707.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1708.       word_43C134 + 2);
  1709.   v3 = sub_41FC20(a1, a2, a3);
  1710.   v4 = sub_4024A0(v3);
  1711.   return _chkesp(1, v4, v6);
  1712. }
  1713. // 43C134: using guessed type __int16 word_43C134;
  1714.  
  1715. //----- (00402C30) --------------------------------------------------------
  1716. int __cdecl sub_402C30(int a1)
  1717. {
  1718.   int v1; // eax@3
  1719.   char v3; // [sp+0h] [bp-4Ch]@0
  1720.   char v4; // [sp+Ch] [bp-40h]@1
  1721.  
  1722.   memset(&v4, -858993460, 0x40u);
  1723.   if ( !a1 )
  1724.     errorFunctionMaybe(
  1725.       (int)"a != NULL",
  1726.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1727.       word_43C138 + 1);
  1728.   v1 = sub_41FD10(a1);
  1729.   return _chkesp(1, v1, v3);
  1730. }
  1731. // 43C138: using guessed type __int16 word_43C138;
  1732.  
  1733. //----- (00402C90) --------------------------------------------------------
  1734. int __cdecl sub_402C90(int a1, int a2)
  1735. {
  1736.   int v2; // eax@5
  1737.   int v3; // eax@5
  1738.   char v5; // [sp+0h] [bp-4Ch]@0
  1739.   char v6; // [sp+Ch] [bp-40h]@1
  1740.  
  1741.   memset(&v6, -858993460, 0x40u);
  1742.   if ( !a1 )
  1743.     errorFunctionMaybe(
  1744.       (int)"a != NULL",
  1745.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1746.       word_43C13C + 1);
  1747.   if ( !a2 )
  1748.     errorFunctionMaybe(
  1749.       (int)"b != NULL",
  1750.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1751.       word_43C13C + 2);
  1752.   v2 = sub_41FD40(a1, a2);
  1753.   v3 = sub_4024A0(v2);
  1754.   return _chkesp(1, v3, v5);
  1755. }
  1756. // 43C13C: using guessed type __int16 word_43C13C;
  1757.  
  1758. //----- (00402D20) --------------------------------------------------------
  1759. int __cdecl sub_402D20(unsigned int a1, int a2, int a3)
  1760. {
  1761.   int v3; // eax@5
  1762.   int v4; // eax@5
  1763.   char v6; // [sp+0h] [bp-4Ch]@0
  1764.   char v7; // [sp+Ch] [bp-40h]@1
  1765.  
  1766.   memset(&v7, -858993460, 0x40u);
  1767.   if ( !a1 )
  1768.     errorFunctionMaybe(
  1769.       (int)"a != NULL",
  1770.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1771.       word_43C140 + 1);
  1772.   if ( !a2 )
  1773.     errorFunctionMaybe(
  1774.       (int)"b != NULL",
  1775.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1776.       word_43C140 + 2);
  1777.   v3 = sub_41FDD0(a1, a2, a3);
  1778.   v4 = sub_4024A0(v3);
  1779.   return _chkesp(1, v4, v6);
  1780. }
  1781. // 43C140: using guessed type __int16 word_43C140;
  1782.  
  1783. //----- (00402DB0) --------------------------------------------------------
  1784. int __cdecl sub_402DB0(int a1, int a2, int a3)
  1785. {
  1786.   int v3; // eax@7
  1787.   int v4; // eax@7
  1788.   char v6; // [sp+0h] [bp-4Ch]@0
  1789.   char v7; // [sp+Ch] [bp-40h]@1
  1790.  
  1791.   memset(&v7, -858993460, 0x40u);
  1792.   if ( !a1 )
  1793.     errorFunctionMaybe(
  1794.       (int)"a != NULL",
  1795.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1796.       word_43C144 + 1);
  1797.   if ( !a2 )
  1798.     errorFunctionMaybe(
  1799.       (int)"b != NULL",
  1800.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1801.       word_43C144 + 2);
  1802.   if ( !a3 )
  1803.     errorFunctionMaybe(
  1804.       (int)"c != NULL",
  1805.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1806.       word_43C144 + 3);
  1807.   v3 = sub_41FE40(a1, a2, a3);
  1808.   v4 = sub_4024A0(v3);
  1809.   return _chkesp(1, v4, v6);
  1810. }
  1811. // 43C144: using guessed type __int16 word_43C144;
  1812.  
  1813. //----- (00402E60) --------------------------------------------------------
  1814. int __cdecl sub_402E60(int a1, int a2, int a3)
  1815. {
  1816.   int v3; // eax@5
  1817.   int v4; // eax@5
  1818.   char v6; // [sp+0h] [bp-4Ch]@0
  1819.   char v7; // [sp+Ch] [bp-40h]@1
  1820.  
  1821.   memset(&v7, -858993460, 0x40u);
  1822.   if ( !a1 )
  1823.     errorFunctionMaybe(
  1824.       (int)"a != NULL",
  1825.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1826.       word_43C148 + 1);
  1827.   if ( !a3 )
  1828.     errorFunctionMaybe(
  1829.       (int)"c != NULL",
  1830.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1831.       word_43C148 + 2);
  1832.   v3 = sub_41FEB0(a1, a2, a3);
  1833.   v4 = sub_4024A0(v3);
  1834.   return _chkesp(1, v4, v6);
  1835. }
  1836. // 41FEB0: using guessed type _DWORD __cdecl sub_41FEB0(_DWORD, _DWORD, _DWORD);
  1837. // 43C148: using guessed type __int16 word_43C148;
  1838.  
  1839. //----- (00402EF0) --------------------------------------------------------
  1840. int __cdecl sub_402EF0(int a1, int a2, int a3)
  1841. {
  1842.   int v3; // eax@7
  1843.   int v4; // eax@7
  1844.   char v6; // [sp+0h] [bp-4Ch]@0
  1845.   char v7; // [sp+Ch] [bp-40h]@1
  1846.  
  1847.   memset(&v7, -858993460, 0x40u);
  1848.   if ( !a1 )
  1849.     errorFunctionMaybe(
  1850.       (int)"a != NULL",
  1851.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1852.       word_43C14C + 1);
  1853.   if ( !a2 )
  1854.     errorFunctionMaybe(
  1855.       (int)"b != NULL",
  1856.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1857.       word_43C14C + 2);
  1858.   if ( !a3 )
  1859.     errorFunctionMaybe(
  1860.       (int)"c != NULL",
  1861.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1862.       word_43C14C + 3);
  1863.   v3 = sub_41FFD0(a1, a2, a3);
  1864.   v4 = sub_4024A0(v3);
  1865.   return _chkesp(1, v4, v6);
  1866. }
  1867. // 43C14C: using guessed type __int16 word_43C14C;
  1868.  
  1869. //----- (00402FA0) --------------------------------------------------------
  1870. int __cdecl sub_402FA0(int a1, int a2, int a3)
  1871. {
  1872.   int v3; // eax@5
  1873.   int v4; // eax@5
  1874.   char v6; // [sp+0h] [bp-4Ch]@0
  1875.   char v7; // [sp+Ch] [bp-40h]@1
  1876.  
  1877.   memset(&v7, -858993460, 0x40u);
  1878.   if ( !a1 )
  1879.     errorFunctionMaybe(
  1880.       (int)"a != NULL",
  1881.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1882.       word_43C150 + 1);
  1883.   if ( !a3 )
  1884.     errorFunctionMaybe(
  1885.       (int)"c != NULL",
  1886.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1887.       word_43C150 + 2);
  1888.   v3 = sub_420040(a1, a2, a3);
  1889.   v4 = sub_4024A0(v3);
  1890.   return _chkesp(1, v4, v6);
  1891. }
  1892. // 43C150: using guessed type __int16 word_43C150;
  1893.  
  1894. //----- (00403030) --------------------------------------------------------
  1895. int __cdecl sub_403030(int a1, int a2, int a3)
  1896. {
  1897.   int v3; // eax@7
  1898.   int v4; // eax@7
  1899.   char v6; // [sp+0h] [bp-4Ch]@0
  1900.   char v7; // [sp+Ch] [bp-40h]@1
  1901.  
  1902.   memset(&v7, -858993460, 0x40u);
  1903.   if ( !a1 )
  1904.     errorFunctionMaybe(
  1905.       (int)"a != NULL",
  1906.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1907.       word_43C154 + 1);
  1908.   if ( !a2 )
  1909.     errorFunctionMaybe(
  1910.       (int)"b != NULL",
  1911.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1912.       word_43C154 + 2);
  1913.   if ( !a3 )
  1914.     errorFunctionMaybe(
  1915.       (int)"c != NULL",
  1916.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1917.       word_43C154 + 3);
  1918.   v3 = sub_420150(a1, a2, a3);
  1919.   v4 = sub_4024A0(v3);
  1920.   return _chkesp(1, v4, v6);
  1921. }
  1922. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  1923. // 43C154: using guessed type __int16 word_43C154;
  1924.  
  1925. //----- (004030E0) --------------------------------------------------------
  1926. int __cdecl sub_4030E0(int a1, int a2, int a3)
  1927. {
  1928.   int v3; // eax@5
  1929.   int v4; // eax@5
  1930.   char v6; // [sp+0h] [bp-4Ch]@0
  1931.   char v7; // [sp+Ch] [bp-40h]@1
  1932.  
  1933.   memset(&v7, -858993460, 0x40u);
  1934.   if ( !a1 )
  1935.     errorFunctionMaybe(
  1936.       (int)"a != NULL",
  1937.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1938.       word_43C158 + 1);
  1939.   if ( !a3 )
  1940.     errorFunctionMaybe(
  1941.       (int)"c != NULL",
  1942.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1943.       word_43C158 + 2);
  1944.   v3 = sub_420220(a1, a2, a3);
  1945.   v4 = sub_4024A0(v3);
  1946.   return _chkesp(1, v4, v6);
  1947. }
  1948. // 43C158: using guessed type __int16 word_43C158;
  1949.  
  1950. //----- (00403170) --------------------------------------------------------
  1951. int __cdecl sub_403170(int a1, int a2)
  1952. {
  1953.   int v2; // eax@5
  1954.   int v3; // eax@5
  1955.   char v5; // [sp+0h] [bp-4Ch]@0
  1956.   char v6; // [sp+Ch] [bp-40h]@1
  1957.  
  1958.   memset(&v6, -858993460, 0x40u);
  1959.   if ( !a1 )
  1960.     errorFunctionMaybe(
  1961.       (int)"a != NULL",
  1962.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1963.       word_43C15C + 1);
  1964.   if ( !a2 )
  1965.     errorFunctionMaybe(
  1966.       (int)"b != NULL",
  1967.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1968.       word_43C15C + 2);
  1969.   v2 = sub_4202E0(a1, a2);
  1970.   v3 = sub_4024A0(v2);
  1971.   return _chkesp(1, v3, v5);
  1972. }
  1973. // 4202E0: using guessed type _DWORD __cdecl sub_4202E0(_DWORD, _DWORD);
  1974. // 43C15C: using guessed type __int16 word_43C15C;
  1975.  
  1976. //----- (00403200) --------------------------------------------------------
  1977. int __cdecl sub_403200(int a1, int a2, unsigned int a3, int a4)
  1978. {
  1979.   int v4; // eax@5
  1980.   int v5; // eax@5
  1981.   char v7; // [sp+0h] [bp-4Ch]@0
  1982.   char v8; // [sp+Ch] [bp-40h]@1
  1983.  
  1984.   memset(&v8, -858993460, 0x40u);
  1985.   if ( !a1 )
  1986.     errorFunctionMaybe(
  1987.       (int)"a != NULL",
  1988.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1989.       word_43C160 + 1);
  1990.   if ( !a2 )
  1991.     errorFunctionMaybe(
  1992.       (int)"b != NULL",
  1993.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  1994.       word_43C160 + 2);
  1995.   v4 = sub_420370(a1, a2, a3, a4);
  1996.   v5 = sub_4024A0(v4);
  1997.   return _chkesp(1, v5, v7);
  1998. }
  1999. // 43C160: using guessed type __int16 word_43C160;
  2000.  
  2001. //----- (00403290) --------------------------------------------------------
  2002. int __cdecl sub_403290(int a1, int a2)
  2003. {
  2004.   int v2; // eax@5
  2005.   int v3; // eax@5
  2006.   char v5; // [sp+0h] [bp-4Ch]@0
  2007.   char v6; // [sp+Ch] [bp-40h]@1
  2008.  
  2009.   memset(&v6, -858993460, 0x40u);
  2010.   if ( !a1 )
  2011.     errorFunctionMaybe(
  2012.       (int)"a != NULL",
  2013.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2014.       word_43C164 + 1);
  2015.   if ( !a2 )
  2016.     errorFunctionMaybe(
  2017.       (int)"b != NULL",
  2018.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2019.       word_43C164 + 2);
  2020.   v2 = sub_420890(a1, a2);
  2021.   v3 = sub_4024A0(v2);
  2022.   return _chkesp(1, v3, v5);
  2023. }
  2024. // 43C164: using guessed type __int16 word_43C164;
  2025.  
  2026. //----- (00403320) --------------------------------------------------------
  2027. int __cdecl sub_403320(int a1, int a2, int a3)
  2028. {
  2029.   int v3; // eax@5
  2030.   int v4; // eax@6
  2031.   char v6; // [sp+0h] [bp-54h]@0
  2032.   char v7; // [sp+Ch] [bp-48h]@1
  2033.   int v8; // [sp+4Ch] [bp-8h]@5
  2034.   int v9; // [sp+50h] [bp-4h]@5
  2035.  
  2036.   memset(&v7, -858993460, 0x48u);
  2037.   if ( !a1 )
  2038.     errorFunctionMaybe(
  2039.       (int)"a != NULL",
  2040.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2041.       word_43C168 + 4);
  2042.   if ( !a3 )
  2043.     errorFunctionMaybe(
  2044.       (int)"c != NULL",
  2045.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2046.       word_43C168 + 5);
  2047.   v3 = sub_420930(a1, a2, (int)&v9);
  2048.   v8 = sub_4024A0(v3);
  2049.   if ( v8 )
  2050.   {
  2051.     v4 = v8;
  2052.   }
  2053.   else
  2054.   {
  2055.     *(_DWORD *)a3 = v9;
  2056.     v4 = 0;
  2057.   }
  2058.   return _chkesp(1, v4, v6);
  2059. }
  2060. // 43C168: using guessed type __int16 word_43C168;
  2061.  
  2062. //----- (004033D0) --------------------------------------------------------
  2063. int __cdecl sub_4033D0(int a1, int a2, int a3)
  2064. {
  2065.   int v3; // eax@7
  2066.   int v4; // eax@7
  2067.   char v6; // [sp+0h] [bp-4Ch]@0
  2068.   char v7; // [sp+Ch] [bp-40h]@1
  2069.  
  2070.   memset(&v7, -858993460, 0x40u);
  2071.   if ( !a1 )
  2072.     errorFunctionMaybe(
  2073.       (int)"a != NULL",
  2074.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2075.       word_43C16C + 1);
  2076.   if ( !a2 )
  2077.     errorFunctionMaybe(
  2078.       (int)"b != NULL",
  2079.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2080.       word_43C16C + 2);
  2081.   if ( !a3 )
  2082.     errorFunctionMaybe(
  2083.       (int)"c != NULL",
  2084.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2085.       word_43C16C + 3);
  2086.   v3 = sub_420950(a1, a2, a3);
  2087.   v4 = sub_4024A0(v3);
  2088.   return _chkesp(1, v4, v6);
  2089. }
  2090. // 43C16C: using guessed type __int16 word_43C16C;
  2091.  
  2092. //----- (00403480) --------------------------------------------------------
  2093. int __cdecl sub_403480(int a1, int a2, int a3)
  2094. {
  2095.   int v3; // eax@7
  2096.   int v4; // eax@7
  2097.   char v6; // [sp+0h] [bp-4Ch]@0
  2098.   char v7; // [sp+Ch] [bp-40h]@1
  2099.  
  2100.   memset(&v7, -858993460, 0x40u);
  2101.   if ( !a1 )
  2102.     errorFunctionMaybe(
  2103.       (int)"a != NULL",
  2104.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2105.       word_43C170 + 1);
  2106.   if ( !a2 )
  2107.     errorFunctionMaybe(
  2108.       (int)"b != NULL",
  2109.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2110.       word_43C170 + 2);
  2111.   if ( !a3 )
  2112.     errorFunctionMaybe(
  2113.       (int)"c != NULL",
  2114.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2115.       word_43C170 + 3);
  2116.   v3 = sub_420B40(a1, a2, a3);
  2117.   v4 = sub_4024A0(v3);
  2118.   return _chkesp(1, v4, v6);
  2119. }
  2120. // 43C170: using guessed type __int16 word_43C170;
  2121.  
  2122. //----- (00403530) --------------------------------------------------------
  2123. int __cdecl sub_403530(int a1, int a2, int a3, int a4)
  2124. {
  2125.   int v4; // eax@9
  2126.   int v5; // eax@9
  2127.   char v7; // [sp+0h] [bp-4Ch]@0
  2128.   char v8; // [sp+Ch] [bp-40h]@1
  2129.  
  2130.   memset(&v8, -858993460, 0x40u);
  2131.   if ( !a1 )
  2132.     errorFunctionMaybe(
  2133.       (int)"a != NULL",
  2134.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2135.       word_43C174 + 1);
  2136.   if ( !a2 )
  2137.     errorFunctionMaybe(
  2138.       (int)"b != NULL",
  2139.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2140.       word_43C174 + 2);
  2141.   if ( !a3 )
  2142.     errorFunctionMaybe(
  2143.       (int)"c != NULL",
  2144.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2145.       word_43C174 + 3);
  2146.   if ( !a4 )
  2147.     errorFunctionMaybe(
  2148.       (int)"d != NULL",
  2149.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2150.       word_43C174 + 4);
  2151.   v4 = sub_420C00(a1, a2, a3, a4);
  2152.   v5 = sub_4024A0(v4);
  2153.   return _chkesp(1, v5, v7);
  2154. }
  2155. // 43C174: using guessed type __int16 word_43C174;
  2156.  
  2157. //----- (00403610) --------------------------------------------------------
  2158. int __cdecl sub_403610(int a1, int a2, int a3)
  2159. {
  2160.   int v3; // eax@7
  2161.   int v4; // eax@7
  2162.   char v6; // [sp+0h] [bp-4Ch]@0
  2163.   char v7; // [sp+Ch] [bp-40h]@1
  2164.  
  2165.   memset(&v7, -858993460, 0x40u);
  2166.   if ( !a1 )
  2167.     errorFunctionMaybe(
  2168.       (int)"a != NULL",
  2169.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2170.       word_43C178 + 1);
  2171.   if ( !a2 )
  2172.     errorFunctionMaybe(
  2173.       (int)"b != NULL",
  2174.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2175.       word_43C178 + 2);
  2176.   if ( !a3 )
  2177.     errorFunctionMaybe(
  2178.       (int)"c != NULL",
  2179.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2180.       word_43C178 + 3);
  2181.   v3 = sub_420C70(a1, a2, a3);
  2182.   v4 = sub_4024A0(v3);
  2183.   return _chkesp(1, v4, v6);
  2184. }
  2185. // 43C178: using guessed type __int16 word_43C178;
  2186.  
  2187. //----- (004036C0) --------------------------------------------------------
  2188. int __cdecl sub_4036C0(int a1, int a2, int a3)
  2189. {
  2190.   int v3; // eax@7
  2191.   int v4; // eax@7
  2192.   char v6; // [sp+0h] [bp-4Ch]@0
  2193.   char v7; // [sp+Ch] [bp-40h]@1
  2194.  
  2195.   memset(&v7, -858993460, 0x40u);
  2196.   if ( !a1 )
  2197.     errorFunctionMaybe(
  2198.       (int)"a != NULL",
  2199.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2200.       word_43C17C + 1);
  2201.   if ( !a2 )
  2202.     errorFunctionMaybe(
  2203.       (int)"b != NULL",
  2204.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2205.       word_43C17C + 2);
  2206.   if ( !a3 )
  2207.     errorFunctionMaybe(
  2208.       (int)"c != NULL",
  2209.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2210.       word_43C17C + 3);
  2211.   v3 = sub_420CE0(a1, a2, a3);
  2212.   v4 = sub_4024A0(v3);
  2213.   return _chkesp(1, v4, v6);
  2214. }
  2215. // 43C17C: using guessed type __int16 word_43C17C;
  2216.  
  2217. //----- (00403770) --------------------------------------------------------
  2218. int __cdecl sub_403770(int a1, int *a2)
  2219. {
  2220.   int v2; // eax@6
  2221.   int v3; // eax@7
  2222.   char v5; // [sp+0h] [bp-50h]@0
  2223.   char v6; // [sp+Ch] [bp-44h]@1
  2224.   int v7; // [sp+4Ch] [bp-4h]@7
  2225.  
  2226.   memset(&v6, -858993460, 0x44u);
  2227.   if ( !a1 )
  2228.     errorFunctionMaybe(
  2229.       (int)"a != NULL",
  2230.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2231.       word_43C180 + 2);
  2232.   if ( !a2 )
  2233.     errorFunctionMaybe(
  2234.       (int)"b != NULL",
  2235.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2236.       word_43C180 + 3);
  2237.   *a2 = (int)calloc(1u, 4u);
  2238.   if ( *a2 )
  2239.   {
  2240.     v3 = sub_420D30(a1, *a2);
  2241.     v7 = sub_4024A0(v3);
  2242.     if ( v7 )
  2243.       CrtCheckMemoryWrapperWrapper(*a2);
  2244.     v2 = v7;
  2245.   }
  2246.   else
  2247.   {
  2248.     v2 = 13;
  2249.   }
  2250.   return _chkesp(1, v2, v5);
  2251. }
  2252. // 43C180: using guessed type __int16 word_43C180;
  2253.  
  2254. //----- (00403840) --------------------------------------------------------
  2255. int __cdecl sub_403840(unsigned int a1, signed int *a2)
  2256. {
  2257.   int v2; // eax@5
  2258.   int v3; // eax@5
  2259.   char v5; // [sp+0h] [bp-4Ch]@0
  2260.   char v6; // [sp+Ch] [bp-40h]@1
  2261.  
  2262.   memset(&v6, -858993460, 0x40u);
  2263.   if ( !a1 )
  2264.     errorFunctionMaybe(
  2265.       (int)"a != NULL",
  2266.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2267.       word_43C184 + 1);
  2268.   if ( !a2 )
  2269.     errorFunctionMaybe(
  2270.       (int)"b != NULL",
  2271.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2272.       word_43C184 + 2);
  2273.   v2 = sub_420D90(a1, a2);
  2274.   v3 = sub_4024A0(v2);
  2275.   return _chkesp(1, v3, v5);
  2276. }
  2277. // 43C184: using guessed type __int16 word_43C184;
  2278.  
  2279. //----- (004038D0) --------------------------------------------------------
  2280. int __cdecl sub_4038D0(int a1, int a2, int *a3)
  2281. {
  2282.   int v3; // eax@7
  2283.   int v4; // eax@7
  2284.   char v6; // [sp+0h] [bp-4Ch]@0
  2285.   char v7; // [sp+Ch] [bp-40h]@1
  2286.  
  2287.   memset(&v7, -858993460, 0x40u);
  2288.   if ( !a1 )
  2289.     errorFunctionMaybe(
  2290.       (int)"a != NULL",
  2291.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2292.       word_43C188 + 1);
  2293.   if ( !a2 )
  2294.     errorFunctionMaybe(
  2295.       (int)"b != NULL",
  2296.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2297.       word_43C188 + 2);
  2298.   if ( !a3 )
  2299.     errorFunctionMaybe(
  2300.       (int)"c != NULL",
  2301.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2302.       word_43C188 + 3);
  2303.   v3 = sub_420E30(a1, a2, *a3);
  2304.   v4 = sub_4024A0(v3);
  2305.   return _chkesp(1, v4, v6);
  2306. }
  2307. // 43C188: using guessed type __int16 word_43C188;
  2308.  
  2309. //----- (00403990) --------------------------------------------------------
  2310. int __cdecl sub_403990(int a1)
  2311. {
  2312.   int v1; // eax@1
  2313.   char v3; // [sp+0h] [bp-4Ch]@0
  2314.   char v4; // [sp+Ch] [bp-40h]@1
  2315.  
  2316.   memset(&v4, -858993460, 0x40u);
  2317.   CrtCheckMemoryWrapperWrapper(a1);
  2318.   return _chkesp(1, v1, v3);
  2319. }
  2320.  
  2321. //----- (004039D0) --------------------------------------------------------
  2322. int __cdecl sub_4039D0(int a1, int a2, int a3, int a4)
  2323. {
  2324.   int v4; // eax@9
  2325.   int v5; // eax@9
  2326.   char v7; // [sp+0h] [bp-4Ch]@0
  2327.   char v8; // [sp+Ch] [bp-40h]@1
  2328.  
  2329.   memset(&v8, -858993460, 0x40u);
  2330.   if ( !a1 )
  2331.     errorFunctionMaybe(
  2332.       (int)"a != NULL",
  2333.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2334.       word_43C18C + 1);
  2335.   if ( !a2 )
  2336.     errorFunctionMaybe(
  2337.       (int)"b != NULL",
  2338.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2339.       word_43C18C + 2);
  2340.   if ( !a3 )
  2341.     errorFunctionMaybe(
  2342.       (int)"c != NULL",
  2343.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2344.       word_43C18C + 3);
  2345.   if ( !a4 )
  2346.     errorFunctionMaybe(
  2347.       (int)"d != NULL",
  2348.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2349.       word_43C18C + 4);
  2350.   v4 = sub_420FA0(a1, a2, a3, a4);
  2351.   v5 = sub_4024A0(v4);
  2352.   return _chkesp(1, v5, v7);
  2353. }
  2354. // 420FA0: using guessed type _DWORD __cdecl sub_420FA0(_DWORD, _DWORD, _DWORD, _DWORD);
  2355. // 43C18C: using guessed type __int16 word_43C18C;
  2356.  
  2357. //----- (00403AB0) --------------------------------------------------------
  2358. int __cdecl sub_403AB0(int a1, int a2)
  2359. {
  2360.   int v2; // eax@5
  2361.   char v4; // [sp+0h] [bp-50h]@0
  2362.   char v5; // [sp+Ch] [bp-44h]@1
  2363.   int v6; // [sp+4Ch] [bp-4h]@5
  2364.  
  2365.   memset(&v5, -858993460, 0x44u);
  2366.   if ( !a1 )
  2367.     errorFunctionMaybe(
  2368.       (int)"a != NULL",
  2369.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2370.       word_43C190 + 2);
  2371.   if ( !a2 )
  2372.     errorFunctionMaybe(
  2373.       (int)"b != NULL",
  2374.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\libtomcrypt-1.17\\src\\math\\ltm_desc.c",
  2375.       word_43C190 + 3);
  2376.   v2 = sub_421130(a1, 8, a2);
  2377.   v6 = sub_4024A0(v2);
  2378.   *(_DWORD *)a2 = *(_DWORD *)a2 == 1;
  2379.   return _chkesp(1, v6, v4);
  2380. }
  2381. // 43C190: using guessed type __int16 word_43C190;
  2382.  
  2383. //----- (00403B50) --------------------------------------------------------
  2384. int __cdecl tomcrypt_unregister_cipher(const void *Buf2)
  2385. {
  2386.   int v1; // eax@6
  2387.   char v3; // [sp+0h] [bp-50h]@0
  2388.   char v4; // [sp+Ch] [bp-44h]@1
  2389.   int i; // [sp+4Ch] [bp-4h]@3
  2390.  
  2391.   memset(&v4, -858993460, 0x44u);
  2392.   if ( !Buf2 )
  2393.     errorFunctionMaybe(
  2394.       (int)"cipher != NULL",
  2395.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\misc\\crypt\\crypt_unregister_cipher.c",
  2396.       word_43C194 + 3);
  2397.   for ( i = 0; i < 32; ++i )
  2398.   {
  2399.     if ( !memcmp(&dword_43F6C8[24 * i], Buf2, 0x60u) )
  2400.     {
  2401.       dword_43F6C8[24 * i] = 0;
  2402.       byte_43F6CC[96 * i] = -1;
  2403.       v1 = 0;
  2404.       return _chkesp(1, v1, v3);
  2405.     }
  2406.   }
  2407.   v1 = 1;
  2408.   return _chkesp(1, v1, v3);
  2409. }
  2410. // 43C194: using guessed type __int16 word_43C194;
  2411. // 43F6C8: using guessed type int dword_43F6C8[];
  2412.  
  2413. //----- (00403C00) --------------------------------------------------------
  2414. int __cdecl tomcrypt_ctr_decrypt(int a1, int a2, int a3, int a4)
  2415. {
  2416.   int v4; // eax@7
  2417.   char v6; // [sp+0h] [bp-4Ch]@0
  2418.   char v7; // [sp+Ch] [bp-40h]@1
  2419.  
  2420.   memset(&v7, -858993460, 0x40u);
  2421.   if ( !a2 )
  2422.     errorFunctionMaybe(
  2423.       (int)"pt != NULL",
  2424.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_decrypt.c",
  2425.       word_43C198 + 1);
  2426.   if ( !a1 )
  2427.     errorFunctionMaybe(
  2428.       (int)"ct != NULL",
  2429.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_decrypt.c",
  2430.       word_43C198 + 2);
  2431.   if ( !a4 )
  2432.     errorFunctionMaybe(
  2433.       (int)"ctr != NULL",
  2434.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_decrypt.c",
  2435.       word_43C198 + 3);
  2436.   v4 = tomcrypt_ctr_encrypt(a1, a2, a3, a4);
  2437.   return _chkesp(1, v4, v6);
  2438. }
  2439. // 403C00: using guessed type _DWORD __cdecl tomcrypt_ctr_decrypt(_DWORD, _DWORD, _DWORD, _DWORD);
  2440. // 403CB0: using guessed type _DWORD __cdecl tomcrypt_ctr_encrypt(_DWORD, _DWORD, _DWORD, _DWORD);
  2441. // 43C198: using guessed type __int16 word_43C198;
  2442.  
  2443. //----- (00403CB0) --------------------------------------------------------
  2444. int __cdecl tomcrypt_ctr_encrypt(int a1, int a2, unsigned int a3, int a4)
  2445. {
  2446.   int v4; // eax@8
  2447.   int v5; // eax@19
  2448.   int v6; // eax@34
  2449.   char v8; // [sp+0h] [bp-54h]@19
  2450.   char v9; // [sp+Ch] [bp-48h]@1
  2451.   int v10; // [sp+4Ch] [bp-8h]@7
  2452.   int i; // [sp+50h] [bp-4h]@25
  2453.   int v12; // [sp+54h] [bp+0h]@19
  2454.  
  2455.   memset(&v9, -858993460, 0x48u);
  2456.   if ( !a1 )
  2457.     errorFunctionMaybe(
  2458.       (int)"pt != NULL",
  2459.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_encrypt.c",
  2460.       word_43C19C + 3);
  2461.   if ( !a2 )
  2462.     errorFunctionMaybe(
  2463.       (int)"ct != NULL",
  2464.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_encrypt.c",
  2465.       word_43C19C + 4);
  2466.   if ( !a4 )
  2467.     errorFunctionMaybe(
  2468.       (int)"ctr != NULL",
  2469.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_encrypt.c",
  2470.       word_43C19C + 5);
  2471.   v10 = sub_40BD00(*(_DWORD *)a4);
  2472.   if ( v10 )
  2473.   {
  2474.     v4 = v10;
  2475.   }
  2476.   else
  2477.   {
  2478.     if ( *(_DWORD *)(a4 + 4) >= 1
  2479.       && *(_DWORD *)(a4 + 4) <= 128
  2480.       && *(_DWORD *)(a4 + 8) >= 0
  2481.       && *(_DWORD *)(a4 + 8) <= 128 )
  2482.     {
  2483.       if ( *(_DWORD *)(a4 + 4) % 4u )
  2484.       {
  2485.         v4 = 16;
  2486.       }
  2487.       else
  2488.       {
  2489.         if ( *(_DWORD *)(a4 + 8) == *(_DWORD *)(a4 + 4) && dword_43F708[24 * *(_DWORD *)a4] && a3 >= *(_DWORD *)(a4 + 4) )
  2490.         {
  2491.           v5 = ((int (__cdecl *)(int, int, unsigned int, int, _DWORD, int))dword_43F708[24 * *(_DWORD *)a4])(
  2492.                  a1,
  2493.                  a2,
  2494.                  a3 / *(_DWORD *)(a4 + 4),
  2495.                  a4 + 20,
  2496.                  *(_DWORD *)(a4 + 12),
  2497.                  a4 + 280);
  2498.           v10 = _chkesp(&v8 == &v8, v5, (unsigned int)&v12);
  2499.           if ( !v10 )
  2500.           {
  2501.             a3 %= *(_DWORD *)(a4 + 4);
  2502.             goto LABEL_22;
  2503.           }
  2504.           v4 = v10;
  2505.         }
  2506.         else
  2507.         {
  2508. LABEL_22:
  2509.           while ( a3 )
  2510.           {
  2511.             if ( *(_DWORD *)(a4 + 8) == *(_DWORD *)(a4 + 4) )
  2512.             {
  2513.               if ( *(_DWORD *)(a4 + 12) )
  2514.               {
  2515.                 for ( i = *(_DWORD *)(a4 + 4) - 1; ; --i )
  2516.                 {
  2517.                   if ( i >= *(_DWORD *)(a4 + 16) )
  2518.                   {
  2519.                     ++*(_BYTE *)(i + a4 + 20);
  2520.                     if ( !*(_BYTE *)(i + a4 + 20) )
  2521.                       continue;
  2522.                   }
  2523.                   break;
  2524.                 }
  2525.               }
  2526.               else
  2527.               {
  2528.                 for ( i = 0; ; ++i )
  2529.                 {
  2530.                   if ( i < *(_DWORD *)(a4 + 16) )
  2531.                   {
  2532.                     ++*(_BYTE *)(i + a4 + 20);
  2533.                     if ( !*(_BYTE *)(i + a4 + 20) )
  2534.                       continue;
  2535.                   }
  2536.                   break;
  2537.                 }
  2538.               }
  2539.               v6 = ((int (__cdecl *)(int, int, int))dword_43F6E4[24 * *(_DWORD *)a4])(a4 + 20, a4 + 148, a4 + 280);
  2540.               v10 = _chkesp(&v8 == &v8, v6, (unsigned int)&v12);
  2541.               if ( v10 )
  2542.               {
  2543.                 v4 = v10;
  2544.                 return _chkesp(1, v4, v8);
  2545.               }
  2546.               *(_DWORD *)(a4 + 8) = 0;
  2547.             }
  2548.             if ( (unsigned __int64)a3 < *(_QWORD *)(a4 + 4) )
  2549.             {
  2550.               *(_BYTE *)a2++ = *(_BYTE *)(a4 + (*(_DWORD *)(a4 + 8))++ + 148) ^ *(_BYTE *)a1++;
  2551.               --a3;
  2552.             }
  2553.             else
  2554.             {
  2555.               for ( i = 0; i < *(_DWORD *)(a4 + 4); i += 4 )
  2556.                 *(_DWORD *)(i + a2) = *(_DWORD *)(i + a4 + 148) ^ *(_DWORD *)(i + a1);
  2557.               a1 += *(_DWORD *)(a4 + 4);
  2558.               a2 += *(_DWORD *)(a4 + 4);
  2559.               a3 -= *(_DWORD *)(a4 + 4);
  2560.               *(_DWORD *)(a4 + 8) = *(_DWORD *)(a4 + 4);
  2561.             }
  2562.           }
  2563.           v4 = 0;
  2564.         }
  2565.       }
  2566.     }
  2567.     else
  2568.     {
  2569.       v4 = 16;
  2570.     }
  2571.   }
  2572.   return _chkesp(1, v4, v8);
  2573. }
  2574. // 403CB0: using guessed type _DWORD __cdecl tomcrypt_ctr_encrypt(_DWORD, _DWORD, _DWORD, _DWORD);
  2575. // 43C19C: using guessed type __int16 word_43C19C;
  2576. // 43F6E4: using guessed type int dword_43F6E4[];
  2577. // 43F708: using guessed type int dword_43F708[];
  2578.  
  2579. //----- (00404030) --------------------------------------------------------
  2580. int __cdecl tomcrypt_ctr_start(signed int a1, int a2, int a3, int a4, int a5, __int16 a6, int a7)
  2581. {
  2582.   signed int v7; // eax@8
  2583.   int v8; // eax@16
  2584.   int v9; // eax@32
  2585.   char v11; // [sp+0h] [bp-58h]@16
  2586.   char v12; // [sp+Ch] [bp-4Ch]@1
  2587.   int v13; // [sp+4Ch] [bp-Ch]@10
  2588.   int v14; // [sp+50h] [bp-8h]@7
  2589.   int i; // [sp+54h] [bp-4h]@18
  2590.   int v16; // [sp+58h] [bp+0h]@16
  2591.  
  2592.   memset(&v12, -858993460, 0x4Cu);
  2593.   if ( !a2 )
  2594.     errorFunctionMaybe(
  2595.       (int)"IV != NULL",
  2596.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_start.c",
  2597.       word_43C1A0 + 3);
  2598.   if ( !a3 )
  2599.     errorFunctionMaybe(
  2600.       (int)"key != NULL",
  2601.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_start.c",
  2602.       word_43C1A0 + 4);
  2603.   if ( !a7 )
  2604.     errorFunctionMaybe(
  2605.       (int)"ctr != NULL",
  2606.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\modes\\ctr\\ctr_start.c",
  2607.       word_43C1A0 + 5);
  2608.   v14 = sub_40BD00(a1);
  2609.   if ( v14 )
  2610.   {
  2611.     v7 = v14;
  2612.   }
  2613.   else
  2614.   {
  2615.     if ( (_BYTE)a6 )
  2616.       v13 = (unsigned __int8)a6;
  2617.     else
  2618.       v13 = dword_43F6D8[24 * a1];
  2619.     *(_DWORD *)(a7 + 16) = v13;
  2620.     if ( *(_DWORD *)(a7 + 16) <= dword_43F6D8[24 * a1] )
  2621.     {
  2622.       if ( (a6 & 0x1000) == 4096 )
  2623.         *(_DWORD *)(a7 + 16) = dword_43F6D8[24 * a1] - *(_DWORD *)(a7 + 16);
  2624.       v8 = ((int (__cdecl *)(int, int, int, int))dword_43F6E0[24 * a1])(a3, a4, a5, a7 + 280);
  2625.       v14 = _chkesp(&v11 == &v11, v8, (unsigned int)&v16);
  2626.       if ( v14 )
  2627.       {
  2628.         v7 = v14;
  2629.       }
  2630.       else
  2631.       {
  2632.         *(_DWORD *)(a7 + 4) = dword_43F6D8[24 * a1];
  2633.         *(_DWORD *)a7 = a1;
  2634.         *(_DWORD *)(a7 + 8) = 0;
  2635.         *(_DWORD *)(a7 + 12) = a6 & 0x1000;
  2636.         for ( i = 0; i < *(_DWORD *)(a7 + 4); ++i )
  2637.           *(_BYTE *)(i + a7 + 20) = *(_BYTE *)(i + a2);
  2638.         if ( a6 & 0x2000 )
  2639.         {
  2640.           if ( *(_DWORD *)(a7 + 12) )
  2641.           {
  2642.             for ( i = *(_DWORD *)(a7 + 4) - 1; ; --i )
  2643.             {
  2644.               if ( i >= *(_DWORD *)(a7 + 16) )
  2645.               {
  2646.                 ++*(_BYTE *)(i + a7 + 20);
  2647.                 if ( !*(_BYTE *)(i + a7 + 20) )
  2648.                   continue;
  2649.               }
  2650.               break;
  2651.             }
  2652.           }
  2653.           else
  2654.           {
  2655.             for ( i = 0; ; ++i )
  2656.             {
  2657.               if ( i < *(_DWORD *)(a7 + 16) )
  2658.               {
  2659.                 ++*(_BYTE *)(i + a7 + 20);
  2660.                 if ( !*(_BYTE *)(i + a7 + 20) )
  2661.                   continue;
  2662.               }
  2663.               break;
  2664.             }
  2665.           }
  2666.         }
  2667.         v9 = ((int (__cdecl *)(int, int, int))dword_43F6E4[24 * *(_DWORD *)a7])(a7 + 20, a7 + 148, a7 + 280);
  2668.         v7 = _chkesp(&v11 == &v11, v9, (unsigned int)&v16);
  2669.       }
  2670.     }
  2671.     else
  2672.     {
  2673.       v7 = 16;
  2674.     }
  2675.   }
  2676.   return _chkesp(1, v7, v11);
  2677. }
  2678. // 43C1A0: using guessed type __int16 word_43C1A0;
  2679. // 43F6D8: using guessed type int dword_43F6D8[];
  2680. // 43F6E0: using guessed type int dword_43F6E0[];
  2681. // 43F6E4: using guessed type int dword_43F6E4[];
  2682.  
  2683. //----- (004042F0) --------------------------------------------------------
  2684. int __cdecl tomcrypt_find_cypher(const char *Str2)
  2685. {
  2686.   int v1; // eax@7
  2687.   char v3; // [sp+0h] [bp-50h]@0
  2688.   char v4; // [sp+Ch] [bp-44h]@1
  2689.   int i; // [sp+4Ch] [bp-4h]@3
  2690.  
  2691.   memset(&v4, -858993460, 0x44u);
  2692.   if ( !Str2 )
  2693.     errorFunctionMaybe(
  2694.       (int)"name != NULL",
  2695.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\misc\\crypt\\crypt_find_cipher.c",
  2696.       word_43C1A4 + 2);
  2697.   for ( i = 0; i < 32; ++i )
  2698.   {
  2699.     if ( dword_43F6C8[24 * i] && !strcmp((const char *)dword_43F6C8[24 * i], Str2) )
  2700.     {
  2701.       v1 = i;
  2702.       return _chkesp(1, v1, v3);
  2703.     }
  2704.   }
  2705.   v1 = -1;
  2706.   return _chkesp(1, v1, v3);
  2707. }
  2708. // 43C1A4: using guessed type __int16 word_43C1A4;
  2709. // 43F6C8: using guessed type int dword_43F6C8[];
  2710.  
  2711. //----- (00404390) --------------------------------------------------------
  2712. int __cdecl tomcrypt_register_cipher(void *Src)
  2713. {
  2714.   int v1; // eax@7
  2715.   char v3; // [sp+0h] [bp-50h]@0
  2716.   char v4; // [sp+Ch] [bp-44h]@1
  2717.   int i; // [sp+4Ch] [bp-4h]@3
  2718.  
  2719.   memset(&v4, -858993460, 0x44u);
  2720.   if ( !Src )
  2721.     errorFunctionMaybe(
  2722.       (int)"cipher != NULL",
  2723.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\misc\\crypt\\crypt_register_cipher.c",
  2724.       word_43C1A8 + 3);
  2725.   for ( i = 0; i < 32; ++i )
  2726.   {
  2727.     if ( dword_43F6C8[24 * i] && byte_43F6CC[96 * i] == *((_BYTE *)Src + 4) )
  2728.     {
  2729.       v1 = i;
  2730.       return _chkesp(1, v1, v3);
  2731.     }
  2732.   }
  2733.   for ( i = 0; i < 32; ++i )
  2734.   {
  2735.     if ( !dword_43F6C8[24 * i] )
  2736.     {
  2737.       memcpy(&dword_43F6C8[24 * i], Src, 0x60u);
  2738.       v1 = i;
  2739.       return _chkesp(1, v1, v3);
  2740.     }
  2741.   }
  2742.   v1 = -1;
  2743.   return _chkesp(1, v1, v3);
  2744. }
  2745. // 43C1A8: using guessed type __int16 word_43C1A8;
  2746. // 43F6C8: using guessed type int dword_43F6C8[];
  2747.  
  2748. //----- (00404470) --------------------------------------------------------
  2749. int __cdecl sub_404470(int a1, signed int a2, int a3, int a4)
  2750. {
  2751.   int v4; // eax@8
  2752.   int v5; // eax@14
  2753.   int v6; // eax@19
  2754.   int v7; // eax@24
  2755.   unsigned int v8; // edx@25
  2756.   int v9; // eax@25
  2757.   char v11; // [sp+0h] [bp-60h]@0
  2758.   char v12; // [sp+Ch] [bp-54h]@1
  2759.   int v13; // [sp+4Ch] [bp-14h]@28
  2760.   int v14; // [sp+50h] [bp-10h]@12
  2761.   unsigned int v15; // [sp+54h] [bp-Ch]@14
  2762.   int v16; // [sp+58h] [bp-8h]@13
  2763.   int i; // [sp+5Ch] [bp-4h]@12
  2764.  
  2765.   memset(&v12, -858993460, 0x54u);
  2766.   if ( !a1 )
  2767.     errorFunctionMaybe(
  2768.       (int)"key != NULL",
  2769.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  2770.       word_43C1AC + 6);
  2771.   if ( !a4 )
  2772.     errorFunctionMaybe(
  2773.       (int)"skey != NULL",
  2774.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  2775.       word_43C1AC + 7);
  2776.   if ( a2 == 16 || a2 == 24 || a2 == 32 )
  2777.   {
  2778.     if ( a3 && a3 != 2 * a2 / 8 + 6 )
  2779.     {
  2780.       v4 = 4;
  2781.     }
  2782.     else
  2783.     {
  2784.       *(_DWORD *)(a4 + 480) = 2 * a2 / 8 + 6;
  2785.       i = 0;
  2786.       v14 = a4;
  2787.       *(_DWORD *)a4 = *(_BYTE *)(a1 + 3) | (*(_BYTE *)(a1 + 2) << 8) | (*(_BYTE *)(a1 + 1) << 16) | (*(_BYTE *)a1 << 24);
  2788.       *(_DWORD *)(v14 + 4) = *(_BYTE *)(a1 + 7) | (*(_BYTE *)(a1 + 6) << 8) | (*(_BYTE *)(a1 + 5) << 16) | (*(_BYTE *)(a1 + 4) << 24);
  2789.       *(_DWORD *)(v14 + 8) = *(_BYTE *)(a1 + 11) | (*(_BYTE *)(a1 + 10) << 8) | (*(_BYTE *)(a1 + 9) << 16) | (*(_BYTE *)(a1 + 8) << 24);
  2790.       *(_DWORD *)(v14 + 12) = *(_BYTE *)(a1 + 15) | (*(_BYTE *)(a1 + 14) << 8) | (*(_BYTE *)(a1 + 13) << 16) | (*(_BYTE *)(a1 + 12) << 24);
  2791.       if ( a2 == 16 )
  2792.       {
  2793.         v16 = 44;
  2794.         while ( 1 )
  2795.         {
  2796.           v15 = *(_DWORD *)(v14 + 12);
  2797.           v5 = sub_404D20(v15);
  2798.           *(_DWORD *)(v14 + 16) = dword_434C50[i] ^ v5 ^ *(_DWORD *)v14;
  2799.           *(_DWORD *)(v14 + 20) = *(_DWORD *)(v14 + 16) ^ *(_DWORD *)(v14 + 4);
  2800.           *(_DWORD *)(v14 + 24) = *(_DWORD *)(v14 + 20) ^ *(_DWORD *)(v14 + 8);
  2801.           *(_DWORD *)(v14 + 28) = *(_DWORD *)(v14 + 24) ^ *(_DWORD *)(v14 + 12);
  2802.           ++i;
  2803.           if ( i == 10 )
  2804.             break;
  2805.           v14 += 16;
  2806.         }
  2807.       }
  2808.       else
  2809.       {
  2810.         if ( a2 == 24 )
  2811.         {
  2812.           v16 = 52;
  2813.           *(_DWORD *)(v14 + 16) = *(_BYTE *)(a1 + 19) | (*(_BYTE *)(a1 + 18) << 8) | (*(_BYTE *)(a1 + 17) << 16) | (*(_BYTE *)(a1 + 16) << 24);
  2814.           *(_DWORD *)(v14 + 20) = *(_BYTE *)(a1 + 23) | (*(_BYTE *)(a1 + 22) << 8) | (*(_BYTE *)(a1 + 21) << 16) | (*(_BYTE *)(a1 + 20) << 24);
  2815.           while ( 1 )
  2816.           {
  2817.             v15 = *(_DWORD *)(a4 + 4 * ((v14 - a4) >> 2) + 20);
  2818.             v6 = sub_404D20(v15);
  2819.             *(_DWORD *)(v14 + 24) = dword_434C50[i] ^ v6 ^ *(_DWORD *)v14;
  2820.             *(_DWORD *)(v14 + 28) = *(_DWORD *)(v14 + 24) ^ *(_DWORD *)(v14 + 4);
  2821.             *(_DWORD *)(v14 + 32) = *(_DWORD *)(v14 + 28) ^ *(_DWORD *)(v14 + 8);
  2822.             *(_DWORD *)(v14 + 36) = *(_DWORD *)(v14 + 32) ^ *(_DWORD *)(v14 + 12);
  2823.             ++i;
  2824.             if ( i == 8 )
  2825.               break;
  2826.             *(_DWORD *)(v14 + 40) = *(_DWORD *)(v14 + 36) ^ *(_DWORD *)(v14 + 16);
  2827.             *(_DWORD *)(v14 + 44) = *(_DWORD *)(v14 + 40) ^ *(_DWORD *)(v14 + 20);
  2828.             v14 += 24;
  2829.           }
  2830.         }
  2831.         else
  2832.         {
  2833.           if ( a2 != 32 )
  2834.           {
  2835.             v4 = 1;
  2836.             return _chkesp(1, v4, v11);
  2837.           }
  2838.           v16 = 60;
  2839.           *(_DWORD *)(v14 + 16) = *(_BYTE *)(a1 + 19) | (*(_BYTE *)(a1 + 18) << 8) | (*(_BYTE *)(a1 + 17) << 16) | (*(_BYTE *)(a1 + 16) << 24);
  2840.           *(_DWORD *)(v14 + 20) = *(_BYTE *)(a1 + 23) | (*(_BYTE *)(a1 + 22) << 8) | (*(_BYTE *)(a1 + 21) << 16) | (*(_BYTE *)(a1 + 20) << 24);
  2841.           *(_DWORD *)(v14 + 24) = *(_BYTE *)(a1 + 27) | (*(_BYTE *)(a1 + 26) << 8) | (*(_BYTE *)(a1 + 25) << 16) | (*(_BYTE *)(a1 + 24) << 24);
  2842.           *(_DWORD *)(v14 + 28) = *(_BYTE *)(a1 + 31) | (*(_BYTE *)(a1 + 30) << 8) | (*(_BYTE *)(a1 + 29) << 16) | (*(_BYTE *)(a1 + 28) << 24);
  2843.           while ( 1 )
  2844.           {
  2845.             v15 = *(_DWORD *)(a4 + 4 * ((v14 - a4) >> 2) + 28);
  2846.             v7 = sub_404D20(v15);
  2847.             *(_DWORD *)(v14 + 32) = dword_434C50[i] ^ v7 ^ *(_DWORD *)v14;
  2848.             *(_DWORD *)(v14 + 36) = *(_DWORD *)(v14 + 32) ^ *(_DWORD *)(v14 + 4);
  2849.             *(_DWORD *)(v14 + 40) = *(_DWORD *)(v14 + 36) ^ *(_DWORD *)(v14 + 8);
  2850.             *(_DWORD *)(v14 + 44) = *(_DWORD *)(v14 + 40) ^ *(_DWORD *)(v14 + 12);
  2851.             ++i;
  2852.             if ( i == 7 )
  2853.               break;
  2854.             v15 = *(_DWORD *)(v14 + 44);
  2855.             v8 = __ROR__(v15, 8);
  2856.             v9 = sub_404D20(v8);
  2857.             *(_DWORD *)(v14 + 48) = v9 ^ *(_DWORD *)(v14 + 16);
  2858.             *(_DWORD *)(v14 + 52) = *(_DWORD *)(v14 + 48) ^ *(_DWORD *)(v14 + 20);
  2859.             *(_DWORD *)(v14 + 56) = *(_DWORD *)(v14 + 52) ^ *(_DWORD *)(v14 + 24);
  2860.             *(_DWORD *)(v14 + 60) = *(_DWORD *)(v14 + 56) ^ *(_DWORD *)(v14 + 28);
  2861.             v14 += 32;
  2862.           }
  2863.         }
  2864.       }
  2865.       v14 = a4 + 240;
  2866.       v13 = a4 + 4 * v16 - 16;
  2867.       *(_DWORD *)(a4 + 240) = *(_DWORD *)(a4 + 4 * v16 - 16);
  2868.       v14 += 4;
  2869.       v13 += 4;
  2870.       *(_DWORD *)v14 = *(_DWORD *)v13;
  2871.       v14 += 4;
  2872.       v13 += 4;
  2873.       *(_DWORD *)v14 = *(_DWORD *)v13;
  2874.       v14 += 4;
  2875.       v13 += 4;
  2876.       *(_DWORD *)v14 = *(_DWORD *)v13;
  2877.       v14 -= 12;
  2878.       v13 -= 12;
  2879.       for ( i = 1; i < *(_DWORD *)(a4 + 480); ++i )
  2880.       {
  2881.         v13 -= 16;
  2882.         v14 += 16;
  2883.         v15 = *(_DWORD *)v13;
  2884.         *(_DWORD *)v14 = dword_434850[(unsigned __int8)v15] ^ dword_434450[(unsigned __int16)v15 >> 8] ^ dword_434050[(v15 >> 16) & 0xFF] ^ dword_433C50[v15 >> 24];
  2885.         v15 = *(_DWORD *)(v13 + 4);
  2886.         *(_DWORD *)(v14 + 4) = dword_434850[(unsigned __int8)v15] ^ dword_434450[(unsigned __int16)v15 >> 8] ^ dword_434050[(v15 >> 16) & 0xFF] ^ dword_433C50[v15 >> 24];
  2887.         v15 = *(_DWORD *)(v13 + 8);
  2888.         *(_DWORD *)(v14 + 8) = dword_434850[(unsigned __int8)v15] ^ dword_434450[(unsigned __int16)v15 >> 8] ^ dword_434050[(v15 >> 16) & 0xFF] ^ dword_433C50[v15 >> 24];
  2889.         v15 = *(_DWORD *)(v13 + 12);
  2890.         *(_DWORD *)(v14 + 12) = dword_434850[(unsigned __int8)v15] ^ dword_434450[(unsigned __int16)v15 >> 8] ^ dword_434050[(v15 >> 16) & 0xFF] ^ dword_433C50[v15 >> 24];
  2891.       }
  2892.       v13 -= 16;
  2893.       v14 += 16;
  2894.       *(_DWORD *)v14 = *(_DWORD *)v13;
  2895.       v14 += 4;
  2896.       v13 += 4;
  2897.       *(_DWORD *)v14 = *(_DWORD *)v13;
  2898.       v14 += 4;
  2899.       v13 += 4;
  2900.       *(_DWORD *)v14 = *(_DWORD *)v13;
  2901.       v14 += 4;
  2902.       v13 += 4;
  2903.       *(_DWORD *)v14 = *(_DWORD *)v13;
  2904.       v4 = 0;
  2905.     }
  2906.   }
  2907.   else
  2908.   {
  2909.     v4 = 3;
  2910.   }
  2911.   return _chkesp(1, v4, v11);
  2912. }
  2913. // 433C50: using guessed type int dword_433C50[];
  2914. // 434050: using guessed type int dword_434050[];
  2915. // 434450: using guessed type int dword_434450[];
  2916. // 434850: using guessed type int dword_434850[];
  2917. // 434C50: using guessed type int dword_434C50[];
  2918. // 43C1AC: using guessed type __int16 word_43C1AC;
  2919.  
  2920. //----- (00404D20) --------------------------------------------------------
  2921. int __cdecl sub_404D20(unsigned int a1)
  2922. {
  2923.   char v2; // [sp+Ch] [bp-40h]@1
  2924.  
  2925.   memset(&v2, -858993460, 0x40u);
  2926.   return dword_432050[a1 >> 24] ^ dword_432450[(unsigned __int8)a1] ^ dword_432850[(unsigned __int16)a1 >> 8] ^ dword_432C50[(a1 >> 16) & 0xFF];
  2927. }
  2928. // 432050: using guessed type int dword_432050[];
  2929. // 432450: using guessed type int dword_432450[];
  2930. // 432850: using guessed type int dword_432850[];
  2931. // 432C50: using guessed type int dword_432C50[];
  2932.  
  2933. //----- (00404D90) --------------------------------------------------------
  2934. int __cdecl sub_404D90(int a1, int a2, int a3)
  2935. {
  2936.   char v4; // [sp+0h] [bp-78h]@0
  2937.   char v5; // [sp+Ch] [bp-6Ch]@1
  2938.   int v6; // [sp+4Ch] [bp-2Ch]@7
  2939.   int v7; // [sp+50h] [bp-28h]@7
  2940.   int v8; // [sp+54h] [bp-24h]@7
  2941.   int v9; // [sp+58h] [bp-20h]@8
  2942.   int v10; // [sp+5Ch] [bp-1Ch]@8
  2943.   int v11; // [sp+60h] [bp-18h]@8
  2944.   int v12; // [sp+64h] [bp-14h]@8
  2945.   int v13; // [sp+68h] [bp-10h]@7
  2946.   int v14; // [sp+6Ch] [bp-Ch]@7
  2947.   int v15; // [sp+70h] [bp-8h]@7
  2948.   int v16; // [sp+74h] [bp-4h]@7
  2949.  
  2950.   memset(&v5, -858993460, 0x6Cu);
  2951.   if ( !a1 )
  2952.     errorFunctionMaybe(
  2953.       (int)"pt != NULL",
  2954.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  2955.       word_43C1B0 + 4);
  2956.   if ( !a2 )
  2957.     errorFunctionMaybe(
  2958.       (int)"ct != NULL",
  2959.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  2960.       word_43C1B0 + 5);
  2961.   if ( !a3 )
  2962.     errorFunctionMaybe(
  2963.       (int)"skey != NULL",
  2964.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  2965.       word_43C1B0 + 6);
  2966.   v7 = *(_DWORD *)(a3 + 480);
  2967.   v8 = a3;
  2968.   v16 = *(_BYTE *)(a1 + 3) | (*(_BYTE *)(a1 + 2) << 8) | (*(_BYTE *)(a1 + 1) << 16) | (*(_BYTE *)a1 << 24);
  2969.   v16 ^= *(_DWORD *)a3;
  2970.   v15 = *(_BYTE *)(a1 + 7) | (*(_BYTE *)(a1 + 6) << 8) | (*(_BYTE *)(a1 + 5) << 16) | (*(_BYTE *)(a1 + 4) << 24);
  2971.   v15 ^= *(_DWORD *)(a3 + 4);
  2972.   v14 = *(_BYTE *)(a1 + 11) | (*(_BYTE *)(a1 + 10) << 8) | (*(_BYTE *)(a1 + 9) << 16) | (*(_BYTE *)(a1 + 8) << 24);
  2973.   v14 ^= *(_DWORD *)(a3 + 8);
  2974.   v13 = *(_BYTE *)(a1 + 15) | (*(_BYTE *)(a1 + 14) << 8) | (*(_BYTE *)(a1 + 13) << 16) | (*(_BYTE *)(a1 + 12) << 24);
  2975.   v13 ^= *(_DWORD *)(a3 + 12);
  2976.   v6 = v7 >> 1;
  2977.   while ( 1 )
  2978.   {
  2979.     v12 = *(_DWORD *)(v8 + 16) ^ dword_431C50[(unsigned __int8)v13] ^ dword_431850[(unsigned __int16)v14 >> 8] ^ dword_431450[((unsigned int)v15 >> 16) & 0xFF] ^ dword_430450[(unsigned int)v16 >> 24];
  2980.     v11 = *(_DWORD *)(v8 + 20) ^ dword_431C50[(unsigned __int8)v16] ^ dword_431850[(unsigned __int16)v13 >> 8] ^ dword_431450[((unsigned int)v14 >> 16) & 0xFF] ^ dword_430450[(unsigned int)v15 >> 24];
  2981.     v10 = *(_DWORD *)(v8 + 24) ^ dword_431C50[(unsigned __int8)v15] ^ dword_431850[(unsigned __int16)v16 >> 8] ^ dword_431450[((unsigned int)v13 >> 16) & 0xFF] ^ dword_430450[(unsigned int)v14 >> 24];
  2982.     v9 = *(_DWORD *)(v8 + 28) ^ dword_431C50[(unsigned __int8)v14] ^ dword_431850[(unsigned __int16)v15 >> 8] ^ dword_431450[((unsigned int)v16 >> 16) & 0xFF] ^ dword_430450[(unsigned int)v13 >> 24];
  2983.     v8 += 32;
  2984.     --v6;
  2985.     if ( !v6 )
  2986.       break;
  2987.     v16 = *(_DWORD *)v8 ^ dword_431C50[(unsigned __int8)v9] ^ dword_431850[(unsigned __int16)v10 >> 8] ^ dword_431450[((unsigned int)v11 >> 16) & 0xFF] ^ dword_430450[(unsigned int)v12 >> 24];
  2988.     v15 = *(_DWORD *)(v8 + 4) ^ dword_431C50[(unsigned __int8)v12] ^ dword_431850[(unsigned __int16)v9 >> 8] ^ dword_431450[((unsigned int)v10 >> 16) & 0xFF] ^ dword_430450[(unsigned int)v11 >> 24];
  2989.     v14 = *(_DWORD *)(v8 + 8) ^ dword_431C50[(unsigned __int8)v11] ^ dword_431850[(unsigned __int16)v12 >> 8] ^ dword_431450[((unsigned int)v9 >> 16) & 0xFF] ^ dword_430450[(unsigned int)v10 >> 24];
  2990.     v13 = *(_DWORD *)(v8 + 12) ^ dword_431C50[(unsigned __int8)v10] ^ dword_431850[(unsigned __int16)v11 >> 8] ^ dword_431450[((unsigned int)v12 >> 16) & 0xFF] ^ dword_430450[(unsigned int)v9 >> 24];
  2991.   }
  2992.   v16 = *(_DWORD *)v8 ^ dword_432050[(unsigned __int8)v9] ^ dword_432450[(unsigned __int16)v10 >> 8] ^ dword_432850[((unsigned int)v11 >> 16) & 0xFF] ^ dword_432C50[(unsigned int)v12 >> 24];
  2993.   *(_BYTE *)a2 = BYTE3(v16);
  2994.   *(_BYTE *)(a2 + 1) = (unsigned int)v16 >> 16;
  2995.   *(_BYTE *)(a2 + 2) = BYTE1(v16);
  2996.   *(_BYTE *)(a2 + 3) = v16;
  2997.   v15 = *(_DWORD *)(v8 + 4) ^ dword_432050[(unsigned __int8)v12] ^ dword_432450[(unsigned __int16)v9 >> 8] ^ dword_432850[((unsigned int)v10 >> 16) & 0xFF] ^ dword_432C50[(unsigned int)v11 >> 24];
  2998.   *(_BYTE *)(a2 + 4) = BYTE3(v15);
  2999.   *(_BYTE *)(a2 + 5) = (unsigned int)v15 >> 16;
  3000.   *(_BYTE *)(a2 + 6) = BYTE1(v15);
  3001.   *(_BYTE *)(a2 + 7) = v15;
  3002.   v14 = *(_DWORD *)(v8 + 8) ^ dword_432050[(unsigned __int8)v11] ^ dword_432450[(unsigned __int16)v12 >> 8] ^ dword_432850[((unsigned int)v9 >> 16) & 0xFF] ^ dword_432C50[(unsigned int)v10 >> 24];
  3003.   *(_BYTE *)(a2 + 8) = BYTE3(v14);
  3004.   *(_BYTE *)(a2 + 9) = (unsigned int)v14 >> 16;
  3005.   *(_BYTE *)(a2 + 10) = BYTE1(v14);
  3006.   *(_BYTE *)(a2 + 11) = v14;
  3007.   v13 = *(_DWORD *)(v8 + 12) ^ dword_432050[(unsigned __int8)v10] ^ dword_432450[(unsigned __int16)v11 >> 8] ^ dword_432850[((unsigned int)v12 >> 16) & 0xFF] ^ dword_432C50[(unsigned int)v9 >> 24];
  3008.   *(_BYTE *)(a2 + 12) = BYTE3(v13);
  3009.   *(_BYTE *)(a2 + 13) = (unsigned int)v13 >> 16;
  3010.   *(_BYTE *)(a2 + 14) = BYTE1(v13);
  3011.   *(_BYTE *)(a2 + 15) = v13;
  3012.   return _chkesp(1, 0, v4);
  3013. }
  3014. // 430450: using guessed type int dword_430450[];
  3015. // 431450: using guessed type int dword_431450[];
  3016. // 431850: using guessed type int dword_431850[];
  3017. // 431C50: using guessed type int dword_431C50[];
  3018. // 432050: using guessed type int dword_432050[];
  3019. // 432450: using guessed type int dword_432450[];
  3020. // 432850: using guessed type int dword_432850[];
  3021. // 432C50: using guessed type int dword_432C50[];
  3022. // 43C1B0: using guessed type __int16 word_43C1B0;
  3023.  
  3024. //----- (00405480) --------------------------------------------------------
  3025. int __cdecl sub_405480(int a1, int a2, int a3)
  3026. {
  3027.   int v3; // edx@10
  3028.   int v4; // ecx@10
  3029.   int v5; // eax@10
  3030.   int v6; // edx@10
  3031.   char v8; // [sp+0h] [bp-78h]@0
  3032.   char v9; // [sp+Ch] [bp-6Ch]@1
  3033.   int v10; // [sp+4Ch] [bp-2Ch]@7
  3034.   int v11; // [sp+50h] [bp-28h]@7
  3035.   int v12; // [sp+54h] [bp-24h]@7
  3036.   int v13; // [sp+58h] [bp-20h]@8
  3037.   int v14; // [sp+5Ch] [bp-1Ch]@8
  3038.   int v15; // [sp+60h] [bp-18h]@8
  3039.   int v16; // [sp+64h] [bp-14h]@8
  3040.   int v17; // [sp+68h] [bp-10h]@7
  3041.   int v18; // [sp+6Ch] [bp-Ch]@7
  3042.   int v19; // [sp+70h] [bp-8h]@7
  3043.   int v20; // [sp+74h] [bp-4h]@7
  3044.  
  3045.   memset(&v9, -858993460, 0x6Cu);
  3046.   if ( !a2 )
  3047.     errorFunctionMaybe(
  3048.       (int)"pt != NULL",
  3049.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  3050.       word_43C1B4 + 4);
  3051.   if ( !a1 )
  3052.     errorFunctionMaybe(
  3053.       (int)"ct != NULL",
  3054.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  3055.       word_43C1B4 + 5);
  3056.   if ( !a3 )
  3057.     errorFunctionMaybe(
  3058.       (int)"skey != NULL",
  3059.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  3060.       word_43C1B4 + 6);
  3061.   v11 = *(_DWORD *)(a3 + 480);
  3062.   v12 = a3 + 240;
  3063.   v20 = *(_BYTE *)(a1 + 3) | (*(_BYTE *)(a1 + 2) << 8) | (*(_BYTE *)(a1 + 1) << 16) | (*(_BYTE *)a1 << 24);
  3064.   v20 ^= *(_DWORD *)(a3 + 240);
  3065.   v19 = *(_BYTE *)(a1 + 7) | (*(_BYTE *)(a1 + 6) << 8) | (*(_BYTE *)(a1 + 5) << 16) | (*(_BYTE *)(a1 + 4) << 24);
  3066.   v19 ^= *(_DWORD *)(a3 + 244);
  3067.   v18 = *(_BYTE *)(a1 + 11) | (*(_BYTE *)(a1 + 10) << 8) | (*(_BYTE *)(a1 + 9) << 16) | (*(_BYTE *)(a1 + 8) << 24);
  3068.   v18 ^= *(_DWORD *)(a3 + 248);
  3069.   v17 = *(_BYTE *)(a1 + 15) | (*(_BYTE *)(a1 + 14) << 8) | (*(_BYTE *)(a1 + 13) << 16) | (*(_BYTE *)(a1 + 12) << 24);
  3070.   v17 ^= *(_DWORD *)(a3 + 252);
  3071.   v10 = v11 >> 1;
  3072.   while ( 1 )
  3073.   {
  3074.     v16 = *(_DWORD *)(v12 + 16) ^ dword_433850[(unsigned __int8)v19] ^ dword_433450[(unsigned __int16)v18 >> 8] ^ dword_433050[((unsigned int)v17 >> 16) & 0xFF] ^ dword_430C50[(unsigned int)v20 >> 24];
  3075.     v15 = *(_DWORD *)(v12 + 20) ^ dword_433850[(unsigned __int8)v18] ^ dword_433450[(unsigned __int16)v17 >> 8] ^ dword_433050[((unsigned int)v20 >> 16) & 0xFF] ^ dword_430C50[(unsigned int)v19 >> 24];
  3076.     v14 = *(_DWORD *)(v12 + 24) ^ dword_433850[(unsigned __int8)v17] ^ dword_433450[(unsigned __int16)v20 >> 8] ^ dword_433050[((unsigned int)v19 >> 16) & 0xFF] ^ dword_430C50[(unsigned int)v18 >> 24];
  3077.     v13 = *(_DWORD *)(v12 + 28) ^ dword_433850[(unsigned __int8)v20] ^ dword_433450[(unsigned __int16)v19 >> 8] ^ dword_433050[((unsigned int)v18 >> 16) & 0xFF] ^ dword_430C50[(unsigned int)v17 >> 24];
  3078.     v12 += 32;
  3079.     --v10;
  3080.     if ( !v10 )
  3081.       break;
  3082.     v20 = *(_DWORD *)v12 ^ dword_433850[(unsigned __int8)v15] ^ dword_433450[(unsigned __int16)v14 >> 8] ^ dword_433050[((unsigned int)v13 >> 16) & 0xFF] ^ dword_430C50[(unsigned int)v16 >> 24];
  3083.     v19 = *(_DWORD *)(v12 + 4) ^ dword_433850[(unsigned __int8)v14] ^ dword_433450[(unsigned __int16)v13 >> 8] ^ dword_433050[((unsigned int)v16 >> 16) & 0xFF] ^ dword_430C50[(unsigned int)v15 >> 24];
  3084.     v18 = *(_DWORD *)(v12 + 8) ^ dword_433850[(unsigned __int8)v13] ^ dword_433450[(unsigned __int16)v16 >> 8] ^ dword_433050[((unsigned int)v15 >> 16) & 0xFF] ^ dword_430C50[(unsigned int)v14 >> 24];
  3085.     v17 = *(_DWORD *)(v12 + 12) ^ dword_433850[(unsigned __int8)v16] ^ dword_433450[(unsigned __int16)v15 >> 8] ^ dword_433050[((unsigned int)v14 >> 16) & 0xFF] ^ dword_430C50[(unsigned int)v13 >> 24];
  3086.   }
  3087.   v3 = dword_431050[((unsigned int)v13 >> 16) & 0xFF];
  3088.   v20 = *(_DWORD *)v12 ^ dword_431050[(unsigned __int8)v15] & 0xFF ^ dword_431050[(unsigned __int16)v14 >> 8] & 0xFF00 ^ v3 & 0xFF0000 ^ dword_431050[(unsigned int)v16 >> 24] & 0xFF000000;
  3089.   *(_BYTE *)a2 = BYTE3(v20);
  3090.   *(_BYTE *)(a2 + 1) = (unsigned int)v20 >> 16;
  3091.   *(_BYTE *)(a2 + 2) = BYTE1(v20);
  3092.   *(_BYTE *)(a2 + 3) = v20;
  3093.   v4 = dword_431050[((unsigned int)v16 >> 16) & 0xFF];
  3094.   v19 = *(_DWORD *)(v12 + 4) ^ dword_431050[(unsigned __int8)v14] & 0xFF ^ dword_431050[(unsigned __int16)v13 >> 8] & 0xFF00 ^ v4 & 0xFF0000 ^ dword_431050[(unsigned int)v15 >> 24] & 0xFF000000;
  3095.   *(_BYTE *)(a2 + 4) = BYTE3(v19);
  3096.   *(_BYTE *)(a2 + 5) = (unsigned int)v19 >> 16;
  3097.   *(_BYTE *)(a2 + 6) = BYTE1(v19);
  3098.   *(_BYTE *)(a2 + 7) = v19;
  3099.   v5 = dword_431050[((unsigned int)v15 >> 16) & 0xFF];
  3100.   v18 = *(_DWORD *)(v12 + 8) ^ dword_431050[(unsigned __int8)v13] & 0xFF ^ dword_431050[(unsigned __int16)v16 >> 8] & 0xFF00 ^ v5 & 0xFF0000 ^ dword_431050[(unsigned int)v14 >> 24] & 0xFF000000;
  3101.   *(_BYTE *)(a2 + 8) = BYTE3(v18);
  3102.   *(_BYTE *)(a2 + 9) = (unsigned int)v18 >> 16;
  3103.   *(_BYTE *)(a2 + 10) = BYTE1(v18);
  3104.   *(_BYTE *)(a2 + 11) = v18;
  3105.   v6 = dword_431050[((unsigned int)v14 >> 16) & 0xFF];
  3106.   v17 = *(_DWORD *)(v12 + 12) ^ dword_431050[(unsigned __int8)v16] & 0xFF ^ dword_431050[(unsigned __int16)v15 >> 8] & 0xFF00 ^ v6 & 0xFF0000 ^ dword_431050[(unsigned int)v13 >> 24] & 0xFF000000;
  3107.   *(_BYTE *)(a2 + 12) = BYTE3(v17);
  3108.   *(_BYTE *)(a2 + 13) = (unsigned int)v17 >> 16;
  3109.   *(_BYTE *)(a2 + 14) = BYTE1(v17);
  3110.   *(_BYTE *)(a2 + 15) = v17;
  3111.   return _chkesp(1, 0, v8);
  3112. }
  3113. // 430C50: using guessed type int dword_430C50[];
  3114. // 431050: using guessed type int dword_431050[];
  3115. // 433050: using guessed type int dword_433050[];
  3116. // 433450: using guessed type int dword_433450[];
  3117. // 433850: using guessed type int dword_433850[];
  3118. // 43C1B4: using guessed type __int16 word_43C1B4;
  3119.  
  3120. //----- (00405BF0) --------------------------------------------------------
  3121. int __cdecl sub_405BF0()
  3122. {
  3123.   int v0; // eax@4
  3124.   char v2; // [sp+0h] [bp-1118h]@0
  3125.   char v3; // [sp+Ch] [bp-110Ch]@1
  3126.   int j; // [sp+4Ch] [bp-10CCh]@8
  3127.   int i; // [sp+50h] [bp-10C8h]@1
  3128.   char Buf1[16]; // [sp+54h] [bp-10C4h]@5
  3129.   char v7; // [sp+64h] [bp-10B4h]@5
  3130.   char v8; // [sp+74h] [bp-10A4h]@3
  3131.   int v9; // [sp+1114h] [bp-4h]@3
  3132.  
  3133.   memset(&v3, -858993460, 0x110Cu);
  3134.   for ( i = 0; i < 3; ++i )
  3135.   {
  3136.     sub_40BD50((int)&v8, 4256);
  3137.     v9 = sub_404470((int)((char *)&unk_434C7C + 68 * i), dword_434C78[17 * i], 0, (int)&v8);
  3138.     if ( v9 )
  3139.     {
  3140.       v0 = v9;
  3141.       return _chkesp(1, v0, v2);
  3142.     }
  3143.     sub_404D90((int)((char *)&unk_434C9C + 68 * i), (int)Buf1, (int)&v8);
  3144.     sub_405480((int)Buf1, (int)&v7, (int)&v8);
  3145.     if ( memcmp(Buf1, (char *)&unk_434CAC + 68 * i, 0x10u) || memcmp(&v7, (char *)&unk_434C9C + 68 * i, 0x10u) )
  3146.     {
  3147.       v0 = 5;
  3148.       return _chkesp(1, v0, v2);
  3149.     }
  3150.     for ( j = 0; j < 16; ++j )
  3151.       Buf1[j] = 0;
  3152.     for ( j = 0; j < 1000; ++j )
  3153.       sub_404D90((int)Buf1, (int)Buf1, (int)&v8);
  3154.     for ( j = 0; j < 1000; ++j )
  3155.       sub_405480((int)Buf1, (int)Buf1, (int)&v8);
  3156.     for ( j = 0; j < 16; ++j )
  3157.     {
  3158.       if ( Buf1[j] )
  3159.       {
  3160.         v0 = 5;
  3161.         return _chkesp(1, v0, v2);
  3162.       }
  3163.     }
  3164.   }
  3165.   v0 = 0;
  3166.   return _chkesp(1, v0, v2);
  3167. }
  3168. // 434C78: using guessed type int dword_434C78[];
  3169. // 405BF0: using guessed type char Buf1[16];
  3170.  
  3171. //----- (00405E50) --------------------------------------------------------
  3172. signed int __cdecl sub_405E50()
  3173. {
  3174.   return -858993460;
  3175. }
  3176.  
  3177. //----- (00405E70) --------------------------------------------------------
  3178. int __cdecl sub_405E70(int a1)
  3179. {
  3180.   int v1; // eax@4
  3181.   char v3; // [sp+0h] [bp-4Ch]@0
  3182.   char v4; // [sp+Ch] [bp-40h]@1
  3183.  
  3184.   memset(&v4, -858993460, 0x40u);
  3185.   if ( !a1 )
  3186.     errorFunctionMaybe(
  3187.       (int)"keysize != NULL",
  3188.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\ciphers\\aes\\aes.c",
  3189.       word_43C1B8 + 1);
  3190.   if ( *(_DWORD *)a1 >= 16 )
  3191.   {
  3192.     if ( *(_DWORD *)a1 >= 24 )
  3193.     {
  3194.       if ( *(_DWORD *)a1 >= 32 )
  3195.       {
  3196.         *(_DWORD *)a1 = 32;
  3197.         v1 = 0;
  3198.       }
  3199.       else
  3200.       {
  3201.         *(_DWORD *)a1 = 24;
  3202.         v1 = 0;
  3203.       }
  3204.     }
  3205.     else
  3206.     {
  3207.       *(_DWORD *)a1 = 16;
  3208.       v1 = 0;
  3209.     }
  3210.   }
  3211.   else
  3212.   {
  3213.     v1 = 3;
  3214.   }
  3215.   return _chkesp(1, v1, v3);
  3216. }
  3217. // 43C1B8: using guessed type __int16 word_43C1B8;
  3218.  
  3219. //----- (00405F00) --------------------------------------------------------
  3220. int __cdecl tomcrypt_unregister_hash(const void *Buf2)
  3221. {
  3222.   int v1; // eax@6
  3223.   char v3; // [sp+0h] [bp-50h]@0
  3224.   char v4; // [sp+Ch] [bp-44h]@1
  3225.   int i; // [sp+4Ch] [bp-4h]@3
  3226.  
  3227.   memset(&v4, -858993460, 0x44u);
  3228.   if ( !Buf2 )
  3229.     errorFunctionMaybe(
  3230.       (int)"hash != NULL",
  3231.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\misc\\crypt\\crypt_unregister_hash.c",
  3232.       word_43C1BC + 3);
  3233.   for ( i = 0; i < 32; ++i )
  3234.   {
  3235.     if ( !memcmp(&dword_4402C8[26 * i], Buf2, 0x68u) )
  3236.     {
  3237.       dword_4402C8[26 * i] = 0;
  3238.       v1 = 0;
  3239.       return _chkesp(1, v1, v3);
  3240.     }
  3241.   }
  3242.   v1 = 1;
  3243.   return _chkesp(1, v1, v3);
  3244. }
  3245. // 43C1BC: using guessed type __int16 word_43C1BC;
  3246. // 4402C8: using guessed type int dword_4402C8[];
  3247.  
  3248. //----- (00405FA0) --------------------------------------------------------
  3249. int __cdecl tomcrypt_ecc_decrypt_key(int a1, int a2, int a3, int a4, int a5)
  3250. {
  3251.   int v5; // eax@10
  3252.   char v7; // [sp+0h] [bp-17Ch]@0
  3253.   char v8; // [sp+Ch] [bp-170h]@1
  3254.   char *v9; // [sp+4Ch] [bp-130h]@25
  3255.   int v10; // [sp+50h] [bp-12Ch]@25
  3256.   char *v11; // [sp+54h] [bp-128h]@25
  3257.   int v12; // [sp+58h] [bp-124h]@25
  3258.   char *v13; // [sp+5Ch] [bp-120h]@11
  3259.   int v14; // [sp+60h] [bp-11Ch]@11
  3260.   char v15; // [sp+64h] [bp-118h]@11
  3261.   char *v16; // [sp+68h] [bp-114h]@11
  3262.   int v17; // [sp+6Ch] [bp-110h]@11
  3263.   int v18; // [sp+70h] [bp-10Ch]@11
  3264.   signed int v19; // [sp+84h] [bp-F8h]@25
  3265.   int v20; // [sp+88h] [bp-F4h]@25
  3266.   int v21; // [sp+8Ch] [bp-F0h]@25
  3267.   int v22; // [sp+90h] [bp-ECh]@25
  3268.   signed int v23; // [sp+A4h] [bp-D8h]@25
  3269.   int v24; // [sp+A8h] [bp-D4h]@25
  3270.   unsigned int v25; // [sp+ACh] [bp-D0h]@25
  3271.   int v26; // [sp+B0h] [bp-CCh]@25
  3272.   char pubkey; // [sp+C4h] [bp-B8h]@26
  3273.   int err; // [sp+E0h] [bp-9Ch]@11
  3274.   int hash; // [sp+E4h] [bp-98h]@13
  3275.   char Buf2; // [sp+E8h] [bp-94h]@11
  3276.   unsigned int y; // [sp+168h] [bp-14h]@29
  3277.   int i; // [sp+16Ch] [bp-10h]@27
  3278.   int pub_expt; // [sp+170h] [bp-Ch]@15
  3279.   int skey; // [sp+174h] [bp-8h]@15
  3280.   int ecc_shared; // [sp+178h] [bp-4h]@15
  3281.  
  3282.   memset(&v8, -858993460, 0x170u);
  3283.   if ( !a1 )
  3284.     errorFunctionMaybe(
  3285.       (int)"in != NULL",
  3286.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_decrypt_key.c",
  3287.       word_43C1C0 + 7);
  3288.   if ( !a3 )
  3289.     errorFunctionMaybe(
  3290.       (int)"out != NULL",
  3291.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_decrypt_key.c",
  3292.       word_43C1C0 + 8);
  3293.   if ( !a4 )
  3294.     errorFunctionMaybe(
  3295.       (int)"outlen != NULL",
  3296.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_decrypt_key.c",
  3297.       word_43C1C0 + 9);
  3298.   if ( !a5 )
  3299.     errorFunctionMaybe(
  3300.       (int)"key != NULL",
  3301.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_decrypt_key.c",
  3302.       word_43C1C0 + 10);
  3303.   if ( *(_DWORD *)a5 == 1 )
  3304.   {
  3305.     v14 = 0;
  3306.     v13 = &v15;
  3307.     *(_DWORD *)&v15 = 7;
  3308.     v16 = &Buf2;
  3309.     v17 = 32;
  3310.     v18 = 0;
  3311.     err = tomcrypt_der_decode_sequence(a1, a2, &v15, 1, 1);
  3312.     if ( err )
  3313.     {
  3314.       v5 = err;
  3315.     }
  3316.     else
  3317.     {
  3318.       hash = tomcrypt_find_hash_oid(&Buf2, v17);
  3319.       if ( tomcrypt_hash_is_valid(hash) )
  3320.       {
  3321.         v5 = 7;
  3322.       }
  3323.       else
  3324.       {
  3325.         pub_expt = (int)malloc(0x100u);
  3326.         ecc_shared = (int)malloc(0x100u);
  3327.         skey = (int)malloc(0x80u);
  3328.         if ( pub_expt && ecc_shared && skey )
  3329.         {
  3330.           v12 = 1;
  3331.           v11 = &v15;
  3332.           v19 = 5;
  3333.           v20 = pub_expt;
  3334.           v21 = 256;
  3335.           v22 = 0;
  3336.           v10 = 2;
  3337.           v9 = &v15;
  3338.           v23 = 5;
  3339.           v24 = skey;
  3340.           v25 = 128;
  3341.           v26 = 0;
  3342.           err = tomcrypt_der_decode_sequence(a1, a2, &v15, 3, 1);
  3343.           if ( !err )
  3344.           {
  3345.             err = tomcrypt_ecc_import(v20, v21, (int)&pubkey);
  3346.             if ( !err )
  3347.             {
  3348.               i = 256;
  3349.               err = tomcrypt_ecc_shared_secret(a5, (int)&pubkey, ecc_shared, (int)&i);
  3350.               if ( err )
  3351.               {
  3352.                 tomcrypt_ecc_free((int)&pubkey);
  3353.               }
  3354.               else
  3355.               {
  3356.                 tomcrypt_ecc_free((int)&pubkey);
  3357.                 y = 128;
  3358.                 err = tomcrypt_hash_memory(hash, ecc_shared, i, ecc_shared, (int)&y);
  3359.                 if ( !err )
  3360.                 {
  3361.                   if ( v25 <= y )
  3362.                   {
  3363.                     if ( *(_DWORD *)a4 >= v25 )
  3364.                     {
  3365.                       for ( i = 0; i < v25; ++i )
  3366.                         *(_BYTE *)(i + a3) = *(_BYTE *)(i + ecc_shared) ^ *(_BYTE *)(i + skey);
  3367.                       *(_DWORD *)a4 = i;
  3368.                       err = 0;
  3369.                     }
  3370.                     else
  3371.                     {
  3372.                       *(_DWORD *)a4 = v25;
  3373.                       err = 6;
  3374.                     }
  3375.                   }
  3376.                   else
  3377.                   {
  3378.                     err = 7;
  3379.                   }
  3380.                 }
  3381.               }
  3382.             }
  3383.           }
  3384.           CrtCheckMemoryWrapperWrapper(pub_expt);
  3385.           CrtCheckMemoryWrapperWrapper(ecc_shared);
  3386.           CrtCheckMemoryWrapperWrapper(skey);
  3387.           v5 = err;
  3388.         }
  3389.         else
  3390.         {
  3391.           if ( pub_expt )
  3392.             CrtCheckMemoryWrapperWrapper(pub_expt);
  3393.           if ( ecc_shared )
  3394.             CrtCheckMemoryWrapperWrapper(ecc_shared);
  3395.           if ( skey )
  3396.             CrtCheckMemoryWrapperWrapper(skey);
  3397.           v5 = 13;
  3398.         }
  3399.       }
  3400.     }
  3401.   }
  3402.   else
  3403.   {
  3404.     v5 = 15;
  3405.   }
  3406.   return _chkesp(1, v5, v7);
  3407. }
  3408. // 405FA0: using guessed type _DWORD __cdecl tomcrypt_ecc_decrypt_key(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  3409. // 40C3A0: using guessed type _DWORD __cdecl tomcrypt_der_decode_sequence(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  3410. // 43C1C0: using guessed type __int16 word_43C1C0;
  3411.  
  3412. //----- (00406470) --------------------------------------------------------
  3413. int __cdecl tomcrypt_find_hash(const char *Str2)
  3414. {
  3415.   int v1; // eax@7
  3416.   char v3; // [sp+0h] [bp-50h]@0
  3417.   char v4; // [sp+Ch] [bp-44h]@1
  3418.   int i; // [sp+4Ch] [bp-4h]@3
  3419.  
  3420.   memset(&v4, -858993460, 0x44u);
  3421.   if ( !Str2 )
  3422.     errorFunctionMaybe(
  3423.       (int)"name != NULL",
  3424.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\misc\\crypt\\crypt_find_hash.c",
  3425.       word_43C1C4 + 2);
  3426.   for ( i = 0; i < 32; ++i )
  3427.   {
  3428.     if ( dword_4402C8[26 * i] && !strcmp((const char *)dword_4402C8[26 * i], Str2) )
  3429.     {
  3430.       v1 = i;
  3431.       return _chkesp(1, v1, v3);
  3432.     }
  3433.   }
  3434.   v1 = -1;
  3435.   return _chkesp(1, v1, v3);
  3436. }
  3437. // 43C1C4: using guessed type __int16 word_43C1C4;
  3438. // 4402C8: using guessed type int dword_4402C8[];
  3439.  
  3440. //----- (00406510) --------------------------------------------------------
  3441. int __cdecl tomcrypt_register_hash(const void *Src)
  3442. {
  3443.   int v1; // eax@6
  3444.   char v3; // [sp+0h] [bp-50h]@0
  3445.   char v4; // [sp+Ch] [bp-44h]@1
  3446.   int i; // [sp+4Ch] [bp-4h]@3
  3447.  
  3448.   memset(&v4, -858993460, 0x44u);
  3449.   if ( !Src )
  3450.     errorFunctionMaybe(
  3451.       (int)"hash != NULL",
  3452.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\misc\\crypt\\crypt_register_hash.c",
  3453.       word_43C1C8 + 3);
  3454.   for ( i = 0; i < 32; ++i )
  3455.   {
  3456.     if ( !memcmp(&dword_4402C8[26 * i], Src, 0x68u) )
  3457.     {
  3458.       v1 = i;
  3459.       return _chkesp(1, v1, v3);
  3460.     }
  3461.   }
  3462.   for ( i = 0; i < 32; ++i )
  3463.   {
  3464.     if ( !dword_4402C8[26 * i] )
  3465.     {
  3466.       memcpy(&dword_4402C8[26 * i], Src, 0x68u);
  3467.       v1 = i;
  3468.       return _chkesp(1, v1, v3);
  3469.     }
  3470.   }
  3471.   v1 = -1;
  3472.   return _chkesp(1, v1, v3);
  3473. }
  3474. // 43C1C8: using guessed type __int16 word_43C1C8;
  3475. // 4402C8: using guessed type int dword_4402C8[];
  3476.  
  3477. //----- (004065F0) --------------------------------------------------------
  3478. int __cdecl sub_4065F0(int a1)
  3479. {
  3480.   char v2; // [sp+0h] [bp-4Ch]@0
  3481.   char v3; // [sp+Ch] [bp-40h]@1
  3482.  
  3483.   memset(&v3, -858993460, 0x40u);
  3484.   if ( !a1 )
  3485.     errorFunctionMaybe(
  3486.       (int)"md != NULL",
  3487.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\sha2\\sha512.c",
  3488.       word_43C1CC + 1);
  3489.   *(_DWORD *)(a1 + 72) = 0;
  3490.   *(_DWORD *)a1 = 0;
  3491.   *(_DWORD *)(a1 + 4) = 0;
  3492.   *(_DWORD *)(a1 + 8) = -205731576;
  3493.   *(_DWORD *)(a1 + 12) = 1779033703;
  3494.   *(_DWORD *)(a1 + 16) = -2067093701;
  3495.   *(_DWORD *)(a1 + 20) = -1150833019;
  3496.   *(_DWORD *)(a1 + 24) = -23791573;
  3497.   *(_DWORD *)(a1 + 28) = 1013904242;
  3498.   *(_DWORD *)(a1 + 32) = 1595750129;
  3499.   *(_DWORD *)(a1 + 36) = -1521486534;
  3500.   *(_DWORD *)(a1 + 40) = -1377402159;
  3501.   *(_DWORD *)(a1 + 44) = 1359893119;
  3502.   *(_DWORD *)(a1 + 48) = 725511199;
  3503.   *(_DWORD *)(a1 + 52) = -1694144372;
  3504.   *(_DWORD *)(a1 + 56) = -79577749;
  3505.   *(_DWORD *)(a1 + 60) = 528734635;
  3506.   *(_DWORD *)(a1 + 64) = 327033209;
  3507.   *(_DWORD *)(a1 + 68) = 1541459225;
  3508.   return _chkesp(1, 0, v2);
  3509. }
  3510. // 43C1CC: using guessed type __int16 word_43C1CC;
  3511.  
  3512. //----- (004066E0) --------------------------------------------------------
  3513. int __cdecl sub_4066E0(int a1, char *Src, unsigned int a3)
  3514. {
  3515.   int v3; // eax@6
  3516.   char v5; // [sp+0h] [bp-58h]@0
  3517.   char v6; // [sp+Ch] [bp-4Ch]@1
  3518.   unsigned int v7; // [sp+4Ch] [bp-Ch]@14
  3519.   int v8; // [sp+50h] [bp-8h]@10
  3520.   size_t Size; // [sp+54h] [bp-4h]@16
  3521.  
  3522.   memset(&v6, -858993460, 0x4Cu);
  3523.   if ( !a1 )
  3524.     errorFunctionMaybe((int)"md != NULL", (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\sha2\\sha512.c", 198);
  3525.   if ( !Src )
  3526.     errorFunctionMaybe((int)"in != NULL", (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\sha2\\sha512.c", 198);
  3527.   if ( *(_DWORD *)(a1 + 72) <= 0x80u )
  3528.   {
  3529.     while ( a3 )
  3530.     {
  3531.       if ( *(_DWORD *)(a1 + 72) || a3 < 0x80 )
  3532.       {
  3533.         if ( a3 >= 128 - *(_DWORD *)(a1 + 72) )
  3534.           v7 = 128 - *(_DWORD *)(a1 + 72);
  3535.         else
  3536.           v7 = a3;
  3537.         Size = v7;
  3538.         memcpy((void *)(a1 + *(_DWORD *)(a1 + 72) + 76), Src, v7);
  3539.         *(_DWORD *)(a1 + 72) += Size;
  3540.         Src += Size;
  3541.         a3 -= Size;
  3542.         if ( *(_DWORD *)(a1 + 72) == 128 )
  3543.         {
  3544.           v8 = sub_406890(a1, a1 + 76);
  3545.           if ( v8 )
  3546.           {
  3547.             v3 = v8;
  3548.             return _chkesp(1, v3, v5);
  3549.           }
  3550.           *(_QWORD *)a1 += 1024i64;
  3551.           *(_DWORD *)(a1 + 72) = 0;
  3552.         }
  3553.       }
  3554.       else
  3555.       {
  3556.         v8 = sub_406890(a1, Src);
  3557.         if ( v8 )
  3558.         {
  3559.           v3 = v8;
  3560.           return _chkesp(1, v3, v5);
  3561.         }
  3562.         *(_QWORD *)a1 += 1024i64;
  3563.         Src += 128;
  3564.         a3 -= 128;
  3565.       }
  3566.     }
  3567.     v3 = 0;
  3568.   }
  3569.   else
  3570.   {
  3571.     v3 = 16;
  3572.   }
  3573.   return _chkesp(1, v3, v5);
  3574. }
  3575. // 406890: using guessed type _DWORD __cdecl sub_406890(_DWORD, _DWORD);
  3576.  
  3577. //----- (00406890) --------------------------------------------------------
  3578. #error "FFFFFFFF: too complex function (funcsize=1432)"
  3579.  
  3580. //----- (00407D90) --------------------------------------------------------
  3581. int __cdecl sub_407D90(int a1, int a2)
  3582. {
  3583.   int v2; // eax@6
  3584.   char v4; // [sp+0h] [bp-50h]@0
  3585.   char v5; // [sp+Ch] [bp-44h]@1
  3586.   int i; // [sp+4Ch] [bp-4h]@13
  3587.  
  3588.   memset(&v5, -858993460, 0x44u);
  3589.   if ( !a1 )
  3590.     errorFunctionMaybe(
  3591.       (int)"md != NULL",
  3592.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\sha2\\sha512.c",
  3593.       word_43C1D0 + 3);
  3594.   if ( !a2 )
  3595.     errorFunctionMaybe(
  3596.       (int)"out != NULL",
  3597.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\sha2\\sha512.c",
  3598.       word_43C1D0 + 4);
  3599.   if ( *(_DWORD *)(a1 + 72) < 0x80u )
  3600.   {
  3601.     *(_QWORD *)a1 += 8i64 * *(_DWORD *)(a1 + 72);
  3602.     *(_BYTE *)(a1 + (*(_DWORD *)(a1 + 72))++ + 76) = -128;
  3603.     if ( *(_DWORD *)(a1 + 72) > 0x70u )
  3604.     {
  3605.       while ( *(_DWORD *)(a1 + 72) < 0x80u )
  3606.         *(_BYTE *)(a1 + (*(_DWORD *)(a1 + 72))++ + 76) = 0;
  3607.       sub_406890(a1, a1 + 76);
  3608.       *(_DWORD *)(a1 + 72) = 0;
  3609.     }
  3610.     while ( *(_DWORD *)(a1 + 72) < 0x78u )
  3611.       *(_BYTE *)(a1 + (*(_DWORD *)(a1 + 72))++ + 76) = 0;
  3612.     *(_BYTE *)(a1 + 196) = unknown_libname_1(56);
  3613.     *(_BYTE *)(a1 + 197) = unknown_libname_1(48);
  3614.     *(_BYTE *)(a1 + 198) = unknown_libname_1(40);
  3615.     *(_BYTE *)(a1 + 199) = unknown_libname_1(32);
  3616.     *(_BYTE *)(a1 + 200) = unknown_libname_1(24);
  3617.     *(_BYTE *)(a1 + 201) = unknown_libname_1(16);
  3618.     *(_BYTE *)(a1 + 202) = unknown_libname_1(8);
  3619.     *(_BYTE *)(a1 + 203) = *(_DWORD *)a1;
  3620.     sub_406890(a1, a1 + 76);
  3621.     for ( i = 0; i < 8; ++i )
  3622.     {
  3623.       *(_BYTE *)(a2 + 8 * i) = unknown_libname_1(56);
  3624.       *(_BYTE *)(a2 + 8 * i + 1) = unknown_libname_1(48);
  3625.       *(_BYTE *)(a2 + 8 * i + 2) = unknown_libname_1(40);
  3626.       *(_BYTE *)(a2 + 8 * i + 3) = unknown_libname_1(32);
  3627.       *(_BYTE *)(a2 + 8 * i + 4) = unknown_libname_1(24);
  3628.       *(_BYTE *)(a2 + 8 * i + 5) = unknown_libname_1(16);
  3629.       *(_BYTE *)(a2 + 8 * i + 6) = unknown_libname_1(8);
  3630.       *(_BYTE *)(a2 + 8 * i + 7) = *(_BYTE *)(a1 + 8 * i + 8);
  3631.     }
  3632.     v2 = 0;
  3633.   }
  3634.   else
  3635.   {
  3636.     v2 = 16;
  3637.   }
  3638.   return _chkesp(1, v2, v4);
  3639. }
  3640. // 406890: using guessed type _DWORD __cdecl sub_406890(_DWORD, _DWORD);
  3641. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  3642. // 43C1D0: using guessed type __int16 word_43C1D0;
  3643.  
  3644. //----- (00408160) --------------------------------------------------------
  3645. int __cdecl sub_408160()
  3646. {
  3647.   unsigned int v0; // eax@3
  3648.   int v1; // eax@4
  3649.   char v3; // [sp+0h] [bp-1A0h]@0
  3650.   char v4; // [sp+Ch] [bp-194h]@1
  3651.   int v5; // [sp+4Ch] [bp-154h]@3
  3652.   char Buf1; // [sp+15Ch] [bp-44h]@3
  3653.   int i; // [sp+19Ch] [bp-4h]@1
  3654.  
  3655.   memset(&v4, -858993460, 0x194u);
  3656.   for ( i = 0; i < 2; ++i )
  3657.   {
  3658.     sub_4065F0((int)&v5);
  3659.     v0 = strlen((&off_4351A8)[68 * i]);
  3660.     sub_4066E0((int)&v5, (&off_4351A8)[68 * i], v0);
  3661.     sub_407D90((int)&v5, (int)&Buf1);
  3662.     if ( memcmp(&Buf1, (char *)&unk_4351AC + 68 * i, 0x40u) )
  3663.     {
  3664.       v1 = 5;
  3665.       return _chkesp(1, v1, v3);
  3666.     }
  3667.   }
  3668.   v1 = 0;
  3669.   return _chkesp(1, v1, v3);
  3670. }
  3671. // 4351A8: using guessed type char *off_4351A8;
  3672.  
  3673. //----- (00408230) --------------------------------------------------------
  3674. int __cdecl sub_408230(int a1)
  3675. {
  3676.   char v2; // [sp+0h] [bp-4Ch]@0
  3677.   char v3; // [sp+Ch] [bp-40h]@1
  3678.  
  3679.   memset(&v3, -858993460, 0x40u);
  3680.   if ( !a1 )
  3681.     errorFunctionMaybe((int)"md != NULL", (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\sha2\\sha384.c", 41);
  3682.   *(_DWORD *)(a1 + 72) = 0;
  3683.   *(_DWORD *)a1 = 0;
  3684.   *(_DWORD *)(a1 + 4) = 0;
  3685.   *(_DWORD *)(a1 + 8) = -1056596264;
  3686.   *(_DWORD *)(a1 + 12) = -876896931;
  3687.   *(_DWORD *)(a1 + 16) = 914150663;
  3688.   *(_DWORD *)(a1 + 20) = 1654270250;
  3689.   *(_DWORD *)(a1 + 24) = 812702999;
  3690.   *(_DWORD *)(a1 + 28) = -1856437926;
  3691.   *(_DWORD *)(a1 + 32) = -150054599;
  3692.   *(_DWORD *)(a1 + 36) = 355462360;
  3693.   *(_DWORD *)(a1 + 40) = -4191439;
  3694.   *(_DWORD *)(a1 + 44) = 1731405415;
  3695.   *(_DWORD *)(a1 + 48) = 1750603025;
  3696.   *(_DWORD *)(a1 + 52) = -1900787065;
  3697.   *(_DWORD *)(a1 + 56) = 1694076839;
  3698.   *(_DWORD *)(a1 + 60) = -619958771;
  3699.   *(_DWORD *)(a1 + 64) = -1090891868;
  3700.   *(_DWORD *)(a1 + 68) = 1203062813;
  3701.   return _chkesp(1, 0, v2);
  3702. }
  3703.  
  3704. //----- (00408320) --------------------------------------------------------
  3705. int __cdecl sub_408320(int a1, void *Dst)
  3706. {
  3707.   int v2; // eax@6
  3708.   char v4; // [sp+0h] [bp-8Ch]@0
  3709.   char v5; // [sp+Ch] [bp-80h]@1
  3710.   char Src; // [sp+4Ch] [bp-40h]@7
  3711.  
  3712.   memset(&v5, -858993460, 0x80u);
  3713.   if ( !a1 )
  3714.     errorFunctionMaybe((int)"md != NULL", (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\sha2\\sha384.c", 66);
  3715.   if ( !Dst )
  3716.     errorFunctionMaybe((int)"out != NULL", (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\sha2\\sha384.c", 67);
  3717.   if ( *(_DWORD *)(a1 + 72) < 0x80u )
  3718.   {
  3719.     sub_407D90(a1, (int)&Src);
  3720.     memcpy(Dst, &Src, 0x30u);
  3721.     v2 = 0;
  3722.   }
  3723.   else
  3724.   {
  3725.     v2 = 16;
  3726.   }
  3727.   return _chkesp(1, v2, v4);
  3728. }
  3729.  
  3730. //----- (004083C0) --------------------------------------------------------
  3731. int __cdecl sub_4083C0()
  3732. {
  3733.   unsigned int v0; // eax@3
  3734.   int v1; // eax@4
  3735.   char v3; // [sp+0h] [bp-190h]@0
  3736.   char v4; // [sp+Ch] [bp-184h]@1
  3737.   int v5; // [sp+4Ch] [bp-144h]@3
  3738.   char Buf1; // [sp+15Ch] [bp-34h]@3
  3739.   int i; // [sp+18Ch] [bp-4h]@1
  3740.  
  3741.   memset(&v4, -858993460, 0x184u);
  3742.   for ( i = 0; i < 2; ++i )
  3743.   {
  3744.     sub_408230((int)&v5);
  3745.     v0 = strlen((&off_435298)[52 * i]);
  3746.     sub_4066E0((int)&v5, (&off_435298)[52 * i], v0);
  3747.     sub_408320((int)&v5, &Buf1);
  3748.     if ( memcmp(&Buf1, (char *)&unk_43529C + 52 * i, 0x30u) )
  3749.     {
  3750.       v1 = 5;
  3751.       return _chkesp(1, v1, v3);
  3752.     }
  3753.   }
  3754.   v1 = 0;
  3755.   return _chkesp(1, v1, v3);
  3756. }
  3757. // 435298: using guessed type char *off_435298;
  3758.  
  3759. //----- (00408490) --------------------------------------------------------
  3760. int __cdecl sub_408490(int a1, char a2)
  3761. {
  3762.   int v2; // eax@3
  3763.   int v3; // edx@5
  3764.   int v4; // eax@6
  3765.   int v5; // eax@7
  3766.   char v7; // [sp+0h] [bp-5Ch]@3
  3767.   char v8; // [sp+Ch] [bp-50h]@1
  3768.   char *v9; // [sp+4Ch] [bp-10h]@4
  3769.   char *i; // [sp+50h] [bp-Ch]@1
  3770.   int v11; // [sp+54h] [bp-8h]@1
  3771.   int j; // [sp+58h] [bp-4h]@1
  3772.   int v13; // [sp+5Ch] [bp+0h]@3
  3773.  
  3774.   memset(&v8, -858993460, 0x50u);
  3775.   j = a1;
  3776.   v11 = 0;
  3777.   for ( i = &a2; ; j = *((_DWORD *)i - 1) )
  3778.   {
  3779.     if ( !j )
  3780.     {
  3781.       i = 0;
  3782.       v5 = 0;
  3783.       return _chkesp(1, v5, v7);
  3784.     }
  3785.     v2 = dword_4417E8(j);
  3786.     if ( _chkesp(&v7 == &v7, v2, (unsigned int)&v13) )
  3787.       break;
  3788.     ++v11;
  3789.     i += 4;
  3790.   }
  3791.   v9 = &a2;
  3792.   for ( j = a1; ; j = *((_DWORD *)v9 - 1) )
  3793.   {
  3794.     v3 = v11--;
  3795.     if ( !v3 )
  3796.       break;
  3797.     v4 = dword_4417F0(*(_DWORD *)j);
  3798.     _chkesp(&v7 == &v7, v4, (unsigned int)&v13);
  3799.     v9 += 4;
  3800.   }
  3801.   v9 = 0;
  3802.   v5 = 13;
  3803.   return _chkesp(1, v5, v7);
  3804. }
  3805. // 4417E8: using guessed type int (__cdecl *dword_4417E8)(_DWORD);
  3806. // 4417F0: using guessed type int (__cdecl *dword_4417F0)(_DWORD);
  3807.  
  3808. //----- (00408570) --------------------------------------------------------
  3809. int __cdecl sub_408570(int a1, char a2)
  3810. {
  3811.   int v2; // eax@1
  3812.   int v3; // eax@3
  3813.   char v5; // [sp+0h] [bp-54h]@3
  3814.   char v6; // [sp+Ch] [bp-48h]@1
  3815.   char *v7; // [sp+4Ch] [bp-8h]@1
  3816.   int v8; // [sp+50h] [bp-4h]@1
  3817.   int v9; // [sp+54h] [bp+0h]@3
  3818.  
  3819.   memset(&v6, -858993460, 0x48u);
  3820.   v2 = a1;
  3821.   v8 = a1;
  3822.   v7 = &a2;
  3823.   while ( v8 )
  3824.   {
  3825.     v3 = dword_4417F0(v8);
  3826.     _chkesp(&v5 == &v5, v3, (unsigned int)&v9);
  3827.     v2 = (int)(v7 + 4);
  3828.     v7 += 4;
  3829.     v8 = *((_DWORD *)v7 - 1);
  3830.   }
  3831.   return _chkesp(1, v2, v5);
  3832. }
  3833. // 4417F0: using guessed type int (__cdecl *dword_4417F0)(_DWORD);
  3834.  
  3835. //----- (004085E0) --------------------------------------------------------
  3836. int __cdecl sub_4085E0(int a1, int a2, char a3)
  3837. {
  3838.   int v3; // eax@8
  3839.   char v5; // [sp+0h] [bp-70h]@0
  3840.   char v6; // [sp+Ch] [bp-64h]@1
  3841.   int v7; // [sp+4Ch] [bp-24h]@15
  3842.   int v8; // [sp+50h] [bp-20h]@5
  3843.   int v9; // [sp+54h] [bp-1Ch]@11
  3844.   char *v10; // [sp+58h] [bp-18h]@3
  3845.   int v11; // [sp+5Ch] [bp-14h]@4
  3846.   size_t SizeOfElements; // [sp+60h] [bp-10h]@3
  3847.   int v13; // [sp+64h] [bp-Ch]@4
  3848.   int v14; // [sp+68h] [bp-8h]@4
  3849.   int v15; // [sp+6Ch] [bp-4h]@18
  3850.  
  3851.   memset(&v6, -858993460, 0x64u);
  3852.   if ( !a1 )
  3853.     errorFunctionMaybe(
  3854.       (int)"in != NULL",
  3855.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\sequence\\der_decode_sequence_multi.c",
  3856.       word_43C1D4 + 7);
  3857.   v10 = &a3;
  3858.   for ( SizeOfElements = 0; ; ++SizeOfElements )
  3859.   {
  3860.     v10 += 4;
  3861.     v14 = *((_DWORD *)v10 - 1);
  3862.     v10 += 4;
  3863.     v13 = *((_DWORD *)v10 - 1);
  3864.     v10 += 4;
  3865.     v11 = *((_DWORD *)v10 - 1);
  3866.     if ( !v14 )
  3867.       break;
  3868.     v8 = v14;
  3869.     if ( v14 <= 0 || v8 > 15 )
  3870.     {
  3871.       v10 = 0;
  3872.       v3 = 16;
  3873.       return _chkesp(1, v3, v5);
  3874.     }
  3875.   }
  3876.   v10 = 0;
  3877.   if ( SizeOfElements )
  3878.   {
  3879.     v9 = (int)calloc(0x20u, SizeOfElements);
  3880.     if ( v9 )
  3881.     {
  3882.       v10 = &a3;
  3883.       for ( SizeOfElements = 0; ; ++SizeOfElements )
  3884.       {
  3885.         v10 += 4;
  3886.         v14 = *((_DWORD *)v10 - 1);
  3887.         v10 += 4;
  3888.         v13 = *((_DWORD *)v10 - 1);
  3889.         v10 += 4;
  3890.         v11 = *((_DWORD *)v10 - 1);
  3891.         if ( !v14 )
  3892.           break;
  3893.         v7 = v14;
  3894.         if ( v14 <= 0 || v7 > 15 )
  3895.         {
  3896.           v10 = 0;
  3897.           v15 = 16;
  3898.           goto LABEL_20;
  3899.         }
  3900.         *(_DWORD *)(v9 + 32 * SizeOfElements) = v14;
  3901.         *(_DWORD *)(v9 + 32 * SizeOfElements + 8) = v13;
  3902.         *(_DWORD *)(v9 + 32 * SizeOfElements + 4) = v11;
  3903.       }
  3904.       v10 = 0;
  3905.       v15 = tomcrypt_der_decode_sequence(a1, a2, v9, SizeOfElements, 1);
  3906. LABEL_20:
  3907.       CrtCheckMemoryWrapperWrapper(v9);
  3908.       v3 = v15;
  3909.     }
  3910.     else
  3911.     {
  3912.       v3 = 13;
  3913.     }
  3914.   }
  3915.   else
  3916.   {
  3917.     v3 = 2;
  3918.   }
  3919.   return _chkesp(1, v3, v5);
  3920. }
  3921. // 40C3A0: using guessed type _DWORD __cdecl tomcrypt_der_decode_sequence(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  3922. // 43C1D4: using guessed type __int16 word_43C1D4;
  3923.  
  3924. //----- (004087D0) --------------------------------------------------------
  3925. int __cdecl errorFunctionMaybe(int a1, int a2, int a3)
  3926. {
  3927.   int v3; // eax@1
  3928.   char v5; // [sp+0h] [bp-4Ch]@0
  3929.   char v6; // [sp+Ch] [bp-40h]@1
  3930.  
  3931.   memset(&v6, -858993460, 0x40u);
  3932.   fprintf(&stru_43C2E0, "LTC_ARGCHK '%s' failure on line %d of file %s\n", a1, a3, a2);
  3933.   v3 = raise(22);
  3934.   return _chkesp(1, v3, v5);
  3935. }
  3936. // 413320: using guessed type _DWORD __cdecl raise(_DWORD);
  3937.  
  3938. //----- (00408830) --------------------------------------------------------
  3939. int __cdecl sub_408830(int a1, int a2, int a3, int a4, int a5, int a6)
  3940. {
  3941.   int v6; // eax@11
  3942.   int v7; // eax@17
  3943.   int v8; // eax@18
  3944.   int v9; // eax@21
  3945.   int v10; // eax@22
  3946.   int v11; // eax@23
  3947.   int v12; // eax@24
  3948.   int v13; // eax@25
  3949.   int v14; // eax@26
  3950.   int v15; // eax@28
  3951.   int v16; // eax@29
  3952.   int v17; // eax@31
  3953.   int v18; // esi@31
  3954.   int v19; // eax@31
  3955.   int v20; // eax@33
  3956.   int v21; // eax@33
  3957.   int v22; // eax@33
  3958.   char v24; // [sp+0h] [bp-60h]@17
  3959.   char v25; // [sp+Ch] [bp-54h]@1
  3960.   int v26; // [sp+4Ch] [bp-14h]@15
  3961.   unsigned int v27; // [sp+50h] [bp-10h]@29
  3962.   int v28; // [sp+54h] [bp-Ch]@22
  3963.   int v29; // [sp+58h] [bp-8h]@15
  3964.   int v30; // [sp+5Ch] [bp-4h]@15
  3965.   int v31; // [sp+60h] [bp+0h]@17
  3966.  
  3967.   memset(&v25, -858993460, 0x54u);
  3968.   if ( !a1 )
  3969.     errorFunctionMaybe(
  3970.       (int)"in != NULL",
  3971.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\rsa\\rsa_exptmod.c",
  3972.       word_43C1D8 + 5);
  3973.   if ( !a3 )
  3974.     errorFunctionMaybe(
  3975.       (int)"out != NULL",
  3976.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\rsa\\rsa_exptmod.c",
  3977.       word_43C1D8 + 6);
  3978.   if ( !a4 )
  3979.     errorFunctionMaybe(
  3980.       (int)"outlen != NULL",
  3981.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\rsa\\rsa_exptmod.c",
  3982.       word_43C1D8 + 7);
  3983.   if ( !a6 )
  3984.     errorFunctionMaybe(
  3985.       (int)"key != NULL",
  3986.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\rsa\\rsa_exptmod.c",
  3987.       word_43C1D8 + 8);
  3988.   if ( a5 != 1 || *(_DWORD *)a6 == 1 )
  3989.   {
  3990.     if ( a5 != 1 && a5 )
  3991.     {
  3992.       v6 = 18;
  3993.       return _chkesp(1, v6, v24);
  3994.     }
  3995.     v26 = sub_408490((int)&v30, (unsigned int)&v29);
  3996.     if ( v26 )
  3997.     {
  3998.       v6 = v26;
  3999.       return _chkesp(1, v6, v24);
  4000.     }
  4001.     v7 = dword_441830(v30, a1, a2);
  4002.     v26 = _chkesp(&v24 == &v24, v7, (unsigned int)&v31);
  4003.     if ( !v26 )
  4004.     {
  4005.       v8 = dword_44180C(*(_DWORD *)(a6 + 12), v30);
  4006.       if ( _chkesp(&v24 == &v24, v8, (unsigned int)&v31) != -1 )
  4007.       {
  4008.         if ( a5 == 1 )
  4009.         {
  4010.           v9 = dword_441880(v30, *(_DWORD *)(a6 + 28), *(_DWORD *)(a6 + 16), v29);
  4011.           v26 = _chkesp(&v24 == &v24, v9, (unsigned int)&v31);
  4012.           if ( v26
  4013.             || (v10 = dword_441880(v30, *(_DWORD *)(a6 + 32), *(_DWORD *)(a6 + 20), v28),
  4014.                 (v26 = _chkesp(&v24 == &v24, v10, (unsigned int)&v31)) != 0)
  4015.             || (v11 = dword_44183C(v29, v28, v30), (v26 = _chkesp(&v24 == &v24, v11, (unsigned int)&v31)) != 0)
  4016.             || (v12 = dword_441864(v30, *(_DWORD *)(a6 + 24), *(_DWORD *)(a6 + 16), v30),
  4017.                 (v26 = _chkesp(&v24 == &v24, v12, (unsigned int)&v31)) != 0)
  4018.             || (v13 = dword_441844(v30, *(_DWORD *)(a6 + 20), v30),
  4019.                 (v26 = _chkesp(&v24 == &v24, v13, (unsigned int)&v31)) != 0)
  4020.             || (v14 = dword_441834(v30, v28, v30), (v26 = _chkesp(&v24 == &v24, v14, (unsigned int)&v31)) != 0) )
  4021.             goto LABEL_34;
  4022.         }
  4023.         else
  4024.         {
  4025.           v15 = dword_441880(v30, *(_DWORD *)(a6 + 4), *(_DWORD *)(a6 + 12), v30);
  4026.           v26 = _chkesp(&v24 == &v24, v15, (unsigned int)&v31);
  4027.           if ( v26 )
  4028.             goto LABEL_34;
  4029.         }
  4030.         v16 = dword_441828(*(_DWORD *)(a6 + 12));
  4031.         v27 = _chkesp(&v24 == &v24, v16, (unsigned int)&v31);
  4032.         if ( v27 <= *(_DWORD *)a4 )
  4033.         {
  4034.           v17 = dword_441828(v30);
  4035.           v18 = _chkesp(&v24 == &v24, v17, (unsigned int)&v31);
  4036.           v19 = dword_441828(*(_DWORD *)(a6 + 12));
  4037.           if ( v18 <= (unsigned int)_chkesp(&v24 == &v24, v19, (unsigned int)&v24) )
  4038.           {
  4039.             *(_DWORD *)a4 = v27;
  4040.             sub_40BD50(a3, v27);
  4041.             v20 = dword_441828(v30);
  4042.             v21 = _chkesp(&v24 == &v24, v20, (unsigned int)&v24);
  4043.             v22 = dword_44182C(v30, v27 - v21 + a3);
  4044.             v26 = _chkesp(&v24 == &v24, v22, (unsigned int)&v24);
  4045.           }
  4046.           else
  4047.           {
  4048.             v26 = 1;
  4049.           }
  4050.         }
  4051.         else
  4052.         {
  4053.           *(_DWORD *)a4 = v27;
  4054.           v26 = 6;
  4055.         }
  4056.         goto LABEL_34;
  4057.       }
  4058.       v26 = 22;
  4059.     }
  4060. LABEL_34:
  4061.     sub_408570(v30, v29);
  4062.     v6 = v26;
  4063.     return _chkesp(1, v6, v24);
  4064.   }
  4065.   v6 = 15;
  4066.   return _chkesp(1, v6, v24);
  4067. }
  4068. // 43C1D8: using guessed type __int16 word_43C1D8;
  4069. // 44180C: using guessed type int (__cdecl *dword_44180C)(_DWORD, _DWORD);
  4070. // 441828: using guessed type int (__cdecl *dword_441828)(_DWORD);
  4071. // 44182C: using guessed type int (__cdecl *dword_44182C)(_DWORD, _DWORD);
  4072. // 441830: using guessed type int (__cdecl *dword_441830)(_DWORD, _DWORD, _DWORD);
  4073. // 441834: using guessed type int (__cdecl *dword_441834)(_DWORD, _DWORD, _DWORD);
  4074. // 44183C: using guessed type int (__cdecl *dword_44183C)(_DWORD, _DWORD, _DWORD);
  4075. // 441844: using guessed type int (__cdecl *dword_441844)(_DWORD, _DWORD, _DWORD);
  4076. // 441864: using guessed type int (__cdecl *dword_441864)(_DWORD, _DWORD, _DWORD, _DWORD);
  4077. // 441880: using guessed type int (__cdecl *dword_441880)(_DWORD, _DWORD, _DWORD, _DWORD);
  4078.  
  4079. //----- (00408C00) --------------------------------------------------------
  4080. int __cdecl sub_408C00(int a1, signed int a2, signed int a3, signed int a4, int a5)
  4081. {
  4082.   int v5; // eax@7
  4083.   int v6; // eax@15
  4084.   int v7; // eax@17
  4085.   int v8; // eax@18
  4086.   int v9; // eax@19
  4087.   int v10; // eax@21
  4088.   int v11; // eax@22
  4089.   int v12; // eax@23
  4090.   int v13; // eax@24
  4091.   int v14; // eax@25
  4092.   int v15; // eax@27
  4093.   int v16; // eax@28
  4094.   int v17; // eax@29
  4095.   int v18; // eax@30
  4096.   int v19; // eax@31
  4097.   int v20; // eax@32
  4098.   int v21; // eax@33
  4099.   int v22; // eax@34
  4100.   int v23; // eax@35
  4101.   int v24; // eax@36
  4102.   char v26; // [sp+0h] [bp-64h]@15
  4103.   char v27; // [sp+Ch] [bp-58h]@1
  4104.   int v28; // [sp+4Ch] [bp-18h]@11
  4105.   int v29; // [sp+50h] [bp-14h]@15
  4106.   int v30; // [sp+54h] [bp-10h]@18
  4107.   int v31; // [sp+58h] [bp-Ch]@17
  4108.   int v32; // [sp+5Ch] [bp-8h]@13
  4109.   int v33; // [sp+60h] [bp-4h]@13
  4110.   int v34; // [sp+64h] [bp+0h]@15
  4111.  
  4112.   memset(&v27, -858993460, 0x58u);
  4113.   if ( !dword_4417E0 )
  4114.     errorFunctionMaybe(
  4115.       (int)"ltc_mp.name != NULL",
  4116.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\rsa\\rsa_make_key.c",
  4117.       word_43C1DC + 4);
  4118.   if ( !a5 )
  4119.     errorFunctionMaybe(
  4120.       (int)"key != NULL",
  4121.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\rsa\\rsa_make_key.c",
  4122.       word_43C1DC + 5);
  4123.   if ( a3 >= 128 && a3 <= 512 )
  4124.   {
  4125.     if ( a4 >= 3 && a4 & 1 )
  4126.     {
  4127.       v28 = sub_40CDE0(a2);
  4128.       if ( v28 )
  4129.       {
  4130.         v5 = v28;
  4131.       }
  4132.       else
  4133.       {
  4134.         v28 = sub_408490((int)&v33, (unsigned int)&v32);
  4135.         if ( v28 )
  4136.         {
  4137.           v5 = v28;
  4138.         }
  4139.         else
  4140.         {
  4141.           v6 = dword_4417FC(v29, a4);
  4142.           v28 = _chkesp(&v26 == &v26, v6, (unsigned int)&v34);
  4143.           if ( !v28 )
  4144.           {
  4145.             while ( 1 )
  4146.             {
  4147.               v28 = sub_40CC20(v33, a3 / 2, a1, a2);
  4148.               if ( v28 )
  4149.                 break;
  4150.               v7 = dword_441840(v33, 1, v31);
  4151.               v28 = _chkesp(&v26 == &v26, v7, (unsigned int)&v34);
  4152.               if ( v28 )
  4153.                 break;
  4154.               v8 = dword_44185C(v31, v29, v30);
  4155.               v28 = _chkesp(&v26 == &v26, v8, (unsigned int)&v34);
  4156.               if ( v28 )
  4157.                 break;
  4158.               v9 = dword_441810(v30, 1);
  4159.               if ( !_chkesp(&v26 == &v26, v9, (unsigned int)&v34) )
  4160.               {
  4161.                 while ( 1 )
  4162.                 {
  4163.                   v28 = sub_40CC20(v32, a3 / 2, a1, a2);
  4164.                   if ( v28 )
  4165.                     goto LABEL_38;
  4166.                   v10 = dword_441840(v32, 1, v31);
  4167.                   v28 = _chkesp(&v26 == &v26, v10, (unsigned int)&v34);
  4168.                   if ( v28 )
  4169.                     goto LABEL_38;
  4170.                   v11 = dword_44185C(v31, v29, v30);
  4171.                   v28 = _chkesp(&v26 == &v26, v11, (unsigned int)&v34);
  4172.                   if ( v28 )
  4173.                     goto LABEL_38;
  4174.                   v12 = dword_441810(v30, 1);
  4175.                   if ( !_chkesp(&v26 == &v26, v12, (unsigned int)&v34) )
  4176.                   {
  4177.                     v13 = dword_441840(v33, 1, v30);
  4178.                     v28 = _chkesp(&v26 == &v26, v13, (unsigned int)&v34);
  4179.                     if ( !v28 )
  4180.                     {
  4181.                       v14 = dword_441860(v31, v30, v31);
  4182.                       v28 = _chkesp(&v26 == &v26, v14, (unsigned int)&v34);
  4183.                       if ( !v28 )
  4184.                       {
  4185.                         v28 = sub_408490(a5 + 4, a5 + 8);
  4186.                         if ( !v28 )
  4187.                         {
  4188.                           v15 = dword_4417FC(*(_DWORD *)(a5 + 4), a4);
  4189.                           v28 = _chkesp(&v26 == &v26, v15, (unsigned int)&v34);
  4190.                           if ( !v28 )
  4191.                           {
  4192.                             v16 = dword_44186C(*(_DWORD *)(a5 + 4), v31, *(_DWORD *)(a5 + 8));
  4193.                             v28 = _chkesp(&v26 == &v26, v16, (unsigned int)&v34);
  4194.                             if ( !v28 )
  4195.                             {
  4196.                               v17 = dword_441844(v33, v32, *(_DWORD *)(a5 + 12));
  4197.                               v28 = _chkesp(&v26 == &v26, v17, (unsigned int)&v34);
  4198.                               if ( !v28 )
  4199.                               {
  4200.                                 v18 = dword_441840(v33, 1, v31);
  4201.                                 v28 = _chkesp(&v26 == &v26, v18, (unsigned int)&v34);
  4202.                                 if ( !v28 )
  4203.                                 {
  4204.                                   v19 = dword_441840(v32, 1, v30);
  4205.                                   v28 = _chkesp(&v26 == &v26, v19, (unsigned int)&v34);
  4206.                                   if ( !v28 )
  4207.                                   {
  4208.                                     v20 = dword_441850(*(_DWORD *)(a5 + 8), v31, 0, *(_DWORD *)(a5 + 28));
  4209.                                     v28 = _chkesp(&v26 == &v26, v20, (unsigned int)&v34);
  4210.                                     if ( !v28 )
  4211.                                     {
  4212.                                       v21 = dword_441850(*(_DWORD *)(a5 + 8), v30, 0, *(_DWORD *)(a5 + 32));
  4213.                                       v28 = _chkesp(&v26 == &v26, v21, (unsigned int)&v34);
  4214.                                       if ( !v28 )
  4215.                                       {
  4216.                                         v22 = dword_44186C(v32, v33, *(_DWORD *)(a5 + 24));
  4217.                                         v28 = _chkesp(&v26 == &v26, v22, (unsigned int)&v34);
  4218.                                         if ( !v28 )
  4219.                                         {
  4220.                                           v23 = dword_4417F8(v33, *(_DWORD *)(a5 + 16));
  4221.                                           v28 = _chkesp(&v26 == &v26, v23, (unsigned int)&v34);
  4222.                                           if ( !v28 )
  4223.                                           {
  4224.                                             v24 = dword_4417F8(v32, *(_DWORD *)(a5 + 20));
  4225.                                             v28 = _chkesp(&v26 == &v26, v24, (unsigned int)&v34);
  4226.                                             if ( !v28 )
  4227.                                             {
  4228.                                               *(_DWORD *)a5 = 1;
  4229.                                               v28 = 0;
  4230.                                               goto LABEL_39;
  4231.                                             }
  4232.                                           }
  4233.                                         }
  4234.                                       }
  4235.                                     }
  4236.                                   }
  4237.                                 }
  4238.                               }
  4239.                             }
  4240.                           }
  4241.                         }
  4242.                       }
  4243.                     }
  4244.                     goto LABEL_38;
  4245.                   }
  4246.                 }
  4247.               }
  4248.             }
  4249.           }
  4250. LABEL_38:
  4251.           sub_408570(*(_DWORD *)(a5 + 8), *(_DWORD *)(a5 + 4));
  4252. LABEL_39:
  4253.           sub_408570(v29, v30);
  4254.           v5 = v28;
  4255.         }
  4256.       }
  4257.     }
  4258.     else
  4259.     {
  4260.       v5 = 16;
  4261.     }
  4262.   }
  4263.   else
  4264.   {
  4265.     v5 = 3;
  4266.   }
  4267.   return _chkesp(1, v5, v26);
  4268. }
  4269. // 43C1DC: using guessed type __int16 word_43C1DC;
  4270. // 4417E0: using guessed type int dword_4417E0;
  4271. // 4417F8: using guessed type int (__cdecl *dword_4417F8)(_DWORD, _DWORD);
  4272. // 4417FC: using guessed type int (__cdecl *dword_4417FC)(_DWORD, _DWORD);
  4273. // 441810: using guessed type int (__cdecl *dword_441810)(_DWORD, _DWORD);
  4274. // 441840: using guessed type int (__cdecl *dword_441840)(_DWORD, _DWORD, _DWORD);
  4275. // 441844: using guessed type int (__cdecl *dword_441844)(_DWORD, _DWORD, _DWORD);
  4276. // 441850: using guessed type int (__cdecl *dword_441850)(_DWORD, _DWORD, _DWORD, _DWORD);
  4277. // 44185C: using guessed type int (__cdecl *dword_44185C)(_DWORD, _DWORD, _DWORD);
  4278. // 441860: using guessed type int (__cdecl *dword_441860)(_DWORD, _DWORD, _DWORD);
  4279. // 44186C: using guessed type int (__cdecl *dword_44186C)(_DWORD, _DWORD, _DWORD);
  4280.  
  4281. //----- (00409140) --------------------------------------------------------
  4282. int __cdecl sub_409140(int a1, int a2, int a3, int a4, int a5, int a6)
  4283. {
  4284.   int v6; // eax@14
  4285.   int v7; // eax@17
  4286.   int v8; // eax@17
  4287.   int v9; // eax@23
  4288.   int v10; // eax@23
  4289.   int v11; // eax@31
  4290.   int v12; // eax@32
  4291.   int v13; // eax@33
  4292.   int v14; // eax@34
  4293.   int v15; // eax@35
  4294.   int v16; // eax@36
  4295.   int v17; // eax@37
  4296.   int v18; // eax@38
  4297.   int v19; // eax@39
  4298.   int v20; // eax@40
  4299.   int v21; // eax@41
  4300.   int v22; // eax@42
  4301.   int v23; // eax@43
  4302.   int v24; // eax@48
  4303.   int v25; // eax@59
  4304.   int v26; // eax@60
  4305.   int v27; // eax@64
  4306.   int v28; // eax@65
  4307.   int v29; // eax@66
  4308.   int v30; // eax@68
  4309.   int v31; // eax@71
  4310.   int v32; // eax@72
  4311.   char v34; // [sp+0h] [bp-D0h]@17
  4312.   char v35; // [sp+Ch] [bp-C4h]@1
  4313.   int v36; // [sp+4Ch] [bp-84h]@18
  4314.   int v37; // [sp+50h] [bp-80h]@32
  4315.   int v38; // [sp+54h] [bp-7Ch]@31
  4316.   int v39; // [sp+58h] [bp-78h]@51
  4317.   int v40; // [sp+5Ch] [bp-74h]@22
  4318.   int v41; // [sp+60h] [bp-70h]@15
  4319.   int v42; // [sp+64h] [bp-6Ch]@13
  4320.   int v43; // [sp+68h] [bp-68h]@51
  4321.   int v44; // [sp+6Ch] [bp-64h]@55
  4322.   int v45; // [sp+70h] [bp-60h]@55
  4323.   unsigned int j; // [sp+74h] [bp-5Ch]@26
  4324.   unsigned int i; // [sp+78h] [bp-58h]@23
  4325.   int v48; // [sp+7Ch] [bp-54h]@20
  4326.   int v49; // [sp+80h] [bp-50h]@17
  4327.   int v50; // [sp+84h] [bp-4Ch]@17
  4328.   int v51; // [sp+88h] [bp-48h]@51
  4329.   int v52; // [sp+8Ch] [bp-44h]@51
  4330.   int v53; // [sp+90h] [bp-40h]@25
  4331.   int v54; // [sp+94h] [bp-3Ch]@34
  4332.   int v55; // [sp+98h] [bp-38h]@40
  4333.   int v56; // [sp+9Ch] [bp-34h]@41
  4334.   int v57; // [sp+A0h] [bp-30h]@37
  4335.   int v58; // [sp+B0h] [bp-20h]@42
  4336.   int v59; // [sp+C0h] [bp-10h]@43
  4337.   int v60; // [sp+D0h] [bp+0h]@17
  4338.  
  4339.   memset(&v35, -858993460, 0xC4u);
  4340.   if ( !a1 )
  4341.     errorFunctionMaybe(
  4342.       (int)"A != NULL",
  4343.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mul2add.c",
  4344.       word_43C1E0 + 8);
  4345.   if ( !a3 )
  4346.     errorFunctionMaybe(
  4347.       (int)"B != NULL",
  4348.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mul2add.c",
  4349.       word_43C1E0 + 9);
  4350.   if ( !a5 )
  4351.     errorFunctionMaybe(
  4352.       (int)"C != NULL",
  4353.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mul2add.c",
  4354.       word_43C1E0 + 10);
  4355.   if ( !a2 )
  4356.     errorFunctionMaybe(
  4357.       (int)"kA != NULL",
  4358.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mul2add.c",
  4359.       word_43C1E0 + 11);
  4360.   if ( !a4 )
  4361.     errorFunctionMaybe(
  4362.       (int)"kB != NULL",
  4363.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mul2add.c",
  4364.       word_43C1E0 + 12);
  4365.   if ( !a6 )
  4366.     errorFunctionMaybe(
  4367.       (int)"modulus != NULL",
  4368.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mul2add.c",
  4369.       word_43C1E0 + 13);
  4370.   v42 = (int)calloc(1u, 0x100u);
  4371.   if ( v42 )
  4372.   {
  4373.     v41 = (int)calloc(1u, 0x100u);
  4374.     if ( v41 )
  4375.     {
  4376.       v7 = dword_441828(a2);
  4377.       v50 = _chkesp(&v34 == &v34, v7, (unsigned int)&v60);
  4378.       v8 = dword_441828(a4);
  4379.       v49 = _chkesp(&v34 == &v34, v8, (unsigned int)&v60);
  4380.       if ( v50 <= (unsigned int)v49 )
  4381.         v36 = v49;
  4382.       else
  4383.         v36 = v50;
  4384.       v48 = v36;
  4385.       if ( (unsigned int)v50 <= 0x100 && (unsigned int)v49 <= 0x100 )
  4386.       {
  4387.         v9 = dword_44182C(a2, v48 - v50 + v42);
  4388.         _chkesp(&v34 == &v34, v9, (unsigned int)&v60);
  4389.         v10 = dword_44182C(a4, v48 - v49 + v41);
  4390.         _chkesp(&v34 == &v34, v10, (unsigned int)&v60);
  4391.         for ( i = 0; i < 0x10; ++i )
  4392.         {
  4393.           *(&v53 + i) = sub_40CE30();
  4394.           if ( !*(&v53 + i) )
  4395.           {
  4396.             for ( j = 0; j < i; ++j )
  4397.               sub_40CEB0(*(&v53 + j));
  4398.             v40 = 13;
  4399.             goto LABEL_76;
  4400.           }
  4401.         }
  4402.         v11 = dword_441870(a6, &v38);
  4403.         v40 = _chkesp(&v34 == &v34, v11, (unsigned int)&v60);
  4404.         if ( !v40 )
  4405.         {
  4406.           v12 = dword_4417E8(&v37);
  4407.           v40 = _chkesp(&v34 == &v34, v12, (unsigned int)&v60);
  4408.           if ( !v40 )
  4409.           {
  4410.             v13 = dword_441874(v37, a6);
  4411.             v40 = _chkesp(&v34 == &v34, v13, (unsigned int)&v60);
  4412.             if ( !v40 )
  4413.             {
  4414.               v14 = dword_441864(*(_DWORD *)a1, v37, a6, *(_DWORD *)v54);
  4415.               v40 = _chkesp(&v34 == &v34, v14, (unsigned int)&v60);
  4416.               if ( !v40 )
  4417.               {
  4418.                 v15 = dword_441864(*(_DWORD *)(a1 + 4), v37, a6, *(_DWORD *)(v54 + 4));
  4419.                 v40 = _chkesp(&v34 == &v34, v15, (unsigned int)&v60);
  4420.                 if ( !v40 )
  4421.                 {
  4422.                   v16 = dword_441864(*(_DWORD *)(a1 + 8), v37, a6, *(_DWORD *)(v54 + 8));
  4423.                   v40 = _chkesp(&v34 == &v34, v16, (unsigned int)&v60);
  4424.                   if ( !v40 )
  4425.                   {
  4426.                     v17 = dword_441864(*(_DWORD *)a3, v37, a6, *(_DWORD *)v57);
  4427.                     v40 = _chkesp(&v34 == &v34, v17, (unsigned int)&v60);
  4428.                     if ( !v40 )
  4429.                     {
  4430.                       v18 = dword_441864(*(_DWORD *)(a3 + 4), v37, a6, *(_DWORD *)(v57 + 4));
  4431.                       v40 = _chkesp(&v34 == &v34, v18, (unsigned int)&v60);
  4432.                       if ( !v40 )
  4433.                       {
  4434.                         v19 = dword_441864(*(_DWORD *)(a3 + 8), v37, a6, *(_DWORD *)(v57 + 8));
  4435.                         v40 = _chkesp(&v34 == &v34, v19, (unsigned int)&v60);
  4436.                         if ( !v40 )
  4437.                         {
  4438.                           v20 = dword_441890(v54, v55, a6, v38);
  4439.                           v40 = _chkesp(&v34 == &v34, v20, (unsigned int)&v60);
  4440.                           if ( !v40 )
  4441.                           {
  4442.                             v21 = dword_44188C(v54, v55, v56, a6, v38);
  4443.                             v40 = _chkesp(&v34 == &v34, v21, (unsigned int)&v60);
  4444.                             if ( !v40 )
  4445.                             {
  4446.                               v22 = dword_441890(v57, v58, a6, v38);
  4447.                               v40 = _chkesp(&v34 == &v34, v22, (unsigned int)&v60);
  4448.                               if ( !v40 )
  4449.                               {
  4450.                                 v23 = dword_44188C(v57, v58, v59, a6, v38);
  4451.                                 v40 = _chkesp(&v34 == &v34, v23, (unsigned int)&v60);
  4452.                                 if ( !v40 )
  4453.                                 {
  4454.                                   for ( i = 1; i < 4; ++i )
  4455.                                   {
  4456.                                     for ( j = 1; j < 4; ++j )
  4457.                                     {
  4458.                                       v24 = dword_44188C(*(&v53 + i), *(&v53 + 4 * j), *(&v53 + i + 4 * j), a6, v38);
  4459.                                       v40 = _chkesp(&v34 == &v34, v24, (unsigned int)&v60);
  4460.                                       if ( v40 )
  4461.                                         goto LABEL_71;
  4462.                                     }
  4463.                                   }
  4464.                                   v43 = 3;
  4465.                                   v39 = 1;
  4466.                                   v52 = *(_BYTE *)v42;
  4467.                                   v51 = *(_BYTE *)v41;
  4468.                                   i = -1;
  4469.                                   while ( 1 )
  4470.                                   {
  4471.                                     ++v43;
  4472.                                     if ( v43 == 4 )
  4473.                                     {
  4474.                                       ++i;
  4475.                                       if ( i == v48 )
  4476.                                       {
  4477.                                         v40 = sub_409960(a5, a6, v38);
  4478.                                         break;
  4479.                                       }
  4480.                                       v52 = *(_BYTE *)(i + v42);
  4481.                                       v51 = *(_BYTE *)(i + v41);
  4482.                                       v43 = 0;
  4483.                                     }
  4484.                                     v45 = (unsigned __int8)v52 >> 6;
  4485.                                     v44 = (unsigned __int8)v51 >> 6;
  4486.                                     v52 = (unsigned __int8)(4 * v52);
  4487.                                     v51 = (unsigned __int8)(4 * v51);
  4488.                                     if ( v45 || v44 || v39 != 1 )
  4489.                                     {
  4490.                                       if ( !v39 )
  4491.                                       {
  4492.                                         v25 = dword_441890(a5, a5, a6, v38);
  4493.                                         v40 = _chkesp(&v34 == &v34, v25, (unsigned int)&v60);
  4494.                                         if ( v40
  4495.                                           || (v26 = dword_441890(a5, a5, a6, v38),
  4496.                                               (v40 = _chkesp(&v34 == &v34, v26, (unsigned int)&v60)) != 0) )
  4497.                                           break;
  4498.                                       }
  4499.                                       if ( v45 || v44 )
  4500.                                       {
  4501.                                         if ( v39 == 1 )
  4502.                                         {
  4503.                                           v39 = 0;
  4504.                                           v27 = dword_4417F8(*(_DWORD *)*(&v53 + v45 + 4 * v44), *(_DWORD *)a5);
  4505.                                           v40 = _chkesp(&v34 == &v34, v27, (unsigned int)&v60);
  4506.                                           if ( v40
  4507.                                             || (v28 = dword_4417F8(
  4508.                                                         *(_DWORD *)(*(&v53 + v45 + 4 * v44) + 4),
  4509.                                                         *(_DWORD *)(a5 + 4)),
  4510.                                                 (v40 = _chkesp(&v34 == &v34, v28, (unsigned int)&v60)) != 0)
  4511.                                             || (v29 = dword_4417F8(
  4512.                                                         *(_DWORD *)(*(&v53 + v45 + 4 * v44) + 8),
  4513.                                                         *(_DWORD *)(a5 + 8)),
  4514.                                                 (v40 = _chkesp(&v34 == &v34, v29, (unsigned int)&v60)) != 0) )
  4515.                                             break;
  4516.                                         }
  4517.                                         else
  4518.                                         {
  4519.                                           v30 = dword_44188C(a5, *(&v53 + v45 + 4 * v44), a5, a6, v38);
  4520.                                           v40 = _chkesp(&v34 == &v34, v30, (unsigned int)&v60);
  4521.                                           if ( v40 )
  4522.                                             break;
  4523.                                         }
  4524.                                       }
  4525.                                     }
  4526.                                   }
  4527.                                 }
  4528.                               }
  4529.                             }
  4530.                           }
  4531.                         }
  4532.                       }
  4533.                     }
  4534.                   }
  4535.                 }
  4536.               }
  4537.             }
  4538. LABEL_71:
  4539.             v31 = dword_4417F0(v37);
  4540.             _chkesp(&v34 == &v34, v31, (unsigned int)&v60);
  4541.           }
  4542.           v32 = dword_44187C(v38);
  4543.           _chkesp(&v34 == &v34, v32, (unsigned int)&v60);
  4544.         }
  4545.         for ( i = 0; i < 0x10; ++i )
  4546.           sub_40CEB0(*(&v53 + i));
  4547.       }
  4548.       else
  4549.       {
  4550.         v40 = 16;
  4551.       }
  4552. LABEL_76:
  4553.       CrtCheckMemoryWrapperWrapper(v42);
  4554.       CrtCheckMemoryWrapperWrapper(v41);
  4555.       v6 = v40;
  4556.     }
  4557.     else
  4558.     {
  4559.       CrtCheckMemoryWrapperWrapper(v42);
  4560.       v6 = 13;
  4561.     }
  4562.   }
  4563.   else
  4564.   {
  4565.     v6 = 13;
  4566.   }
  4567.   return _chkesp(1, v6, v34);
  4568. }
  4569. // 43C1E0: using guessed type __int16 word_43C1E0;
  4570. // 4417E8: using guessed type int (__cdecl *dword_4417E8)(_DWORD);
  4571. // 4417F0: using guessed type int (__cdecl *dword_4417F0)(_DWORD);
  4572. // 4417F8: using guessed type int (__cdecl *dword_4417F8)(_DWORD, _DWORD);
  4573. // 441828: using guessed type int (__cdecl *dword_441828)(_DWORD);
  4574. // 44182C: using guessed type int (__cdecl *dword_44182C)(_DWORD, _DWORD);
  4575. // 441864: using guessed type int (__cdecl *dword_441864)(_DWORD, _DWORD, _DWORD, _DWORD);
  4576. // 441870: using guessed type int (__cdecl *dword_441870)(_DWORD, _DWORD);
  4577. // 441874: using guessed type int (__cdecl *dword_441874)(_DWORD, _DWORD);
  4578. // 44187C: using guessed type int (__cdecl *dword_44187C)(_DWORD);
  4579. // 44188C: using guessed type int (__cdecl *dword_44188C)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  4580. // 441890: using guessed type int (__cdecl *dword_441890)(_DWORD, _DWORD, _DWORD, _DWORD);
  4581.  
  4582. //----- (00409960) --------------------------------------------------------
  4583. int __cdecl sub_409960(int a1, int a2, int a3)
  4584. {
  4585.   int v3; // eax@8
  4586.   int v4; // eax@9
  4587.   int v5; // eax@10
  4588.   int v6; // eax@11
  4589.   int v7; // eax@12
  4590.   int v8; // eax@13
  4591.   int v9; // eax@14
  4592.   int v10; // eax@15
  4593.   int v11; // eax@16
  4594.   int v12; // eax@17
  4595.   int v13; // eax@18
  4596.   int v14; // eax@19
  4597.   char v16; // [sp+0h] [bp-58h]@9
  4598.   char v17; // [sp+Ch] [bp-4Ch]@1
  4599.   int v18; // [sp+4Ch] [bp-Ch]@7
  4600.   int v19; // [sp+50h] [bp-8h]@7
  4601.   int v20; // [sp+54h] [bp-4h]@7
  4602.   int v21; // [sp+58h] [bp+0h]@9
  4603.  
  4604.   memset(&v17, -858993460, 0x4Cu);
  4605.   if ( !a1 )
  4606.     errorFunctionMaybe(
  4607.       (int)"P != NULL",
  4608.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_map.c",
  4609.       word_43C1E4 + 4);
  4610.   if ( !a2 )
  4611.     errorFunctionMaybe(
  4612.       (int)"modulus != NULL",
  4613.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_map.c",
  4614.       word_43C1E4 + 5);
  4615.   if ( !a3 )
  4616.     errorFunctionMaybe(
  4617.       (int)"mp != NULL",
  4618.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_map.c",
  4619.       word_43C1E4 + 6);
  4620.   v18 = sub_408490((int)&v20, (unsigned int)&v19);
  4621.   if ( v18 )
  4622.   {
  4623.     v3 = 13;
  4624.   }
  4625.   else
  4626.   {
  4627.     v4 = dword_441878(*(_DWORD *)(a1 + 8), a2, a3);
  4628.     v18 = _chkesp(&v16 == &v16, v4, (unsigned int)&v21);
  4629.     if ( !v18 )
  4630.     {
  4631.       v5 = dword_44186C(*(_DWORD *)(a1 + 8), a2, v20);
  4632.       v18 = _chkesp(&v16 == &v16, v5, (unsigned int)&v21);
  4633.       if ( !v18 )
  4634.       {
  4635.         v6 = dword_44184C(v20, v19);
  4636.         v18 = _chkesp(&v16 == &v16, v6, (unsigned int)&v21);
  4637.         if ( !v18 )
  4638.         {
  4639.           v7 = dword_441850(v19, a2, 0, v19);
  4640.           v18 = _chkesp(&v16 == &v16, v7, (unsigned int)&v21);
  4641.           if ( !v18 )
  4642.           {
  4643.             v8 = dword_441844(v20, v19, v20);
  4644.             v18 = _chkesp(&v16 == &v16, v8, (unsigned int)&v21);
  4645.             if ( !v18 )
  4646.             {
  4647.               v9 = dword_441850(v20, a2, 0, v20);
  4648.               v18 = _chkesp(&v16 == &v16, v9, (unsigned int)&v21);
  4649.               if ( !v18 )
  4650.               {
  4651.                 v10 = dword_441844(*(_DWORD *)a1, v19, *(_DWORD *)a1);
  4652.                 v18 = _chkesp(&v16 == &v16, v10, (unsigned int)&v21);
  4653.                 if ( !v18 )
  4654.                 {
  4655.                   v11 = dword_441878(*(_DWORD *)a1, a2, a3);
  4656.                   v18 = _chkesp(&v16 == &v16, v11, (unsigned int)&v21);
  4657.                   if ( !v18 )
  4658.                   {
  4659.                     v12 = dword_441844(*(_DWORD *)(a1 + 4), v20, *(_DWORD *)(a1 + 4));
  4660.                     v18 = _chkesp(&v16 == &v16, v12, (unsigned int)&v21);
  4661.                     if ( !v18 )
  4662.                     {
  4663.                       v13 = dword_441878(*(_DWORD *)(a1 + 4), a2, a3);
  4664.                       v18 = _chkesp(&v16 == &v16, v13, (unsigned int)&v21);
  4665.                       if ( !v18 )
  4666.                       {
  4667.                         v14 = dword_4417FC(*(_DWORD *)(a1 + 8), 1);
  4668.                         v18 = _chkesp(&v16 == &v16, v14, (unsigned int)&v21);
  4669.                       }
  4670.                     }
  4671.                   }
  4672.                 }
  4673.               }
  4674.             }
  4675.           }
  4676.         }
  4677.       }
  4678.     }
  4679.     sub_408570(v20, v19);
  4680.     v3 = v18;
  4681.   }
  4682.   return _chkesp(1, v3, v16);
  4683. }
  4684. // 43C1E4: using guessed type __int16 word_43C1E4;
  4685. // 4417FC: using guessed type int (__cdecl *dword_4417FC)(_DWORD, _DWORD);
  4686. // 441844: using guessed type int (__cdecl *dword_441844)(_DWORD, _DWORD, _DWORD);
  4687. // 44184C: using guessed type int (__cdecl *dword_44184C)(_DWORD, _DWORD);
  4688. // 441850: using guessed type int (__cdecl *dword_441850)(_DWORD, _DWORD, _DWORD, _DWORD);
  4689. // 44186C: using guessed type int (__cdecl *dword_44186C)(_DWORD, _DWORD, _DWORD);
  4690. // 441878: using guessed type int (__cdecl *dword_441878)(_DWORD, _DWORD, _DWORD);
  4691.  
  4692. //----- (00409C20) --------------------------------------------------------
  4693. int __cdecl sub_409C20(int a1, int a2, int a3, int a4)
  4694. {
  4695.   int v4; // eax@10
  4696.   int v5; // eax@12
  4697.   int v6; // eax@13
  4698.   int v7; // eax@14
  4699.   int v8; // eax@15
  4700.   int v9; // eax@16
  4701.   int v10; // eax@17
  4702.   int v11; // eax@18
  4703.   int v12; // eax@19
  4704.   int v13; // eax@20
  4705.   int v14; // eax@21
  4706.   int v15; // eax@22
  4707.   int v16; // eax@23
  4708.   int v17; // eax@24
  4709.   int v18; // eax@25
  4710.   int v19; // eax@26
  4711.   int v20; // eax@27
  4712.   int v21; // eax@28
  4713.   int v22; // eax@29
  4714.   int v23; // eax@30
  4715.   int v24; // eax@31
  4716.   int v25; // eax@32
  4717.   int v26; // eax@33
  4718.   int v27; // eax@34
  4719.   int v28; // eax@35
  4720.   int v29; // eax@36
  4721.   int v30; // eax@37
  4722.   int v31; // eax@38
  4723.   int v32; // eax@39
  4724.   int v33; // eax@40
  4725.   int v34; // eax@41
  4726.   int v35; // eax@42
  4727.   int v36; // eax@43
  4728.   int v37; // eax@44
  4729.   int v38; // eax@47
  4730.   int v39; // eax@48
  4731.   int v40; // eax@49
  4732.   int v41; // eax@50
  4733.   int v42; // eax@51
  4734.   int v43; // eax@52
  4735.   int v44; // eax@53
  4736.   int v45; // eax@54
  4737.   int v46; // eax@55
  4738.   int v47; // eax@56
  4739.   int v48; // eax@57
  4740.   int v49; // eax@58
  4741.   int v50; // eax@59
  4742.   int v51; // eax@60
  4743.   int v52; // eax@61
  4744.   int v53; // eax@62
  4745.   int v54; // eax@63
  4746.   int v55; // eax@64
  4747.   int v56; // eax@65
  4748.   int v57; // eax@66
  4749.   char v59; // [sp+0h] [bp-5Ch]@12
  4750.   char v60; // [sp+Ch] [bp-50h]@1
  4751.   int v61; // [sp+4Ch] [bp-10h]@44
  4752.   int v62; // [sp+50h] [bp-Ch]@9
  4753.   int v63; // [sp+54h] [bp-8h]@9
  4754.   int v64; // [sp+58h] [bp-4h]@9
  4755.   int v65; // [sp+5Ch] [bp+0h]@12
  4756.  
  4757.   memset(&v60, -858993460, 0x50u);
  4758.   if ( !a1 )
  4759.     errorFunctionMaybe(
  4760.       (int)"P != NULL",
  4761.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_dbl_point.c",
  4762.       word_43C1E8 + 4);
  4763.   if ( !a2 )
  4764.     errorFunctionMaybe(
  4765.       (int)"R != NULL",
  4766.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_dbl_point.c",
  4767.       word_43C1E8 + 5);
  4768.   if ( !a3 )
  4769.     errorFunctionMaybe(
  4770.       (int)"modulus != NULL",
  4771.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_dbl_point.c",
  4772.       word_43C1E8 + 6);
  4773.   if ( !a4 )
  4774.     errorFunctionMaybe(
  4775.       (int)"mp != NULL",
  4776.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_dbl_point.c",
  4777.       word_43C1E8 + 7);
  4778.   v62 = sub_408490((int)&v64, (unsigned int)&v63);
  4779.   if ( v62 )
  4780.   {
  4781.     v4 = v62;
  4782.   }
  4783.   else
  4784.   {
  4785.     if ( a1 == a2
  4786.       || (v5 = dword_4417F8(*(_DWORD *)a1, *(_DWORD *)a2), (v62 = _chkesp(&v59 == &v59, v5, (unsigned int)&v65)) == 0)
  4787.       && (v6 = dword_4417F8(*(_DWORD *)(a1 + 4), *(_DWORD *)(a2 + 4)),
  4788.           (v62 = _chkesp(&v59 == &v59, v6, (unsigned int)&v65)) == 0)
  4789.       && (v7 = dword_4417F8(*(_DWORD *)(a1 + 8), *(_DWORD *)(a2 + 8)),
  4790.           (v62 = _chkesp(&v59 == &v59, v7, (unsigned int)&v65)) == 0) )
  4791.     {
  4792.       v8 = dword_44184C(*(_DWORD *)(a2 + 8), v64);
  4793.       v62 = _chkesp(&v59 == &v59, v8, (unsigned int)&v65);
  4794.       if ( !v62 )
  4795.       {
  4796.         v9 = dword_441878(v64, a3, a4);
  4797.         v62 = _chkesp(&v59 == &v59, v9, (unsigned int)&v65);
  4798.         if ( !v62 )
  4799.         {
  4800.           v10 = dword_441844(*(_DWORD *)(a2 + 8), *(_DWORD *)(a2 + 4), *(_DWORD *)(a2 + 8));
  4801.           v62 = _chkesp(&v59 == &v59, v10, (unsigned int)&v65);
  4802.           if ( !v62 )
  4803.           {
  4804.             v11 = dword_441878(*(_DWORD *)(a2 + 8), a3, a4);
  4805.             v62 = _chkesp(&v59 == &v59, v11, (unsigned int)&v65);
  4806.             if ( !v62 )
  4807.             {
  4808.               v12 = dword_441834(*(_DWORD *)(a2 + 8), *(_DWORD *)(a2 + 8), *(_DWORD *)(a2 + 8));
  4809.               v62 = _chkesp(&v59 == &v59, v12, (unsigned int)&v65);
  4810.               if ( !v62 )
  4811.               {
  4812.                 v13 = dword_44180C(*(_DWORD *)(a2 + 8), a3);
  4813.                 if ( _chkesp(&v59 == &v59, v13, (unsigned int)&v65) == -1
  4814.                   || (v14 = dword_44183C(*(_DWORD *)(a2 + 8), a3, *(_DWORD *)(a2 + 8)),
  4815.                       (v62 = _chkesp(&v59 == &v59, v14, (unsigned int)&v65)) == 0) )
  4816.                 {
  4817.                   v15 = dword_44183C(*(_DWORD *)a2, v64, v63);
  4818.                   v62 = _chkesp(&v59 == &v59, v15, (unsigned int)&v65);
  4819.                   if ( !v62 )
  4820.                   {
  4821.                     v16 = dword_441810(v63, 0);
  4822.                     if ( _chkesp(&v59 == &v59, v16, (unsigned int)&v65) != -1
  4823.                       || (v17 = dword_441834(v63, a3, v63), (v62 = _chkesp(&v59 == &v59, v17, (unsigned int)&v65)) == 0) )
  4824.                     {
  4825.                       v18 = dword_441834(v64, *(_DWORD *)a2, v64);
  4826.                       v62 = _chkesp(&v59 == &v59, v18, (unsigned int)&v65);
  4827.                       if ( !v62 )
  4828.                       {
  4829.                         v19 = dword_44180C(v64, a3);
  4830.                         if ( _chkesp(&v59 == &v59, v19, (unsigned int)&v65) == -1
  4831.                           || (v20 = dword_44183C(v64, a3, v64),
  4832.                               (v62 = _chkesp(&v59 == &v59, v20, (unsigned int)&v65)) == 0) )
  4833.                         {
  4834.                           v21 = dword_441844(v64, v63, v63);
  4835.                           v62 = _chkesp(&v59 == &v59, v21, (unsigned int)&v65);
  4836.                           if ( !v62 )
  4837.                           {
  4838.                             v22 = dword_441878(v63, a3, a4);
  4839.                             v62 = _chkesp(&v59 == &v59, v22, (unsigned int)&v65);
  4840.                             if ( !v62 )
  4841.                             {
  4842.                               v23 = dword_441834(v63, v63, v64);
  4843.                               v62 = _chkesp(&v59 == &v59, v23, (unsigned int)&v65);
  4844.                               if ( !v62 )
  4845.                               {
  4846.                                 v24 = dword_44180C(v64, a3);
  4847.                                 if ( _chkesp(&v59 == &v59, v24, (unsigned int)&v65) == -1
  4848.                                   || (v25 = dword_44183C(v64, a3, v64),
  4849.                                       (v62 = _chkesp(&v59 == &v59, v25, (unsigned int)&v65)) == 0) )
  4850.                                 {
  4851.                                   v26 = dword_441834(v64, v63, v64);
  4852.                                   v62 = _chkesp(&v59 == &v59, v26, (unsigned int)&v65);
  4853.                                   if ( !v62 )
  4854.                                   {
  4855.                                     v27 = dword_44180C(v64, a3);
  4856.                                     if ( _chkesp(&v59 == &v59, v27, (unsigned int)&v65) == -1
  4857.                                       || (v28 = dword_44183C(v64, a3, v64),
  4858.                                           (v62 = _chkesp(&v59 == &v59, v28, (unsigned int)&v65)) == 0) )
  4859.                                     {
  4860.                                       v29 = dword_441834(*(_DWORD *)(a2 + 4), *(_DWORD *)(a2 + 4), *(_DWORD *)(a2 + 4));
  4861.                                       v62 = _chkesp(&v59 == &v59, v29, (unsigned int)&v65);
  4862.                                       if ( !v62 )
  4863.                                       {
  4864.                                         v30 = dword_44180C(*(_DWORD *)(a2 + 4), a3);
  4865.                                         if ( _chkesp(&v59 == &v59, v30, (unsigned int)&v65) == -1
  4866.                                           || (v31 = dword_44183C(*(_DWORD *)(a2 + 4), a3, *(_DWORD *)(a2 + 4)),
  4867.                                               (v62 = _chkesp(&v59 == &v59, v31, (unsigned int)&v65)) == 0) )
  4868.                                         {
  4869.                                           v32 = dword_44184C(*(_DWORD *)(a2 + 4), *(_DWORD *)(a2 + 4));
  4870.                                           v62 = _chkesp(&v59 == &v59, v32, (unsigned int)&v65);
  4871.                                           if ( !v62 )
  4872.                                           {
  4873.                                             v33 = dword_441878(*(_DWORD *)(a2 + 4), a3, a4);
  4874.                                             v62 = _chkesp(&v59 == &v59, v33, (unsigned int)&v65);
  4875.                                             if ( !v62 )
  4876.                                             {
  4877.                                               v34 = dword_44184C(*(_DWORD *)(a2 + 4), v63);
  4878.                                               v62 = _chkesp(&v59 == &v59, v34, (unsigned int)&v65);
  4879.                                               if ( !v62 )
  4880.                                               {
  4881.                                                 v35 = dword_441878(v63, a3, a4);
  4882.                                                 v62 = _chkesp(&v59 == &v59, v35, (unsigned int)&v65);
  4883.                                                 if ( !v62 )
  4884.                                                 {
  4885.                                                   v36 = dword_441808(v63);
  4886.                                                   if ( _chkesp(&v59 == &v59, v36, (unsigned int)&v65) <= 0 )
  4887.                                                   {
  4888.                                                     v61 = 0;
  4889.                                                   }
  4890.                                                   else
  4891.                                                   {
  4892.                                                     v37 = dword_441804(v63, 0);
  4893.                                                     v61 = (_chkesp(&v59 == &v59, v37, (unsigned int)&v65) & 1) != 0;
  4894.                                                   }
  4895.                                                   if ( !v61
  4896.                                                     || (v38 = dword_441834(v63, a3, v63),
  4897.                                                         (v62 = _chkesp(&v59 == &v59, v38, (unsigned int)&v65)) == 0) )
  4898.                                                   {
  4899.                                                     v39 = dword_441854(v63, v63);
  4900.                                                     v62 = _chkesp(&v59 == &v59, v39, (unsigned int)&v65);
  4901.                                                     if ( !v62 )
  4902.                                                     {
  4903.                                                       v40 = dword_441844(
  4904.                                                               *(_DWORD *)(a2 + 4),
  4905.                                                               *(_DWORD *)a2,
  4906.                                                               *(_DWORD *)(a2 + 4));
  4907.                                                       v62 = _chkesp(&v59 == &v59, v40, (unsigned int)&v65);
  4908.                                                       if ( !v62 )
  4909.                                                       {
  4910.                                                         v41 = dword_441878(*(_DWORD *)(a2 + 4), a3, a4);
  4911.                                                         v62 = _chkesp(&v59 == &v59, v41, (unsigned int)&v65);
  4912.                                                         if ( !v62 )
  4913.                                                         {
  4914.                                                           v42 = dword_44184C(v64, *(_DWORD *)a2);
  4915.                                                           v62 = _chkesp(&v59 == &v59, v42, (unsigned int)&v65);
  4916.                                                           if ( !v62 )
  4917.                                                           {
  4918.                                                             v43 = dword_441878(*(_DWORD *)a2, a3, a4);
  4919.                                                             v62 = _chkesp(&v59 == &v59, v43, (unsigned int)&v65);
  4920.                                                             if ( !v62 )
  4921.                                                             {
  4922.                                                               v44 = dword_44183C(
  4923.                                                                       *(_DWORD *)a2,
  4924.                                                                       *(_DWORD *)(a2 + 4),
  4925.                                                                       *(_DWORD *)a2);
  4926.                                                               v62 = _chkesp(&v59 == &v59, v44, (unsigned int)&v65);
  4927.                                                               if ( !v62 )
  4928.                                                               {
  4929.                                                                 v45 = dword_441810(*(_DWORD *)a2, 0);
  4930.                                                                 if ( _chkesp(&v59 == &v59, v45, (unsigned int)&v65) != -1
  4931.                                                                   || (v46 = dword_441834(
  4932.                                                                               *(_DWORD *)a2,
  4933.                                                                               a3,
  4934.                                                                               *(_DWORD *)a2),
  4935.                                                                       (v62 = _chkesp(
  4936.                                                                                &v59 == &v59,
  4937.                                                                                v46,
  4938.                                                                                (unsigned int)&v65)) == 0) )
  4939.                                                                 {
  4940.                                                                   v47 = dword_44183C(
  4941.                                                                           *(_DWORD *)a2,
  4942.                                                                           *(_DWORD *)(a2 + 4),
  4943.                                                                           *(_DWORD *)a2);
  4944.                                                                   v62 = _chkesp(&v59 == &v59, v47, (unsigned int)&v65);
  4945.                                                                   if ( !v62 )
  4946.                                                                   {
  4947.                                                                     v48 = dword_441810(*(_DWORD *)a2, 0);
  4948.                                                                     if ( _chkesp(&v59 == &v59, v48, (unsigned int)&v65) != -1
  4949.                                                                       || (v49 = dword_441834(
  4950.                                                                                   *(_DWORD *)a2,
  4951.                                                                                   a3,
  4952.                                                                                   *(_DWORD *)a2),
  4953.                                                                           (v62 = _chkesp(
  4954.                                                                                    &v59 == &v59,
  4955.                                                                                    v49,
  4956.                                                                                    (unsigned int)&v65)) == 0) )
  4957.                                                                     {
  4958.                                                                       v50 = dword_44183C(
  4959.                                                                               *(_DWORD *)(a2 + 4),
  4960.                                                                               *(_DWORD *)a2,
  4961.                                                                               *(_DWORD *)(a2 + 4));
  4962.                                                                       v62 = _chkesp(
  4963.                                                                               &v59 == &v59,
  4964.                                                                               v50,
  4965.                                                                               (unsigned int)&v65);
  4966.                                                                       if ( !v62 )
  4967.                                                                       {
  4968.                                                                         v51 = dword_441810(*(_DWORD *)(a2 + 4), 0);
  4969.                                                                         if ( _chkesp(
  4970.                                                                                &v59 == &v59,
  4971.                                                                                v51,
  4972.                                                                                (unsigned int)&v65) != -1
  4973.                                                                           || (v52 = dword_441834(
  4974.                                                                                       *(_DWORD *)(a2 + 4),
  4975.                                                                                       a3,
  4976.                                                                                       *(_DWORD *)(a2 + 4)),
  4977.                                                                               (v62 = _chkesp(
  4978.                                                                                        &v59 == &v59,
  4979.                                                                                        v52,
  4980.                                                                                        (unsigned int)&v65)) == 0) )
  4981.                                                                         {
  4982.                                                                           v53 = dword_441844(
  4983.                                                                                   *(_DWORD *)(a2 + 4),
  4984.                                                                                   v64,
  4985.                                                                                   *(_DWORD *)(a2 + 4));
  4986.                                                                           v62 = _chkesp(
  4987.                                                                                   &v59 == &v59,
  4988.                                                                                   v53,
  4989.                                                                                   (unsigned int)&v65);
  4990.                                                                           if ( !v62 )
  4991.                                                                           {
  4992.                                                                             v54 = dword_441878(
  4993.                                                                                     *(_DWORD *)(a2 + 4),
  4994.                                                                                     a3,
  4995.                                                                                     a4);
  4996.                                                                             v62 = _chkesp(
  4997.                                                                                     &v59 == &v59,
  4998.                                                                                     v54,
  4999.                                                                                     (unsigned int)&v65);
  5000.                                                                             if ( !v62 )
  5001.                                                                             {
  5002.                                                                               v55 = dword_44183C(
  5003.                                                                                       *(_DWORD *)(a2 + 4),
  5004.                                                                                       v63,
  5005.                                                                                       *(_DWORD *)(a2 + 4));
  5006.                                                                               v62 = _chkesp(
  5007.                                                                                       &v59 == &v59,
  5008.                                                                                       v55,
  5009.                                                                                       (unsigned int)&v65);
  5010.                                                                               if ( !v62 )
  5011.                                                                               {
  5012.                                                                                 v56 = dword_441810(
  5013.                                                                                         *(_DWORD *)(a2 + 4),
  5014.                                                                                         0);
  5015.                                                                                 if ( _chkesp(
  5016.                                                                                        &v59 == &v59,
  5017.                                                                                        v56,
  5018.                                                                                        (unsigned int)&v65) != -1
  5019.                                                                                   || (v57 = dword_441834(
  5020.                                                                                               *(_DWORD *)(a2 + 4),
  5021.                                                                                               a3,
  5022.                                                                                               *(_DWORD *)(a2 + 4)),
  5023.                                                                                       (v62 = _chkesp(
  5024.                                                                                                &v59 == &v59,
  5025.                                                                                                v57,
  5026.                                                                                                (unsigned int)&v65)) == 0) )
  5027.                                                                                   v62 = 0;
  5028.                                                                               }
  5029.                                                                             }
  5030.                                                                           }
  5031.                                                                         }
  5032.                                                                       }
  5033.                                                                     }
  5034.                                                                   }
  5035.                                                                 }
  5036.                                                               }
  5037.                                                             }
  5038.                                                           }
  5039.                                                         }
  5040.                                                       }
  5041.                                                     }
  5042.                                                   }
  5043.                                                 }
  5044.                                               }
  5045.                                             }
  5046.                                           }
  5047.                                         }
  5048.                                       }
  5049.                                     }
  5050.                                   }
  5051.                                 }
  5052.                               }
  5053.                             }
  5054.                           }
  5055.                         }
  5056.                       }
  5057.                     }
  5058.                   }
  5059.                 }
  5060.               }
  5061.             }
  5062.           }
  5063.         }
  5064.       }
  5065.     }
  5066.     sub_408570(v64, v63);
  5067.     v4 = v62;
  5068.   }
  5069.   return _chkesp(1, v4, v59);
  5070. }
  5071. // 43C1E8: using guessed type __int16 word_43C1E8;
  5072. // 4417F8: using guessed type int (__cdecl *dword_4417F8)(_DWORD, _DWORD);
  5073. // 441804: using guessed type int (__cdecl *dword_441804)(_DWORD, _DWORD);
  5074. // 441808: using guessed type int (__cdecl *dword_441808)(_DWORD);
  5075. // 44180C: using guessed type int (__cdecl *dword_44180C)(_DWORD, _DWORD);
  5076. // 441810: using guessed type int (__cdecl *dword_441810)(_DWORD, _DWORD);
  5077. // 441834: using guessed type int (__cdecl *dword_441834)(_DWORD, _DWORD, _DWORD);
  5078. // 44183C: using guessed type int (__cdecl *dword_44183C)(_DWORD, _DWORD, _DWORD);
  5079. // 441844: using guessed type int (__cdecl *dword_441844)(_DWORD, _DWORD, _DWORD);
  5080. // 44184C: using guessed type int (__cdecl *dword_44184C)(_DWORD, _DWORD);
  5081. // 441854: using guessed type int (__cdecl *dword_441854)(_DWORD, _DWORD);
  5082. // 441878: using guessed type int (__cdecl *dword_441878)(_DWORD, _DWORD, _DWORD);
  5083.  
  5084. //----- (0040A630) --------------------------------------------------------
  5085. int __cdecl sub_40A630(int a1, int a2, int a3, int a4, int a5)
  5086. {
  5087.   int v5; // eax@12
  5088.   int v6; // eax@13
  5089.   int v7; // eax@14
  5090.   int v8; // eax@16
  5091.   int v9; // eax@17
  5092.   int v10; // eax@18
  5093.   int v11; // eax@20
  5094.   int v12; // eax@21
  5095.   int v13; // eax@22
  5096.   int v14; // eax@24
  5097.   int v15; // eax@25
  5098.   int v16; // eax@26
  5099.   int v17; // eax@27
  5100.   int v18; // eax@28
  5101.   int v19; // eax@29
  5102.   int v20; // eax@30
  5103.   int v21; // eax@31
  5104.   int v22; // eax@32
  5105.   int v23; // eax@33
  5106.   int v24; // eax@34
  5107.   int v25; // eax@35
  5108.   int v26; // eax@36
  5109.   int v27; // eax@37
  5110.   int v28; // eax@38
  5111.   int v29; // eax@39
  5112.   int v30; // eax@40
  5113.   int v31; // eax@41
  5114.   int v32; // eax@42
  5115.   int v33; // eax@43
  5116.   int v34; // eax@44
  5117.   int v35; // eax@45
  5118.   int v36; // eax@46
  5119.   int v37; // eax@47
  5120.   int v38; // eax@48
  5121.   int v39; // eax@49
  5122.   int v40; // eax@50
  5123.   int v41; // eax@51
  5124.   int v42; // eax@52
  5125.   int v43; // eax@53
  5126.   int v44; // eax@54
  5127.   int v45; // eax@55
  5128.   int v46; // eax@56
  5129.   int v47; // eax@57
  5130.   int v48; // eax@59
  5131.   int v49; // eax@60
  5132.   int v50; // eax@61
  5133.   int v51; // eax@62
  5134.   int v52; // eax@63
  5135.   int v53; // eax@64
  5136.   int v54; // eax@65
  5137.   int v55; // eax@66
  5138.   int v56; // eax@67
  5139.   int v57; // eax@68
  5140.   int v58; // eax@69
  5141.   int v59; // eax@70
  5142.   int v60; // eax@71
  5143.   int v61; // eax@72
  5144.   int v62; // eax@73
  5145.   int v63; // eax@74
  5146.   int v64; // eax@75
  5147.   int v65; // eax@76
  5148.   int v66; // eax@77
  5149.   int v67; // eax@78
  5150.   int v68; // eax@79
  5151.   int v69; // eax@80
  5152.   int v70; // eax@81
  5153.   int v71; // eax@82
  5154.   int v72; // eax@83
  5155.   int v73; // eax@84
  5156.   int v74; // eax@85
  5157.   int v75; // eax@86
  5158.   int v76; // eax@87
  5159.   int v77; // eax@88
  5160.   int v78; // eax@91
  5161.   int v79; // eax@92
  5162.   int v80; // eax@93
  5163.   int v81; // eax@94
  5164.   int v82; // eax@95
  5165.   char v84; // [sp+0h] [bp-68h]@13
  5166.   char v85; // [sp+Ch] [bp-5Ch]@1
  5167.   int v86; // [sp+4Ch] [bp-1Ch]@88
  5168.   int v87; // [sp+50h] [bp-18h]@11
  5169.   int v88; // [sp+54h] [bp-14h]@22
  5170.   int v89; // [sp+58h] [bp-10h]@21
  5171.   int v90; // [sp+5Ch] [bp-Ch]@20
  5172.   int v91; // [sp+60h] [bp-8h]@11
  5173.   int v92; // [sp+64h] [bp-4h]@11
  5174.   int v93; // [sp+68h] [bp+0h]@13
  5175.  
  5176.   memset(&v85, -858993460, 0x5Cu);
  5177.   if ( !a1 )
  5178.     errorFunctionMaybe(
  5179.       (int)"P != NULL",
  5180.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_add_point.c",
  5181.       word_43C1EC + 4);
  5182.   if ( !a2 )
  5183.     errorFunctionMaybe(
  5184.       (int)"Q != NULL",
  5185.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_add_point.c",
  5186.       word_43C1EC + 5);
  5187.   if ( !a3 )
  5188.     errorFunctionMaybe(
  5189.       (int)"R != NULL",
  5190.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_add_point.c",
  5191.       word_43C1EC + 6);
  5192.   if ( !a4 )
  5193.     errorFunctionMaybe(
  5194.       (int)"modulus != NULL",
  5195.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_add_point.c",
  5196.       word_43C1EC + 7);
  5197.   if ( !a5 )
  5198.     errorFunctionMaybe(
  5199.       (int)"mp != NULL",
  5200.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_projective_add_point.c",
  5201.       word_43C1EC + 8);
  5202.   v87 = sub_408490((int)&v92, (unsigned int)&v91);
  5203.   if ( !v87 )
  5204.   {
  5205.     v6 = dword_44183C(a4, *(_DWORD *)(a2 + 4), v92);
  5206.     v87 = _chkesp(&v84 == &v84, v6, (unsigned int)&v93);
  5207.     if ( !v87 )
  5208.     {
  5209.       v7 = dword_44180C(*(_DWORD *)a1, *(_DWORD *)a2);
  5210.       if ( !_chkesp(&v84 == &v84, v7, (unsigned int)&v93) )
  5211.       {
  5212.         if ( *(_DWORD *)(a2 + 8) )
  5213.         {
  5214.           v8 = dword_44180C(*(_DWORD *)(a1 + 8), *(_DWORD *)(a2 + 8));
  5215.           if ( !_chkesp(&v84 == &v84, v8, (unsigned int)&v93) )
  5216.           {
  5217.             v9 = dword_44180C(*(_DWORD *)(a1 + 4), *(_DWORD *)(a2 + 4));
  5218.             if ( !_chkesp(&v84 == &v84, v9, (unsigned int)&v93)
  5219.               || (v10 = dword_44180C(*(_DWORD *)(a1 + 4), v92), !_chkesp(&v84 == &v84, v10, (unsigned int)&v93)) )
  5220.             {
  5221.               sub_408570(v92, v91);
  5222.               v5 = sub_409C20(a1, a3, a4, a5);
  5223.               return _chkesp(1, v5, v84);
  5224.             }
  5225.           }
  5226.         }
  5227.       }
  5228.       v11 = dword_4417F8(*(_DWORD *)a1, v90);
  5229.       v87 = _chkesp(&v84 == &v84, v11, (unsigned int)&v93);
  5230.       if ( !v87 )
  5231.       {
  5232.         v12 = dword_4417F8(*(_DWORD *)(a1 + 4), v89);
  5233.         v87 = _chkesp(&v84 == &v84, v12, (unsigned int)&v93);
  5234.         if ( !v87 )
  5235.         {
  5236.           v13 = dword_4417F8(*(_DWORD *)(a1 + 8), v88);
  5237.           v87 = _chkesp(&v84 == &v84, v13, (unsigned int)&v93);
  5238.           if ( !v87 )
  5239.           {
  5240.             if ( !*(_DWORD *)(a2 + 8)
  5241.               || (v14 = dword_44184C(*(_DWORD *)(a2 + 8), v92),
  5242.                   (v87 = _chkesp(&v84 == &v84, v14, (unsigned int)&v93)) == 0)
  5243.               && (v15 = dword_441878(v92, a4, a5), (v87 = _chkesp(&v84 == &v84, v15, (unsigned int)&v93)) == 0)
  5244.               && (v16 = dword_441844(v92, v90, v90), (v87 = _chkesp(&v84 == &v84, v16, (unsigned int)&v93)) == 0)
  5245.               && (v17 = dword_441878(v90, a4, a5), (v87 = _chkesp(&v84 == &v84, v17, (unsigned int)&v93)) == 0)
  5246.               && (v18 = dword_441844(*(_DWORD *)(a2 + 8), v92, v92),
  5247.                   (v87 = _chkesp(&v84 == &v84, v18, (unsigned int)&v93)) == 0)
  5248.               && (v19 = dword_441878(v92, a4, a5), (v87 = _chkesp(&v84 == &v84, v19, (unsigned int)&v93)) == 0)
  5249.               && (v20 = dword_441844(v92, v89, v89), (v87 = _chkesp(&v84 == &v84, v20, (unsigned int)&v93)) == 0)
  5250.               && (v21 = dword_441878(v89, a4, a5), (v87 = _chkesp(&v84 == &v84, v21, (unsigned int)&v93)) == 0) )
  5251.             {
  5252.               v22 = dword_44184C(v88, v92);
  5253.               v87 = _chkesp(&v84 == &v84, v22, (unsigned int)&v93);
  5254.               if ( !v87 )
  5255.               {
  5256.                 v23 = dword_441878(v92, a4, a5);
  5257.                 v87 = _chkesp(&v84 == &v84, v23, (unsigned int)&v93);
  5258.                 if ( !v87 )
  5259.                 {
  5260.                   v24 = dword_441844(*(_DWORD *)a2, v92, v91);
  5261.                   v87 = _chkesp(&v84 == &v84, v24, (unsigned int)&v93);
  5262.                   if ( !v87 )
  5263.                   {
  5264.                     v25 = dword_441878(v91, a4, a5);
  5265.                     v87 = _chkesp(&v84 == &v84, v25, (unsigned int)&v93);
  5266.                     if ( !v87 )
  5267.                     {
  5268.                       v26 = dword_441844(v88, v92, v92);
  5269.                       v87 = _chkesp(&v84 == &v84, v26, (unsigned int)&v93);
  5270.                       if ( !v87 )
  5271.                       {
  5272.                         v27 = dword_441878(v92, a4, a5);
  5273.                         v87 = _chkesp(&v84 == &v84, v27, (unsigned int)&v93);
  5274.                         if ( !v87 )
  5275.                         {
  5276.                           v28 = dword_441844(*(_DWORD *)(a2 + 4), v92, v92);
  5277.                           v87 = _chkesp(&v84 == &v84, v28, (unsigned int)&v93);
  5278.                           if ( !v87 )
  5279.                           {
  5280.                             v29 = dword_441878(v92, a4, a5);
  5281.                             v87 = _chkesp(&v84 == &v84, v29, (unsigned int)&v93);
  5282.                             if ( !v87 )
  5283.                             {
  5284.                               v30 = dword_44183C(v89, v92, v89);
  5285.                               v87 = _chkesp(&v84 == &v84, v30, (unsigned int)&v93);
  5286.                               if ( !v87 )
  5287.                               {
  5288.                                 v31 = dword_441810(v89, 0);
  5289.                                 if ( _chkesp(&v84 == &v84, v31, (unsigned int)&v93) != -1
  5290.                                   || (v32 = dword_441834(v89, a4, v89),
  5291.                                       (v87 = _chkesp(&v84 == &v84, v32, (unsigned int)&v93)) == 0) )
  5292.                                 {
  5293.                                   v33 = dword_441834(v92, v92, v92);
  5294.                                   v87 = _chkesp(&v84 == &v84, v33, (unsigned int)&v93);
  5295.                                   if ( !v87 )
  5296.                                   {
  5297.                                     v34 = dword_44180C(v92, a4);
  5298.                                     if ( _chkesp(&v84 == &v84, v34, (unsigned int)&v93) == -1
  5299.                                       || (v35 = dword_44183C(v92, a4, v92),
  5300.                                           (v87 = _chkesp(&v84 == &v84, v35, (unsigned int)&v93)) == 0) )
  5301.                                     {
  5302.                                       v36 = dword_441834(v92, v89, v92);
  5303.                                       v87 = _chkesp(&v84 == &v84, v36, (unsigned int)&v93);
  5304.                                       if ( !v87 )
  5305.                                       {
  5306.                                         v37 = dword_44180C(v92, a4);
  5307.                                         if ( _chkesp(&v84 == &v84, v37, (unsigned int)&v93) == -1
  5308.                                           || (v38 = dword_44183C(v92, a4, v92),
  5309.                                               (v87 = _chkesp(&v84 == &v84, v38, (unsigned int)&v93)) == 0) )
  5310.                                         {
  5311.                                           v39 = dword_44183C(v90, v91, v90);
  5312.                                           v87 = _chkesp(&v84 == &v84, v39, (unsigned int)&v93);
  5313.                                           if ( !v87 )
  5314.                                           {
  5315.                                             v40 = dword_441810(v90, 0);
  5316.                                             if ( _chkesp(&v84 == &v84, v40, (unsigned int)&v93) != -1
  5317.                                               || (v41 = dword_441834(v90, a4, v90),
  5318.                                                   (v87 = _chkesp(&v84 == &v84, v41, (unsigned int)&v93)) == 0) )
  5319.                                             {
  5320.                                               v42 = dword_441834(v91, v91, v91);
  5321.                                               v87 = _chkesp(&v84 == &v84, v42, (unsigned int)&v93);
  5322.                                               if ( !v87 )
  5323.                                               {
  5324.                                                 v43 = dword_44180C(v91, a4);
  5325.                                                 if ( _chkesp(&v84 == &v84, v43, (unsigned int)&v93) == -1
  5326.                                                   || (v44 = dword_44183C(v91, a4, v91),
  5327.                                                       (v87 = _chkesp(&v84 == &v84, v44, (unsigned int)&v93)) == 0) )
  5328.                                                 {
  5329.                                                   v45 = dword_441834(v91, v90, v91);
  5330.                                                   v87 = _chkesp(&v84 == &v84, v45, (unsigned int)&v93);
  5331.                                                   if ( !v87 )
  5332.                                                   {
  5333.                                                     v46 = dword_44180C(v91, a4);
  5334.                                                     if ( _chkesp(&v84 == &v84, v46, (unsigned int)&v93) == -1
  5335.                                                       || (v47 = dword_44183C(v91, a4, v91),
  5336.                                                           (v87 = _chkesp(&v84 == &v84, v47, (unsigned int)&v93)) == 0) )
  5337.                                                     {
  5338.                                                       if ( !*(_DWORD *)(a2 + 8)
  5339.                                                         || (v48 = dword_441844(v88, *(_DWORD *)(a2 + 8), v88),
  5340.                                                             (v87 = _chkesp(&v84 == &v84, v48, (unsigned int)&v93)) == 0)
  5341.                                                         && (v49 = dword_441878(v88, a4, a5),
  5342.                                                             (v87 = _chkesp(&v84 == &v84, v49, (unsigned int)&v93)) == 0) )
  5343.                                                       {
  5344.                                                         v50 = dword_441844(v88, v90, v88);
  5345.                                                         v87 = _chkesp(&v84 == &v84, v50, (unsigned int)&v93);
  5346.                                                         if ( !v87 )
  5347.                                                         {
  5348.                                                           v51 = dword_441878(v88, a4, a5);
  5349.                                                           v87 = _chkesp(&v84 == &v84, v51, (unsigned int)&v93);
  5350.                                                           if ( !v87 )
  5351.                                                           {
  5352.                                                             v52 = dword_441844(v92, v90, v92);
  5353.                                                             v87 = _chkesp(&v84 == &v84, v52, (unsigned int)&v93);
  5354.                                                             if ( !v87 )
  5355.                                                             {
  5356.                                                               v53 = dword_441878(v92, a4, a5);
  5357.                                                               v87 = _chkesp(&v84 == &v84, v53, (unsigned int)&v93);
  5358.                                                               if ( !v87 )
  5359.                                                               {
  5360.                                                                 v54 = dword_44184C(v90, v90);
  5361.                                                                 v87 = _chkesp(&v84 == &v84, v54, (unsigned int)&v93);
  5362.                                                                 if ( !v87 )
  5363.                                                                 {
  5364.                                                                   v55 = dword_441878(v90, a4, a5);
  5365.                                                                   v87 = _chkesp(&v84 == &v84, v55, (unsigned int)&v93);
  5366.                                                                   if ( !v87 )
  5367.                                                                   {
  5368.                                                                     v56 = dword_441844(v91, v90, v91);
  5369.                                                                     v87 = _chkesp(&v84 == &v84, v56, (unsigned int)&v93);
  5370.                                                                     if ( !v87 )
  5371.                                                                     {
  5372.                                                                       v57 = dword_441878(v91, a4, a5);
  5373.                                                                       v87 = _chkesp(
  5374.                                                                               &v84 == &v84,
  5375.                                                                               v57,
  5376.                                                                               (unsigned int)&v93);
  5377.                                                                       if ( !v87 )
  5378.                                                                       {
  5379.                                                                         v58 = dword_441844(v92, v90, v92);
  5380.                                                                         v87 = _chkesp(
  5381.                                                                                 &v84 == &v84,
  5382.                                                                                 v58,
  5383.                                                                                 (unsigned int)&v93);
  5384.                                                                         if ( !v87 )
  5385.                                                                         {
  5386.                                                                           v59 = dword_441878(v92, a4, a5);
  5387.                                                                           v87 = _chkesp(
  5388.                                                                                   &v84 == &v84,
  5389.                                                                                   v59,
  5390.                                                                                   (unsigned int)&v93);
  5391.                                                                           if ( !v87 )
  5392.                                                                           {
  5393.                                                                             v60 = dword_44184C(v89, v90);
  5394.                                                                             v87 = _chkesp(
  5395.                                                                                     &v84 == &v84,
  5396.                                                                                     v60,
  5397.                                                                                     (unsigned int)&v93);
  5398.                                                                             if ( !v87 )
  5399.                                                                             {
  5400.                                                                               v61 = dword_441878(v90, a4, a5);
  5401.                                                                               v87 = _chkesp(
  5402.                                                                                       &v84 == &v84,
  5403.                                                                                       v61,
  5404.                                                                                       (unsigned int)&v93);
  5405.                                                                               if ( !v87 )
  5406.                                                                               {
  5407.                                                                                 v62 = dword_44183C(v90, v91, v90);
  5408.                                                                                 v87 = _chkesp(
  5409.                                                                                         &v84 == &v84,
  5410.                                                                                         v62,
  5411.                                                                                         (unsigned int)&v93);
  5412.                                                                                 if ( !v87 )
  5413.                                                                                 {
  5414.                                                                                   v63 = dword_441810(v90, 0);
  5415.                                                                                   if ( _chkesp(
  5416.                                                                                          &v84 == &v84,
  5417.                                                                                          v63,
  5418.                                                                                          (unsigned int)&v93) != -1
  5419.                                                                                     || (v64 = dword_441834(v90, a4, v90),
  5420.                                                                                         (v87 = _chkesp(
  5421.                                                                                                  &v84 == &v84,
  5422.                                                                                                  v64,
  5423.                                                                                                  (unsigned int)&v93)) == 0) )
  5424.                                                                                   {
  5425.                                                                                     v65 = dword_44183C(v91, v90, v91);
  5426.                                                                                     v87 = _chkesp(
  5427.                                                                                             &v84 == &v84,
  5428.                                                                                             v65,
  5429.                                                                                             (unsigned int)&v93);
  5430.                                                                                     if ( !v87 )
  5431.                                                                                     {
  5432.                                                                                       v66 = dword_441810(v91, 0);
  5433.                                                                                       if ( _chkesp(
  5434.                                                                                              &v84 == &v84,
  5435.                                                                                              v66,
  5436.                                                                                              (unsigned int)&v93) != -1
  5437.                                                                                         || (v67 = dword_441834(
  5438.                                                                                                     v91,
  5439.                                                                                                     a4,
  5440.                                                                                                     v91),
  5441.                                                                                             (v87 = _chkesp(
  5442.                                                                                                      &v84 == &v84,
  5443.                                                                                                      v67,
  5444.                                                                                                      (unsigned int)&v93)) == 0) )
  5445.                                                                                       {
  5446.                                                                                         v68 = dword_44183C(
  5447.                                                                                                 v91,
  5448.                                                                                                 v90,
  5449.                                                                                                 v91);
  5450.                                                                                         v87 = _chkesp(
  5451.                                                                                                 &v84 == &v84,
  5452.                                                                                                 v68,
  5453.                                                                                                 (unsigned int)&v93);
  5454.                                                                                         if ( !v87 )
  5455.                                                                                         {
  5456.                                                                                           v69 = dword_441810(v91, 0);
  5457.                                                                                           if ( _chkesp(
  5458.                                                                                                  &v84 == &v84,
  5459.                                                                                                  v69,
  5460.                                                                                                  (unsigned int)&v93) != -1
  5461.                                                                                             || (v70 = dword_441834(v91, a4, v91),
  5462.                                                                                                 (v87 = _chkesp(&v84 == &v84, v70, (unsigned int)&v93)) == 0) )
  5463.                                                                                           {
  5464.                                                                                             v71 = dword_441844(
  5465.                                                                                                     v91,
  5466.                                                                                                     v89,
  5467.                                                                                                     v91);
  5468.                                                                                             v87 = _chkesp(
  5469.                                                                                                     &v84 == &v84,
  5470.                                                                                                     v71,
  5471.                                                                                                     (unsigned int)&v93);
  5472.                                                                                             if ( !v87 )
  5473.                                                                                             {
  5474.                                                                                               v72 = dword_441878(v91, a4, a5);
  5475.                                                                                               v87 = _chkesp(&v84 == &v84, v72, (unsigned int)&v93);
  5476.                                                                                               if ( !v87 )
  5477.                                                                                               {
  5478.                                                                                                 v73 = dword_44183C(v91, v92, v89);
  5479.                                                                                                 v87 = _chkesp(&v84 == &v84, v73, (unsigned int)&v93);
  5480.                                                                                                 if ( !v87 )
  5481.                                                                                                 {
  5482.                                                                                                   v74 = dword_441810(v89, 0);
  5483.                                                                                                   if ( _chkesp(&v84 == &v84, v74, (unsigned int)&v93) != -1 || (v75 = dword_441834(v89, a4, v89), (v87 = _chkesp(&v84 == &v84, v75, (unsigned int)&v93)) == 0) )
  5484.                                                                                                   {
  5485.                                                                                                     v76 = dword_441808(v89);
  5486.                                                                                                     if ( _chkesp(&v84 == &v84, v76, (unsigned int)&v93) <= 0 )
  5487.                                                                                                     {
  5488.                                                                                                       v86 = 0;
  5489.                                                                                                     }
  5490.                                                                                                     else
  5491.                                                                                                     {
  5492.                                                                                                       v77 = dword_441804(v89, 0);
  5493.                                                                                                       v86 = (_chkesp(&v84 == &v84, v77, (unsigned int)&v93) & 1) != 0;
  5494.                                                                                                     }
  5495.                                                                                                     if ( !v86 || (v78 = dword_441834(v89, a4, v89), (v87 = _chkesp(&v84 == &v84, v78, (unsigned int)&v93)) == 0) )
  5496.                                                                                                     {
  5497.                                                                                                       v79 = dword_441854(v89, v89);
  5498.                                                                                                       v87 = _chkesp(&v84 == &v84, v79, (unsigned int)&v93);
  5499.                                                                                                       if ( !v87 )
  5500.                                                                                                       {
  5501.                                                                                                         v80 = dword_4417F8(v90, *(_DWORD *)a3);
  5502.                                                                                                         v87 = _chkesp(&v84 == &v84, v80, (unsigned int)&v93);
  5503.                                                                                                         if ( !v87 )
  5504.                                                                                                         {
  5505.                                                                                                           v81 = dword_4417F8(v89, *(_DWORD *)(a3 + 4));
  5506.                                                                                                           v87 = _chkesp(&v84 == &v84, v81, (unsigned int)&v93);
  5507.                                                                                                           if ( !v87 )
  5508.                                                                                                           {
  5509.                                                                                                             v82 = dword_4417F8(v88, *(_DWORD *)(a3 + 8));
  5510.                                                                                                             v87 = _chkesp(&v84 == &v84, v82, (unsigned int)&v93);
  5511.                                                                                                           }
  5512.                                                                                                         }
  5513.                                                                                                       }
  5514.                                                                                                     }
  5515.                                                                                                   }
  5516.                                                                                                 }
  5517.                                                                                               }
  5518.                                                                                             }
  5519.                                                                                           }
  5520.                                                                                         }
  5521.                                                                                       }
  5522.                                                                                     }
  5523.                                                                                   }
  5524.                                                                                 }
  5525.                                                                               }
  5526.                                                                             }
  5527.                                                                           }
  5528.                                                                         }
  5529.                                                                       }
  5530.                                                                     }
  5531.                                                                   }
  5532.                                                                 }
  5533.                                                               }
  5534.                                                             }
  5535.                                                           }
  5536.                                                         }
  5537.                                                       }
  5538.                                                     }
  5539.                                                   }
  5540.                                                 }
  5541.                                               }
  5542.                                             }
  5543.                                           }
  5544.                                         }
  5545.                                       }
  5546.                                     }
  5547.                                   }
  5548.                                 }
  5549.                               }
  5550.                             }
  5551.                           }
  5552.                         }
  5553.                       }
  5554.                     }
  5555.                   }
  5556.                 }
  5557.               }
  5558.             }
  5559.           }
  5560.         }
  5561.       }
  5562.     }
  5563.     sub_408570(v92, v91);
  5564.     v5 = v87;
  5565.     return _chkesp(1, v5, v84);
  5566.   }
  5567.   v5 = v87;
  5568.   return _chkesp(1, v5, v84);
  5569. }
  5570. // 43C1EC: using guessed type __int16 word_43C1EC;
  5571. // 4417F8: using guessed type int (__cdecl *dword_4417F8)(_DWORD, _DWORD);
  5572. // 441804: using guessed type int (__cdecl *dword_441804)(_DWORD, _DWORD);
  5573. // 441808: using guessed type int (__cdecl *dword_441808)(_DWORD);
  5574. // 44180C: using guessed type int (__cdecl *dword_44180C)(_DWORD, _DWORD);
  5575. // 441810: using guessed type int (__cdecl *dword_441810)(_DWORD, _DWORD);
  5576. // 441834: using guessed type int (__cdecl *dword_441834)(_DWORD, _DWORD, _DWORD);
  5577. // 44183C: using guessed type int (__cdecl *dword_44183C)(_DWORD, _DWORD, _DWORD);
  5578. // 441844: using guessed type int (__cdecl *dword_441844)(_DWORD, _DWORD, _DWORD);
  5579. // 44184C: using guessed type int (__cdecl *dword_44184C)(_DWORD, _DWORD);
  5580. // 441854: using guessed type int (__cdecl *dword_441854)(_DWORD, _DWORD);
  5581. // 441878: using guessed type int (__cdecl *dword_441878)(_DWORD, _DWORD, _DWORD);
  5582.  
  5583. //----- (0040B430) --------------------------------------------------------
  5584. int __cdecl sub_40B430(int a1, int a2, int a3, int a4, int a5)
  5585. {
  5586.   int v5; // eax@9
  5587.   int v6; // eax@10
  5588.   int v7; // eax@11
  5589.   int v8; // eax@12
  5590.   int v9; // eax@13
  5591.   int v10; // eax@14
  5592.   int v11; // eax@14
  5593.   int v12; // eax@21
  5594.   int v13; // eax@21
  5595.   int v14; // eax@25
  5596.   int v15; // eax@26
  5597.   int v16; // eax@27
  5598.   int v17; // eax@28
  5599.   int v18; // eax@30
  5600.   int v19; // eax@31
  5601.   int v20; // eax@32
  5602.   int v21; // eax@33
  5603.   int v22; // eax@33
  5604.   int v23; // eax@34
  5605.   int v24; // eax@35
  5606.   int v25; // eax@38
  5607.   int v26; // eax@40
  5608.   int v27; // eax@43
  5609.   int v28; // eax@48
  5610.   int v29; // eax@52
  5611.   int v30; // eax@53
  5612.   int v31; // eax@54
  5613.   int v32; // eax@58
  5614.   int v33; // eax@60
  5615.   int v34; // eax@68
  5616.   int v35; // eax@71
  5617.   int v36; // eax@72
  5618.   int v37; // eax@73
  5619.   int v38; // eax@75
  5620.   int v39; // eax@81
  5621.   int v40; // eax@82
  5622.   char v42; // [sp+0h] [bp-A0h]@9
  5623.   char v43; // [sp+Ch] [bp-94h]@1
  5624.   int v44; // [sp+4Ch] [bp-54h]@40
  5625.   int v45; // [sp+50h] [bp-50h]@40
  5626.   int v46; // [sp+54h] [bp-4Ch]@40
  5627.   int v47; // [sp+58h] [bp-48h]@38
  5628.   int v48; // [sp+5Ch] [bp-44h]@38
  5629.   int v49; // [sp+60h] [bp-40h]@40
  5630.   int v50; // [sp+64h] [bp-3Ch]@40
  5631.   int v51; // [sp+68h] [bp-38h]@9
  5632.   int v52; // [sp+6Ch] [bp-34h]@11
  5633.   int v53; // [sp+70h] [bp-30h]@9
  5634.   int j; // [sp+74h] [bp-2Ch]@18
  5635.   unsigned int i; // [sp+78h] [bp-28h]@15
  5636.   int v56[8]; // [sp+7Ch] [bp-24h]@17
  5637.   int v57; // [sp+9Ch] [bp-4h]@23
  5638.   int v58; // [sp+A0h] [bp+0h]@9
  5639.  
  5640.   memset(&v43, -858993460, 0x94u);
  5641.   if ( !a1 )
  5642.     errorFunctionMaybe(
  5643.       (int)"k != NULL",
  5644.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mulmod.c",
  5645.       word_43C1F0 + 7);
  5646.   if ( !a2 )
  5647.     errorFunctionMaybe(
  5648.       (int)"G != NULL",
  5649.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mulmod.c",
  5650.       word_43C1F0 + 8);
  5651.   if ( !a3 )
  5652.     errorFunctionMaybe(
  5653.       (int)"R != NULL",
  5654.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mulmod.c",
  5655.       word_43C1F0 + 9);
  5656.   if ( !a4 )
  5657.     errorFunctionMaybe(
  5658.       (int)"modulus != NULL",
  5659.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ltc_ecc_mulmod.c",
  5660.       word_43C1F0 + 10);
  5661.   v5 = dword_441870(a4, &v51);
  5662.   v53 = _chkesp(&v42 == &v42, v5, (unsigned int)&v58);
  5663.   if ( v53 )
  5664.   {
  5665.     v6 = v53;
  5666.     return _chkesp(1, v6, v42);
  5667.   }
  5668.   v7 = dword_4417E8(&v52);
  5669.   v53 = _chkesp(&v42 == &v42, v7, (unsigned int)&v58);
  5670.   if ( v53 )
  5671.   {
  5672.     v8 = dword_44187C(v51);
  5673.     _chkesp(&v42 == &v42, v8, (unsigned int)&v58);
  5674.     v6 = v53;
  5675.     return _chkesp(1, v6, v42);
  5676.   }
  5677.   v9 = dword_441874(v52, a4);
  5678.   v53 = _chkesp(&v42 == &v42, v9, (unsigned int)&v58);
  5679.   if ( v53 )
  5680.   {
  5681.     v10 = dword_44187C(v51);
  5682.     _chkesp(&v42 == &v42, v10, (unsigned int)&v58);
  5683.     v11 = dword_4417F0(v52);
  5684.     _chkesp(&v42 == &v42, v11, (unsigned int)&v58);
  5685.     v6 = v53;
  5686.     return _chkesp(1, v6, v42);
  5687.   }
  5688.   for ( i = 0; (signed int)i < 8; ++i )
  5689.   {
  5690.     v56[i] = sub_40CE30();
  5691.     if ( !v56[i] )
  5692.     {
  5693.       for ( j = 0; j < (signed int)i; ++j )
  5694.         sub_40CEB0(v56[j]);
  5695.       v12 = dword_44187C(v51);
  5696.       _chkesp(&v42 == &v42, v12, (unsigned int)&v58);
  5697.       v13 = dword_4417F0(v52);
  5698.       _chkesp(&v42 == &v42, v13, (unsigned int)&v58);
  5699.       v6 = 13;
  5700.       return _chkesp(1, v6, v42);
  5701.     }
  5702.   }
  5703.   v57 = sub_40CE30();
  5704.   if ( !v57 )
  5705.   {
  5706.     v53 = 13;
  5707.     goto LABEL_80;
  5708.   }
  5709.   v14 = dword_441810(v52, 1);
  5710.   if ( _chkesp(&v42 == &v42, v14, (unsigned int)&v58) )
  5711.   {
  5712.     v18 = dword_441864(*(_DWORD *)a2, v52, a4, *(_DWORD *)v57);
  5713.     v53 = _chkesp(&v42 == &v42, v18, (unsigned int)&v58);
  5714.     if ( v53
  5715.       || (v19 = dword_441864(*(_DWORD *)(a2 + 4), v52, a4, *(_DWORD *)(v57 + 4)),
  5716.           (v53 = _chkesp(&v42 == &v42, v19, (unsigned int)&v58)) != 0)
  5717.       || (v20 = dword_441864(*(_DWORD *)(a2 + 8), v52, a4, *(_DWORD *)(v57 + 8)),
  5718.           (v53 = _chkesp(&v42 == &v42, v20, (unsigned int)&v58)) != 0) )
  5719.       goto LABEL_80;
  5720.   }
  5721.   else
  5722.   {
  5723.     v15 = dword_4417F8(*(_DWORD *)a2, *(_DWORD *)v57);
  5724.     v53 = _chkesp(&v42 == &v42, v15, (unsigned int)&v58);
  5725.     if ( v53
  5726.       || (v16 = dword_4417F8(*(_DWORD *)(a2 + 4), *(_DWORD *)(v57 + 4)),
  5727.           (v53 = _chkesp(&v42 == &v42, v16, (unsigned int)&v58)) != 0)
  5728.       || (v17 = dword_4417F8(*(_DWORD *)(a2 + 8), *(_DWORD *)(v57 + 8)),
  5729.           (v53 = _chkesp(&v42 == &v42, v17, (unsigned int)&v58)) != 0) )
  5730.       goto LABEL_80;
  5731.   }
  5732.   v21 = dword_4417F0(v52);
  5733.   _chkesp(&v42 == &v42, v21, (unsigned int)&v58);
  5734.   v52 = 0;
  5735.   v22 = dword_441890(v57, v56[0], a4, v51);
  5736.   v53 = _chkesp(&v42 == &v42, v22, (unsigned int)&v58);
  5737.   if ( v53
  5738.     || (v23 = dword_441890(v56[0], v56[0], a4, v51), (v53 = _chkesp(&v42 == &v42, v23, (unsigned int)&v58)) != 0)
  5739.     || (v24 = dword_441890(v56[0], v56[0], a4, v51), (v53 = _chkesp(&v42 == &v42, v24, (unsigned int)&v58)) != 0) )
  5740.     goto LABEL_80;
  5741.   for ( j = 9; j < 16; ++j )
  5742.   {
  5743.     v25 = dword_44188C(*(&v47 + j), v57, *(&v48 + j), a4, v51);
  5744.     v53 = _chkesp(&v42 == &v42, v25, (unsigned int)&v58);
  5745.     if ( v53 )
  5746.       goto LABEL_80;
  5747.   }
  5748.   v45 = 0;
  5749.   v46 = 1;
  5750.   v50 = 0;
  5751.   v26 = dword_441808(a1);
  5752.   v44 = _chkesp(&v42 == &v42, v26, (unsigned int)&v58) - 1;
  5753.   v48 = 0;
  5754.   v47 = 0;
  5755.   v49 = 1;
  5756.   while ( 1 )
  5757.   {
  5758.     --v46;
  5759.     if ( v46 )
  5760.       goto LABEL_44;
  5761.     if ( v44 == -1 )
  5762.       break;
  5763.     v27 = dword_441804(a1, v44);
  5764.     v50 = _chkesp(&v42 == &v42, v27, (unsigned int)&v58);
  5765.     v46 = dword_4417E4;
  5766.     --v44;
  5767. LABEL_44:
  5768.     i = ((unsigned int)v50 >> (dword_4417E4 - 1)) & 1;
  5769.     v50 *= 2;
  5770.     if ( v45 || i )
  5771.     {
  5772.       if ( v45 != 1 || i )
  5773.       {
  5774.         ++v47;
  5775.         v48 |= i << (4 - v47);
  5776.         v45 = 2;
  5777.         if ( v47 == 4 )
  5778.         {
  5779.           if ( v49 == 1 )
  5780.           {
  5781.             v29 = dword_4417F8(*(_DWORD *)*(&v48 + v48), *(_DWORD *)a3);
  5782.             v53 = _chkesp(&v42 == &v42, v29, (unsigned int)&v58);
  5783.             if ( v53
  5784.               || (v30 = dword_4417F8(*(_DWORD *)(*(&v48 + v48) + 4), *(_DWORD *)(a3 + 4)),
  5785.                   (v53 = _chkesp(&v42 == &v42, v30, (unsigned int)&v58)) != 0)
  5786.               || (v31 = dword_4417F8(*(_DWORD *)(*(&v48 + v48) + 8), *(_DWORD *)(a3 + 8)),
  5787.                   (v53 = _chkesp(&v42 == &v42, v31, (unsigned int)&v58)) != 0) )
  5788.               goto LABEL_80;
  5789.             v49 = 0;
  5790.           }
  5791.           else
  5792.           {
  5793.             for ( j = 0; j < 4; ++j )
  5794.             {
  5795.               v32 = dword_441890(a3, a3, a4, v51);
  5796.               v53 = _chkesp(&v42 == &v42, v32, (unsigned int)&v58);
  5797.               if ( v53 )
  5798.                 goto LABEL_80;
  5799.             }
  5800.             v33 = dword_44188C(a3, *(&v48 + v48), a3, a4, v51);
  5801.             v53 = _chkesp(&v42 == &v42, v33, (unsigned int)&v58);
  5802.             if ( v53 )
  5803.               goto LABEL_80;
  5804.           }
  5805.           v48 = 0;
  5806.           v47 = 0;
  5807.           v45 = 1;
  5808.         }
  5809.       }
  5810.       else
  5811.       {
  5812.         v28 = dword_441890(a3, a3, a4, v51);
  5813.         v53 = _chkesp(&v42 == &v42, v28, (unsigned int)&v58);
  5814.         if ( v53 )
  5815.           goto LABEL_80;
  5816.       }
  5817.     }
  5818.   }
  5819.   if ( v45 == 2 && v47 > 0 )
  5820.   {
  5821.     for ( j = 0; j < v47; ++j )
  5822.     {
  5823.       if ( !v49 )
  5824.       {
  5825.         v34 = dword_441890(a3, a3, a4, v51);
  5826.         v53 = _chkesp(&v42 == &v42, v34, (unsigned int)&v58);
  5827.         if ( v53 )
  5828.           goto LABEL_80;
  5829.       }
  5830.       v48 *= 2;
  5831.       if ( v48 & 0x10 )
  5832.       {
  5833.         if ( v49 == 1 )
  5834.         {
  5835.           v35 = dword_4417F8(*(_DWORD *)v57, *(_DWORD *)a3);
  5836.           v53 = _chkesp(&v42 == &v42, v35, (unsigned int)&v58);
  5837.           if ( v53
  5838.             || (v36 = dword_4417F8(*(_DWORD *)(v57 + 4), *(_DWORD *)(a3 + 4)),
  5839.                 (v53 = _chkesp(&v42 == &v42, v36, (unsigned int)&v58)) != 0)
  5840.             || (v37 = dword_4417F8(*(_DWORD *)(v57 + 8), *(_DWORD *)(a3 + 8)),
  5841.                 (v53 = _chkesp(&v42 == &v42, v37, (unsigned int)&v58)) != 0) )
  5842.             goto LABEL_80;
  5843.           v49 = 0;
  5844.         }
  5845.         else
  5846.         {
  5847.           v38 = dword_44188C(a3, v57, a3, a4, v51);
  5848.           v53 = _chkesp(&v42 == &v42, v38, (unsigned int)&v58);
  5849.           if ( v53 )
  5850.             goto LABEL_80;
  5851.         }
  5852.       }
  5853.     }
  5854.   }
  5855.   if ( a5 )
  5856.     v53 = sub_409960(a3, a4, v51);
  5857.   else
  5858.     v53 = 0;
  5859. LABEL_80:
  5860.   if ( v52 )
  5861.   {
  5862.     v39 = dword_4417F0(v52);
  5863.     _chkesp(&v42 == &v42, v39, (unsigned int)&v58);
  5864.   }
  5865.   v40 = dword_44187C(v51);
  5866.   _chkesp(&v42 == &v42, v40, (unsigned int)&v58);
  5867.   sub_40CEB0(v57);
  5868.   for ( i = 0; (signed int)i < 8; ++i )
  5869.     sub_40CEB0(v56[i]);
  5870.   v6 = v53;
  5871.   return _chkesp(1, v6, v42);
  5872. }
  5873. // 43C1F0: using guessed type __int16 word_43C1F0;
  5874. // 4417E4: using guessed type int dword_4417E4;
  5875. // 4417E8: using guessed type int (__cdecl *dword_4417E8)(_DWORD);
  5876. // 4417F0: using guessed type int (__cdecl *dword_4417F0)(_DWORD);
  5877. // 4417F8: using guessed type int (__cdecl *dword_4417F8)(_DWORD, _DWORD);
  5878. // 441804: using guessed type int (__cdecl *dword_441804)(_DWORD, _DWORD);
  5879. // 441808: using guessed type int (__cdecl *dword_441808)(_DWORD);
  5880. // 441810: using guessed type int (__cdecl *dword_441810)(_DWORD, _DWORD);
  5881. // 441864: using guessed type int (__cdecl *dword_441864)(_DWORD, _DWORD, _DWORD, _DWORD);
  5882. // 441870: using guessed type int (__cdecl *dword_441870)(_DWORD, _DWORD);
  5883. // 441874: using guessed type int (__cdecl *dword_441874)(_DWORD, _DWORD);
  5884. // 44187C: using guessed type int (__cdecl *dword_44187C)(_DWORD);
  5885. // 44188C: using guessed type int (__cdecl *dword_44188C)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  5886. // 441890: using guessed type int (__cdecl *dword_441890)(_DWORD, _DWORD, _DWORD, _DWORD);
  5887. // 40B430: using guessed type _DWORD var_24[8];
  5888.  
  5889. //----- (0040BD00) --------------------------------------------------------
  5890. signed int __cdecl sub_40BD00(signed int a1)
  5891. {
  5892.   signed int result; // eax@4
  5893.   char v2; // [sp+Ch] [bp-40h]@1
  5894.  
  5895.   memset(&v2, -858993460, 0x40u);
  5896.   if ( a1 >= 0 && a1 < 32 && dword_43F6C8[24 * a1] )
  5897.     result = 0;
  5898.   else
  5899.     result = 10;
  5900.   return result;
  5901. }
  5902. // 43F6C8: using guessed type int dword_43F6C8[];
  5903.  
  5904. //----- (0040BD50) --------------------------------------------------------
  5905. int __cdecl sub_40BD50(int a1, int a2)
  5906. {
  5907.   int v2; // edx@3
  5908.   int v3; // eax@3
  5909.   char v5; // [sp+0h] [bp-50h]@0
  5910.   char v6; // [sp+Ch] [bp-44h]@1
  5911.   int v7; // [sp+4Ch] [bp-4h]@1
  5912.  
  5913.   memset(&v6, -858993460, 0x44u);
  5914.   v7 = a1;
  5915.   if ( !a1 )
  5916.     errorFunctionMaybe(
  5917.       (int)"out != ((void *)0)",
  5918.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\misc\\zeromem.c",
  5919.       word_43C1F4 + 2);
  5920.   while ( 1 )
  5921.   {
  5922.     v2 = a2;
  5923.     v3 = a2-- - 1;
  5924.     if ( !v2 )
  5925.       break;
  5926.     *(_BYTE *)v7++ = 0;
  5927.   }
  5928.   return _chkesp(1, v3, v5);
  5929. }
  5930. // 43C1F4: using guessed type __int16 word_43C1F4;
  5931.  
  5932. //----- (0040BDD0) --------------------------------------------------------
  5933. int __cdecl tomcrypt_hash_memory(signed int a1, int a2, int a3, int a4, int a5)
  5934. {
  5935.   int v5; // eax@8
  5936.   int v6; // eax@13
  5937.   int v7; // eax@14
  5938.   int v8; // eax@15
  5939.   char v10; // [sp+0h] [bp-54h]@13
  5940.   char v11; // [sp+Ch] [bp-48h]@1
  5941.   int v12; // [sp+4Ch] [bp-8h]@7
  5942.   int v13; // [sp+50h] [bp-4h]@11
  5943.   int v14; // [sp+54h] [bp+0h]@13
  5944.  
  5945.   memset(&v11, -858993460, 0x48u);
  5946.   if ( !a2 )
  5947.     errorFunctionMaybe(
  5948.       (int)"in != NULL",
  5949.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\helper\\hash_memory.c",
  5950.       word_43C1F8 + 4);
  5951.   if ( !a4 )
  5952.     errorFunctionMaybe(
  5953.       (int)"out != NULL",
  5954.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\helper\\hash_memory.c",
  5955.       word_43C1F8 + 5);
  5956.   if ( !a5 )
  5957.     errorFunctionMaybe(
  5958.       (int)"outlen != NULL",
  5959.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\hashes\\helper\\hash_memory.c",
  5960.       word_43C1F8 + 6);
  5961.   v12 = tomcrypt_hash_is_valid(a1);
  5962.   if ( v12 )
  5963.   {
  5964.     v5 = v12;
  5965.   }
  5966.   else
  5967.   {
  5968.     if ( *(_DWORD *)a5 >= (unsigned int)dword_4402D0[26 * a1] )
  5969.     {
  5970.       v13 = (int)malloc(0x110u);
  5971.       if ( v13 )
  5972.       {
  5973.         v6 = ((int (__cdecl *)(int))dword_44031C[26 * a1])(v13);
  5974.         v12 = _chkesp(&v10 == &v10, v6, (unsigned int)&v14);
  5975.         if ( !v12 )
  5976.         {
  5977.           v7 = ((int (__cdecl *)(int, int, int))dword_440320[26 * a1])(v13, a2, a3);
  5978.           v12 = _chkesp(&v10 == &v10, v7, (unsigned int)&v14);
  5979.           if ( !v12 )
  5980.           {
  5981.             v8 = ((int (__cdecl *)(int, int))dword_440324[26 * a1])(v13, a4);
  5982.             v12 = _chkesp(&v10 == &v10, v8, (unsigned int)&v14);
  5983.             *(_DWORD *)a5 = dword_4402D0[26 * a1];
  5984.           }
  5985.         }
  5986.         CrtCheckMemoryWrapperWrapper(v13);
  5987.         v5 = v12;
  5988.       }
  5989.       else
  5990.       {
  5991.         v5 = 13;
  5992.       }
  5993.     }
  5994.     else
  5995.     {
  5996.       *(_DWORD *)a5 = dword_4402D0[26 * a1];
  5997.       v5 = 6;
  5998.     }
  5999.   }
  6000.   return _chkesp(1, v5, v10);
  6001. }
  6002. // 43C1F8: using guessed type __int16 word_43C1F8;
  6003. // 4402D0: using guessed type int dword_4402D0[];
  6004. // 44031C: using guessed type int dword_44031C[];
  6005. // 440320: using guessed type int dword_440320[];
  6006. // 440324: using guessed type int dword_440324[];
  6007.  
  6008. //----- (0040BF70) --------------------------------------------------------
  6009. int __cdecl tomcrypt_ecc_free(int a1)
  6010. {
  6011.   int v1; // eax@3
  6012.   char v3; // [sp+0h] [bp-4Ch]@0
  6013.   char v4; // [sp+Ch] [bp-40h]@1
  6014.  
  6015.   memset(&v4, -858993460, 0x40u);
  6016.   if ( !a1 )
  6017.     errorFunctionMaybe(
  6018.       (int)"key != ((void *)0)",
  6019.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_free.c",
  6020.       word_43C1FC + 1);
  6021.   v1 = sub_408570(*(_DWORD *)(a1 + 12), *(_DWORD *)(a1 + 16));
  6022.   return _chkesp(1, v1, v3);
  6023. }
  6024. // 43C1FC: using guessed type __int16 word_43C1FC;
  6025.  
  6026. //----- (0040BFF0) --------------------------------------------------------
  6027. int __cdecl tomcrypt_ecc_shared_secret(int a1, int a2, int a3, int a4)
  6028. {
  6029.   int v4; // eax@10
  6030.   int v5; // eax@11
  6031.   int v6; // eax@12
  6032.   int v7; // eax@18
  6033.   int v8; // eax@20
  6034.   int v9; // eax@21
  6035.   int v10; // eax@22
  6036.   int v11; // eax@24
  6037.   int v12; // eax@24
  6038.   int v13; // eax@24
  6039.   int v14; // eax@25
  6040.   char v16; // [sp+0h] [bp-5Ch]@18
  6041.   char v17; // [sp+Ch] [bp-50h]@1
  6042.   int v18; // [sp+4Ch] [bp-10h]@18
  6043.   int v19; // [sp+50h] [bp-Ch]@18
  6044.   int v20; // [sp+54h] [bp-8h]@16
  6045.   unsigned int v21; // [sp+58h] [bp-4h]@22
  6046.   int v22; // [sp+5Ch] [bp+0h]@18
  6047.  
  6048.   memset(&v17, -858993460, 0x50u);
  6049.   if ( !a1 )
  6050.     errorFunctionMaybe(
  6051.       (int)"private_key != NULL",
  6052.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_shared_secret.c",
  6053.       word_43C200 + 6);
  6054.   if ( !a2 )
  6055.     errorFunctionMaybe(
  6056.       (int)"public_key != NULL",
  6057.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_shared_secret.c",
  6058.       word_43C200 + 7);
  6059.   if ( !a3 )
  6060.     errorFunctionMaybe(
  6061.       (int)"out != NULL",
  6062.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_shared_secret.c",
  6063.       word_43C200 + 8);
  6064.   if ( !a4 )
  6065.     errorFunctionMaybe(
  6066.       (int)"outlen != NULL",
  6067.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\ecc\\ecc_shared_secret.c",
  6068.       word_43C200 + 9);
  6069.   if ( *(_DWORD *)a1 == 1 )
  6070.   {
  6071.     LOBYTE(v5) = sub_40CF10(*(_DWORD *)(a1 + 4));
  6072.     if ( v5 && (LOBYTE(v6) = sub_40CF10(*(_DWORD *)(a2 + 4)), v6) )
  6073.     {
  6074.       if ( strcmp(*(const char **)(*(_DWORD *)(a1 + 8) + 4), *(const char **)(*(_DWORD *)(a2 + 8) + 4)) )
  6075.       {
  6076.         v4 = 14;
  6077.       }
  6078.       else
  6079.       {
  6080.         v20 = sub_40CE30();
  6081.         if ( v20 )
  6082.         {
  6083.           v7 = dword_4417E8(&v19);
  6084.           v18 = _chkesp(&v16 == &v16, v7, (unsigned int)&v22);
  6085.           if ( v18 )
  6086.           {
  6087.             sub_40CEB0(v20);
  6088.             v4 = v18;
  6089.           }
  6090.           else
  6091.           {
  6092.             v8 = dword_441820(v19, *(_DWORD *)(*(_DWORD *)(a1 + 8) + 8), 16);
  6093.             v18 = _chkesp(&v16 == &v16, v8, (unsigned int)&v22);
  6094.             if ( !v18 )
  6095.             {
  6096.               v9 = dword_441888(*(_DWORD *)(a1 + 24), a2 + 12, v20, v19, 1);
  6097.               v18 = _chkesp(&v16 == &v16, v9, (unsigned int)&v22);
  6098.               if ( !v18 )
  6099.               {
  6100.                 v10 = dword_441828(v19);
  6101.                 v21 = _chkesp(&v16 == &v16, v10, (unsigned int)&v22);
  6102.                 if ( *(_DWORD *)a4 >= v21 )
  6103.                 {
  6104.                   sub_40BD50(a3, v21);
  6105.                   v11 = dword_441828(*(_DWORD *)v20);
  6106.                   v12 = _chkesp(&v16 == &v16, v11, (unsigned int)&v22);
  6107.                   v13 = dword_44182C(*(_DWORD *)v20, v21 - v12 + a3);
  6108.                   v18 = _chkesp(&v16 == &v16, v13, (unsigned int)&v22);
  6109.                   *(_DWORD *)a4 = v21;
  6110.                 }
  6111.                 else
  6112.                 {
  6113.                   *(_DWORD *)a4 = v21;
  6114.                   v18 = 6;
  6115.                 }
  6116.               }
  6117.             }
  6118.             v14 = dword_4417F0(v19);
  6119.             _chkesp(&v16 == &v16, v14, (unsigned int)&v22);
  6120.             sub_40CEB0(v20);
  6121.             v4 = v18;
  6122.           }
  6123.         }
  6124.         else
  6125.         {
  6126.           v4 = 13;
  6127.         }
  6128.       }
  6129.     }
  6130.     else
  6131.     {
  6132.       v4 = 16;
  6133.     }
  6134.   }
  6135.   else
  6136.   {
  6137.     v4 = 15;
  6138.   }
  6139.   return _chkesp(1, v4, v16);
  6140. }
  6141. // 43C200: using guessed type __int16 word_43C200;
  6142. // 4417E8: using guessed type int (__cdecl *dword_4417E8)(_DWORD);
  6143. // 4417F0: using guessed type int (__cdecl *dword_4417F0)(_DWORD);
  6144. // 441820: using guessed type int (__cdecl *dword_441820)(_DWORD, _DWORD, _DWORD);
  6145. // 441828: using guessed type int (__cdecl *dword_441828)(_DWORD);
  6146. // 44182C: using guessed type int (__cdecl *dword_44182C)(_DWORD, _DWORD);
  6147. // 441888: using guessed type int (__cdecl *dword_441888)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  6148.  
  6149. //----- (0040C290) --------------------------------------------------------
  6150. signed int __cdecl tomcrypt_hash_is_valid(signed int a1)
  6151. {
  6152.   signed int result; // eax@4
  6153.   char v2; // [sp+Ch] [bp-40h]@1
  6154.  
  6155.   memset(&v2, -858993460, 0x40u);
  6156.   if ( a1 >= 0 && a1 < 32 && dword_4402C8[26 * a1] )
  6157.     result = 0;
  6158.   else
  6159.     result = 11;
  6160.   return result;
  6161. }
  6162. // 4402C8: using guessed type int dword_4402C8[];
  6163.  
  6164. //----- (0040C2E0) --------------------------------------------------------
  6165. int __cdecl tomcrypt_find_hash_oid(const void *Buf2, int a2)
  6166. {
  6167.   int v2; // eax@8
  6168.   char v4; // [sp+0h] [bp-50h]@0
  6169.   char v5; // [sp+Ch] [bp-44h]@1
  6170.   int i; // [sp+4Ch] [bp-4h]@3
  6171.  
  6172.   memset(&v5, -858993460, 0x44u);
  6173.   if ( !Buf2 )
  6174.     errorFunctionMaybe(
  6175.       (int)"ID != NULL",
  6176.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\misc\\crypt\\crypt_find_hash_oid.c",
  6177.       word_43C204 + 2);
  6178.   for ( i = 0; i < 32; ++i )
  6179.   {
  6180.     if ( dword_4402C8[26 * i] && dword_440318[26 * i] == a2 && !memcmp((char *)&unk_4402D8 + 104 * i, Buf2, 4 * a2) )
  6181.     {
  6182.       v2 = i;
  6183.       return _chkesp(1, v2, v4);
  6184.     }
  6185.   }
  6186.   v2 = -1;
  6187.   return _chkesp(1, v2, v4);
  6188. }
  6189. // 43C204: using guessed type __int16 word_43C204;
  6190. // 4402C8: using guessed type int dword_4402C8[];
  6191. // 440318: using guessed type int dword_440318[];
  6192.  
  6193. //----- (0040C3A0) --------------------------------------------------------
  6194. int __cdecl tomcrypt_der_decode_sequence(int a1, unsigned int a2, int a3, unsigned int a4, int a5)
  6195. {
  6196.   int v5; // eax@6
  6197.   int v6; // ecx@19
  6198.   char v8; // [sp+0h] [bp-74h]@0
  6199.   char v9; // [sp+Ch] [bp-68h]@1
  6200.   int v10; // [sp+4Ch] [bp-28h]@32
  6201.   int v11; // [sp+50h] [bp-24h]@29
  6202.   int i; // [sp+54h] [bp-20h]@11
  6203.   unsigned int j; // [sp+58h] [bp-1Ch]@23
  6204.   unsigned int v14; // [sp+5Ch] [bp-18h]@29
  6205.   int v15; // [sp+60h] [bp-14h]@16
  6206.   int v16; // [sp+64h] [bp-10h]@7
  6207.   unsigned int v17; // [sp+68h] [bp-Ch]@29
  6208.   int v18; // [sp+6Ch] [bp-8h]@29
  6209.   int v19; // [sp+70h] [bp-4h]@33
  6210.   unsigned int v20; // [sp+80h] [bp+Ch]@26
  6211.  
  6212.   memset(&v9, -858993460, 0x68u);
  6213.   if ( !a1 )
  6214.     errorFunctionMaybe(
  6215.       (int)"in != NULL",
  6216.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\sequence\\der_decode_sequence_ex.c",
  6217.       word_43C208 + 5);
  6218.   if ( !a3 )
  6219.     errorFunctionMaybe(
  6220.       (int)"list != NULL",
  6221.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\sequence\\der_decode_sequence_ex.c",
  6222.       word_43C208 + 6);
  6223.   if ( a2 >= 2 )
  6224.   {
  6225.     v16 = 0;
  6226.     if ( *(_BYTE *)a1 == 48 || *(_BYTE *)(v16 + a1) == 49 )
  6227.     {
  6228.       ++v16;
  6229.       if ( (signed int)*(_BYTE *)(v16 + a1) >= 128 )
  6230.       {
  6231.         if ( *(_BYTE *)(v16 + a1) & 0x80 )
  6232.         {
  6233.           if ( (signed int)*(_BYTE *)(v16 + a1) < 129 || (signed int)*(_BYTE *)(v16 + a1) > 131 )
  6234.           {
  6235.             v5 = 7;
  6236.             return _chkesp(1, v5, v8);
  6237.           }
  6238.           v15 = *(_BYTE *)(v16++ + a1) & 0x7F;
  6239.           if ( v15 + v16 > a2 )
  6240.           {
  6241.             v5 = 7;
  6242.             return _chkesp(1, v5, v8);
  6243.           }
  6244.           for ( i = 0; ; i = *(_BYTE *)(v16++ + a1) | (i << 8) )
  6245.           {
  6246.             v6 = v15--;
  6247.             if ( !v6 )
  6248.               break;
  6249.           }
  6250.         }
  6251.       }
  6252.       else
  6253.       {
  6254.         i = *(_BYTE *)(v16++ + a1);
  6255.       }
  6256.       if ( i + v16 <= a2 )
  6257.       {
  6258.         for ( j = 0; j < a4; ++j )
  6259.           *(_DWORD *)(a3 + 32 * j + 12) = 0;
  6260.         v20 = i;
  6261.         for ( j = 0; j < a4; ++j )
  6262.         {
  6263.           v14 = 0;
  6264.           v18 = *(_DWORD *)(a3 + 32 * j);
  6265.           v17 = *(_DWORD *)(a3 + 32 * j + 8);
  6266.           v11 = *(_DWORD *)(a3 + 32 * j + 4);
  6267.           if ( a5 || *(_DWORD *)(a3 + 32 * j + 12) != 1 )
  6268.           {
  6269.             if ( v18 )
  6270.             {
  6271.               v10 = v18 - 1;
  6272.               switch ( v18 )
  6273.               {
  6274.                 case 1:
  6275.                   v14 = v20;
  6276.                   v19 = sub_40FAC0(v16 + a1, v20, v11);
  6277.                   if ( !v19 )
  6278.                   {
  6279.                     v19 = sub_40FA60((int)&v14);
  6280.                     if ( !v19 )
  6281.                       goto LABEL_106;
  6282.                   }
  6283.                   break;
  6284.                 case 2:
  6285.                   v14 = v20;
  6286.                   v19 = sub_40F7D0(v16 + a1, v20, v11);
  6287.                   if ( v19 )
  6288.                   {
  6289.                     if ( !a5 )
  6290.                       continue;
  6291.                   }
  6292.                   else
  6293.                   {
  6294.                     v19 = sub_40F5E0(v11, (int)&v14);
  6295.                     if ( !v19 )
  6296.                       goto LABEL_106;
  6297.                   }
  6298.                   break;
  6299.                 case 3:
  6300.                   v14 = v20;
  6301.                   v19 = sub_40F4C0(v16 + a1, v20, v11);
  6302.                   if ( v19 )
  6303.                   {
  6304.                     if ( !a5 )
  6305.                       continue;
  6306.                   }
  6307.                   else
  6308.                   {
  6309.                     v19 = sub_40F3F0(*(_DWORD *)v11, (int)&v14);
  6310.                     if ( !v19 )
  6311.                       goto LABEL_106;
  6312.                   }
  6313.                   break;
  6314.                 case 4:
  6315.                   v14 = v20;
  6316.                   v19 = sub_40F1D0(v16 + a1, v20, v11, (int)&v17);
  6317.                   if ( v19 )
  6318.                   {
  6319.                     if ( !a5 )
  6320.                       continue;
  6321.                   }
  6322.                   else
  6323.                   {
  6324.                     *(_DWORD *)(a3 + 32 * j + 8) = v17;
  6325.                     v19 = sub_40F120(v17, (int)&v14);
  6326.                     if ( !v19 )
  6327.                       goto LABEL_106;
  6328.                   }
  6329.                   break;
  6330.                 case 5:
  6331.                   v14 = v20;
  6332.                   v19 = sub_40EF50(v16 + a1, v20, v11, (int)&v17);
  6333.                   if ( v19 )
  6334.                   {
  6335.                     if ( !a5 )
  6336.                       continue;
  6337.                   }
  6338.                   else
  6339.                   {
  6340.                     *(_DWORD *)(a3 + 32 * j + 8) = v17;
  6341.                     v19 = sub_40EEA0(v17, (int)&v14);
  6342.                     if ( !v19 )
  6343.                       goto LABEL_106;
  6344.                   }
  6345.                   break;
  6346.                 case 6:
  6347.                   if ( v20 >= 2 && *(_BYTE *)(v16 + a1) == 5 && !*(_BYTE *)(v16 + a1 + 1) )
  6348.                   {
  6349.                     v14 = 2;
  6350.                     goto LABEL_106;
  6351.                   }
  6352.                   if ( !a5 )
  6353.                     continue;
  6354.                   v19 = 7;
  6355.                   break;
  6356.                 case 7:
  6357.                   v14 = v20;
  6358.                   v19 = sub_40EC30(v16 + a1, v20, v11, (int)&v17);
  6359.                   if ( v19 )
  6360.                   {
  6361.                     if ( !a5 )
  6362.                       continue;
  6363.                   }
  6364.                   else
  6365.                   {
  6366.                     *(_DWORD *)(a3 + 32 * j + 8) = v17;
  6367.                     v19 = sub_40EAB0(v11, v17, (int)&v14);
  6368.                     if ( !v19 )
  6369.                       goto LABEL_106;
  6370.                   }
  6371.                   break;
  6372.                 case 8:
  6373.                   v14 = v20;
  6374.                   v19 = sub_40E870(v16 + a1, v20, v11, (int)&v17);
  6375.                   if ( v19 )
  6376.                   {
  6377.                     if ( !a5 )
  6378.                       continue;
  6379.                   }
  6380.                   else
  6381.                   {
  6382.                     *(_DWORD *)(a3 + 32 * j + 8) = v17;
  6383.                     v19 = sub_40E760(v11, v17, (int)&v14);
  6384.                     if ( !v19 )
  6385.                       goto LABEL_106;
  6386.                   }
  6387.                   break;
  6388.                 case 9:
  6389.                   v14 = v20;
  6390.                   v19 = sub_40E4B0(v16 + a1, v20, v11, (int)&v17);
  6391.                   if ( v19 )
  6392.                   {
  6393.                     if ( !a5 )
  6394.                       continue;
  6395.                   }
  6396.                   else
  6397.                   {
  6398.                     *(_DWORD *)(a3 + 32 * j + 8) = v17;
  6399.                     v19 = sub_40E3A0(v11, v17, (int)&v14);
  6400.                     if ( !v19 )
  6401.                       goto LABEL_106;
  6402.                   }
  6403.                   break;
  6404.                 case 10:
  6405.                   v14 = v20;
  6406.                   v19 = sub_40E020(v16 + a1, v20, v11, (int)&v17);
  6407.                   if ( v19 )
  6408.                   {
  6409.                     if ( !a5 )
  6410.                       continue;
  6411.                   }
  6412.                   else
  6413.                   {
  6414.                     *(_DWORD *)(a3 + 32 * j + 8) = v17;
  6415.                     v19 = sub_40DEE0(v11, v17, (int)&v14);
  6416.                     if ( !v19 )
  6417.                       goto LABEL_106;
  6418.                   }
  6419.                   break;
  6420.                 case 11:
  6421.                   v14 = v20;
  6422.                   v19 = sub_40D8B0(v16 + a1, (int)&v14, v11);
  6423.                   if ( !v19 )
  6424.                     goto LABEL_106;
  6425.                   if ( !a5 )
  6426.                     continue;
  6427.                   break;
  6428.                 case 14:
  6429.                   v14 = v20;
  6430.                   v19 = tomcrypt_der_decode_sequence(v16 + a1, v20, v11, v17, 0);
  6431.                   if ( v19 )
  6432.                   {
  6433.                     if ( !a5 )
  6434.                       continue;
  6435.                   }
  6436.                   else
  6437.                   {
  6438.                     v19 = sub_40D500(v11, v17, &v14);
  6439.                     if ( !v19 )
  6440.                       goto LABEL_106;
  6441.                   }
  6442.                   break;
  6443.                 case 13:
  6444.                 case 15:
  6445.                   if ( (v18 != 15 || (*(_BYTE *)(v16 + a1) & 0x3F) == 49)
  6446.                     && (v18 != 13 || (*(_BYTE *)(v16 + a1) & 0x3F) == 48) )
  6447.                   {
  6448.                     v14 = v20;
  6449.                     v19 = tomcrypt_der_decode_sequence(v16 + a1, v20, v11, v17, 1);
  6450.                     if ( v19 )
  6451.                     {
  6452.                       if ( !a5 )
  6453.                         continue;
  6454.                     }
  6455.                     else
  6456.                     {
  6457.                       v19 = sub_40D500(v11, v17, &v14);
  6458.                       if ( !v19 )
  6459.                         goto LABEL_106;
  6460.                     }
  6461.                   }
  6462.                   else
  6463.                   {
  6464.                     v19 = 7;
  6465.                   }
  6466.                   break;
  6467.                 case 12:
  6468.                   v14 = v20;
  6469.                   v19 = sub_40CF70(v16 + a1, &v14, v11, v17);
  6470.                   if ( !v19 )
  6471.                   {
  6472. LABEL_106:
  6473.                     v16 += v14;
  6474.                     v20 -= v14;
  6475.                     *(_DWORD *)(a3 + 32 * j + 12) = 1;
  6476.                     if ( !a5 )
  6477.                       j = -1;
  6478.                     continue;
  6479.                   }
  6480.                   if ( !a5 )
  6481.                     continue;
  6482.                   break;
  6483.                 default:
  6484.                   v19 = 16;
  6485.                   break;
  6486.               }
  6487.               goto LABEL_115;
  6488.             }
  6489.             break;
  6490.           }
  6491.         }
  6492.         for ( j = 0; j < a4; ++j )
  6493.         {
  6494.           if ( !*(_DWORD *)(a3 + 32 * j + 12) )
  6495.           {
  6496.             v19 = 7;
  6497.             goto LABEL_115;
  6498.           }
  6499.         }
  6500.         v19 = 0;
  6501. LABEL_115:
  6502.         v5 = v19;
  6503.       }
  6504.       else
  6505.       {
  6506.         v5 = 7;
  6507.       }
  6508.     }
  6509.     else
  6510.     {
  6511.       v5 = 7;
  6512.     }
  6513.   }
  6514.   else
  6515.   {
  6516.     v5 = 7;
  6517.   }
  6518.   return _chkesp(1, v5, v8);
  6519. }
  6520. // 40C3A0: using guessed type _DWORD __cdecl tomcrypt_der_decode_sequence(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  6521. // 40D500: using guessed type _DWORD __cdecl sub_40D500(_DWORD, _DWORD, _DWORD);
  6522. // 43C208: using guessed type __int16 word_43C208;
  6523.  
  6524. //----- (0040CC20) --------------------------------------------------------
  6525. int __cdecl sub_40CC20(int a1, size_t SizeOfElements, int a3, signed int a4)
  6526. {
  6527.   int v4; // eax@8
  6528.   int v5; // eax@13
  6529.   int v6; // eax@15
  6530.   int v7; // eax@17
  6531.   char v9; // [sp+0h] [bp-5Ch]@13
  6532.   char v10; // [sp+Ch] [bp-50h]@1
  6533.   int v11; // [sp+4Ch] [bp-10h]@11
  6534.   int v12; // [sp+50h] [bp-Ch]@4
  6535.   int v13; // [sp+54h] [bp-8h]@17
  6536.   int v14; // [sp+58h] [bp-4h]@9
  6537.   int v15; // [sp+5Ch] [bp+0h]@13
  6538.  
  6539.   memset(&v10, -858993460, 0x50u);
  6540.   if ( !a1 )
  6541.     errorFunctionMaybe(
  6542.       (int)"N != NULL",
  6543.       (int)"c:\\cr\\doc\\libs\\libtomcrypt\\src\\math\\rand_prime.c",
  6544.       word_43C20C + 4);
  6545.   if ( (SizeOfElements & 0x80000000u) == 0 )
  6546.   {
  6547.     v12 = 0;
  6548.   }
  6549.   else
  6550.   {
  6551.     v12 = 1;
  6552.     SizeOfElements = -SizeOfElements;
  6553.   }
  6554.   if ( (signed int)SizeOfElements >= 2 && (signed int)SizeOfElements <= 512 )
  6555.   {
  6556.     v14 = sub_40CDE0(a4);
  6557.     if ( v14 )
  6558.     {
  6559.       v4 = v14;
  6560.     }
  6561.     else
  6562.     {
  6563.       v11 = (int)calloc(1u, SizeOfElements);
  6564.       if ( v11 )
  6565.       {
  6566.         do
  6567.         {
  6568.           v5 = ((int (__cdecl *)(int, size_t, int))dword_440FDC[10 * a4])(v11, SizeOfElements, a3);
  6569.           if ( _chkesp(&v9 == &v9, v5, (unsigned int)&v15) != SizeOfElements )
  6570.           {
  6571.             CrtCheckMemoryWrapperWrapper(v11);
  6572.             v4 = 9;
  6573.             return _chkesp(1, v4, v9);
  6574.           }
  6575.           *(_BYTE *)v11 |= 0xC0u;
  6576.           *(_BYTE *)(SizeOfElements + v11 - 1) |= ((v12 & 1) != 0 ? 2 : 0) | 1;
  6577.           v6 = dword_441830(a1, v11, SizeOfElements);
  6578.           v14 = _chkesp(&v9 == &v9, v6, (unsigned int)&v15);
  6579.           if ( v14 )
  6580.           {
  6581.             CrtCheckMemoryWrapperWrapper(v11);
  6582.             v4 = v14;
  6583.             return _chkesp(1, v4, v9);
  6584.           }
  6585.           v7 = dword_441884(a1, &v13);
  6586.           v14 = _chkesp(&v9 == &v9, v7, (unsigned int)&v15);
  6587.           if ( v14 )
  6588.           {
  6589.             CrtCheckMemoryWrapperWrapper(v11);
  6590.             v4 = v14;
  6591.             return _chkesp(1, v4, v9);
  6592.           }
  6593.         }
  6594.         while ( !v13 );
  6595.         CrtCheckMemoryWrapperWrapper(v11);
  6596.         v4 = 0;
  6597.       }
  6598.       else
  6599.       {
  6600.         v4 = 13;
  6601.       }
  6602.     }
  6603.   }
  6604.   else
  6605.   {
  6606.     v4 = 23;
  6607.   }
  6608.   return _chkesp(1, v4, v9);
  6609. }
  6610. // 43C20C: using guessed type __int16 word_43C20C;
  6611. // 440FDC: using guessed type int dword_440FDC[];
  6612. // 441830: using guessed type int (__cdecl *dword_441830)(_DWORD, _DWORD, _DWORD);
  6613. // 441884: using guessed type int (__cdecl *dword_441884)(_DWORD, _DWORD);
  6614.  
  6615. //----- (0040CDE0) --------------------------------------------------------
  6616. signed int __cdecl sub_40CDE0(signed int a1)
  6617. {
  6618.   signed int result; // eax@4
  6619.   char v2; // [sp+Ch] [bp-40h]@1
  6620.  
  6621.   memset(&v2, -858993460, 0x40u);
  6622.   if ( a1 >= 0 && a1 < 32 && dword_440FC8[10 * a1] )
  6623.     result = 0;
  6624.   else
  6625.     result = 12;
  6626.   return result;
  6627. }
  6628. // 440FC8: using guessed type int dword_440FC8[];
  6629.  
  6630. //----- (0040CE30) --------------------------------------------------------
  6631. int __cdecl sub_40CE30()
  6632. {
  6633.   int v0; // eax@2
  6634.   char v2; // [sp+0h] [bp-50h]@0
  6635.   char v3; // [sp+Ch] [bp-44h]@1
  6636.   int v4; // [sp+4Ch] [bp-4h]@1
  6637.  
  6638.   memset(&v3, -858993460, 0x44u);
  6639.   v4 = (int)calloc(1u, 0xCu);
  6640.   if ( v4 )
  6641.   {
  6642.     if ( sub_408490(v4, v4 + 4) )
  6643.     {
  6644.       CrtCheckMemoryWrapperWrapper(v4);
  6645.       v0 = 0;
  6646.     }
  6647.     else
  6648.     {
  6649.       v0 = v4;
  6650.     }
  6651.   }
  6652.   else
  6653.   {
  6654.     v0 = 0;
  6655.   }
  6656.   return _chkesp(1, v0, v2);
  6657. }
  6658.  
  6659. //----- (0040CEB0) --------------------------------------------------------
  6660. int __cdecl sub_40CEB0(int a1)
  6661. {
  6662.   int v1; // eax@1
  6663.   char v3; // [sp+0h] [bp-4Ch]@0
  6664.   char v4; // [sp+Ch] [bp-40h]@1
  6665.  
  6666.   v1 = -858993460;
  6667.   memset(&v4, -858993460, 0x40u);
  6668.   if ( a1 )
  6669.   {
  6670.     sub_408570(*(_DWORD *)a1, *(_DWORD *)(a1 + 4));
  6671.     CrtCheckMemoryWrapperWrapper(a1);
  6672.   }
  6673.   return _chkesp(1, v1, v3);
  6674. }
  6675.  
  6676. //----- (0040CF10) --------------------------------------------------------
  6677. bool __cdecl sub_40CF10(signed int a1)
  6678. {
  6679.   char v2; // [sp+Ch] [bp-44h]@1
  6680.   int i; // [sp+4Ch] [bp-4h]@1
  6681.  
  6682.   memset(&v2, -858993460, 0x44u);
  6683.   for ( i = 0; dword_4353F8[7 * i]; ++i )
  6684.     ;
  6685.   return a1 >= -1 && a1 < i;
  6686. }
  6687. // 4353F8: using guessed type int dword_4353F8[];
  6688.  
  6689. //----- (0040CF70) --------------------------------------------------------
  6690. int __cdecl sub_40CF70(int a1, unsigned int *a2, int a3, unsigned int a4)
  6691. {
  6692.   int v4; // eax@8
  6693.   char v6; // [sp+0h] [bp-60h]@0
  6694.   char v7; // [sp+Ch] [bp-54h]@1
  6695.   int v8; // [sp+4Ch] [bp-14h]@14
  6696.   int v9; // [sp+50h] [bp-10h]@14
  6697.   unsigned int v10; // [sp+54h] [bp-Ch]@16
  6698.   unsigned int i; // [sp+58h] [bp-8h]@9
  6699.   unsigned int v12; // [sp+5Ch] [bp-4h]@14
  6700.  
  6701.   memset(&v7, -858993460, 0x54u);
  6702.   if ( !a1 )
  6703.     errorFunctionMaybe(
  6704.       (int)"in != NULL",
  6705.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\choice\\der_decode_choice.c",
  6706.       word_43C210 + 4);
  6707.   if ( !a2 )
  6708.     errorFunctionMaybe(
  6709.       (int)"inlen != NULL",
  6710.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\choice\\der_decode_choice.c",
  6711.       word_43C210 + 5);
  6712.   if ( !a3 )
  6713.     errorFunctionMaybe(
  6714.       (int)"list != NULL",
  6715.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\choice\\der_decode_choice.c",
  6716.       word_43C210 + 6);
  6717.   if ( *a2 >= 2 )
  6718.   {
  6719.     for ( i = 0; i < a4; ++i )
  6720.       *(_DWORD *)(a3 + 32 * i + 12) = 0;
  6721.     i = 0;
  6722.     while ( 2 )
  6723.     {
  6724.       if ( i >= a4 )
  6725.       {
  6726.         v4 = 7;
  6727.       }
  6728.       else
  6729.       {
  6730.         v12 = *(_DWORD *)(a3 + 32 * i + 8);
  6731.         v9 = *(_DWORD *)(a3 + 32 * i + 4);
  6732.         v8 = *(_DWORD *)(a3 + 32 * i);
  6733.         v8 -= 2;
  6734.         switch ( v8 )
  6735.         {
  6736.           case 0:
  6737.             if ( sub_40F7D0(a1, *a2, v9) || sub_40F5E0(v9, (int)&v10) )
  6738.               goto LABEL_60;
  6739.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6740.             *a2 = v10;
  6741.             v4 = 0;
  6742.             break;
  6743.           case 1:
  6744.             if ( sub_40F4C0(a1, *a2, v9) || sub_40F3F0(v12, (int)&v10) )
  6745.               goto LABEL_60;
  6746.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6747.             *a2 = v10;
  6748.             v4 = 0;
  6749.             break;
  6750.           case 2:
  6751.             if ( sub_40F1D0(a1, *a2, v9, (int)&v12) || sub_40F120(v12, (int)&v10) )
  6752.               goto LABEL_60;
  6753.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6754.             *(_DWORD *)(a3 + 32 * i + 8) = v12;
  6755.             *a2 = v10;
  6756.             v4 = 0;
  6757.             break;
  6758.           case 3:
  6759.             if ( sub_40EF50(a1, *a2, v9, (int)&v12) || sub_40EEA0(v12, (int)&v10) )
  6760.               goto LABEL_60;
  6761.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6762.             *(_DWORD *)(a3 + 32 * i + 8) = v12;
  6763.             *a2 = v10;
  6764.             v4 = 0;
  6765.             break;
  6766.           case 4:
  6767.             if ( *a2 != 2 || *(_BYTE *)(i + a1) != 5 || *(_BYTE *)(i + a1 + 1) )
  6768.               goto LABEL_60;
  6769.             *a2 = 2;
  6770.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6771.             v4 = 0;
  6772.             break;
  6773.           case 5:
  6774.             if ( sub_40EC30(a1, *a2, v9, (int)&v12) || sub_40EAB0(v9, v12, (int)&v10) )
  6775.               goto LABEL_60;
  6776.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6777.             *(_DWORD *)(a3 + 32 * i + 8) = v12;
  6778.             *a2 = v10;
  6779.             v4 = 0;
  6780.             break;
  6781.           case 6:
  6782.             if ( sub_40E870(a1, *a2, v9, (int)&v12) || sub_40E760(v9, v12, (int)&v10) )
  6783.               goto LABEL_60;
  6784.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6785.             *(_DWORD *)(a3 + 32 * i + 8) = v12;
  6786.             *a2 = v10;
  6787.             v4 = 0;
  6788.             break;
  6789.           case 7:
  6790.             if ( sub_40E4B0(a1, *a2, v9, (int)&v12) || sub_40E3A0(v9, v12, (int)&v10) )
  6791.               goto LABEL_60;
  6792.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6793.             *(_DWORD *)(a3 + 32 * i + 8) = v12;
  6794.             *a2 = v10;
  6795.             v4 = 0;
  6796.             break;
  6797.           case 8:
  6798.             if ( sub_40E020(a1, *a2, v9, (int)&v12) || sub_40DEE0(v9, v12, (int)&v10) )
  6799.               goto LABEL_60;
  6800.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6801.             *(_DWORD *)(a3 + 32 * i + 8) = v12;
  6802.             *a2 = v10;
  6803.             v4 = 0;
  6804.             break;
  6805.           case 9:
  6806.             v10 = *a2;
  6807.             if ( sub_40D8B0(a1, (int)&v10, v9) )
  6808.               goto LABEL_60;
  6809.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6810.             *a2 = v10;
  6811.             v4 = 0;
  6812.             break;
  6813.           case 11:
  6814.           case 12:
  6815.           case 13:
  6816.             if ( tomcrypt_der_decode_sequence(a1, *a2, v9, v12, 1) || sub_40D500(v9, v12, &v10) )
  6817.             {
  6818. LABEL_60:
  6819.               ++i;
  6820.               continue;
  6821.             }
  6822.             *(_DWORD *)(a3 + 32 * i + 12) = 1;
  6823.             *a2 = v10;
  6824.             v4 = 0;
  6825.             break;
  6826.           default:
  6827.             v4 = 16;
  6828.             break;
  6829.         }
  6830.       }
  6831.       break;
  6832.     }
  6833.   }
  6834.   else
  6835.   {
  6836.     v4 = 7;
  6837.   }
  6838.   return _chkesp(1, v4, v6);
  6839. }
  6840. // 40C3A0: using guessed type _DWORD __cdecl tomcrypt_der_decode_sequence(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  6841. // 40D500: using guessed type _DWORD __cdecl sub_40D500(_DWORD, _DWORD, _DWORD);
  6842. // 43C210: using guessed type __int16 word_43C210;
  6843.  
  6844. //----- (0040D500) --------------------------------------------------------
  6845. int __cdecl sub_40D500(int a1, unsigned int a2, int a3)
  6846. {
  6847.   char v4; // [sp+0h] [bp-70h]@0
  6848.   char v5; // [sp+Ch] [bp-64h]@1
  6849.   int v6; // [sp+4Ch] [bp-24h]@8
  6850.   int v7; // [sp+50h] [bp-20h]@7
  6851.   unsigned int v8; // [sp+54h] [bp-1Ch]@5
  6852.   unsigned int v9; // [sp+58h] [bp-18h]@34
  6853.   unsigned int v10; // [sp+5Ch] [bp-14h]@5
  6854.   int v11; // [sp+60h] [bp-10h]@9
  6855.   unsigned int v12; // [sp+64h] [bp-Ch]@7
  6856.   int v13; // [sp+68h] [bp-8h]@7
  6857.   int v14; // [sp+6Ch] [bp-4h]@9
  6858.  
  6859.   memset(&v5, -858993460, 0x64u);
  6860.   if ( !a1 )
  6861.     errorFunctionMaybe(
  6862.       (int)"list != NULL",
  6863.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\sequence\\der_length_sequence.c",
  6864.       word_43C214 + 5);
  6865.   if ( !a3 )
  6866.     errorFunctionMaybe(
  6867.       (int)"outlen != NULL",
  6868.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\sequence\\der_length_sequence.c",
  6869.       word_43C214 + 6);
  6870.   v10 = 0;
  6871.   v8 = 0;
  6872.   while ( 2 )
  6873.   {
  6874.     if ( v8 >= a2
  6875.       || (v13 = *(_DWORD *)(a1 + 32 * v8), v12 = *(_DWORD *)(a1 + 32 * v8 + 8), v7 = *(_DWORD *)(a1 + 32 * v8 + 4), !v13) )
  6876.     {
  6877.       v9 = v10;
  6878.       if ( v10 >= 0x80 )
  6879.       {
  6880.         if ( v10 >= 0x100 )
  6881.         {
  6882.           if ( v10 >= 0x10000 )
  6883.           {
  6884.             if ( v10 >= 0x1000000 )
  6885.             {
  6886.               v14 = 16;
  6887.               return _chkesp(1, v14, v4);
  6888.             }
  6889.             v10 += 5;
  6890.           }
  6891.           else
  6892.           {
  6893.             v10 += 4;
  6894.           }
  6895.         }
  6896.         else
  6897.         {
  6898.           v10 += 3;
  6899.         }
  6900.       }
  6901.       else
  6902.       {
  6903.         v10 += 2;
  6904.       }
  6905.       *(_DWORD *)a3 = v10;
  6906.       v14 = 0;
  6907.       return _chkesp(1, v14, v4);
  6908.     }
  6909.     v6 = v13 - 1;
  6910.     switch ( v13 )
  6911.     {
  6912.       case 1:
  6913.         v14 = sub_40FA60((int)&v11);
  6914.         if ( !v14 )
  6915.         {
  6916.           v10 += v11;
  6917.           goto LABEL_33;
  6918.         }
  6919.         return _chkesp(1, v14, v4);
  6920.       case 2:
  6921.         v14 = sub_40F5E0(v7, (int)&v11);
  6922.         if ( !v14 )
  6923.         {
  6924.           v10 += v11;
  6925.           goto LABEL_33;
  6926.         }
  6927.         return _chkesp(1, v14, v4);
  6928.       case 3:
  6929.         v14 = sub_40F3F0(*(_DWORD *)v7, (int)&v11);
  6930.         if ( !v14 )
  6931.         {
  6932.           v10 += v11;
  6933.           goto LABEL_33;
  6934.         }
  6935.         return _chkesp(1, v14, v4);
  6936.       case 4:
  6937.         v14 = sub_40F120(v12, (int)&v11);
  6938.         if ( !v14 )
  6939.         {
  6940.           v10 += v11;
  6941.           goto LABEL_33;
  6942.         }
  6943.         return _chkesp(1, v14, v4);
  6944.       case 5:
  6945.         v14 = sub_40EEA0(v12, (int)&v11);
  6946.         if ( !v14 )
  6947.         {
  6948.           v10 += v11;
  6949.           goto LABEL_33;
  6950.         }
  6951.         return _chkesp(1, v14, v4);
  6952.       case 6:
  6953.         v10 += 2;
  6954.         goto LABEL_33;
  6955.       case 7:
  6956.         v14 = sub_40EAB0(v7, v12, (int)&v11);
  6957.         if ( v14 )
  6958.           return _chkesp(1, v14, v4);
  6959.         v10 += v11;
  6960.         goto LABEL_33;
  6961.       case 8:
  6962.         v14 = sub_40E760(v7, v12, (int)&v11);
  6963.         if ( v14 )
  6964.           return _chkesp(1, v14, v4);
  6965.         v10 += v11;
  6966.         goto LABEL_33;
  6967.       case 9:
  6968.         v14 = sub_40E3A0(v7, v12, (int)&v11);
  6969.         if ( v14 )
  6970.           return _chkesp(1, v14, v4);
  6971.         v10 += v11;
  6972.         goto LABEL_33;
  6973.       case 11:
  6974.         v14 = sub_40FB90(v7, (int)&v11);
  6975.         if ( v14 )
  6976.           return _chkesp(1, v14, v4);
  6977.         v10 += v11;
  6978.         goto LABEL_33;
  6979.       case 10:
  6980.         v14 = sub_40DEE0(v7, v12, (int)&v11);
  6981.         if ( v14 )
  6982.           return _chkesp(1, v14, v4);
  6983.         v10 += v11;
  6984.         goto LABEL_33;
  6985.       case 13:
  6986.       case 14:
  6987.       case 15:
  6988.         v14 = sub_40D500(v7, v12, &v11);
  6989.         if ( v14 )
  6990.           return _chkesp(1, v14, v4);
  6991.         v10 += v11;
  6992. LABEL_33:
  6993.         ++v8;
  6994.         continue;
  6995.       default:
  6996.         v14 = 16;
  6997.         break;
  6998.     }
  6999.     return _chkesp(1, v14, v4);
  7000.   }
  7001. }
  7002. // 40D500: using guessed type _DWORD __cdecl sub_40D500(_DWORD, _DWORD, _DWORD);
  7003. // 43C214: using guessed type __int16 word_43C214;
  7004.  
  7005. //----- (0040D8B0) --------------------------------------------------------
  7006. int __cdecl sub_40D8B0(int a1, int a2, int a3)
  7007. {
  7008.   int v3; // eax@10
  7009.   int v4; // esi@16
  7010.   int v5; // esi@18
  7011.   int v6; // esi@20
  7012.   int v7; // esi@22
  7013.   int v8; // esi@24
  7014.   int v9; // ecx@30
  7015.   int v10; // esi@33
  7016.   int v11; // esi@35
  7017.   int v12; // esi@38
  7018.   int v13; // eax@44
  7019.   int v14; // esi@47
  7020.   int v15; // esi@49
  7021.   char v17; // [sp+0h] [bp-7Ch]@0
  7022.   char v18; // [sp+Ch] [bp-70h]@1
  7023.   int v19; // [sp+4Ch] [bp-30h]@45
  7024.   int v20; // [sp+50h] [bp-2Ch]@31
  7025.   int v21; // [sp+54h] [bp-28h]@13
  7026.   unsigned int i; // [sp+58h] [bp-24h]@11
  7027.   unsigned __int8 v23; // [sp+5Ch] [bp-20h]@15
  7028.   char v24[31]; // [sp+5Dh] [bp-1Fh]@16
  7029.  
  7030.   memset(&v18, -858993460, 0x70u);
  7031.   if ( !a1 )
  7032.     errorFunctionMaybe(
  7033.       (int)"in != NULL",
  7034.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utctime\\der_decode_utctime.c",
  7035.       word_43C218 + 5);
  7036.   if ( !a2 )
  7037.     errorFunctionMaybe(
  7038.       (int)"inlen != NULL",
  7039.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utctime\\der_decode_utctime.c",
  7040.       word_43C218 + 6);
  7041.   if ( !a3 )
  7042.     errorFunctionMaybe(
  7043.       (int)"out != NULL",
  7044.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utctime\\der_decode_utctime.c",
  7045.       word_43C218 + 7);
  7046.   if ( *(_DWORD *)a2 >= 2u
  7047.     && (unsigned int)*(_BYTE *)(a1 + 1) < 0x20
  7048.     && (unsigned int)*(_BYTE *)(a1 + 1) + 2 <= *(_DWORD *)a2 )
  7049.   {
  7050.     for ( i = 0; i < *(_BYTE *)(a1 + 1); ++i )
  7051.     {
  7052.       v21 = sub_40E700(*(_BYTE *)(i + a1 + 2));
  7053.       if ( v21 == -1 )
  7054.       {
  7055.         v3 = 7;
  7056.         return _chkesp(1, v3, v17);
  7057.       }
  7058.       *(&v23 + i) = v21;
  7059.     }
  7060.     *(_DWORD *)a2 = i + 2;
  7061.     i = 0;
  7062.     v4 = 10 * sub_40DDB0(v23);
  7063.     *(_DWORD *)a3 = sub_40DDB0(v24[i]) + v4;
  7064.     if ( *(_DWORD *)a3 < 0x64u )
  7065.     {
  7066.       i += 2;
  7067.       v5 = 10 * sub_40DDB0(*(&v23 + i));
  7068.       *(_DWORD *)(a3 + 4) = sub_40DDB0(v24[i]) + v5;
  7069.       if ( *(_DWORD *)(a3 + 4) < 0xDu )
  7070.       {
  7071.         i += 2;
  7072.         v6 = 10 * sub_40DDB0(*(&v23 + i));
  7073.         *(_DWORD *)(a3 + 8) = sub_40DDB0(v24[i]) + v6;
  7074.         if ( *(_DWORD *)(a3 + 8) < 0x20u )
  7075.         {
  7076.           i += 2;
  7077.           v7 = 10 * sub_40DDB0(*(&v23 + i));
  7078.           *(_DWORD *)(a3 + 12) = sub_40DDB0(v24[i]) + v7;
  7079.           if ( *(_DWORD *)(a3 + 12) < 0x18u )
  7080.           {
  7081.             i += 2;
  7082.             v8 = 10 * sub_40DDB0(*(&v23 + i));
  7083.             *(_DWORD *)(a3 + 16) = sub_40DDB0(v24[i]) + v8;
  7084.             if ( *(_DWORD *)(a3 + 16) < 0x3Cu )
  7085.             {
  7086.               i += 2;
  7087.               *(_DWORD *)(a3 + 20) = 0;
  7088.               *(_DWORD *)(a3 + 32) = 0;
  7089.               *(_DWORD *)(a3 + 28) = 0;
  7090.               *(_DWORD *)(a3 + 24) = 0;
  7091.               if ( *(&v23 + i) == 90 )
  7092.               {
  7093.                 v3 = 0;
  7094.               }
  7095.               else
  7096.               {
  7097.                 if ( *(&v23 + i) != 43 && *(&v23 + i) != 45 )
  7098.                 {
  7099.                   v12 = 10 * sub_40DDB0(*(&v23 + i));
  7100.                   *(_DWORD *)(a3 + 20) = sub_40DDB0(v24[i]) + v12;
  7101.                   if ( *(_DWORD *)(a3 + 20) < 0x3Cu )
  7102.                   {
  7103.                     i += 2;
  7104.                     if ( *(&v23 + i) == 90 )
  7105.                     {
  7106.                       v3 = 0;
  7107.                     }
  7108.                     else
  7109.                     {
  7110.                       if ( *(&v23 + i) != 43 && *(&v23 + i) != 45 )
  7111.                       {
  7112.                         v3 = 7;
  7113.                       }
  7114.                       else
  7115.                       {
  7116.                         v13 = *(&v23 + i++);
  7117.                         v19 = v13 != 43;
  7118.                         *(_DWORD *)(a3 + 24) = v19;
  7119.                         v14 = 10 * sub_40DDB0(*(&v23 + i));
  7120.                         *(_DWORD *)(a3 + 28) = sub_40DDB0(v24[i]) + v14;
  7121.                         if ( *(_DWORD *)(a3 + 28) < 0x18u )
  7122.                         {
  7123.                           i += 2;
  7124.                           v15 = 10 * sub_40DDB0(*(&v23 + i));
  7125.                           *(_DWORD *)(a3 + 32) = sub_40DDB0(v24[i]) + v15;
  7126.                           if ( *(_DWORD *)(a3 + 32) < 0x3Cu )
  7127.                           {
  7128.                             i += 2;
  7129.                             v3 = 0;
  7130.                           }
  7131.                           else
  7132.                           {
  7133.                             v3 = 7;
  7134.                           }
  7135.                         }
  7136.                         else
  7137.                         {
  7138.                           v3 = 7;
  7139.                         }
  7140.                       }
  7141.                     }
  7142.                   }
  7143.                   else
  7144.                   {
  7145.                     v3 = 7;
  7146.                   }
  7147.                 }
  7148.                 else
  7149.                 {
  7150.                   v9 = *(&v23 + i++);
  7151.                   v20 = v9 != 43;
  7152.                   *(_DWORD *)(a3 + 24) = v20;
  7153.                   v10 = 10 * sub_40DDB0(*(&v23 + i));
  7154.                   *(_DWORD *)(a3 + 28) = sub_40DDB0(v24[i]) + v10;
  7155.                   if ( *(_DWORD *)(a3 + 28) < 0x18u )
  7156.                   {
  7157.                     i += 2;
  7158.                     v11 = 10 * sub_40DDB0(*(&v23 + i));
  7159.                     *(_DWORD *)(a3 + 32) = sub_40DDB0(v24[i]) + v11;
  7160.                     if ( *(_DWORD *)(a3 + 32) < 0x3Cu )
  7161.                     {
  7162.                       i += 2;
  7163.                       v3 = 0;
  7164.                     }
  7165.                     else
  7166.                     {
  7167.                       v3 = 7;
  7168.                     }
  7169.                   }
  7170.                   else
  7171.                   {
  7172.                     v3 = 7;
  7173.                   }
  7174.                 }
  7175.               }
  7176.             }
  7177.             else
  7178.             {
  7179.               v3 = 7;
  7180.             }
  7181.           }
  7182.           else
  7183.           {
  7184.             v3 = 7;
  7185.           }
  7186.         }
  7187.         else
  7188.         {
  7189.           v3 = 7;
  7190.         }
  7191.       }
  7192.       else
  7193.       {
  7194.         v3 = 7;
  7195.       }
  7196.     }
  7197.     else
  7198.     {
  7199.       v3 = 7;
  7200.     }
  7201.   }
  7202.   else
  7203.   {
  7204.     v3 = 7;
  7205.   }
  7206.   return _chkesp(1, v3, v17);
  7207. }
  7208. // 43C218: using guessed type __int16 word_43C218;
  7209. // 40D8B0: using guessed type char var_1F[31];
  7210.  
  7211. //----- (0040DDB0) --------------------------------------------------------
  7212. signed int __cdecl sub_40DDB0(unsigned __int8 a1)
  7213. {
  7214.   signed int result; // eax@2
  7215.   char v2; // [sp+Ch] [bp-44h]@1
  7216.   int v3; // [sp+4Ch] [bp-4h]@1
  7217.  
  7218.   memset(&v2, -858993460, 0x44u);
  7219.   v3 = a1 - 48;
  7220.   switch ( a1 )
  7221.   {
  7222.     case 0x30u:
  7223.       result = 0;
  7224.       break;
  7225.     case 0x31u:
  7226.       result = 1;
  7227.       break;
  7228.     case 0x32u:
  7229.       result = 2;
  7230.       break;
  7231.     case 0x33u:
  7232.       result = 3;
  7233.       break;
  7234.     case 0x34u:
  7235.       result = 4;
  7236.       break;
  7237.     case 0x35u:
  7238.       result = 5;
  7239.       break;
  7240.     case 0x36u:
  7241.       result = 6;
  7242.       break;
  7243.     case 0x37u:
  7244.       result = 7;
  7245.       break;
  7246.     case 0x38u:
  7247.       result = 8;
  7248.       break;
  7249.     case 0x39u:
  7250.       result = 9;
  7251.       break;
  7252.     default:
  7253.       result = 100;
  7254.       break;
  7255.   }
  7256.   return result;
  7257. }
  7258.  
  7259. //----- (0040DE70) --------------------------------------------------------
  7260. signed int __cdecl sub_40DE70(unsigned __int16 a1)
  7261. {
  7262.   signed int result; // eax@2
  7263.   char v2; // [sp+Ch] [bp-40h]@1
  7264.  
  7265.   memset(&v2, -858993460, 0x40u);
  7266.   if ( (signed int)a1 > 127 )
  7267.   {
  7268.     if ( (signed int)a1 > 2047 )
  7269.     {
  7270.       if ( (signed int)a1 > 65535 )
  7271.         result = 4;
  7272.       else
  7273.         result = 3;
  7274.     }
  7275.     else
  7276.     {
  7277.       result = 2;
  7278.     }
  7279.   }
  7280.   else
  7281.   {
  7282.     result = 1;
  7283.   }
  7284.   return result;
  7285. }
  7286.  
  7287. //----- (0040DEE0) --------------------------------------------------------
  7288. int __cdecl sub_40DEE0(int a1, unsigned int a2, int a3)
  7289. {
  7290.   int v3; // eax@8
  7291.   signed int v4; // eax@9
  7292.   char v6; // [sp+0h] [bp-54h]@0
  7293.   char v7; // [sp+Ch] [bp-48h]@1
  7294.   unsigned int v8; // [sp+4Ch] [bp-8h]@5
  7295.   unsigned int i; // [sp+50h] [bp-4h]@5
  7296.  
  7297.   memset(&v7, -858993460, 0x48u);
  7298.   if ( !a1 )
  7299.     errorFunctionMaybe(
  7300.       (int)"in != NULL",
  7301.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utf8\\der_length_utf8_string.c",
  7302.       word_43C21C + 3);
  7303.   if ( !a3 )
  7304.     errorFunctionMaybe(
  7305.       (int)"outlen != NULL",
  7306.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utf8\\der_length_utf8_string.c",
  7307.       word_43C21C + 4);
  7308.   v8 = 0;
  7309.   for ( i = 0; i < a2; ++i )
  7310.   {
  7311.     if ( (signed int)*(_WORD *)(a1 + 2 * i) > 1114111 )
  7312.     {
  7313.       v3 = 16;
  7314.       return _chkesp(1, v3, v6);
  7315.     }
  7316.     v4 = sub_40DE70(*(_WORD *)(a1 + 2 * i));
  7317.     v8 += v4;
  7318.   }
  7319.   if ( v8 < 0x80 )
  7320.   {
  7321.     *(_DWORD *)a3 = v8 + 2;
  7322. LABEL_19:
  7323.     v3 = 0;
  7324.     return _chkesp(1, v3, v6);
  7325.   }
  7326.   if ( v8 < 0x100 )
  7327.   {
  7328.     *(_DWORD *)a3 = v8 + 3;
  7329.     goto LABEL_19;
  7330.   }
  7331.   if ( v8 < 0x10000 )
  7332.   {
  7333.     *(_DWORD *)a3 = v8 + 4;
  7334.     goto LABEL_19;
  7335.   }
  7336.   if ( v8 < 0x1000000 )
  7337.   {
  7338.     *(_DWORD *)a3 = v8 + 5;
  7339.     goto LABEL_19;
  7340.   }
  7341.   v3 = 16;
  7342.   return _chkesp(1, v3, v6);
  7343. }
  7344. // 43C21C: using guessed type __int16 word_43C21C;
  7345.  
  7346. //----- (0040E020) --------------------------------------------------------
  7347. int __cdecl sub_40E020(int a1, unsigned int a2, int a3, int a4)
  7348. {
  7349.   int v4; // eax@8
  7350.   int v5; // edx@17
  7351.   int v6; // ecx@34
  7352.   char v8; // [sp+0h] [bp-60h]@0
  7353.   char v9; // [sp+Ch] [bp-54h]@1
  7354.   int v10; // [sp+4Ch] [bp-14h]@16
  7355.   unsigned int v11; // [sp+50h] [bp-10h]@25
  7356.   int v12; // [sp+54h] [bp-Ch]@12
  7357.   unsigned int v13; // [sp+58h] [bp-8h]@11
  7358.   int v14; // [sp+5Ch] [bp-4h]@25
  7359.  
  7360.   memset(&v9, -858993460, 0x54u);
  7361.   if ( !a1 )
  7362.     errorFunctionMaybe(
  7363.       (int)"in != NULL",
  7364.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utf8\\der_decode_utf8_string.c",
  7365.       word_43C220 + 4);
  7366.   if ( !a3 )
  7367.     errorFunctionMaybe(
  7368.       (int)"out != NULL",
  7369.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utf8\\der_decode_utf8_string.c",
  7370.       word_43C220 + 5);
  7371.   if ( !a4 )
  7372.     errorFunctionMaybe(
  7373.       (int)"outlen != NULL",
  7374.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utf8\\der_decode_utf8_string.c",
  7375.       word_43C220 + 6);
  7376.   if ( a2 >= 2 )
  7377.   {
  7378.     if ( (*(_BYTE *)a1 & 0x1F) == 12 )
  7379.     {
  7380.       v13 = 1;
  7381.       if ( *(_BYTE *)(a1 + 1) & 0x80 )
  7382.       {
  7383.         v12 = *(_BYTE *)(v13 + a1) & 0x7F;
  7384.         if ( !v12 || (unsigned int)v12 > 3 || v12 + v13 > a2 )
  7385.         {
  7386.           v4 = 7;
  7387.           return _chkesp(1, v4, v8);
  7388.         }
  7389.         v10 = 0;
  7390.         ++v13;
  7391.         while ( 1 )
  7392.         {
  7393.           v5 = v12--;
  7394.           if ( !v5 )
  7395.             break;
  7396.           v10 = *(_BYTE *)(v13++ + a1) | (v10 << 8);
  7397.         }
  7398.       }
  7399.       else
  7400.       {
  7401.         v10 = *(_BYTE *)(v13++ + a1) & 0x7F;
  7402.       }
  7403.       if ( v13 + v10 <= a2 )
  7404.       {
  7405.         v12 = 0;
  7406.         while ( v13 < a2 )
  7407.         {
  7408.           LOWORD(v14) = *(_BYTE *)(v13++ + a1);
  7409.           v11 = 0;
  7410.           while ( v14 & 0x80 && v11 <= 4 )
  7411.           {
  7412.             ++v11;
  7413.             LOWORD(v14) = (unsigned __int8)(2 * v14);
  7414.           }
  7415.           if ( v11 > 4 || v13 + v11 - 1 > a2 )
  7416.           {
  7417.             v4 = 7;
  7418.             return _chkesp(1, v4, v8);
  7419.           }
  7420.           LOWORD(v14) = (unsigned __int16)v14 >> v11;
  7421.           if ( v11 > 1 )
  7422.             --v11;
  7423.           while ( 1 )
  7424.           {
  7425.             v6 = v11--;
  7426.             if ( !v6 )
  7427.               break;
  7428.             if ( (*(_BYTE *)(v13 + a1) & 0xC0) != 128 )
  7429.             {
  7430.               v4 = 7;
  7431.               return _chkesp(1, v4, v8);
  7432.             }
  7433.             LOWORD(v14) = *(_BYTE *)(v13++ + a1) & 0x3F | ((_WORD)v14 << 6);
  7434.           }
  7435.           if ( (unsigned int)v12 > *(_DWORD *)a4 )
  7436.           {
  7437.             *(_DWORD *)a4 = v12;
  7438.             v4 = 6;
  7439.             return _chkesp(1, v4, v8);
  7440.           }
  7441.           *(_WORD *)(a3 + 2 * v12++) = v14;
  7442.         }
  7443.         *(_DWORD *)a4 = v12;
  7444.         v4 = 0;
  7445.       }
  7446.       else
  7447.       {
  7448.         v4 = 7;
  7449.       }
  7450.     }
  7451.     else
  7452.     {
  7453.       v4 = 7;
  7454.     }
  7455.   }
  7456.   else
  7457.   {
  7458.     v4 = 7;
  7459.   }
  7460.   return _chkesp(1, v4, v8);
  7461. }
  7462. // 43C220: using guessed type __int16 word_43C220;
  7463.  
  7464. //----- (0040E2E0) --------------------------------------------------------
  7465. int __cdecl sub_40E2E0(int a1)
  7466. {
  7467.   char v2; // [sp+Ch] [bp-44h]@1
  7468.   int i; // [sp+4Ch] [bp-4h]@1
  7469.  
  7470.   memset(&v2, -858993460, 0x44u);
  7471.   for ( i = 0; i < 74; ++i )
  7472.   {
  7473.     if ( dword_4365C8[2 * i] == a1 )
  7474.       return dword_4365CC[2 * i];
  7475.   }
  7476.   return -1;
  7477. }
  7478. // 4365C8: using guessed type int dword_4365C8[];
  7479. // 4365CC: using guessed type int dword_4365CC[];
  7480.  
  7481. //----- (0040E340) --------------------------------------------------------
  7482. int __cdecl sub_40E340(int a1)
  7483. {
  7484.   char v2; // [sp+Ch] [bp-44h]@1
  7485.   int i; // [sp+4Ch] [bp-4h]@1
  7486.  
  7487.   memset(&v2, -858993460, 0x44u);
  7488.   for ( i = 0; i < 74; ++i )
  7489.   {
  7490.     if ( dword_4365CC[2 * i] == a1 )
  7491.       return dword_4365C8[2 * i];
  7492.   }
  7493.   return -1;
  7494. }
  7495. // 4365C8: using guessed type int dword_4365C8[];
  7496. // 4365CC: using guessed type int dword_4365CC[];
  7497.  
  7498. //----- (0040E3A0) --------------------------------------------------------
  7499. int __cdecl sub_40E3A0(int a1, unsigned int a2, int a3)
  7500. {
  7501.   int v3; // eax@8
  7502.   char v5; // [sp+0h] [bp-50h]@0
  7503.   char v6; // [sp+Ch] [bp-44h]@1
  7504.   unsigned int i; // [sp+4Ch] [bp-4h]@5
  7505.  
  7506.   memset(&v6, -858993460, 0x44u);
  7507.   if ( !a3 )
  7508.     errorFunctionMaybe(
  7509.       (int)"outlen != NULL",
  7510.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\printable_string\\der_length_printable_string.c",
  7511.       word_43C224 + 3);
  7512.   if ( !a1 )
  7513.     errorFunctionMaybe(
  7514.       (int)"octets != NULL",
  7515.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\printable_string\\der_length_printable_string.c",
  7516.       word_43C224 + 4);
  7517.   for ( i = 0; i < a2; ++i )
  7518.   {
  7519.     if ( sub_40E2E0(*(_BYTE *)(i + a1)) == -1 )
  7520.     {
  7521.       v3 = 16;
  7522.       return _chkesp(1, v3, v5);
  7523.     }
  7524.   }
  7525.   if ( a2 < 0x80 )
  7526.   {
  7527.     *(_DWORD *)a3 = a2 + 2;
  7528. LABEL_19:
  7529.     v3 = 0;
  7530.     return _chkesp(1, v3, v5);
  7531.   }
  7532.   if ( a2 < 0x100 )
  7533.   {
  7534.     *(_DWORD *)a3 = a2 + 3;
  7535.     goto LABEL_19;
  7536.   }
  7537.   if ( a2 < 0x10000 )
  7538.   {
  7539.     *(_DWORD *)a3 = a2 + 4;
  7540.     goto LABEL_19;
  7541.   }
  7542.   if ( a2 < 0x1000000 )
  7543.   {
  7544.     *(_DWORD *)a3 = a2 + 5;
  7545.     goto LABEL_19;
  7546.   }
  7547.   v3 = 16;
  7548.   return _chkesp(1, v3, v5);
  7549. }
  7550. // 43C224: using guessed type __int16 word_43C224;
  7551.  
  7552. //----- (0040E4B0) --------------------------------------------------------
  7553. int __cdecl sub_40E4B0(int a1, unsigned int a2, int a3, int a4)
  7554. {
  7555.   int v4; // eax@8
  7556.   int v5; // edx@17
  7557.   char v7; // [sp+0h] [bp-60h]@0
  7558.   char v8; // [sp+Ch] [bp-54h]@1
  7559.   int v9; // [sp+4Ch] [bp-14h]@27
  7560.   int v10; // [sp+50h] [bp-10h]@27
  7561.   int v11; // [sp+54h] [bp-Ch]@16
  7562.   int i; // [sp+58h] [bp-8h]@12
  7563.   int v13; // [sp+5Ch] [bp-4h]@11
  7564.  
  7565.   memset(&v8, -858993460, 0x54u);
  7566.   if ( !a1 )
  7567.     errorFunctionMaybe(
  7568.       (int)"in != NULL",
  7569.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\printable_string\\der_decode_printable_string.c",
  7570.       word_43C228 + 4);
  7571.   if ( !a3 )
  7572.     errorFunctionMaybe(
  7573.       (int)"out != NULL",
  7574.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\printable_string\\der_decode_printable_string.c",
  7575.       word_43C228 + 5);
  7576.   if ( !a4 )
  7577.     errorFunctionMaybe(
  7578.       (int)"outlen != NULL",
  7579.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\printable_string\\der_decode_printable_string.c",
  7580.       word_43C228 + 6);
  7581.   if ( a2 >= 2 )
  7582.   {
  7583.     if ( (*(_BYTE *)a1 & 0x1F) == 19 )
  7584.     {
  7585.       v13 = 1;
  7586.       if ( *(_BYTE *)(a1 + 1) & 0x80 )
  7587.       {
  7588.         i = *(_BYTE *)(v13 + a1) & 0x7F;
  7589.         if ( !i || (unsigned int)i > 3 || i + v13 > a2 )
  7590.         {
  7591.           v4 = 7;
  7592.           return _chkesp(1, v4, v7);
  7593.         }
  7594.         v11 = 0;
  7595.         ++v13;
  7596.         while ( 1 )
  7597.         {
  7598.           v5 = i--;
  7599.           if ( !v5 )
  7600.             break;
  7601.           v11 = *(_BYTE *)(v13++ + a1) | (v11 << 8);
  7602.         }
  7603.       }
  7604.       else
  7605.       {
  7606.         v11 = *(_BYTE *)(v13++ + a1) & 0x7F;
  7607.       }
  7608.       if ( (unsigned int)v11 <= *(_DWORD *)a4 )
  7609.       {
  7610.         if ( v13 + v11 <= a2 )
  7611.         {
  7612.           for ( i = 0; i < (unsigned int)v11; ++i )
  7613.           {
  7614.             v9 = *(_BYTE *)(v13++ + a1);
  7615.             v10 = sub_40E340(v9);
  7616.             if ( v10 == -1 )
  7617.             {
  7618.               v4 = 16;
  7619.               return _chkesp(1, v4, v7);
  7620.             }
  7621.             *(_BYTE *)(i + a3) = v10;
  7622.           }
  7623.           *(_DWORD *)a4 = i;
  7624.           v4 = 0;
  7625.         }
  7626.         else
  7627.         {
  7628.           v4 = 7;
  7629.         }
  7630.       }
  7631.       else
  7632.       {
  7633.         *(_DWORD *)a4 = v11;
  7634.         v4 = 6;
  7635.       }
  7636.     }
  7637.     else
  7638.     {
  7639.       v4 = 7;
  7640.     }
  7641.   }
  7642.   else
  7643.   {
  7644.     v4 = 7;
  7645.   }
  7646.   return _chkesp(1, v4, v7);
  7647. }
  7648. // 43C228: using guessed type __int16 word_43C228;
  7649.  
  7650. //----- (0040E6A0) --------------------------------------------------------
  7651. int __cdecl sub_40E6A0(int a1)
  7652. {
  7653.   char v2; // [sp+Ch] [bp-44h]@1
  7654.   int i; // [sp+4Ch] [bp-4h]@1
  7655.  
  7656.   memset(&v2, -858993460, 0x44u);
  7657.   for ( i = 0; i < 102; ++i )
  7658.   {
  7659.     if ( dword_4368E0[2 * i] == a1 )
  7660.       return dword_4368E4[2 * i];
  7661.   }
  7662.   return -1;
  7663. }
  7664. // 4368E0: using guessed type int dword_4368E0[];
  7665. // 4368E4: using guessed type int dword_4368E4[];
  7666.  
  7667. //----- (0040E700) --------------------------------------------------------
  7668. int __cdecl sub_40E700(int a1)
  7669. {
  7670.   char v2; // [sp+Ch] [bp-44h]@1
  7671.   int i; // [sp+4Ch] [bp-4h]@1
  7672.  
  7673.   memset(&v2, -858993460, 0x44u);
  7674.   for ( i = 0; i < 102; ++i )
  7675.   {
  7676.     if ( dword_4368E4[2 * i] == a1 )
  7677.       return dword_4368E0[2 * i];
  7678.   }
  7679.   return -1;
  7680. }
  7681. // 4368E0: using guessed type int dword_4368E0[];
  7682. // 4368E4: using guessed type int dword_4368E4[];
  7683.  
  7684. //----- (0040E760) --------------------------------------------------------
  7685. int __cdecl sub_40E760(int a1, unsigned int a2, int a3)
  7686. {
  7687.   int v3; // eax@8
  7688.   char v5; // [sp+0h] [bp-50h]@0
  7689.   char v6; // [sp+Ch] [bp-44h]@1
  7690.   unsigned int i; // [sp+4Ch] [bp-4h]@5
  7691.  
  7692.   memset(&v6, -858993460, 0x44u);
  7693.   if ( !a3 )
  7694.     errorFunctionMaybe(
  7695.       (int)"outlen != NULL",
  7696.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\ia5\\der_length_ia5_string.c",
  7697.       word_43C22C + 3);
  7698.   if ( !a1 )
  7699.     errorFunctionMaybe(
  7700.       (int)"octets != NULL",
  7701.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\ia5\\der_length_ia5_string.c",
  7702.       word_43C22C + 4);
  7703.   for ( i = 0; i < a2; ++i )
  7704.   {
  7705.     if ( sub_40E6A0(*(_BYTE *)(i + a1)) == -1 )
  7706.     {
  7707.       v3 = 16;
  7708.       return _chkesp(1, v3, v5);
  7709.     }
  7710.   }
  7711.   if ( a2 < 0x80 )
  7712.   {
  7713.     *(_DWORD *)a3 = a2 + 2;
  7714. LABEL_19:
  7715.     v3 = 0;
  7716.     return _chkesp(1, v3, v5);
  7717.   }
  7718.   if ( a2 < 0x100 )
  7719.   {
  7720.     *(_DWORD *)a3 = a2 + 3;
  7721.     goto LABEL_19;
  7722.   }
  7723.   if ( a2 < 0x10000 )
  7724.   {
  7725.     *(_DWORD *)a3 = a2 + 4;
  7726.     goto LABEL_19;
  7727.   }
  7728.   if ( a2 < 0x1000000 )
  7729.   {
  7730.     *(_DWORD *)a3 = a2 + 5;
  7731.     goto LABEL_19;
  7732.   }
  7733.   v3 = 16;
  7734.   return _chkesp(1, v3, v5);
  7735. }
  7736. // 43C22C: using guessed type __int16 word_43C22C;
  7737.  
  7738. //----- (0040E870) --------------------------------------------------------
  7739. int __cdecl sub_40E870(int a1, unsigned int a2, int a3, int a4)
  7740. {
  7741.   int v4; // eax@8
  7742.   int v5; // edx@17
  7743.   char v7; // [sp+0h] [bp-60h]@0
  7744.   char v8; // [sp+Ch] [bp-54h]@1
  7745.   int v9; // [sp+4Ch] [bp-14h]@27
  7746.   int v10; // [sp+50h] [bp-10h]@27
  7747.   int v11; // [sp+54h] [bp-Ch]@16
  7748.   int i; // [sp+58h] [bp-8h]@12
  7749.   int v13; // [sp+5Ch] [bp-4h]@11
  7750.  
  7751.   memset(&v8, -858993460, 0x54u);
  7752.   if ( !a1 )
  7753.     errorFunctionMaybe(
  7754.       (int)"in != NULL",
  7755.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\ia5\\der_decode_ia5_string.c",
  7756.       word_43C230 + 4);
  7757.   if ( !a3 )
  7758.     errorFunctionMaybe(
  7759.       (int)"out != NULL",
  7760.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\ia5\\der_decode_ia5_string.c",
  7761.       word_43C230 + 5);
  7762.   if ( !a4 )
  7763.     errorFunctionMaybe(
  7764.       (int)"outlen != NULL",
  7765.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\ia5\\der_decode_ia5_string.c",
  7766.       word_43C230 + 6);
  7767.   if ( a2 >= 2 )
  7768.   {
  7769.     if ( (*(_BYTE *)a1 & 0x1F) == 22 )
  7770.     {
  7771.       v13 = 1;
  7772.       if ( *(_BYTE *)(a1 + 1) & 0x80 )
  7773.       {
  7774.         i = *(_BYTE *)(v13 + a1) & 0x7F;
  7775.         if ( !i || (unsigned int)i > 3 || i + v13 > a2 )
  7776.         {
  7777.           v4 = 7;
  7778.           return _chkesp(1, v4, v7);
  7779.         }
  7780.         v11 = 0;
  7781.         ++v13;
  7782.         while ( 1 )
  7783.         {
  7784.           v5 = i--;
  7785.           if ( !v5 )
  7786.             break;
  7787.           v11 = *(_BYTE *)(v13++ + a1) | (v11 << 8);
  7788.         }
  7789.       }
  7790.       else
  7791.       {
  7792.         v11 = *(_BYTE *)(v13++ + a1) & 0x7F;
  7793.       }
  7794.       if ( (unsigned int)v11 <= *(_DWORD *)a4 )
  7795.       {
  7796.         if ( v13 + v11 <= a2 )
  7797.         {
  7798.           for ( i = 0; i < (unsigned int)v11; ++i )
  7799.           {
  7800.             v9 = *(_BYTE *)(v13++ + a1);
  7801.             v10 = sub_40E700(v9);
  7802.             if ( v10 == -1 )
  7803.             {
  7804.               v4 = 16;
  7805.               return _chkesp(1, v4, v7);
  7806.             }
  7807.             *(_BYTE *)(i + a3) = v10;
  7808.           }
  7809.           *(_DWORD *)a4 = i;
  7810.           v4 = 0;
  7811.         }
  7812.         else
  7813.         {
  7814.           v4 = 7;
  7815.         }
  7816.       }
  7817.       else
  7818.       {
  7819.         *(_DWORD *)a4 = v11;
  7820.         v4 = 6;
  7821.       }
  7822.     }
  7823.     else
  7824.     {
  7825.       v4 = 7;
  7826.     }
  7827.   }
  7828.   else
  7829.   {
  7830.     v4 = 7;
  7831.   }
  7832.   return _chkesp(1, v4, v7);
  7833. }
  7834. // 43C230: using guessed type __int16 word_43C230;
  7835.  
  7836. //----- (0040EA60) --------------------------------------------------------
  7837. int __cdecl sub_40EA60(unsigned int a1)
  7838. {
  7839.   char v2; // [sp+Ch] [bp-44h]@1
  7840.   int v3; // [sp+4Ch] [bp-4h]@1
  7841.  
  7842.   memset(&v2, -858993460, 0x44u);
  7843.   v3 = 0;
  7844.   while ( a1 )
  7845.   {
  7846.     ++v3;
  7847.     a1 >>= 1;
  7848.   }
  7849.   return v3;
  7850. }
  7851.  
  7852. //----- (0040EAB0) --------------------------------------------------------
  7853. int __cdecl sub_40EAB0(int a1, unsigned int a2, int a3)
  7854. {
  7855.   int v3; // eax@6
  7856.   char v5; // [sp+0h] [bp-5Ch]@0
  7857.   char v6; // [sp+Ch] [bp-50h]@1
  7858.   unsigned int v7; // [sp+4Ch] [bp-10h]@11
  7859.   int v8; // [sp+50h] [bp-Ch]@13
  7860.   unsigned int v9; // [sp+54h] [bp-8h]@11
  7861.   unsigned int i; // [sp+58h] [bp-4h]@11
  7862.  
  7863.   memset(&v6, -858993460, 0x50u);
  7864.   if ( !a1 )
  7865.     errorFunctionMaybe(
  7866.       (int)"words != NULL",
  7867.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\object_identifier\\der_length_object_identifier.c",
  7868.       word_43C234 + 3);
  7869.   if ( !a3 )
  7870.     errorFunctionMaybe(
  7871.       (int)"outlen != NULL",
  7872.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\object_identifier\\der_length_object_identifier.c",
  7873.       word_43C234 + 4);
  7874.   if ( a2 >= 2 )
  7875.   {
  7876.     if ( *(_DWORD *)a1 <= 3u && (*(_DWORD *)a1 >= 2u || *(_DWORD *)(a1 + 4) <= 0x27u) )
  7877.     {
  7878.       v9 = 0;
  7879.       v7 = *(_DWORD *)(a1 + 4) + 40 * *(_DWORD *)a1;
  7880.       for ( i = 1; i < a2; ++i )
  7881.       {
  7882.         v8 = sub_40EA60(v7);
  7883.         v9 += (v8 % 7u != 0) + v8 / 7u + (v7 == 0);
  7884.         if ( i < a2 - 1 )
  7885.           v7 = *(_DWORD *)(a1 + 4 * i + 4);
  7886.       }
  7887.       if ( v9 >= 0x80 )
  7888.       {
  7889.         if ( v9 >= 0x100 )
  7890.         {
  7891.           if ( v9 >= 0x10000 )
  7892.           {
  7893.             v3 = 16;
  7894.             return _chkesp(1, v3, v5);
  7895.           }
  7896.           v9 += 4;
  7897.         }
  7898.         else
  7899.         {
  7900.           v9 += 3;
  7901.         }
  7902.       }
  7903.       else
  7904.       {
  7905.         v9 += 2;
  7906.       }
  7907.       *(_DWORD *)a3 = v9;
  7908.       v3 = 0;
  7909.       return _chkesp(1, v3, v5);
  7910.     }
  7911.     v3 = 16;
  7912.   }
  7913.   else
  7914.   {
  7915.     v3 = 16;
  7916.   }
  7917.   return _chkesp(1, v3, v5);
  7918. }
  7919. // 43C234: using guessed type __int16 word_43C234;
  7920.  
  7921. //----- (0040EC30) --------------------------------------------------------
  7922. int __cdecl sub_40EC30(int a1, unsigned int a2, int a3, int a4)
  7923. {
  7924.   int v4; // eax@8
  7925.   int v5; // edx@11
  7926.   int v6; // ecx@19
  7927.   int v7; // edx@25
  7928.   int v8; // edx@26
  7929.   char v10; // [sp+0h] [bp-5Ch]@0
  7930.   char v11; // [sp+Ch] [bp-50h]@1
  7931.   int i; // [sp+4Ch] [bp-10h]@14
  7932.   int v13; // [sp+50h] [bp-Ch]@24
  7933.   int v14; // [sp+54h] [bp-8h]@18
  7934.   int v15; // [sp+58h] [bp-4h]@11
  7935.  
  7936.   memset(&v11, -858993460, 0x50u);
  7937.   if ( !a1 )
  7938.     errorFunctionMaybe(
  7939.       (int)"in != NULL",
  7940.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\object_identifier\\der_decode_object_identifier.c",
  7941.       word_43C238 + 3);
  7942.   if ( !a3 )
  7943.     errorFunctionMaybe(
  7944.       (int)"words != NULL",
  7945.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\object_identifier\\der_decode_object_identifier.c",
  7946.       word_43C238 + 4);
  7947.   if ( !a4 )
  7948.     errorFunctionMaybe(
  7949.       (int)"outlen != NULL",
  7950.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\object_identifier\\der_decode_object_identifier.c",
  7951.       word_43C238 + 5);
  7952.   if ( a2 >= 3 )
  7953.   {
  7954.     if ( *(_DWORD *)a4 >= 2u )
  7955.     {
  7956.       v15 = 0;
  7957.       v5 = *(_BYTE *)a1 & 0x1F;
  7958.       v15 = 1;
  7959.       if ( v5 == 6 )
  7960.       {
  7961.         if ( (signed int)*(_BYTE *)(v15 + a1) >= 128 )
  7962.         {
  7963.           if ( (signed int)*(_BYTE *)(v15 + a1) < 129 || (signed int)*(_BYTE *)(v15 + a1) > 130 )
  7964.           {
  7965.             v4 = 7;
  7966.             return _chkesp(1, v4, v10);
  7967.           }
  7968.           v14 = *(_BYTE *)(v15++ + a1) & 0x7F;
  7969.           for ( i = 0; ; i = *(_BYTE *)(v15++ + a1) | (i << 8) )
  7970.           {
  7971.             v6 = v14--;
  7972.             if ( !v6 )
  7973.               break;
  7974.           }
  7975.         }
  7976.         else
  7977.         {
  7978.           i = *(_BYTE *)(v15++ + a1);
  7979.         }
  7980.         if ( (unsigned int)i >= 1 && v15 + i <= a2 )
  7981.         {
  7982.           v14 = 0;
  7983.           v13 = 0;
  7984.           while ( 1 )
  7985.           {
  7986.             v7 = i--;
  7987.             if ( !v7 )
  7988.               break;
  7989.             v13 = *(_BYTE *)(v15 + a1) & 0x7F | (v13 << 7);
  7990.             v8 = *(_BYTE *)(v15++ + a1) & 0x80;
  7991.             if ( !v8 )
  7992.             {
  7993.               if ( (unsigned int)v14 >= *(_DWORD *)a4 )
  7994.               {
  7995.                 v4 = 6;
  7996.                 return _chkesp(1, v4, v10);
  7997.               }
  7998.               if ( v14 )
  7999.               {
  8000.                 *(_DWORD *)(a3 + 4 * v14++) = v13;
  8001.               }
  8002.               else
  8003.               {
  8004.                 *(_DWORD *)a3 = v13 / 0x28u;
  8005.                 *(_DWORD *)(a3 + 4) = v13 % 0x28u;
  8006.                 v14 = 2;
  8007.               }
  8008.               v13 = 0;
  8009.             }
  8010.           }
  8011.           *(_DWORD *)a4 = v14;
  8012.           v4 = 0;
  8013.         }
  8014.         else
  8015.         {
  8016.           v4 = 7;
  8017.         }
  8018.       }
  8019.       else
  8020.       {
  8021.         v4 = 7;
  8022.       }
  8023.     }
  8024.     else
  8025.     {
  8026.       v4 = 6;
  8027.     }
  8028.   }
  8029.   else
  8030.   {
  8031.     v4 = 7;
  8032.   }
  8033.   return _chkesp(1, v4, v10);
  8034. }
  8035. // 43C238: using guessed type __int16 word_43C238;
  8036.  
  8037. //----- (0040EEA0) --------------------------------------------------------
  8038. int __cdecl sub_40EEA0(unsigned int a1, int a2)
  8039. {
  8040.   int v2; // eax@11
  8041.   char v4; // [sp+0h] [bp-4Ch]@0
  8042.   char v5; // [sp+Ch] [bp-40h]@1
  8043.  
  8044.   memset(&v5, -858993460, 0x40u);
  8045.   if ( !a2 )
  8046.     errorFunctionMaybe(
  8047.       (int)"outlen != NULL",
  8048.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\octet\\der_length_octet_string.c",
  8049.       word_43C23C + 1);
  8050.   if ( a1 < 0x80 )
  8051.   {
  8052.     *(_DWORD *)a2 = a1 + 2;
  8053. LABEL_12:
  8054.     v2 = 0;
  8055.     return _chkesp(1, v2, v4);
  8056.   }
  8057.   if ( a1 < 0x100 )
  8058.   {
  8059.     *(_DWORD *)a2 = a1 + 3;
  8060.     goto LABEL_12;
  8061.   }
  8062.   if ( a1 < 0x10000 )
  8063.   {
  8064.     *(_DWORD *)a2 = a1 + 4;
  8065.     goto LABEL_12;
  8066.   }
  8067.   if ( a1 < 0x1000000 )
  8068.   {
  8069.     *(_DWORD *)a2 = a1 + 5;
  8070.     goto LABEL_12;
  8071.   }
  8072.   v2 = 16;
  8073.   return _chkesp(1, v2, v4);
  8074. }
  8075. // 43C23C: using guessed type __int16 word_43C23C;
  8076.  
  8077. //----- (0040EF50) --------------------------------------------------------
  8078. int __cdecl sub_40EF50(int a1, unsigned int a2, int a3, int a4)
  8079. {
  8080.   int v4; // eax@8
  8081.   int v5; // edx@17
  8082.   char v7; // [sp+0h] [bp-58h]@0
  8083.   char v8; // [sp+Ch] [bp-4Ch]@1
  8084.   int v9; // [sp+4Ch] [bp-Ch]@16
  8085.   int i; // [sp+50h] [bp-8h]@12
  8086.   int v11; // [sp+54h] [bp-4h]@11
  8087.  
  8088.   memset(&v8, -858993460, 0x4Cu);
  8089.   if ( !a1 )
  8090.     errorFunctionMaybe(
  8091.       (int)"in != NULL",
  8092.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\octet\\der_decode_octet_string.c",
  8093.       word_43C240 + 3);
  8094.   if ( !a3 )
  8095.     errorFunctionMaybe(
  8096.       (int)"out != NULL",
  8097.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\octet\\der_decode_octet_string.c",
  8098.       word_43C240 + 4);
  8099.   if ( !a4 )
  8100.     errorFunctionMaybe(
  8101.       (int)"outlen != NULL",
  8102.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\octet\\der_decode_octet_string.c",
  8103.       word_43C240 + 5);
  8104.   if ( a2 >= 2 )
  8105.   {
  8106.     if ( (*(_BYTE *)a1 & 0x1F) == 4 )
  8107.     {
  8108.       v11 = 1;
  8109.       if ( *(_BYTE *)(a1 + 1) & 0x80 )
  8110.       {
  8111.         i = *(_BYTE *)(v11 + a1) & 0x7F;
  8112.         if ( !i || (unsigned int)i > 3 || i + v11 > a2 )
  8113.         {
  8114.           v4 = 7;
  8115.           return _chkesp(1, v4, v7);
  8116.         }
  8117.         v9 = 0;
  8118.         ++v11;
  8119.         while ( 1 )
  8120.         {
  8121.           v5 = i--;
  8122.           if ( !v5 )
  8123.             break;
  8124.           v9 = *(_BYTE *)(v11++ + a1) | (v9 << 8);
  8125.         }
  8126.       }
  8127.       else
  8128.       {
  8129.         v9 = *(_BYTE *)(v11++ + a1) & 0x7F;
  8130.       }
  8131.       if ( (unsigned int)v9 <= *(_DWORD *)a4 )
  8132.       {
  8133.         if ( v11 + v9 <= a2 )
  8134.         {
  8135.           for ( i = 0; i < (unsigned int)v9; ++i )
  8136.             *(_BYTE *)(i + a3) = *(_BYTE *)(v11++ + a1);
  8137.           *(_DWORD *)a4 = i;
  8138.           v4 = 0;
  8139.         }
  8140.         else
  8141.         {
  8142.           v4 = 7;
  8143.         }
  8144.       }
  8145.       else
  8146.       {
  8147.         *(_DWORD *)a4 = v9;
  8148.         v4 = 6;
  8149.       }
  8150.     }
  8151.     else
  8152.     {
  8153.       v4 = 7;
  8154.     }
  8155.   }
  8156.   else
  8157.   {
  8158.     v4 = 7;
  8159.   }
  8160.   return _chkesp(1, v4, v7);
  8161. }
  8162. // 43C240: using guessed type __int16 word_43C240;
  8163.  
  8164. //----- (0040F120) --------------------------------------------------------
  8165. int __cdecl sub_40F120(unsigned int a1, int a2)
  8166. {
  8167.   int v2; // eax@9
  8168.   char v4; // [sp+0h] [bp-50h]@0
  8169.   char v5; // [sp+Ch] [bp-44h]@1
  8170.   unsigned int v6; // [sp+4Ch] [bp-4h]@3
  8171.  
  8172.   memset(&v5, -858993460, 0x44u);
  8173.   if ( !a2 )
  8174.     errorFunctionMaybe(
  8175.       (int)"outlen != NULL",
  8176.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\bit\\der_length_bit_string.c",
  8177.       word_43C244 + 2);
  8178.   v6 = (a1 >> 3) + ((a1 & 7) != 0) + 1;
  8179.   if ( v6 < 0x80 )
  8180.   {
  8181.     *(_DWORD *)a2 = v6 + 2;
  8182. LABEL_10:
  8183.     v2 = 0;
  8184.     return _chkesp(1, v2, v4);
  8185.   }
  8186.   if ( v6 < 0x100 )
  8187.   {
  8188.     *(_DWORD *)a2 = v6 + 3;
  8189.     goto LABEL_10;
  8190.   }
  8191.   if ( v6 < 0x10000 )
  8192.   {
  8193.     *(_DWORD *)a2 = v6 + 4;
  8194.     goto LABEL_10;
  8195.   }
  8196.   v2 = 16;
  8197.   return _chkesp(1, v2, v4);
  8198. }
  8199. // 43C244: using guessed type __int16 word_43C244;
  8200.  
  8201. //----- (0040F1D0) --------------------------------------------------------
  8202. int __cdecl sub_40F1D0(int a1, unsigned int a2, int a3, int a4)
  8203. {
  8204.   int v4; // eax@8
  8205.   int v5; // ecx@16
  8206.   char v7; // [sp+0h] [bp-5Ch]@0
  8207.   char v8; // [sp+Ch] [bp-50h]@1
  8208.   int j; // [sp+4Ch] [bp-10h]@12
  8209.   int v10; // [sp+50h] [bp-Ch]@11
  8210.   int v11; // [sp+54h] [bp-8h]@23
  8211.   int i; // [sp+58h] [bp-4h]@15
  8212.  
  8213.   memset(&v8, -858993460, 0x50u);
  8214.   if ( !a1 )
  8215.     errorFunctionMaybe(
  8216.       (int)"in != NULL",
  8217.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\bit\\der_decode_bit_string.c",
  8218.       word_43C248 + 3);
  8219.   if ( !a3 )
  8220.     errorFunctionMaybe(
  8221.       (int)"out != NULL",
  8222.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\bit\\der_decode_bit_string.c",
  8223.       word_43C248 + 4);
  8224.   if ( !a4 )
  8225.     errorFunctionMaybe(
  8226.       (int)"outlen != NULL",
  8227.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\bit\\der_decode_bit_string.c",
  8228.       word_43C248 + 5);
  8229.   if ( a2 >= 4 )
  8230.   {
  8231.     if ( (*(_BYTE *)a1 & 0x1F) == 3 )
  8232.     {
  8233.       v10 = 1;
  8234.       if ( *(_BYTE *)(a1 + 1) & 0x80 )
  8235.       {
  8236.         j = *(_BYTE *)(v10++ + a1) & 0x7F;
  8237.         if ( !j || (unsigned int)j > 2 )
  8238.         {
  8239.           v4 = 7;
  8240.           return _chkesp(1, v4, v7);
  8241.         }
  8242.         for ( i = 0; ; i = *(_BYTE *)(v10++ + a1) | (i << 8) )
  8243.         {
  8244.           v5 = j--;
  8245.           if ( !v5 )
  8246.             break;
  8247.         }
  8248.       }
  8249.       else
  8250.       {
  8251.         i = *(_BYTE *)(v10++ + a1) & 0x7F;
  8252.       }
  8253.       if ( i && v10 + i <= a2 )
  8254.       {
  8255.         v11 = 8 * i - 8 - (*(_BYTE *)(v10++ + a1) & 7);
  8256.         if ( (unsigned int)v11 <= *(_DWORD *)a4 )
  8257.         {
  8258.           for ( j = 0; j < (unsigned int)v11; ++j )
  8259.           {
  8260.             *(_BYTE *)(j + a3) = ((1 << (7 - (j & 7))) & *(_BYTE *)(v10 + a1)) != 0;
  8261.             if ( (j & 7) == 7 )
  8262.               ++v10;
  8263.           }
  8264.           *(_DWORD *)a4 = v11;
  8265.           v4 = 0;
  8266.         }
  8267.         else
  8268.         {
  8269.           *(_DWORD *)a4 = v11;
  8270.           v4 = 6;
  8271.         }
  8272.       }
  8273.       else
  8274.       {
  8275.         v4 = 7;
  8276.       }
  8277.     }
  8278.     else
  8279.     {
  8280.       v4 = 7;
  8281.     }
  8282.   }
  8283.   else
  8284.   {
  8285.     v4 = 16;
  8286.   }
  8287.   return _chkesp(1, v4, v7);
  8288. }
  8289. // 43C248: using guessed type __int16 word_43C248;
  8290.  
  8291. //----- (0040F3F0) --------------------------------------------------------
  8292. int __cdecl sub_40F3F0(unsigned int a1, int a2)
  8293. {
  8294.   char v3; // [sp+0h] [bp-58h]@0
  8295.   char v4; // [sp+Ch] [bp-4Ch]@1
  8296.   unsigned int i; // [sp+50h] [bp-8h]@3
  8297.   int v6; // [sp+54h] [bp-4h]@3
  8298.  
  8299.   memset(&v4, -858993460, 0x4Cu);
  8300.   if ( !a2 )
  8301.     errorFunctionMaybe(
  8302.       (int)"outlen != NULL",
  8303.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\short_integer\\der_length_short_integer.c",
  8304.       word_43C24C + 3);
  8305.   v6 = 0;
  8306.   for ( i = a1; i; i >>= 8 )
  8307.     ++v6;
  8308.   if ( !v6 )
  8309.     v6 = 1;
  8310.   *(_DWORD *)a2 = (((1 << (8 * v6 - 1)) & a1) != 0) + v6 + 2;
  8311.   return _chkesp(1, 0, v3);
  8312. }
  8313. // 43C24C: using guessed type __int16 word_43C24C;
  8314.  
  8315. //----- (0040F4C0) --------------------------------------------------------
  8316. int __cdecl sub_40F4C0(int a1, unsigned int a2, int a3)
  8317. {
  8318.   int v3; // eax@6
  8319.   int v4; // eax@7
  8320.   int v5; // eax@12
  8321.   char v7; // [sp+0h] [bp-58h]@0
  8322.   char v8; // [sp+Ch] [bp-4Ch]@1
  8323.   int i; // [sp+4Ch] [bp-Ch]@11
  8324.   int v10; // [sp+50h] [bp-8h]@7
  8325.   int v11; // [sp+54h] [bp-4h]@9
  8326.  
  8327.   memset(&v8, -858993460, 0x4Cu);
  8328.   if ( !a3 )
  8329.     errorFunctionMaybe(
  8330.       (int)"num != NULL",
  8331.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\short_integer\\der_decode_short_integer.c",
  8332.       word_43C250 + 3);
  8333.   if ( !a1 )
  8334.     errorFunctionMaybe(
  8335.       (int)"in != NULL",
  8336.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\short_integer\\der_decode_short_integer.c",
  8337.       word_43C250 + 4);
  8338.   if ( a2 >= 2 )
  8339.   {
  8340.     v10 = 0;
  8341.     v4 = *(_BYTE *)a1 & 0x1F;
  8342.     v10 = 1;
  8343.     if ( v4 == 2 )
  8344.     {
  8345.       v11 = *(_BYTE *)(v10++ + a1);
  8346.       if ( v11 + v10 <= a2 )
  8347.       {
  8348.         for ( i = 0; ; i = *(_BYTE *)(v10++ + a1) | (i << 8) )
  8349.         {
  8350.           v5 = v11--;
  8351.           if ( !v5 )
  8352.             break;
  8353.         }
  8354.         *(_DWORD *)a3 = i;
  8355.         v3 = 0;
  8356.       }
  8357.       else
  8358.       {
  8359.         v3 = 7;
  8360.       }
  8361.     }
  8362.     else
  8363.     {
  8364.       v3 = 7;
  8365.     }
  8366.   }
  8367.   else
  8368.   {
  8369.     v3 = 7;
  8370.   }
  8371.   return _chkesp(1, v3, v7);
  8372. }
  8373. // 43C250: using guessed type __int16 word_43C250;
  8374.  
  8375. //----- (0040F5E0) --------------------------------------------------------
  8376. int __cdecl sub_40F5E0(int a1, int a2)
  8377. {
  8378.   int v2; // eax@5
  8379.   int v3; // eax@6
  8380.   int v4; // eax@7
  8381.   int v5; // eax@10
  8382.   int v6; // eax@10
  8383.   int v7; // eax@11
  8384.   int v8; // eax@11
  8385.   int v9; // eax@11
  8386.   int v10; // esi@11
  8387.   int v11; // eax@11
  8388.   int v12; // eax@12
  8389.   char v14; // [sp+0h] [bp-58h]@5
  8390.   char v15; // [sp+Ch] [bp-4Ch]@1
  8391.   int v16; // [sp+4Ch] [bp-Ch]@8
  8392.   unsigned int v17; // [sp+50h] [bp-8h]@10
  8393.   unsigned int v18; // [sp+54h] [bp-4h]@10
  8394.   int v19; // [sp+58h] [bp+0h]@5
  8395.  
  8396.   memset(&v15, -858993460, 0x4Cu);
  8397.   if ( !a1 )
  8398.     errorFunctionMaybe(
  8399.       (int)"num != NULL",
  8400.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\integer\\der_length_integer.c",
  8401.       word_43C254 + 4);
  8402.   if ( !a2 )
  8403.     errorFunctionMaybe(
  8404.       (int)"outlen != NULL",
  8405.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\integer\\der_length_integer.c",
  8406.       word_43C254 + 5);
  8407.   v2 = dword_441810(a1, 0);
  8408.   if ( _chkesp(&v14 == &v14, v2, (unsigned int)&v19) == -1 )
  8409.   {
  8410.     v16 = 0;
  8411.     v7 = dword_441814(a1);
  8412.     v8 = _chkesp(&v14 == &v14, v7, (unsigned int)&v19);
  8413.     v18 = 8 - (v8 & 7) + v8;
  8414.     v9 = dword_441818(a1);
  8415.     v10 = _chkesp(&v14 == &v14, v9, (unsigned int)&v19) + 1;
  8416.     v11 = dword_441814(a1);
  8417.     if ( v10 == _chkesp(&v14 == &v14, v11, (unsigned int)&v14) )
  8418.     {
  8419.       v12 = dword_441814(a1);
  8420.       if ( !(_chkesp(&v14 == &v14, v12, (unsigned int)&v14) & 7) )
  8421.         --v18;
  8422.     }
  8423.     v18 >>= 3;
  8424.     v17 = v18;
  8425.   }
  8426.   else
  8427.   {
  8428.     v3 = dword_441814(a1);
  8429.     v16 = !(_chkesp(&v14 == &v14, v3, (unsigned int)&v19) & 7)
  8430.        || (v4 = dword_441810(a1, 0), (_chkesp(&v14 == &v14, v4, (unsigned int)&v19) == 0) == 1);
  8431.     v5 = dword_441828(a1);
  8432.     v6 = _chkesp(&v14 == &v14, v5, (unsigned int)&v19);
  8433.     v17 = v6 + v16;
  8434.     v18 = v6 + v16;
  8435.   }
  8436.   if ( v18 >= 0x80 )
  8437.   {
  8438.     ++v17;
  8439.     while ( v18 )
  8440.     {
  8441.       ++v17;
  8442.       v18 >>= 8;
  8443.     }
  8444.   }
  8445.   else
  8446.   {
  8447.     ++v17;
  8448.   }
  8449.   ++v17;
  8450.   *(_DWORD *)a2 = v17;
  8451.   return _chkesp(1, 0, v14);
  8452. }
  8453. // 43C254: using guessed type __int16 word_43C254;
  8454. // 441810: using guessed type int (__cdecl *dword_441810)(_DWORD, _DWORD);
  8455. // 441814: using guessed type int (__cdecl *dword_441814)(_DWORD);
  8456. // 441818: using guessed type int (__cdecl *dword_441818)(_DWORD);
  8457. // 441828: using guessed type int (__cdecl *dword_441828)(_DWORD);
  8458.  
  8459. //----- (0040F7D0) --------------------------------------------------------
  8460. int __cdecl sub_40F7D0(int a1, unsigned int a2, int a3)
  8461. {
  8462.   int v3; // eax@6
  8463.   int v4; // eax@7
  8464.   int v5; // eax@12
  8465.   int v6; // eax@20
  8466.   int v7; // eax@24
  8467.   int v8; // eax@27
  8468.   int v9; // eax@29
  8469.   int v10; // eax@29
  8470.   int v11; // eax@29
  8471.   int v12; // eax@30
  8472.   int v13; // eax@31
  8473.   int v14; // eax@32
  8474.   char v16; // [sp+0h] [bp-60h]@12
  8475.   char v17; // [sp+Ch] [bp-54h]@1
  8476.   int v18; // [sp+4Ch] [bp-14h]@27
  8477.   int v19; // [sp+50h] [bp-10h]@12
  8478.   int v20; // [sp+54h] [bp-Ch]@9
  8479.   int i; // [sp+58h] [bp-8h]@19
  8480.   int v22; // [sp+5Ch] [bp-4h]@7
  8481.   int v23; // [sp+60h] [bp+0h]@12
  8482.  
  8483.   memset(&v17, -858993460, 0x54u);
  8484.   if ( !a3 )
  8485.     errorFunctionMaybe(
  8486.       (int)"num != NULL",
  8487.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\integer\\der_decode_integer.c",
  8488.       word_43C258 + 4);
  8489.   if ( !a1 )
  8490.     errorFunctionMaybe(
  8491.       (int)"in != NULL",
  8492.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\integer\\der_decode_integer.c",
  8493.       word_43C258 + 5);
  8494.   if ( a2 >= 3 )
  8495.   {
  8496.     v22 = 0;
  8497.     v4 = *(_BYTE *)a1 & 0x1F;
  8498.     v22 = 1;
  8499.     if ( v4 == 2 )
  8500.     {
  8501.       v20 = *(_BYTE *)(v22++ + a1);
  8502.       if ( v20 & 0x80 )
  8503.       {
  8504.         v20 &= 0x7Fu;
  8505.         if ( v20 + v22 > a2 || (unsigned int)v20 > 4 || !v20 )
  8506.         {
  8507.           v3 = 7;
  8508.           return _chkesp(1, v3, v16);
  8509.         }
  8510.         for ( i = 0; ; i = (i << 8) | *(_BYTE *)(v22++ + a1) )
  8511.         {
  8512.           v6 = v20--;
  8513.           if ( !v6 )
  8514.             break;
  8515.         }
  8516.         if ( i + v22 > a2 )
  8517.         {
  8518.           v3 = 7;
  8519.           return _chkesp(1, v3, v16);
  8520.         }
  8521.         v7 = dword_441830(a3, v22 + a1, i);
  8522.         v19 = _chkesp(&v16 == &v16, v7, (unsigned int)&v23);
  8523.         if ( v19 )
  8524.         {
  8525.           v3 = v19;
  8526.           return _chkesp(1, v3, v16);
  8527.         }
  8528.       }
  8529.       else
  8530.       {
  8531.         if ( v20 + v22 > a2 )
  8532.         {
  8533.           v3 = 7;
  8534.           return _chkesp(1, v3, v16);
  8535.         }
  8536.         v5 = dword_441830(a3, v22 + a1, v20);
  8537.         v19 = _chkesp(&v16 == &v16, v5, (unsigned int)&v23);
  8538.         if ( v19 )
  8539.         {
  8540.           v3 = v19;
  8541.           return _chkesp(1, v3, v16);
  8542.         }
  8543.       }
  8544.       if ( *(_BYTE *)(v22 + a1) & 0x80 )
  8545.       {
  8546.         v8 = dword_4417E8(&v18);
  8547.         if ( _chkesp(&v16 == &v16, v8, (unsigned int)&v23) )
  8548.         {
  8549.           v3 = 13;
  8550.           return _chkesp(1, v3, v16);
  8551.         }
  8552.         v9 = dword_441814(a3);
  8553.         v10 = _chkesp(&v16 == &v16, v9, (unsigned int)&v23);
  8554.         v11 = dword_44181C(v18, v10);
  8555.         if ( _chkesp(&v16 == &v16, v11, (unsigned int)&v23)
  8556.           || (v12 = dword_44183C(a3, v18, a3), _chkesp(&v16 == &v16, v12, (unsigned int)&v23)) )
  8557.         {
  8558.           v13 = dword_4417F0(v18);
  8559.           _chkesp(&v16 == &v16, v13, (unsigned int)&v23);
  8560.           v3 = 13;
  8561.           return _chkesp(1, v3, v16);
  8562.         }
  8563.         v14 = dword_4417F0(v18);
  8564.         _chkesp(&v16 == &v16, v14, (unsigned int)&v23);
  8565.       }
  8566.       v3 = 0;
  8567.       return _chkesp(1, v3, v16);
  8568.     }
  8569.     v3 = 7;
  8570.   }
  8571.   else
  8572.   {
  8573.     v3 = 7;
  8574.   }
  8575.   return _chkesp(1, v3, v16);
  8576. }
  8577. // 43C258: using guessed type __int16 word_43C258;
  8578. // 4417E8: using guessed type int (__cdecl *dword_4417E8)(_DWORD);
  8579. // 4417F0: using guessed type int (__cdecl *dword_4417F0)(_DWORD);
  8580. // 441814: using guessed type int (__cdecl *dword_441814)(_DWORD);
  8581. // 44181C: using guessed type int (__cdecl *dword_44181C)(_DWORD, _DWORD);
  8582. // 441830: using guessed type int (__cdecl *dword_441830)(_DWORD, _DWORD, _DWORD);
  8583. // 44183C: using guessed type int (__cdecl *dword_44183C)(_DWORD, _DWORD, _DWORD);
  8584.  
  8585. //----- (0040FA60) --------------------------------------------------------
  8586. int __cdecl sub_40FA60(int a1)
  8587. {
  8588.   char v2; // [sp+0h] [bp-4Ch]@0
  8589.   char v3; // [sp+Ch] [bp-40h]@1
  8590.  
  8591.   memset(&v3, -858993460, 0x40u);
  8592.   if ( !a1 )
  8593.     errorFunctionMaybe(
  8594.       (int)"outlen != NULL",
  8595.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\boolean\\der_length_boolean.c",
  8596.       word_43C25C + 1);
  8597.   *(_DWORD *)a1 = 3;
  8598.   return _chkesp(1, 0, v2);
  8599. }
  8600. // 43C25C: using guessed type __int16 word_43C25C;
  8601.  
  8602. //----- (0040FAC0) --------------------------------------------------------
  8603. int __cdecl sub_40FAC0(int a1, int a2, int a3)
  8604. {
  8605.   int v3; // eax@10
  8606.   char v5; // [sp+0h] [bp-4Ch]@0
  8607.   char v6; // [sp+Ch] [bp-40h]@1
  8608.  
  8609.   memset(&v6, -858993460, 0x40u);
  8610.   if ( !a1 )
  8611.     errorFunctionMaybe(
  8612.       (int)"in != NULL",
  8613.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\boolean\\der_decode_boolean.c",
  8614.       word_43C260 + 1);
  8615.   if ( !a3 )
  8616.     errorFunctionMaybe(
  8617.       (int)"out != NULL",
  8618.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\boolean\\der_decode_boolean.c",
  8619.       word_43C260 + 2);
  8620.   if ( a2 != 3 || *(_BYTE *)a1 != 1 || *(_BYTE *)(a1 + 1) != 1 || *(_BYTE *)(a1 + 2) && *(_BYTE *)(a1 + 2) != 255 )
  8621.   {
  8622.     v3 = 16;
  8623.   }
  8624.   else
  8625.   {
  8626.     *(_DWORD *)a3 = *(_BYTE *)(a1 + 2) == 255;
  8627.     v3 = 0;
  8628.   }
  8629.   return _chkesp(1, v3, v5);
  8630. }
  8631. // 43C260: using guessed type __int16 word_43C260;
  8632.  
  8633. //----- (0040FB90) --------------------------------------------------------
  8634. int __cdecl sub_40FB90(int a1, int a2)
  8635. {
  8636.   char v3; // [sp+0h] [bp-4Ch]@0
  8637.   char v4; // [sp+Ch] [bp-40h]@1
  8638.  
  8639.   memset(&v4, -858993460, 0x40u);
  8640.   if ( !a2 )
  8641.     errorFunctionMaybe(
  8642.       (int)"outlen != NULL",
  8643.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utctime\\der_length_utctime.c",
  8644.       word_43C264 + 1);
  8645.   if ( !a1 )
  8646.     errorFunctionMaybe(
  8647.       (int)"utctime != NULL",
  8648.       (int)"C:\\cr\\doc\\libs\\libtomcrypt\\src\\pk\\asn1\\der\\utctime\\der_length_utctime.c",
  8649.       word_43C264 + 2);
  8650.   if ( *(_DWORD *)(a1 + 28) || *(_DWORD *)(a1 + 32) )
  8651.     *(_DWORD *)a2 = 19;
  8652.   else
  8653.     *(_DWORD *)a2 = 15;
  8654.   return _chkesp(1, 0, v3);
  8655. }
  8656. // 43C264: using guessed type __int16 word_43C264;
  8657.  
  8658. //----- (004106F0) --------------------------------------------------------
  8659. void __cdecl CrtCheckMemoryWrapperWrapper(int a1)
  8660. {
  8661.   CrtCheckMemoryWrapper(a1, 1);
  8662. }
  8663.  
  8664. //----- (00410710) --------------------------------------------------------
  8665. void __cdecl CrtCheckMemoryWrapper(int a1, signed int a2)
  8666. {
  8667.   int v2; // ecx@13
  8668.   int v3; // ecx@20
  8669.   char v4; // [sp+0h] [bp-10h]@0
  8670.   int lpMem; // [sp+Ch] [bp-4h]@13
  8671.  
  8672.   if ( dword_43C268 & 4 && !sub_410DD0() && _CrtDbgReport(2, (int)"dbgheap.c", 1026, 0, "_CrtCheckMemory()", v4) == 1 )
  8673.     __debugbreak();
  8674.   if ( a1 )
  8675.   {
  8676.     if ( off_43C520(3, a1, 0, a2, 0, 0, 0) )
  8677.     {
  8678.       if ( !sub_411210(a1) && _CrtDbgReport(2, (int)"dbgheap.c", 1044, 0, "_CrtIsValidHeapPointer(pUserData)", v4) == 1 )
  8679.         __debugbreak();
  8680.       v2 = a1 - 32;
  8681.       lpMem = a1 - 32;
  8682.       if ( (*(_DWORD *)(a1 - 32 + 20) & 0xFFFF) != 4 )
  8683.       {
  8684.         v2 = a1 - 32;
  8685.         if ( *(_DWORD *)(lpMem + 20) != 1 )
  8686.         {
  8687.           if ( (*(_DWORD *)(lpMem + 20) & 0xFFFF) != 2 )
  8688.           {
  8689.             v2 = a1 - 32;
  8690.             if ( *(_DWORD *)(lpMem + 20) != 3 )
  8691.             {
  8692.               if ( _CrtDbgReport(2, (int)"dbgheap.c", 1050, 0, "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)", v4) == 1 )
  8693.                 __debugbreak();
  8694.             }
  8695.           }
  8696.         }
  8697.       }
  8698.       if ( !(dword_43C268 & 4) )
  8699.       {
  8700.         LOBYTE(v2) = byte_43C274;
  8701.         if ( !CheckBytes(lpMem + 28, v2, 4)
  8702.           && _CrtDbgReport(
  8703.                1,
  8704.                0,
  8705.                0,
  8706.                0,
  8707.                "DAMAGE: before %hs block (#%d) at 0x%08X.\n",
  8708.                *(_DWORD *)&off_43C278[4 * (*(_DWORD *)(lpMem + 20) & 0xFFFF)]) == 1 )
  8709.           __debugbreak();
  8710.         LOBYTE(v3) = byte_43C274;
  8711.         if ( !CheckBytes(lpMem + *(_DWORD *)(lpMem + 16) + 32, v3, 4)
  8712.           && _CrtDbgReport(
  8713.                1,
  8714.                0,
  8715.                0,
  8716.                0,
  8717.                "DAMAGE: after %hs block (#%d) at 0x%08X.\n",
  8718.                *(_DWORD *)&off_43C278[4 * (*(_DWORD *)(lpMem + 20) & 0xFFFF)]) == 1 )
  8719.           __debugbreak();
  8720.       }
  8721.       if ( *(_DWORD *)(lpMem + 20) == 3 )
  8722.       {
  8723.         if ( *(_DWORD *)(lpMem + 12) != -19088708 || *(_DWORD *)(lpMem + 24) )
  8724.         {
  8725.           if ( _CrtDbgReport(
  8726.                  2,
  8727.                  (int)"dbgheap.c",
  8728.                  1071,
  8729.                  0,
  8730.                  "pHead->nLine == IGNORE_LINE && pHead->lRequest == IGNORE_REQ",
  8731.                  v4) == 1 )
  8732.             __debugbreak();
  8733.         }
  8734.         memset((void *)lpMem, (unsigned __int8)byte_43C275, *(_DWORD *)(lpMem + 16) + 36);
  8735.         sub_4146B0((LPVOID)lpMem);
  8736.       }
  8737.       else
  8738.       {
  8739.         if ( *(_DWORD *)(lpMem + 20) == 2 && a2 == 1 )
  8740.           a2 = 2;
  8741.         if ( *(_DWORD *)(lpMem + 20) != a2
  8742.           && _CrtDbgReport(2, (int)"dbgheap.c", 1084, 0, "pHead->nBlockUse == nBlockUse", v4) == 1 )
  8743.           __debugbreak();
  8744.         dword_4414D4 -= *(_DWORD *)(lpMem + 16);
  8745.         if ( dword_43C268 & 2 )
  8746.         {
  8747.           *(_DWORD *)(lpMem + 20) = 0;
  8748.           memset((void *)a1, (unsigned __int8)byte_43C275, *(_DWORD *)(a1 - 32 + 16));
  8749.         }
  8750.         else
  8751.         {
  8752.           if ( *(_DWORD *)lpMem )
  8753.           {
  8754.             *(_DWORD *)(*(_DWORD *)lpMem + 4) = *(_DWORD *)(lpMem + 4);
  8755.           }
  8756.           else
  8757.           {
  8758.             if ( dword_4414C8 != lpMem && _CrtDbgReport(2, (int)"dbgheap.c", 1099, 0, "_pLastBlock == pHead", v4) == 1 )
  8759.               __debugbreak();
  8760.             dword_4414C8 = *(_DWORD *)(lpMem + 4);
  8761.           }
  8762.           if ( *(_DWORD *)(lpMem + 4) )
  8763.           {
  8764.             **(_DWORD **)(lpMem + 4) = *(_DWORD *)lpMem;
  8765.           }
  8766.           else
  8767.           {
  8768.             if ( dword_4414D0 != lpMem && _CrtDbgReport(2, (int)"dbgheap.c", 1109, 0, "_pFirstBlock == pHead", v4) == 1 )
  8769.               __debugbreak();
  8770.             dword_4414D0 = *(_DWORD *)lpMem;
  8771.           }
  8772.           memset((void *)lpMem, (unsigned __int8)byte_43C275, *(_DWORD *)(lpMem + 16) + 36);
  8773.           sub_4146B0((LPVOID)lpMem);
  8774.         }
  8775.       }
  8776.     }
  8777.     else
  8778.     {
  8779.       if ( _CrtDbgReport(0, 0, 0, 0, "%s", (unsigned int)"Client hook free failure.\n") == 1 )
  8780.         __debugbreak();
  8781.     }
  8782.   }
  8783. }
  8784. // 410D40: using guessed type _DWORD __cdecl CheckBytes(_DWORD, _DWORD, _DWORD);
  8785. // 43C268: using guessed type int dword_43C268;
  8786. // 43C274: using guessed type char byte_43C274;
  8787. // 43C275: using guessed type char byte_43C275;
  8788. // 43C520: using guessed type int (__cdecl *off_43C520)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  8789. // 4414C8: using guessed type int dword_4414C8;
  8790. // 4414D0: using guessed type int dword_4414D0;
  8791. // 4414D4: using guessed type int dword_4414D4;
  8792.  
  8793. //----- (00410DD0) --------------------------------------------------------
  8794. signed int __cdecl sub_410DD0()
  8795. {
  8796.   signed int result; // eax@2
  8797.   int v1; // eax@25
  8798.   int v2; // ecx@29
  8799.   int v3; // edx@37
  8800.   int v4; // [sp+10h] [bp-14h]@27
  8801.   signed int v5; // [sp+14h] [bp-10h]@23
  8802.   signed int v6; // [sp+18h] [bp-Ch]@3
  8803.   int i; // [sp+1Ch] [bp-8h]@21
  8804.   signed int v8; // [sp+20h] [bp-4h]@20
  8805.  
  8806.   if ( dword_43C268 & 1 )
  8807.   {
  8808.     v6 = sub_414780();
  8809.     if ( v6 == -1 || v6 == -2 )
  8810.     {
  8811.       v8 = 1;
  8812.       for ( i = dword_4414D0; i; i = *(_DWORD *)i )
  8813.       {
  8814.         v5 = 1;
  8815.         if ( (*(_DWORD *)(i + 20) & 0xFFFF) != 4
  8816.           && *(_DWORD *)(i + 20) != 1
  8817.           && (v1 = i, (*(_DWORD *)(i + 20) & 0xFFFF) != 2)
  8818.           && *(_DWORD *)(i + 20) != 3 )
  8819.         {
  8820.           v4 = (int)"DAMAGED";
  8821.         }
  8822.         else
  8823.         {
  8824.           v1 = i;
  8825.           v4 = *(_DWORD *)&off_43C278[4 * (*(_DWORD *)(i + 20) & 0xFFFF)];
  8826.         }
  8827.         LOBYTE(v1) = byte_43C274;
  8828.         if ( !CheckBytes(i + 28, v1, 4) )
  8829.         {
  8830.           if ( _CrtDbgReport(0, 0, 0, 0, "DAMAGE: before %hs block (#%d) at 0x%08X.\n", v4) == 1 )
  8831.             __debugbreak();
  8832.           v5 = 0;
  8833.         }
  8834.         LOBYTE(v2) = byte_43C274;
  8835.         if ( !CheckBytes(i + *(_DWORD *)(i + 16) + 32, v2, 4) )
  8836.         {
  8837.           if ( _CrtDbgReport(0, 0, 0, 0, "DAMAGE: after %hs block (#%d) at 0x%08X.\n", v4) == 1 )
  8838.             __debugbreak();
  8839.           v5 = 0;
  8840.         }
  8841.         v3 = i;
  8842.         if ( !*(_DWORD *)(i + 20) )
  8843.         {
  8844.           LOBYTE(v3) = byte_43C275;
  8845.           if ( !CheckBytes(i + 32, v3, *(_DWORD *)(i + 16)) )
  8846.           {
  8847.             if ( _CrtDbgReport(0, 0, 0, 0, "DAMAGE: on top of Free block at 0x%08X.\n", i + 32) == 1 )
  8848.               __debugbreak();
  8849.             v5 = 0;
  8850.           }
  8851.         }
  8852.         if ( !v5 )
  8853.         {
  8854.           if ( *(_DWORD *)(i + 8) && _CrtDbgReport(0, 0, 0, 0, "%hs allocated at file %hs(%d).\n", v4) == 1 )
  8855.             __debugbreak();
  8856.           if ( _CrtDbgReport(0, 0, 0, 0, "%hs located at 0x%08X is %u bytes long.\n", v4) == 1 )
  8857.             __debugbreak();
  8858.           v8 = 0;
  8859.         }
  8860.       }
  8861.     }
  8862.     else
  8863.     {
  8864.       switch ( v6 + 6 )
  8865.       {
  8866.         case 3:
  8867.           if ( _CrtDbgReport(0, 0, 0, 0, "%s", (unsigned int)"_heapchk fails with _HEAPBADBEGIN.\n") == 1 )
  8868.             __debugbreak();
  8869.           break;
  8870.         case 2:
  8871.           if ( _CrtDbgReport(0, 0, 0, 0, "%s", (unsigned int)"_heapchk fails with _HEAPBADNODE.\n") == 1 )
  8872.             __debugbreak();
  8873.           break;
  8874.         case 1:
  8875.           if ( _CrtDbgReport(0, 0, 0, 0, "%s", (unsigned int)"_heapchk fails with _HEAPBADEND.\n") == 1 )
  8876.             __debugbreak();
  8877.           break;
  8878.         case 0:
  8879.           if ( _CrtDbgReport(0, 0, 0, 0, "%s", (unsigned int)"_heapchk fails with _HEAPBADPTR.\n") == 1 )
  8880.             __debugbreak();
  8881.           break;
  8882.         default:
  8883.           if ( _CrtDbgReport(0, 0, 0, 0, "%s", (unsigned int)"_heapchk fails with unknown return value!\n") == 1 )
  8884.             __debugbreak();
  8885.           break;
  8886.       }
  8887.       v8 = 0;
  8888.     }
  8889.     result = v8;
  8890.   }
  8891.   else
  8892.   {
  8893.     result = 1;
  8894.   }
  8895.   return result;
  8896. }
  8897. // 410D40: using guessed type _DWORD __cdecl CheckBytes(_DWORD, _DWORD, _DWORD);
  8898. // 43C268: using guessed type int dword_43C268;
  8899. // 43C274: using guessed type char byte_43C274;
  8900. // 43C275: using guessed type char byte_43C275;
  8901. // 4414D0: using guessed type int dword_4414D0;
  8902.  
  8903. //----- (00411210) --------------------------------------------------------
  8904. BOOL __cdecl sub_411210(int a1)
  8905. {
  8906.   BOOL result; // eax@2
  8907.   char v2; // [sp+0h] [bp-10h]@12
  8908.   int v3; // [sp+4h] [bp-Ch]@12
  8909.   char v4; // [sp+8h] [bp-8h]@12
  8910.   int v5; // [sp+Ch] [bp-4h]@6
  8911.  
  8912.   if ( a1 )
  8913.   {
  8914.     if ( _CrtIsValidPointer((void *)(a1 - 32), 0x20u, 1) )
  8915.     {
  8916.       if ( dword_441CF0 == 3 )
  8917.       {
  8918.         v5 = __sbh_find_block(a1 - 32);
  8919.         if ( v5 )
  8920.         {
  8921.           result = __sbh_verify_block(v5, a1 - 32);
  8922.         }
  8923.         else
  8924.         {
  8925.           if ( dword_441550 & 0x8000 )
  8926.             result = 1;
  8927.           else
  8928.             result = HeapValidate(hHeap, 0, (LPCVOID)(a1 - 32));
  8929.         }
  8930.       }
  8931.       else
  8932.       {
  8933.         if ( dword_441CF0 == 2 )
  8934.         {
  8935.           v3 = __sbh_find_block_0(a1 - 32, &v2, &v4);
  8936.           if ( v3 )
  8937.           {
  8938.             if ( *(_BYTE *)v3 )
  8939.               result = 1;
  8940.             else
  8941.               result = 0;
  8942.           }
  8943.           else
  8944.           {
  8945.             if ( dword_441550 & 0x8000 )
  8946.               result = 1;
  8947.             else
  8948.               result = HeapValidate(hHeap, 0, (LPCVOID)(a1 - 32));
  8949.           }
  8950.         }
  8951.         else
  8952.         {
  8953.           result = HeapValidate(hHeap, 0, (LPCVOID)(a1 - 32));
  8954.         }
  8955.       }
  8956.     }
  8957.     else
  8958.     {
  8959.       result = 0;
  8960.     }
  8961.   }
  8962.   else
  8963.   {
  8964.     result = 0;
  8965.   }
  8966.   return result;
  8967. }
  8968. // 4149D0: using guessed type _DWORD __cdecl __sbh_find_block(_DWORD);
  8969. // 414A30: using guessed type _DWORD __cdecl __sbh_verify_block(_DWORD, _DWORD);
  8970. // 4169F0: using guessed type _DWORD __cdecl __sbh_find_block_0(_DWORD, _DWORD, _DWORD);
  8971. // 441550: using guessed type int dword_441550;
  8972. // 441CF0: using guessed type int dword_441CF0;
  8973.  
  8974. //----- (00412AB8) --------------------------------------------------------
  8975. int __usercall sub_412AB8<eax>(int a1<ebp>)
  8976. {
  8977.   *(_DWORD *)(a1 - 32) = ***(_DWORD ***)(a1 - 20);
  8978.   return _XcptFilter(*(_DWORD *)(a1 - 32), *(struct _EXCEPTION_POINTERS **)(a1 - 20));
  8979. }
  8980.  
  8981. //----- (00412AD3) --------------------------------------------------------
  8982. void __usercall sub_412AD3(int a1<ebp>)
  8983. {
  8984.   _exit(*(_DWORD *)(a1 - 32));
  8985. }
  8986.  
  8987. //----- (00413880) --------------------------------------------------------
  8988. LPVOID __cdecl sub_413880(signed int dwBytes)
  8989. {
  8990.   LPVOID result; // eax@4
  8991.   int v2; // [sp+0h] [bp-4h]@3
  8992.   void *v3; // [sp+0h] [bp-4h]@11
  8993.   int dwBytesa; // [sp+Ch] [bp+8h]@8
  8994.  
  8995.   if ( dword_441CF0 == 3 )
  8996.   {
  8997.     if ( dwBytes <= (unsigned int)dword_441D20 )
  8998.     {
  8999.       v2 = __sbh_alloc_block(dwBytes);
  9000.       if ( v2 )
  9001.         return (LPVOID)v2;
  9002.     }
  9003.     goto LABEL_14;
  9004.   }
  9005.   if ( dword_441CF0 != 2 )
  9006.   {
  9007. LABEL_14:
  9008.     if ( !dwBytes )
  9009.       dwBytes = 1;
  9010.     return HeapAlloc(hHeap, 0, (dwBytes + 15) & 0xFFFFFFF0);
  9011.   }
  9012.   if ( dwBytes )
  9013.     dwBytesa = (dwBytes + 15) & 0xFFFFFFF0;
  9014.   else
  9015.     dwBytesa = 16;
  9016.   if ( dwBytesa <= (unsigned int)dword_43E574 && (v3 = (void *)__sbh_alloc_block_0((unsigned int)dwBytesa >> 4)) != 0 )
  9017.     result = v3;
  9018.   else
  9019.     result = HeapAlloc(hHeap, 0, dwBytesa);
  9020.   return result;
  9021. }
  9022. // 415070: using guessed type _DWORD __cdecl __sbh_alloc_block(_DWORD);
  9023. // 416AF0: using guessed type _DWORD __cdecl __sbh_alloc_block_0(_DWORD);
  9024. // 43E574: using guessed type int dword_43E574;
  9025. // 441CF0: using guessed type int dword_441CF0;
  9026. // 441D20: using guessed type int dword_441D20;
  9027.  
  9028. //----- (00414110) --------------------------------------------------------
  9029. LPVOID __cdecl sub_414110(LPVOID lpMem, signed int dwBytes)
  9030. {
  9031.   SIZE_T v3; // eax@11
  9032.   int v4; // [sp+0h] [bp-14h]@16
  9033.   int v5; // [sp+4h] [bp-10h]@16
  9034.   int v6; // [sp+8h] [bp-Ch]@16
  9035.   int v7; // [sp+Ch] [bp-8h]@4
  9036.   LPVOID v8; // [sp+10h] [bp-4h]@5
  9037.   int dwBytesa; // [sp+20h] [bp+Ch]@16
  9038.  
  9039.   if ( (unsigned int)dwBytes > 0xFFFFFFE0 )
  9040.     return 0;
  9041.   if ( dword_441CF0 == 3 )
  9042.   {
  9043.     v7 = __sbh_find_block(lpMem);
  9044.     if ( v7 )
  9045.     {
  9046.       v8 = 0;
  9047.       if ( dwBytes <= (unsigned int)dword_441D20 )
  9048.       {
  9049.         if ( __sbh_resize_block(v7, lpMem, dwBytes) )
  9050.           v8 = lpMem;
  9051.       }
  9052.     }
  9053.     if ( !v7 )
  9054.     {
  9055.       if ( !dwBytes )
  9056.         dwBytes = 1;
  9057.       v3 = dwBytes + 15;
  9058.       LOBYTE(v3) = (dwBytes + 15) & 0xF0;
  9059.       v8 = HeapReAlloc(hHeap, 0x10u, lpMem, v3);
  9060.     }
  9061.     return v8;
  9062.   }
  9063.   if ( dword_441CF0 != 2 )
  9064.   {
  9065.     if ( !dwBytes )
  9066.       dwBytes = 1;
  9067.     return HeapReAlloc(hHeap, 0x10u, lpMem, (dwBytes + 15) & 0xFFFFFFF0);
  9068.   }
  9069.   if ( !dwBytes )
  9070.     dwBytes = 1;
  9071.   dwBytesa = (dwBytes + 15) & 0xFFFFFFF0;
  9072.   v5 = __sbh_find_block_0(lpMem, &v4, &v6);
  9073.   if ( !v5 )
  9074.     return HeapReAlloc(hHeap, 0x10u, lpMem, dwBytesa);
  9075.   v8 = 0;
  9076.   if ( dwBytesa <= (unsigned int)dword_43E574 && __sbh_resize_block_0(v4, v6, v5, (unsigned int)dwBytesa >> 4) )
  9077.     v8 = lpMem;
  9078.   return v8;
  9079. }
  9080. // 4149D0: using guessed type _DWORD __cdecl __sbh_find_block(_DWORD);
  9081. // 4158B0: using guessed type _DWORD __cdecl __sbh_resize_block(_DWORD, _DWORD, _DWORD);
  9082. // 4169F0: using guessed type _DWORD __cdecl __sbh_find_block_0(_DWORD, _DWORD, _DWORD);
  9083. // 417160: using guessed type _DWORD __cdecl __sbh_resize_block_0(_DWORD, _DWORD, _DWORD, _DWORD);
  9084. // 43E574: using guessed type int dword_43E574;
  9085. // 441CF0: using guessed type int dword_441CF0;
  9086. // 441D20: using guessed type int dword_441D20;
  9087.  
  9088. //----- (00414290) --------------------------------------------------------
  9089. void *__cdecl sub_414290(LPVOID lpMem, signed int dwBytes)
  9090. {
  9091.   void *result; // eax@2
  9092.   int v3; // eax@19
  9093.   signed int v4; // eax@37
  9094.   int v5; // eax@66
  9095.   signed int v6; // [sp+0h] [bp-30h]@52
  9096.   signed int v7; // [sp+4h] [bp-2Ch]@46
  9097.   signed int v8; // [sp+8h] [bp-28h]@21
  9098.   signed int Size; // [sp+Ch] [bp-24h]@13
  9099.   int v10; // [sp+10h] [bp-20h]@40
  9100.   int v11; // [sp+14h] [bp-1Ch]@45
  9101.   int v12; // [sp+18h] [bp-18h]@40
  9102.   int v13; // [sp+1Ch] [bp-14h]@40
  9103.   unsigned int v14; // [sp+20h] [bp-10h]@7
  9104.   void *Dst; // [sp+24h] [bp-Ch]@6
  9105.   int v16; // [sp+28h] [bp-8h]@12
  9106.   int v17; // [sp+2Ch] [bp-4h]@1
  9107.  
  9108.   v17 = dwBytes;
  9109.   if ( lpMem )
  9110.   {
  9111.     if ( dwBytes )
  9112.     {
  9113.       if ( dword_441CF0 == 3 )
  9114.       {
  9115.         do
  9116.         {
  9117.           Dst = 0;
  9118.           if ( (unsigned int)dwBytes <= 0xFFFFFFE0 )
  9119.           {
  9120.             v14 = __sbh_find_block(lpMem);
  9121.             if ( v14 )
  9122.             {
  9123.               if ( dwBytes <= (unsigned int)dword_441D20 )
  9124.               {
  9125.                 if ( __sbh_resize_block(v14, lpMem, dwBytes) )
  9126.                 {
  9127.                   Dst = lpMem;
  9128.                 }
  9129.                 else
  9130.                 {
  9131.                   Dst = (void *)__sbh_alloc_block(dwBytes);
  9132.                   if ( Dst )
  9133.                   {
  9134.                     v16 = *((_DWORD *)lpMem - 1) - 1;
  9135.                     if ( v16 >= (unsigned int)dwBytes )
  9136.                       Size = dwBytes;
  9137.                     else
  9138.                       Size = v16;
  9139.                     memcpy(Dst, lpMem, Size);
  9140.                     v14 = __sbh_find_block(lpMem);
  9141.                     sub_414A90(v14, (int)lpMem);
  9142.                   }
  9143.                 }
  9144.               }
  9145.               if ( !Dst )
  9146.               {
  9147.                 if ( !dwBytes )
  9148.                   dwBytes = 1;
  9149.                 v3 = dwBytes + 15;
  9150.                 LOBYTE(v3) = (dwBytes + 15) & 0xF0;
  9151.                 dwBytes = v3;
  9152.                 Dst = HeapAlloc(hHeap, 0, v3);
  9153.                 if ( Dst )
  9154.                 {
  9155.                   v16 = *((_DWORD *)lpMem - 1) - 1;
  9156.                   if ( v16 >= (unsigned int)dwBytes )
  9157.                     v8 = dwBytes;
  9158.                   else
  9159.                     v8 = v16;
  9160.                   memcpy(Dst, lpMem, v8);
  9161.                   sub_414A90(v14, (int)lpMem);
  9162.                 }
  9163.               }
  9164.             }
  9165.             if ( !v14 )
  9166.             {
  9167.               if ( !dwBytes )
  9168.                 dwBytes = 1;
  9169.               dwBytes = (dwBytes + 15) & 0xFFFFFFF0;
  9170.               Dst = HeapReAlloc(hHeap, 0, lpMem, dwBytes);
  9171.             }
  9172.           }
  9173.           if ( Dst || !dword_441534 )
  9174.             return Dst;
  9175.         }
  9176.         while ( _callnewh(dwBytes) );
  9177.         result = 0;
  9178.       }
  9179.       else
  9180.       {
  9181.         if ( dword_441CF0 == 2 )
  9182.         {
  9183.           if ( (unsigned int)dwBytes <= 0xFFFFFFE0 )
  9184.           {
  9185.             if ( dwBytes )
  9186.             {
  9187.               v4 = dwBytes + 15;
  9188.               LOBYTE(v4) = (dwBytes + 15) & 0xF0;
  9189.               dwBytes = v4;
  9190.             }
  9191.             else
  9192.             {
  9193.               dwBytes = 16;
  9194.             }
  9195.           }
  9196.           do
  9197.           {
  9198.             Dst = 0;
  9199.             if ( (unsigned int)dwBytes <= 0xFFFFFFE0 )
  9200.             {
  9201.               v12 = __sbh_find_block_0(lpMem, &v10, &v13);
  9202.               if ( v12 )
  9203.               {
  9204.                 if ( dwBytes < (unsigned int)dword_43E574 )
  9205.                 {
  9206.                   if ( __sbh_resize_block_0(v10, v13, v12, (unsigned int)dwBytes >> 4) )
  9207.                   {
  9208.                     Dst = lpMem;
  9209.                   }
  9210.                   else
  9211.                   {
  9212.                     Dst = (void *)__sbh_alloc_block_0((unsigned int)dwBytes >> 4);
  9213.                     if ( Dst )
  9214.                     {
  9215.                       v11 = 16 * *(_BYTE *)v12;
  9216.                       if ( v11 >= (unsigned int)dwBytes )
  9217.                         v7 = dwBytes;
  9218.                       else
  9219.                         v7 = v11;
  9220.                       memcpy(Dst, lpMem, v7);
  9221.                       __sbh_free_block(v10, v13, v12);
  9222.                     }
  9223.                   }
  9224.                 }
  9225.                 if ( !Dst )
  9226.                 {
  9227.                   Dst = HeapAlloc(hHeap, 0, dwBytes);
  9228.                   if ( Dst )
  9229.                   {
  9230.                     v11 = 16 * *(_BYTE *)v12;
  9231.                     if ( v11 >= (unsigned int)dwBytes )
  9232.                       v6 = dwBytes;
  9233.                     else
  9234.                       v6 = v11;
  9235.                     memcpy(Dst, lpMem, v6);
  9236.                     __sbh_free_block(v10, v13, v12);
  9237.                   }
  9238.                 }
  9239.               }
  9240.               else
  9241.               {
  9242.                 Dst = HeapReAlloc(hHeap, 0, lpMem, dwBytes);
  9243.               }
  9244.             }
  9245.             if ( Dst || !dword_441534 )
  9246.               return Dst;
  9247.           }
  9248.           while ( _callnewh(dwBytes) );
  9249.           result = 0;
  9250.         }
  9251.         else
  9252.         {
  9253.           do
  9254.           {
  9255.             Dst = 0;
  9256.             if ( (unsigned int)dwBytes <= 0xFFFFFFE0 )
  9257.             {
  9258.               if ( !dwBytes )
  9259.                 dwBytes = 1;
  9260.               v5 = dwBytes + 15;
  9261.               LOBYTE(v5) = (dwBytes + 15) & 0xF0;
  9262.               dwBytes = v5;
  9263.               Dst = HeapReAlloc(hHeap, 0, lpMem, v5);
  9264.             }
  9265.             if ( Dst || !dword_441534 )
  9266.               return Dst;
  9267.           }
  9268.           while ( _callnewh(dwBytes) );
  9269.           result = 0;
  9270.         }
  9271.       }
  9272.     }
  9273.     else
  9274.     {
  9275.       sub_4146B0(lpMem);
  9276.       result = 0;
  9277.     }
  9278.   }
  9279.   else
  9280.   {
  9281.     result = (void *)_malloc_base(dwBytes);
  9282.   }
  9283.   return result;
  9284. }
  9285. // 413770: using guessed type _DWORD __cdecl _callnewh(_DWORD);
  9286. // 4149D0: using guessed type _DWORD __cdecl __sbh_find_block(_DWORD);
  9287. // 415070: using guessed type _DWORD __cdecl __sbh_alloc_block(_DWORD);
  9288. // 4158B0: using guessed type _DWORD __cdecl __sbh_resize_block(_DWORD, _DWORD, _DWORD);
  9289. // 4169F0: using guessed type _DWORD __cdecl __sbh_find_block_0(_DWORD, _DWORD, _DWORD);
  9290. // 416A80: using guessed type _DWORD __cdecl __sbh_free_block(_DWORD, _DWORD, _DWORD);
  9291. // 416AF0: using guessed type _DWORD __cdecl __sbh_alloc_block_0(_DWORD);
  9292. // 417160: using guessed type _DWORD __cdecl __sbh_resize_block_0(_DWORD, _DWORD, _DWORD, _DWORD);
  9293. // 43E574: using guessed type int dword_43E574;
  9294. // 441CF0: using guessed type int dword_441CF0;
  9295. // 441D20: using guessed type int dword_441D20;
  9296.  
  9297. //----- (004146B0) --------------------------------------------------------
  9298. void __cdecl sub_4146B0(LPVOID lpMem)
  9299. {
  9300.   int v1; // [sp+0h] [bp-10h]@9
  9301.   int v2; // [sp+4h] [bp-Ch]@9
  9302.   int v3; // [sp+8h] [bp-8h]@9
  9303.   unsigned int v4; // [sp+Ch] [bp-4h]@3
  9304.  
  9305.   if ( lpMem )
  9306.   {
  9307.     if ( dword_441CF0 == 3 )
  9308.     {
  9309.       v4 = __sbh_find_block(lpMem);
  9310.       if ( v4 )
  9311.         sub_414A90(v4, (int)lpMem);
  9312.       if ( !v4 )
  9313.         HeapFree(hHeap, 0, lpMem);
  9314.     }
  9315.     else
  9316.     {
  9317.       if ( dword_441CF0 == 2 )
  9318.       {
  9319.         v2 = __sbh_find_block_0(lpMem, &v1, &v3);
  9320.         if ( v2 )
  9321.           __sbh_free_block(v1, v3, v2);
  9322.         if ( !v2 )
  9323.           HeapFree(hHeap, 0, lpMem);
  9324.       }
  9325.       else
  9326.       {
  9327.         HeapFree(hHeap, 0, lpMem);
  9328.       }
  9329.     }
  9330.   }
  9331. }
  9332. // 4149D0: using guessed type _DWORD __cdecl __sbh_find_block(_DWORD);
  9333. // 4169F0: using guessed type _DWORD __cdecl __sbh_find_block_0(_DWORD, _DWORD, _DWORD);
  9334. // 416A80: using guessed type _DWORD __cdecl __sbh_free_block(_DWORD, _DWORD, _DWORD);
  9335. // 441CF0: using guessed type int dword_441CF0;
  9336.  
  9337. //----- (00414780) --------------------------------------------------------
  9338. signed int __cdecl sub_414780()
  9339. {
  9340.   signed int v1; // [sp+0h] [bp-4h]@1
  9341.  
  9342.   v1 = -2;
  9343.   if ( dword_441CF0 == 3 )
  9344.   {
  9345.     if ( __sbh_heap_check(-2) < 0 )
  9346.       v1 = -4;
  9347.   }
  9348.   else
  9349.   {
  9350.     if ( dword_441CF0 == 2 && __sbh_heap_check_0() < 0 )
  9351.       v1 = -4;
  9352.   }
  9353.   if ( !HeapValidate(hHeap, 0, 0) )
  9354.   {
  9355.     if ( GetLastError() == 120 )
  9356.     {
  9357.       dword_441548 = 120;
  9358.       dword_441544 = 40;
  9359.     }
  9360.     else
  9361.     {
  9362.       v1 = -4;
  9363.     }
  9364.   }
  9365.   return v1;
  9366. }
  9367. // 415FD0: using guessed type int __cdecl __sbh_heap_check(_DWORD);
  9368. // 4172D0: using guessed type int __sbh_heap_check_0(void);
  9369. // 441544: using guessed type int dword_441544;
  9370. // 441548: using guessed type int dword_441548;
  9371. // 441CF0: using guessed type int dword_441CF0;
  9372.  
  9373. //----- (00414A90) --------------------------------------------------------
  9374. int __cdecl sub_414A90(unsigned int a1, int a2)
  9375. {
  9376.   int result; // eax@1
  9377.   int v3; // ST28_4@32
  9378.   int v4; // edx@34
  9379.   int v5; // edx@37
  9380.   int v6; // eax@43
  9381.   int v7; // [sp+0h] [bp-3Ch]@1
  9382.   int v8; // [sp+4h] [bp-38h]@2
  9383.   int v9; // [sp+8h] [bp-34h]@16
  9384.   signed int v10; // [sp+Ch] [bp-30h]@1
  9385.   int v11; // [sp+10h] [bp-2Ch]@0
  9386.   int v12; // [sp+14h] [bp-28h]@13
  9387.   int v13; // [sp+18h] [bp-24h]@3
  9388.   int v14; // [sp+20h] [bp-1Ch]@1
  9389.   signed int v15; // [sp+28h] [bp-14h]@2
  9390.   signed int v16; // [sp+30h] [bp-Ch]@2
  9391.   int v17; // [sp+34h] [bp-8h]@1
  9392.   unsigned int v18; // [sp+38h] [bp-4h]@1
  9393.  
  9394.   v7 = *(_DWORD *)(a1 + 16);
  9395.   v18 = (unsigned int)(a2 - *(_DWORD *)(a1 + 12)) >> 15;
  9396.   v17 = v7 + 516 * v18 + 324;
  9397.   v14 = a2 - 4;
  9398.   result = a2 - 4;
  9399.   v10 = *(_DWORD *)(a2 - 4) - 1;
  9400.   if ( !(v10 & 1) )
  9401.   {
  9402.     v8 = v10 + v14;
  9403.     v15 = *(_DWORD *)(v10 + v14);
  9404.     v16 = *(_DWORD *)(a2 - 8);
  9405.     if ( !(v15 & 1) )
  9406.     {
  9407.       v13 = (v15 >> 4) - 1;
  9408.       if ( (unsigned int)v13 > 0x3F )
  9409.         v13 = 63;
  9410.       if ( *(_DWORD *)(v8 + 4) == *(_DWORD *)(v8 + 8) )
  9411.       {
  9412.         if ( (unsigned int)v13 >= 0x20 )
  9413.         {
  9414.           *(_DWORD *)(v7 + 4 * v18 + 196) &= ~(0x80000000u >> (v13 - 32));
  9415.           --*(_BYTE *)(v13 + v7 + 4);
  9416.           if ( !*(_BYTE *)(v13 + v7 + 4) )
  9417.             *(_DWORD *)(a1 + 4) &= ~(0x80000000u >> (v13 - 32));
  9418.         }
  9419.         else
  9420.         {
  9421.           *(_DWORD *)(v7 + 4 * v18 + 68) &= ~(0x80000000u >> v13);
  9422.           --*(_BYTE *)(v13 + v7 + 4);
  9423.           if ( !*(_BYTE *)(v13 + v7 + 4) )
  9424.             *(_DWORD *)a1 &= ~(0x80000000u >> v13);
  9425.         }
  9426.       }
  9427.       *(_DWORD *)(*(_DWORD *)(v8 + 8) + 4) = *(_DWORD *)(v8 + 4);
  9428.       *(_DWORD *)(*(_DWORD *)(v8 + 4) + 8) = *(_DWORD *)(v8 + 8);
  9429.       v10 += v15;
  9430.     }
  9431.     v12 = (v10 >> 4) - 1;
  9432.     if ( (unsigned int)v12 > 0x3F )
  9433.       v12 = 63;
  9434.     if ( !(v16 & 1) )
  9435.     {
  9436.       v9 = v14 - v16;
  9437.       v11 = (v16 >> 4) - 1;
  9438.       if ( (unsigned int)v11 > 0x3F )
  9439.         v11 = 63;
  9440.       v10 += v16;
  9441.       v12 = (v10 >> 4) - 1;
  9442.       if ( (unsigned int)v12 > 0x3F )
  9443.         v12 = 63;
  9444.       if ( v11 != v12 )
  9445.       {
  9446.         if ( *(_DWORD *)(v9 + 4) == *(_DWORD *)(v9 + 8) )
  9447.         {
  9448.           if ( (unsigned int)v11 >= 0x20 )
  9449.           {
  9450.             *(_DWORD *)(v7 + 4 * v18 + 196) &= ~(0x80000000u >> (v11 - 32));
  9451.             --*(_BYTE *)(v11 + v7 + 4);
  9452.             if ( !*(_BYTE *)(v11 + v7 + 4) )
  9453.               *(_DWORD *)(a1 + 4) &= ~(0x80000000u >> (v11 - 32));
  9454.           }
  9455.           else
  9456.           {
  9457.             *(_DWORD *)(v7 + 4 * v18 + 68) &= ~(0x80000000u >> v11);
  9458.             --*(_BYTE *)(v11 + v7 + 4);
  9459.             if ( !*(_BYTE *)(v11 + v7 + 4) )
  9460.               *(_DWORD *)a1 &= ~(0x80000000u >> v11);
  9461.           }
  9462.         }
  9463.         *(_DWORD *)(*(_DWORD *)(v9 + 8) + 4) = *(_DWORD *)(v9 + 4);
  9464.         *(_DWORD *)(*(_DWORD *)(v9 + 4) + 8) = *(_DWORD *)(v9 + 8);
  9465.       }
  9466.       v14 -= v16;
  9467.     }
  9468.     if ( v16 & 1 || v11 != v12 )
  9469.     {
  9470.       v3 = v17 + 8 * v12;
  9471.       *(_DWORD *)(v14 + 4) = *(_DWORD *)(v17 + 8 * v12 + 4);
  9472.       *(_DWORD *)(v14 + 8) = v3;
  9473.       *(_DWORD *)(v3 + 4) = v14;
  9474.       *(_DWORD *)(*(_DWORD *)(v14 + 4) + 8) = v14;
  9475.       if ( *(_DWORD *)(v14 + 4) == *(_DWORD *)(v14 + 8) )
  9476.       {
  9477.         if ( (unsigned int)v12 >= 0x20 )
  9478.         {
  9479.           v5 = (*(_BYTE *)(v12 + v7 + 4))++;
  9480.           if ( !v5 )
  9481.             *(_DWORD *)(a1 + 4) |= 0x80000000u >> (v12 - 32);
  9482.           *(_DWORD *)(v7 + 4 * v18 + 196) |= 0x80000000u >> (v12 - 32);
  9483.         }
  9484.         else
  9485.         {
  9486.           v4 = (*(_BYTE *)(v12 + v7 + 4))++;
  9487.           if ( !v4 )
  9488.             *(_DWORD *)a1 |= 0x80000000u >> v12;
  9489.           *(_DWORD *)(v7 + 4 * v18 + 68) |= 0x80000000u >> v12;
  9490.         }
  9491.       }
  9492.     }
  9493.     *(_DWORD *)v14 = v10;
  9494.     *(_DWORD *)(v10 + v14 - 4) = v10;
  9495.     result = *(_DWORD *)v17 - 1;
  9496.     *(_DWORD *)v17 = result;
  9497.     if ( !*(_DWORD *)v17 )
  9498.     {
  9499.       if ( Dst )
  9500.       {
  9501.         VirtualFree((LPVOID)((dword_441D08 << 15) + *((_DWORD *)Dst + 3)), 0x8000u, 0x4000u);
  9502.         *((_DWORD *)Dst + 2) |= 0x80000000u >> dword_441D08;
  9503.         *(_DWORD *)(*((_DWORD *)Dst + 4) + 4 * dword_441D08 + 196) = 0;
  9504.         --*(_BYTE *)(*((_DWORD *)Dst + 4) + 67);
  9505.         if ( !*(_BYTE *)(*((_DWORD *)Dst + 4) + 67) )
  9506.         {
  9507.           v6 = *((_DWORD *)Dst + 1);
  9508.           LOBYTE(v6) = v6 & 0xFE;
  9509.           *((_DWORD *)Dst + 1) = v6;
  9510.         }
  9511.         if ( *((_DWORD *)Dst + 2) == -1 )
  9512.         {
  9513.           VirtualFree(*((LPVOID *)Dst + 3), 0, 0x8000u);
  9514.           HeapFree(hHeap, 0, *((LPVOID *)Dst + 4));
  9515.           memcpy_0(Dst, (char *)Dst + 20, (char *)lpMem + 20 * dword_441D18-- - ((char *)Dst + 20));
  9516.           if ( a1 > (unsigned int)Dst )
  9517.             a1 -= 20;
  9518.           dword_441D0C = (int)lpMem;
  9519.         }
  9520.       }
  9521.       Dst = (void *)a1;
  9522.       result = v18;
  9523.       dword_441D08 = v18;
  9524.     }
  9525.   }
  9526.   return result;
  9527. }
  9528. // 441D08: using guessed type int dword_441D08;
  9529. // 441D0C: using guessed type int dword_441D0C;
  9530. // 441D18: using guessed type int dword_441D18;
  9531.  
  9532. //----- (00417510) --------------------------------------------------------
  9533. HMODULE __cdecl sub_417510(HMODULE a1)
  9534. {
  9535.   HMODULE result; // eax@1
  9536.   int v2; // ST08_4@4
  9537.  
  9538.   *(_DWORD *)a1 = 0;
  9539.   result = GetModuleHandleA(0);
  9540.   if ( *(_WORD *)result == 23117 )
  9541.   {
  9542.     if ( *((_DWORD *)result + 15) )
  9543.     {
  9544.       v2 = (int)((char *)result + *((_DWORD *)result + 15));
  9545.       *(_BYTE *)a1 = *(_BYTE *)(v2 + 26);
  9546.       result = a1;
  9547.       *((_BYTE *)a1 + 1) = *(_BYTE *)(v2 + 27);
  9548.     }
  9549.   }
  9550.   return result;
  9551. }
  9552.  
  9553. //----- (00417570) --------------------------------------------------------
  9554. signed int __cdecl sub_417570()
  9555. {
  9556.   signed int result; // eax@4
  9557.   char *Str; // [sp+0h] [bp-1238h]@13
  9558.   char *Stra; // [sp+0h] [bp-1238h]@22
  9559.   int Strb; // [sp+0h] [bp-1238h]@23
  9560.   int v4; // [sp+4h] [bp-1234h]@33
  9561.   __int32 v5; // [sp+8h] [bp-1230h]@29
  9562.   CHAR SubStr; // [sp+Ch] [bp-122Ch]@14
  9563.   CHAR Str2; // [sp+110h] [bp-1128h]@5
  9564.   struct _OSVERSIONINFOA VersionInformation; // [sp+11A0h] [bp-98h]@1
  9565.   CHAR *i; // [sp+1234h] [bp-4h]@6
  9566.  
  9567.   VersionInformation.dwOSVersionInfoSize = 148;
  9568.   if ( GetVersionExA(&VersionInformation)
  9569.     && VersionInformation.dwPlatformId == 2
  9570.     && VersionInformation.dwMajorVersion >= 5 )
  9571.   {
  9572.     result = 1;
  9573.   }
  9574.   else
  9575.   {
  9576.     if ( !GetEnvironmentVariableA("__MSVCRT_HEAP_SELECT", &Str2, 0x1090u) )
  9577.       goto LABEL_38;
  9578.     for ( i = &Str2; *i; ++i )
  9579.     {
  9580.       if ( *i >= 97 )
  9581.       {
  9582.         if ( *i <= 122 )
  9583.           *i -= 32;
  9584.       }
  9585.     }
  9586.     if ( strncmp("__GLOBAL_HEAP_SELECTED", &Str2, 0x16u) )
  9587.     {
  9588.       GetModuleFileNameA(0, &SubStr, 0x104u);
  9589.       for ( i = &SubStr; *i; ++i )
  9590.       {
  9591.         if ( *i >= 97 && *i <= 122 )
  9592.           *i -= 32;
  9593.       }
  9594.       Str = strstr(&Str2, &SubStr);
  9595.     }
  9596.     else
  9597.     {
  9598.       Str = &Str2;
  9599.     }
  9600.     if ( !Str )
  9601.       goto LABEL_38;
  9602.     Stra = strchr(Str, 44);
  9603.     if ( !Stra )
  9604.       goto LABEL_38;
  9605.     Strb = (int)(Stra + 1);
  9606.     i = (CHAR *)Strb;
  9607.     while ( *i )
  9608.     {
  9609.       if ( *i == 59 )
  9610.         *i = 0;
  9611.       else
  9612.         ++i;
  9613.     }
  9614.     v5 = strtol((const char *)Strb, 0, 10);
  9615.     if ( v5 == 2 || v5 == 3 || v5 == 1 )
  9616.     {
  9617.       result = v5;
  9618.     }
  9619.     else
  9620.     {
  9621. LABEL_38:
  9622.       sub_417510(&v4);
  9623.       if ( (signed int)(unsigned __int8)v4 < 6 )
  9624.         result = 2;
  9625.       else
  9626.         result = 3;
  9627.     }
  9628.   }
  9629.   return result;
  9630. }
  9631.  
  9632. //----- (004177A0) --------------------------------------------------------
  9633. signed int __cdecl sub_4177A0(int a1)
  9634. {
  9635.   hHeap = HeapCreate(a1 == 0, 0x1000u, 0);
  9636.   if ( !hHeap )
  9637.     return 0;
  9638.   dword_441CF0 = sub_417570();
  9639.   if ( dword_441CF0 == 3 )
  9640.   {
  9641.     if ( !__sbh_heap_init(1016) )
  9642.     {
  9643.       HeapDestroy(hHeap);
  9644.       return 0;
  9645.     }
  9646.   }
  9647.   else
  9648.   {
  9649.     if ( dword_441CF0 == 2 && !__sbh_new_region() )
  9650.     {
  9651.       HeapDestroy(hHeap);
  9652.       return 0;
  9653.     }
  9654.   }
  9655.   return 1;
  9656. }
  9657. // 414960: using guessed type _DWORD __cdecl __sbh_heap_init(_DWORD);
  9658. // 416630: using guessed type int __sbh_new_region(void);
  9659. // 441CF0: using guessed type int dword_441CF0;
  9660.  
  9661. //----- (00419CA0) --------------------------------------------------------
  9662. signed int __cdecl sub_419CA0(int a1)
  9663. {
  9664.   signed int result; // eax@2
  9665.   int v2; // [sp+0h] [bp-4h]@28
  9666.  
  9667.   if ( !dword_43E7A0 )
  9668.     return 0;
  9669.   if ( *(_DWORD *)(a1 + 20) != dword_43E830 || *(_DWORD *)(a1 + 20) != dword_43E840 )
  9670.   {
  9671.     if ( dword_4415A0 )
  9672.     {
  9673.       if ( TimeZoneInformation.DaylightDate.wYear )
  9674.         cvtdate(
  9675.           1,
  9676.           0,
  9677.           *(_DWORD *)(a1 + 20),
  9678.           TimeZoneInformation.DaylightDate.wMonth,
  9679.           0,
  9680.           0,
  9681.           TimeZoneInformation.DaylightDate.wDay,
  9682.           TimeZoneInformation.DaylightDate.wHour,
  9683.           TimeZoneInformation.DaylightDate.wMinute,
  9684.           TimeZoneInformation.DaylightDate.wSecond,
  9685.           TimeZoneInformation.DaylightDate.wMilliseconds);
  9686.       else
  9687.         cvtdate(
  9688.           1,
  9689.           1,
  9690.           *(_DWORD *)(a1 + 20),
  9691.           TimeZoneInformation.DaylightDate.wMonth,
  9692.           TimeZoneInformation.DaylightDate.wDay,
  9693.           TimeZoneInformation.DaylightDate.wDayOfWeek,
  9694.           0,
  9695.           TimeZoneInformation.DaylightDate.wHour,
  9696.           TimeZoneInformation.DaylightDate.wMinute,
  9697.           TimeZoneInformation.DaylightDate.wSecond,
  9698.           TimeZoneInformation.DaylightDate.wMilliseconds);
  9699.       if ( TimeZoneInformation.StandardDate.wYear )
  9700.         cvtdate(
  9701.           0,
  9702.           0,
  9703.           *(_DWORD *)(a1 + 20),
  9704.           TimeZoneInformation.StandardDate.wMonth,
  9705.           0,
  9706.           0,
  9707.           TimeZoneInformation.StandardDate.wDay,
  9708.           TimeZoneInformation.StandardDate.wHour,
  9709.           TimeZoneInformation.StandardDate.wMinute,
  9710.           TimeZoneInformation.StandardDate.wSecond,
  9711.           TimeZoneInformation.StandardDate.wMilliseconds);
  9712.       else
  9713.         cvtdate(
  9714.           0,
  9715.           1,
  9716.           *(_DWORD *)(a1 + 20),
  9717.           TimeZoneInformation.StandardDate.wMonth,
  9718.           TimeZoneInformation.StandardDate.wDay,
  9719.           TimeZoneInformation.StandardDate.wDayOfWeek,
  9720.           0,
  9721.           TimeZoneInformation.StandardDate.wHour,
  9722.           TimeZoneInformation.StandardDate.wMinute,
  9723.           TimeZoneInformation.StandardDate.wSecond,
  9724.           TimeZoneInformation.StandardDate.wMilliseconds);
  9725.     }
  9726.     else
  9727.     {
  9728.       cvtdate(1, 1, *(_DWORD *)(a1 + 20), 4, 1, 0, 0, 2, 0, 0, 0);
  9729.       cvtdate(0, 1, *(_DWORD *)(a1 + 20), 10, 5, 0, 0, 2, 0, 0, 0);
  9730.     }
  9731.   }
  9732.   if ( dword_43E834 >= dword_43E844 )
  9733.   {
  9734.     if ( *(_DWORD *)(a1 + 28) < dword_43E844 || *(_DWORD *)(a1 + 28) > dword_43E834 )
  9735.       return 1;
  9736.     if ( *(_DWORD *)(a1 + 28) > dword_43E844 && *(_DWORD *)(a1 + 28) < dword_43E834 )
  9737.       return 0;
  9738.   }
  9739.   else
  9740.   {
  9741.     if ( *(_DWORD *)(a1 + 28) < dword_43E834 || *(_DWORD *)(a1 + 28) > dword_43E844 )
  9742.       return 0;
  9743.     if ( *(_DWORD *)(a1 + 28) > dword_43E834 && *(_DWORD *)(a1 + 28) < dword_43E844 )
  9744.       return 1;
  9745.   }
  9746.   v2 = 1000 * (3600 * *(_DWORD *)(a1 + 8) + 60 * *(_DWORD *)(a1 + 4) + *(_DWORD *)a1);
  9747.   if ( *(_DWORD *)(a1 + 28) == dword_43E834 )
  9748.     result = v2 >= dword_43E838;
  9749.   else
  9750.     result = v2 < dword_43E848;
  9751.   return result;
  9752. }
  9753. // 419FA0: using guessed type _DWORD __cdecl cvtdate(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
  9754. // 43E7A0: using guessed type int dword_43E7A0;
  9755. // 43E830: using guessed type int dword_43E830;
  9756. // 43E834: using guessed type int dword_43E834;
  9757. // 43E838: using guessed type int dword_43E838;
  9758. // 43E840: using guessed type int dword_43E840;
  9759. // 43E844: using guessed type int dword_43E844;
  9760. // 43E848: using guessed type int dword_43E848;
  9761. // 4415A0: using guessed type int dword_4415A0;
  9762.  
  9763. //----- (0041F810) --------------------------------------------------------
  9764. signed int __cdecl sub_41F810(int a1)
  9765. {
  9766.   void *v1; // eax@1
  9767.   signed int result; // eax@2
  9768.   signed int v3; // eax@3
  9769.  
  9770.   v1 = malloc(0x80u);
  9771.   *(_DWORD *)(a1 + 12) = v1;
  9772.   if ( v1 )
  9773.   {
  9774.     v3 = 0;
  9775.     do
  9776.     {
  9777.       v3 += 4;
  9778.       *(_DWORD *)(v3 + *(_DWORD *)(a1 + 12) - 4) = 0;
  9779.     }
  9780.     while ( v3 < 128 );
  9781.     *(_DWORD *)a1 = 0;
  9782.     *(_DWORD *)(a1 + 4) = 32;
  9783.     *(_DWORD *)(a1 + 8) = 0;
  9784.     result = 0;
  9785.   }
  9786.   else
  9787.   {
  9788.     result = -2;
  9789.   }
  9790.   return result;
  9791. }
  9792.  
  9793. //----- (0041F860) --------------------------------------------------------
  9794. void __cdecl sub_41F860(int a1)
  9795. {
  9796.   int i; // eax@2
  9797.  
  9798.   if ( *(_DWORD *)(a1 + 12) )
  9799.   {
  9800.     for ( i = 0; i < *(_DWORD *)a1; *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * i - 4) = 0 )
  9801.       ++i;
  9802.     CrtCheckMemoryWrapperWrapper(*(_DWORD *)(a1 + 12));
  9803.     *(_DWORD *)(a1 + 12) = 0;
  9804.     *(_DWORD *)a1 = 0;
  9805.     *(_DWORD *)(a1 + 4) = 0;
  9806.     *(_DWORD *)(a1 + 8) = 0;
  9807.   }
  9808. }
  9809.  
  9810. //----- (0041F8B0) --------------------------------------------------------
  9811. signed int __cdecl sub_41F8B0(int a1, int a2)
  9812. {
  9813.   signed int result; // eax@2
  9814.  
  9815.   if ( a1 == a2 || (result = sub_41F8F0(a1, a2)) == 0 )
  9816.   {
  9817.     if ( *(_DWORD *)a2 )
  9818.     {
  9819.       *(_DWORD *)(a2 + 8) = *(_DWORD *)(a1 + 8) == 0;
  9820.       result = 0;
  9821.     }
  9822.     else
  9823.     {
  9824.       *(_DWORD *)(a2 + 8) = 0;
  9825.       result = 0;
  9826.     }
  9827.   }
  9828.   return result;
  9829. }
  9830.  
  9831. //----- (0041F8F0) --------------------------------------------------------
  9832. signed int __cdecl sub_41F8F0(int a1, int a2)
  9833. {
  9834.   signed int result; // eax@3
  9835.   int v3; // edx@4
  9836.   int v4; // ecx@4
  9837.   int i; // eax@4
  9838.   int v6; // ebx@5
  9839.  
  9840.   if ( a1 == a2 )
  9841.     return 0;
  9842.   if ( *(_DWORD *)(a2 + 4) >= *(_DWORD *)a1 || (result = sub_421250(a2, *(_DWORD *)a1)) == 0 )
  9843.   {
  9844.     v3 = *(_DWORD *)(a1 + 12);
  9845.     v4 = *(_DWORD *)(a2 + 12);
  9846.     for ( i = 0; i < *(_DWORD *)a1; ++i )
  9847.     {
  9848.       v6 = *(_DWORD *)v3;
  9849.       v3 += 4;
  9850.       *(_DWORD *)v4 = v6;
  9851.       v4 += 4;
  9852.     }
  9853.     for ( ; i < *(_DWORD *)a2; ++i )
  9854.     {
  9855.       *(_DWORD *)v4 = 0;
  9856.       v4 += 4;
  9857.     }
  9858.     *(_DWORD *)a2 = *(_DWORD *)a1;
  9859.     *(_DWORD *)(a2 + 8) = *(_DWORD *)(a1 + 8);
  9860.     return 0;
  9861.   }
  9862.   return result;
  9863. }
  9864.  
  9865. //----- (0041F960) --------------------------------------------------------
  9866. signed int __cdecl sub_41F960(unsigned int a1, unsigned int a2)
  9867. {
  9868.   unsigned int v2; // ebx@1
  9869.   signed int v3; // edi@1
  9870.   signed int result; // eax@2
  9871.  
  9872.   sub_4213F0(a1);
  9873.   v2 = a2;
  9874.   v3 = 0;
  9875.   while ( 1 )
  9876.   {
  9877.     result = sub_4212F0(a1, 4, a1);
  9878.     if ( result )
  9879.       break;
  9880.     **(_DWORD **)(a1 + 12) |= v2 >> 28;
  9881.     v2 *= 16;
  9882.     ++v3;
  9883.     ++*(_DWORD *)a1;
  9884.     if ( v3 >= 8 )
  9885.     {
  9886.       sub_4212C0(a1);
  9887.       return 0;
  9888.     }
  9889.   }
  9890.   return result;
  9891. }
  9892.  
  9893. //----- (0041F9C0) --------------------------------------------------------
  9894. int __cdecl sub_41F9C0(int a1)
  9895. {
  9896.   int result; // eax@1
  9897.   int v2; // edx@4
  9898.   int v3; // ecx@4
  9899.   int v4; // ecx@4
  9900.   int v5; // edx@5
  9901.   int v6; // ecx@5
  9902.   int v7; // esi@6
  9903.  
  9904.   result = *(_DWORD *)a1;
  9905.   if ( *(_DWORD *)a1 )
  9906.   {
  9907.     if ( result >= 2 )
  9908.       result = 2;
  9909.     v2 = *(_DWORD *)(a1 + 12);
  9910.     v3 = result - 1;
  9911.     result = *(_DWORD *)(v2 + 4 * result - 4);
  9912.     v4 = v3 - 1;
  9913.     if ( v4 >= 0 )
  9914.     {
  9915.       v5 = v2 + 4 * v4;
  9916.       v6 = v4 + 1;
  9917.       do
  9918.       {
  9919.         v7 = *(_DWORD *)v5;
  9920.         v5 -= 4;
  9921.         result = v7 | (result << 28);
  9922.         --v6;
  9923.       }
  9924.       while ( v6 );
  9925.     }
  9926.   }
  9927.   return result;
  9928. }
  9929.  
  9930. //----- (0041FA00) --------------------------------------------------------
  9931. signed int __cdecl sub_41FA00(int a1, int a2)
  9932. {
  9933.   int v2; // eax@1
  9934.   signed int result; // eax@2
  9935.  
  9936.   v2 = *(_DWORD *)(a1 + 8);
  9937.   if ( v2 == *(_DWORD *)(a2 + 8) )
  9938.   {
  9939.     if ( v2 == 1 )
  9940.       result = sub_421430(a2, a1);
  9941.     else
  9942.       result = sub_421430(a1, a2);
  9943.   }
  9944.   else
  9945.   {
  9946.     result = v2 != 1 ? 1 : -1;
  9947.   }
  9948.   return result;
  9949. }
  9950.  
  9951. //----- (0041FA40) --------------------------------------------------------
  9952. int __cdecl sub_41FA40(int a1, unsigned int a2)
  9953. {
  9954.   int result; // eax@2
  9955.   unsigned int v3; // eax@5
  9956.  
  9957.   if ( *(_DWORD *)(a1 + 8) == 1 )
  9958.   {
  9959.     result = -1;
  9960.   }
  9961.   else
  9962.   {
  9963.     if ( *(_DWORD *)a1 <= 1 )
  9964.     {
  9965.       v3 = **(_DWORD **)(a1 + 12);
  9966.       if ( v3 <= a2 )
  9967.         result = -(v3 < a2);
  9968.       else
  9969.         result = 1;
  9970.     }
  9971.     else
  9972.     {
  9973.       result = 1;
  9974.     }
  9975.   }
  9976.   return result;
  9977. }
  9978.  
  9979. //----- (0041FA70) --------------------------------------------------------
  9980. int __cdecl sub_41FA70(int a1)
  9981. {
  9982.   int v1; // ecx@1
  9983.   int result; // eax@2
  9984.   int v3; // eax@3
  9985.   unsigned int v4; // ecx@3
  9986.  
  9987.   v1 = *(_DWORD *)a1;
  9988.   if ( *(_DWORD *)a1 )
  9989.   {
  9990.     v3 = 7 * v1;
  9991.     v4 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * v1 - 4);
  9992.     for ( result = 4 * v3 - 28; v4; v4 >>= 1 )
  9993.       ++result;
  9994.   }
  9995.   else
  9996.   {
  9997.     result = 0;
  9998.   }
  9999.   return result;
  10000. }
  10001.  
  10002. //----- (0041FAA0) --------------------------------------------------------
  10003. int __cdecl sub_41FAA0(int a1)
  10004. {
  10005.   int v1; // edx@1
  10006.   int result; // eax@2
  10007.   int v3; // ecx@3
  10008.   int v4; // eax@4
  10009.   unsigned int v5; // edx@7
  10010.   int v6; // ecx@8
  10011.  
  10012.   v1 = *(_DWORD *)a1;
  10013.   if ( *(_DWORD *)a1 )
  10014.   {
  10015.     v3 = 0;
  10016.     if ( v1 > 0 )
  10017.     {
  10018.       v4 = *(_DWORD *)(a1 + 12);
  10019.       do
  10020.       {
  10021.         if ( *(_DWORD *)v4 )
  10022.           break;
  10023.         ++v3;
  10024.         v4 += 4;
  10025.       }
  10026.       while ( v3 < v1 );
  10027.     }
  10028.     v5 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * v3);
  10029.     result = 28 * v3;
  10030.     if ( !(v5 & 1) )
  10031.     {
  10032.       do
  10033.       {
  10034.         v6 = v5 & 0xF;
  10035.         v5 >>= 4;
  10036.         result += dword_4381A4[v6];
  10037.       }
  10038.       while ( !v6 );
  10039.     }
  10040.   }
  10041.   else
  10042.   {
  10043.     result = 0;
  10044.   }
  10045.   return result;
  10046. }
  10047. // 4381A4: using guessed type int dword_4381A4[];
  10048.  
  10049. //----- (0041FB00) --------------------------------------------------------
  10050. signed int __cdecl sub_41FB00(unsigned int a1, signed int a2)
  10051. {
  10052.   signed int result; // eax@1
  10053.  
  10054.   sub_4213F0(a1);
  10055.   result = sub_421250(a1, a2 / 28 + 1);
  10056.   if ( !result )
  10057.   {
  10058.     *(_DWORD *)a1 = a2 / 28 + 1;
  10059.     *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * a2 / 28) = 1 << a2 % 28;
  10060.     result = 0;
  10061.   }
  10062.   return result;
  10063. }
  10064.  
  10065. //----- (0041FB60) --------------------------------------------------------
  10066. signed int __cdecl sub_41FB60(unsigned int a1, int a2, int a3)
  10067. {
  10068.   unsigned int v3; // edi@1
  10069.   int v4; // ebp@3
  10070.   char i; // al@6
  10071.   int v6; // esi@9
  10072.   signed int result; // eax@13
  10073.   signed int v8; // [sp+14h] [bp+4h]@4
  10074.  
  10075.   v3 = a1;
  10076.   sub_4213F0(a1);
  10077.   if ( a3 < 2 || a3 > 64 )
  10078.   {
  10079.     result = -3;
  10080.   }
  10081.   else
  10082.   {
  10083.     v4 = a2;
  10084.     if ( *(_BYTE *)a2 == 45 )
  10085.     {
  10086.       v4 = a2 + 1;
  10087.       v8 = 1;
  10088.     }
  10089.     else
  10090.     {
  10091.       v8 = 0;
  10092.     }
  10093.     sub_4213F0(v3);
  10094.     for ( i = *(_BYTE *)v4; i; i = *(_BYTE *)(v4++ + 1) )
  10095.     {
  10096.       if ( a3 < 36 )
  10097.         i = toupper(i);
  10098.       v6 = 0;
  10099.       do
  10100.       {
  10101.         if ( i == off_43EC68[v6] )
  10102.           break;
  10103.         ++v6;
  10104.       }
  10105.       while ( v6 < 64 );
  10106.       if ( v6 >= a3 )
  10107.         break;
  10108.       result = sub_420220(v3, a3, v3);
  10109.       if ( !result )
  10110.       {
  10111.         result = sub_41FEB0(v3, v6, v3);
  10112.         if ( !result )
  10113.           continue;
  10114.       }
  10115.       return result;
  10116.     }
  10117.     if ( *(_DWORD *)v3 )
  10118.       *(_DWORD *)(v3 + 8) = v8;
  10119.     result = 0;
  10120.   }
  10121.   return result;
  10122. }
  10123. // 41FEB0: using guessed type _DWORD __cdecl sub_41FEB0(_DWORD, _DWORD, _DWORD);
  10124. // 43EC68: using guessed type char *off_43EC68;
  10125.  
  10126. //----- (0041FC20) --------------------------------------------------------
  10127. signed int __cdecl sub_41FC20(int a1, int a2, signed int a3)
  10128. {
  10129.   int v3; // esi@1
  10130.   int v4; // edi@1
  10131.   int v5; // ebx@1
  10132.   int v6; // ebp@3
  10133.   signed int result; // eax@4
  10134.   signed int v8; // edi@11
  10135.   int v9; // [sp+10h] [bp-10h]@5
  10136.   int v10; // [sp+18h] [bp-8h]@6
  10137.  
  10138.   v3 = a2;
  10139.   v4 = a3;
  10140.   v5 = a2;
  10141.   if ( a3 < 2 || a3 > 64 )
  10142.   {
  10143.     result = -3;
  10144.   }
  10145.   else
  10146.   {
  10147.     v6 = 0;
  10148.     if ( *(_DWORD *)a1 )
  10149.     {
  10150.       result = sub_4216B0((int)&v9, a1);
  10151.       if ( !result )
  10152.       {
  10153.         if ( v10 == 1 )
  10154.         {
  10155.           v5 = v3 + 1;
  10156.           *(_BYTE *)v3++ = 45;
  10157.           v10 = 0;
  10158.         }
  10159.         if ( v9 )
  10160.         {
  10161.           while ( 1 )
  10162.           {
  10163.             v8 = sub_4214C0((int)&v9, v4, (unsigned int)&v9, (int)&a2);
  10164.             if ( v8 )
  10165.               break;
  10166.             ++v3;
  10167.             ++v6;
  10168.             *(_BYTE *)(v3 - 1) = off_43EC68[a2];
  10169.             if ( !v9 )
  10170.               goto LABEL_13;
  10171.             v4 = a3;
  10172.           }
  10173.           sub_41F860((int)&v9);
  10174.           result = v8;
  10175.         }
  10176.         else
  10177.         {
  10178. LABEL_13:
  10179.           sub_421490(v5, v6);
  10180.           *(_BYTE *)v3 = 0;
  10181.           sub_41F860((int)&v9);
  10182.           result = 0;
  10183.         }
  10184.       }
  10185.     }
  10186.     else
  10187.     {
  10188.       *(_BYTE *)a2 = 48;
  10189.       *(_BYTE *)(v3 + 1) = 0;
  10190.       result = 0;
  10191.     }
  10192.   }
  10193.   return result;
  10194. }
  10195. // 43EC68: using guessed type char *off_43EC68;
  10196.  
  10197. //----- (0041FD10) --------------------------------------------------------
  10198. int __cdecl sub_41FD10(int a1)
  10199. {
  10200.   int v1; // eax@1
  10201.  
  10202.   v1 = sub_41FA70(a1);
  10203.   return ((v1 & 7) != 0) + v1 / 8;
  10204. }
  10205.  
  10206. //----- (0041FD40) --------------------------------------------------------
  10207. signed int __cdecl sub_41FD40(int a1, int a2)
  10208. {
  10209.   signed int result; // eax@1
  10210.   int v3; // esi@2
  10211.   signed int v4; // edi@3
  10212.   int v5; // [sp+Ch] [bp-10h]@1
  10213.   int v6; // [sp+18h] [bp-4h]@3
  10214.  
  10215.   result = sub_4216B0((int)&v5, a1);
  10216.   if ( !result )
  10217.   {
  10218.     v3 = 0;
  10219.     if ( v5 )
  10220.     {
  10221.       while ( 1 )
  10222.       {
  10223.         *(_BYTE *)(v3++ + a2) = *(_BYTE *)v6;
  10224.         v4 = sub_4216E0((int)&v5, 8, (unsigned int)&v5, 0);
  10225.         if ( v4 )
  10226.           break;
  10227.         if ( !v5 )
  10228.           goto LABEL_5;
  10229.       }
  10230.       sub_41F860((int)&v5);
  10231.       result = v4;
  10232.     }
  10233.     else
  10234.     {
  10235. LABEL_5:
  10236.       sub_421490(a2, v3);
  10237.       sub_41F860((int)&v5);
  10238.       result = 0;
  10239.     }
  10240.   }
  10241.   return result;
  10242. }
  10243.  
  10244. //----- (0041FDD0) --------------------------------------------------------
  10245. signed int __cdecl sub_41FDD0(unsigned int a1, int a2, int a3)
  10246. {
  10247.   signed int result; // eax@2
  10248.   int v4; // edi@3
  10249.   int v5; // ebx@4
  10250.   int v6; // ecx@6
  10251.   int v7; // edx@6
  10252.  
  10253.   if ( *(_DWORD *)(a1 + 4) >= 2 || (result = sub_421250(a1, 2)) == 0 )
  10254.   {
  10255.     sub_4213F0(a1);
  10256.     v4 = a3 - 1;
  10257.     if ( a3 <= 0 )
  10258.     {
  10259. LABEL_7:
  10260.       sub_4212C0(a1);
  10261.       result = 0;
  10262.     }
  10263.     else
  10264.     {
  10265.       v5 = a2;
  10266.       while ( 1 )
  10267.       {
  10268.         result = sub_4212F0(a1, 8, a1);
  10269.         if ( result )
  10270.           break;
  10271.         v6 = *(_BYTE *)v5++;
  10272.         **(_DWORD **)(a1 + 12) |= v6;
  10273.         ++*(_DWORD *)a1;
  10274.         v7 = v4--;
  10275.         if ( v7 <= 0 )
  10276.           goto LABEL_7;
  10277.       }
  10278.     }
  10279.   }
  10280.   return result;
  10281. }
  10282.  
  10283. //----- (0041FE40) --------------------------------------------------------
  10284. signed int __cdecl sub_41FE40(int a1, int a2, int a3)
  10285. {
  10286.   int v3; // ebx@1
  10287.   int v4; // ebp@1
  10288.   signed int result; // eax@2
  10289.  
  10290.   v3 = *(_DWORD *)(a1 + 8);
  10291.   v4 = *(_DWORD *)(a2 + 8);
  10292.   if ( v3 == v4 )
  10293.   {
  10294.     *(_DWORD *)(a3 + 8) = v3;
  10295.     result = sub_421920(a1, a2, a3);
  10296.   }
  10297.   else
  10298.   {
  10299.     if ( sub_421430(a1, a2) == -1 )
  10300.     {
  10301.       *(_DWORD *)(a3 + 8) = v4;
  10302.       result = sub_421850((signed int *)a2, (signed int *)a1, a3);
  10303.     }
  10304.     else
  10305.     {
  10306.       *(_DWORD *)(a3 + 8) = v3;
  10307.       result = sub_421850((signed int *)a1, (signed int *)a2, a3);
  10308.     }
  10309.   }
  10310.   return result;
  10311. }
  10312.  
  10313. //----- (0041FEB0) --------------------------------------------------------
  10314. signed int __cdecl sub_41FEB0(int a1, int a2, int a3)
  10315. {
  10316.   signed int result; // eax@2
  10317.   int v4; // eax@3
  10318.   signed int v5; // edi@6
  10319.   int v6; // ecx@7
  10320.   int v7; // edi@7
  10321.   int v8; // ebx@7
  10322.   signed int v9; // ebp@8
  10323.   unsigned int v10; // edx@8
  10324.   int v11; // ebx@8
  10325.   unsigned int v12; // edx@8
  10326.   int i; // edi@8
  10327.   int v14; // eax@9
  10328.   unsigned int v15; // eax@9
  10329.   int v16; // ebp@10
  10330.   int v17; // edi@10
  10331.   int v18; // eax@14
  10332.   int v19; // ebp@14
  10333.  
  10334.   if ( *(_DWORD *)(a3 + 4) >= *(_DWORD *)a1 + 1 || (result = sub_421250(a3, *(_DWORD *)a1 + 1)) == 0 )
  10335.   {
  10336.     v4 = a2;
  10337.     if ( *(_DWORD *)(a1 + 8) != 1 || *(_DWORD *)a1 <= 1 && **(_DWORD **)(a1 + 12) < (unsigned int)a2 )
  10338.     {
  10339.       v6 = *(_DWORD *)a3;
  10340.       v7 = *(_DWORD *)(a3 + 12);
  10341.       *(_DWORD *)(a3 + 8) = 0;
  10342.       v8 = *(_DWORD *)(a1 + 12);
  10343.       if ( *(_DWORD *)(a1 + 8) )
  10344.       {
  10345.         *(_DWORD *)a3 = 1;
  10346.         if ( *(_DWORD *)a1 == 1 )
  10347.           v4 = a2 - **(_DWORD **)(a1 + 12);
  10348.         *(_DWORD *)v7 = v4;
  10349.         v17 = v7 + 4;
  10350.         v16 = 1;
  10351.       }
  10352.       else
  10353.       {
  10354.         v9 = 1;
  10355.         v10 = a2 + *(_DWORD *)v8;
  10356.         v11 = v8 + 4;
  10357.         *(_DWORD *)v7 = v10;
  10358.         *(_DWORD *)v7 = v10 & 0xFFFFFFF;
  10359.         v12 = v10 >> 28;
  10360.         for ( i = v7 + 4; v9 < *(_DWORD *)a1; ++v9 )
  10361.         {
  10362.           v14 = *(_DWORD *)v11;
  10363.           v11 += 4;
  10364.           v15 = v12 + v14;
  10365.           *(_DWORD *)i = v15;
  10366.           *(_DWORD *)i = v15 & 0xFFFFFFF;
  10367.           v12 = v15 >> 28;
  10368.           i += 4;
  10369.         }
  10370.         *(_DWORD *)i = v12;
  10371.         v16 = v9 + 1;
  10372.         v17 = i + 4;
  10373.         *(_DWORD *)a3 = *(_DWORD *)a1 + 1;
  10374.       }
  10375.       v18 = v16;
  10376.       v19 = v16 + 1;
  10377.       if ( v18 < v6 )
  10378.         memset((void *)v17, 0, 4 * (v6 - v19 + 1));
  10379.       sub_4212C0(a3);
  10380.       result = 0;
  10381.     }
  10382.     else
  10383.     {
  10384.       *(_DWORD *)(a1 + 8) = 0;
  10385.       v5 = sub_420040(a1, a2, a3);
  10386.       *(_DWORD *)(a3 + 8) = 1;
  10387.       *(_DWORD *)(a1 + 8) = 1;
  10388.       sub_4212C0(a3);
  10389.       result = v5;
  10390.     }
  10391.   }
  10392.   return result;
  10393. }
  10394. // 41FEB0: using guessed type _DWORD __cdecl sub_41FEB0(_DWORD, _DWORD, _DWORD);
  10395.  
  10396. //----- (0041FFD0) --------------------------------------------------------
  10397. signed int __cdecl sub_41FFD0(int a1, int a2, int a3)
  10398. {
  10399.   int v3; // edi@1
  10400.   signed int result; // eax@2
  10401.  
  10402.   v3 = *(_DWORD *)(a1 + 8);
  10403.   if ( v3 == *(_DWORD *)(a2 + 8) )
  10404.   {
  10405.     if ( sub_421430(a1, a2) == -1 )
  10406.     {
  10407.       *(_DWORD *)(a3 + 8) = v3 == 0;
  10408.       result = sub_421850((signed int *)a2, (signed int *)a1, a3);
  10409.     }
  10410.     else
  10411.     {
  10412.       *(_DWORD *)(a3 + 8) = v3;
  10413.       result = sub_421850((signed int *)a1, (signed int *)a2, a3);
  10414.     }
  10415.   }
  10416.   else
  10417.   {
  10418.     *(_DWORD *)(a3 + 8) = v3;
  10419.     result = sub_421920(a1, a2, a3);
  10420.   }
  10421.   return result;
  10422. }
  10423.  
  10424. //----- (00420040) --------------------------------------------------------
  10425. signed int __cdecl sub_420040(int a1, int a2, int a3)
  10426. {
  10427.   signed int result; // eax@2
  10428.   signed int v4; // eax@4
  10429.   signed int v5; // edi@4
  10430.   int v6; // edx@5
  10431.   signed int v7; // ecx@5
  10432.   int v8; // ebx@5
  10433.   int v9; // edi@5
  10434.   int v10; // eax@5
  10435.   signed int v11; // ebp@8
  10436.   int v12; // edx@10
  10437.   void *i; // edi@10
  10438.   unsigned int v14; // edx@11
  10439.   int v15; // ebx@11
  10440.   unsigned int v16; // edx@11
  10441.   int v17; // eax@12
  10442.   unsigned int v18; // eax@12
  10443.   signed int v19; // eax@14
  10444.   int v20; // ebp@14
  10445.  
  10446.   if ( *(_DWORD *)(a3 + 4) >= *(_DWORD *)a1 + 1 || (result = sub_421250(a3, *(_DWORD *)a1 + 1)) == 0 )
  10447.   {
  10448.     if ( *(_DWORD *)(a1 + 8) == 1 )
  10449.     {
  10450.       *(_DWORD *)(a1 + 8) = 0;
  10451.       v4 = sub_41FEB0(a1, a2, a3);
  10452.       *(_DWORD *)(a3 + 8) = 1;
  10453.       v5 = v4;
  10454.       *(_DWORD *)(a1 + 8) = 1;
  10455.       sub_4212C0(a3);
  10456.       result = v5;
  10457.     }
  10458.     else
  10459.     {
  10460.       v6 = *(_DWORD *)a1;
  10461.       v7 = *(_DWORD *)a3;
  10462.       v8 = *(_DWORD *)(a1 + 12);
  10463.       v9 = *(_DWORD *)(a3 + 12);
  10464.       v10 = a2;
  10465.       if ( (*(_DWORD *)a1 != 1 || *(_DWORD *)v8 > (unsigned int)a2) && v6 )
  10466.       {
  10467.         *(_DWORD *)(a3 + 8) = 0;
  10468.         *(_DWORD *)a3 = *(_DWORD *)a1;
  10469.         v14 = *(_DWORD *)v8 - a2;
  10470.         v11 = 1;
  10471.         *(_DWORD *)v9 = v14;
  10472.         v15 = v8 + 4;
  10473.         *(_DWORD *)v9 = v14 & 0xFFFFFFF;
  10474.         v16 = v14 >> 31;
  10475.         for ( i = (void *)(v9 + 4); v11 < *(_DWORD *)a1; ++v11 )
  10476.         {
  10477.           v17 = *(_DWORD *)v15;
  10478.           v15 += 4;
  10479.           v18 = v17 - v16;
  10480.           *(_DWORD *)i = v18;
  10481.           *(_DWORD *)i = v18 & 0xFFFFFFF;
  10482.           v16 = v18 >> 31;
  10483.           i = (char *)i + 4;
  10484.         }
  10485.         v12 = a3;
  10486.       }
  10487.       else
  10488.       {
  10489.         v11 = 1;
  10490.         if ( v6 == 1 )
  10491.           v10 = a2 - *(_DWORD *)v8;
  10492.         v12 = a3;
  10493.         *(_DWORD *)v9 = v10;
  10494.         i = (void *)(v9 + 4);
  10495.         *(_DWORD *)(a3 + 8) = 1;
  10496.         *(_DWORD *)a3 = 1;
  10497.       }
  10498.       v19 = v11;
  10499.       v20 = v11 + 1;
  10500.       if ( v19 < v7 )
  10501.         memset(i, 0, 4 * (v7 - v20 + 1));
  10502.       sub_4212C0(v12);
  10503.       result = 0;
  10504.     }
  10505.   }
  10506.   return result;
  10507. }
  10508. // 41FEB0: using guessed type _DWORD __cdecl sub_41FEB0(_DWORD, _DWORD, _DWORD);
  10509.  
  10510. //----- (00420150) --------------------------------------------------------
  10511. signed int __cdecl sub_420150(int a1, int a2, int a3)
  10512. {
  10513.   unsigned int v3; // eax@1
  10514.   signed int v4; // ecx@1
  10515.   int v5; // esi@1
  10516.   int v6; // ebx@1
  10517.   signed int result; // eax@4
  10518.   int v8; // esi@5
  10519.   int v9; // esi@9
  10520.   signed int v10; // ST0C_4@13
  10521.   int v11; // esi@13
  10522.   signed int v12; // ST0C_4@14
  10523.  
  10524.   v3 = *(_DWORD *)a1;
  10525.   v4 = *(_DWORD *)a2;
  10526.   v5 = *(_DWORD *)a1;
  10527.   v6 = *(_DWORD *)(a1 + 8) != *(_DWORD *)(a2 + 8);
  10528.   if ( *(_DWORD *)a1 >= *(_DWORD *)a2 )
  10529.     v5 = *(_DWORD *)a2;
  10530.   if ( v5 < dword_43ECB8 )
  10531.   {
  10532.     v8 = *(_DWORD *)a1;
  10533.     if ( (signed int)v3 >= v4 )
  10534.       v8 = *(_DWORD *)a2;
  10535.     if ( v8 < dword_43ECB0 )
  10536.     {
  10537.       v9 = v4 + v3 + 1;
  10538.       if ( (unsigned int)v9 >= 0x200 )
  10539.         goto LABEL_18;
  10540.       if ( (signed int)v3 >= v4 )
  10541.         v3 = *(_DWORD *)a2;
  10542.       if ( v3 > 0x100 )
  10543.       {
  10544. LABEL_18:
  10545.         v12 = v9;
  10546.         v11 = a3;
  10547.         result = sub_421A30(a1, a2, a3, v12);
  10548.       }
  10549.       else
  10550.       {
  10551.         v10 = v9;
  10552.         v11 = a3;
  10553.         result = sub_421B90(a1, a2, a3, v10);
  10554.       }
  10555.       *(_DWORD *)(v11 + 8) = v6 & ((*(_DWORD *)v11 <= 0) - 1);
  10556.     }
  10557.     else
  10558.     {
  10559.       result = sub_421CF0(a1, a2, a3);
  10560.       *(_DWORD *)(a3 + 8) = v6 & ((*(_DWORD *)a3 <= 0) - 1);
  10561.     }
  10562.   }
  10563.   else
  10564.   {
  10565.     result = sub_422020(a1, a2, a3);
  10566.     *(_DWORD *)(a3 + 8) = v6 & ((*(_DWORD *)a3 <= 0) - 1);
  10567.   }
  10568.   return result;
  10569. }
  10570. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  10571. // 43ECB0: using guessed type int dword_43ECB0;
  10572. // 43ECB8: using guessed type int dword_43ECB8;
  10573.  
  10574. //----- (00420220) --------------------------------------------------------
  10575. signed int __cdecl sub_420220(int a1, int a2, int a3)
  10576. {
  10577.   signed int result; // eax@2
  10578.   int v4; // ecx@3
  10579.   int v5; // ebp@3
  10580.   int v6; // edi@3
  10581.   int v7; // ebx@3
  10582.   int v8; // esi@3
  10583.   int v9; // ecx@4
  10584.   void *v10; // edi@6
  10585.   int v11; // eax@6
  10586.   int v12; // esi@6
  10587.   int v13; // [sp+0h] [bp-4h]@3
  10588.  
  10589.   if ( *(_DWORD *)(a3 + 4) >= *(_DWORD *)a1 + 1 || (result = sub_421250(a3, *(_DWORD *)a1 + 1)) == 0 )
  10590.   {
  10591.     v4 = *(_DWORD *)a3;
  10592.     *(_DWORD *)(a3 + 8) = *(_DWORD *)(a1 + 8);
  10593.     v5 = *(_DWORD *)(a1 + 12);
  10594.     v6 = *(_DWORD *)(a3 + 12);
  10595.     v7 = 0;
  10596.     v8 = 0;
  10597.     v13 = v4;
  10598.     if ( *(_DWORD *)a1 > 0 )
  10599.     {
  10600.       do
  10601.       {
  10602.         v9 = *(_DWORD *)v5;
  10603.         v5 += 4;
  10604.         *(_DWORD *)v6 = (v7 + v9 * a2) & 0xFFFFFFF;
  10605.         v6 += 4;
  10606.         v7 = unknown_libname_1(28);
  10607.         ++v8;
  10608.       }
  10609.       while ( v8 < *(_DWORD *)a1 );
  10610.       v4 = v13;
  10611.     }
  10612.     *(_DWORD *)v6 = v7;
  10613.     v10 = (void *)(v6 + 4);
  10614.     v11 = v8 + 1;
  10615.     v12 = v8 + 2;
  10616.     if ( v11 < v4 )
  10617.       memset(v10, 0, 4 * (v4 - v12 + 1));
  10618.     *(_DWORD *)a3 = *(_DWORD *)a1 + 1;
  10619.     sub_4212C0(a3);
  10620.     result = 0;
  10621.   }
  10622.   return result;
  10623. }
  10624. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  10625.  
  10626. //----- (004202E0) --------------------------------------------------------
  10627. signed int __cdecl sub_4202E0(int a1, int a2)
  10628. {
  10629.   unsigned int v2; // ecx@1
  10630.   signed int result; // eax@2
  10631.  
  10632.   v2 = *(_DWORD *)a1;
  10633.   if ( *(_DWORD *)a1 < dword_43ECBC )
  10634.   {
  10635.     if ( (signed int)v2 < dword_43ECB4 )
  10636.     {
  10637.       if ( 2 * v2 + 1 >= 0x200 || v2 >= 0x80 )
  10638.       {
  10639.         result = sub_4228C0(a1, a2);
  10640.         *(_DWORD *)(a2 + 8) = 0;
  10641.       }
  10642.       else
  10643.       {
  10644.         result = sub_422A50(a1, a2);
  10645.         *(_DWORD *)(a2 + 8) = 0;
  10646.       }
  10647.     }
  10648.     else
  10649.     {
  10650.       result = sub_422C10(a1, a2);
  10651.       *(_DWORD *)(a2 + 8) = 0;
  10652.     }
  10653.   }
  10654.   else
  10655.   {
  10656.     result = sub_422E70(a1, a2);
  10657.     *(_DWORD *)(a2 + 8) = 0;
  10658.   }
  10659.   return result;
  10660. }
  10661. // 4202E0: using guessed type _DWORD __cdecl sub_4202E0(_DWORD, _DWORD);
  10662. // 43ECB4: using guessed type int dword_43ECB4;
  10663. // 43ECBC: using guessed type int dword_43ECBC;
  10664.  
  10665. //----- (00420370) --------------------------------------------------------
  10666. signed int __cdecl sub_420370(int a1, int a2, unsigned int a3, int a4)
  10667. {
  10668.   signed int result; // eax@2
  10669.   signed int v5; // esi@5
  10670.   int v6; // ecx@14
  10671.   int v7; // esi@14
  10672.   int v8; // edx@14
  10673.   signed int v9; // edi@15
  10674.   int v10; // ebx@19
  10675.   int v11; // ebp@19
  10676.   int v12; // edi@19
  10677.   __int64 v13; // qax@25
  10678.   unsigned int v14; // esi@25
  10679.   int v15; // edi@26
  10680.   unsigned __int64 v16; // qax@27
  10681.   unsigned __int64 v17; // qax@27
  10682.   int v18; // eax@32
  10683.   int v19; // eax@36
  10684.   int v20; // eax@39
  10685.   int v21; // [sp+10h] [bp-60h]@15
  10686.   int v22; // [sp+14h] [bp-5Ch]@14
  10687.   int v23; // [sp+20h] [bp-50h]@12
  10688.   int v24; // [sp+28h] [bp-48h]@14
  10689.   int v25; // [sp+2Ch] [bp-44h]@25
  10690.   int v26; // [sp+30h] [bp-40h]@13
  10691.   int v27; // [sp+38h] [bp-38h]@14
  10692.   int v28; // [sp+3Ch] [bp-34h]@25
  10693.   int v29; // [sp+40h] [bp-30h]@10
  10694.   int v30; // [sp+4Ch] [bp-24h]@34
  10695.   int v31; // [sp+50h] [bp-20h]@9
  10696.   int v32; // [sp+5Ch] [bp-14h]@21
  10697.   int v33; // [sp+60h] [bp-10h]@11
  10698.   int v34; // [sp+6Ch] [bp-4h]@38
  10699.   int v35; // [sp+78h] [bp+8h]@26
  10700.  
  10701.   if ( !*(_DWORD *)a2 )
  10702.     return -3;
  10703.   if ( sub_421430(a1, a2) == -1 )
  10704.   {
  10705.     if ( a4 )
  10706.       v5 = sub_41F8F0(a1, a4);
  10707.     else
  10708.       v5 = 0;
  10709.     if ( a3 )
  10710.     {
  10711.       sub_4213F0(a3);
  10712.       return v5;
  10713.     }
  10714.     return v5;
  10715.   }
  10716.   result = sub_4235D0((int)&v31, *(_DWORD *)a1 + 2);
  10717.   if ( result )
  10718.     return result;
  10719.   v31 = *(_DWORD *)a1 + 2;
  10720.   v5 = sub_41F810((int)&v29);
  10721.   if ( !v5 )
  10722.   {
  10723.     v5 = sub_41F810((int)&v33);
  10724.     if ( v5 )
  10725.     {
  10726. LABEL_62:
  10727.       sub_41F860((int)&v29);
  10728.       goto LABEL_63;
  10729.     }
  10730.     v5 = sub_4216B0((int)&v23, a1);
  10731.     if ( v5 )
  10732.     {
  10733. LABEL_61:
  10734.       sub_41F860((int)&v33);
  10735.       goto LABEL_62;
  10736.     }
  10737.     v5 = sub_4216B0((int)&v26, a2);
  10738.     if ( v5 )
  10739.     {
  10740. LABEL_60:
  10741.       sub_41F860((int)&v23);
  10742.       goto LABEL_61;
  10743.     }
  10744.     v6 = *(_DWORD *)(a1 + 8);
  10745.     v7 = *(_DWORD *)(a2 + 8);
  10746.     v27 = 0;
  10747.     v22 = v6 != v7;
  10748.     v24 = 0;
  10749.     v8 = sub_41FA70((int)&v26) % 28;
  10750.     if ( v8 >= 27 )
  10751.     {
  10752.       v21 = 0;
  10753.     }
  10754.     else
  10755.     {
  10756.       v9 = 27 - v8;
  10757.       v21 = 27 - v8;
  10758.       v5 = sub_4212F0((int)&v23, 27 - v8, (int)&v23);
  10759.       if ( v5 || (v5 = sub_4212F0((int)&v26, v9, (int)&v26)) != 0 )
  10760.       {
  10761. LABEL_59:
  10762.         sub_41F860((int)&v26);
  10763.         goto LABEL_60;
  10764.       }
  10765.     }
  10766.     v10 = v23 - 1;
  10767.     v11 = v26 - 1;
  10768.     v12 = v23 - 1 - (v26 - 1);
  10769.     v5 = sub_423560((int)&v26, v23 - 1 - (v26 - 1));
  10770.     if ( !v5 )
  10771.     {
  10772.       if ( sub_41FA00((int)&v23, (int)&v26) == -1 )
  10773.       {
  10774. LABEL_23:
  10775.         sub_423500((unsigned int)&v26, v12);
  10776.         if ( v10 < v11 + 1 )
  10777.         {
  10778. LABEL_51:
  10779.           if ( v23 )
  10780.             v24 = *(_DWORD *)(a1 + 8);
  10781.           else
  10782.             v24 = 0;
  10783.           if ( a3 )
  10784.           {
  10785.             sub_4212C0((int)&v31);
  10786.             sub_4234B0((int)&v31, a3);
  10787.             *(_DWORD *)(a3 + 8) = v22;
  10788.           }
  10789.           if ( a4 )
  10790.           {
  10791.             sub_4216E0((int)&v23, v21, (unsigned int)&v23, 0);
  10792.             sub_4234B0((int)&v23, a4);
  10793.           }
  10794.           v5 = 0;
  10795.         }
  10796.         else
  10797.         {
  10798.           while ( v10 > v23 )
  10799.           {
  10800. LABEL_50:
  10801.             --v10;
  10802.             if ( v10 < v11 + 1 )
  10803.               goto LABEL_51;
  10804.           }
  10805.           LODWORD(v13) = *(_DWORD *)(v25 + 4 * v10);
  10806.           v14 = *(_DWORD *)(v28 + 4 * v11);
  10807.           if ( (_DWORD)v13 == v14 )
  10808.           {
  10809.             v35 = v10 - v11 - 1;
  10810.             v15 = 4 * v35;
  10811.             *(_DWORD *)(4 * v35 + v32) = 268435455;
  10812.           }
  10813.           else
  10814.           {
  10815.             HIDWORD(v13) = 0;
  10816.             v16 = v13 << 28;
  10817.             LODWORD(v16) = *(_DWORD *)(v25 + 4 * v10 - 4) | v16;
  10818.             v17 = v16 / v14;
  10819.             if ( v17 > 0xFFFFFFF )
  10820.               LODWORD(v17) = 268435455;
  10821.             v35 = v10 - v11 - 1;
  10822.             v15 = 4 * v35;
  10823.             *(_DWORD *)(4 * v35 + v32) = v17 & 0xFFFFFFF;
  10824.           }
  10825.           *(_DWORD *)(v15 + v32) = (*(_DWORD *)(v15 + v32) + 1) & 0xFFFFFFF;
  10826.           while ( 1 )
  10827.           {
  10828.             *(_DWORD *)(v15 + v32) = (*(_DWORD *)(v15 + v32) - 1) & 0xFFFFFFF;
  10829.             sub_4213F0((unsigned int)&v29);
  10830.             v18 = v11 - 1 >= 0 ? *(_DWORD *)(v28 + 4 * v11 - 4) : 0;
  10831.             *(_DWORD *)v30 = v18;
  10832.             *(_DWORD *)(v30 + 4) = *(_DWORD *)(v28 + 4 * v11);
  10833.             v29 = 2;
  10834.             v5 = sub_420220((int)&v29, *(_DWORD *)(v15 + v32), (int)&v29);
  10835.             if ( v5 )
  10836.               break;
  10837.             if ( v10 - 2 >= 0 )
  10838.               v19 = *(_DWORD *)(v25 + 4 * (v10 - 2));
  10839.             else
  10840.               v19 = 0;
  10841.             *(_DWORD *)v34 = v19;
  10842.             if ( v10 - 1 >= 0 )
  10843.               v20 = *(_DWORD *)(v25 + 4 * v10 - 4);
  10844.             else
  10845.               v20 = 0;
  10846.             *(_DWORD *)(v34 + 4) = v20;
  10847.             *(_DWORD *)(v34 + 8) = *(_DWORD *)(v25 + 4 * v10);
  10848.             v33 = 3;
  10849.             if ( sub_421430((int)&v29, (int)&v33) != 1 )
  10850.             {
  10851.               v5 = sub_420220((int)&v26, *(_DWORD *)(v15 + v32), (int)&v29);
  10852.               if ( !v5 )
  10853.               {
  10854.                 v5 = sub_423560((int)&v29, v35);
  10855.                 if ( !v5 )
  10856.                 {
  10857.                   v5 = sub_41FFD0((int)&v23, (int)&v29, (int)&v23);
  10858.                   if ( !v5 )
  10859.                   {
  10860.                     if ( v24 != 1 )
  10861.                       goto LABEL_50;
  10862.                     v5 = sub_41F8F0((int)&v26, (int)&v29);
  10863.                     if ( !v5 )
  10864.                     {
  10865.                       v5 = sub_423560((int)&v29, v35);
  10866.                       if ( !v5 )
  10867.                       {
  10868.                         v5 = sub_41FE40((int)&v23, (int)&v29, (int)&v23);
  10869.                         if ( !v5 )
  10870.                         {
  10871.                           *(_DWORD *)(v15 + v32) = (*(_DWORD *)(v15 + v32) - 1) & 0xFFFFFFF;
  10872.                           goto LABEL_50;
  10873.                         }
  10874.                       }
  10875.                     }
  10876.                   }
  10877.                 }
  10878.               }
  10879.               goto LABEL_59;
  10880.             }
  10881.           }
  10882.         }
  10883.       }
  10884.       else
  10885.       {
  10886.         while ( 1 )
  10887.         {
  10888.           ++*(_DWORD *)(v32 + 4 * v12);
  10889.           v5 = sub_41FFD0((int)&v23, (int)&v26, (int)&v23);
  10890.           if ( v5 )
  10891.             break;
  10892.           if ( sub_41FA00((int)&v23, (int)&v26) == -1 )
  10893.             goto LABEL_23;
  10894.         }
  10895.       }
  10896.     }
  10897.     goto LABEL_59;
  10898.   }
  10899. LABEL_63:
  10900.   sub_41F860((int)&v31);
  10901.   return v5;
  10902. }
  10903.  
  10904. //----- (00420890) --------------------------------------------------------
  10905. signed int __cdecl sub_420890(int a1, int a2)
  10906. {
  10907.   int v2; // ebp@1
  10908.   signed int result; // eax@2
  10909.   signed int v4; // eax@3
  10910.   int v5; // ecx@3
  10911.   int v6; // edi@3
  10912.   int v7; // ebx@3
  10913.   int v8; // esi@3
  10914.   int v9; // eax@3
  10915.   int v10; // ecx@4
  10916.   unsigned int v11; // eax@5
  10917.   char v12; // dl@5
  10918.   int v13; // [sp+10h] [bp+8h]@3
  10919.  
  10920.   v2 = a2;
  10921.   if ( *(_DWORD *)(a2 + 4) >= *(_DWORD *)a1 || (result = sub_421250(a2, *(_DWORD *)a1)) == 0 )
  10922.   {
  10923.     v4 = *(_DWORD *)a1;
  10924.     v5 = *(_DWORD *)a2;
  10925.     *(_DWORD *)a2 = *(_DWORD *)a1;
  10926.     v6 = *(_DWORD *)(a1 + 12) + 4 * v4 - 4;
  10927.     v7 = 0;
  10928.     v13 = v5;
  10929.     v8 = *(_DWORD *)(v2 + 12) + 4 * v4 - 4;
  10930.     v9 = v4 - 1;
  10931.     if ( v9 >= 0 )
  10932.     {
  10933.       v10 = v9 + 1;
  10934.       do
  10935.       {
  10936.         v11 = *(_DWORD *)v6;
  10937.         v8 -= 4;
  10938.         v12 = *(_DWORD *)v6;
  10939.         v6 -= 4;
  10940.         *(_DWORD *)(v8 + 4) = (v7 << 27) | (v11 >> 1);
  10941.         --v10;
  10942.         v7 = v12 & 1;
  10943.       }
  10944.       while ( v10 );
  10945.       v5 = v13;
  10946.     }
  10947.     if ( *(_DWORD *)v2 < v5 )
  10948.       memset((void *)(*(_DWORD *)(v2 + 12) + 4 * *(_DWORD *)v2), 0, 4 * (v5 - *(_DWORD *)v2));
  10949.     *(_DWORD *)(v2 + 8) = *(_DWORD *)(a1 + 8);
  10950.     sub_4212C0(v2);
  10951.     result = 0;
  10952.   }
  10953.   return result;
  10954. }
  10955.  
  10956. //----- (00420930) --------------------------------------------------------
  10957. signed int __cdecl sub_420930(int a1, int a2, int a3)
  10958. {
  10959.   return sub_4214C0(a1, a2, 0, a3);
  10960. }
  10961.  
  10962. //----- (00420950) --------------------------------------------------------
  10963. signed int __cdecl sub_420950(int a1, int a2, int a3)
  10964. {
  10965.   signed int result; // eax@2
  10966.   signed int v4; // esi@6
  10967.   int v5; // ebx@7
  10968.   int v6; // eax@7
  10969.   int v7; // ebp@7
  10970.   signed int v8; // edi@7
  10971.   int v9; // eax@20
  10972.   int v10; // [sp+8h] [bp-20h]@6
  10973.   int v11; // [sp+10h] [bp-18h]@7
  10974.   char v12; // [sp+18h] [bp-10h]@5
  10975.   int v13; // [sp+20h] [bp-8h]@7
  10976.  
  10977.   if ( *(_DWORD *)a1 )
  10978.   {
  10979.     if ( *(_DWORD *)a2 )
  10980.     {
  10981.       result = sub_4216B0((int)&v12, a1);
  10982.       if ( !result )
  10983.       {
  10984.         v4 = sub_4216B0((int)&v10, a2);
  10985.         if ( !v4 )
  10986.         {
  10987.           v11 = 0;
  10988.           v13 = 0;
  10989.           v5 = sub_41FAA0((int)&v12);
  10990.           v6 = sub_41FAA0((int)&v10);
  10991.           v7 = v6;
  10992.           v8 = v5;
  10993.           if ( v5 >= v6 )
  10994.             v8 = v6;
  10995.           if ( v8 <= 0
  10996.             || (v4 = sub_4216E0((int)&v12, v8, (unsigned int)&v12, 0)) == 0
  10997.             && (v4 = sub_4216E0((int)&v10, v8, (unsigned int)&v10, 0)) == 0 )
  10998.           {
  10999.             if ( v5 == v8 || (v4 = sub_4216E0((int)&v12, v5 - v8, (unsigned int)&v12, 0)) == 0 )
  11000.             {
  11001.               if ( v7 == v8 || (v4 = sub_4216E0((int)&v10, v7 - v8, (unsigned int)&v10, 0)) == 0 )
  11002.               {
  11003.                 if ( v10 )
  11004.                 {
  11005.                   while ( 1 )
  11006.                   {
  11007.                     if ( sub_421430((int)&v12, (int)&v10) == 1 )
  11008.                       sub_4234B0((int)&v12, (int)&v10);
  11009.                     v4 = sub_421850(&v10, (signed int *)&v12, (int)&v10);
  11010.                     if ( v4 )
  11011.                       break;
  11012.                     v9 = sub_41FAA0((int)&v10);
  11013.                     v4 = sub_4216E0((int)&v10, v9, (unsigned int)&v10, 0);
  11014.                     if ( v4 )
  11015.                       break;
  11016.                     if ( !v10 )
  11017.                       goto LABEL_22;
  11018.                   }
  11019.                 }
  11020.                 else
  11021.                 {
  11022. LABEL_22:
  11023.                   v4 = sub_4212F0((int)&v12, v8, a3);
  11024.                   if ( !v4 )
  11025.                     *(_DWORD *)(a3 + 8) = 0;
  11026.                 }
  11027.               }
  11028.             }
  11029.           }
  11030.           sub_41F860((int)&v12);
  11031.         }
  11032.         sub_41F860((int)&v10);
  11033.         result = v4;
  11034.       }
  11035.     }
  11036.     else
  11037.     {
  11038.       result = sub_423640(a1, a3);
  11039.     }
  11040.   }
  11041.   else
  11042.   {
  11043.     result = sub_423640(a2, a3);
  11044.   }
  11045.   return result;
  11046. }
  11047.  
  11048. //----- (00420B40) --------------------------------------------------------
  11049. signed int __cdecl sub_420B40(int a1, int a2, int a3)
  11050. {
  11051.   signed int result; // eax@1
  11052.   signed int v4; // esi@2
  11053.   int v5; // ebp@5
  11054.   int v6; // [sp-1Ch] [bp-3Ch]@5
  11055.   char *v7; // [sp-18h] [bp-38h]@5
  11056.   int v8; // [sp-14h] [bp-34h]@5
  11057.   char v9; // [sp+0h] [bp-20h]@4
  11058.   char v10; // [sp+10h] [bp-10h]@1
  11059.  
  11060.   result = sub_4236A0((int)&v10);
  11061.   if ( !result )
  11062.   {
  11063.     v4 = sub_420950(a1, a2, (int)&v10);
  11064.     if ( !v4 )
  11065.     {
  11066.       if ( sub_421430(a1, a2) == -1 )
  11067.       {
  11068.         v4 = sub_420370(a1, (int)&v10, (unsigned int)&v9, 0);
  11069.         if ( !v4 )
  11070.         {
  11071.           v5 = a3;
  11072.           v8 = a3;
  11073.           v7 = &v9;
  11074.           v6 = a2;
  11075. LABEL_8:
  11076.           v4 = sub_420150(v6, v7, v8);
  11077.           *(_DWORD *)(v5 + 8) = 0;
  11078.           goto LABEL_9;
  11079.         }
  11080.       }
  11081.       else
  11082.       {
  11083.         v4 = sub_420370(a2, (int)&v10, (unsigned int)&v9, 0);
  11084.         if ( !v4 )
  11085.         {
  11086.           v5 = a3;
  11087.           v8 = a3;
  11088.           v7 = &v9;
  11089.           v6 = a1;
  11090.           goto LABEL_8;
  11091.         }
  11092.       }
  11093.     }
  11094. LABEL_9:
  11095.     sub_423670((int)&v10);
  11096.     result = v4;
  11097.   }
  11098.   return result;
  11099. }
  11100. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  11101.  
  11102. //----- (00420C00) --------------------------------------------------------
  11103. signed int __cdecl sub_420C00(int a1, int a2, int a3, int a4)
  11104. {
  11105.   signed int result; // eax@1
  11106.   signed int v5; // esi@2
  11107.   signed int v6; // esi@4
  11108.   char v7; // [sp+4h] [bp-10h]@1
  11109.  
  11110.   result = sub_41F810((int)&v7);
  11111.   if ( !result )
  11112.   {
  11113.     v5 = sub_420150(a1, a2, &v7);
  11114.     if ( v5 )
  11115.     {
  11116.       sub_41F860((int)&v7);
  11117.       result = v5;
  11118.     }
  11119.     else
  11120.     {
  11121.       v6 = sub_423700((int)&v7, a3, a4);
  11122.       sub_41F860((int)&v7);
  11123.       result = v6;
  11124.     }
  11125.   }
  11126.   return result;
  11127. }
  11128. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  11129.  
  11130. //----- (00420C70) --------------------------------------------------------
  11131. signed int __cdecl sub_420C70(int a1, int a2, int a3)
  11132. {
  11133.   signed int result; // eax@1
  11134.   signed int v4; // esi@2
  11135.   signed int v5; // esi@4
  11136.   char v6; // [sp+4h] [bp-10h]@1
  11137.  
  11138.   result = sub_41F810((int)&v6);
  11139.   if ( !result )
  11140.   {
  11141.     v4 = sub_4202E0(a1, &v6);
  11142.     if ( v4 )
  11143.     {
  11144.       sub_41F860((int)&v6);
  11145.       result = v4;
  11146.     }
  11147.     else
  11148.     {
  11149.       v5 = sub_423700((int)&v6, a2, a3);
  11150.       sub_41F860((int)&v6);
  11151.       result = v5;
  11152.     }
  11153.   }
  11154.   return result;
  11155. }
  11156. // 4202E0: using guessed type _DWORD __cdecl sub_4202E0(_DWORD, _DWORD);
  11157.  
  11158. //----- (00420CE0) --------------------------------------------------------
  11159. signed int __cdecl sub_420CE0(int a1, int a2, int a3)
  11160. {
  11161.   signed int result; // eax@5
  11162.  
  11163.   if ( *(_DWORD *)(a2 + 8) != 1 && *(_DWORD *)a2 )
  11164.   {
  11165.     if ( *(_DWORD *)a2 <= 0 || (**(_BYTE **)(a2 + 12) & 1) != 1 )
  11166.       result = sub_423780(a1, a2, a3);
  11167.     else
  11168.       result = sub_423C50(a1, a2, a3);
  11169.   }
  11170.   else
  11171.   {
  11172.     result = -3;
  11173.   }
  11174.   return result;
  11175. }
  11176.  
  11177. //----- (00420D30) --------------------------------------------------------
  11178. signed int __cdecl sub_420D30(int a1, int a2)
  11179. {
  11180.   int v2; // edx@1
  11181.   signed int result; // eax@2
  11182.  
  11183.   v2 = **(_DWORD **)(a1 + 12);
  11184.   if ( v2 & 1 )
  11185.   {
  11186.     *(_DWORD *)a2 = -((v2 + ((2 * v2 + 4) & 8))
  11187.                     * (2 - v2 * (v2 + ((2 * v2 + 4) & 8)))
  11188.                     * (2 - v2 * (v2 + ((2 * v2 + 4) & 8)) * (2 - v2 * (v2 + ((2 * v2 + 4) & 8))))
  11189.                     * (2
  11190.                      - v2
  11191.                      * (v2 + ((2 * v2 + 4) & 8))
  11192.                      * (2 - v2 * (v2 + ((2 * v2 + 4) & 8)))
  11193.                      * (2 - v2 * (v2 + ((2 * v2 + 4) & 8)) * (2 - v2 * (v2 + ((2 * v2 + 4) & 8)))))) & 0xFFFFFFF;
  11194.     result = 0;
  11195.   }
  11196.   else
  11197.   {
  11198.     result = -3;
  11199.   }
  11200.   return result;
  11201. }
  11202.  
  11203. //----- (00420D90) --------------------------------------------------------
  11204. signed int __cdecl sub_420D90(unsigned int a1, signed int *a2)
  11205. {
  11206.   int v2; // edx@1
  11207.   signed int v3; // edi@1
  11208.   int v4; // esi@2
  11209.   signed int result; // eax@2
  11210.   int v6; // edi@5
  11211.  
  11212.   v2 = sub_41FA70((int)a2) % 28;
  11213.   v3 = v2;
  11214.   if ( *a2 <= 1 )
  11215.   {
  11216.     v4 = a1;
  11217.     sub_424010(a1, 1);
  11218.     v3 = 1;
  11219.   }
  11220.   else
  11221.   {
  11222.     v4 = a1;
  11223.     result = sub_41FB00(a1, v2 + 28 * *a2 - 29);
  11224.     if ( result )
  11225.       return result;
  11226.   }
  11227.   v6 = v3 - 1;
  11228.   if ( v6 >= 28 )
  11229.   {
  11230. LABEL_10:
  11231.     result = 0;
  11232.   }
  11233.   else
  11234.   {
  11235.     while ( 1 )
  11236.     {
  11237.       result = sub_423F60(v4, v4);
  11238.       if ( result )
  11239.         break;
  11240.       if ( sub_421430(v4, (int)a2) != -1 )
  11241.       {
  11242.         result = sub_421850((signed int *)v4, a2, v4);
  11243.         if ( result )
  11244.           break;
  11245.       }
  11246.       ++v6;
  11247.       if ( v6 >= 28 )
  11248.         goto LABEL_10;
  11249.     }
  11250.   }
  11251.   return result;
  11252. }
  11253.  
  11254. //----- (00420E30) --------------------------------------------------------
  11255. signed int __cdecl sub_420E30(int a1, int a2, int a3)
  11256. {
  11257.   int v3; // ebx@1
  11258.   int v4; // edi@1
  11259.   signed int result; // eax@3
  11260.   int v6; // esi@4
  11261.   int v7; // eax@6
  11262.   int v8; // ecx@6
  11263.   int v9; // edi@7
  11264.   int v10; // edx@7
  11265.   int v11; // ebx@7
  11266.   int v12; // ebp@7
  11267.   unsigned __int64 v13; // kr08_8@8
  11268.   int v14; // ebp@10
  11269.   unsigned int v15; // ebp@10
  11270.   int v16; // [sp+Ch] [bp-Ch]@7
  11271.   int v17; // [sp+10h] [bp-8h]@7
  11272.   int i; // [sp+14h] [bp-4h]@6
  11273.  
  11274.   v3 = a2;
  11275.   v4 = 2 * *(_DWORD *)a2 + 1;
  11276.   if ( (unsigned int)v4 >= 0x200 || *(_DWORD *)a2 >= 0x100u )
  11277.   {
  11278.     v6 = a1;
  11279.     if ( *(_DWORD *)(a1 + 4) >= v4 || (result = sub_421250(a1, 2 * *(_DWORD *)a2 + 1)) == 0 )
  11280.     {
  11281.       *(_DWORD *)a1 = v4;
  11282.       v7 = *(_DWORD *)a2;
  11283.       v8 = 0;
  11284.       for ( i = 0; v8 < *(_DWORD *)a2; v7 = *(_DWORD *)a2 )
  11285.       {
  11286.         v9 = *(_DWORD *)(v6 + 12) + 4 * v8;
  11287.         v10 = *(_DWORD *)(v3 + 12);
  11288.         v11 = 0;
  11289.         v12 = a3 * *(_DWORD *)v9 & 0xFFFFFFF;
  11290.         v16 = v10;
  11291.         v17 = 0;
  11292.         if ( v7 > 0 )
  11293.         {
  11294.           do
  11295.           {
  11296.             v13 = *(_DWORD *)v16 * (unsigned __int64)(unsigned int)v12
  11297.                 + (unsigned int)(*(_DWORD *)v16 * v12)
  11298.                 + (unsigned int)v11;
  11299.             v16 += 4;
  11300.             v11 = unknown_libname_1(28);
  11301.             *(_DWORD *)v9 = v13 & 0xFFFFFFF;
  11302.             v9 += 4;
  11303.             ++v17;
  11304.           }
  11305.           while ( v17 < *(_DWORD *)a2 );
  11306.           if ( v11 )
  11307.           {
  11308.             do
  11309.             {
  11310.               v14 = *(_DWORD *)v9;
  11311.               v9 += 4;
  11312.               v15 = v11 + v14;
  11313.               *(_DWORD *)(v9 - 4) = v15;
  11314.               v11 = v15 >> 28;
  11315.               *(_DWORD *)(v9 - 4) = v15 & 0xFFFFFFF;
  11316.             }
  11317.             while ( v15 >> 28 );
  11318.           }
  11319.           v6 = a1;
  11320.           v8 = i;
  11321.         }
  11322.         ++v8;
  11323.         i = v8;
  11324.         v3 = a2;
  11325.       }
  11326.       sub_4212C0(v6);
  11327.       sub_423500(v6, *(_DWORD *)v3);
  11328.       if ( sub_421430(v6, v3) == -1 )
  11329.         result = 0;
  11330.       else
  11331.         result = sub_421850((signed int *)v6, (signed int *)v3, v6);
  11332.     }
  11333.   }
  11334.   else
  11335.   {
  11336.     result = sub_424040(a1, a2, a3);
  11337.   }
  11338.   return result;
  11339. }
  11340. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  11341.  
  11342. //----- (00420FA0) --------------------------------------------------------
  11343. signed int __cdecl sub_420FA0(int a1, int a2, int a3, int a4)
  11344. {
  11345.   signed int result; // eax@2
  11346.   signed int v5; // edi@5
  11347.   signed int v6; // edi@7
  11348.   signed int v7; // edi@9
  11349.   signed int v8; // esi@11
  11350.   int v9; // eax@14
  11351.   char v10; // [sp+Ch] [bp-20h]@4
  11352.   char v11; // [sp+1Ch] [bp-10h]@7
  11353.  
  11354.   if ( *(_DWORD *)(a3 + 8) == 1 )
  11355.   {
  11356.     result = -3;
  11357.   }
  11358.   else
  11359.   {
  11360.     if ( *(_DWORD *)(a2 + 8) == 1 )
  11361.     {
  11362.       result = sub_41F810((int)&v10);
  11363.       if ( !result )
  11364.       {
  11365.         v5 = sub_420CE0(a1, a3, (int)&v10);
  11366.         if ( v5 )
  11367.         {
  11368.           sub_41F860((int)&v10);
  11369.           result = v5;
  11370.         }
  11371.         else
  11372.         {
  11373.           v6 = sub_41F810((int)&v11);
  11374.           if ( v6 )
  11375.           {
  11376.             sub_41F860((int)&v10);
  11377.             result = v6;
  11378.           }
  11379.           else
  11380.           {
  11381.             v7 = sub_423640(a2, (int)&v11);
  11382.             if ( v7 )
  11383.             {
  11384.               sub_423670((int)&v10);
  11385.               result = v7;
  11386.             }
  11387.             else
  11388.             {
  11389.               v8 = sub_420FA0(&v10, &v11, a3, a4);
  11390.               sub_423670((int)&v10);
  11391.               result = v8;
  11392.             }
  11393.           }
  11394.         }
  11395.       }
  11396.     }
  11397.     else
  11398.     {
  11399.       if ( sub_424E00(a3) == 1 )
  11400.       {
  11401.         result = sub_4248B0(a1, a2, a3, a4, 1);
  11402.       }
  11403.       else
  11404.       {
  11405.         v9 = sub_424870(a3);
  11406.         if ( !v9 )
  11407.           v9 = 2 * sub_424810(a3);
  11408.         if ( *(_DWORD *)a3 > 0 && (**(_BYTE **)(a3 + 12) & 1) == 1 || v9 )
  11409.           result = sub_424250(a1, a2, a3, a4, v9);
  11410.         else
  11411.           result = sub_4248B0(a1, a2, a3, a4, 0);
  11412.       }
  11413.     }
  11414.   }
  11415.   return result;
  11416. }
  11417. // 420FA0: using guessed type _DWORD __cdecl sub_420FA0(_DWORD, _DWORD, _DWORD, _DWORD);
  11418.  
  11419. //----- (00421130) --------------------------------------------------------
  11420. signed int __cdecl sub_421130(int a1, signed int a2, int a3)
  11421. {
  11422.   signed int v3; // eax@1
  11423.   bool v4; // zf@1
  11424.   bool v5; // sf@1
  11425.   int v6; // edi@1
  11426.   int v7; // ebp@3
  11427.   unsigned int *v8; // esi@3
  11428.   signed int result; // eax@6
  11429.   signed int v10; // edi@10
  11430.   signed int v11; // ebx@11
  11431.   int *v12; // esi@12
  11432.   char v13; // [sp+Ch] [bp-10h]@10
  11433.  
  11434.   v3 = a2;
  11435.   v4 = a2 == 0;
  11436.   v5 = a2 < 0;
  11437.   v6 = a3;
  11438.   *(_DWORD *)a3 = 0;
  11439.   if ( v5 | v4 || v3 > 256 )
  11440.   {
  11441.     result = -3;
  11442.   }
  11443.   else
  11444.   {
  11445.     v7 = a1;
  11446.     v8 = (unsigned int *)&unk_4381E4;
  11447.     do
  11448.     {
  11449.       if ( !sub_41FA40(v7, *v8) )
  11450.       {
  11451.         *(_DWORD *)v6 = 1;
  11452.         return 0;
  11453.       }
  11454.       ++v8;
  11455.     }
  11456.     while ( (signed int)v8 < (signed int)&unk_4385E4 );
  11457.     result = sub_424FF0(v7, (int)&a1);
  11458.     if ( !result )
  11459.     {
  11460.       if ( a1 == 1 )
  11461.       {
  11462.         result = 0;
  11463.       }
  11464.       else
  11465.       {
  11466.         result = sub_41F810((int)&v13);
  11467.         v10 = result;
  11468.         if ( !result )
  11469.         {
  11470.           v11 = 0;
  11471.           if ( a2 <= 0 )
  11472.           {
  11473. LABEL_16:
  11474.             *(_DWORD *)a3 = 1;
  11475.           }
  11476.           else
  11477.           {
  11478.             v12 = (int *)&unk_4381E4;
  11479.             while ( 1 )
  11480.             {
  11481.               sub_424010((unsigned int)&v13, *v12);
  11482.               v10 = sub_424E40(v7, (int)&v13, (int)&a1);
  11483.               if ( v10 )
  11484.                 break;
  11485.               if ( !a1 )
  11486.                 break;
  11487.               ++v11;
  11488.               ++v12;
  11489.               if ( v11 >= a2 )
  11490.                 goto LABEL_16;
  11491.             }
  11492.           }
  11493.           sub_41F860((int)&v13);
  11494.           result = v10;
  11495.         }
  11496.       }
  11497.     }
  11498.   }
  11499.   return result;
  11500. }
  11501.  
  11502. //----- (00421250) --------------------------------------------------------
  11503. signed int __cdecl sub_421250(int a1, signed int a2)
  11504. {
  11505.   int v2; // edi@2
  11506.   void *v3; // eax@2
  11507.   int v5; // eax@4
  11508.  
  11509.   if ( *(_DWORD *)(a1 + 4) < a2 )
  11510.   {
  11511.     v2 = 64 - a2 % 32 + a2;
  11512.     v3 = realloc(*(void **)(a1 + 12), 4 * (64 - a2 % 32 + a2));
  11513.     if ( !v3 )
  11514.       return -2;
  11515.     *(_DWORD *)(a1 + 12) = v3;
  11516.     v5 = *(_DWORD *)(a1 + 4);
  11517.     for ( *(_DWORD *)(a1 + 4) = v2; v5 < *(_DWORD *)(a1 + 4); *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * v5 - 4) = 0 )
  11518.       ++v5;
  11519.   }
  11520.   return 0;
  11521. }
  11522.  
  11523. //----- (004212C0) --------------------------------------------------------
  11524. int __cdecl sub_4212C0(int a1)
  11525. {
  11526.   int v1; // edx@2
  11527.   int v2; // eax@4
  11528.   int result; // eax@5
  11529.  
  11530.   if ( *(_DWORD *)a1 > 0 )
  11531.   {
  11532.     v1 = *(_DWORD *)(a1 + 12);
  11533.     do
  11534.     {
  11535.       if ( *(_DWORD *)(v1 + 4 * *(_DWORD *)a1 - 4) )
  11536.         break;
  11537.       v2 = *(_DWORD *)a1 - 1;
  11538.       *(_DWORD *)a1 = v2;
  11539.     }
  11540.     while ( v2 > 0 );
  11541.   }
  11542.   result = *(_DWORD *)a1;
  11543.   if ( !*(_DWORD *)a1 )
  11544.     *(_DWORD *)(a1 + 8) = 0;
  11545.   return result;
  11546. }
  11547.  
  11548. //----- (004212F0) --------------------------------------------------------
  11549. signed int __cdecl sub_4212F0(int a1, signed int a2, int a3)
  11550. {
  11551.   int v3; // ebx@1
  11552.   signed int result; // eax@2
  11553.   signed int v5; // esi@3
  11554.   int v6; // edx@7
  11555.   unsigned int *v7; // edi@8
  11556.   signed int v8; // ebp@8
  11557.   int v9; // ecx@8
  11558.   int v10; // edx@8
  11559.   int v11; // ebp@8
  11560.   unsigned int v12; // eax@11
  11561.   int v13; // esi@11
  11562.   int v14; // eax@11
  11563.   int v15; // [sp+10h] [bp+4h]@8
  11564.   int v16; // [sp+14h] [bp+8h]@7
  11565.   int v17; // [sp+18h] [bp+Ch]@8
  11566.  
  11567.   v3 = a3;
  11568.   if ( a1 == a3 || (result = sub_41F8F0(a1, a3)) == 0 )
  11569.   {
  11570.     v5 = a2;
  11571.     if ( *(_DWORD *)(a3 + 4) >= a2 / 28 + *(_DWORD *)a3 + 1
  11572.       || (result = sub_421250(a3, a2 / 28 + *(_DWORD *)a3 + 1)) == 0 )
  11573.     {
  11574.       if ( a2 < 28 || (result = sub_423560(a3, a2 / 28)) == 0 )
  11575.       {
  11576.         v6 = a2 % 28;
  11577.         v16 = a2 % 28;
  11578.         if ( v5 % 28 )
  11579.         {
  11580.           v7 = *(unsigned int **)(a3 + 12);
  11581.           v8 = 1 << v6;
  11582.           v9 = 28 - v6;
  11583.           v10 = 0;
  11584.           v17 = v9;
  11585.           v15 = 0;
  11586.           v11 = v8 - 1;
  11587.           if ( *(_DWORD *)v3 > 0 )
  11588.           {
  11589.             while ( 1 )
  11590.             {
  11591.               v12 = *v7;
  11592.               ++v7;
  11593.               v13 = v11 & (v12 >> v9);
  11594.               v14 = v10 | (v12 << v16);
  11595.               v10 = v13;
  11596.               *(v7 - 1) = v14 & 0xFFFFFFF;
  11597.               ++v15;
  11598.               if ( v15 >= *(_DWORD *)v3 )
  11599.                 break;
  11600.               LOBYTE(v9) = v17;
  11601.             }
  11602.             if ( v13 )
  11603.               *(_DWORD *)(*(_DWORD *)(v3 + 12) + 4 * (*(_DWORD *)v3)++) = v13;
  11604.           }
  11605.         }
  11606.         sub_4212C0(v3);
  11607.         result = 0;
  11608.       }
  11609.     }
  11610.   }
  11611.   return result;
  11612. }
  11613.  
  11614. //----- (004213F0) --------------------------------------------------------
  11615. int __cdecl sub_4213F0(unsigned int a1)
  11616. {
  11617.   __int64 v1; // qax@1
  11618.   int v2; // esi@1
  11619.   int v3; // ecx@1
  11620.  
  11621.   v1 = a1;
  11622.   v2 = *(_DWORD *)(a1 + 4);
  11623.   v3 = *(_DWORD *)(a1 + 12);
  11624.   *(_DWORD *)(a1 + 8) = 0;
  11625.   *(_DWORD *)a1 = 0;
  11626.   if ( v2 > 0 )
  11627.   {
  11628.     do
  11629.     {
  11630.       *(_DWORD *)v3 = 0;
  11631.       v3 += 4;
  11632.       ++HIDWORD(v1);
  11633.     }
  11634.     while ( SHIDWORD(v1) < *(_DWORD *)(v1 + 4) );
  11635.   }
  11636.   return v1;
  11637. }
  11638.  
  11639. //----- (00421430) --------------------------------------------------------
  11640. signed int __cdecl sub_421430(int a1, int a2)
  11641. {
  11642.   int v2; // ecx@1
  11643.   signed int result; // eax@2
  11644.   int v4; // edi@5
  11645.   int v5; // eax@5
  11646.   int v6; // ebx@6
  11647.   unsigned int v7; // esi@7
  11648.  
  11649.   v2 = *(_DWORD *)a1;
  11650.   if ( *(_DWORD *)a1 > *(_DWORD *)a2 )
  11651.     return 1;
  11652.   if ( *(_DWORD *)a1 >= *(_DWORD *)a2 )
  11653.   {
  11654.     v4 = 0;
  11655.     v5 = *(_DWORD *)(a1 + 12) + 4 * v2 - 4;
  11656.     if ( v2 > 0 )
  11657.     {
  11658.       v6 = *(_DWORD *)(a2 + 12) + 4 * v2 - 4 - v5;
  11659.       do
  11660.       {
  11661.         v7 = *(_DWORD *)(v6 + v5);
  11662.         if ( *(_DWORD *)v5 > v7 )
  11663.           return 1;
  11664.         if ( *(_DWORD *)v5 < v7 )
  11665.           goto LABEL_4;
  11666.         ++v4;
  11667.         v5 -= 4;
  11668.       }
  11669.       while ( v4 < v2 );
  11670.     }
  11671.     result = 0;
  11672.   }
  11673.   else
  11674.   {
  11675. LABEL_4:
  11676.     result = -1;
  11677.   }
  11678.   return result;
  11679. }
  11680.  
  11681. //----- (00421490) --------------------------------------------------------
  11682. int __cdecl sub_421490(int a1, int a2)
  11683. {
  11684.   int v2; // ecx@1
  11685.   int result; // eax@1
  11686.   char v4; // dl@2
  11687.  
  11688.   v2 = 0;
  11689.   for ( result = a2 - 1; v2 < result; --result )
  11690.   {
  11691.     v4 = *(_BYTE *)(v2 + a1);
  11692.     *(_BYTE *)(v2 + a1) = *(_BYTE *)(result + a1);
  11693.     *(_BYTE *)(result + a1) = v4;
  11694.     ++v2;
  11695.   }
  11696.   return result;
  11697. }
  11698.  
  11699. //----- (004214C0) --------------------------------------------------------
  11700. signed int __cdecl sub_4214C0(int a1, int a2, unsigned int a3, int a4)
  11701. {
  11702.   signed int result; // eax@2
  11703.   int v5; // ebx@3
  11704.   int v6; // ecx@6
  11705.   int v7; // eax@13
  11706.   int v8; // ecx@13
  11707.   unsigned __int64 v9; // qdi@13
  11708.   int v10; // eax@13
  11709.   unsigned __int64 v11; // qax@16
  11710.   unsigned int v12; // ebx@18
  11711.   int v13; // [sp+Ch] [bp-18h]@5
  11712.   unsigned int v14; // [sp+10h] [bp-14h]@16
  11713.   int v15; // [sp+14h] [bp-10h]@12
  11714.   int v16; // [sp+1Ch] [bp-8h]@13
  11715.   int v17; // [sp+20h] [bp-4h]@20
  11716.  
  11717.   if ( !a2 )
  11718.     return -3;
  11719.   v5 = a1;
  11720.   if ( a2 == 1 || !*(_DWORD *)a1 )
  11721.   {
  11722.     if ( a4 )
  11723.       *(_DWORD *)a4 = 0;
  11724.     if ( a3 )
  11725.       return sub_41F8F0(a1, a3);
  11726.     goto LABEL_26;
  11727.   }
  11728.   if ( sub_421680(a2, (int)&v13) == 1 )
  11729.   {
  11730.     v6 = v13;
  11731.     if ( a4 )
  11732.       *(_DWORD *)a4 = **(_DWORD **)(a1 + 12) & ((1 << v13) - 1);
  11733.     if ( a3 )
  11734.       return sub_4216E0(a1, v6, a3, 0);
  11735.     goto LABEL_26;
  11736.   }
  11737.   if ( a2 == 3 )
  11738.     return sub_425040(a1, a3, a4);
  11739.   result = sub_4235D0((int)&v15, *(_DWORD *)a1);
  11740.   if ( !result )
  11741.   {
  11742.     v7 = *(_DWORD *)a1;
  11743.     v8 = *(_DWORD *)(a1 + 8);
  11744.     v15 = v7;
  11745.     v9 = 0i64;
  11746.     v10 = v7 - 1;
  11747.     v16 = v8;
  11748.     v13 = v10;
  11749.     if ( v10 >= 0 )
  11750.     {
  11751.       while ( 1 )
  11752.       {
  11753.         v14 = *(_DWORD *)(*(_DWORD *)(v5 + 12) + 4 * v10);
  11754.         v11 = v9 << 28;
  11755.         v9 = (v9 << 28) | v14;
  11756.         if ( HIDWORD(v11) <= 0 && (unsigned int)v9 < a2 )
  11757.         {
  11758.           v12 = 0;
  11759.         }
  11760.         else
  11761.         {
  11762.           v12 = v9 / (unsigned int)a2;
  11763.           v9 -= v12 * (unsigned __int64)(unsigned int)a2;
  11764.         }
  11765.         *(_DWORD *)(v17 + 4 * v13--) = v12;
  11766.         if ( v13 < 0 )
  11767.           break;
  11768.         v5 = a1;
  11769.         v10 = v13;
  11770.       }
  11771.     }
  11772.     if ( a4 )
  11773.       *(_DWORD *)a4 = v9;
  11774.     if ( a3 )
  11775.     {
  11776.       sub_4212C0((int)&v15);
  11777.       sub_4234B0((int)&v15, a3);
  11778.     }
  11779.     sub_41F860((int)&v15);
  11780. LABEL_26:
  11781.     result = 0;
  11782.   }
  11783.   return result;
  11784. }
  11785.  
  11786. //----- (00421680) --------------------------------------------------------
  11787. signed int __cdecl sub_421680(int a1, int a2)
  11788. {
  11789.   signed int v2; // ecx@1
  11790.  
  11791.   v2 = 1;
  11792.   while ( a1 != 1 << v2 )
  11793.   {
  11794.     ++v2;
  11795.     if ( v2 >= 28 )
  11796.       return 0;
  11797.   }
  11798.   *(_DWORD *)a2 = v2;
  11799.   return 1;
  11800. }
  11801.  
  11802. //----- (004216B0) --------------------------------------------------------
  11803. signed int __cdecl sub_4216B0(int a1, int a2)
  11804. {
  11805.   signed int result; // eax@1
  11806.  
  11807.   result = sub_41F810(a1);
  11808.   if ( !result )
  11809.     result = sub_41F8F0(a2, a1);
  11810.   return result;
  11811. }
  11812.  
  11813. //----- (004216E0) --------------------------------------------------------
  11814. signed int __cdecl sub_4216E0(int a1, int a2, unsigned int a3, unsigned int a4)
  11815. {
  11816.   int v4; // edi@1
  11817.   signed int v5; // esi@2
  11818.   signed int result; // eax@4
  11819.   signed int v7; // esi@7
  11820.   int v8; // esi@9
  11821.   signed int v9; // ebx@9
  11822.   int v10; // ecx@13
  11823.   char v11; // dl@14
  11824.   int v12; // edi@14
  11825.   int v13; // ebp@14
  11826.   int v14; // ebx@14
  11827.   unsigned int v15; // eax@17
  11828.   unsigned int v16; // esi@17
  11829.   int v17; // eax@17
  11830.   char v18; // [sp+Ch] [bp-10h]@5
  11831.   int v19; // [sp+20h] [bp+4h]@15
  11832.   int v20; // [sp+24h] [bp+8h]@13
  11833.  
  11834.   v4 = a2;
  11835.   if ( a2 > 0 )
  11836.   {
  11837.     result = sub_41F810((int)&v18);
  11838.     if ( !result )
  11839.     {
  11840.       if ( a4 && (v7 = sub_425160(a1, a2, (unsigned int)&v18)) != 0 )
  11841.       {
  11842.         sub_41F860((int)&v18);
  11843.         result = v7;
  11844.       }
  11845.       else
  11846.       {
  11847.         v8 = a3;
  11848.         v9 = sub_41F8F0(a1, a3);
  11849.         if ( v9 )
  11850.         {
  11851.           sub_41F860((int)&v18);
  11852.           result = v9;
  11853.         }
  11854.         else
  11855.         {
  11856.           if ( a2 >= 28 )
  11857.             sub_423500(a3, a2 / 28);
  11858.           v10 = a2 % 28;
  11859.           v20 = a2 % 28;
  11860.           if ( v4 % 28 )
  11861.           {
  11862.             v11 = 28 - v10;
  11863.             v12 = *(_DWORD *)(a3 + 12) + 4 * *(_DWORD *)a3 - 4;
  11864.             v13 = 0;
  11865.             v14 = (1 << v10) - 1;
  11866.             if ( *(_DWORD *)a3 - 1 >= 0 )
  11867.             {
  11868.               v19 = *(_DWORD *)a3;
  11869.               while ( 1 )
  11870.               {
  11871.                 v15 = *(_DWORD *)v12;
  11872.                 v12 -= 4;
  11873.                 v16 = v15;
  11874.                 v17 = (v13 << v11) | (v15 >> v10);
  11875.                 v13 = v14 & v16;
  11876.                 *(_DWORD *)(v12 + 4) = v17;
  11877.                 --v19;
  11878.                 if ( !v19 )
  11879.                   break;
  11880.                 LOBYTE(v10) = v20;
  11881.               }
  11882.               v8 = a3;
  11883.             }
  11884.           }
  11885.           sub_4212C0(v8);
  11886.           if ( a4 )
  11887.             sub_4234B0((int)&v18, a4);
  11888.           sub_41F860((int)&v18);
  11889.           result = 0;
  11890.         }
  11891.       }
  11892.     }
  11893.   }
  11894.   else
  11895.   {
  11896.     v5 = sub_41F8F0(a1, a3);
  11897.     if ( a4 )
  11898.       sub_4213F0(a4);
  11899.     result = v5;
  11900.   }
  11901.   return result;
  11902. }
  11903.  
  11904. //----- (00421850) --------------------------------------------------------
  11905. signed int __cdecl sub_421850(signed int *a1, signed int *a2, int a3)
  11906. {
  11907.   signed int *v3; // ebx@1
  11908.   int v4; // ebp@1
  11909.   signed int v5; // esi@1
  11910.   signed int *v6; // edi@1
  11911.   signed int result; // eax@2
  11912.   signed int v8; // edx@3
  11913.   signed int v9; // ebx@3
  11914.   void *v10; // edi@3
  11915.   unsigned int v11; // esi@3
  11916.   signed int v12; // ecx@3
  11917.   signed int v13; // ecx@4
  11918.   int v14; // eax@5
  11919.   int v15; // eax@5
  11920.   unsigned int v16; // eax@5
  11921.   int v17; // ebx@8
  11922.   int v18; // ecx@9
  11923.   unsigned int v19; // ecx@9
  11924.   signed int v20; // [sp+14h] [bp+4h]@1
  11925.   signed int v21; // [sp+18h] [bp+8h]@1
  11926.   int v22; // [sp+1Ch] [bp+Ch]@3
  11927.  
  11928.   v3 = a1;
  11929.   v4 = a3;
  11930.   v5 = *a1;
  11931.   v6 = a2;
  11932.   v20 = v5;
  11933.   v21 = *a2;
  11934.   if ( *(_DWORD *)(a3 + 4) >= v5 || (result = sub_421250(a3, v5)) == 0 )
  11935.   {
  11936.     v22 = *(_DWORD *)a3;
  11937.     *(_DWORD *)v4 = v5;
  11938.     v8 = v3[3];
  11939.     v9 = v6[3];
  11940.     v10 = *(void **)(v4 + 12);
  11941.     v11 = 0;
  11942.     v12 = 0;
  11943.     if ( v21 > 0 )
  11944.     {
  11945.       v13 = v21;
  11946.       do
  11947.       {
  11948.         v14 = *(_DWORD *)v8;
  11949.         v8 += 4;
  11950.         v15 = v14 - *(_DWORD *)v9;
  11951.         v9 += 4;
  11952.         v10 = (char *)v10 + 4;
  11953.         v16 = v15 - v11;
  11954.         *((_DWORD *)v10 - 1) = v16;
  11955.         *((_DWORD *)v10 - 1) = v16 & 0xFFFFFFF;
  11956.         v11 = v16 >> 31;
  11957.         --v13;
  11958.       }
  11959.       while ( v13 );
  11960.       v12 = v21;
  11961.     }
  11962.     if ( v12 < v20 )
  11963.     {
  11964.       v17 = v20 - v12;
  11965.       do
  11966.       {
  11967.         v18 = *(_DWORD *)v8;
  11968.         v8 += 4;
  11969.         v19 = v18 - v11;
  11970.         *(_DWORD *)v10 = v19;
  11971.         *(_DWORD *)v10 = v19 & 0xFFFFFFF;
  11972.         v10 = (char *)v10 + 4;
  11973.         --v17;
  11974.         v11 = v19 >> 31;
  11975.       }
  11976.       while ( v17 );
  11977.     }
  11978.     if ( *(_DWORD *)v4 < v22 )
  11979.       memset(v10, 0, 4 * (v22 - *(_DWORD *)v4));
  11980.     sub_4212C0(v4);
  11981.     result = 0;
  11982.   }
  11983.   return result;
  11984. }
  11985.  
  11986. //----- (00421920) --------------------------------------------------------
  11987. signed int __cdecl sub_421920(int a1, int a2, int a3)
  11988. {
  11989.   int v3; // ebx@1
  11990.   int v4; // eax@1
  11991.   int v5; // edi@1
  11992.   int v6; // ebp@4
  11993.   signed int result; // eax@5
  11994.   int v8; // ecx@6
  11995.   int v9; // esi@6
  11996.   int v10; // ebx@6
  11997.   int v11; // edi@6
  11998.   int v12; // ecx@6
  11999.   unsigned int v13; // eax@6
  12000.   int v14; // edx@6
  12001.   int v15; // ecx@8
  12002.   int v16; // ecx@8
  12003.   unsigned int v17; // ecx@8
  12004.   unsigned int v18; // eax@12
  12005.   void *v19; // edi@13
  12006.   int v20; // [sp+10h] [bp-8h]@2
  12007.   int v21; // [sp+14h] [bp-4h]@6
  12008.   int v22; // [sp+1Ch] [bp+4h]@2
  12009.   int v23; // [sp+20h] [bp+8h]@2
  12010.   int v24; // [sp+24h] [bp+Ch]@7
  12011.  
  12012.   v3 = a1;
  12013.   v4 = *(_DWORD *)a1;
  12014.   v5 = a2;
  12015.   if ( *(_DWORD *)a1 <= *(_DWORD *)a2 )
  12016.   {
  12017.     v22 = *(_DWORD *)a1;
  12018.     v23 = *(_DWORD *)a2;
  12019.     v20 = v5;
  12020.   }
  12021.   else
  12022.   {
  12023.     v22 = *(_DWORD *)a2;
  12024.     v23 = v4;
  12025.     v20 = v3;
  12026.   }
  12027.   v6 = a3;
  12028.   if ( *(_DWORD *)(a3 + 4) >= v23 + 1 || (result = sub_421250(a3, v23 + 1)) == 0 )
  12029.   {
  12030.     v8 = *(_DWORD *)a3;
  12031.     *(_DWORD *)a3 = v23 + 1;
  12032.     v9 = *(_DWORD *)(v5 + 12);
  12033.     v10 = *(_DWORD *)(v3 + 12);
  12034.     v11 = *(_DWORD *)(a3 + 12);
  12035.     v21 = v8;
  12036.     v12 = v22;
  12037.     v13 = 0;
  12038.     v14 = 0;
  12039.     if ( v22 > 0 )
  12040.     {
  12041.       v24 = v22;
  12042.       v14 = v22;
  12043.       do
  12044.       {
  12045.         v15 = *(_DWORD *)v9;
  12046.         v9 += 4;
  12047.         v16 = *(_DWORD *)v10 + v15;
  12048.         v10 += 4;
  12049.         v11 += 4;
  12050.         v17 = v13 + v16;
  12051.         *(_DWORD *)(v11 - 4) = v17;
  12052.         *(_DWORD *)(v11 - 4) = v17 & 0xFFFFFFF;
  12053.         v13 = v17 >> 28;
  12054.         --v24;
  12055.       }
  12056.       while ( v24 );
  12057.       v12 = v22;
  12058.     }
  12059.     if ( v12 != v23 && v14 < v23 )
  12060.     {
  12061.       do
  12062.       {
  12063.         v11 += 4;
  12064.         v18 = *(_DWORD *)(*(_DWORD *)(v20 + 12) + 4 * v14) + v13;
  12065.         *(_DWORD *)(v11 - 4) = v18;
  12066.         *(_DWORD *)(v11 - 4) &= 0xFFFFFFFu;
  12067.         v13 = v18 >> 28;
  12068.         ++v14;
  12069.       }
  12070.       while ( v14 < v23 );
  12071.     }
  12072.     *(_DWORD *)v11 = v13;
  12073.     v19 = (void *)(v11 + 4);
  12074.     if ( *(_DWORD *)v6 < v21 )
  12075.       memset(v19, 0, 4 * (v21 - *(_DWORD *)v6));
  12076.     sub_4212C0(v6);
  12077.     result = 0;
  12078.   }
  12079.   return result;
  12080. }
  12081.  
  12082. //----- (00421A30) --------------------------------------------------------
  12083. signed int __cdecl sub_421A30(int a1, int a2, int a3, signed int a4)
  12084. {
  12085.   int v4; // ebp@1
  12086.   int v5; // esi@1
  12087.   unsigned int v6; // eax@2
  12088.   signed int result; // eax@5
  12089.   unsigned int v8; // eax@7
  12090.   signed int v9; // ecx@7
  12091.   bool v10; // zf@7
  12092.   bool v11; // sf@7
  12093.   signed int v12; // edx@8
  12094.   signed int v13; // eax@10
  12095.   int v14; // ebx@10
  12096.   int v15; // edi@12
  12097.   int v16; // esi@12
  12098.   signed int v17; // edx@12
  12099.   int v18; // ecx@14
  12100.   signed int v19; // [sp+Ch] [bp-28h]@8
  12101.   signed int v20; // [sp+10h] [bp-24h]@13
  12102.   signed int v21; // [sp+14h] [bp-20h]@7
  12103.   int v22; // [sp+18h] [bp-1Ch]@12
  12104.   signed int v23; // [sp+1Ch] [bp-18h]@13
  12105.   unsigned int v24; // [sp+20h] [bp-14h]@7
  12106.   int v25; // [sp+24h] [bp-10h]@6
  12107.   int v26; // [sp+30h] [bp-4h]@12
  12108.  
  12109.   v4 = a2;
  12110.   v5 = a1;
  12111.   if ( (unsigned int)a4 >= 0x200 )
  12112.     goto LABEL_22;
  12113.   v6 = *(_DWORD *)a1;
  12114.   if ( *(_DWORD *)a1 >= *(_DWORD *)a2 )
  12115.     v6 = *(_DWORD *)a2;
  12116.   if ( v6 >= 0x100 )
  12117.   {
  12118. LABEL_22:
  12119.     result = sub_4235D0((int)&v25, a4);
  12120.     if ( !result )
  12121.     {
  12122.       v8 = *(_DWORD *)a1;
  12123.       v9 = 0;
  12124.       v10 = *(_DWORD *)a1 == 0;
  12125.       v11 = *(_DWORD *)a1 < 0;
  12126.       v25 = a4;
  12127.       v24 = v8;
  12128.       v21 = 0;
  12129.       if ( !(v11 | v10) )
  12130.       {
  12131.         v12 = a4;
  12132.         v19 = a4;
  12133.         while ( 1 )
  12134.         {
  12135.           v13 = *(_DWORD *)v4;
  12136.           v14 = 0;
  12137.           if ( *(_DWORD *)v4 >= v12 )
  12138.             v13 = v12;
  12139.           v15 = *(_DWORD *)(v4 + 12);
  12140.           v22 = *(_DWORD *)(*(_DWORD *)(v5 + 12) + 4 * v9);
  12141.           v16 = v26 + 4 * v9;
  12142.           v17 = 0;
  12143.           if ( v13 > 0 )
  12144.           {
  12145.             v20 = v13;
  12146.             v23 = v13;
  12147.             do
  12148.             {
  12149.               v18 = *(_DWORD *)v15;
  12150.               v15 += 4;
  12151.               *(_DWORD *)v16 = (v14 + *(_DWORD *)v16 + v18 * v22) & 0xFFFFFFF;
  12152.               v16 += 4;
  12153.               v14 = unknown_libname_1(28);
  12154.               --v20;
  12155.             }
  12156.             while ( v20 );
  12157.             v4 = a2;
  12158.             v9 = v21;
  12159.             v17 = v23;
  12160.           }
  12161.           if ( v9 + v17 < a4 )
  12162.             *(_DWORD *)v16 = v14;
  12163.           ++v9;
  12164.           v21 = v9;
  12165.           --v19;
  12166.           if ( v9 >= (signed int)v24 )
  12167.             break;
  12168.           v12 = v19;
  12169.           v5 = a1;
  12170.         }
  12171.       }
  12172.       sub_4212C0((int)&v25);
  12173.       sub_4234B0((int)&v25, a3);
  12174.       sub_41F860((int)&v25);
  12175.       result = 0;
  12176.     }
  12177.   }
  12178.   else
  12179.   {
  12180.     result = sub_421B90(a1, a2, a3, a4);
  12181.   }
  12182.   return result;
  12183. }
  12184. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  12185.  
  12186. //----- (00421B90) --------------------------------------------------------
  12187. signed int __cdecl sub_421B90(int a1, int a2, int a3, signed int a4)
  12188. {
  12189.   int v4; // esi@1
  12190.   signed int result; // eax@2
  12191.   int v6; // edx@3
  12192.   int v7; // ecx@3
  12193.   signed int v8; // eax@3
  12194.   int v9; // ebp@6
  12195.   int v10; // ebx@6
  12196.   int v11; // ecx@7
  12197.   int v12; // edx@11
  12198.   int v13; // edi@11
  12199.   int v14; // eax@11
  12200.   int v15; // esi@11
  12201.   int v16; // ecx@14
  12202.   unsigned int v17; // eax@15
  12203.   unsigned int v18; // edx@16
  12204.   int v19; // ebx@18
  12205.   void *v20; // edx@18
  12206.   int v21; // edi@18
  12207.   int v22; // eax@18
  12208.   void *v23; // edi@19
  12209.   signed int v24; // [sp+8h] [bp-820h]@4
  12210.   char *v25; // [sp+Ch] [bp-81Ch]@7
  12211.   unsigned int v26; // [sp+14h] [bp-814h]@6
  12212.   int v27; // [sp+18h] [bp-810h]@7
  12213.   int v28; // [sp+1Ch] [bp-80Ch]@7
  12214.   int v29; // [sp+20h] [bp-808h]@3
  12215.   int v30; // [sp+24h] [bp-804h]@7
  12216.   char v31; // [sp+28h] [bp-800h]@7
  12217.  
  12218.   v4 = a3;
  12219.   if ( *(_DWORD *)(a3 + 4) >= a4 || (result = sub_421250(a3, a4)) == 0 )
  12220.   {
  12221.     v6 = *(_DWORD *)a1;
  12222.     v7 = *(_DWORD *)a2;
  12223.     v29 = *(_DWORD *)a1;
  12224.     v8 = *(_DWORD *)a2 + *(_DWORD *)a1;
  12225.     if ( a4 >= *(_DWORD *)a2 + *(_DWORD *)a1 )
  12226.     {
  12227.       v24 = v7 + v6;
  12228.     }
  12229.     else
  12230.     {
  12231.       v8 = a4;
  12232.       v24 = a4;
  12233.     }
  12234.     v9 = 0;
  12235.     v10 = 0;
  12236.     v26 = 0;
  12237.     if ( v8 > 0 )
  12238.     {
  12239.       v11 = v7 - 1;
  12240.       v27 = v11;
  12241.       v30 = *(_DWORD *)(a1 + 12);
  12242.       v28 = *(_DWORD *)(a2 + 12);
  12243.       v25 = &v31;
  12244.       while ( 1 )
  12245.       {
  12246.         if ( v11 >= v9 )
  12247.           v11 = v9;
  12248.         v12 = v6 - (v9 - v11);
  12249.         v13 = v30 + 4 * (v9 - v11);
  12250.         v14 = v11 + 1;
  12251.         v15 = v28 + 4 * v11;
  12252.         if ( v12 < v11 + 1 )
  12253.           v14 = v12;
  12254.         if ( v14 > 0 )
  12255.         {
  12256.           v16 = v14;
  12257.           do
  12258.           {
  12259.             v17 = (*(_DWORD *)v13 * (unsigned __int64)*(_DWORD *)v15 + __PAIR__(v26, v10)) >> 32;
  12260.             v10 += *(_DWORD *)v13 * *(_DWORD *)v15;
  12261.             v15 -= 4;
  12262.             v13 += 4;
  12263.             --v16;
  12264.             v26 = v17;
  12265.           }
  12266.           while ( v16 );
  12267.         }
  12268.         *(_DWORD *)v25 = v10 & 0xFFFFFFF;
  12269.         v10 = unknown_libname_1(28);
  12270.         v8 = v24;
  12271.         ++v9;
  12272.         v26 = v18;
  12273.         v25 += 4;
  12274.         if ( v9 >= v24 )
  12275.           break;
  12276.         v6 = v29;
  12277.         v11 = v27;
  12278.       }
  12279.       v4 = a3;
  12280.     }
  12281.     v19 = *(_DWORD *)v4;
  12282.     v20 = *(void **)(v4 + 12);
  12283.     *(_DWORD *)v4 = v8;
  12284.     v21 = 0;
  12285.     v22 = v8 + 1;
  12286.     if ( v22 > 0 )
  12287.     {
  12288.       v23 = v20;
  12289.       v20 = (char *)v20 + 4 * v22;
  12290.       memcpy(v23, &v31, 4 * v22);
  12291.       v4 = a3;
  12292.       v21 = v22;
  12293.     }
  12294.     if ( v21 < v19 )
  12295.       memset(v20, 0, 4 * (v19 - v21));
  12296.     sub_4212C0(v4);
  12297.     result = 0;
  12298.   }
  12299.   return result;
  12300. }
  12301. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  12302.  
  12303. //----- (00421CF0) --------------------------------------------------------
  12304. signed int __cdecl sub_421CF0(int a1, int a2, int a3)
  12305. {
  12306.   int v3; // ebp@1
  12307.   signed int v4; // esi@1
  12308.   signed int v5; // edi@1
  12309.   int v6; // esi@3
  12310.   int v7; // edx@10
  12311.   int v8; // edi@10
  12312.   int v9; // ecx@10
  12313.   int v10; // eax@10
  12314.   int v11; // ecx@10
  12315.   int v12; // ebp@12
  12316.   int v13; // edx@14
  12317.   int v14; // edi@15
  12318.   int v15; // eax@16
  12319.   int j; // edx@16
  12320.   int v17; // edi@17
  12321.   int v19; // [sp+10h] [bp-7Ch]@11
  12322.   int i; // [sp+10h] [bp-7Ch]@14
  12323.   signed int v21; // [sp+14h] [bp-78h]@1
  12324.   char v22; // [sp+1Ch] [bp-70h]@7
  12325.   int v23; // [sp+2Ch] [bp-60h]@3
  12326.   int v24; // [sp+38h] [bp-54h]@10
  12327.   int v25; // [sp+3Ch] [bp-50h]@5
  12328.   int v26; // [sp+48h] [bp-44h]@10
  12329.   char v27; // [sp+4Ch] [bp-40h]@9
  12330.   int v28; // [sp+5Ch] [bp-30h]@6
  12331.   int v29; // [sp+68h] [bp-24h]@16
  12332.   int v30; // [sp+6Ch] [bp-20h]@4
  12333.   int v31; // [sp+78h] [bp-14h]@14
  12334.   char v32; // [sp+7Ch] [bp-10h]@8
  12335.  
  12336.   v3 = a2;
  12337.   v4 = *(_DWORD *)a2;
  12338.   v5 = -2;
  12339.   v21 = -2;
  12340.   if ( *(_DWORD *)a1 < *(_DWORD *)a2 )
  12341.     v4 = *(_DWORD *)a1;
  12342.   v6 = v4 >> 1;
  12343.   if ( !sub_4235D0((int)&v23, v6) )
  12344.   {
  12345.     if ( !sub_4235D0((int)&v30, *(_DWORD *)a1 - v6) )
  12346.     {
  12347.       if ( !sub_4235D0((int)&v25, v6) )
  12348.       {
  12349.         if ( !sub_4235D0((int)&v28, *(_DWORD *)a2 - v6) )
  12350.         {
  12351.           if ( !sub_4235D0((int)&v22, 2 * v6) )
  12352.           {
  12353.             if ( !sub_4235D0((int)&v32, 2 * v6) )
  12354.             {
  12355.               if ( !sub_4235D0((int)&v27, 2 * v6) )
  12356.               {
  12357.                 v7 = v24;
  12358.                 v8 = v26;
  12359.                 v9 = *(_DWORD *)a2 - v6;
  12360.                 v30 = *(_DWORD *)a1 - v6;
  12361.                 v10 = *(_DWORD *)(a1 + 12);
  12362.                 v28 = v9;
  12363.                 v11 = *(_DWORD *)(a2 + 12);
  12364.                 v25 = v6;
  12365.                 v23 = v6;
  12366.                 if ( v6 > 0 )
  12367.                 {
  12368.                   v19 = v6;
  12369.                   do
  12370.                   {
  12371.                     v12 = *(_DWORD *)v10;
  12372.                     v10 += 4;
  12373.                     *(_DWORD *)v7 = v12;
  12374.                     *(_DWORD *)v8 = *(_DWORD *)v11;
  12375.                     v7 += 4;
  12376.                     v8 += 4;
  12377.                     v11 += 4;
  12378.                     --v19;
  12379.                   }
  12380.                   while ( v19 );
  12381.                   v3 = a2;
  12382.                 }
  12383.                 v13 = v31;
  12384.                 for ( i = v6; i < *(_DWORD *)a1; ++i )
  12385.                 {
  12386.                   v14 = *(_DWORD *)v10;
  12387.                   v10 += 4;
  12388.                   *(_DWORD *)v13 = v14;
  12389.                   v13 += 4;
  12390.                 }
  12391.                 v15 = v29;
  12392.                 for ( j = v6; j < *(_DWORD *)v3; ++j )
  12393.                 {
  12394.                   v17 = *(_DWORD *)v11;
  12395.                   v11 += 4;
  12396.                   *(_DWORD *)v15 = v17;
  12397.                   v15 += 4;
  12398.                 }
  12399.                 sub_4212C0((int)&v23);
  12400.                 sub_4212C0((int)&v25);
  12401.                 if ( !sub_420150(&v23, &v25, &v32)
  12402.                   && !sub_420150(&v30, &v28, &v27)
  12403.                   && !sub_421920((int)&v30, (int)&v23, (int)&v22)
  12404.                   && !sub_421920((int)&v28, (int)&v25, (int)&v23)
  12405.                   && !sub_420150(&v22, &v23, &v22)
  12406.                   && !sub_41FE40((int)&v32, (int)&v27, (int)&v23)
  12407.                   && !sub_421850((signed int *)&v22, &v23, (int)&v22)
  12408.                   && !sub_423560((int)&v22, v6)
  12409.                   && !sub_423560((int)&v27, 2 * v6)
  12410.                   && !sub_41FE40((int)&v32, (int)&v22, (int)&v22)
  12411.                   && !sub_41FE40((int)&v22, (int)&v27, a3) )
  12412.                   v21 = 0;
  12413.                 sub_41F860((int)&v27);
  12414.               }
  12415.               sub_41F860((int)&v32);
  12416.             }
  12417.             sub_41F860((int)&v22);
  12418.           }
  12419.           sub_41F860((int)&v28);
  12420.           v5 = v21;
  12421.         }
  12422.         sub_41F860((int)&v25);
  12423.       }
  12424.       sub_41F860((int)&v30);
  12425.     }
  12426.     sub_41F860((int)&v23);
  12427.   }
  12428.   return v5;
  12429. }
  12430. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  12431.  
  12432. //----- (00422020) --------------------------------------------------------
  12433. signed int __cdecl sub_422020(int a1, int a2, int a3)
  12434. {
  12435.   signed int result; // eax@1
  12436.   signed int v4; // ecx@2
  12437.   int v5; // edi@4
  12438.   signed int v6; // esi@4
  12439.   int v7; // ebx@7
  12440.   char v8; // [sp+0h] [bp-D4h]@12
  12441.   char v9; // [sp+10h] [bp-C4h]@16
  12442.   char v10; // [sp+20h] [bp-B4h]@34
  12443.   char v11; // [sp+30h] [bp-A4h]@29
  12444.   char v12; // [sp+40h] [bp-94h]@20
  12445.   int v13; // [sp+50h] [bp-84h]@4
  12446.   char v14; // [sp+54h] [bp-80h]@8
  12447.   char v15; // [sp+64h] [bp-70h]@5
  12448.   char v16; // [sp+74h] [bp-60h]@11
  12449.   char v17; // [sp+84h] [bp-50h]@6
  12450.   char v18; // [sp+94h] [bp-40h]@9
  12451.   char v19; // [sp+A4h] [bp-30h]@7
  12452.   char v20; // [sp+B4h] [bp-20h]@4
  12453.   char v21; // [sp+C4h] [bp-10h]@1
  12454.  
  12455.   result = sub_4236A0((int)&v21);
  12456.   if ( !result )
  12457.   {
  12458.     v4 = *(_DWORD *)a2;
  12459.     if ( *(_DWORD *)a1 < *(_DWORD *)a2 )
  12460.       v4 = *(_DWORD *)a1;
  12461.     v13 = v4 / 3;
  12462.     v5 = 28 * v4 / 3;
  12463.     v6 = sub_425160(a1, 28 * v4 / 3, (unsigned int)&v20);
  12464.     if ( !v6 )
  12465.     {
  12466.       v6 = sub_41F8F0(a1, (int)&v15);
  12467.       if ( !v6 )
  12468.       {
  12469.         sub_423500((unsigned int)&v15, v13);
  12470.         sub_425160((int)&v15, v5, (unsigned int)&v15);
  12471.         v6 = sub_41F8F0(a1, (int)&v17);
  12472.         if ( !v6 )
  12473.         {
  12474.           v7 = v13;
  12475.           sub_423500((unsigned int)&v17, 2 * v13);
  12476.           v6 = sub_425160(a2, v5, (unsigned int)&v19);
  12477.           if ( !v6 )
  12478.           {
  12479.             v6 = sub_41F8F0(a2, (int)&v14);
  12480.             if ( !v6 )
  12481.             {
  12482.               sub_423500((unsigned int)&v14, v7);
  12483.               sub_425160((int)&v14, v5, (unsigned int)&v14);
  12484.               v6 = sub_41F8F0(a2, (int)&v18);
  12485.               if ( !v6 )
  12486.               {
  12487.                 sub_423500((unsigned int)&v18, 2 * v7);
  12488.                 v6 = sub_420150(&v20, &v19, &v21);
  12489.                 if ( !v6 )
  12490.                 {
  12491.                   v6 = sub_420150(&v17, &v18, &v16);
  12492.                   if ( !v6 )
  12493.                   {
  12494.                     v6 = sub_423F60((int)&v20, (int)&v8);
  12495.                     if ( !v6 )
  12496.                     {
  12497.                       v6 = sub_41FE40((int)&v8, (int)&v15, (int)&v8);
  12498.                       if ( !v6 )
  12499.                       {
  12500.                         v6 = sub_423F60((int)&v8, (int)&v8);
  12501.                         if ( !v6 )
  12502.                         {
  12503.                           v6 = sub_41FE40((int)&v8, (int)&v17, (int)&v8);
  12504.                           if ( !v6 )
  12505.                           {
  12506.                             v6 = sub_423F60((int)&v19, (int)&v9);
  12507.                             if ( !v6 )
  12508.                             {
  12509.                               v6 = sub_41FE40((int)&v9, (int)&v14, (int)&v9);
  12510.                               if ( !v6 )
  12511.                               {
  12512.                                 v6 = sub_423F60((int)&v9, (int)&v9);
  12513.                                 if ( !v6 )
  12514.                                 {
  12515.                                   v6 = sub_41FE40((int)&v9, (int)&v18, (int)&v9);
  12516.                                   if ( !v6 )
  12517.                                   {
  12518.                                     v6 = sub_420150(&v8, &v9, &v12);
  12519.                                     if ( !v6 )
  12520.                                     {
  12521.                                       v6 = sub_423F60((int)&v17, (int)&v8);
  12522.                                       if ( !v6 )
  12523.                                       {
  12524.                                         v6 = sub_41FE40((int)&v8, (int)&v15, (int)&v8);
  12525.                                         if ( !v6 )
  12526.                                         {
  12527.                                           v6 = sub_423F60((int)&v8, (int)&v8);
  12528.                                           if ( !v6 )
  12529.                                           {
  12530.                                             v6 = sub_41FE40((int)&v8, (int)&v20, (int)&v8);
  12531.                                             if ( !v6 )
  12532.                                             {
  12533.                                               v6 = sub_423F60((int)&v18, (int)&v9);
  12534.                                               if ( !v6 )
  12535.                                               {
  12536.                                                 v6 = sub_41FE40((int)&v9, (int)&v14, (int)&v9);
  12537.                                                 if ( !v6 )
  12538.                                                 {
  12539.                                                   v6 = sub_423F60((int)&v9, (int)&v9);
  12540.                                                   if ( !v6 )
  12541.                                                   {
  12542.                                                     v6 = sub_41FE40((int)&v9, (int)&v19, (int)&v9);
  12543.                                                     if ( !v6 )
  12544.                                                     {
  12545.                                                       v6 = sub_420150(&v8, &v9, &v11);
  12546.                                                       if ( !v6 )
  12547.                                                       {
  12548.                                                         v6 = sub_41FE40((int)&v17, (int)&v15, (int)&v8);
  12549.                                                         if ( !v6 )
  12550.                                                         {
  12551.                                                           v6 = sub_41FE40((int)&v8, (int)&v20, (int)&v8);
  12552.                                                           if ( !v6 )
  12553.                                                           {
  12554.                                                             v6 = sub_41FE40((int)&v18, (int)&v14, (int)&v9);
  12555.                                                             if ( !v6 )
  12556.                                                             {
  12557.                                                               v6 = sub_41FE40((int)&v9, (int)&v19, (int)&v9);
  12558.                                                               if ( !v6 )
  12559.                                                               {
  12560.                                                                 v6 = sub_420150(&v8, &v9, &v10);
  12561.                                                                 if ( !v6 )
  12562.                                                                 {
  12563.                                                                   v6 = sub_41FFD0((int)&v12, (int)&v16, (int)&v12);
  12564.                                                                   if ( !v6 )
  12565.                                                                   {
  12566.                                                                     v6 = sub_41FFD0((int)&v11, (int)&v21, (int)&v11);
  12567.                                                                     if ( !v6 )
  12568.                                                                     {
  12569.                                                                       v6 = sub_420890((int)&v12, (int)&v12);
  12570.                                                                       if ( !v6 )
  12571.                                                                       {
  12572.                                                                         v6 = sub_420890((int)&v11, (int)&v11);
  12573.                                                                         if ( !v6 )
  12574.                                                                         {
  12575.                                                                           v6 = sub_41FFD0(
  12576.                                                                                  (int)&v10,
  12577.                                                                                  (int)&v21,
  12578.                                                                                  (int)&v10);
  12579.                                                                           if ( !v6 )
  12580.                                                                           {
  12581.                                                                             v6 = sub_41FFD0(
  12582.                                                                                    (int)&v10,
  12583.                                                                                    (int)&v16,
  12584.                                                                                    (int)&v10);
  12585.                                                                             if ( !v6 )
  12586.                                                                             {
  12587.                                                                               v6 = sub_41FFD0(
  12588.                                                                                      (int)&v12,
  12589.                                                                                      (int)&v10,
  12590.                                                                                      (int)&v12);
  12591.                                                                               if ( !v6 )
  12592.                                                                               {
  12593.                                                                                 v6 = sub_41FFD0(
  12594.                                                                                        (int)&v11,
  12595.                                                                                        (int)&v10,
  12596.                                                                                        (int)&v11);
  12597.                                                                                 if ( !v6 )
  12598.                                                                                 {
  12599.                                                                                   v6 = sub_4212F0(
  12600.                                                                                          (int)&v21,
  12601.                                                                                          3,
  12602.                                                                                          (int)&v8);
  12603.                                                                                   if ( !v6 )
  12604.                                                                                   {
  12605.                                                                                     v6 = sub_41FFD0(
  12606.                                                                                            (int)&v12,
  12607.                                                                                            (int)&v8,
  12608.                                                                                            (int)&v12);
  12609.                                                                                     if ( !v6 )
  12610.                                                                                     {
  12611.                                                                                       v6 = sub_4212F0(
  12612.                                                                                              (int)&v16,
  12613.                                                                                              3,
  12614.                                                                                              (int)&v8);
  12615.                                                                                       if ( !v6 )
  12616.                                                                                       {
  12617.                                                                                         v6 = sub_41FFD0(
  12618.                                                                                                (int)&v11,
  12619.                                                                                                (int)&v8,
  12620.                                                                                                (int)&v11);
  12621.                                                                                         if ( !v6 )
  12622.                                                                                         {
  12623.                                                                                           v6 = sub_420220(
  12624.                                                                                                  (int)&v10,
  12625.                                                                                                  3,
  12626.                                                                                                  (int)&v10);
  12627.                                                                                           if ( !v6 )
  12628.                                                                                           {
  12629.                                                                                             v6 = sub_41FFD0(
  12630.                                                                                                    (int)&v10,
  12631.                                                                                                    (int)&v12,
  12632.                                                                                                    (int)&v10);
  12633.                                                                                             if ( !v6 )
  12634.                                                                                             {
  12635.                                                                                               v6 = sub_41FFD0(
  12636.                                                                                                      (int)&v10,
  12637.                                                                                                      (int)&v11,
  12638.                                                                                                      (int)&v10);
  12639.                                                                                               if ( !v6 )
  12640.                                                                                               {
  12641.                                                                                                 v6 = sub_41FFD0((int)&v12, (int)&v10, (int)&v12);
  12642.                                                                                                 if ( !v6 )
  12643.                                                                                                 {
  12644.                                                                                                   v6 = sub_41FFD0((int)&v11, (int)&v10, (int)&v11);
  12645.                                                                                                   if ( !v6 )
  12646.                                                                                                   {
  12647.                                                                                                     v6 = sub_425040((int)&v12, (int)&v12, 0);
  12648.                                                                                                     if ( !v6 )
  12649.                                                                                                     {
  12650.                                                                                                       v6 = sub_425040((int)&v11, (int)&v11, 0);
  12651.                                                                                                       if ( !v6 )
  12652.                                                                                                       {
  12653.                                                                                                         v6 = sub_423560((int)&v12, v7);
  12654.                                                                                                         if ( !v6 )
  12655.                                                                                                         {
  12656.                                                                                                           v6 = sub_423560((int)&v10, 2 * v7);
  12657.                                                                                                           if ( !v6 )
  12658.                                                                                                           {
  12659.                                                                                                             v6 = sub_423560((int)&v11, 3 * v7);
  12660.                                                                                                             if ( !v6 )
  12661.                                                                                                             {
  12662.                                                                                                               v6 = sub_423560((int)&v16, 4 * v7);
  12663.                                                                                                               if ( !v6 )
  12664.                                                                                                               {
  12665.                                                                                                                 v6 = sub_41FE40((int)&v21, (int)&v12, a3);
  12666.                                                                                                                 if ( !v6 )
  12667.                                                                                                                 {
  12668.                                                                                                                   v6 = sub_41FE40((int)&v10, (int)&v11, (int)&v8);
  12669.                                                                                                                   if ( !v6 )
  12670.                                                                                                                   {
  12671.                                                                                                                     v6 = sub_41FE40((int)&v16, (int)&v8, (int)&v8);
  12672.                                                                                                                     if ( !v6 )
  12673.                                                                                                                       v6 = sub_41FE40((int)&v8, a3, a3);
  12674.                                                                                                                   }
  12675.                                                                                                                 }
  12676.                                                                                                               }
  12677.                                                                                                             }
  12678.                                                                                                           }
  12679.                                                                                                         }
  12680.                                                                                                       }
  12681.                                                                                                     }
  12682.                                                                                                   }
  12683.                                                                                                 }
  12684.                                                                                               }
  12685.                                                                                             }
  12686.                                                                                           }
  12687.                                                                                         }
  12688.                                                                                       }
  12689.                                                                                     }
  12690.                                                                                   }
  12691.                                                                                 }
  12692.                                                                               }
  12693.                                                                             }
  12694.                                                                           }
  12695.                                                                         }
  12696.                                                                       }
  12697.                                                                     }
  12698.                                                                   }
  12699.                                                                 }
  12700.                                                               }
  12701.                                                             }
  12702.                                                           }
  12703.                                                         }
  12704.                                                       }
  12705.                                                     }
  12706.                                                   }
  12707.                                                 }
  12708.                                               }
  12709.                                             }
  12710.                                           }
  12711.                                         }
  12712.                                       }
  12713.                                     }
  12714.                                   }
  12715.                                 }
  12716.                               }
  12717.                             }
  12718.                           }
  12719.                         }
  12720.                       }
  12721.                     }
  12722.                   }
  12723.                 }
  12724.               }
  12725.             }
  12726.           }
  12727.         }
  12728.       }
  12729.     }
  12730.     sub_423670((int)&v21);
  12731.     result = v6;
  12732.   }
  12733.   return result;
  12734. }
  12735. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  12736.  
  12737. //----- (004228C0) --------------------------------------------------------
  12738. signed int __cdecl sub_4228C0(int a1, int a2)
  12739. {
  12740.   int v2; // esi@1
  12741.   signed int result; // eax@1
  12742.   int v4; // ebp@3
  12743.   signed int v5; // ebx@3
  12744.   int v6; // esi@3
  12745.   int v7; // edi@5
  12746.   int v8; // esi@5
  12747.   int i; // [sp+8h] [bp-24h]@3
  12748.   int v10; // [sp+Ch] [bp-20h]@1
  12749.   int v11; // [sp+10h] [bp-1Ch]@3
  12750.   signed int v12; // [sp+14h] [bp-18h]@3
  12751.   int v13; // [sp+18h] [bp-14h]@5
  12752.   int v14; // [sp+1Ch] [bp-10h]@1
  12753.   int v15; // [sp+28h] [bp-4h]@5
  12754.  
  12755.   v2 = *(_DWORD *)a1;
  12756.   v10 = *(_DWORD *)a1;
  12757.   result = sub_4235D0((int)&v14, 2 * *(_DWORD *)a1 + 1);
  12758.   if ( !result )
  12759.   {
  12760.     v14 = 2 * v2 + 1;
  12761.     if ( v2 > 0 )
  12762.     {
  12763.       v4 = 0;
  12764.       v5 = 1;
  12765.       v6 = 0;
  12766.       v12 = 1;
  12767.       v11 = 0;
  12768.       for ( i = 0; ; v6 = i )
  12769.       {
  12770.         *(_DWORD *)(v15 + v4) = (*(_DWORD *)(v15 + v4)
  12771.                                + *(_DWORD *)(*(_DWORD *)(a1 + 12) + v6) * *(_DWORD *)(*(_DWORD *)(a1 + 12) + v6)) & 0xFFFFFFF;
  12772.         v7 = unknown_libname_1(28);
  12773.         v13 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + v6);
  12774.         v8 = v15 + v4 + 4;
  12775.         if ( v5 < v10 )
  12776.         {
  12777.           do
  12778.           {
  12779.             *(_DWORD *)v8 = (v7 + *(_DWORD *)v8 + 2 * *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * v5) * v13) & 0xFFFFFFF;
  12780.             v8 += 4;
  12781.             v7 = unknown_libname_1(28);
  12782.             ++v5;
  12783.           }
  12784.           while ( v5 < v10 );
  12785.           v5 = v12;
  12786.           v4 = v11;
  12787.         }
  12788.         for ( ; v7; v7 = unknown_libname_1(28) )
  12789.         {
  12790.           *(_DWORD *)v8 = (v7 + *(_DWORD *)v8) & 0xFFFFFFF;
  12791.           v8 += 4;
  12792.         }
  12793.         v4 += 8;
  12794.         ++v5;
  12795.         i += 4;
  12796.         v11 = v4;
  12797.         v12 = v5;
  12798.         if ( v5 - 1 >= v10 )
  12799.           break;
  12800.       }
  12801.     }
  12802.     sub_4212C0((int)&v14);
  12803.     sub_4234B0((int)&v14, a2);
  12804.     sub_41F860((int)&v14);
  12805.     result = 0;
  12806.   }
  12807.   return result;
  12808. }
  12809. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  12810.  
  12811. //----- (00422A50) --------------------------------------------------------
  12812. signed int __cdecl sub_422A50(int a1, int a2)
  12813. {
  12814.   int v2; // ebp@1
  12815.   int v3; // edi@1
  12816.   signed int v4; // esi@1
  12817.   signed int result; // eax@2
  12818.   int v6; // ecx@2
  12819.   signed int v7; // ebx@5
  12820.   int v8; // edx@6
  12821.   int v9; // ebp@6
  12822.   int v10; // ecx@8
  12823.   int v11; // esi@10
  12824.   int v12; // edx@10
  12825.   int v13; // edi@10
  12826.   int v14; // ecx@12
  12827.   unsigned int v15; // ecx@15
  12828.   unsigned int v16; // ebp@15
  12829.   unsigned __int64 v17; // kr08_8@16
  12830.   int v18; // esi@19
  12831.   int v19; // edx@24
  12832.   signed int v20; // ebx@24
  12833.   void *v21; // edi@24
  12834.   signed int v22; // edx@24
  12835.   char *v23; // eax@25
  12836.   int v24; // ecx@26
  12837.   char *v25; // [sp+Ch] [bp-824h]@6
  12838.   int v26; // [sp+10h] [bp-820h]@6
  12839.   int v27; // [sp+14h] [bp-81Ch]@15
  12840.   int v28; // [sp+18h] [bp-818h]@5
  12841.   int v29; // [sp+20h] [bp-810h]@8
  12842.   int v30; // [sp+24h] [bp-80Ch]@8
  12843.   int v31; // [sp+28h] [bp-808h]@6
  12844.   int v32; // [sp+2Ch] [bp-804h]@1
  12845.   char v33; // [sp+30h] [bp-800h]@6
  12846.  
  12847.   v2 = a2;
  12848.   v3 = a1;
  12849.   v4 = 2 * *(_DWORD *)a1;
  12850.   v32 = 2 * *(_DWORD *)a1;
  12851.   if ( *(_DWORD *)(a2 + 4) >= v4 )
  12852.   {
  12853.     v6 = 0;
  12854.   }
  12855.   else
  12856.   {
  12857.     result = sub_421250(a2, v4);
  12858.     v6 = 0;
  12859.     if ( result )
  12860.       return result;
  12861.   }
  12862.   v7 = 0;
  12863.   v28 = v6;
  12864.   if ( v4 > v6 )
  12865.   {
  12866.     v8 = *(_DWORD *)a1;
  12867.     v9 = *(_DWORD *)(a1 + 12);
  12868.     v31 = *(_DWORD *)a1;
  12869.     v26 = *(_DWORD *)(a1 + 12);
  12870.     v25 = &v33;
  12871.     while ( 1 )
  12872.     {
  12873.       v29 = v6;
  12874.       v30 = v6;
  12875.       v10 = v8 - 1;
  12876.       if ( v8 - 1 >= v7 )
  12877.         v10 = v7;
  12878.       v11 = v9 + 4 * v10;
  12879.       v12 = v8 - (v7 - v10);
  12880.       v13 = v9 + 4 * (v7 - v10);
  12881.       if ( v12 >= v10 + 1 )
  12882.         v12 = v10 + 1;
  12883.       v14 = (v10 - (v7 - v10) + 1) >> 1;
  12884.       if ( v12 >= v14 )
  12885.         v12 = v14;
  12886.       if ( v12 <= 0 )
  12887.       {
  12888.         v15 = v29;
  12889.       }
  12890.       else
  12891.       {
  12892.         v15 = v29;
  12893.         v16 = v30;
  12894.         v27 = v12;
  12895.         do
  12896.         {
  12897.           v17 = *(_DWORD *)v13 * (unsigned __int64)*(_DWORD *)v11 + __PAIR__(v16, v15);
  12898.           v16 = (*(_DWORD *)v13 * (unsigned __int64)*(_DWORD *)v11 + __PAIR__(v16, v15)) >> 32;
  12899.           v15 = v17;
  12900.           v11 -= 4;
  12901.           v13 += 4;
  12902.           --v27;
  12903.         }
  12904.         while ( v27 );
  12905.       }
  12906.       v18 = v28 + 2 * v15;
  12907.       if ( v7 & 1 )
  12908.       {
  12909.         v9 = v26;
  12910.       }
  12911.       else
  12912.       {
  12913.         v9 = v26;
  12914.         v18 += *(_DWORD *)(v26 + 4 * (v7 >> 1)) * *(_DWORD *)(v26 + 4 * (v7 >> 1));
  12915.       }
  12916.       *(_DWORD *)v25 = v18 & 0xFFFFFFF;
  12917.       v4 = v32;
  12918.       ++v7;
  12919.       v28 = unknown_libname_1(28);
  12920.       v25 += 4;
  12921.       if ( v7 >= v32 )
  12922.         break;
  12923.       v8 = v31;
  12924.       v6 = 0;
  12925.     }
  12926.     v2 = a2;
  12927.     v3 = a1;
  12928.     v6 = 0;
  12929.   }
  12930.   v19 = *(_DWORD *)v3;
  12931.   v20 = *(_DWORD *)v2;
  12932.   v21 = *(void **)(v2 + 12);
  12933.   *(_DWORD *)v2 = 2 * v19;
  12934.   v22 = 0;
  12935.   if ( v4 > v6 )
  12936.   {
  12937.     v23 = &v33;
  12938.     v22 = v4;
  12939.     do
  12940.     {
  12941.       v21 = (char *)v21 + 4;
  12942.       v24 = *(_DWORD *)v23 & 0xFFFFFFF;
  12943.       v23 += 4;
  12944.       *((_DWORD *)v21 - 1) = v24;
  12945.       --v4;
  12946.     }
  12947.     while ( v4 );
  12948.   }
  12949.   if ( v22 < v20 )
  12950.     memset(v21, 0, 4 * (v20 - v22));
  12951.   sub_4212C0(v2);
  12952.   return 0;
  12953. }
  12954. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  12955.  
  12956. //----- (00422C10) --------------------------------------------------------
  12957. signed int __cdecl sub_422C10(int a1, int a2)
  12958. {
  12959.   signed int v2; // ebp@1
  12960.   int v3; // esi@1
  12961.   int v4; // eax@7
  12962.   int v5; // ecx@7
  12963.   int v6; // edx@8
  12964.   int v7; // ebp@9
  12965.   int v8; // ecx@11
  12966.   int v9; // edx@11
  12967.   int v10; // ebp@12
  12968.   int v11; // ecx@14
  12969.   char v13; // [sp+10h] [bp-60h]@3
  12970.   int v14; // [sp+20h] [bp-50h]@1
  12971.   int v15; // [sp+2Ch] [bp-44h]@7
  12972.   char v16; // [sp+30h] [bp-40h]@6
  12973.   int v17; // [sp+40h] [bp-30h]@2
  12974.   int v18; // [sp+4Ch] [bp-24h]@11
  12975.   char v19; // [sp+50h] [bp-20h]@5
  12976.   char v20; // [sp+60h] [bp-10h]@4
  12977.  
  12978.   v2 = -2;
  12979.   v3 = *(_DWORD *)a1 >> 1;
  12980.   if ( !sub_4235D0((int)&v14, v3) )
  12981.   {
  12982.     if ( !sub_4235D0((int)&v17, *(_DWORD *)a1 - v3) )
  12983.     {
  12984.       if ( !sub_4235D0((int)&v13, 2 * *(_DWORD *)a1) )
  12985.       {
  12986.         if ( !sub_4235D0((int)&v20, 2 * *(_DWORD *)a1) )
  12987.         {
  12988.           if ( !sub_4235D0((int)&v19, 2 * v3) )
  12989.           {
  12990.             if ( !sub_4235D0((int)&v16, 2 * (*(_DWORD *)a1 - v3)) )
  12991.             {
  12992.               v4 = *(_DWORD *)(a1 + 12);
  12993.               v5 = v15;
  12994.               if ( v3 > 0 )
  12995.               {
  12996.                 v6 = v3;
  12997.                 do
  12998.                 {
  12999.                   v7 = *(_DWORD *)v4;
  13000.                   v4 += 4;
  13001.                   *(_DWORD *)v5 = v7;
  13002.                   v5 += 4;
  13003.                   --v6;
  13004.                 }
  13005.                 while ( v6 );
  13006.                 v2 = -2;
  13007.               }
  13008.               v8 = v18;
  13009.               v9 = v3;
  13010.               if ( v3 < *(_DWORD *)a1 )
  13011.               {
  13012.                 do
  13013.                 {
  13014.                   v10 = *(_DWORD *)v4;
  13015.                   v4 += 4;
  13016.                   *(_DWORD *)v8 = v10;
  13017.                   v8 += 4;
  13018.                   ++v9;
  13019.                 }
  13020.                 while ( v9 < *(_DWORD *)a1 );
  13021.                 v2 = -2;
  13022.               }
  13023.               v11 = *(_DWORD *)a1 - v3;
  13024.               v14 = v3;
  13025.               v17 = v11;
  13026.               sub_4212C0((int)&v14);
  13027.               if ( !sub_4202E0(&v14, &v19)
  13028.                 && !sub_4202E0(&v17, &v16)
  13029.                 && !sub_421920((int)&v17, (int)&v14, (int)&v13)
  13030.                 && !sub_4202E0(&v13, &v13)
  13031.                 && !sub_421920((int)&v19, (int)&v16, (int)&v20)
  13032.                 && !sub_421850((signed int *)&v13, (signed int *)&v20, (int)&v13)
  13033.                 && !sub_423560((int)&v13, v3)
  13034.                 && !sub_423560((int)&v16, 2 * v3)
  13035.                 && !sub_41FE40((int)&v19, (int)&v13, (int)&v13)
  13036.                 && !sub_41FE40((int)&v13, (int)&v16, a2) )
  13037.                 v2 = 0;
  13038.               sub_41F860((int)&v16);
  13039.             }
  13040.             sub_41F860((int)&v19);
  13041.           }
  13042.           sub_41F860((int)&v20);
  13043.         }
  13044.         sub_41F860((int)&v13);
  13045.       }
  13046.       sub_41F860((int)&v17);
  13047.     }
  13048.     sub_41F860((int)&v14);
  13049.   }
  13050.   return v2;
  13051. }
  13052. // 4202E0: using guessed type _DWORD __cdecl sub_4202E0(_DWORD, _DWORD);
  13053.  
  13054. //----- (00422E70) --------------------------------------------------------
  13055. signed int __cdecl sub_422E70(int a1, int a2)
  13056. {
  13057.   signed int result; // eax@1
  13058.   int v3; // ebp@2
  13059.   signed int v4; // esi@2
  13060.   char v5; // [sp+0h] [bp-90h]@7
  13061.   char v6; // [sp+10h] [bp-80h]@19
  13062.   char v7; // [sp+20h] [bp-70h]@16
  13063.   char v8; // [sp+30h] [bp-60h]@11
  13064.   char v9; // [sp+40h] [bp-50h]@3
  13065.   char v10; // [sp+50h] [bp-40h]@6
  13066.   char v11; // [sp+60h] [bp-30h]@4
  13067.   char v12; // [sp+70h] [bp-20h]@2
  13068.   char v13; // [sp+80h] [bp-10h]@1
  13069.  
  13070.   result = sub_4236A0((int)&v13);
  13071.   if ( !result )
  13072.   {
  13073.     v3 = *(_DWORD *)a1 / 3;
  13074.     v4 = sub_425160(a1, 28 * v3, (unsigned int)&v12);
  13075.     if ( !v4 )
  13076.     {
  13077.       v4 = sub_41F8F0(a1, (int)&v9);
  13078.       if ( !v4 )
  13079.       {
  13080.         sub_423500((unsigned int)&v9, v3);
  13081.         sub_425160((int)&v9, 28 * v3, (unsigned int)&v9);
  13082.         v4 = sub_41F8F0(a1, (int)&v11);
  13083.         if ( !v4 )
  13084.         {
  13085.           sub_423500((unsigned int)&v11, 2 * v3);
  13086.           v4 = sub_4202E0(&v12, &v13);
  13087.           if ( !v4 )
  13088.           {
  13089.             v4 = sub_4202E0(&v11, &v10);
  13090.             if ( !v4 )
  13091.             {
  13092.               v4 = sub_423F60((int)&v12, (int)&v5);
  13093.               if ( !v4 )
  13094.               {
  13095.                 v4 = sub_41FE40((int)&v5, (int)&v9, (int)&v5);
  13096.                 if ( !v4 )
  13097.                 {
  13098.                   v4 = sub_423F60((int)&v5, (int)&v5);
  13099.                   if ( !v4 )
  13100.                   {
  13101.                     v4 = sub_41FE40((int)&v5, (int)&v11, (int)&v5);
  13102.                     if ( !v4 )
  13103.                     {
  13104.                       v4 = sub_4202E0(&v5, &v8);
  13105.                       if ( !v4 )
  13106.                       {
  13107.                         v4 = sub_423F60((int)&v11, (int)&v5);
  13108.                         if ( !v4 )
  13109.                         {
  13110.                           v4 = sub_41FE40((int)&v5, (int)&v9, (int)&v5);
  13111.                           if ( !v4 )
  13112.                           {
  13113.                             v4 = sub_423F60((int)&v5, (int)&v5);
  13114.                             if ( !v4 )
  13115.                             {
  13116.                               v4 = sub_41FE40((int)&v5, (int)&v12, (int)&v5);
  13117.                               if ( !v4 )
  13118.                               {
  13119.                                 v4 = sub_4202E0(&v5, &v7);
  13120.                                 if ( !v4 )
  13121.                                 {
  13122.                                   v4 = sub_41FE40((int)&v11, (int)&v9, (int)&v5);
  13123.                                   if ( !v4 )
  13124.                                   {
  13125.                                     v4 = sub_41FE40((int)&v5, (int)&v12, (int)&v5);
  13126.                                     if ( !v4 )
  13127.                                     {
  13128.                                       v4 = sub_4202E0(&v5, &v6);
  13129.                                       if ( !v4 )
  13130.                                       {
  13131.                                         v4 = sub_41FFD0((int)&v8, (int)&v10, (int)&v8);
  13132.                                         if ( !v4 )
  13133.                                         {
  13134.                                           v4 = sub_41FFD0((int)&v7, (int)&v13, (int)&v7);
  13135.                                           if ( !v4 )
  13136.                                           {
  13137.                                             v4 = sub_420890((int)&v8, (int)&v8);
  13138.                                             if ( !v4 )
  13139.                                             {
  13140.                                               v4 = sub_420890((int)&v7, (int)&v7);
  13141.                                               if ( !v4 )
  13142.                                               {
  13143.                                                 v4 = sub_41FFD0((int)&v6, (int)&v13, (int)&v6);
  13144.                                                 if ( !v4 )
  13145.                                                 {
  13146.                                                   v4 = sub_41FFD0((int)&v6, (int)&v10, (int)&v6);
  13147.                                                   if ( !v4 )
  13148.                                                   {
  13149.                                                     v4 = sub_41FFD0((int)&v8, (int)&v6, (int)&v8);
  13150.                                                     if ( !v4 )
  13151.                                                     {
  13152.                                                       v4 = sub_41FFD0((int)&v7, (int)&v6, (int)&v7);
  13153.                                                       if ( !v4 )
  13154.                                                       {
  13155.                                                         v4 = sub_4212F0((int)&v13, 3, (int)&v5);
  13156.                                                         if ( !v4 )
  13157.                                                         {
  13158.                                                           v4 = sub_41FFD0((int)&v8, (int)&v5, (int)&v8);
  13159.                                                           if ( !v4 )
  13160.                                                           {
  13161.                                                             v4 = sub_4212F0((int)&v10, 3, (int)&v5);
  13162.                                                             if ( !v4 )
  13163.                                                             {
  13164.                                                               v4 = sub_41FFD0((int)&v7, (int)&v5, (int)&v7);
  13165.                                                               if ( !v4 )
  13166.                                                               {
  13167.                                                                 v4 = sub_420220((int)&v6, 3, (int)&v6);
  13168.                                                                 if ( !v4 )
  13169.                                                                 {
  13170.                                                                   v4 = sub_41FFD0((int)&v6, (int)&v8, (int)&v6);
  13171.                                                                   if ( !v4 )
  13172.                                                                   {
  13173.                                                                     v4 = sub_41FFD0((int)&v6, (int)&v7, (int)&v6);
  13174.                                                                     if ( !v4 )
  13175.                                                                     {
  13176.                                                                       v4 = sub_41FFD0((int)&v8, (int)&v6, (int)&v8);
  13177.                                                                       if ( !v4 )
  13178.                                                                       {
  13179.                                                                         v4 = sub_41FFD0((int)&v7, (int)&v6, (int)&v7);
  13180.                                                                         if ( !v4 )
  13181.                                                                         {
  13182.                                                                           v4 = sub_425040((int)&v8, (int)&v8, 0);
  13183.                                                                           if ( !v4 )
  13184.                                                                           {
  13185.                                                                             v4 = sub_425040((int)&v7, (int)&v7, 0);
  13186.                                                                             if ( !v4 )
  13187.                                                                             {
  13188.                                                                               v4 = sub_423560((int)&v8, v3);
  13189.                                                                               if ( !v4 )
  13190.                                                                               {
  13191.                                                                                 v4 = sub_423560((int)&v6, 2 * v3);
  13192.                                                                                 if ( !v4 )
  13193.                                                                                 {
  13194.                                                                                   v4 = sub_423560((int)&v7, 3 * v3);
  13195.                                                                                   if ( !v4 )
  13196.                                                                                   {
  13197.                                                                                     v4 = sub_423560((int)&v10, 4 * v3);
  13198.                                                                                     if ( !v4 )
  13199.                                                                                     {
  13200.                                                                                       v4 = sub_41FE40(
  13201.                                                                                              (int)&v13,
  13202.                                                                                              (int)&v8,
  13203.                                                                                              a2);
  13204.                                                                                       if ( !v4 )
  13205.                                                                                       {
  13206.                                                                                         v4 = sub_41FE40(
  13207.                                                                                                (int)&v6,
  13208.                                                                                                (int)&v7,
  13209.                                                                                                (int)&v5);
  13210.                                                                                         if ( !v4 )
  13211.                                                                                         {
  13212.                                                                                           v4 = sub_41FE40(
  13213.                                                                                                  (int)&v10,
  13214.                                                                                                  (int)&v5,
  13215.                                                                                                  (int)&v5);
  13216.                                                                                           if ( !v4 )
  13217.                                                                                             v4 = sub_41FE40(
  13218.                                                                                                    (int)&v5,
  13219.                                                                                                    a2,
  13220.                                                                                                    a2);
  13221.                                                                                         }
  13222.                                                                                       }
  13223.                                                                                     }
  13224.                                                                                   }
  13225.                                                                                 }
  13226.                                                                               }
  13227.                                                                             }
  13228.                                                                           }
  13229.                                                                         }
  13230.                                                                       }
  13231.                                                                     }
  13232.                                                                   }
  13233.                                                                 }
  13234.                                                               }
  13235.                                                             }
  13236.                                                           }
  13237.                                                         }
  13238.                                                       }
  13239.                                                     }
  13240.                                                   }
  13241.                                                 }
  13242.                                               }
  13243.                                             }
  13244.                                           }
  13245.                                         }
  13246.                                       }
  13247.                                     }
  13248.                                   }
  13249.                                 }
  13250.                               }
  13251.                             }
  13252.                           }
  13253.                         }
  13254.                       }
  13255.                     }
  13256.                   }
  13257.                 }
  13258.               }
  13259.             }
  13260.           }
  13261.         }
  13262.       }
  13263.     }
  13264.     sub_423670((int)&v13);
  13265.     result = v4;
  13266.   }
  13267.   return result;
  13268. }
  13269. // 4202E0: using guessed type _DWORD __cdecl sub_4202E0(_DWORD, _DWORD);
  13270.  
  13271. //----- (004234B0) --------------------------------------------------------
  13272. int __cdecl sub_4234B0(int a1, int a2)
  13273. {
  13274.   int result; // eax@1
  13275.   int v3; // edx@1
  13276.   int v4; // esi@1
  13277.   int v5; // edi@1
  13278.   int v6; // ST1C_4@1
  13279.  
  13280.   result = a1;
  13281.   v3 = *(_DWORD *)a1;
  13282.   v4 = *(_DWORD *)(a1 + 4);
  13283.   v5 = *(_DWORD *)(a1 + 8);
  13284.   v6 = *(_DWORD *)(a1 + 12);
  13285.   *(_DWORD *)a1 = *(_DWORD *)a2;
  13286.   *(_DWORD *)(a1 + 4) = *(_DWORD *)(a2 + 4);
  13287.   *(_DWORD *)(a1 + 8) = *(_DWORD *)(a2 + 8);
  13288.   *(_DWORD *)(a1 + 12) = *(_DWORD *)(a2 + 12);
  13289.   *(_DWORD *)a2 = v3;
  13290.   *(_DWORD *)(a2 + 4) = v4;
  13291.   *(_DWORD *)(a2 + 8) = v5;
  13292.   *(_DWORD *)(a2 + 12) = v6;
  13293.   return result;
  13294. }
  13295.  
  13296. //----- (00423500) --------------------------------------------------------
  13297. void __cdecl sub_423500(unsigned int a1, int a2)
  13298. {
  13299.   int v2; // eax@4
  13300.   int v3; // ecx@4
  13301.   int i; // esi@4
  13302.   int v5; // edi@5
  13303.  
  13304.   if ( a2 > 0 )
  13305.   {
  13306.     if ( *(_DWORD *)a1 > a2 )
  13307.     {
  13308.       v2 = *(_DWORD *)(a1 + 12);
  13309.       v3 = 0;
  13310.       for ( i = v2 + 4 * a2; v3 < *(_DWORD *)a1 - a2; ++v3 )
  13311.       {
  13312.         v5 = *(_DWORD *)i;
  13313.         i += 4;
  13314.         *(_DWORD *)v2 = v5;
  13315.         v2 += 4;
  13316.       }
  13317.       for ( ; v3 < *(_DWORD *)a1; ++v3 )
  13318.       {
  13319.         *(_DWORD *)v2 = 0;
  13320.         v2 += 4;
  13321.       }
  13322.       *(_DWORD *)a1 -= a2;
  13323.     }
  13324.     else
  13325.     {
  13326.       sub_4213F0(a1);
  13327.     }
  13328.   }
  13329. }
  13330.  
  13331. //----- (00423560) --------------------------------------------------------
  13332. signed int __cdecl sub_423560(int a1, int a2)
  13333. {
  13334.   signed int result; // eax@2
  13335.   int v3; // edx@5
  13336.   int v4; // eax@5
  13337.   int v5; // ecx@5
  13338.   int v6; // edi@5
  13339.   int v7; // eax@5
  13340.   int v8; // edx@5
  13341.   int v9; // eax@6
  13342.   int v10; // edi@7
  13343.  
  13344.   if ( a2 > 0 )
  13345.   {
  13346.     if ( *(_DWORD *)(a1 + 4) >= a2 + *(_DWORD *)a1 || (result = sub_421250(a1, a2 + *(_DWORD *)a1)) == 0 )
  13347.     {
  13348.       v3 = *(_DWORD *)(a1 + 12);
  13349.       v4 = a2 + *(_DWORD *)a1;
  13350.       *(_DWORD *)a1 = v4;
  13351.       v5 = v3 + 4 * v4 - 4;
  13352.       v6 = v4 - a2;
  13353.       v7 = v4 - 1;
  13354.       v8 = v3 + 4 * v6 - 4;
  13355.       if ( v7 >= a2 )
  13356.       {
  13357.         v9 = v7 - a2 + 1;
  13358.         do
  13359.         {
  13360.           v10 = *(_DWORD *)v8;
  13361.           v8 -= 4;
  13362.           *(_DWORD *)v5 = v10;
  13363.           v5 -= 4;
  13364.           --v9;
  13365.         }
  13366.         while ( v9 );
  13367.       }
  13368.       if ( a2 > 0 )
  13369.         memset(*(void **)(a1 + 12), 0, 4 * a2);
  13370.       result = 0;
  13371.     }
  13372.   }
  13373.   else
  13374.   {
  13375.     result = 0;
  13376.   }
  13377.   return result;
  13378. }
  13379.  
  13380. //----- (004235D0) --------------------------------------------------------
  13381. signed int __cdecl sub_4235D0(int a1, signed int a2)
  13382. {
  13383.   int v2; // esi@1
  13384.   void *v3; // eax@1
  13385.   signed int result; // eax@2
  13386.   int v5; // eax@3
  13387.  
  13388.   v2 = 64 - a2 % 32 + a2;
  13389.   v3 = malloc(4 * v2);
  13390.   *(_DWORD *)(a1 + 12) = v3;
  13391.   if ( v3 )
  13392.   {
  13393.     v5 = 0;
  13394.     *(_DWORD *)a1 = 0;
  13395.     *(_DWORD *)(a1 + 4) = v2;
  13396.     for ( *(_DWORD *)(a1 + 8) = 0; v5 < v2; *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * v5 - 4) = 0 )
  13397.       ++v5;
  13398.     result = 0;
  13399.   }
  13400.   else
  13401.   {
  13402.     result = -2;
  13403.   }
  13404.   return result;
  13405. }
  13406.  
  13407. //----- (00423640) --------------------------------------------------------
  13408. signed int __cdecl sub_423640(int a1, int a2)
  13409. {
  13410.   signed int result; // eax@2
  13411.  
  13412.   if ( a1 == a2 || (result = sub_41F8F0(a1, a2)) == 0 )
  13413.   {
  13414.     *(_DWORD *)(a2 + 8) = 0;
  13415.     result = 0;
  13416.   }
  13417.   return result;
  13418. }
  13419.  
  13420. //----- (00423670) --------------------------------------------------------
  13421. int __cdecl sub_423670(int a1)
  13422. {
  13423.   int result; // eax@1
  13424.   int *v2; // esi@2
  13425.  
  13426.   result = a1;
  13427.   if ( a1 )
  13428.   {
  13429.     v2 = &a1;
  13430.     do
  13431.     {
  13432.       sub_41F860(result);
  13433.       result = v2[1];
  13434.       ++v2;
  13435.     }
  13436.     while ( result );
  13437.   }
  13438.   return result;
  13439. }
  13440.  
  13441. //----- (004236A0) --------------------------------------------------------
  13442. signed int __cdecl sub_4236A0(int a1)
  13443. {
  13444.   int v1; // ebx@1
  13445.   int v2; // esi@1
  13446.   int v3; // eax@1
  13447.   int *v4; // edi@2
  13448.   signed int result; // eax@5
  13449.   int v6; // ecx@6
  13450.   int v7; // esi@6
  13451.   int v8; // eax@6
  13452.   int *v9; // edi@7
  13453.   int v10; // esi@7
  13454.  
  13455.   v1 = a1;
  13456.   v2 = 0;
  13457.   v3 = a1;
  13458.   if ( a1 )
  13459.   {
  13460.     v4 = &a1;
  13461.     while ( !sub_41F810(v3) )
  13462.     {
  13463.       v3 = v4[1];
  13464.       ++v4;
  13465.       ++v2;
  13466.       if ( !v3 )
  13467.         goto LABEL_5;
  13468.     }
  13469.     v6 = v2;
  13470.     v7 = v2 - 1;
  13471.     v8 = v1;
  13472.     if ( v6 )
  13473.     {
  13474.       v9 = &a1;
  13475.       v10 = v7 + 1;
  13476.       do
  13477.       {
  13478.         sub_41F860(v8);
  13479.         v8 = v9[1];
  13480.         ++v9;
  13481.         --v10;
  13482.       }
  13483.       while ( v10 );
  13484.     }
  13485.     result = -2;
  13486.   }
  13487.   else
  13488.   {
  13489. LABEL_5:
  13490.     result = 0;
  13491.   }
  13492.   return result;
  13493. }
  13494.  
  13495. //----- (00423700) --------------------------------------------------------
  13496. signed int __cdecl sub_423700(int a1, int a2, int a3)
  13497. {
  13498.   signed int result; // eax@1
  13499.   signed int v4; // esi@2
  13500.   char v5; // [sp+8h] [bp-10h]@1
  13501.   int v6; // [sp+10h] [bp-8h]@3
  13502.  
  13503.   result = sub_41F810((int)&v5);
  13504.   if ( !result )
  13505.   {
  13506.     v4 = sub_420370(a1, a2, 0, (int)&v5);
  13507.     if ( !v4 )
  13508.     {
  13509.       if ( v6 == *(_DWORD *)(a2 + 8) )
  13510.       {
  13511.         v4 = 0;
  13512.         sub_4234B0((int)&v5, a3);
  13513.       }
  13514.       else
  13515.       {
  13516.         v4 = sub_41FE40(a2, (int)&v5, a3);
  13517.       }
  13518.     }
  13519.     sub_41F860((int)&v5);
  13520.     result = v4;
  13521.   }
  13522.   return result;
  13523. }
  13524.  
  13525. //----- (00423780) --------------------------------------------------------
  13526. signed int __cdecl sub_423780(int a1, int a2, int a3)
  13527. {
  13528.   signed int result; // eax@3
  13529.   signed int v4; // esi@4
  13530.   int v5; // [sp+4h] [bp-80h]@29
  13531.   int v6; // [sp+10h] [bp-74h]@30
  13532.   int v7; // [sp+14h] [bp-70h]@13
  13533.   int v8; // [sp+20h] [bp-64h]@32
  13534.   int v9; // [sp+24h] [bp-60h]@13
  13535.   int v10; // [sp+30h] [bp-54h]@18
  13536.   int v11; // [sp+34h] [bp-50h]@12
  13537.   int v12; // [sp+40h] [bp-44h]@27
  13538.   int v13; // [sp+44h] [bp-40h]@11
  13539.   int v14; // [sp+50h] [bp-34h]@15
  13540.   int v15; // [sp+54h] [bp-30h]@19
  13541.   int v16; // [sp+60h] [bp-24h]@20
  13542.   int v17; // [sp+64h] [bp-20h]@5
  13543.   int v18; // [sp+70h] [bp-14h]@9
  13544.   int v19; // [sp+74h] [bp-10h]@3
  13545.   int v20; // [sp+80h] [bp-4h]@7
  13546.  
  13547.   if ( *(_DWORD *)(a2 + 8) != 1 && *(_DWORD *)a2 )
  13548.   {
  13549.     result = sub_4236A0((int)&v19);
  13550.     if ( !result )
  13551.     {
  13552.       v4 = sub_423700(a1, a2, (int)&v19);
  13553.       if ( !v4 )
  13554.       {
  13555.         v4 = sub_41F8F0(a2, (int)&v17);
  13556.         if ( !v4 )
  13557.         {
  13558.           if ( v19 <= 0 || *(_BYTE *)v20 & 1 || v17 <= 0 || *(_BYTE *)v18 & 1 )
  13559.           {
  13560.             v4 = sub_41F8F0((int)&v19, (int)&v13);
  13561.             if ( !v4 )
  13562.             {
  13563.               v4 = sub_41F8F0((int)&v17, (int)&v11);
  13564.               if ( !v4 )
  13565.               {
  13566.                 sub_424010((unsigned int)&v9, 1);
  13567.                 sub_424010((unsigned int)&v7, 1);
  13568.                 do
  13569.                 {
  13570.                   while ( v13 > 0 && !(*(_BYTE *)v14 & 1) )
  13571.                   {
  13572.                     v4 = sub_420890((int)&v13, (int)&v13);
  13573.                     if ( !v4 )
  13574.                     {
  13575.                       if ( (v9 <= 0 || (*(_BYTE *)v10 & 1) != 1) && (v15 <= 0 || (*(_BYTE *)v16 & 1) != 1)
  13576.                         || (v4 = sub_41FE40((int)&v9, (int)&v17, (int)&v9)) == 0
  13577.                         && (v4 = sub_41FFD0((int)&v15, (int)&v19, (int)&v15)) == 0 )
  13578.                       {
  13579.                         v4 = sub_420890((int)&v9, (int)&v9);
  13580.                         if ( !v4 )
  13581.                         {
  13582.                           v4 = sub_420890((int)&v15, (int)&v15);
  13583.                           if ( !v4 )
  13584.                             continue;
  13585.                         }
  13586.                       }
  13587.                     }
  13588.                     goto LABEL_56;
  13589.                   }
  13590.                   while ( v11 > 0 && !(*(_BYTE *)v12 & 1) )
  13591.                   {
  13592.                     v4 = sub_420890((int)&v11, (int)&v11);
  13593.                     if ( !v4 )
  13594.                     {
  13595.                       if ( (v5 <= 0 || (*(_BYTE *)v6 & 1) != 1) && (v7 <= 0 || (*(_BYTE *)v8 & 1) != 1)
  13596.                         || (v4 = sub_41FE40((int)&v5, (int)&v17, (int)&v5)) == 0
  13597.                         && (v4 = sub_41FFD0((int)&v7, (int)&v19, (int)&v7)) == 0 )
  13598.                       {
  13599.                         v4 = sub_420890((int)&v5, (int)&v5);
  13600.                         if ( !v4 )
  13601.                         {
  13602.                           v4 = sub_420890((int)&v7, (int)&v7);
  13603.                           if ( !v4 )
  13604.                             continue;
  13605.                         }
  13606.                       }
  13607.                     }
  13608.                     goto LABEL_56;
  13609.                   }
  13610.                   if ( sub_41FA00((int)&v13, (int)&v11) == -1 )
  13611.                   {
  13612.                     v4 = sub_41FFD0((int)&v11, (int)&v13, (int)&v11);
  13613.                     if ( v4
  13614.                       || (v4 = sub_41FFD0((int)&v5, (int)&v9, (int)&v5)) != 0
  13615.                       || (v4 = sub_41FFD0((int)&v7, (int)&v15, (int)&v7)) != 0 )
  13616.                       goto LABEL_56;
  13617.                   }
  13618.                   else
  13619.                   {
  13620.                     v4 = sub_41FFD0((int)&v13, (int)&v11, (int)&v13);
  13621.                     if ( v4
  13622.                       || (v4 = sub_41FFD0((int)&v9, (int)&v5, (int)&v9)) != 0
  13623.                       || (v4 = sub_41FFD0((int)&v15, (int)&v7, (int)&v15)) != 0 )
  13624.                       goto LABEL_56;
  13625.                   }
  13626.                 }
  13627.                 while ( v13 );
  13628.                 if ( sub_41FA40((int)&v11, 1u) )
  13629.                 {
  13630.                   v4 = -3;
  13631.                 }
  13632.                 else
  13633.                 {
  13634.                   if ( sub_41FA40((int)&v5, 0) == -1 )
  13635.                   {
  13636.                     while ( 1 )
  13637.                     {
  13638.                       v4 = sub_41FE40((int)&v5, a2, (int)&v5);
  13639.                       if ( v4 )
  13640.                         break;
  13641.                       if ( sub_41FA40((int)&v5, 0) != -1 )
  13642.                         goto LABEL_52;
  13643.                     }
  13644.                   }
  13645.                   else
  13646.                   {
  13647. LABEL_52:
  13648.                     if ( sub_421430((int)&v5, a2) == -1 )
  13649.                     {
  13650. LABEL_55:
  13651.                       sub_4234B0((int)&v5, a3);
  13652.                       v4 = 0;
  13653.                     }
  13654.                     else
  13655.                     {
  13656.                       while ( 1 )
  13657.                       {
  13658.                         v4 = sub_41FFD0((int)&v5, a2, (int)&v5);
  13659.                         if ( v4 )
  13660.                           break;
  13661.                         if ( sub_421430((int)&v5, a2) == -1 )
  13662.                           goto LABEL_55;
  13663.                       }
  13664.                     }
  13665.                   }
  13666.                 }
  13667.               }
  13668.             }
  13669.           }
  13670.           else
  13671.           {
  13672.             v4 = -3;
  13673.           }
  13674.         }
  13675.       }
  13676. LABEL_56:
  13677.       sub_423670((int)&v19);
  13678.       result = v4;
  13679.     }
  13680.   }
  13681.   else
  13682.   {
  13683.     result = -3;
  13684.   }
  13685.   return result;
  13686. }
  13687.  
  13688. //----- (00423C50) --------------------------------------------------------
  13689. signed int __cdecl sub_423C50(int a1, int a2, int a3)
  13690. {
  13691.   signed int result; // eax@3
  13692.   signed int v4; // esi@5
  13693.   int v5; // edi@35
  13694.   int v6; // [sp+4h] [bp-60h]@9
  13695.   int v7; // [sp+Ch] [bp-58h]@35
  13696.   int v8; // [sp+10h] [bp-54h]@22
  13697.   int v9; // [sp+14h] [bp-50h]@8
  13698.   int v10; // [sp+20h] [bp-44h]@19
  13699.   int v11; // [sp+24h] [bp-40h]@7
  13700.   int v12; // [sp+30h] [bp-34h]@11
  13701.   int v13; // [sp+34h] [bp-30h]@13
  13702.   int v14; // [sp+40h] [bp-24h]@14
  13703.   char v15; // [sp+44h] [bp-20h]@4
  13704.   char v16; // [sp+54h] [bp-10h]@6
  13705.  
  13706.   if ( *(_DWORD *)a2 <= 0 || **(_BYTE **)(a2 + 12) & 1 )
  13707.   {
  13708.     result = sub_4236A0((int)&v15);
  13709.     if ( !result )
  13710.     {
  13711.       v4 = sub_41F8F0(a2, (int)&v15);
  13712.       if ( !v4 )
  13713.       {
  13714.         v4 = sub_423700(a1, a2, (int)&v16);
  13715.         if ( !v4 )
  13716.         {
  13717.           v4 = sub_41F8F0((int)&v15, (int)&v11);
  13718.           if ( !v4 )
  13719.           {
  13720.             v4 = sub_41F8F0((int)&v16, (int)&v9);
  13721.             if ( !v4 )
  13722.             {
  13723.               sub_424010((unsigned int)&v6, 1);
  13724.               do
  13725.               {
  13726.                 while ( v11 > 0 && !(*(_BYTE *)v12 & 1) )
  13727.                 {
  13728.                   v4 = sub_420890((int)&v11, (int)&v11);
  13729.                   if ( !v4 )
  13730.                   {
  13731.                     if ( v13 <= 0 || (*(_BYTE *)v14 & 1) != 1 || (v4 = sub_41FFD0((int)&v13, (int)&v15, (int)&v13)) == 0 )
  13732.                     {
  13733.                       v4 = sub_420890((int)&v13, (int)&v13);
  13734.                       if ( !v4 )
  13735.                         continue;
  13736.                     }
  13737.                   }
  13738.                   goto LABEL_39;
  13739.                 }
  13740.                 while ( v9 > 0 && !(*(_BYTE *)v10 & 1) )
  13741.                 {
  13742.                   v4 = sub_420890((int)&v9, (int)&v9);
  13743.                   if ( !v4 )
  13744.                   {
  13745.                     if ( v6 <= 0 || (*(_BYTE *)v8 & 1) != 1 || (v4 = sub_41FFD0((int)&v6, (int)&v15, (int)&v6)) == 0 )
  13746.                     {
  13747.                       v4 = sub_420890((int)&v6, (int)&v6);
  13748.                       if ( !v4 )
  13749.                         continue;
  13750.                     }
  13751.                   }
  13752.                   goto LABEL_39;
  13753.                 }
  13754.                 if ( sub_41FA00((int)&v11, (int)&v9) == -1 )
  13755.                 {
  13756.                   v4 = sub_41FFD0((int)&v9, (int)&v11, (int)&v9);
  13757.                   if ( v4 || (v4 = sub_41FFD0((int)&v6, (int)&v13, (int)&v6)) != 0 )
  13758.                     goto LABEL_39;
  13759.                 }
  13760.                 else
  13761.                 {
  13762.                   v4 = sub_41FFD0((int)&v11, (int)&v9, (int)&v11);
  13763.                   if ( v4 || (v4 = sub_41FFD0((int)&v13, (int)&v6, (int)&v13)) != 0 )
  13764.                     goto LABEL_39;
  13765.                 }
  13766.               }
  13767.               while ( v11 );
  13768.               if ( sub_41FA40((int)&v9, 1u) )
  13769.               {
  13770.                 v4 = -3;
  13771.               }
  13772.               else
  13773.               {
  13774.                 v5 = *(_DWORD *)(a1 + 8);
  13775.                 if ( v7 == 1 )
  13776.                 {
  13777.                   while ( 1 )
  13778.                   {
  13779.                     v4 = sub_41FE40((int)&v6, a2, (int)&v6);
  13780.                     if ( v4 )
  13781.                       break;
  13782.                     if ( v7 != 1 )
  13783.                       goto LABEL_38;
  13784.                   }
  13785.                 }
  13786.                 else
  13787.                 {
  13788. LABEL_38:
  13789.                   sub_4234B0((int)&v6, a3);
  13790.                   *(_DWORD *)(a3 + 8) = v5;
  13791.                   v4 = 0;
  13792.                 }
  13793.               }
  13794.             }
  13795.           }
  13796.         }
  13797.       }
  13798. LABEL_39:
  13799.       sub_423670((int)&v15);
  13800.       result = v4;
  13801.     }
  13802.   }
  13803.   else
  13804.   {
  13805.     result = -3;
  13806.   }
  13807.   return result;
  13808. }
  13809.  
  13810. //----- (00423F60) --------------------------------------------------------
  13811. signed int __cdecl sub_423F60(int a1, int a2)
  13812. {
  13813.   int v2; // ebp@1
  13814.   signed int result; // eax@2
  13815.   int v4; // esi@3
  13816.   unsigned int v5; // ebx@3
  13817.   int v6; // ecx@3
  13818.   unsigned int *v7; // edi@3
  13819.   unsigned int v8; // edx@4
  13820.   int v9; // eax@4
  13821.   unsigned int v10; // edx@4
  13822.   int v11; // edx@6
  13823.   int v12; // [sp+Ch] [bp+4h]@3
  13824.  
  13825.   v2 = a1;
  13826.   if ( *(_DWORD *)(a2 + 4) >= *(_DWORD *)a1 + 1 || (result = sub_421250(a2, *(_DWORD *)a1 + 1)) == 0 )
  13827.   {
  13828.     v12 = *(_DWORD *)a2;
  13829.     *(_DWORD *)a2 = *(_DWORD *)v2;
  13830.     v4 = *(_DWORD *)(a2 + 12);
  13831.     v5 = 0;
  13832.     v6 = 0;
  13833.     v7 = *(unsigned int **)(v2 + 12);
  13834.     if ( *(_DWORD *)v2 <= 0 )
  13835.       goto LABEL_13;
  13836.     do
  13837.     {
  13838.       v8 = *v7;
  13839.       v9 = v5 & 0xFFFFFFF | 2 * (*v7 & 0x7FFFFFF);
  13840.       ++v7;
  13841.       *(_DWORD *)v4 = v9;
  13842.       v10 = v8 >> 27;
  13843.       v4 += 4;
  13844.       ++v6;
  13845.       v5 = v10;
  13846.     }
  13847.     while ( v6 < *(_DWORD *)v2 );
  13848.     if ( v10 )
  13849.     {
  13850.       v11 = a2;
  13851.       *(_DWORD *)v4 = 1;
  13852.       ++*(_DWORD *)v11;
  13853.     }
  13854.     else
  13855.     {
  13856. LABEL_13:
  13857.       v11 = a2;
  13858.     }
  13859.     if ( *(_DWORD *)v11 < v12 )
  13860.       memset((void *)(*(_DWORD *)(v11 + 12) + 4 * *(_DWORD *)v11), 0, 4 * (v12 - *(_DWORD *)v11));
  13861.     *(_DWORD *)(v11 + 8) = *(_DWORD *)(v2 + 8);
  13862.     result = 0;
  13863.   }
  13864.   return result;
  13865. }
  13866.  
  13867. //----- (00424010) --------------------------------------------------------
  13868. int __cdecl sub_424010(unsigned int a1, int a2)
  13869. {
  13870.   int result; // eax@1
  13871.  
  13872.   sub_4213F0(a1);
  13873.   **(_DWORD **)(a1 + 12) = a2 & 0xFFFFFFF;
  13874.   result = **(_DWORD **)(a1 + 12) != 0;
  13875.   *(_DWORD *)a1 = result;
  13876.   return result;
  13877. }
  13878.  
  13879. //----- (00424040) --------------------------------------------------------
  13880. signed int __cdecl sub_424040(int a1, int a2, int a3)
  13881. {
  13882.   int v3; // ebx@1
  13883.   int v4; // ebp@1
  13884.   signed int result; // eax@2
  13885.   int v6; // ecx@3
  13886.   int v7; // eax@3
  13887.   int v8; // edi@3
  13888.   char *v9; // esi@3
  13889.   int v10; // edx@5
  13890.   int v11; // eax@6
  13891.   int v12; // edx@6
  13892.   int v13; // ecx@8
  13893.   char *v14; // ebp@9
  13894.   int v15; // ebx@11
  13895.   int v16; // edi@11
  13896.   char *v17; // esi@11
  13897.   unsigned __int64 v18; // qax@13
  13898.   __int64 v19; // qax@14
  13899.   char *v20; // edi@16
  13900.   int v21; // ecx@16
  13901.   char *v22; // esi@16
  13902.   int v23; // ebp@17
  13903.   __int64 v24; // qax@18
  13904.   void *v25; // edi@20
  13905.   char *v26; // ecx@20
  13906.   int v27; // edx@20
  13907.   int v28; // eax@21
  13908.   int v29; // [sp+8h] [bp-101Ch]@6
  13909.   int v30; // [sp+Ch] [bp-1018h]@12
  13910.   int v31; // [sp+10h] [bp-1014h]@9
  13911.   int v32; // [sp+14h] [bp-1010h]@9
  13912.   int v33; // [sp+18h] [bp-100Ch]@6
  13913.   int v34; // [sp+1Ch] [bp-1008h]@1
  13914.   int v35; // [sp+20h] [bp-1004h]@9
  13915.   char v36[4096]; // [sp+24h] [bp-1000h]@3
  13916.  
  13917.   v3 = a1;
  13918.   v4 = a2;
  13919.   v34 = *(_DWORD *)a1;
  13920.   if ( *(_DWORD *)(a1 + 4) >= *(_DWORD *)a2 + 1 || (result = sub_421250(a1, *(_DWORD *)a2 + 1)) == 0 )
  13921.   {
  13922.     v6 = *(_DWORD *)a1;
  13923.     v7 = *(_DWORD *)(a1 + 12);
  13924.     v8 = 0;
  13925.     v9 = v36;
  13926.     if ( *(_DWORD *)a1 > 0 )
  13927.     {
  13928.       v8 = *(_DWORD *)a1;
  13929.       do
  13930.       {
  13931.         v10 = *(_DWORD *)v7;
  13932.         v7 += 4;
  13933.         *(_DWORD *)v9 = v10;
  13934.         *((_DWORD *)v9 + 1) = 0;
  13935.         v9 += 8;
  13936.         --v6;
  13937.       }
  13938.       while ( v6 );
  13939.     }
  13940.     v11 = *(_DWORD *)a2;
  13941.     v29 = *(_DWORD *)a2;
  13942.     v12 = 2 * *(_DWORD *)a2 + 1;
  13943.     v33 = 2 * *(_DWORD *)a2 + 1;
  13944.     if ( v8 < v12 )
  13945.     {
  13946.       *(_DWORD *)v9 = 0;
  13947.       *((_DWORD *)v9 + 1) = 0;
  13948.       memcpy(v9 + 8, v9, 4 * ((unsigned int)(8 * (v12 - v8) - 5) >> 2));
  13949.     }
  13950.     v13 = 0;
  13951.     if ( v11 > 0 )
  13952.     {
  13953.       v14 = v36;
  13954.       v32 = *(_DWORD *)(a2 + 12);
  13955.       v31 = v11;
  13956.       v35 = v11;
  13957.       while ( 1 )
  13958.       {
  13959.         v15 = v32;
  13960.         v16 = a3 * *(_DWORD *)v14 & 0xFFFFFFF;
  13961.         v17 = v14;
  13962.         if ( v11 > 0 )
  13963.         {
  13964.           v30 = v11;
  13965.           do
  13966.           {
  13967.             v18 = *(_DWORD *)v15 * (unsigned __int64)(unsigned int)v16;
  13968.             *(_DWORD *)v17 += v18;
  13969.             v15 += 4;
  13970.             *((_DWORD *)v17 + 1) = (v18 + *(_QWORD *)v17) >> 32;
  13971.             v17 += 8;
  13972.             --v30;
  13973.           }
  13974.           while ( v30 );
  13975.         }
  13976.         LODWORD(v19) = unknown_libname_1(28);
  13977.         *((_QWORD *)v14 + 1) += v19;
  13978.         v14 += 8;
  13979.         --v31;
  13980.         if ( !v31 )
  13981.           break;
  13982.         v11 = v29;
  13983.       }
  13984.       v3 = a1;
  13985.       v13 = v35;
  13986.       v11 = v29;
  13987.       v12 = v33;
  13988.       v4 = a2;
  13989.     }
  13990.     v20 = &v36[8 * v13];
  13991.     v21 = v13 + 1;
  13992.     v22 = &v36[8 * v21];
  13993.     if ( v21 <= v12 )
  13994.     {
  13995.       v23 = v12 - v21 + 1;
  13996.       do
  13997.       {
  13998.         LODWORD(v24) = unknown_libname_1(28);
  13999.         *(_DWORD *)v22 += v24;
  14000.         v20 += 8;
  14001.         *((_DWORD *)v22 + 1) = (unsigned __int64)(v24 + *(_QWORD *)v22) >> 32;
  14002.         v22 += 8;
  14003.         --v23;
  14004.       }
  14005.       while ( v23 );
  14006.       v11 = v29;
  14007.       v4 = a2;
  14008.     }
  14009.     v25 = *(void **)(v3 + 12);
  14010.     v26 = &v36[8 * v11];
  14011.     v27 = 0;
  14012.     if ( v11 + 1 > 0 )
  14013.     {
  14014.       do
  14015.       {
  14016.         v25 = (char *)v25 + 4;
  14017.         v28 = *(_DWORD *)v26 & 0xFFFFFFF;
  14018.         v26 += 8;
  14019.         *((_DWORD *)v25 - 1) = v28;
  14020.         ++v27;
  14021.       }
  14022.       while ( v27 < *(_DWORD *)v4 + 1 );
  14023.     }
  14024.     if ( v27 < v34 )
  14025.       memset(v25, 0, 4 * (v34 - v27));
  14026.     *(_DWORD *)v3 = *(_DWORD *)v4 + 1;
  14027.     sub_4212C0(v3);
  14028.     if ( sub_421430(v3, v4) == -1 )
  14029.       result = 0;
  14030.     else
  14031.       result = sub_421850((signed int *)v3, (signed int *)v4, v3);
  14032.   }
  14033.   return result;
  14034. }
  14035. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  14036. // 424040: using guessed type char var_1000[4096];
  14037.  
  14038. //----- (00424250) --------------------------------------------------------
  14039. signed int __cdecl sub_424250(int a1, int a2, int a3, int a4, int a5)
  14040. {
  14041.   int v5; // eax@1
  14042.   signed int result; // eax@12
  14043.   signed int v7; // ebx@13
  14044.   int v8; // esi@13
  14045.   int v9; // edi@14
  14046.   signed int v10; // ebx@15
  14047.   int v11; // ebp@19
  14048.   signed int v12; // esi@19
  14049.   int v13; // esi@24
  14050.   int v14; // edi@24
  14051.   int v15; // ebx@43
  14052.   char *v16; // edi@44
  14053.   signed int v17; // edi@48
  14054.   int v18; // edx@48
  14055.   int v19; // edx@48
  14056.   int v20; // ebx@48
  14057.   unsigned int v21; // eax@52
  14058.   int v22; // ebx@55
  14059.   int j; // edi@55
  14060.   void *v24; // edi@71
  14061.   bool v25; // zf@72
  14062.   int v26; // edi@82
  14063.   int v27; // ebx@82
  14064.   int v28; // [sp+0h] [bp-1034h]@19
  14065.   void *v29; // [sp+4h] [bp-1030h]@22
  14066.   int v30; // [sp+8h] [bp-102Ch]@39
  14067.   int v31; // [sp+Ch] [bp-1028h]@2
  14068.   int v32; // [sp+10h] [bp-1024h]@13
  14069.   int v33; // [sp+14h] [bp-1020h]@48
  14070.   int i; // [sp+18h] [bp-101Ch]@39
  14071.   char v35; // [sp+1Ch] [bp-1018h]@32
  14072.   int v36; // [sp+2Ch] [bp-1008h]@13
  14073.   unsigned int v37; // [sp+30h] [bp-1004h]@48
  14074.   char v38[16]; // [sp+34h] [bp-1000h]@14
  14075.   char v39; // [sp+44h] [bp-FF0h]@12
  14076.  
  14077.   v5 = sub_41FA70(a2);
  14078.   if ( v5 > 7 )
  14079.   {
  14080.     if ( v5 > 36 )
  14081.     {
  14082.       if ( v5 > 140 )
  14083.       {
  14084.         if ( v5 > 450 )
  14085.         {
  14086.           if ( v5 > 1303 )
  14087.             v31 = (v5 > 3529) + 7;
  14088.           else
  14089.             v31 = 6;
  14090.         }
  14091.         else
  14092.         {
  14093.           v31 = 5;
  14094.         }
  14095.       }
  14096.       else
  14097.       {
  14098.         v31 = 4;
  14099.       }
  14100.     }
  14101.     else
  14102.     {
  14103.       v31 = 3;
  14104.     }
  14105.   }
  14106.   else
  14107.   {
  14108.     v31 = 2;
  14109.   }
  14110.   result = sub_41F810((int)&v39);
  14111.   if ( !result )
  14112.   {
  14113.     v7 = 1 << (v31 - 1);
  14114.     v8 = v7;
  14115.     v36 = 1 << (v31 - 1);
  14116.     v32 = 1 << v31;
  14117.     if ( v7 >= 1 << v31 )
  14118.       goto LABEL_18;
  14119.     v9 = (int)&v38[16 * v7];
  14120.     do
  14121.     {
  14122.       v10 = sub_41F810(v9);
  14123.       if ( v10 )
  14124.       {
  14125.         if ( v36 < v8 )
  14126.         {
  14127.           v13 = v8 - v36;
  14128.           v14 = (int)&v38[16 * v36];
  14129.           do
  14130.           {
  14131.             sub_41F860(v14);
  14132.             v14 += 16;
  14133.             --v13;
  14134.           }
  14135.           while ( v13 );
  14136.         }
  14137.         sub_41F860((int)&v39);
  14138.         return v10;
  14139.       }
  14140.       ++v8;
  14141.       v9 += 16;
  14142.     }
  14143.     while ( v8 < v32 );
  14144.     v7 = v36;
  14145. LABEL_18:
  14146.     if ( a5 )
  14147.     {
  14148.       if ( a5 == 1 )
  14149.       {
  14150.         v11 = a3;
  14151.         sub_425470(a3, (int)&v28);
  14152.         v29 = sub_425380;
  14153.       }
  14154.       else
  14155.       {
  14156.         v11 = a3;
  14157.         v12 = sub_4252F0(a3, (int)&v28);
  14158.         if ( v12 )
  14159.           goto LABEL_81;
  14160.         v29 = sub_425230;
  14161.       }
  14162.     }
  14163.     else
  14164.     {
  14165.       v11 = a3;
  14166.       v12 = sub_420D30(a3, (int)&v28);
  14167.       if ( v12 )
  14168.         goto LABEL_81;
  14169.       if ( (unsigned int)(2 * *(_DWORD *)a3 + 1) >= 0x200 || *(_DWORD *)a3 >= 0x100u )
  14170.         v29 = sub_420E30;
  14171.       else
  14172.         v29 = sub_424040;
  14173.     }
  14174.     v12 = sub_41F810((int)&v35);
  14175.     if ( !v12 )
  14176.     {
  14177.       if ( a5 )
  14178.       {
  14179.         sub_424010((unsigned int)&v35, 1);
  14180.         v12 = sub_423700(a1, v11, (int)&v39);
  14181.         if ( v12 )
  14182.           goto LABEL_80;
  14183.       }
  14184.       else
  14185.       {
  14186.         v12 = sub_420D90((unsigned int)&v35, (signed int *)v11);
  14187.         if ( v12 || (v12 = sub_420C00(a1, (int)&v35, v11, (int)&v39)) != 0 )
  14188.           goto LABEL_80;
  14189.       }
  14190.       v12 = sub_41F8F0((int)&v39, (int)&v38[16 * v7]);
  14191.       if ( v12 )
  14192.         goto LABEL_80;
  14193.       v30 = 0;
  14194.       for ( i = v31 - 1; v30 < i; ++v30 )
  14195.       {
  14196.         v12 = sub_4202E0(&v38[16 * v7], &v38[16 * v7]);
  14197.         if ( !v12 )
  14198.         {
  14199.           v12 = ((int (__cdecl *)(char *, int, int))v29)(&v38[16 * v7], v11, v28);
  14200.           if ( !v12 )
  14201.             continue;
  14202.         }
  14203.         goto LABEL_80;
  14204.       }
  14205.       v15 = v7 + 1;
  14206.       if ( v15 < v32 )
  14207.       {
  14208.         v16 = &v38[16 * v15];
  14209.         do
  14210.         {
  14211.           v12 = sub_420150(v16 - 16, &v39, v16);
  14212.           if ( v12 || (v12 = ((int (__cdecl *)(char *, int, int))v29)(v16, v11, v28)) != 0 )
  14213.             goto LABEL_79;
  14214.           ++v15;
  14215.           v16 += 16;
  14216.         }
  14217.         while ( v15 < v32 );
  14218.       }
  14219.       v17 = 0;
  14220.       v30 = 1;
  14221.       v37 = 0;
  14222.       v18 = *(_DWORD *)a2;
  14223.       v33 = 0;
  14224.       v19 = v18 - 1;
  14225.       v20 = 0;
  14226.       i = v19;
  14227.       while ( 1 )
  14228.       {
  14229.         --v30;
  14230.         if ( !v30 )
  14231.         {
  14232.           if ( v19 == -1 )
  14233.           {
  14234.             if ( v17 != 2 || v20 <= 0 )
  14235.             {
  14236. LABEL_76:
  14237.               if ( a5 || (v12 = ((int (__cdecl *)(char *, _DWORD, _DWORD))v29)(&v35, v11, v28)) == 0 )
  14238.               {
  14239.                 sub_4234B0((int)&v35, a4);
  14240.                 v12 = 0;
  14241.               }
  14242.             }
  14243.             else
  14244.             {
  14245.               v30 = 0;
  14246.               while ( 1 )
  14247.               {
  14248.                 v12 = sub_4202E0(&v35, &v35);
  14249.                 if ( v12 )
  14250.                   break;
  14251.                 v24 = v29;
  14252.                 v12 = ((int (__cdecl *)(char *, int, int))v29)(&v35, v11, v28);
  14253.                 if ( v12 )
  14254.                   break;
  14255.                 v25 = (v32 & 2 * v33) == 0;
  14256.                 v33 *= 2;
  14257.                 if ( !v25 )
  14258.                 {
  14259.                   v12 = sub_420150(&v35, &v39, &v35);
  14260.                   if ( v12 )
  14261.                     break;
  14262.                   v12 = ((int (__cdecl *)(char *, int, int))v24)(&v35, v11, v28);
  14263.                   if ( v12 )
  14264.                     break;
  14265.                 }
  14266.                 ++v30;
  14267.                 if ( v30 >= v20 )
  14268.                   goto LABEL_76;
  14269.               }
  14270.             }
  14271. LABEL_79:
  14272.             v7 = v36;
  14273. LABEL_80:
  14274.             sub_41F860((int)&v35);
  14275.             break;
  14276.           }
  14277.           --v19;
  14278.           i = v19;
  14279.           v30 = 28;
  14280.           v37 = *(_DWORD *)(*(_DWORD *)(a2 + 12) + 4 * v19 + 4);
  14281.         }
  14282.         v21 = (v37 >> 27) & 1;
  14283.         v37 *= 2;
  14284.         if ( v17 )
  14285.         {
  14286.           if ( v17 == 1 && !v21 )
  14287.           {
  14288.             v12 = sub_4202E0(&v35, &v35);
  14289.             if ( v12 || (v12 = ((int (__cdecl *)(_DWORD, _DWORD, _DWORD))v29)(&v35, v11, v28)) != 0 )
  14290.               goto LABEL_79;
  14291.             v19 = i;
  14292.             continue;
  14293.           }
  14294.         }
  14295.         else
  14296.         {
  14297.           if ( !v21 )
  14298.             continue;
  14299.         }
  14300.         ++v20;
  14301.         v17 = 2;
  14302.         v33 |= v21 << (v31 - v20);
  14303.         if ( v20 == v31 )
  14304.         {
  14305.           v22 = v31;
  14306.           for ( j = 0; j < v22; ++j )
  14307.           {
  14308.             v12 = sub_4202E0(&v35, &v35);
  14309.             if ( v12 )
  14310.               goto LABEL_79;
  14311.             v12 = ((int (__cdecl *)(_DWORD, _DWORD, _DWORD))v29)(&v35, v11, v28);
  14312.             if ( v12 )
  14313.               goto LABEL_79;
  14314.           }
  14315.           v12 = sub_420150(&v35, &v38[16 * v33], &v35);
  14316.           v20 = 0;
  14317.           if ( v12 || (v12 = ((int (__cdecl *)(_DWORD, _DWORD, _DWORD))v29)(&v35, v11, v28)) != 0 )
  14318.             goto LABEL_79;
  14319.           v19 = i;
  14320.           v33 = 0;
  14321.           v17 = 1;
  14322.         }
  14323.       }
  14324.     }
  14325. LABEL_81:
  14326.     sub_41F860((int)&v39);
  14327.     if ( v7 < v32 )
  14328.     {
  14329.       v26 = (int)&v38[16 * v7];
  14330.       v27 = v32 - v7;
  14331.       do
  14332.       {
  14333.         sub_41F860(v26);
  14334.         v26 += 16;
  14335.         --v27;
  14336.       }
  14337.       while ( v27 );
  14338.     }
  14339.     result = v12;
  14340.   }
  14341.   return result;
  14342. }
  14343. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  14344. // 4202E0: using guessed type _DWORD __cdecl sub_4202E0(_DWORD, _DWORD);
  14345. // 424250: using guessed type char var_1000[16];
  14346.  
  14347. //----- (00424810) --------------------------------------------------------
  14348. signed int __cdecl sub_424810(int a1)
  14349. {
  14350.   signed int v1; // eax@1
  14351.   int v3; // eax@5
  14352.   signed int v4; // edi@5
  14353.   signed int v5; // ecx@5
  14354.   int v6; // edx@6
  14355.  
  14356.   v1 = *(_DWORD *)a1;
  14357.   if ( !*(_DWORD *)a1 )
  14358.     return 0;
  14359.   if ( v1 != 1 )
  14360.   {
  14361.     if ( v1 > 1 )
  14362.     {
  14363.       v3 = sub_41FA70(a1);
  14364.       v4 = 28;
  14365.       v5 = 1;
  14366.       if ( v3 > 28 )
  14367.       {
  14368.         v6 = *(_DWORD *)(a1 + 12) + 4;
  14369.         while ( v5 & *(_DWORD *)v6 )
  14370.         {
  14371.           v5 *= 2;
  14372.           if ( (unsigned int)v5 > 0xFFFFFFF )
  14373.           {
  14374.             v6 += 4;
  14375.             v5 = 1;
  14376.           }
  14377.           ++v4;
  14378.           if ( v4 >= v3 )
  14379.             return 1;
  14380.         }
  14381.         return 0;
  14382.       }
  14383.     }
  14384.   }
  14385.   return 1;
  14386. }
  14387.  
  14388. //----- (00424870) --------------------------------------------------------
  14389. signed int __cdecl sub_424870(int a1)
  14390. {
  14391.   signed int v1; // edx@1
  14392.   signed int v3; // ecx@3
  14393.   int v4; // eax@4
  14394.  
  14395.   v1 = *(_DWORD *)a1;
  14396.   if ( *(_DWORD *)a1 < 2 )
  14397.     return 0;
  14398.   v3 = 1;
  14399.   if ( v1 > 1 )
  14400.   {
  14401.     v4 = *(_DWORD *)(a1 + 12) + 4;
  14402.     while ( *(_DWORD *)v4 == 268435455 )
  14403.     {
  14404.       ++v3;
  14405.       v4 += 4;
  14406.       if ( v3 >= v1 )
  14407.         return 1;
  14408.     }
  14409.     return 0;
  14410.   }
  14411.   return 1;
  14412. }
  14413.  
  14414. //----- (004248B0) --------------------------------------------------------
  14415. signed int __cdecl sub_4248B0(int a1, int a2, int a3, int a4, int a5)
  14416. {
  14417.   int v5; // eax@1
  14418.   signed int result; // eax@12
  14419.   int v7; // ebp@13
  14420.   signed int v8; // ebx@13
  14421.   signed int v9; // esi@13
  14422.   int v10; // edi@14
  14423.   signed int v11; // ebx@15
  14424.   signed int v12; // esi@18
  14425.   int v13; // esi@23
  14426.   int v14; // edi@23
  14427.   char *v15; // edi@29
  14428.   int i; // ebx@30
  14429.   int v17; // ebx@34
  14430.   char *v18; // edi@35
  14431.   int v19; // ebp@39
  14432.   signed int v20; // edi@40
  14433.   int v21; // esi@40
  14434.   int v22; // esi@40
  14435.   int v23; // ebx@40
  14436.   unsigned int v24; // eax@44
  14437.   int j; // edi@47
  14438.   int v26; // edi@61
  14439.   bool v27; // zf@64
  14440.   int v28; // edi@73
  14441.   int v29; // ebx@73
  14442.   int v30; // [sp+0h] [bp-1040h]@2
  14443.   void *v31; // [sp+4h] [bp-103Ch]@21
  14444.   signed int v32; // [sp+8h] [bp-1038h]@13
  14445.   signed int v33; // [sp+Ch] [bp-1034h]@13
  14446.   int v34; // [sp+10h] [bp-1030h]@40
  14447.   char v35; // [sp+14h] [bp-102Ch]@39
  14448.   int v36; // [sp+24h] [bp-101Ch]@40
  14449.   unsigned int v37; // [sp+28h] [bp-1018h]@40
  14450.   int v38; // [sp+2Ch] [bp-1014h]@40
  14451.   char v39; // [sp+30h] [bp-1010h]@18
  14452.   char v40[16]; // [sp+40h] [bp-1000h]@14
  14453.   char v41; // [sp+50h] [bp-FF0h]@12
  14454.  
  14455.   v5 = sub_41FA70(a2);
  14456.   if ( v5 > 7 )
  14457.   {
  14458.     if ( v5 > 36 )
  14459.     {
  14460.       if ( v5 > 140 )
  14461.       {
  14462.         if ( v5 > 450 )
  14463.         {
  14464.           if ( v5 > 1303 )
  14465.             v30 = (v5 > 3529) + 7;
  14466.           else
  14467.             v30 = 6;
  14468.         }
  14469.         else
  14470.         {
  14471.           v30 = 5;
  14472.         }
  14473.       }
  14474.       else
  14475.       {
  14476.         v30 = 4;
  14477.       }
  14478.     }
  14479.     else
  14480.     {
  14481.       v30 = 3;
  14482.     }
  14483.   }
  14484.   else
  14485.   {
  14486.     v30 = 2;
  14487.   }
  14488.   result = sub_41F810((int)&v41);
  14489.   if ( !result )
  14490.   {
  14491.     v7 = v30 - 1;
  14492.     v8 = 1 << (v30 - 1);
  14493.     v9 = v8;
  14494.     v33 = 1 << (v30 - 1);
  14495.     v32 = 1 << v30;
  14496.     if ( v8 >= 1 << v30 )
  14497.       goto LABEL_18;
  14498.     v10 = (int)&v40[16 * v8];
  14499.     do
  14500.     {
  14501.       v11 = sub_41F810(v10);
  14502.       if ( v11 )
  14503.       {
  14504.         if ( v33 < v9 )
  14505.         {
  14506.           v13 = v9 - v33;
  14507.           v14 = (int)&v40[16 * v33];
  14508.           do
  14509.           {
  14510.             sub_41F860(v14);
  14511.             v14 += 16;
  14512.             --v13;
  14513.           }
  14514.           while ( v13 );
  14515.         }
  14516.         sub_41F860((int)&v41);
  14517.         return v11;
  14518.       }
  14519.       ++v9;
  14520.       v10 += 16;
  14521.     }
  14522.     while ( v9 < v32 );
  14523.     v8 = 1 << (v30 - 1);
  14524. LABEL_18:
  14525.     v12 = sub_41F810((int)&v39);
  14526.     if ( !v12 )
  14527.     {
  14528.       if ( a5 )
  14529.       {
  14530.         v12 = sub_425550(a3, (int)&v39);
  14531.         if ( v12 )
  14532.           goto LABEL_71;
  14533.         v31 = sub_425490;
  14534.       }
  14535.       else
  14536.       {
  14537.         v12 = sub_425720((unsigned int)&v39, a3);
  14538.         if ( v12 )
  14539.           goto LABEL_71;
  14540.         v31 = sub_4255B0;
  14541.       }
  14542.       v12 = sub_423700(a1, a3, (int)&v41);
  14543.       if ( !v12 )
  14544.       {
  14545.         v15 = &v40[16 * v8];
  14546.         v12 = sub_41F8F0((int)&v41, (int)&v40[16 * v8]);
  14547.         if ( !v12 )
  14548.         {
  14549.           for ( i = 0; i < v7; ++i )
  14550.           {
  14551.             v12 = sub_4202E0(v15, v15);
  14552.             if ( !v12 )
  14553.             {
  14554.               v12 = ((int (__cdecl *)(char *, int, char *))v31)(v15, a3, &v39);
  14555.               if ( !v12 )
  14556.                 continue;
  14557.             }
  14558.             goto LABEL_70;
  14559.           }
  14560.           v17 = v33 + 1;
  14561.           if ( v33 + 1 < v32 )
  14562.           {
  14563.             v18 = &v40[16 * v17];
  14564.             do
  14565.             {
  14566.               v12 = sub_420150(v18 - 16, &v41, v18);
  14567.               if ( v12 || (v12 = ((int (__cdecl *)(char *, int, char *))v31)(v18, a3, &v39)) != 0 )
  14568.                 goto LABEL_70;
  14569.               ++v17;
  14570.               v18 += 16;
  14571.             }
  14572.             while ( v17 < v32 );
  14573.           }
  14574.           v12 = sub_41F810((int)&v35);
  14575.           v19 = 0;
  14576.           if ( v12 )
  14577.             goto LABEL_70;
  14578.           sub_424010((unsigned int)&v35, 1);
  14579.           v20 = 0;
  14580.           v36 = 1;
  14581.           v21 = *(_DWORD *)a2;
  14582.           v37 = 0;
  14583.           v22 = v21 - 1;
  14584.           v23 = 0;
  14585.           v38 = v22;
  14586.           v34 = 0;
  14587.           while ( 1 )
  14588.           {
  14589.             --v36;
  14590.             if ( !v36 )
  14591.             {
  14592.               if ( v22 == -1 )
  14593.               {
  14594.                 if ( v20 != 2 || v23 <= 0 || (v26 = 0, v23 <= 0) )
  14595.                 {
  14596. LABEL_68:
  14597.                   sub_4234B0((int)&v35, a4);
  14598.                   v12 = 0;
  14599.                 }
  14600.                 else
  14601.                 {
  14602.                   while ( 1 )
  14603.                   {
  14604.                     v12 = sub_4202E0(&v35, &v35);
  14605.                     if ( v12 )
  14606.                       break;
  14607.                     v12 = ((int (__cdecl *)(char *, int, char *))v31)(&v35, a3, &v39);
  14608.                     if ( v12 )
  14609.                       break;
  14610.                     v27 = (v32 & 2 * v34) == 0;
  14611.                     v34 *= 2;
  14612.                     if ( !v27 )
  14613.                     {
  14614.                       v12 = sub_420150(&v35, &v41, &v35);
  14615.                       if ( v12 )
  14616.                         break;
  14617.                       v12 = ((int (__cdecl *)(char *, _DWORD, _DWORD))v31)(&v35, a3, &v39);
  14618.                       if ( v12 )
  14619.                         break;
  14620.                     }
  14621.                     ++v26;
  14622.                     if ( v26 >= v23 )
  14623.                       goto LABEL_68;
  14624.                   }
  14625.                 }
  14626. LABEL_69:
  14627.                 sub_41F860((int)&v35);
  14628. LABEL_70:
  14629.                 v8 = 1 << (v30 - 1);
  14630.                 break;
  14631.               }
  14632.               --v22;
  14633.               v38 = v22;
  14634.               v36 = 28;
  14635.               v37 = *(_DWORD *)(*(_DWORD *)(a2 + 12) + 4 * v22 + 4);
  14636.             }
  14637.             v24 = (v37 >> 27) & 1;
  14638.             v37 *= 2;
  14639.             if ( v20 )
  14640.             {
  14641.               if ( v20 == 1 && !v24 )
  14642.               {
  14643.                 v12 = sub_4202E0(&v35, &v35);
  14644.                 if ( v12 || (v12 = ((int (__cdecl *)(_DWORD, _DWORD, _DWORD))v31)(&v35, a3, &v39)) != 0 )
  14645.                   goto LABEL_69;
  14646.                 v22 = v38;
  14647.                 continue;
  14648.               }
  14649.             }
  14650.             else
  14651.             {
  14652.               if ( !v24 )
  14653.                 continue;
  14654.             }
  14655.             ++v23;
  14656.             v20 = 2;
  14657.             v19 |= v24 << (v30 - v23);
  14658.             v34 = v19;
  14659.             if ( v23 == v30 )
  14660.             {
  14661.               for ( j = 0; j < v30; ++j )
  14662.               {
  14663.                 v12 = sub_4202E0(&v35, &v35);
  14664.                 if ( v12 )
  14665.                   goto LABEL_69;
  14666.                 v12 = ((int (__cdecl *)(_DWORD, _DWORD, _DWORD))v31)(&v35, a3, &v39);
  14667.                 if ( v12 )
  14668.                   goto LABEL_69;
  14669.               }
  14670.               v12 = sub_420150(&v35, &v40[16 * v19], &v35);
  14671.               v23 = 0;
  14672.               if ( v12 || (v12 = ((int (__cdecl *)(_DWORD, _DWORD, _DWORD))v31)(&v35, a3, &v39)) != 0 )
  14673.                 goto LABEL_69;
  14674.               v22 = v38;
  14675.               v34 = 0;
  14676.               v20 = 1;
  14677.               v19 = 0;
  14678.             }
  14679.           }
  14680.         }
  14681.       }
  14682. LABEL_71:
  14683.       sub_41F860((int)&v39);
  14684.     }
  14685.     sub_41F860((int)&v41);
  14686.     if ( v8 < v32 )
  14687.     {
  14688.       v28 = (int)&v40[16 * v8];
  14689.       v29 = v32 - v8;
  14690.       do
  14691.       {
  14692.         sub_41F860(v28);
  14693.         v28 += 16;
  14694.         --v29;
  14695.       }
  14696.       while ( v29 );
  14697.     }
  14698.     result = v12;
  14699.   }
  14700.   return result;
  14701. }
  14702. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  14703. // 4202E0: using guessed type _DWORD __cdecl sub_4202E0(_DWORD, _DWORD);
  14704. // 4248B0: using guessed type char var_1000[16];
  14705.  
  14706. //----- (00424E00) --------------------------------------------------------
  14707. signed int __cdecl sub_424E00(int a1)
  14708. {
  14709.   signed int result; // eax@1
  14710.   int v2; // esi@4
  14711.   int v3; // ecx@5
  14712.   signed int v4; // edx@5
  14713.  
  14714.   result = *(_DWORD *)a1;
  14715.   if ( !*(_DWORD *)a1 )
  14716.     goto LABEL_13;
  14717.   if ( result == 1 )
  14718.     return result;
  14719.   if ( result > 1 )
  14720.   {
  14721.     v2 = 0;
  14722.     if ( result > 0 )
  14723.     {
  14724.       v3 = *(_DWORD *)(a1 + 12);
  14725.       v4 = *(_DWORD *)a1;
  14726.       do
  14727.       {
  14728.         if ( *(_DWORD *)v3 == 268435455 )
  14729.           ++v2;
  14730.         v3 += 4;
  14731.         --v4;
  14732.       }
  14733.       while ( v4 );
  14734.     }
  14735.     result = v2 >= result / 2;
  14736.   }
  14737.   else
  14738.   {
  14739. LABEL_13:
  14740.     result = 0;
  14741.   }
  14742.   return result;
  14743. }
  14744.  
  14745. //----- (00424E40) --------------------------------------------------------
  14746. signed int __cdecl sub_424E40(int a1, int a2, int a3)
  14747. {
  14748.   signed int result; // eax@2
  14749.   signed int v4; // esi@4
  14750.   int v5; // ebx@6
  14751.   signed int v6; // edi@11
  14752.   int v7; // ebx@11
  14753.   char v8; // [sp+8h] [bp-30h]@7
  14754.   char v9; // [sp+18h] [bp-20h]@3
  14755.   char v10; // [sp+28h] [bp-10h]@5
  14756.  
  14757.   *(_DWORD *)a3 = 0;
  14758.   if ( sub_41FA40(a2, 1u) == 1 )
  14759.   {
  14760.     result = sub_4216B0((int)&v9, a1);
  14761.     if ( !result )
  14762.     {
  14763.       v4 = sub_420040((int)&v9, 1, (int)&v9);
  14764.       if ( !v4 )
  14765.       {
  14766.         v4 = sub_4216B0((int)&v10, (int)&v9);
  14767.         if ( !v4 )
  14768.         {
  14769.           v5 = sub_41FAA0((int)&v10);
  14770.           v4 = sub_4216E0((int)&v10, v5, (unsigned int)&v10, 0);
  14771.           if ( !v4 )
  14772.           {
  14773.             v4 = sub_41F810((int)&v8);
  14774.             if ( !v4 )
  14775.             {
  14776.               v4 = sub_420FA0(a2, &v10, a1, &v8);
  14777.               if ( !v4 )
  14778.               {
  14779.                 if ( !sub_41FA40((int)&v8, 1u) || !sub_41FA00((int)&v8, (int)&v9) )
  14780.                   goto LABEL_23;
  14781.                 v6 = 1;
  14782.                 v7 = v5 - 1;
  14783.                 if ( v7 >= 1 )
  14784.                 {
  14785.                   while ( sub_41FA00((int)&v8, (int)&v9) )
  14786.                   {
  14787.                     v4 = sub_420C70((int)&v8, a1, (int)&v8);
  14788.                     if ( v4 || !sub_41FA40((int)&v8, 1u) )
  14789.                       goto LABEL_18;
  14790.                     ++v6;
  14791.                     if ( v6 > v7 )
  14792.                       break;
  14793.                   }
  14794.                 }
  14795.                 if ( !sub_41FA00((int)&v8, (int)&v9) )
  14796. LABEL_23:
  14797.                   *(_DWORD *)a3 = 1;
  14798.               }
  14799. LABEL_18:
  14800.               sub_41F860((int)&v8);
  14801.             }
  14802.           }
  14803.           sub_41F860((int)&v10);
  14804.         }
  14805.       }
  14806.       sub_41F860((int)&v9);
  14807.       result = v4;
  14808.     }
  14809.   }
  14810.   else
  14811.   {
  14812.     result = -3;
  14813.   }
  14814.   return result;
  14815. }
  14816. // 420FA0: using guessed type _DWORD __cdecl sub_420FA0(_DWORD, _DWORD, _DWORD, _DWORD);
  14817.  
  14818. //----- (00424FF0) --------------------------------------------------------
  14819. signed int __cdecl sub_424FF0(int a1, int a2)
  14820. {
  14821.   int v2; // ebx@1
  14822.   int *v3; // esi@1
  14823.   signed int result; // eax@2
  14824.  
  14825.   v2 = a2;
  14826.   *(_DWORD *)a2 = 0;
  14827.   v3 = (int *)&unk_4381E4;
  14828.   while ( 1 )
  14829.   {
  14830.     result = sub_420930(a1, *v3, (int)&a2);
  14831.     if ( result )
  14832.       break;
  14833.     if ( !a2 )
  14834.     {
  14835.       *(_DWORD *)v2 = 1;
  14836.       return 0;
  14837.     }
  14838.     ++v3;
  14839.     if ( (signed int)v3 >= (signed int)&unk_4385E4 )
  14840.       return 0;
  14841.   }
  14842.   return result;
  14843. }
  14844.  
  14845. //----- (00425040) --------------------------------------------------------
  14846. signed int __cdecl sub_425040(int a1, int a2, int a3)
  14847. {
  14848.   int v3; // ebx@1
  14849.   signed int result; // eax@1
  14850.   int v5; // edx@2
  14851.   int v6; // ebp@2
  14852.   int v7; // esi@2
  14853.   int v8; // edi@2
  14854.   int v9; // ebp@2
  14855.   unsigned __int64 v10; // qax@5
  14856.   __int64 v11; // qax@7
  14857.   unsigned int v12; // ebp@7
  14858.   int v13; // ebx@7
  14859.   unsigned __int64 v14; // kr00_8@7
  14860.   unsigned __int8 v15; // cf@8
  14861.   int v16; // [sp+4h] [bp-1Ch]@2
  14862.   int v17; // [sp+10h] [bp-10h]@1
  14863.   int v18; // [sp+18h] [bp-8h]@2
  14864.   int v19; // [sp+1Ch] [bp-4h]@11
  14865.  
  14866.   v3 = a1;
  14867.   result = sub_4235D0((int)&v17, *(_DWORD *)a1);
  14868.   if ( !result )
  14869.   {
  14870.     v5 = *(_DWORD *)(a1 + 8);
  14871.     v6 = *(_DWORD *)a1;
  14872.     v17 = v6;
  14873.     v7 = 0;
  14874.     v8 = 0;
  14875.     v9 = v6 - 1;
  14876.     v18 = v5;
  14877.     v16 = v9;
  14878.     if ( v9 >= 0 )
  14879.     {
  14880.       while ( 1 )
  14881.       {
  14882.         v10 = __PAIR__(v8, v7) << 28;
  14883.         v7 = (v7 << 28) | *(_DWORD *)(*(_DWORD *)(v3 + 12) + 4 * v9--);
  14884.         v8 = HIDWORD(v10);
  14885.         if ( HIDWORD(v10) || (unsigned int)v7 >= 3 )
  14886.         {
  14887.           LODWORD(v11) = unknown_libname_1(28);
  14888.           v12 = HIDWORD(v11);
  14889.           v13 = v11;
  14890.           v14 = -3 * v11 + __PAIR__(v8, v7);
  14891.           v8 = (-3 * v11 + __PAIR__(v8, v7)) >> 32;
  14892.           v7 = v14;
  14893.           if ( __PAIR__(v8, (unsigned int)v14) >= 3 )
  14894.           {
  14895.             do
  14896.             {
  14897.               do
  14898.               {
  14899.                 v12 = (__PAIR__(v12, v13++) + 1) >> 32;
  14900.                 v15 = __CFADD__(v7, -3);
  14901.                 v7 -= 3;
  14902.                 v8 = v15 + v8 - 1;
  14903.               }
  14904.               while ( v8 );
  14905.             }
  14906.             while ( (unsigned int)v7 >= 3 );
  14907.           }
  14908.           v9 = v16;
  14909.         }
  14910.         else
  14911.         {
  14912.           v13 = 0;
  14913.         }
  14914.         v16 = v9;
  14915.         *(_DWORD *)(v19 + 4 * v9 + 4) = v13;
  14916.         if ( v9 < 0 )
  14917.           break;
  14918.         v3 = a1;
  14919.       }
  14920.     }
  14921.     if ( a3 )
  14922.       *(_DWORD *)a3 = v7;
  14923.     if ( a2 )
  14924.     {
  14925.       sub_4212C0((int)&v17);
  14926.       sub_4234B0((int)&v17, a2);
  14927.     }
  14928.     sub_41F860((int)&v17);
  14929.     result = 0;
  14930.   }
  14931.   return result;
  14932. }
  14933. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  14934.  
  14935. //----- (00425160) --------------------------------------------------------
  14936. signed int __cdecl sub_425160(int a1, int a2, unsigned int a3)
  14937. {
  14938.   signed int result; // eax@2
  14939.   int i; // edx@6
  14940.   int v5; // ebx@8
  14941.  
  14942.   if ( a2 > 0 )
  14943.   {
  14944.     if ( a2 < 28 * *(_DWORD *)a1 )
  14945.     {
  14946.       result = sub_41F8F0(a1, a3);
  14947.       if ( !result )
  14948.       {
  14949.         for ( i = a2 / 28 + (a2 % 28 != 0); i < *(_DWORD *)a3; *(_DWORD *)(*(_DWORD *)(a3 + 12) + 4 * i - 4) = 0 )
  14950.           ++i;
  14951.         v5 = *(_DWORD *)(a3 + 12) + 4 * a2 / 28;
  14952.         *(_DWORD *)v5 &= (1 << a2 % 0x1Cu) - 1;
  14953.         sub_4212C0(a3);
  14954.         result = 0;
  14955.       }
  14956.     }
  14957.     else
  14958.     {
  14959.       result = sub_41F8F0(a1, a3);
  14960.     }
  14961.   }
  14962.   else
  14963.   {
  14964.     sub_4213F0(a3);
  14965.     result = 0;
  14966.   }
  14967.   return result;
  14968. }
  14969.  
  14970. //----- (00425230) --------------------------------------------------------
  14971. signed int __cdecl sub_425230(unsigned int a1, int a2, int a3)
  14972. {
  14973.   signed int result; // eax@1
  14974.   int v4; // ebp@2
  14975.   signed int i; // edi@2
  14976.   char v6; // [sp+0h] [bp-10h]@1
  14977.  
  14978.   result = sub_41F810((int)&v6);
  14979.   if ( !result )
  14980.   {
  14981.     v4 = sub_41FA70(a2);
  14982.     for ( i = sub_4216E0(a1, v4, (unsigned int)&v6, a1); !i; i = sub_4216E0(a1, v4, (unsigned int)&v6, a1) )
  14983.     {
  14984.       if ( a3 != 1 )
  14985.       {
  14986.         i = sub_420220((int)&v6, a3, (int)&v6);
  14987.         if ( i )
  14988.           break;
  14989.       }
  14990.       i = sub_421920(a1, (int)&v6, a1);
  14991.       if ( i )
  14992.         break;
  14993.       if ( sub_421430(a1, a2) == -1 )
  14994.         break;
  14995.       sub_421850((signed int *)a1, (signed int *)a2, a1);
  14996.     }
  14997.     sub_41F860((int)&v6);
  14998.     result = i;
  14999.   }
  15000.   return result;
  15001. }
  15002.  
  15003. //----- (004252F0) --------------------------------------------------------
  15004. signed int __cdecl sub_4252F0(int a1, int a2)
  15005. {
  15006.   signed int result; // eax@1
  15007.   int v3; // eax@2
  15008.   signed int v4; // esi@2
  15009.   char v5; // [sp+8h] [bp-10h]@1
  15010.   int v6; // [sp+14h] [bp-4h]@5
  15011.  
  15012.   result = sub_41F810((int)&v5);
  15013.   if ( !result )
  15014.   {
  15015.     v3 = sub_41FA70(a1);
  15016.     v4 = sub_41FB00((unsigned int)&v5, v3);
  15017.     if ( v4 || (v4 = sub_421850((signed int *)&v5, (signed int *)a1, (int)&v5)) != 0 )
  15018.     {
  15019.       sub_41F860((int)&v5);
  15020.       result = v4;
  15021.     }
  15022.     else
  15023.     {
  15024.       *(_DWORD *)a2 = *(_DWORD *)v6;
  15025.       sub_41F860((int)&v5);
  15026.       result = 0;
  15027.     }
  15028.   }
  15029.   return result;
  15030. }
  15031.  
  15032. //----- (00425380) --------------------------------------------------------
  15033. signed int __cdecl sub_425380(int a1, signed int *a2, int a3)
  15034. {
  15035.   int v3; // ebp@1
  15036.   signed int v4; // edi@1
  15037.   signed int result; // eax@2
  15038.   int v6; // esi@3
  15039.   signed int v7; // eax@3
  15040.   int v8; // ebx@3
  15041.   int v9; // edi@3
  15042.   int v10; // ecx@5
  15043.   int v11; // esi@7
  15044.   int i; // eax@7
  15045.   signed int v13; // [sp+8h] [bp-8h]@1
  15046.   signed int v14; // [sp+Ch] [bp-4h]@4
  15047.  
  15048.   v3 = a1;
  15049.   v4 = *a2;
  15050.   v13 = *a2;
  15051.   if ( *(_DWORD *)(a1 + 4) >= 2 * *a2 || (result = sub_421250(a1, 2 * v4)) == 0 )
  15052.   {
  15053.     while ( 1 )
  15054.     {
  15055.       v6 = *(_DWORD *)(v3 + 12);
  15056.       v7 = v13;
  15057.       v8 = v6 + 4 * v4;
  15058.       v9 = 0;
  15059.       if ( v13 > 0 )
  15060.       {
  15061.         v14 = v13;
  15062.         do
  15063.         {
  15064.           v10 = *(_DWORD *)v8;
  15065.           v8 += 4;
  15066.           *(_DWORD *)v6 = (v9 + *(_DWORD *)v6 + v10 * a3) & 0xFFFFFFF;
  15067.           v6 += 4;
  15068.           v9 = unknown_libname_1(28);
  15069.           --v14;
  15070.         }
  15071.         while ( v14 );
  15072.         v3 = a1;
  15073.         v7 = v13;
  15074.       }
  15075.       *(_DWORD *)v6 = v9;
  15076.       v11 = v6 + 4;
  15077.       for ( i = v7 + 1; i < *(_DWORD *)v3; ++i )
  15078.       {
  15079.         *(_DWORD *)v11 = 0;
  15080.         v11 += 4;
  15081.       }
  15082.       sub_4212C0(v3);
  15083.       if ( sub_421430(v3, (int)a2) == -1 )
  15084.         break;
  15085.       sub_421850((signed int *)v3, a2, v3);
  15086.       v4 = v13;
  15087.     }
  15088.     result = 0;
  15089.   }
  15090.   return result;
  15091. }
  15092. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  15093.  
  15094. //----- (00425470) --------------------------------------------------------
  15095. int __cdecl sub_425470(int a1, int a2)
  15096. {
  15097.   int result; // eax@1
  15098.  
  15099.   result = a2;
  15100.   *(_DWORD *)a2 = 268435456 - **(_DWORD **)(a1 + 12);
  15101.   return result;
  15102. }
  15103.  
  15104. //----- (00425490) --------------------------------------------------------
  15105. signed int __cdecl sub_425490(unsigned int a1, int a2, int a3)
  15106. {
  15107.   signed int result; // eax@1
  15108.   int v4; // ebp@2
  15109.   signed int i; // edi@2
  15110.   char v6; // [sp+0h] [bp-10h]@1
  15111.  
  15112.   result = sub_41F810((int)&v6);
  15113.   if ( !result )
  15114.   {
  15115.     v4 = sub_41FA70(a2);
  15116.     for ( i = sub_4216E0(a1, v4, (unsigned int)&v6, a1); !i; i = sub_4216E0(a1, v4, (unsigned int)&v6, a1) )
  15117.     {
  15118.       i = sub_420150(&v6, a3, &v6);
  15119.       if ( i )
  15120.         break;
  15121.       i = sub_421920(a1, (int)&v6, a1);
  15122.       if ( i )
  15123.         break;
  15124.       if ( sub_421430(a1, a2) == -1 )
  15125.         break;
  15126.       sub_421850((signed int *)a1, (signed int *)a2, a1);
  15127.     }
  15128.     sub_41F860((int)&v6);
  15129.     result = i;
  15130.   }
  15131.   return result;
  15132. }
  15133. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  15134.  
  15135. //----- (00425550) --------------------------------------------------------
  15136. signed int __cdecl sub_425550(int a1, int a2)
  15137. {
  15138.   signed int result; // eax@1
  15139.   int v3; // eax@2
  15140.   signed int v4; // esi@2
  15141.   char v5; // [sp+0h] [bp-10h]@1
  15142.  
  15143.   result = sub_41F810((int)&v5);
  15144.   if ( !result )
  15145.   {
  15146.     v3 = sub_41FA70(a1);
  15147.     v4 = sub_41FB00((unsigned int)&v5, v3);
  15148.     if ( !v4 )
  15149.       v4 = sub_421850((signed int *)&v5, (signed int *)a1, a2);
  15150.     sub_41F860((int)&v5);
  15151.     result = v4;
  15152.   }
  15153.   return result;
  15154. }
  15155.  
  15156. //----- (004255B0) --------------------------------------------------------
  15157. signed int __cdecl sub_4255B0(unsigned int a1, signed int *a2, int a3)
  15158. {
  15159.   int v3; // ebx@1
  15160.   signed int result; // eax@1
  15161.   signed int v5; // esi@3
  15162.   int v6; // ebx@6
  15163.   char v7; // [sp+Ch] [bp-10h]@1
  15164.  
  15165.   v3 = *a2;
  15166.   result = sub_4216B0((int)&v7, a1);
  15167.   if ( !result )
  15168.   {
  15169.     sub_423500((unsigned int)&v7, v3 - 1);
  15170.     if ( (unsigned int)v3 <= 0x8000000 )
  15171.     {
  15172.       v5 = sub_425760((int)&v7, a3, (int)&v7, v3);
  15173.       if ( !v5 )
  15174.         goto LABEL_6;
  15175.     }
  15176.     else
  15177.     {
  15178.       v5 = sub_420150(&v7, a3, &v7);
  15179.       if ( !v5 )
  15180.       {
  15181. LABEL_6:
  15182.         v6 = v3 + 1;
  15183.         sub_423500((unsigned int)&v7, v6);
  15184.         v5 = sub_425160(a1, 28 * v6, a1);
  15185.         if ( !v5 )
  15186.         {
  15187.           v5 = sub_421A30((int)&v7, (int)a2, (int)&v7, v6);
  15188.           if ( !v5 )
  15189.           {
  15190.             v5 = sub_41FFD0(a1, (int)&v7, a1);
  15191.             if ( !v5 )
  15192.             {
  15193.               if ( sub_41FA40(a1, 0) != -1
  15194.                 || (sub_424010((unsigned int)&v7, 1), (v5 = sub_423560((int)&v7, v6)) == 0)
  15195.                 && (v5 = sub_41FE40(a1, (int)&v7, a1)) == 0 )
  15196.               {
  15197.                 if ( sub_41FA00(a1, (int)a2) != -1 )
  15198.                 {
  15199.                   do
  15200.                     v5 = sub_421850((signed int *)a1, a2, a1);
  15201.                   while ( !v5 && sub_41FA00(a1, (int)a2) != -1 );
  15202.                 }
  15203.               }
  15204.             }
  15205.           }
  15206.         }
  15207.         goto LABEL_15;
  15208.       }
  15209.     }
  15210. LABEL_15:
  15211.     sub_41F860((int)&v7);
  15212.     result = v5;
  15213.   }
  15214.   return result;
  15215. }
  15216. // 420150: using guessed type _DWORD __cdecl sub_420150(_DWORD, _DWORD, _DWORD);
  15217.  
  15218. //----- (00425720) --------------------------------------------------------
  15219. signed int __cdecl sub_425720(unsigned int a1, int a2)
  15220. {
  15221.   signed int result; // eax@1
  15222.  
  15223.   result = sub_41FB00(a1, 56 * *(_DWORD *)a2);
  15224.   if ( !result )
  15225.     result = sub_420370(a1, a2, a1, 0);
  15226.   return result;
  15227. }
  15228.  
  15229. //----- (00425760) --------------------------------------------------------
  15230. signed int __cdecl sub_425760(int a1, int a2, int a3, int a4)
  15231. {
  15232.   int v4; // ebp@1
  15233.   int v5; // edi@1
  15234.   unsigned int v6; // eax@1
  15235.   signed int result; // eax@5
  15236.   int v8; // edx@7
  15237.   signed int v9; // eax@7
  15238.   int v10; // ecx@8
  15239.   int v11; // esi@8
  15240.   int v12; // ebx@10
  15241.   int v13; // esi@10
  15242.   int v14; // edi@10
  15243.   int v15; // ecx@12
  15244.   int v16; // [sp+8h] [bp-2Ch]@11
  15245.   signed int v17; // [sp+Ch] [bp-28h]@7
  15246.   int v18; // [sp+10h] [bp-24h]@8
  15247.   int v19; // [sp+14h] [bp-20h]@8
  15248.   int v20; // [sp+18h] [bp-1Ch]@10
  15249.   unsigned int v21; // [sp+1Ch] [bp-18h]@7
  15250.   unsigned int v22; // [sp+20h] [bp-14h]@7
  15251.   int v23; // [sp+24h] [bp-10h]@6
  15252.   int v24; // [sp+30h] [bp-4h]@10
  15253.   int v25; // [sp+44h] [bp+10h]@8
  15254.  
  15255.   v4 = a2;
  15256.   v5 = a1;
  15257.   v6 = *(_DWORD *)a1;
  15258.   if ( (unsigned int)(*(_DWORD *)a2 + *(_DWORD *)a1 + 1) >= 0x200 )
  15259.     goto LABEL_18;
  15260.   if ( (signed int)v6 >= *(_DWORD *)a2 )
  15261.     v6 = *(_DWORD *)a2;
  15262.   if ( v6 >= 0x100 )
  15263.   {
  15264. LABEL_18:
  15265.     result = sub_4235D0((int)&v23, *(_DWORD *)a2 + *(_DWORD *)a1 + 1);
  15266.     if ( !result )
  15267.     {
  15268.       v8 = *(_DWORD *)a2;
  15269.       v22 = *(_DWORD *)a1;
  15270.       v21 = *(_DWORD *)a2;
  15271.       v23 = *(_DWORD *)a2 + *(_DWORD *)a1 + 1;
  15272.       v9 = 0;
  15273.       v17 = 0;
  15274.       if ( (signed int)v22 > 0 )
  15275.       {
  15276.         v10 = a4;
  15277.         v18 = a4;
  15278.         v11 = 4 * a4;
  15279.         v19 = 4 * a4;
  15280.         v25 = 4 * a4;
  15281.         while ( 1 )
  15282.         {
  15283.           v12 = 0;
  15284.           v20 = *(_DWORD *)(*(_DWORD *)(v5 + 12) + 4 * v9);
  15285.           v13 = v24 + v11;
  15286.           v14 = v25 + *(_DWORD *)(v4 + 12);
  15287.           if ( v10 < v8 )
  15288.           {
  15289.             v16 = v8 - v10;
  15290.             do
  15291.             {
  15292.               v15 = *(_DWORD *)v14;
  15293.               v14 += 4;
  15294.               *(_DWORD *)v13 = (v12 + *(_DWORD *)v13 + v15 * v20) & 0xFFFFFFF;
  15295.               v13 += 4;
  15296.               v12 = unknown_libname_1(28);
  15297.               --v16;
  15298.             }
  15299.             while ( v16 );
  15300.             v9 = v17;
  15301.             v8 = v21;
  15302.             v10 = v18;
  15303.           }
  15304.           *(_DWORD *)v13 = v12;
  15305.           ++v9;
  15306.           --v10;
  15307.           v17 = v9;
  15308.           v25 -= 4;
  15309.           v18 = v10;
  15310.           if ( v9 >= (signed int)v22 )
  15311.             break;
  15312.           v4 = a2;
  15313.           v5 = a1;
  15314.           v11 = v19;
  15315.         }
  15316.       }
  15317.       sub_4212C0((int)&v23);
  15318.       sub_4234B0((int)&v23, a3);
  15319.       sub_41F860((int)&v23);
  15320.       result = 0;
  15321.     }
  15322.   }
  15323.   else
  15324.   {
  15325.     result = sub_4258D0(a1, a2, a3, a4);
  15326.   }
  15327.   return result;
  15328. }
  15329. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  15330.  
  15331. //----- (004258D0) --------------------------------------------------------
  15332. signed int __cdecl sub_4258D0(int a1, int a2, int a3, int a4)
  15333. {
  15334.   int v4; // esi@1
  15335.   signed int result; // eax@2
  15336.   int v6; // edx@3
  15337.   int v7; // ebp@3
  15338.   int v8; // eax@3
  15339.   int v9; // ebx@3
  15340.   int v10; // ecx@4
  15341.   int v11; // edx@8
  15342.   int v12; // edi@8
  15343.   int v13; // eax@8
  15344.   int v14; // esi@8
  15345.   int v15; // ecx@11
  15346.   unsigned int v16; // eax@12
  15347.   unsigned int v17; // edx@13
  15348.   int v18; // edx@15
  15349.   int v19; // ebx@15
  15350.   void *v20; // edx@15
  15351.   int v21; // edi@15
  15352.   int v22; // eax@16
  15353.   int v23; // [sp+Ch] [bp-820h]@3
  15354.   char *v24; // [sp+10h] [bp-81Ch]@4
  15355.   unsigned int v25; // [sp+18h] [bp-814h]@3
  15356.   int v26; // [sp+1Ch] [bp-810h]@4
  15357.   int v27; // [sp+20h] [bp-80Ch]@4
  15358.   int v28; // [sp+24h] [bp-808h]@3
  15359.   int v29; // [sp+28h] [bp-804h]@4
  15360.   char v30[2048]; // [sp+2Ch] [bp-800h]@4
  15361.  
  15362.   v4 = a3;
  15363.   if ( *(_DWORD *)(a3 + 4) >= *(_DWORD *)a2 + *(_DWORD *)a1
  15364.     || (result = sub_421250(a3, *(_DWORD *)a2 + *(_DWORD *)a1)) == 0 )
  15365.   {
  15366.     v6 = *(_DWORD *)a1;
  15367.     v7 = a4;
  15368.     v8 = *(_DWORD *)a2 + *(_DWORD *)a1;
  15369.     v9 = 0;
  15370.     v28 = *(_DWORD *)a1;
  15371.     v23 = *(_DWORD *)a2 + *(_DWORD *)a1;
  15372.     v25 = 0;
  15373.     if ( a4 < *(_DWORD *)a2 + *(_DWORD *)a1 )
  15374.     {
  15375.       v10 = *(_DWORD *)a2 - 1;
  15376.       v29 = *(_DWORD *)(a1 + 12);
  15377.       v26 = *(_DWORD *)a2 - 1;
  15378.       v27 = *(_DWORD *)(a2 + 12);
  15379.       v24 = &v30[4 * a4];
  15380.       while ( 1 )
  15381.       {
  15382.         if ( v10 >= v7 )
  15383.           v10 = v7;
  15384.         v11 = v6 - (v7 - v10);
  15385.         v12 = v29 + 4 * (v7 - v10);
  15386.         v13 = v10 + 1;
  15387.         v14 = v27 + 4 * v10;
  15388.         if ( v11 < v10 + 1 )
  15389.           v13 = v11;
  15390.         if ( v13 > 0 )
  15391.         {
  15392.           v15 = v13;
  15393.           do
  15394.           {
  15395.             v16 = (*(_DWORD *)v12 * (unsigned __int64)*(_DWORD *)v14 + __PAIR__(v25, v9)) >> 32;
  15396.             v9 += *(_DWORD *)v12 * *(_DWORD *)v14;
  15397.             v14 -= 4;
  15398.             v12 += 4;
  15399.             --v15;
  15400.             v25 = v16;
  15401.           }
  15402.           while ( v15 );
  15403.         }
  15404.         *(_DWORD *)v24 = v9 & 0xFFFFFFF;
  15405.         v9 = unknown_libname_1(28);
  15406.         v8 = v23;
  15407.         ++v7;
  15408.         v25 = v17;
  15409.         v24 += 4;
  15410.         if ( v7 >= v23 )
  15411.           break;
  15412.         v6 = v28;
  15413.         v10 = v26;
  15414.       }
  15415.       v7 = a4;
  15416.       v4 = a3;
  15417.     }
  15418.     v18 = *(_DWORD *)(v4 + 12);
  15419.     v19 = *(_DWORD *)v4;
  15420.     *(_DWORD *)v4 = v8;
  15421.     v20 = (void *)(4 * v7 + v18);
  15422.     v21 = v7;
  15423.     if ( v7 <= v8 )
  15424.     {
  15425.       v22 = v8 - v7 + 1;
  15426.       memcpy(v20, &v30[4 * v7], 4 * v22);
  15427.       v4 = a3;
  15428.       v21 = v22 + v7;
  15429.       v20 = (char *)v20 + 4 * v22;
  15430.     }
  15431.     if ( v21 < v19 )
  15432.       memset(v20, 0, 4 * (v19 - v21));
  15433.     sub_4212C0(v4);
  15434.     result = 0;
  15435.   }
  15436.   return result;
  15437. }
  15438. // 413010: using guessed type int __thiscall unknown_libname_1(_DWORD);
  15439. // 4258D0: using guessed type char var_800[2048];
  15440.  
  15441. #error "There were 1 decompilation failure(s) on 231 function(s)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement