Skip to content

Instantly share code, notes, and snippets.

@jugeeya
Created March 27, 2019 23:11
Show Gist options
  • Save jugeeya/051e84abf2815487e5b5754667609936 to your computer and use it in GitHub Desktop.
Save jugeeya/051e84abf2815487e5b5754667609936 to your computer and use it in GitHub Desktop.
NRO loading function
__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