ObShutdownSystem

VOID __stdcall ObShutdownSystem(UINT64 Phase){
  _QWORD *v1; 
  _QWORD *v2; 
  _ADAPTER_OBJECT *v3; 
  _ADAPTER_OBJECT *v4; 
  _ADAPTER_OBJECT *v5; 
  unsigned int v6; 
  unsigned int v7; 
  __int64 v8; 
  unsigned __int16 *v9; 
  unsigned __int16 *v10; 
  unsigned __int16 *v11; 
  _OBJECT_SYMBOLIC_LINK *v12; 
  _ADAPTER_OBJECT *v13; 
  _OBJECT_SYMBOLIC_LINK *v14; 
  _OBJECT_TYPE *v15; 
  char v16; 
  __int64 v17; 
  _ETHREAD *CurrentThread; 
  unsigned __int16 *v19; 
  _ADAPTER_OBJECT **v20; 
  int v21; 
  unsigned __int16 *v22; 
  _OBJECT_TYPE *v23; 
  _UNICODE_STRING DestinationString; 
  int v25; 
  int v26; 
  int v27; 
  PADAPTER_OBJECT DmaAdapter; 

  if( (_DWORD)Phase )
  {
    if( (_DWORD)Phase == 1 )
    {
      v27 = 0;
      ExEnumHandleTable(
        PsInitialSystemProcess->ObjectTable,
        (__int64(__fastcall *)(_HANDLE_TABLE *, _HANDLE_TABLE_ENTRY *, _EXHANDLE, __int64))ObpShutdownCloseHandleProcedure,
        (__int64)&v27,
        0i64);
    }
    else
    {
      v1 = (_QWORD *)*(&stru_140C23628 + 837);
      DmaAdapter = 0i64;
      DestinationString = 0i64;
      v2 = (_QWORD *)**(&stru_140C23628 + 837);
      while( v2 != v1 )
      {
        v3 = (_ADAPTER_OBJECT *)(v2 + 10);
        v2 = (_QWORD *)*v2;
        DmaAdapter = v3;
        ObMakeTemporaryObject(v3);
      }
      RtlInitUnicodeString(&DestinationString, L"DosDevices");
      if( ObReferenceObjectByName(&DestinationString, 0x40ui64, 0i64, 0i64, ObjectType, 0, 0i64, (VOID **)&DmaAdapter) >= 0 )
      {
        ObMakeTemporaryObject(DmaAdapter);
        HalPutDmaAdapter(DmaAdapter);
      }
      RtlInitUnicodeString(&DestinationString, L"Global");
      if( ObReferenceObjectByName(&DestinationString, 0x40ui64, 0i64, 0i64, ObjectType, 0, 0i64, (VOID **)&DmaAdapter) >= 0 )
      {
        ObMakeTemporaryObject(DmaAdapter);
        HalPutDmaAdapter(DmaAdapter);
      }
      RtlInitUnicodeString(&DestinationString, L"GLOBALROOT");
      if( ObReferenceObjectByName(&DestinationString, 0x40ui64, 0i64, 0i64, ObjectType, 0, 0i64, (VOID **)&DmaAdapter) >= 0 )
      {
        ObMakeTemporaryObject(DmaAdapter);
        HalPutDmaAdapter(DmaAdapter);
      }
      HalPutDmaAdapter(*(&stru_140C23628 + 836));
      HalPutDmaAdapter((PADAPTER_OBJECT)::DmaAdapter);
      HalPutDmaAdapter((PADAPTER_OBJECT)ObjectType);
      HalPutDmaAdapter(Directory);
      HalPutDmaAdapter(*(&stru_140C23628 + 837));
    }
  }
  else
  {
    v4 = (_ADAPTER_OBJECT *)*(&stru_140C23628 + 836);
    v25 = 1;
    v5 = 0i64;
    v6 = 1;
    v7 = 1;
    if( *(&stru_140C23628 + 836) )
    {
LABEL_15:
      while( 2 )
      {
        v8 = 0i64;
LABEL_16:
        v26 = v8;
        if( (unsigned int)v8 < 0x25 )
        {
          v9 = &v4->AdapterObject.DmaHeader.Version + 4 * v8;
          v10 = *(unsigned __int16 **)v9;
          v11 = v9;
          v22 = v9;
          while( 1 )
          {
            if( !v10 )
            {
              v8 = (unsigned int)(v26 + 1);
              goto LABEL_16;
            }
            v12 = (_OBJECT_SYMBOLIC_LINK *)*((_QWORD *)v10 + 1);
            v13 = v5;
            v14 = (_OBJECT_SYMBOLIC_LINK *)v5;
            v15 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v12[-1].CallbackContext) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v12 - 48) >> 8)];
            v16 = BYTE2(v12[-1].CallbackContext);
            v23 = v15;
            if( (v16 & 2) != 0 )
            {
              v17 = (__int64)&v12[-2].AccessMask - *((unsigned __int8 *)&dword_140C25D60 + (v16 & 3));
              v15 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v12[-1].CallbackContext) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v12 - 48) >> 8)];
            }
            else
            {
              v17 = 0i64;
            }
            if( v5 )
            {
              if( v12 == (_OBJECT_SYMBOLIC_LINK *)v5 && (v5 = 0i64, v7 > v6) )
              {
                v7 = v6;
                v11 = v9;
                v25 = v6;
              }
              else
              {
                v5 = 0i64;
                v11 = v10;
                if( v12 != v14 )
                  v5 = v13;
              }
            }
            else if( v15 == (_OBJECT_TYPE *)*(&stru_140C23628 + 837) )
            {
              v11 = v10;
            }
            else
            {
              if( v15 == ::DmaAdapter )
              {
                ++v6;
                v4 = (_ADAPTER_OBJECT *)*((_QWORD *)v10 + 1);
                goto LABEL_15;
              }
              CurrentThread = (_ETHREAD *)KeGetCurrentThread();
              --CurrentThread->Tcb.KernelApcDisable;
              ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&v12[-1].8, 0i64);
              BYTE3(v12[-1].CallbackContext) &= ~0x10u;
              ExReleasePushLockEx((_DWORD)v12 - 32, 0);
              KeLeaveCriticalRegionThread(KeGetCurrentThread());
              v19 = *(unsigned __int16 **)v11;
              if( v12[-1].CreationTime.QuadPart )
              {
                v7 = v25;
                v11 = *(unsigned __int16 **)v11;
              }
              else
              {
                *(_QWORD *)v11 = *(_QWORD *)v19;
                ExFreePoolWithTag(v19, 0);
                if( (v23->TypeInfo._bf_0 & 8) == 0 )
                {
                  LOBYTE(v21) = 0;
                  v23->TypeInfo.SecurityProcedure(
                    v12,
                    DeleteSecurityDescriptor,
                    0i64,
                    0i64,
                    0i64,
                    (void **)&v12[-1].AccessMask,
                    v23->TypeInfo.PoolType,
                    0i64,
                    v21);
                }
                if( v23 == ObjectType )
                {
                  v7 = v6;
                  v25 = v6;
                  ObpDeleteSymbolicLinkName(v12);
                  v11 = v22;
                }
                else
                {
                  v7 = v25;
                }
                ExFreePoolWithTag(*(PVOID *)(v17 + 16), 0);
                *(_QWORD *)(v17 + 16) = 0i64;
                *(_DWORD *)(v17 + 8) = 0;
                *(_QWORD *)v17 = 0i64;
                HalPutDmaAdapter((PADAPTER_OBJECT)v12);
                HalPutDmaAdapter(v4);
              }
              v9 = v22;
            }
            v10 = *(unsigned __int16 **)v11;
          }
        }
        --v6;
        if( (BYTE2(v4[-1].AllocationState) & 2) != 0 )
          v20 = (_ADAPTER_OBJECT **)((char *)&v4[-1].LowMemoryLogicalAddressQueueEntry
                                   - *((unsigned __int8 *)&dword_140C25D60 + (BYTE2(v4[-1].AllocationState) & 3)));
        else
          v20 = 0i64;
        v5 = v4;
        v4 = *v20;
        if( *v20 )
          continue;
        break;
      }
    }
  }
}

Referenced by:

PoBroadcastSystemState
PopGracefulShutdown