Created
March 27, 2019 23:11
-
-
Save jugeeya/051e84abf2815487e5b5754667609936 to your computer and use it in GitHub Desktop.
NRO loading function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
__int64 __fastcall sub_7102DA00E0(__int64 a1) | |
{ | |
__int64 v1; // x23 | |
int v2; // w24 | |
_QWORD *v3; // x27 | |
__int64 v4; // x9 | |
__int64 v5; // x9 | |
signed __int64 v6; // x8 | |
const void *v7; // x20 | |
__int64 v8; // x28 | |
__int64 v9; // x22 | |
void *v10; // x0 | |
__int64 v11; // x0 | |
__int64 v12; // x28 | |
void *v13; // x2 | |
__int64 *v14; // x20 | |
ulong v15; // x3 | |
__int64 v16; // x0 | |
__int64 v17; // x9 | |
unsigned __int64 v18; // x10 | |
__int64 *v19; // x8 | |
signed __int64 v20; // x11 | |
int v21; // w20 | |
__int64 v22; // x26 | |
signed __int64 v23; // x11 | |
signed __int64 v24; // x9 | |
__int64 result; // x0 | |
unsigned __int8 *v26; // x9 | |
__int64 *v27; // x0 | |
__int64 *v28; // x0 | |
unsigned int v29; // off | |
__int64 v30; // x0 | |
unsigned int v31; // off | |
__int64 v32; // x0 | |
__int64 v33; // x0 | |
unsigned int v34; // off | |
__int64 v35; // x28 | |
int v36; // w9 | |
unsigned __int8 *v37; // x10 | |
__int64 v38; // x8 | |
unsigned int v39; // w11 | |
int v40; // t1 | |
unsigned __int64 v41; // x8 | |
unsigned int v42; // off | |
__int64 v43; // x0 | |
__int64 v44; // x0 | |
unsigned int v45; // off | |
__int64 v46; // x0 | |
__int64 v47; // x0 | |
__int64 v48; // x9 | |
unsigned __int64 v49; // x10 | |
signed __int64 v50; // x11 | |
unsigned __int64 *v51; // x9 | |
signed __int64 v52; // x10 | |
signed __int64 v53; // x12 | |
signed __int64 v54; // x12 | |
__int64 *v55; // x13 | |
signed __int64 v56; // x13 | |
__int64 v57; // t1 | |
bool v58; // cf | |
unsigned __int64 v59; // x9 | |
unsigned __int64 v60; // x22 | |
bool v61; // cf | |
bool v62; // zf | |
__int64 v63; // x20 | |
unsigned __int64 v64; // x27 | |
__int64 v65; // x27 | |
unsigned int v66; // w27 | |
__int64 v67; // x8 | |
__int64 v68; // x9 | |
__int64 i; // x9 | |
signed __int64 v70; // x8 | |
bool v71; // zf | |
unsigned int v72; // off | |
unsigned __int8 *v73; // x8 | |
unsigned int v74; // off | |
__int64 v75; // x20 | |
__int64 v76; // x28 | |
__int64 v77; // x9 | |
ulong v78; // [xsp+30h] [xbp-170h] | |
unsigned __int8 v79; // [xsp+38h] [xbp-168h] | |
_BYTE v80[7]; // [xsp+39h] [xbp-167h] | |
__int64 v81; // [xsp+140h] [xbp-60h] | |
int v82; // [xsp+14Ch] [xbp-54h] | |
v1 = *(_QWORD *)(a1 + 8); | |
v2 = 0; | |
v3 = (_QWORD *)(v1 + 8); | |
while ( 1 ) | |
{ | |
while ( 1 ) | |
{ | |
std::__1::recursive_mutex::lock(); | |
v17 = *(_QWORD *)(v1 + 168); | |
if ( !v17 ) | |
break; | |
v18 = *(_QWORD *)(v1 + 160); | |
v19 = *(__int64 **)(v1 + 136); | |
v20 = *(__int64 *)((char *)v19 + ((v18 >> 5) & 0x7FFFFFFFFFFFFF8LL)) + 16LL * (unsigned __int8)v18; | |
v21 = *(_DWORD *)v20; | |
v22 = *(_QWORD *)(v20 + 8); | |
v23 = v17 - 1; | |
v24 = v18 + 1; | |
*(_QWORD *)(v1 + 160) = v18 + 1; | |
*(_QWORD *)(v1 + 168) = v23; | |
if ( v18 + 1 >= 0x200 ) | |
{ | |
if ( *v19 ) | |
{ | |
sub_71029E80B0(*v19); | |
v19 = *(__int64 **)(v1 + 136); | |
v24 = *(_QWORD *)(v1 + 160); | |
} | |
*(_QWORD *)(v1 + 136) = v19 + 1; | |
*(_QWORD *)(v1 + 160) = v24 - 256; | |
} | |
result = std::__1::recursive_mutex::unlock(); | |
switch ( v21 ) | |
{ | |
case 0: | |
goto LABEL_48; | |
case 1: | |
sub_710196E3F0((__int64)v3, v22); | |
v2 = v22; | |
continue; | |
case 2: | |
*(_DWORD *)v1 = v22; | |
v29 = __ldar((unsigned __int8 *)(v1 + 48)); | |
if ( ((_DWORD)v1 + 48) & 1 ) | |
{ | |
__stlr(0, (unsigned __int8 *)(v1 + 48)); | |
sub_7102FFA2F0(v1 + 16); | |
v30 = *(_QWORD *)(v1 + 8); | |
if ( v30 ) | |
sub_71029E80B0(v30); | |
*v3 = 0LL; | |
} | |
sub_710196E3F0((__int64)v3, v2); | |
continue; | |
case 3: | |
v31 = __ldar(v26); | |
if ( (unsigned __int8)v26 & 1 ) | |
{ | |
__stlr(0, (unsigned __int8 *)(v22 + 306)); | |
nn::ro::UnloadModule((__int64 *)v22); | |
v32 = *(_QWORD *)(v22 + 32); | |
if ( v32 ) | |
{ | |
sub_71029E80B0(v32); | |
*(_QWORD *)(v22 + 32) = 0LL; | |
} | |
v33 = *(_QWORD *)(v22 + 40); | |
if ( v33 ) | |
{ | |
sub_71029E80B0(v33); | |
*(_QWORD *)(v22 + 40) = 0LL; | |
} | |
} | |
v34 = __ldar((unsigned __int8 *)(v22 + 307)); | |
if ( ((_DWORD)v22 + 307) & 1 ) | |
continue; | |
sub_7102D8BA60(&v79); | |
v35 = qword_71045A0920; | |
v36 = v79; | |
if ( !v79 ) | |
goto LABEL_96; | |
v37 = v80; | |
v38 = 0LL; | |
v39 = -1; | |
do | |
{ | |
if ( (unsigned int)(v36 - 65) < 0x1A ) | |
v36 += 32; | |
v39 = *((_DWORD *)off_710456A338 + ((v36 ^ v39) & 0xFF)) ^ (v39 >> 8); | |
v40 = *v37++; | |
v36 = v40; | |
v38 += 0x100000000LL; | |
} | |
while ( v40 ); | |
v41 = v38 & 0xFF00000000LL | ~v39; | |
if ( !v41 ) | |
goto LABEL_96; | |
v48 = **(_QWORD **)(qword_71045A0920 + 120); | |
v49 = *(_QWORD *)(v48 + 80) | |
+ 8 | |
* (v41 | |
- v41 / *(unsigned int *)(*(_QWORD *)(v48 + 80) + 4LL) * *(unsigned int *)(*(_QWORD *)(v48 + 80) + 4LL)); | |
v50 = *(unsigned int *)(v49 + 12); | |
v51 = (unsigned __int64 *)(*(_QWORD *)(v48 + 88) + 8LL * *(unsigned int *)(v49 + 8)); | |
v52 = (signed __int64)&v51[v50]; | |
if ( (_DWORD)v50 ) | |
{ | |
do | |
{ | |
if ( v50 >= 0 ) | |
v53 = v50; | |
else | |
v53 = v50 + 1; | |
v54 = v53 >> 1; | |
v55 = (__int64 *)&v51[v54]; | |
v50 = v50 - 1 - v54; | |
v57 = *v55; | |
v56 = (signed __int64)(v55 + 1); | |
v58 = (v57 & 0xFFFFFFFFFFuLL) >= v41; | |
if ( (v57 & 0xFFFFFFFFFFuLL) >= v41 ) | |
v50 = v54; | |
if ( !v58 ) | |
v51 = (unsigned __int64 *)v56; | |
} | |
while ( v50 ); | |
} | |
if ( v51 == (unsigned __int64 *)v52 ) | |
goto LABEL_96; | |
v59 = *v51; | |
v60 = v59 >> 40; | |
if ( (v59 & 0xFFFFFFFFFFLL) == v41 ) | |
{ | |
v61 = (unsigned int)v60 >= 0xFFFFFE; | |
v62 = (_DWORD)v60 == 16777214; | |
} | |
else | |
{ | |
v61 = 1; | |
v62 = 0; | |
} | |
if ( !v62 && v61 ) | |
goto LABEL_96; | |
v63 = *(_QWORD *)qword_71045A0920; | |
v64 = v59 & 0xFFFFFF0000000000LL | v41; | |
std::__1::recursive_mutex::lock(); | |
v65 = sub_71026D47F0(v35, v64); | |
std::__1::recursive_mutex::unlock(); | |
v66 = v65 ? (_DWORD)v60 : 0xFFFFFF; | |
if ( v66 == 0xFFFFFF || !*(_BYTE *)(*(_QWORD *)(v35 + 8) + 8LL * v66 + 4) ) | |
goto LABEL_96; | |
v67 = qword_71045A0920; | |
if ( *(_DWORD *)(qword_71045A0920 + 24) <= v66 ) | |
goto LABEL_113; | |
v68 = *(_QWORD *)(qword_71045A0920 + 8); | |
if ( !*(_BYTE *)(v68 + 8LL * v66 + 4) ) | |
goto LABEL_113; | |
for ( i = *(unsigned int *)(v68 + 8LL * v66); ; i = *(unsigned int *)(v77 + 8LL * v66) ) | |
{ | |
if ( (_DWORD)i != 0xFFFFFF && *(_DWORD *)(v67 + 28) > (unsigned int)i ) | |
{ | |
v70 = *(_QWORD *)(v67 + 16) + 16 * i; | |
v71 = *(_BYTE *)(v70 + 12) ? v70 == 0 : 1; | |
if ( !v71 ) | |
{ | |
v72 = __ldar((unsigned __int8 *)(v70 + 13)); | |
if ( (((_DWORD)v70 + 13) & 0xFF) == 3 ) | |
{ | |
if ( *(_QWORD *)v70 ) | |
break; | |
} | |
} | |
} | |
while ( 1 ) | |
{ | |
LABEL_113: | |
v73 = (unsigned __int8 *)(*(_QWORD *)(qword_71045A0920 + 16) | |
+ 16LL * *(unsigned int *)(*(_QWORD *)(qword_71045A0920 + 8) + 8LL * v66) | |
+ 13); | |
v74 = __ldar(v73); | |
if ( (unsigned int)(unsigned __int8)v73 - 1 >= 2 ) | |
{ | |
v75 = qword_71045A0928; | |
v76 = *(_QWORD *)qword_71045A0928; | |
std::__1::recursive_mutex::lock(); | |
sub_71026D9080(v75, v66, 2); | |
std::__1::recursive_mutex::unlock(); | |
} | |
nn::os::SleepThread(1000000LL); | |
v67 = qword_71045A0920; | |
if ( *(_DWORD *)(qword_71045A0920 + 24) > v66 ) | |
{ | |
v77 = *(_QWORD *)(qword_71045A0920 + 8); | |
if ( *(_BYTE *)(v77 + 8LL * v66 + 4) ) | |
break; | |
} | |
} | |
} | |
if ( *(_DWORD *)(qword_71045A0920 + 24) > v66 ) | |
{ | |
v4 = *(_QWORD *)(qword_71045A0920 + 8); | |
if ( *(_BYTE *)(v4 + 8LL * v66 + 4) ) | |
{ | |
v5 = *(unsigned int *)(v4 + 8LL * v66); | |
if ( (_DWORD)v5 != 0xFFFFFF && *(_DWORD *)(qword_71045A0920 + 28) > (unsigned int)v5 ) | |
{ | |
v6 = *(_QWORD *)(qword_71045A0920 + 16) + 16 * v5; | |
if ( *(_BYTE *)(v6 + 12) ) | |
{ | |
if ( v6 ) | |
{ | |
v7 = *(const void **)v6; | |
if ( *(_QWORD *)v6 ) | |
{ | |
v8 = sub_71026D1F90(v66); | |
if ( v8 ) | |
v9 = v8; | |
else | |
v9 = 1LL; | |
v10 = (void *)sub_71029E7800(4096LL, v9); | |
if ( !v10 ) | |
{ | |
if ( !qword_71045A0900 | |
|| (LODWORD(v78) = 0, | |
v81 = v9, | |
!((*(__int64 (**)(void))(*(_QWORD *)qword_71045A0900 + 48LL))() & 1)) | |
|| (v10 = (void *)sub_71029E7800(4096LL, v9)) == 0LL ) | |
{ | |
v10 = 0LL; | |
} | |
} | |
*(_QWORD *)(v22 + 32) = v10; | |
memcpy_0(v10, v7, v8); | |
if ( (unsigned int)nn::ro::GetBufferSize(&v78, *(const void **)(v22 + 32)) ) | |
{ | |
v11 = *(_QWORD *)(v22 + 32); | |
if ( v11 ) | |
sub_71029E80B0(v11); | |
*(_QWORD *)(v22 + 32) = 0LL; | |
} | |
else | |
{ | |
v12 = v78; | |
if ( v78 ) | |
{ | |
v13 = (void *)sub_71029E7800(4096LL, v78); | |
if ( !v13 ) | |
{ | |
if ( !qword_71045A0900 | |
|| (v82 = 0, | |
v81 = v12, | |
!((*(__int64 (**)(void))(*(_QWORD *)qword_71045A0900 + 48LL))() & 1)) | |
|| (v13 = (void *)sub_71029E7800(4096LL, v12)) == 0LL ) | |
{ | |
v13 = 0LL; | |
} | |
} | |
*(_QWORD *)(v22 + 40) = v13; | |
v14 = (__int64 *)(v22 + 40); | |
v15 = v78; | |
} | |
else | |
{ | |
v14 = (__int64 *)(v22 + 40); | |
v13 = *(void **)(v22 + 40); | |
v15 = 0LL; | |
} | |
if ( (unsigned int)nn::ro::LoadModule((__int64 *)v22, *(const void **)(v22 + 32), v13, v15, 2LL) ) | |
{ | |
v16 = *(_QWORD *)(v22 + 32); | |
if ( v16 ) | |
sub_71029E80B0(v16); | |
if ( *v14 ) | |
sub_71029E80B0(*v14); | |
*(_QWORD *)(v22 + 32) = 0LL; | |
*(_QWORD *)(v22 + 40) = 0LL; | |
} | |
else | |
{ | |
__stlr(0, (unsigned __int8 *)(v22 + 306)); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
if ( v66 != 0xFFFFFF ) | |
sub_71026D4E10((_QWORD *)qword_71045A0920, v66); | |
LABEL_96: | |
v3 = (_QWORD *)(v1 + 8); | |
break; | |
case 4: | |
v42 = __ldar(v26); | |
if ( (unsigned __int8)v26 & 1 ) | |
{ | |
__stlr(0, (unsigned __int8 *)(v22 + 306)); | |
nn::ro::UnloadModule((__int64 *)v22); | |
v43 = *(_QWORD *)(v22 + 32); | |
if ( v43 ) | |
{ | |
sub_71029E80B0(v43); | |
*(_QWORD *)(v22 + 32) = 0LL; | |
} | |
v44 = *(_QWORD *)(v22 + 40); | |
if ( v44 ) | |
{ | |
sub_71029E80B0(v44); | |
*(_QWORD *)(v22 + 40) = 0LL; | |
} | |
} | |
break; | |
case 5: | |
if ( v22 ) | |
{ | |
v45 = __ldar(v26); | |
if ( (unsigned __int8)v26 & 1 ) | |
{ | |
__stlr(0, (unsigned __int8 *)(v22 + 306)); | |
nn::ro::UnloadModule((__int64 *)v22); | |
v46 = *(_QWORD *)(v22 + 32); | |
if ( v46 ) | |
{ | |
sub_71029E80B0(v46); | |
*(_QWORD *)(v22 + 32) = 0LL; | |
} | |
v47 = *(_QWORD *)(v22 + 40); | |
if ( v47 ) | |
sub_71029E80B0(v47); | |
} | |
sub_71029E80B0(v22); | |
} | |
break; | |
case 6: | |
return result; | |
default: | |
continue; | |
} | |
} | |
v27 = **(__int64 ***)(v1 + 80); | |
if ( v27 ) | |
nn::os::ClearEvent(v27); | |
std::__1::recursive_mutex::unlock(); | |
LABEL_48: | |
v28 = **(__int64 ***)(v1 + 80); | |
if ( v28 ) | |
nn::os::WaitEvent(v28); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment