ST_STORE::StDmSinglePageCopy
__int64 __fastcall ST_STORE::StDmSinglePageCopy(
unsigned int *VirtualAddress,
void *a2,
__int64 a3,
unsigned __int64 a4,
__int64 a5,
__int64 a6){
__int64 v7;
int v10;
unsigned __int64 v11;
_SMCR_ENCRYPT_CONTEXT *v12;
int v13;
UINT8 *v14;
unsigned int v15;
_SMCR_ENCRYPT_CONTEXT *v16;
char v17;
unsigned __int64 v18;
_EX_PUSH_LOCK *v19;
unsigned int v20;
int v21;
_ETHREAD *v22;
_EX_PUSH_LOCK *v23;
size_t v25;
const VOID *v26;
_ETHREAD *CurrentThread;
UINT64 CompressedBufferSize;
UINT64 *FinalUncompressedSize;
UINT64 v30;
unsigned int v31;
PVOID WorkSpace;
__int64 Nonce;
int v34;
v7 = VirtualAddress[206];
WorkSpace = a2;
v10 = *(unsigned __int16 *)(a5 + 4) - 1;
Nonce = 0i64;
v11 = v7 + a3;
v34 = 0;
v12 = (_SMCR_ENCRYPT_CONTEXT *)*((_QWORD *)VirtualAddress + 127);
v13 = 0;
LODWORD(v30) = 0;
v14 = (UINT8 *)a4;
v15 = -v12[2] & (v12[2] + v10);
v31 = v15;
if( (a4 & 1) != 0 )
{
v14 = *(UINT8 **)(a6 + 48);
a4 &= ~1ui64;
}
v16 = v12;
if( (v11 & 3) != 0 )
{
v17 = v11;
v18 = a3 & 0xFFFFFFFFFFFFFFFCui64;
v11 &= 0xFFFFFFFFFFFFFFFCui64;
if( (v17 & 2) != 0 )
{
v25 = v7 + v15;
v26 = (const VOID *)v18;
goto LABEL_25;
}
if( v12[6] )
{
memmove(*((VOID **)VirtualAddress + 223), (const VOID *)v11, v15);
v16 = (_SMCR_ENCRYPT_CONTEXT *)*((_QWORD *)VirtualAddress + 127);
v15 = v31;
v11 = *((_QWORD *)VirtualAddress + 223);
}
}
if( v16[6] )
{
LODWORD(Nonce) = *(unsigned __int16 *)(a5 + 4);
HIDWORD(Nonce) = *(_DWORD *)(a5 + 8);
v34 = *(_DWORD *)(a5 + 12);
if( SmCrAuthDecrypt(v16, (UINT8 *)v11, (UINT8 *)v11, v15, &Nonce, FinalUncompressedSize) < 0 )
{
v20 = -1073741173;
ST_STORE::StDmPageError(VirtualAddress, (PVOID)v11, (PVOID)a4, a5, a6, -1073741173);
goto LABEL_19;
}
}
if( (VirtualAddress[194] & 0x40000) != 0 )
{
v19 = (_EX_PUSH_LOCK *)(*((_QWORD *)VirtualAddress + 100) + 6024i64);
if( a6 == -64 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(v19, 0i64);
}
else
{
if( _InterlockedCompareExchange64(&v19->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v19);
KeAbPostRelease(v19);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
v13 = 2;
}
if( *(unsigned __int16 *)(a5 + 4) >= 0x1000u )
{
v25 = *(unsigned __int16 *)(a5 + 4);
v26 = (const VOID *)v11;
goto LABEL_25;
}
LODWORD(CompressedBufferSize) = *(unsigned __int16 *)(a5 + 4);
if( RtlDecompressBufferEx(
*((_WORD *)VirtualAddress + 496),
v14,
0x1000ui64,
(UINT8 *)v11,
CompressedBufferSize,
&v30,
WorkSpace) >= 0
&& (_DWORD)v30 == 4096 )
{
if( v14 == (UINT8 *)a4 )
{
LABEL_18:
v20 = 0;
LABEL_19:
v21 = 0;
goto LABEL_20;
}
v25 = 4096;
v26 = v14;
LABEL_25:
memmove((VOID *)a4, v26, v25);
goto LABEL_18;
}
v20 = -1073741116;
v21 = 1;
v13 &= 2u;
LABEL_20:
if( v13 )
{
v22 = (_ETHREAD *)KeGetCurrentThread();
v23 = (_EX_PUSH_LOCK *)*((_QWORD *)VirtualAddress + 100);
--v22->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(v23 + 753, 0i64);
*(_DWORD *)(a6 + 64) = 2;
}
if( v21 && (ST_STORE::StDmPageError(VirtualAddress, (PVOID)v11, (PVOID)a4, a5, a6, v20) & 1) != 0 )
return 0;
return v20;
}
Referenced by:
No references.