MiMapViewOfImageSection
INT64 __fastcall MiMapViewOfImageSection(
_CONTROL_AREA *ControlArea,
_EPROCESS *RequestingProcess,
_EPROCESS *Process,
VOID **CapturedBase,
_LARGE_INTEGER *SectionOffset,
UINT64 *CapturedViewSize,
_SECTION *Section,
_SECTION_INHERIT InheritDisposition,
UINT64 ProtectionMask,
UINT64 ZeroBits,
UINT64 AllocationType,
UINT64 ImageMapFlags,
UINT64 PreferredNode){
_CONTROL_AREA *v14;
__int64 v15;
unsigned __int64 v16;
unsigned int v17;
INT64 v18;
int v19;
INT64 v20;
int v21;
unsigned int v22;
char *v23;
UINT64 v24;
INT64 v25;
INT64 v26;
unsigned int v27;
int v28;
int v29;
int v30;
unsigned int v31;
int v32;
VOID *v33;
int v34;
_ETHREAD *CurrentThread;
VOID *v36;
UINT64 v37;
int v38;
int v39;
UINT64 v40;
char *v41;
unsigned __int64 v42;
ULONG_PTR v43;
unsigned __int64 v44;
unsigned __int64 v45;
int v46;
_CONTROL_AREA *v47;
int PerSessionProtos;
int v49;
int v50;
_FILE_OBJECT *v51;
char *v52;
unsigned __int16 v53;
int v54;
unsigned int v55;
_CONTROL_AREA *v56;
__int64 v57;
ULONG v58;
int v59;
__int64 v60;
__int64 v61;
__int64 v62;
RTL_BITMAP *FixupVad;
UINT64 v64;
UINT64 v65;
UINT64 v66;
unsigned int v67;
__int64 v68;
__int16 v69;
__int64 v70;
__int16 v71;
unsigned __int64 v72;
__int64 v73;
__int16 v74;
void *v75;
unsigned int SessionId;
NTSTATUS LargePageVad;
struct _DMA_ADAPTER *v78;
unsigned __int64 v79;
struct _DMA_ADAPTER *v80;
unsigned int v81;
struct _DMA_ADAPTER *v82;
int v83;
UINT64 v84;
bool v85;
INT64 ***VadEvent;
unsigned __int64 v87;
char v88;
__int64 v89;
unsigned __int64 v90;
unsigned __int64 v91;
UINT64 v92;
__int64 v93;
_QWORD *v94;
_MI_VAD_EVENT_BLOCK **v95;
__int64 *InternalFlags;
UINT64 InternalFlagsa;
UINT64 *HINTHonored;
PVOID *StartingAddress;
unsigned __int64 v100;
__int64 v101;
UINT64 v102;
__int64 v103;
unsigned __int64 Address;
PVOID Addressa;
UINT64 StartingVpn;
UINT64 StartingVpna;
ULONG_PTR BugCheckParameter2;
unsigned __int64 v109;
__int64 v110;
INT64 v111;
_IMAGE_INFO_EX ExtendedInfo;
INT64 result[8];
int v114;
unsigned __int64 Alignment;
unsigned int Alignmenta;
v14 = ControlArea;
memset((INT64)result, 0i64);
v15 = *(_QWORD *)v14;
v16 = *((_QWORD *)RequestingProcess + 11);
v17 = 0;
v103 = v15;
memset(&ExtendedInfo, 0, sizeof(ExtendedInfo));
v18 = *(_QWORD *)(v15 + 56);
v111 = v18;
if( dword_140C4C9D0
&& dword_140C4C9D4 == *(_DWORD *)(v18 + 60)
&& dword_140C4C9D8 == *(_DWORD *)(*(_QWORD *)(v15 + 56) + 68i64) )
{
__debugbreak();
}
v100 = *(_QWORD *)(v15 + 48);
StartingVpn = *(_QWORD *)(v15 + 32);
if( ((*((_DWORD *)v14 + 14) & 0x10000000) != 0 || (*(_DWORD *)(v16 + 2172) & 0x2000) != 0)
&& (*(_BYTE *)(v15 + 15) & 1) == 0 )
{
v17 = 1025;
}
v19 = *((_DWORD *)RequestingProcess + 10);
v102 = *((_QWORD *)RequestingProcess + 2);
if( (v19 & 0x20000000) != 0 )
{
if( *(_QWORD *)(v15 + 32) < 0x100000000ui64 || v17 >= 0x400 )
return 3221225496i64;
if( (*(_BYTE *)(v18 + 44) & 1) != 0 )
return 3221226089i64;
v102 = 0x200000i64;
}
if( !SectionOffset || (SectionOffset[7].LowPart & 0x80000) != 0 || (v19 & 0x40000) != 0 )
{
if( (_DWORD)Section != 1 )
return 3221225541i64;
v17 |= 0x200u;
}
if( (v17 & 0x200) == 0 )
{
v20 = MiAllowImageMap(v16, (INT64)SectionOffset, (INT64)v14, v18);
if( (int)v20 < 0 )
return v20;
v21 = *(_DWORD *)(v16 + 2512);
if( (v21 & 0x10) != 0 && (*(_BYTE *)(v18 + 51) & 4) == 0 )
{
if( (*(_BYTE *)(v18 + 44) & 1) == 0 )
{
v17 |= 1u;
goto LABEL_12;
}
if( (v21 & 8) != 0 )
return 3221226089i64;
}
}
LABEL_12:
v22 = v17 | 2;
if( (*(_BYTE *)(v15 + 15) & 1) != 0 && (*(_DWORD *)(v16 + 2512) & 0x40) == 0 )
{
v22 |= 1u;
if( v22 < 0x400 )
v22 &= ~2u;
}
v109 = 0i64;
if( (v22 & 0x200) != 0 )
goto LABEL_17;
v23 = (char *)v14 + 128;
if( v14 == (_CONTROL_AREA *)-128i64 )
goto LABEL_17;
while( (v23[32] & 0xEu) < 0xC )
{
v23 = (char *)*((_QWORD *)v23 + 2);
if( !v23 )
goto LABEL_17;
}
v20 = MiArbitraryCodeBlocked(*((_QWORD *)RequestingProcess + 12));
if( (int)v20 >= 0 )
{
LABEL_17:
BugCheckParameter2 = (ULONG_PTR)v14 + 128;
MiCheckPurgeAndUpMapCount((__int64)v14);
v24 = *((_QWORD *)RequestingProcess + 3);
Alignment = v24;
LODWORD(v25) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v26 = v25;
if( !v25 )
{
MiDereferenceControlArea((__int64)v14);
return 3221225626i64;
}
v27 = *(_DWORD *)(v25 + 64) & 0xFBFFFFFF;
*(_QWORD *)v25 = -2i64;
*(_QWORD *)(v25 + 8) = -2i64;
*(_QWORD *)(v25 + 16) = -2i64;
v28 = 0;
if( (_DWORD)CapturedViewSize == 1 )
v28 = 0x4000000;
v29 = v28 | v27;
v30 = *(_DWORD *)(v26 + 48);
*(_DWORD *)(v26 + 64) = v29;
v31 = v30 & 0xFFFFFF8F | 0x20;
*(_DWORD *)(v26 + 48) = v31;
v32 = v31 ^ (v31 ^ (*((_DWORD *)RequestingProcess + 13) << 12)) & 0x3F000;
*(_DWORD *)(v26 + 48) = v32;
if( SectionOffset )
{
v33 = MiReferenceFileObjectForMap((INT64)SectionOffset);
v34 = *(_DWORD *)(v26 + 64);
*(_QWORD *)(v26 + 128) = v33;
LODWORD(v33) = v34 & 0xF7FFFFFF | ((unsigned int)SectionOffset[7].HighPart >> 4) & 0x8000000;
v32 = *(_DWORD *)(v26 + 48);
*(_DWORD *)(v26 + 64) = (_DWORD)v33;
}
*(_QWORD *)(v26 + 40) = 0i64;
if( (v22 & 0x200) != 0 )
{
v67 = v22 | 1;
v22 = v22 & 0xFFFFFFFC | 1;
*(_DWORD *)(v26 + 48) = v32 & 0xFFFFF07F | 0x80;
if( v67 >= 0x400 )
v22 = v67;
}
else
{
*(_DWORD *)(v26 + 48) = v32 & 0xFFFFF07F | 0x380;
if( (*(_BYTE *)(v16 + 992) & 1) != 0 )
*(_DWORD *)(v26 + 64) |= 0x10000000u;
*(_DWORD *)(v26 + 52) ^= (*(_DWORD *)(v26 + 52) ^ v100) & 0x7FFFFFFF;
*(_BYTE *)(v26 + 34) = v100 >> 31;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v101 = (__int64)CurrentThread;
if( (*((_DWORD *)RequestingProcess + 18) & 1) == 0 || v102 == 0x200000 )
v36 = (VOID *)(StartingVpn + *(unsigned int *)CapturedBase);
else
v36 = *(VOID **)Process;
Address = (unsigned __int64)v36;
if( v102 == 0x200000 )
{
Alignment = (*((_QWORD *)RequestingProcess + 3) + 0x1FFFFFi64) & 0xFFFFFFFFFFE00000ui64;
v22 = v22 & 0xFFFFFFFC | 1;
*(_DWORD *)(v26 + 52) ^= (*(_DWORD *)(v26 + 52) ^ (Alignment >> 12)) & 0x7FFFFFFF;
*(_BYTE *)(v26 + 34) = Alignment >> 43;
*(_DWORD *)(v26 + 64) |= 0x1000000u;
LargePageVad = MiCreateLargePageVad((_EPROCESS *)v16, (_MMVAD_SHORT *)v26);
if( LargePageVad < 0 )
{
v78 = *(struct _DMA_ADAPTER **)(v26 + 128);
if( v78 )
HalPutDmaAdapter(v78);
MiDereferenceControlArea((__int64)v14);
ExFreePoolWithTag((PVOID)v26, 0);
return(unsigned int)LargePageVad;
}
v24 = Alignment;
CurrentThread = (_ETHREAD *)v101;
}
v110 = 0i64;
if( MiUserHotPatchReserveSize
&& *(_WORD *)(v111 + 48) == 0x8664
&& (v22 & 0x200) == 0
&& (*(_DWORD *)(v26 + 64) & 0x1000000) == 0
&& v24 < 0x7FFFFFFF
&& (*(_BYTE *)(v16 + 992) & 1) == 0 )
{
if( (v24 >> 12) + ((v24 & 0xFFF) != 0) == *(_DWORD *)(v103 + 8) )
{
v79 = v24 + (unsigned int)MiUserHotPatchReserveSize;
if( v79 < v24 )
{
v80 = *(struct _DMA_ADAPTER **)(v26 + 128);
if( v80 )
HalPutDmaAdapter(v80);
MiDereferenceControlArea((__int64)v14);
ExFreePoolWithTag((PVOID)v26, 0);
return 3221225503i64;
}
v24 += (unsigned int)MiUserHotPatchReserveSize;
Alignment = v79;
}
CurrentThread = (_ETHREAD *)v101;
}
if( (*(_DWORD *)(v26 + 48) & 0xF80) == 896
&& *(_QWORD *)(v16 + 1088)
&& (*(_DWORD *)(v16 + 2172) & 0x1000) == 0
&& v16 != PsSecureSystemProcess
&& (PspNotifyEnableMask & 1) != 0 )
{
v22 |= 0x800u;
}
v114 = 32;
LOCK_ADDRESS_SPACE((__int64)CurrentThread, v16);
if( (*(_DWORD *)(v16 + 1124) & 0x20) != 0 )
{
PerSessionProtos = -1073741558;
goto LABEL_188;
}
v37 = v102;
if( (*((_DWORD *)RequestingProcess + 18) & 1) != 0 && v102 != 0x200000 )
{
v95 = (_MI_VAD_EVENT_BLOCK **)*((_QWORD *)RequestingProcess + 1);
MiIsVaRangeAvailable((_EPROCESS *)v16, v36, v24, *(VOID **)RequestingProcess);
if( !v83 )
{
PerSessionProtos = -1073741800;
goto LABEL_188;
}
LABEL_41:
v39 = 1073741827;
v40 = StartingVpn;
v41 = (char *)(Address - *(unsigned int *)CapturedBase);
if( v41 == (char *)StartingVpn )
v39 = 0;
*(_DWORD *)(v26 + 24) = Address >> 12;
StartingVpna = Address >> 12;
*(_BYTE *)(v26 + 32) = Address >> 12 >> 32;
v42 = (Address - 1 + v24) >> 12;
*(_DWORD *)(v26 + 28) = v42;
*(_BYTE *)(v26 + 33) = BYTE4(v42);
v43 = BugCheckParameter2;
v44 = (unsigned __int64)*CapturedBase >> 12;
v45 = *(unsigned int *)(BugCheckParameter2 + 44);
if( v44 >= v45 )
{
do
{
v43 = *(_QWORD *)(v43 + 16);
v44 -= v45;
v45 = *(unsigned int *)(v43 + 44);
}
while( v44 >= v45 );
BugCheckParameter2 = v43;
}
*(_QWORD *)(v26 + 72) = v43;
v46 = v39;
Alignmenta = v39;
*(_QWORD *)(v26 + 80) = *(_QWORD *)(v43 + 8) + 8 * v44;
*(_QWORD *)(v26 + 88) = *(_QWORD *)(v103 + 64) + 8 * (*(unsigned int *)(v103 + 8) - 1i64);
if( (InheritDisposition & 4) == 0 )
{
Alignmenta = v39;
if( v16 != PsSecureSystemProcess )
{
Alignmenta = v39;
if( v41 != (char *)v40 )
{
if( (*((_DWORD *)RequestingProcess + 10) & 0x800000) == 0 && (v22 & 0x400) == 0
|| (*((_DWORD *)ControlArea + 14) & 0x800) != 0
|| (v22 & 2) == 0 )
{
Alignmenta = v39;
if( (v22 & 0x400) != 0 )
{
PerSessionProtos = -1073741800;
goto LABEL_154;
}
}
else
{
FixupVad = MiAllocateFixupVad(v26);
if( FixupVad )
{
ExFreePoolWithTag((PVOID)v26, 0);
v26 = (INT64)FixupVad;
v46 = 1073741878;
Alignmenta = 1073741878;
}
else
{
Alignmenta = v39;
v46 = v39;
if( (v22 & 0x400) != 0 )
{
PerSessionProtos = -1073741670;
goto LABEL_154;
}
}
}
}
}
}
if( *((_DWORD *)RequestingProcess + 13) )
*(_BYTE *)(*(_QWORD *)(v16 + 1680) + 352i64) = 1;
v47 = ControlArea;
if( (*((_DWORD *)ControlArea + 14) & 0x4000000) != 0 )
{
SessionId = MmGetSessionIdEx(v16);
PerSessionProtos = MiCreatePerSessionProtos(ControlArea, SessionId);
if( PerSessionProtos < 0 )
goto LABEL_154;
v47 = ControlArea;
v22 |= 0x80u;
}
if( (*(_DWORD *)(v26 + 64) & 0x10000000) != 0 )
{
v89 = *(unsigned int *)(v26 + 52);
LODWORD(v89) = v89 & 0x7FFFFFFF;
v90 = v89 | ((unsigned __int64)*(unsigned __int8 *)(v26 + 34) << 31);
v91 = MiUpdatePrivateDemandZeroView(v16, v26, 0i64) + v90;
*(_DWORD *)(v26 + 52) ^= (*(_DWORD *)(v26 + 52) ^ v91) & 0x7FFFFFFF;
*(_BYTE *)(v26 + 34) = v91 >> 31;
result[1] = v101;
MiInsertVadEvent((_MMVAD_SHORT *)v26, (_MI_VAD_EVENT_BLOCK *)result, 0i64);
v47 = ControlArea;
v22 |= 0x20u;
}
PerSessionProtos = MiInsertSharedCommitNode(v47, v16, 0);
if( PerSessionProtos >= 0 )
{
v22 |= 0x40u;
v49 = MiControlAreaRequiresCharge((INT64)ControlArea);
if( v49 )
{
if( v49 != 2 )
goto LABEL_55;
PerSessionProtos = MiReferenceActiveSubsection(BugCheckParameter2, v50, 0x11u);
if( PerSessionProtos >= 0 )
{
v22 |= 0x100u;
LABEL_55:
PerSessionProtos = MiInsertVadCharges(v26, v16);
if( PerSessionProtos >= 0 )
{
if( v46 == 1073741878 )
++*(_QWORD *)(*(_QWORD *)(v16 + 1680) + 384i64);
MiGetWsAndInsertVad(v26);
v51 = 0i64;
if( v102 == 0x200000 )
{
MiLockVad(v101, v26);
PerSessionProtos = MiMapUserLargePages(v26);
if( PerSessionProtos < 0 )
{
UNLOCK_ADDRESS_SPACE_UNORDERED(v101, v16);
goto LABEL_236;
}
MiUnlockVad(v101, v26);
}
v52 = (char *)((v109 << 16) + Address);
Addressa = v52;
*(_QWORD *)Process = v52;
if( !*(_BYTE *)(v111 + 50)
|| (v53 = *(_WORD *)(v111 + 48), v53 >= KUSER_SHARED_DATA.ImageNumberLow)
&& v53 <= KUSER_SHARED_DATA.ImageNumberHigh
|| (v68 = *(_QWORD *)(v16 + 1408)) != 0 && ((v69 = *(_WORD *)(v68 + 8), v69 == 332) || v69 == 452) )
{
v54 = Alignmenta;
}
else
{
v54 = 1073741838;
Alignmenta = 1073741838;
}
v55 = v22 | 4;
if( (v55 & 0x200) != 0 )
{
LABEL_77:
if( (v55 & 8) == 0 )
{
v62 = v101;
LABEL_92:
if( (v55 & 4) != 0 )
UNLOCK_ADDRESS_SPACE(v62, v16);
if( (v55 & 0x200) == 0 && SectionOffset && (*(_BYTE *)(v16 + 992) & 1) == 0 )
*((_DWORD *)RequestingProcess + 18) |= 4u;
return Alignmenta;
}
MiLockVad(v101, v26);
UNLOCK_ADDRESS_SPACE_UNORDERED(v101, v16);
v55 &= ~4u;
if( (*(_DWORD *)(v26 + 64) & 0x10000000) != 0 )
{
MiUpdatePrivateDemandZeroView(v16, v26, 1i64);
MiRemoveVadEvent(v26, result);
v55 &= ~0x20u;
}
if( (v55 & 0x10) == 0
|| (PerSessionProtos = MiCommitVadCfgBits(v26, 0i64, 0i64), PerSessionProtos >= 0) )
{
if( *((_QWORD *)RequestingProcess + 10) )
{
v92 = *((unsigned int *)RequestingProcess + 19);
if( (_DWORD)v92 != 4 && (unsigned int)(v92 - 1) > 1 && (_DWORD)v92 != -2147483647 )
{
PerSessionProtos = -1073741755;
goto LABEL_236;
}
InternalFlags = &v110;
LODWORD(v95) = 0;
PerSessionProtos = MiSecureVad(
(_MMVAD_SHORT *)v26,
Addressa,
*((_QWORD *)RequestingProcess + 3),
v92,
v95);
if( PerSessionProtos < 0 )
goto LABEL_236;
**((_QWORD **)RequestingProcess + 10) = v110 ^ qword_140C4DB90 ^ v16;
v60 = 0i64;
}
else
{
v60 = v110;
}
if( v55 < 0x800
|| (v60 = (__int64)MiAddSecureEntry(v26, StartingVpna << 12, (v42 << 12) | 0xFFF, -2147483647, 0)) != 0 )
{
if( (*((_DWORD *)RequestingProcess + 15) & 2) != 0 )
MiSoftFaultMappedView(v26);
v61 = v26;
v62 = v101;
MiUnlockVad(v101, v61);
if( v55 >= 0x800 )
{
PsCallImageNotifyRoutines(&v51->FileName, (PVOID)v16, &ExtendedInfo, v51);
HalPutDmaAdapter((PADAPTER_OBJECT)v51);
}
if( v60 )
MmUnsecureVirtualMemory((PVOID)(v60 ^ qword_140C4DB90 ^ v16));
goto LABEL_92;
}
PerSessionProtos = -1073741670;
}
LABEL_236:
MiReferenceVad(v26);
if( v51 )
HalPutDmaAdapter((PADAPTER_OBJECT)v51);
MiUnmapVad(
(_MMVAD *)v26,
0i64,
0i64,
v93,
(__int64)v95,
(__int64)InternalFlags,
(__int64)HINTHonored,
(int)StartingAddress);
v94 = (_QWORD *)*((_QWORD *)RequestingProcess + 10);
if( v94 )
*v94 = 0i64;
return(unsigned int)PerSessionProtos;
}
if( (NtGlobalFlag & 0x40000) == 0
|| (v72 = (unsigned int)(v54 - 1073741827), (unsigned int)v72 <= 0x33)
&& (v73 = 0x8000000000801i64, _bittest64(&v73, v72)) )
{
v56 = ControlArea;
}
else
{
v57 = v103;
if( (*(_BYTE *)(v101 + 1304) & 0x20) != 0
|| (v74 = *(_WORD *)(v103 + 12), (v74 & 0x2000) != 0)
|| *(char *)(v103 + 14) >= 0 )
{
v56 = ControlArea;
goto LABEL_67;
}
*(_WORD *)(v103 + 12) = v74 | 0x2000;
v75 = v52;
v56 = ControlArea;
MiLoadUserSymbols(ControlArea, v75, (_EPROCESS *)v16);
}
v57 = v103;
LABEL_67:
if( v55 >= 0x800 )
{
LOBYTE(ExtendedInfo.ImageInfo.Properties) = 3;
if( (*(_DWORD *)(v26 + 64) & 0x8000000) != 0 )
v58 = ExtendedInfo.ImageInfo.Properties & 0xFFF80FFF;
else
v58 = ExtendedInfo.ImageInfo.Properties & 0xFFF80FFF | ((*(_BYTE *)(v57 + 15) & 0xF0 | ((*(_BYTE *)(v57 + 15) & 0xE) << 7)) << 8);
v59 = 0;
if( Alignmenta == 1073741838 )
v59 = 2048;
ExtendedInfo.ImageInfo.Properties = v58 & 0xFFFFF7FF | v59;
ExtendedInfo.ImageInfo.ImageBase = Addressa;
ExtendedInfo.ImageInfo.ImageSize = *((_QWORD *)RequestingProcess + 3);
if( *((_QWORD *)RequestingProcess + 3) != _InterlockedCompareExchange64(
(volatile signed __int64 *)(v57 + 24),
-1i64,
-1i64) )
ExtendedInfo.ImageInfo.Properties |= 0x80000u;
ExtendedInfo.ImageInfo.ImageSelector = 0;
ExtendedInfo.ImageInfo.ImageSectionNumber = 0;
v51 = MiReferenceControlAreaFile(v56);
v55 |= 8u;
}
if( MiIsProcessCfgEnabled() )
{
v55 |= 0x18u;
}
else if( (*(_DWORD *)(v26 + 64) & 0x10000000) != 0
|| *((_QWORD *)RequestingProcess + 10)
|| (*((_DWORD *)RequestingProcess + 15) & 2) != 0 )
{
v55 |= 8u;
}
goto LABEL_77;
}
}
}
else
{
PerSessionProtos = -1073740277;
}
}
LABEL_154:
v14 = ControlArea;
LABEL_188:
if( (v22 & 0x80u) != 0 )
{
v81 = MmGetSessionIdEx(v16);
MiDereferencePerSessionProtos((__int64 *)v14, v81);
}
if( (v22 & 0x100) != 0 )
MiReturnCrossPartitionControlAreaCharges((INT64)v14);
if( (v22 & 0x40) != 0 )
MiRemoveSharedCommitNode(v14, v16, 0i64);
UNLOCK_ADDRESS_SPACE(v101, v16);
if( (v22 & 0x20) != 0 )
MiRemoveVadEvent(v26, result);
if( v26 )
{
if( v102 == 0x200000 )
MiReleaseVadEventBlocks(v26, 0);
v82 = *(struct _DMA_ADAPTER **)(v26 + 128);
if( v82 )
HalPutDmaAdapter(v82);
ExFreePoolWithTag((PVOID)v26, 0);
}
MiDereferenceControlArea((__int64)v14);
return(unsigned int)PerSessionProtos;
}
if( v24 > 0x7FFFFFFF0000i64 )
{
PerSessionProtos = -1073741801;
goto LABEL_188;
}
if( (v22 & 1) == 0 )
{
v95 = (_MI_VAD_EVENT_BLOCK **)*((_QWORD *)RequestingProcess + 1);
MiIsVaRangeAvailable((_EPROCESS *)v16, v36, v24, *(VOID **)RequestingProcess);
if( v38 )
goto LABEL_41;
}
v64 = *((_QWORD *)RequestingProcess + 1);
v65 = 0i64;
if( StartingVpn < 0x100000000i64 && v64 >= 0x100000000i64 && (*(_BYTE *)(v103 + 15) & 1) == 0 )
v64 = 0xFFFFFFFFi64;
if( (*(_BYTE *)(v103 + 14) & 0x40) != 0 )
{
v70 = *(_QWORD *)(v16 + 1408);
if( !v70 || (v71 = *(_WORD *)(v70 + 8), v71 != 332) && v71 != 452 )
v65 = 0x100000000i64;
}
if( *(_QWORD *)RequestingProcess >= v64 )
{
PerSessionProtos = -1073741801;
}
else
{
LODWORD(StartingAddress) = 0;
LODWORD(HINTHonored) = (*(_DWORD *)(v26 + 48) >> 7) & 0x1F;
PerSessionProtos = MiSelectUserAddress(
*((unsigned int *)RequestingProcess + 10),
*(_QWORD *)RequestingProcess,
v64,
Alignment,
v37,
v65,
HINTHonored,
StartingAddress);
if( PerSessionProtos >= 0 )
{
v24 = Alignment;
v66 = v102;
LABEL_110:
if( v66 == 0x200000 )
{
if( v24 - *((_QWORD *)RequestingProcess + 3) >= 0x10000 )
v109 = (unsigned int)ExGenRandom(1i64) % ((v24 - *((_QWORD *)RequestingProcess + 3)) >> 16);
VadEvent = MiLocateVadEvent(v26, 16i64);
VadEvent[2] = (INT64 **)(v87 >> 12);
*((_BYTE *)VadEvent + 8) = v88;
}
goto LABEL_41;
}
}
v84 = *((_QWORD *)RequestingProcess + 1);
v85 = v64 == v84;
v24 = Alignment;
if( v85 )
{
v66 = v102;
}
else
{
LODWORD(StartingAddress) = 0;
LODWORD(HINTHonored) = (*(_DWORD *)(v26 + 48) >> 7) & 0x1F;
InternalFlagsa = v65;
v66 = v102;
PerSessionProtos = MiSelectUserAddress(
*((unsigned int *)RequestingProcess + 10),
*(_QWORD *)RequestingProcess,
v84,
Alignment,
v102,
InternalFlagsa,
HINTHonored,
StartingAddress);
}
if( PerSessionProtos < 0 )
goto LABEL_154;
goto LABEL_110;
}
return v20;
}Referenced by:
MiMapImageInSystemProcess
MiMapViewOfSection