ST_STORE::StStart
void __fastcall ST_STORE::StStart(__int64 a1, __int64 a2){
unsigned int v4;
int v5;
unsigned int v6;
bool v7;
int v8;
int v9;
UINT64 v10;
VOID **PoolWithTag;
unsigned int v12;
UINT16 v13;
UINT64 v14;
unsigned int v15;
unsigned int v16;
bool v17;
VOID **v18;
__int64 v19;
unsigned int v20;
unsigned int v21;
VOID **v22;
__int64 v23;
unsigned int v24;
unsigned int v25;
int v26;
int v27;
int v28;
int v29;
__int64 v30;
int v31;
unsigned int v32;
_DWORD *v33;
size_t v34;
VOID **v35;
size_t v36;
VOID **v37;
int v38;
int v39;
unsigned int v40;
UINT64 CompressBufferWorkSpaceSize;
UINT64 CompressFragmentWorkSpaceSize;
LODWORD(CompressBufferWorkSpaceSize) = 0;
LODWORD(CompressFragmentWorkSpaceSize) = 0;
v4 = *(_DWORD *)(a2 + 8);
if( !v4 )
return;
if( ((v4 - 1) & v4) != 0 )
return;
if( v4 - 4096 > 0x1F000 )
return;
v5 = *(_DWORD *)(a2 + 12);
if( (unsigned int)(v5 - 1) > 0x3FFFF )
return;
v6 = *(_DWORD *)a2;
if( (*(_DWORD *)a2 & 0x100) != 0 )
return;
if( (unsigned __int8)v6 == 1 )
{
v32 = *(_DWORD *)(a2 + 16);
if( !v32 )
return;
if( ((v32 - 1) & v32) != 0 )
return;
if( v32 > v4 )
return;
v33 = *(_DWORD **)(a2 + 56);
if( !v33 )
return;
v7 = *v33 == v5;
}
else
{
if( (_BYTE)v6 )
{
if( (unsigned __int8)v6 >= 2u )
return;
goto LABEL_11;
}
if( *(_DWORD *)(a2 + 16) )
return;
v7 = *(_QWORD *)(a2 + 56) == 0i64;
}
if( !v7 )
return;
LABEL_11:
if( v6 < 0x200000
&& (*(_DWORD *)a2 & 0x600) != 1536
&& (v6 & 0x10400) != 66560
&& (*(_QWORD *)(a2 + 32) == 0i64) == (*(_DWORD *)(a2 + 40) == 0) )
{
v8 = 0;
if( v4 > 0x10 )
{
do
++v8;
while( 16 << v8 < v4 );
}
*(_DWORD *)(a1 + 36) = v8;
v9 = 1 << v8;
*(_DWORD *)(a1 + 40) = 1 << v8;
*(_DWORD *)(a1 + 32) = (1 << v8) - 1;
if( *(_DWORD *)(a2 + 8) == 0x20000 )
v9 = (1 << v8) - 1;
*(_DWORD *)(a1 + 40) = v9;
if( *(_BYTE *)a2 )
*(_DWORD *)(a1 + 48) = *(_DWORD *)(a2 + 40) != 0 ? 16 : 4;
*(_DWORD *)(a1 + 44) = (unsigned int)(*(_DWORD *)(a1 + 48) + 4111) >> 4;
if( *(_DWORD *)(a2 + 12) <= (unsigned int)(1 << (32 - v8)) )
{
*(_OWORD *)a1 = *(_OWORD *)a2;
*(_OWORD *)(a1 + 16) = *(_OWORD *)(a2 + 16);
v10 = (unsigned int)(2 * *(_DWORD *)(a2 + 12));
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v10, 1951624563i64);
*(_QWORD *)(a1 + 56) = PoolWithTag;
if( PoolWithTag )
{
memset(PoolWithTag, 0i64, v10);
v12 = *(_DWORD *)a2;
if( (unsigned __int8)*(_DWORD *)a2 == 1 )
{
v34 = *(_DWORD *)(a2 + 12);
v35 = ExAllocatePoolWithTag(0x200ui64, v34, 1951624563i64);
*(_QWORD *)(a1 + 64) = v35;
if( !v35 )
return;
memset(v35, 0i64, v34);
v36 = *(_DWORD *)(a2 + 12);
v37 = ExAllocatePoolWithTag(0x200ui64, v36, 1951624563i64);
*(_QWORD *)(a1 + 72) = v37;
if( !v37 )
return;
memset(v37, 0i64, v36);
v12 = *(_DWORD *)a2;
}
v13 = 4 - ((v12 & 0x10000) != 0);
*(_WORD *)(a1 + 4032) = v13;
if( RtlGetCompressionWorkSpaceSize(v13, &CompressBufferWorkSpaceSize, &CompressFragmentWorkSpaceSize) >= 0 )
{
v15 = CompressBufferWorkSpaceSize;
v16 = CompressFragmentWorkSpaceSize;
v17 = (unsigned int)CompressBufferWorkSpaceSize <= (unsigned int)CompressFragmentWorkSpaceSize;
*(_DWORD *)(a1 + 4028) = CompressBufferWorkSpaceSize;
if( v17 )
v15 = v16;
*(_DWORD *)(a1 + 4024) = v16;
LODWORD(CompressBufferWorkSpaceSize) = v15;
if( !v15
|| (v18 = ExAllocatePoolWithTag(0x200ui64, v15, 1951624563i64), (*(_QWORD *)(a1 + 4016) = v18) != 0i64) )
{
v19 = *(_QWORD *)(a2 + 48);
if( v19 || (v19 = a1 + 3960, (int)StEtaHelper::StartHelper(a1 + 3960, 0) >= 0) )
{
*(_QWORD *)(a1 + 3952) = v19;
v20 = *(_DWORD *)a2;
v21 = *(_DWORD *)(a2 + 40);
if( (unsigned __int8)*(_DWORD *)a2 )
{
if( v21
&& (SmCrEncStart((_SMCR_ENCRYPT_CONTEXT *)(a1 + 4064), *(INT8 **)(a2 + 32), v21, v14) < 0
|| (-*(_DWORD *)(a1 + 4072) & (*(_DWORD *)(a1 + 4072) + 15)) != 16) )
{
return;
}
v20 = *(_DWORD *)a2;
}
else if( v21 )
{
return;
}
v22 = ExAllocatePoolWithTag(0x200ui64, (-(__int64)((v20 & 0x8000) != 0) & 0x1000) + 4096, 1951624563i64);
*(_QWORD *)(a1 + 4208) = v22;
if( !v22 )
return;
v24 = *(_DWORD *)a2;
if( (unsigned __int8)*(_DWORD *)a2 == 1 )
{
v26 = 1;
v25 = RtlNumberOfSetBits(*(UINT64 **)(a2 + 56));
if( v25 <= 1 )
return;
v24 = *(_DWORD *)a2;
}
else
{
v25 = *(_DWORD *)(a2 + 12);
v26 = 0;
}
if( !v26 || (v24 & 0x4000) != 0 )
v27 = 0;
else
v27 = 8;
v28 = v27 | (v24 >> 8) & 1;
if( !(_BYTE)v24 )
{
v29 = v28 | 0x40;
v40 = v29;
if( (v24 & 0x40000) == 0 )
goto LABEL_42;
v28 = v29 | 0x60;
}
v40 = v28;
LABEL_42:
ST_STORE::StDmStart(a1, a1 + 80, (int *)&v40, v23, v38, v25 - v26);
if( v31 >= 0 )
{
if( v26 )
{
v40 = v40 & 0xFFFFFFE0 | 0x16;
ST_STORE::StDmStart(a1, a1 + 2016, (int *)&v40, v30, v39, v26);
}
}
}
}
}
}
}
}
}
Referenced by:
No references.