SmIssueIo

INT64 __fastcall SmIssueIo(UINT64 a1, ULONG a2, ULONG a3, ULONG a4, VOID *a5, UINT64 a6){
  int v6; 
  UINT64 v7; 
  int v8; 
  int v13; 
  unsigned int v14; 
  __int64 v15; 
  void(__stdcall *v16)(void *, struct _IO_STATUS_BLOCK *, unsigned int); 
  struct _EX_RUNDOWN_REF *v17; 
  __int64 v19[2]; 
  ULONG v20; 
  ULONG v21; 
  ULONG v22; 
  int v23; 
  UINT64 v24; 
  v6 = 0;
  v7 = a6 & 0xFFFFFFFFFFFFFFFEui64;
  v8 = 0;
  if( (a6 & 1) == 0 )
    v7 = a6;
  if( (*(_DWORD *)(v7 + 28) & 4) != 0 )
  {
    if( (*(_BYTE *)(a1 + 6021) & 1) != 0 )
      return(unsigned int)-1073741058;
  }
  else
  {
    if( !SmKmStoreReference((INT64)&SmGlobals, *(unsigned int *)(a1 + 6016)) )
      return(unsigned int)-1073741058;
    v6 = 1;
  }
  if( (a6 & 1) != 0 )
  {
    _InterlockedIncrement((volatile signed __int32 *)(a1 + 6104));
    v8 = 1;
  }
  v24 = 0i64;
  v14 = *(_DWORD *)a1;
  v23 = *(_DWORD *)(a1 + 6208);
  v19[1] = (__int64)a5;
  v22 = a2;
  v21 = a3;
  v20 = a4;
  v24 = a6 & 1;
  if( (v14 & 0x2000) != 0 )
  {
    v15 = v7 + 32;
    v7 = a1;
    v19[0] = v15;
    v16 = (void(__stdcall *)(void *, struct _IO_STATUS_BLOCK *, unsigned int))SmpIoCompletionApc;
  }
  else
  {
    *(_QWORD *)(v7 + 40) = a1;
    v19[0] = v7 + 48;
    v16 = (void(__stdcall *)(void *, struct _IO_STATUS_BLOCK *, unsigned int))SmpDeviceIoCompletion;
    *(_DWORD *)(v7 + 32) = a4;
    v14 = *(_DWORD *)a1;
  }
  v13 = SmKmIssueIo((struct _SMKM_FILE_INFO *)(a1 + 6216), (__int64)v19, v16, (void *)v7, (v14 >> 13) & 1);
  if( v13 >= 0 )
  {
    v6 = 0;
    v8 = 0;
  }
  if( v8 )
    _InterlockedDecrement((volatile signed __int32 *)(a1 + 6104));
  if( v6 )
  {
    v17 = (struct _EX_RUNDOWN_REF *)SmKmStoreRefFromStoreIndex((INT64)&SmGlobals, *(_DWORD *)(a1 + 6016) & 0x3FF);
    ExReleaseRundownProtection(v17 + 1);
  }
  return(unsigned int)v13;
}

Referenced by:

ST_STORE::StDeviceIoIssue
ST_STORE::StStagingRegionIssueIo