SepCleanupLUIDDeviceMapDirectory

NTSTATUS __stdcall SepCleanupLUIDDeviceMapDirectory(_LUID *pLogonId, _EJOB *ServerSilo){
  _UNICODE_STRING *v4; 
  unsigned int v5; 
  INT8 v6; 
  unsigned int ServerSiloServiceSessionId; 
  _EJOB *v8; 
  _EJOB *v9; 
  int v10; 
  VOID **PoolWithTag; 
  NTSTATUS RestartScan; 
  __int64 v13; 
  UINT64 v14; 
  NTSTATUS v15; 
  VOID **v16; 
  VOID **v18; 
  INT8 v19; 
  UINT64 NumberOfBytes; 
  VOID *DirectoryHandle; 
  VOID *LinkHandle; 
  UINT64 Context; 
  _EJOB *PreviousSilo; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  _UNICODE_STRING DestinationString; 
  _KAPC_STATE ApcState; 
  WCHAR Dst[64]; 

  *(&ObjectAttributes.Length + 1) = 0;
  *(&ObjectAttributes.Attributes + 1) = 0;
  LinkHandle = 0i64;
  v4 = 0i64;
  LODWORD(Context) = 0;
  v5 = 100;
  NumberOfBytes = 0i64;
  DirectoryHandle = 0i64;
  DestinationString = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  if( !pLogonId )
    return -1073741811;
  v19 = ObReferenceObjectSafeWithTag((INT64)KeGetCurrentThread()->ApcState.Process, 1297245523i64);
  v6 = v19;
  if( v19 )
    ObfDereferenceObjectWithTag(KeGetCurrentThread()->ApcState.Process, 0x4D526553ui64);
  else
    KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
  ServerSiloServiceSessionId = PsGetServerSiloServiceSessionId((INT64)ServerSilo);
  swprintf_s(
    Dst,
    0x40ui64,
    (WCHAR *)L"\\Sessions\\%d\\DosDevices\\%08x-%08x",
    ServerSiloServiceSessionId,
    pLogonId->HighPart,
    pLogonId->LowPart);
  RtlInitUnicodeString(&DestinationString, Dst);
  ObjectAttributes.Length = 48;
  ObjectAttributes.ObjectName = &DestinationString;
  ObjectAttributes.RootDirectory = 0i64;
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.Attributes = 576;
  LODWORD(v8) = PsAttachSiloToCurrentThread((INT64)ServerSilo);
  PreviousSilo = v8;
  v9 = v8;
  v10 = ZwOpenDirectoryObject(&DirectoryHandle, 1, &ObjectAttributes);
  if( v10 < 0 )
  {
    PsDetachSiloFromCurrentThread(v9);
    if( !v19 )
      KiUnstackDetachProcess(&ApcState, 0i64);
    return v10;
  }
  else
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x320ui64, 1632134483i64);
    if( PoolWithTag )
    {
LABEL_6:
      LOBYTE(RestartScan) = 1;
      v13 = 0i64;
      while( 1 )
      {
        LODWORD(v14) = HIDWORD(NumberOfBytes);
        do
        {
          v15 = ZwQueryDirectoryObject(
                  DirectoryHandle,
                  v4,
                  (unsigned int)v14,
                  1u,
                  RestartScan,
                  &Context,
                  &NumberOfBytes);
          if( v15 == -1073741789 )
          {
            v14 = (unsigned int)NumberOfBytes;
            if( v4 )
              ExFreePoolWithTag(v4, 0);
            v4 = (_UNICODE_STRING *)ExAllocatePoolWithTag(1ui64, v14, 1648649555i64);
            if( !v4 )
              v15 = -1073741670;
          }
        }
        while( v15 == -1073741789 );
        RestartScan = 0;
        HIDWORD(NumberOfBytes) = v14;
        v6 = v19;
        if( v15 < 0 )
          break;
        if( !wcscmp(v4[1].Buffer, (PWCHAR)L"SymbolicLink") )
        {
          if( (unsigned int)v13 >= v5 )
          {
            if( (_DWORD)v13 )
            {
              v18 = PoolWithTag;
              do
              {
                ZwClose((_HANDLE)*v18++);
                --v13;
              }
              while( v13 );
            }
            v5 += 20;
            ExFreePoolWithTag(PoolWithTag, 0);
            PoolWithTag = ExAllocatePoolWithTag(1ui64, 8i64 * v5, 1632134483i64);
            if( !PoolWithTag )
            {
              v9 = PreviousSilo;
              goto LABEL_44;
            }
            goto LABEL_6;
          }
          ObjectAttributes.RootDirectory = DirectoryHandle;
          ObjectAttributes.Length = 48;
          ObjectAttributes.Attributes = 576;
          *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
          ObjectAttributes.ObjectName = v4;
          if( ZwOpenSymbolicLinkObject(&LinkHandle, 983041, &ObjectAttributes) >= 0 )
          {
            if( ZwMakeTemporaryObject(LinkHandle) < 0 )
            {
              ZwClose((_HANDLE)LinkHandle);
            }
            else
            {
              PoolWithTag[v13] = LinkHandle;
              v13 = (unsigned int)(v13 + 1);
            }
          }
        }
      }
      if( v15 != -2147483622 )
        RestartScan = v15;
      if( (_DWORD)v13 )
      {
        v16 = PoolWithTag;
        do
        {
          ZwClose((_HANDLE)*v16++);
          --v13;
        }
        while( v13 );
      }
      ExFreePoolWithTag(PoolWithTag, 0);
      if( v4 )
        ExFreePoolWithTag(v4, 0);
      if( DirectoryHandle )
        ZwClose((_HANDLE)DirectoryHandle);
      PsDetachSiloFromCurrentThread(PreviousSilo);
      if( !v19 )
        KiUnstackDetachProcess(&ApcState, 0i64);
      return RestartScan;
    }
    else
    {
LABEL_44:
      ZwClose((_HANDLE)DirectoryHandle);
      if( v4 )
        ExFreePoolWithTag(v4, 0);
      PsDetachSiloFromCurrentThread(v9);
      if( !v6 )
        KiUnstackDetachProcess(&ApcState, 0i64);
      return -1073741801;
    }
  }
}

Referenced by:

SepDeReferenceLogonSession
SepDeleteLogonSessionTrack