ExCallSessionCallBack

NTSTATUS __stdcall ExCallSessionCallBack(UINT64 *SessionId, PVOID Argument1, PVOID Argument2, INT64 *CallBackStatus){
  INT64 *v4; 
  int v7; 
  struct _DMA_ADAPTER *v8; 
  struct _DMA_ADAPTER *v9; 
  int v10; 
  union RTL_RUN_ONCE *Win32Callouts; 
  struct EX_RUNDOWN_REF *v12; 
  EX_RUNDOWN_REF *v13; 
  void *v15; 
  void *v16; 
  PVOID v17; 
  int v18; 
  NTSTATUS v19; 
  union RTL_RUN_ONCE *v20; 
  struct EX_RUNDOWN_REF *v21; 
  EX_RUNDOWN_REF *v22; 
  void *v23; 
  KAPC_STATE ApcState; 
  v4 = CallBackStatus;
  v7 = -1073741811;
  memset(&ApcState, 0, sizeof(ApcState));
  if( SessionId )
  {
    LODWORD(v8) = MmGetSessionById(*(unsigned int *)SessionId);
    v9 = v8;
    if( !v8 )
      return -1073741811;
    v10 = MmAttachSession(v8, &ApcState);
    if( v10 < 0 )
    {
      v10 = -1073741811;
    }
    else
    {
      Win32Callouts = MmSessionGetWin32Callouts();
      v12 = ExReferenceCallBackBlock((INT64 *)Win32Callouts);
      v13 = v12;
      if( v12 )
      {
        v7 = ((__int64(__fastcall *)(unsigned __int64, PVOID, PVOID))v12[1].Count)(v12[2].Count, Argument1, Argument2);
        ExDereferenceCallBackBlock((INT64 *)Win32Callouts, v13);
      }
      else
      {
        v10 = -1073741811;
      }
      MmDetachSession(v9, &ApcState);
    }
    HalPutDmaAdapter(v9);
  }
  else
  {
    LODWORD(v15) = MmGetNextSession(0i64);
    v16 = v15;
    if( v15 )
    {
      v17 = Argument2;
      do
      {
        v18 = MmGetSessionId((__int64)v16);
        v19 = MmAttachSession(v16, &ApcState);
        if( v19 >= 0 )
        {
          v20 = MmSessionGetWin32Callouts();
          v21 = ExReferenceCallBackBlock((INT64 *)v20);
          v22 = v21;
          if( v21 )
          {
            v19 = ((__int64(__fastcall *)(unsigned __int64, PVOID, PVOID))v21[1].Count)(v21[2].Count, Argument1, v17);
            ExDereferenceCallBackBlock((INT64 *)v20, v22);
          }
          MmDetachSession(v16, &ApcState);
        }
        if( v18 )
          v19 = v7;
        v7 = v19;
        LODWORD(v23) = MmGetNextSession(v16);
        v16 = v23;
      }
      while( v23 );
      v4 = CallBackStatus;
    }
    v10 = 0;
  }
  if( v10 >= 0 && v4 )
    *(_DWORD *)v4 = v7;
  return v10;
}

Referenced by:

PsInvokeWin32Callout