PopCaptureReasonContext

INT64 __fastcall PopCaptureReasonContext(
        _COUNTED_REASON_CONTEXT *Context,
        INT64 PreviousMode,
        UINT8 *ImportantTimer,
        _DIAGNOSTIC_CONTEXT **ReturnContext,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  char v9; 
  UINT64 v11; 
  ULONG StringCount; 
  PUNICODE_STRING ReasonStrings; 
  signed int Flags; 
  unsigned __int64 v15; 
  ULONG v16; 
  _DIAGNOSTIC_CONTEXT *PoolWithQuotaTag; 
  _DIAGNOSTIC_CONTEXT *v18; 
  unsigned __int64 v19; 
  union _COUNTED_REASON_CONTEXT::$3195086162F21FBC862C66B8DD0AB9D0 *p_ResourceFileName; 
  UINT8 *v21; 
  INT8 v22; 
  int v23; 
  char *v24; 
  int v25; 
  unsigned __int16 *p_Length; 
  __int64 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  UINT8 *BufferEnd; 
  __int128 v33; 
  __int128 v34; 
  WCHAR *BufferStart; 
  INT8 PreviousModea; 
  UINT8 *v37; 
  _DIAGNOSTIC_CONTEXT **v38; 
  v38 = ReturnContext;
  v37 = ImportantTimer;
  PreviousModea = PreviousMode;
  BufferStart = 0i64;
  v9 = PreviousMode;
  v34 = 0i64;
  *ReturnContext = 0i64;
  v11 = 32i64;
  if( ImportantTimer )
    *ImportantTimer = 0;
  StringCount = 0;
  ReasonStrings = 0i64;
  if( Context )
  {
    if( Context->Version )
      return 3221225485i64;
    Flags = Context->Flags;
    if( (Flags & 1) != 0 )
    {
      if( (((unsigned __int8)Context->ResourceFileName.Length + 2) & 1) != 0 )
        return 3221225485i64;
      v11 = Context->ResourceFileName.Length + 66i64;
    }
    else
    {
      if( (Flags & 2) != 0 )
      {
        if( ((LOBYTE(Context->ResourceFileName.Length) + 2) & 1) == 0 )
        {
          StringCount = Context->StringCount;
          v11 = Context->ResourceFileName.Length + 66i64;
          v15 = 16i64 * StringCount;
          if( v15 <= 0xFFFFFFFF )
          {
            ReasonStrings = Context->ReasonStrings;
            if( (_BYTE)PreviousMode && (_DWORD)v15 )
            {
              if( ((unsigned __int8)ReasonStrings & 3) != 0 )
                ExRaiseDatatypeMisalignment();
              v30 = (unsigned __int64)ReasonStrings + (unsigned int)v15;
              if( v30 > 0x7FFFFFFF0000i64 || v30 < (unsigned __int64)ReasonStrings )
                MEMORY[0x7FFFFFFF0000] = 0;
            }
            v16 = 0;
            if( !StringCount )
              goto LABEL_12;
            p_Length = &ReasonStrings->Length;
            while( 1 )
            {
              v28 = *p_Length;
              if( v28 + v11 + 2 < v11 )
                break;
              ++v16;
              p_Length += 8;
              v11 += v28 + 2;
              if( v16 >= StringCount )
                goto LABEL_12;
            }
          }
        }
        return 3221225485i64;
      }
      if( Flags >= 0 )
        return 3221225485i64;
    }
  }
  else
  {
    Flags = 0x80000000;
  }
LABEL_12:
  if( v9 )
    PoolWithQuotaTag = (_DIAGNOSTIC_CONTEXT *)ExAllocatePoolWithQuotaTag((POOL_TYPE)9, v11, 0x78435250ui64);
  else
    PoolWithQuotaTag = (_DIAGNOSTIC_CONTEXT *)ExAllocatePoolWithTag(PagedPool, v11, 0x78435250ui64);
  v18 = PoolWithQuotaTag;
  if( PoolWithQuotaTag )
  {
    *ReturnContext = PoolWithQuotaTag;
    if( Flags < 0 )
    {
      PoolWithQuotaTag->ReasonSize = 0i64;
      return 0;
    }
    v19 = ((unsigned __int64)&PoolWithQuotaTag[1].CallerType + 7) & 0xFFFFFFFFFFFFFFF8ui64;
    p_ResourceFileName = (union _COUNTED_REASON_CONTEXT::$3195086162F21FBC862C66B8DD0AB9D0 *)&Context->ResourceFileName;
    PoolWithQuotaTag->ReasonSize = (unsigned __int64)PoolWithQuotaTag + v11 - v19;
    *(_DWORD *)v19 = Flags;
    BufferStart = (WCHAR *)(v19 + 32);
    BufferEnd = (UINT8 *)PoolWithQuotaTag + v11;
    v21 = (UINT8 *)PoolWithQuotaTag + v11;
    *(_QWORD *)(v19 + 8) = 32i64;
    if( (Flags & 1) != 0 )
    {
      v23 = PopSafeCopyUnicodeString(&p_ResourceFileName->ResourceFileName, &BufferStart, v21, PreviousModea);
      if( v23 >= 0 )
      {
LABEL_19:
        if( v37 )
          *v37 = (Context->Flags & 4) != 0;
        return 0;
      }
    }
    else
    {
      v22 = PreviousModea;
      v23 = PopSafeCopyUnicodeString(&p_ResourceFileName->ResourceFileName, &BufferStart, v21, PreviousModea);
      if( v23 >= 0 )
      {
        *(_WORD *)(v19 + 16) = Context->ResourceReasonId;
        v24 = (char *)BufferStart - v19;
        *(_DWORD *)(v19 + 20) = StringCount;
        *(_QWORD *)(v19 + 24) = v24;
        v25 = 0;
        if( !StringCount )
          goto LABEL_19;
        while( 1 )
        {
          v29 = (unsigned __int64)&ReasonStrings[v25];
          if( v22 )
          {
            DWORD1(v33) = 0;
            if( v29 >= 0x7FFFFFFF0000i64 )
              v29 = 0x7FFFFFFF0000i64;
            LODWORD(v33) = *(_DWORD *)v29;
            v31 = *(_QWORD *)(v29 + 8);
            v29 = (unsigned __int64)&v34;
            *((_QWORD *)&v33 + 1) = v31;
            v34 = v33;
          }
          v23 = PopSafeCopyUnicodeString((UNICODE_STRING *)v29, &BufferStart, BufferEnd, v22);
          if( v23 < 0 )
            break;
          if( ++v25 >= StringCount )
            goto LABEL_19;
        }
      }
    }
    ExFreePoolWithTag(v18, 0x78435250u);
    *v38 = 0i64;
    return(unsigned int)v23;
  }
  return 3221225626i64;
}

Referenced by:

PoCaptureReasonContext