SepCleanupLUIDDeviceMapDirectory

INT64 __fastcall SepCleanupLUIDDeviceMapDirectory(_LUID *pLogonId, _EJOB *ServerSilo){
  _UNICODE_STRING *v3; 
  unsigned int v4; 
  UINT8 v5; 
  WCHAR v6; 
  _EJOB *v7; 
  NTSTATUS v8; 
  HANDLE *PoolWithTag; 
  unsigned int RestartScan; 
  __int64 v11; 
  UINT64 v12; 
  NTSTATUS v13; 
  HANDLE *v14; 
  HANDLE *v16; 
  UINT8 v17; 
  UINT64 ReturnLength; 
  void *DirectoryHandle; 
  void *LinkHandle; 
  UINT64 Context; 
  _EJOB *PreviousSilo; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  struct _UNICODE_STRING DestinationString; 
  _KAPC_STATE ApcState; 
  wchar_t Dst[64]; 
  *(&ObjectAttributes.Length + 1) = 0;
  *(&ObjectAttributes.Attributes + 1) = 0;
  LinkHandle = 0i64;
  v3 = 0i64;
  LODWORD(Context) = 0;
  v4 = 100;
  ReturnLength = 0i64;
  DirectoryHandle = 0i64;
  DestinationString = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  if( !pLogonId )
    return 3221225485i64;
  v17 = ObReferenceObjectSafeWithTag(*((PVOID *)KeGetCurrentThread() + 23), 0x4D526553ui64);
  v5 = v17;
  if( v17 )
    ObfDereferenceObjectWithTag(*((PVOID *)KeGetCurrentThread() + 23), 0x4D526553ui64);
  else
    KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
  PsGetServerSiloServiceSessionId(ServerSilo);
  swprintf_s(Dst, 0x40ui64, (WCHAR *)L"\\Sessions\\%d\\DosDevices\\%08x-%08x");
  RtlInitUnicodeString(&DestinationString, Dst, v6);
  ObjectAttributes.Length = 48;
  ObjectAttributes.ObjectName = &DestinationString;
  ObjectAttributes.RootDirectory = 0i64;
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.Attributes = 576;
  PreviousSilo = PsAttachSiloToCurrentThread(ServerSilo);
  v7 = PreviousSilo;
  v8 = ZwOpenDirectoryObject(&DirectoryHandle, 1ui64, &ObjectAttributes);
  if( v8 < 0 )
  {
    PsDetachSiloFromCurrentThread(v7);
    if( !v17 )
      KiUnstackDetachProcess(&ApcState, 0i64);
    return(unsigned int)v8;
  }
  else
  {
    PoolWithTag = (HANDLE *)ExAllocatePoolWithTag(PagedPool, 0x320ui64, 0x61486553ui64);
    if( PoolWithTag )
    {
LABEL_6:
      LOBYTE(RestartScan) = 1;
      v11 = 0i64;
      while( 1 )
      {
        LODWORD(v12) = HIDWORD(ReturnLength);
        do
        {
          v13 = ZwQueryDirectoryObject(DirectoryHandle, v3, (unsigned int)v12, 1u, RestartScan, &Context, &ReturnLength);
          if( v13 == -1073741789 )
          {
            v12 = (unsigned int)ReturnLength;
            if( v3 )
              ExFreePoolWithTag(v3, 0);
            v3 = (_UNICODE_STRING *)ExAllocatePoolWithTag(PagedPool, v12, 0x62446553ui64);
            if( !v3 )
              v13 = -1073741670;
          }
        }
        while( v13 == -1073741789 );
        RestartScan = 0;
        HIDWORD(ReturnLength) = v12;
        v5 = v17;
        if( v13 < 0 )
          break;
        if( !wcscmp(v3[1].Buffer, (PWCHAR)L"SymbolicLink") )
        {
          if( (unsigned int)v11 >= v4 )
          {
            if( (_DWORD)v11 )
            {
              v16 = PoolWithTag;
              do
              {
                ZwClose(*v16++);
                --v11;
              }
              while( v11 );
            }
            v4 += 20;
            ExFreePoolWithTag(PoolWithTag, 0);
            PoolWithTag = (HANDLE *)ExAllocatePoolWithTag(PagedPool, 8i64 * v4, 0x61486553ui64);
            if( !PoolWithTag )
            {
              v7 = PreviousSilo;
              goto LABEL_44;
            }
            goto LABEL_6;
          }
          ObjectAttributes.RootDirectory = DirectoryHandle;
          ObjectAttributes.Length = 48;
          ObjectAttributes.Attributes = 576;
          *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
          ObjectAttributes.ObjectName = v3;
          if( ZwOpenSymbolicLinkObject(&LinkHandle, 0xF0001ui64, &ObjectAttributes) >= 0 )
          {
            if( ZwMakeTemporaryObject(LinkHandle) < 0 )
            {
              ZwClose(LinkHandle);
            }
            else
            {
              PoolWithTag[v11] = LinkHandle;
              v11 = (unsigned int)(v11 + 1);
            }
          }
        }
      }
      if( v13 != -2147483622 )
        RestartScan = v13;
      if( (_DWORD)v11 )
      {
        v14 = PoolWithTag;
        do
        {
          ZwClose(*v14++);
          --v11;
        }
        while( v11 );
      }
      ExFreePoolWithTag(PoolWithTag, 0);
      if( v3 )
        ExFreePoolWithTag(v3, 0);
      if( DirectoryHandle )
        ZwClose(DirectoryHandle);
      PsDetachSiloFromCurrentThread(PreviousSilo);
      if( !v17 )
        KiUnstackDetachProcess(&ApcState, 0i64);
      return RestartScan;
    }
    else
    {
LABEL_44:
      ZwClose(DirectoryHandle);
      if( v3 )
        ExFreePoolWithTag(v3, 0);
      PsDetachSiloFromCurrentThread(v7);
      if( !v5 )
        KiUnstackDetachProcess(&ApcState, 0i64);
      return 3221225495i64;
    }
  }
}

Referenced by:

SepDeReferenceLogonSession
SepDeleteLogonSessionTrack