Advertisement
Martymoose98

NieR:Automata CreateShader function

Apr 11th, 2019
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.57 KB | None | 0 0
  1. // write access to const memory has been detected, the output may be wrong!
  2. BOOL __fastcall CreateShader(__int64 a1, const char *szShaderName, __int64 *a3, BOOL bMakeVertex, BOOL bMakePixel)
  3. {
  4. __int64 v5; // rbx
  5. DATHeader **v6; // r14
  6. const char *__szShaderName; // r12
  7. __int64 *v8; // rax
  8. __int64 v9; // rax
  9. __int64 v10; // rdi
  10. DATHeader *v11; // rax
  11. __int64 v12; // rcx
  12. DWORD v13; // eax
  13. __int64 v14; // rdx
  14. DATHeader *v15; // r8
  15. __int64 v16; // rdx
  16. __int64 v17; // rax
  17. DWORD v18; // eax
  18. DATHeader *v19; // r8
  19. __int64 v20; // rax
  20. __int64 v21; // rdx
  21. __int64 v22; // rdx
  22. __int64 v23; // rcx
  23. __int64 v24; // rdx
  24. __int64 v25; // rcx
  25. PVOID v26; // rsi
  26. DATHeader *v27; // rdi
  27. char v28; // al
  28. DWORD v29; // eax
  29. __int64 v30; // rdx
  30. DATHeader *v31; // r8
  31. __int64 v32; // rdx
  32. __int64 v33; // r9
  33. DWORD v35; // eax
  34. DATHeader *v36; // rdx
  35. __int64 szName; // rax
  36. __int64 v38; // r8
  37. __int64 v39; // rdx
  38. __int64 v40; // rcx
  39. __int64 v41; // [rsp+30h] [rbp-51h]
  40. signed int v42; // [rsp+40h] [rbp-41h]
  41. signed int v43; // [rsp+44h] [rbp-3Dh]
  42. int v44; // [rsp+48h] [rbp-39h]
  43. DATHeader *v45; // [rsp+50h] [rbp-31h]
  44. __int64 v46; // [rsp+58h] [rbp-29h]
  45. _QWORD *v47; // [rsp+60h] [rbp-21h]
  46. char szShaderNamea[48]; // [rsp+70h] [rbp-11h]
  47.  
  48. v5 = 0i64;
  49. v6 = (DATHeader **)a3;
  50. __szShaderName = szShaderName;
  51. if ( bMakeVertex )
  52. {
  53. sub_14091D670(szShaderNamea, "%s.vso", szShaderName);
  54. v43 = -1;
  55. v8 = (__int64 *)*(&g_pShaderFileHeap + 5);
  56. v42 = 0;
  57. if ( v8 )
  58. {
  59. v9 = *v8;
  60. v42 = 1;
  61. v41 = v9;
  62. }
  63. HeapInstance::ReserveMemory((CHeapInstance *)g_pShaderFileHeap, (HeapAlloc_t *)&v47, 72i64, *(_QWORD *)(g_pShaderFileHeap + 120), 0, (HeapReserve *)&v41);
  64. v10 = (__int64)v47;
  65. if ( v47 )
  66. {
  67. *v47 = &cShaderMemorizeVS::`vftable';
  68. *(_QWORD *)(v10 + 56) = 0i64;
  69. *(_BYTE *)(v10 + 64) = 0;
  70. v11 = *v6;
  71. if ( !*v6 )
  72. goto LABEL_85;
  73. v12 = (unsigned __int8)szShaderNamea[0];
  74. if ( szShaderNamea[0] )
  75. {
  76. v13 = DataFile::QueryFileIndex(v6, szShaderNamea);
  77. if ( v13 == -1 )
  78. {
  79. v11 = 0i64;
  80. }
  81. else
  82. {
  83. v14 = v13 & 0xFFFFFFF;
  84. v15 = v6[(unsigned __int64)v13 >> 28];
  85. v11 = 0i64;
  86. if ( (unsigned int)v14 < v15->FileCount )
  87. {
  88. v16 = *(uint32_t *)((char *)&v15->Magic + 4 * v14 + v15->FileTableOffset);
  89. if ( (_DWORD)v16 )
  90. v11 = (DATHeader *)((char *)v15 + v16);
  91. }
  92. }
  93. v12 = (unsigned __int8)szShaderNamea[0];
  94. }
  95. if ( v11 )
  96. {
  97. v44 = 0;
  98. v46 = 0i64;
  99. v45 = v11;
  100. if ( *v6 )
  101. {
  102. if ( (_BYTE)v12 )
  103. {
  104. v18 = DataFile::QueryFileIndex(v6, szShaderNamea);
  105. if ( v18 == -1 )
  106. {
  107. v17 = 0i64;
  108. }
  109. else
  110. {
  111. v12 = v18 & 0xFFFFFFF;
  112. v19 = v6[(unsigned __int64)v18 >> 28];
  113. if ( (unsigned int)v12 < v19->FileCount )
  114. {
  115. v20 = v19->SizeTableOffset;
  116. if ( (_DWORD)v20 )
  117. {
  118. v21 = (unsigned int)v12;
  119. v12 = (__int64)v19 + v20;
  120. v17 = *(uint32_t *)((char *)&v19->Magic + 4 * v21 + v20);
  121. }
  122. else
  123. {
  124. v17 = 0i64;
  125. }
  126. }
  127. else
  128. {
  129. v17 = 0i64;
  130. }
  131. }
  132. }
  133. else
  134. {
  135. v17 = 0i64;
  136. }
  137. }
  138. else
  139. {
  140. v17 = 0i64;
  141. }
  142. v46 = v17;
  143. if ( (unsigned int)sub_140935B70(v12, v10 + 56, (__int64)&v44) )
  144. {
  145. strcpy_s_0((char *)(v10 + 8), 48i64, __szShaderName);
  146. if ( g_qword_141990E50 != g_qword_141990E30 )
  147. {
  148. v22 = *(_QWORD *)(g_qword_141990E50 + 8);
  149. v23 = *(_QWORD *)(g_qword_141990E50 + 16);
  150. if ( v22 )
  151. *(_QWORD *)(v22 + 16) = v23;
  152. if ( v23 )
  153. *(_QWORD *)(v23 + 8) = v22;
  154. qword_141990E48 = 2i64;
  155. g_qword_141990E50 = v23;
  156. if ( g_qword_141990E50 != g_qword_141990E30 )
  157. {
  158. *(_QWORD *)g_qword_141990E50 = v10;
  159. if ( g_qword_141990E60 )
  160. v24 = *(_QWORD *)(g_qword_141990E60 + 8);
  161. else
  162. v24 = 0i64;
  163. *(_QWORD *)(g_qword_141990E50 + 8) = v24;
  164. *(_QWORD *)(g_qword_141990E50 + 16) = g_qword_141990E60;
  165. if ( v24 )
  166. *(_QWORD *)(v24 + 16) = g_qword_141990E50;
  167. if ( g_qword_141990E60 )
  168. *(_QWORD *)(g_qword_141990E60 + 8) = g_qword_141990E50;
  169. if ( g_qword_141990E58 == g_qword_141990E60 )
  170. g_qword_141990E58 = g_qword_141990E50;
  171. }
  172. }
  173. goto LABEL_41;
  174. }
  175. }
  176. else
  177. {
  178. LABEL_85:
  179. sub_1409204B0(g_szShaderNotInDAT, szShaderNamea);
  180. (**(void (__fastcall ***)(__int64, signed __int64))v10)(v10, 1i64);
  181. }
  182. }
  183. return 0;
  184. }
  185. LABEL_41:
  186. if ( !bMakePixel )
  187. return 1;
  188. sub_14091D670(szShaderNamea, "%s.pso", __szShaderName);
  189. v26 = AllocHeapMem(72i64, (HeapInfo *)&g_pShaderFileHeap);
  190. if ( v26 )
  191. {
  192. *(_QWORD *)v26 = &cShaderMemorizePS::`vftable';
  193. *((_QWORD *)v26 + 7) = 0i64;
  194. *((_BYTE *)v26 + 64) = 0;
  195. v27 = *v6;
  196. if ( !*v6 )
  197. goto LABEL_86;
  198. v28 = szShaderNamea[0];
  199. if ( szShaderNamea[0] )
  200. {
  201. v29 = DataFile::QueryFileIndex(v6, szShaderNamea);
  202. v27 = 0i64;
  203. if ( v29 != -1 )
  204. {
  205. v30 = v29 & 0xFFFFFFF;
  206. v31 = v6[(unsigned __int64)v29 >> 28];
  207. if ( (unsigned int)v30 < v31->FileCount )
  208. {
  209. v25 = (__int64)v31 + v31->FileTableOffset;
  210. v32 = *(unsigned int *)(v25 + 4 * v30);
  211. if ( (_DWORD)v32 )
  212. v27 = (DATHeader *)((char *)v31 + v32);
  213. }
  214. }
  215. v28 = szShaderNamea[0];
  216. }
  217. if ( v27 )
  218. {
  219. if ( *v6 )
  220. {
  221. if ( v28 )
  222. {
  223. v35 = DataFile::QueryFileIndex(v6, szShaderNamea);
  224. if ( v35 == -1 )
  225. {
  226. v33 = 0i64;
  227. }
  228. else
  229. {
  230. v25 = v35 & 0xFFFFFFF;
  231. v36 = v6[(unsigned __int64)v35 >> 28];
  232. if ( (unsigned int)v25 < v36->FileCount )
  233. {
  234. szName = v36->SizeTableOffset;
  235. if ( (_DWORD)szName )
  236. {
  237. v38 = (unsigned int)v25;
  238. v25 = (__int64)v36 + szName;
  239. v33 = *(uint32_t *)((char *)&v36->Magic + 4 * v38 + szName);
  240. }
  241. else
  242. {
  243. v33 = 0i64;
  244. }
  245. }
  246. else
  247. {
  248. v33 = 0i64;
  249. }
  250. }
  251. }
  252. else
  253. {
  254. v33 = 0i64;
  255. }
  256. }
  257. else
  258. {
  259. v33 = 0i64;
  260. }
  261. if ( (unsigned int)sub_140935C50(v25, (__int64)v26 + 56, (__int64)v27, v33) )
  262. {
  263. strcpy_s_0((char *)v26 + 8, 48i64, __szShaderName);
  264. if ( g_qword_141990E88 != g_qword_141990E68 )
  265. {
  266. v39 = *(_QWORD *)(g_qword_141990E88 + 8);
  267. v40 = *(_QWORD *)(g_qword_141990E88 + 16);
  268. if ( v39 )
  269. *(_QWORD *)(v39 + 16) = v40;
  270. if ( v40 )
  271. *(_QWORD *)(v40 + 8) = v39;
  272. qword_141990E80 = 1i64;
  273. g_qword_141990E88 = v40;
  274. if ( g_qword_141990E88 != g_qword_141990E68 )
  275. {
  276. *(_QWORD *)g_qword_141990E88 = v26;
  277. if ( g_qword_141990E98 )
  278. v5 = *(_QWORD *)(g_qword_141990E98 + 8);
  279. *(_QWORD *)(g_qword_141990E88 + 8) = v5;
  280. *(_QWORD *)(g_qword_141990E88 + 16) = g_qword_141990E98;
  281. if ( v5 )
  282. *(_QWORD *)(v5 + 16) = g_qword_141990E88;
  283. if ( g_qword_141990E98 )
  284. *(_QWORD *)(g_qword_141990E98 + 8) = g_qword_141990E88;
  285. if ( g_qword_141990E90 == g_qword_141990E98 )
  286. g_qword_141990E90 = g_qword_141990E88;
  287. }
  288. }
  289. return 1;
  290. }
  291. }
  292. else
  293. {
  294. LABEL_86:
  295. sub_1409204B0(g_szShaderNotInDAT, szShaderNamea);
  296. (**(void (__fastcall ***)(PVOID, signed __int64))v26)(v26, 1i64);
  297. }
  298. }
  299. return 0;
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement