ST_STORE::StDmSinglePageCopy
__int64 __fastcall ST_STORE::StDmSinglePageCopy(
__int64 a1,
__int64 a2,
__int64 a3,
__int64 a4,
ULONG_PTR a5,
__int64 a6){
__int64 v7;
__int64 a7;
int v10;
unsigned __int64 v11;
INT64 v12;
int v13;
UINT8 *v14;
unsigned int v15;
INT64 v16;
char v17;
INT64 *v18;
unsigned int v19;
int v20;
_ETHREAD *v21;
__int64 v22;
UINT64 v24;
UINT8 *v25;
_ETHREAD *CurrentThread;
INT64 a5a;
UINT64 *FinalUncompressedSize;
UINT64 v29;
unsigned int v30;
PVOID WorkSpace;
INT64 v32;
int v33;
v7 = *(unsigned int *)(a1 + 824);
WorkSpace = (PVOID)a2;
a7 = a3;
v10 = *(unsigned __int16 *)(a5 + 4) - 1;
v32 = 0i64;
v11 = v7 + a3;
v33 = 0;
v12 = *(_QWORD *)(a1 + 1016);
v13 = 0;
LODWORD(v29) = 0;
v14 = (UINT8 *)a4;
v15 = -*(_DWORD *)(v12 + 8) & (*(_DWORD *)(v12 + 8) + v10);
v30 = v15;
if( (a4 & 1) != 0 )
{
v14 = *(UINT8 **)(a6 + 48);
a4 &= ~1ui64;
}
v16 = v12;
if( (v11 & 3) != 0 )
{
v17 = v11;
a7 &= 0xFFFFFFFFFFFFFFFCui64;
v11 &= 0xFFFFFFFFFFFFFFFCui64;
if( (v17 & 2) != 0 )
{
v24 = (unsigned int)v7 + v15;
v25 = (UINT8 *)a7;
goto LABEL_25;
}
if( *(_DWORD *)(v12 + 24) )
{
memmove(*(UINT8 **)(a1 + 1784), (UINT8 *)v11, v15);
v16 = *(_QWORD *)(a1 + 1016);
v15 = v30;
v11 = *(_QWORD *)(a1 + 1784);
}
}
if( *(_DWORD *)(v16 + 24) )
{
LODWORD(v32) = *(unsigned __int16 *)(a5 + 4);
HIDWORD(v32) = *(_DWORD *)(a5 + 8);
v33 = *(_DWORD *)(a5 + 12);
if( SmCrAuthDecrypt(v16, (UINT8 *)v11, (UINT64 *)v11, v15, (INT64)&v32, (INT64)FinalUncompressedSize, a7) < 0 )
{
v19 = -1073741173;
ST_STORE::StDmPageError(a1, (void *)v11, (void *)a4, a5, a6, -1073741173);
goto LABEL_19;
}
}
if( (*(_DWORD *)(a1 + 776) & 0x40000) != 0 )
{
v18 = (INT64 *)(*(_QWORD *)(a1 + 800) + 6024i64);
if( a6 == -64 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx((UINT64)v18, 0i64);
}
else
{
if( _InterlockedCompareExchange64(v18, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v18);
KeAbPostRelease(v18);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
v13 = 2;
}
if( *(unsigned __int16 *)(a5 + 4) >= 0x1000u )
{
v24 = *(unsigned __int16 *)(a5 + 4);
v25 = (UINT8 *)v11;
goto LABEL_25;
}
LODWORD(a5a) = *(unsigned __int16 *)(a5 + 4);
if( RtlDecompressBufferEx(*(_WORD *)(a1 + 992), v14, 0x1000ui64, (UINT8 *)v11, a5a, &v29, WorkSpace) >= 0
&& (_DWORD)v29 == 4096 )
{
if( v14 == (UINT8 *)a4 )
{
LABEL_18:
v19 = 0;
LABEL_19:
v20 = 0;
goto LABEL_20;
}
v24 = 4096i64;
v25 = v14;
LABEL_25:
memmove((UINT8 *)a4, v25, v24);
goto LABEL_18;
}
v19 = -1073741116;
v20 = 1;
v13 &= 2u;
LABEL_20:
if( v13 )
{
v21 = (_ETHREAD *)KeGetCurrentThread();
v22 = *(_QWORD *)(a1 + 800);
--*((_WORD *)v21 + 243);
ExAcquirePushLockSharedEx(v22 + 6024, 0i64);
*(_DWORD *)(a6 + 64) = 2;
}
if( v20 && (ST_STORE::StDmPageError(a1, (void *)v11, (void *)a4, a5, a6, v19) & 1) != 0 )
return 0;
return v19;
}
Referenced by:
No references.