NtRaiseHardError

NTSTATUS __stdcall NtRaiseHardError(
        NTSTATUS ErrorStatus,
        UINT64 NumberOfParameters,
        UINT64 UnicodeStringParameterMask,
        PULONG_PTR Parameters,
        UINT64 ValidResponseOptions,
        PULONG Response,
        INT64 a7,
        UINT64 *a8){
  unsigned int v8; 
  unsigned int v9; 
  __int64 v11; 
  __int64 v12; 
  unsigned int i; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  UINT64 v18; 
  int v19; 
  UINT64 *TrustedParameters; 
  UINT64 v22; 
  UINT64 *v23; 
  UINT64 *v24; 
  UINT64 v25; 
  int v26; 
  __int64 Src[5]; 
  UINT64 v28[15]; 

  v8 = UnicodeStringParameterMask;
  v9 = NumberOfParameters;
  LODWORD(v25) = 0;
  if( (unsigned int)NumberOfParameters > 5 )
    return -1073741584;
  if( Parameters )
  {
    if( (_DWORD)NumberOfParameters )
      goto LABEL_6;
    return -1073741584;
  }
  if( (_DWORD)NumberOfParameters )
    return -1073741584;
LABEL_6:
  if( KeGetCurrentThread()->PreviousMode )
  {
    if( (unsigned int)ValidResponseOptions > 8 )
      return -1073741582;
    v11 = (__int64)Response;
    if( (unsigned __int64)Response >= 0x7FFFFFFF0000i64 )
      v11 = 0x7FFFFFFF0000i64;
    *(_DWORD *)v11 = *(_DWORD *)v11;
    if( Parameters )
    {
      v12 = (unsigned int)NumberOfParameters;
      if( v12 * 8 )
      {
        if( ((unsigned __int8)Parameters & 7) != 0 )
          ExRaiseDatatypeMisalignment();
        if( (unsigned __int64)&Parameters[v12] > 0x7FFFFFFF0000i64 || &Parameters[v12] < Parameters )
          MEMORY[0x7FFFFFFF0000] = 0;
      }
      memmove(Src, Parameters, 8 * NumberOfParameters);
      memmove(v28, Src, 8 * v9);
      if( v8 )
      {
        for( i = 0; ; ++i )
        {
          HIDWORD(v25) = i;
          if( i >= v9 )
            break;
          if( _bittest((const int *)&v8, i) )
          {
            v14 = i;
            v15 = Src[i];
            if( (v15 & 7) != 0 )
              ExRaiseDatatypeMisalignment();
            v16 = 2i64 * i;
            *(_OWORD *)&v28[v16 + 5] = *(_OWORD *)v15;
            v17 = WORD1(v28[v16 + 5]);
            if( (_WORD)v17 )
            {
              v18 = v28[v16 + 6];
              if( v18 + v17 > 0x7FFFFFFF0000i64 || v18 + v17 < v18 )
                MEMORY[0x7FFFFFFF0000] = 0;
            }
            v28[v14] = (UINT64)&v28[v16 + 5];
            i = HIDWORD(v25);
          }
        }
      }
    }
    LODWORD(v22) = ValidResponseOptions;
    v19 = ExpRaiseHardError((unsigned int)ErrorStatus, v9, v8, (UINT64 *)Src, v28, v22, &v25);
    v26 = v19;
    *Response = v25;
  }
  else
  {
    LODWORD(TrustedParameters) = ValidResponseOptions;
    v19 = ExRaiseHardError(
            *(INT64 *)&ErrorStatus,
            NumberOfParameters,
            UnicodeStringParameterMask,
            Parameters,
            (UINT64)TrustedParameters,
            &v25,
            (INT64)v23,
            v24);
    *Response = v25;
  }
  return v19;
}

Referenced by:

No references.