MiShareExistingControlArea
NTSTATUS __fastcall MiShareExistingControlArea(INT64 a1){
INT64 v1;
_FILE_OBJECT *v3;
NTSTATUS v4;
__int64 v5;
NTSTATUS v6;
_LARGE_INTEGER v7;
NTSTATUS result;
_LARGE_INTEGER v9;
_LARGE_INTEGER FileSize;
v1 = *(_QWORD *)(a1 + 64);
FileSize.QuadPart = 0i64;
v3 = *(_FILE_OBJECT **)(a1 + 56);
v4 = MiValidateControlAreaPartition(a1, v1);
if( v4 < 0 )
{
if( (*(_DWORD *)a1 & 2) != 0 )
{
IoSetTopLevelIrp(*(_IRP **)(a1 + 184));
FsRtlReleaseFile(v3);
*(_DWORD *)a1 &= ~2u;
}
return v4;
}
else
{
if( (*(_DWORD *)(v1 + 56) & 0x200) != 0 && !PsIsCurrentThreadPrefetching() )
MmChangeSectionBackingFile(0i64, v3, (unsigned int)((*(_DWORD *)(a1 + 16) & 0x1000000) != 0) + 1);
*(_DWORD *)a1 |= 4u;
v5 = *(_QWORD *)v1;
if( (*(_DWORD *)a1 & 1) == 0 && (*(_BYTE *)(v1 + 56) & 0x20) == 0 )
{
v6 = FsRtlGetFileSize(v3, &FileSize);
IoSetTopLevelIrp(*(_IRP **)(a1 + 184));
FsRtlReleaseFile(v3);
*(_DWORD *)a1 &= ~2u;
if( v6 < 0 )
return v6;
v7 = FileSize;
if( !FileSize.QuadPart && !*(_QWORD *)(a1 + 152) )
return -1073741538;
}
else
{
if( (*(_DWORD *)a1 & 2) != 0 )
{
IoSetTopLevelIrp(*(_IRP **)(a1 + 184));
FsRtlReleaseFile(v3);
*(_DWORD *)a1 &= ~2u;
}
if( (*(_DWORD *)(a1 + 16) & 0x1000000) != 0 )
{
result = MiValidateExistingImage((unsigned int *)a1);
if( result < 0 )
return result;
}
v7.QuadPart = _InterlockedCompareExchange64((volatile signed __int64 *)(v5 + 24), -1i64, -1i64);
}
v9 = *(_LARGE_INTEGER *)(a1 + 152);
if( v9.QuadPart )
{
if( v7.QuadPart < (unsigned __int64)v9.QuadPart )
{
if( (*(_DWORD *)(a1 + 28) & 0x44) == 0 )
return -1073741760;
}
else
{
*(_DWORD *)a1 |= 8u;
}
*(_LARGE_INTEGER *)(a1 + 128) = v9;
}
else
{
*(_DWORD *)a1 |= 8u;
*(_LARGE_INTEGER *)(a1 + 128) = v7;
}
return 0;
}
}Referenced by:
MiCreateImageOrDataSection