MiIssueHardFaultIo
__int64 __fastcall MiIssueHardFaultIo(__int64 a1, int a2, __int64 a3){
unsigned int v4;
int v5;
int v6;
int v7;
__int64 v8;
signed __int32 v9;
struct _KEVENT *v10;
int *v11;
int v12;
unsigned int v13;
__int64 v15;
__int64 v16;
unsigned __int64 v17;
signed __int32 v18;
UINT64 Flags;
v4 = *(_DWORD *)(a1 + 192);
v5 = v4 & 8;
if( (v4 & 0x100) != 0 )
{
v15 = (a1 + 272) | 1;
if( !v5 )
v15 = a1 + 272;
v16 = v15;
if( (a3 & 1) != 0 )
{
v17 = a3 & 0xFFFFFFFFFFFFFFFEui64;
if( *(_BYTE *)v17 == 1 && (*(_DWORD *)(v17 + 80) & 0x800) != 0 )
v16 = v15 | 2;
}
v11 = (int *)(a1 + 80);
v10 = (struct _KEVENT *)(a1 + 32);
v12 = SmPageRead((union MM_STORE_KEY *)(a1 + 96), v16);
}
else
{
v6 = (v4 >> 1) & 4 | 1;
if( (v4 & 0x40000) == 0 )
v6 = (v4 >> 1) & 4;
if( (v4 & 8) != 0 )
{
v7 = v6 | 2;
}
else
{
v7 = v6;
if( !a2 && (unsigned int)MiGetSystemRegionType(*(_QWORD *)(a1 + 224)) == 8 )
v7 = v6 | 2;
}
if( !v5 )
{
v8 = *((_QWORD *)KeGetCurrentThread() + 68);
v9 = *(_DWORD *)(v8 + 2272);
while( v9 )
{
v18 = v9;
v9 = _InterlockedCompareExchange((volatile signed __int32 *)(v8 + 2272), v9 - 1, v9);
if( v18 == v9 )
{
v7 |= 8u;
break;
}
}
}
v10 = (struct _KEVENT *)(a1 + 32);
v11 = (int *)(a1 + 80);
LODWORD(Flags) = v7;
v12 = IoPageReadEx(
*(FILE_OBJECT **)(a1 + 200),
(MDL *)(a1 + 272),
(LARGE_INTEGER *)(a1 + 96),
(KEVENT *)(a1 + 32),
(IO_STATUS_BLOCK *)(a1 + 80),
Flags,
0i64);
}
v13 = v12;
if( v12 < 0 )
{
*(_QWORD *)(a1 + 88) = 0i64;
*v11 = v12;
KeSetEvent(v10, 0);
}
return v13;
}Referenced by:
MiIssueHardFault
MiPfCoalesceAndIssueIOs
MiPfIssueCoalesceCandidates