NtSetInformationDebugObject

NTSTATUS __stdcall NtSetInformationDebugObject(
        VOID *DebugObjectHandle,
        _DEBUGOBJECTINFOCLASS DebugObjectInformationClass,
        VOID *DebugInformation,
        UINT64 DebugInformationLength,
        UINT64 *ReturnLength){
  char PreviousMode; 
  char *v8; 
  __int64 v9; 
  UINT64 *v10; 
  NTSTATUS result; 
  int v12; 
  char *v13; 
  unsigned int v14; 
  PVOID Object; 

  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( !PreviousMode )
  {
    v10 = ReturnLength;
LABEL_14:
    if( v10 )
      *(_DWORD *)v10 = 0;
    goto LABEL_16;
  }
  if( (_DWORD)DebugInformationLength )
  {
    if( ((unsigned __int8)DebugInformation & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    v8 = (char *)DebugInformation + (unsigned int)DebugInformationLength;
    v9 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)v8 > 0x7FFFFFFF0000i64 || v8 < DebugInformation )
      MEMORY[0x7FFFFFFF0000] = 0;
  }
  else
  {
    v9 = 0x7FFFFFFF0000i64;
  }
  v10 = ReturnLength;
  if( ReturnLength )
  {
    if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
      v9 = (__int64)ReturnLength;
    *(_DWORD *)v9 = *(_DWORD *)v9;
    goto LABEL_14;
  }
LABEL_16:
  if( DebugObjectInformationClass != DebugObjectFlags )
    return -1073741811;
  if( (_DWORD)DebugInformationLength == 4 )
  {
    v12 = *(_DWORD *)DebugInformation;
    if( (*(_DWORD *)DebugInformation & 0xFFFFFFFE) != 0 )
    {
      return -1073741811;
    }
    else
    {
      Object = 0i64;
      result = ObReferenceObjectByHandle(DebugObjectHandle, 4ui64, DbgkDebugObjectType, PreviousMode, &Object, 0i64);
      if( result >= 0 )
      {
        v13 = (char *)Object;
        ExAcquireFastMutex((PFAST_MUTEX)((char *)Object + 24));
        v14 = *((_DWORD *)v13 + 24) | 2;
        if( (v12 & 1) == 0 )
          v14 = *((_DWORD *)v13 + 24) & 0xFFFFFFFD;
        *((_DWORD *)v13 + 24) = v14;
        KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v13 + 24));
        HalPutDmaAdapter((PADAPTER_OBJECT)v13);
        return 0;
      }
    }
  }
  else
  {
    if( v10 )
      *(_DWORD *)v10 = 4;
    return -1073741820;
  }
  return result;
}

Referenced by:

No references.