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