SMKM_STORE::SmStReleaseVirtualRegion
__int64 __fastcall SMKM_STORE::SmStReleaseVirtualRegion(__int64 a1, unsigned int a2, char a3){
UINT64 v3;
_QWORD *v6;
void *v7;
int v8;
int v9;
__int64 v10;
__int64 result;
__int128 v12;
__int128 v13;
__int128 v14;
v3 = *(unsigned int *)(a1 + 6208);
v6 = (_QWORD *)(*(_QWORD *)(a1 + 6216) + 8i64 * a2);
v7 = (void *)(*v6 & 0x7FFFFFFFFFFF0000i64);
if( (a3 & 2) != 0 && !v7 )
return 1075380276i64;
v8 = 1;
v9 = a3 & 1;
if( (*(_WORD *)v6 & 0x4000) != 0 )
*(_WORD *)v6 &= ~0x4000u;
else
SMKM_STORE::SmStCheckLockInProgressRegionComplete(a1, (__int64)v6, v9);
if( SMKM_STORE::SmStIsRegionBusy(a1, a2) )
return 3221225646i64;
if( (__int64)*v6 >= 0 )
{
v8 = 0;
MmStoreDecommitVirtualMemory(v7, v3);
}
if( *(__int16 *)v6 < 0 )
return 3221225646i64;
v10 = *v6;
*v6 = 0i64;
*(_QWORD *)&v12 = v7;
v13 = 0i64;
*((_QWORD *)&v12 + 1) = v3;
LODWORD(v13) = v8 | _mm_cvtsi128_si32((__m128i)0i64) & 0xFFFFFFFE;
v14 = 0i64;
result = SMKM_STORE::SmStHelperSendCommand(a1, 3, &v12, v9 != 0 ? 11 : 8);
if( (_DWORD)result != -1073741650 )
return 0i64;
*v6 = v10;
return result;
}
Referenced by:
No references.