VrpTranslatePath

NTSTATUS __stdcall VrpTranslatePath(
        _UNICODE_STRING *AbsolutePath,
        _UNICODE_STRING *NewKeyPath,
        _UNICODE_STRING *NewRemainingPath,
        VOID **NewRootObject,
        _VRP_JOB_CONTEXT *JobContext){
  int Length; 
  _UNICODE_STRING *v6; 
  _EX_PUSH_LOCK *v7; 
  int v8; 
  _UNICODE_STRING v9; 
  _ETHREAD *CurrentThread; 
  _UNICODE_STRING *NamespaceNode; 
  INT64 v12; 
  UINT64 v13; 
  wchar_t *Buffer; 
  __int64 v15; 
  WCHAR v16; 
  int v17; 
  _UNICODE_STRING v18; 
  INT64 v19; 
  int v20; 
  int v21; 
  int v22; 
  int v23; 
  _EX_PUSH_LOCK *v24; 
  int v25; 
  int v26; 
  void *v27; 
  __int64 v28; 
  wchar_t *v29; 
  unsigned __int16 v30; 
  unsigned __int64 i; 
  __int64 v32; 
  __int16 v33; 
  INT64 v35; 
  POBJECT_HANDLE_INFORMATION HandleInformation; 
  UINT64 Position; 
  INT64 Path; 
  _UNICODE_STRING Path_8; 
  VOID *PathToken[3]; 
  INT64 v41; 
  PVOID v42; 
  _UNICODE_STRING NewPath; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  int v47; 
  _QWORD *v49; 
  __int64 v50; 
  int *v51; 
  _DWORD *v52; 

  v41 = 0i64;
  Length = NewRemainingPath[2].Length;
  v6 = AbsolutePath;
  v7 = (_EX_PUSH_LOCK *)AbsolutePath;
  v8 = 0;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  memset(PathToken, 0, sizeof(PathToken));
  v47 = Length;
  LOBYTE(Path) = 0;
  v9 = *(_UNICODE_STRING *)NewRootObject;
  NewPath = 0i64;
  Path_8 = v9;
  while( 1 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockSharedEx(v7 + 2, 0i64);
    NamespaceNode = VrpFindNamespaceNode((unsigned __int64 *)v7, &Path_8, 1, 0i64, (UINT64 *)&v41);
    if( !NamespaceNode )
      break;
    v12 = v41;
    v13 = 0i64;
    Position = 0i64;
    if( v41 )
    {
      do
      {
        VrpGetNextToken(&Path_8, &Position, (_UNICODE_STRING *)&PathToken[1]);
        --v12;
      }
      while( v12 );
      v13 = Position;
    }
    Buffer = Path_8.Buffer;
    v15 = (unsigned __int16)(Path_8.Length - 2 * v13);
    PathToken[2] = &Path_8.Buffer[v13];
    LOWORD(PathToken[1]) = Path_8.Length - 2 * v13;
    WORD1(PathToken[1]) = PathToken[1];
    v17 = VrpBuildKeyPath((_UNICODE_STRING *)((char *)NamespaceNode + 24), (_UNICODE_STRING *)&PathToken[1], &NewPath);
    if( v17 < 0 )
      goto LABEL_29;
    VrpStripTrailingCharacters(&NewPath, v16);
    if( Buffer != NewRootObject[1] )
      ExFreePoolWithTag(Buffer, 0);
    v18 = NewPath;
    Path_8 = NewPath;
    RtlInitUnicodeString(&NewPath, 0i64);
    v20 = (int)NamespaceNode[3].Buffer;
    v21 = v20 & 4 | v8;
    if( v7 == (_EX_PUSH_LOCK *)AbsolutePath )
      v21 |= v20 & 2;
    v22 = NamespaceNode[4].Length;
    v23 = v21 | 0x20000000;
    v24 = *(_EX_PUSH_LOCK **)&NamespaceNode[1].Length;
    if( (_WORD)v15 )
      v23 = v21;
    v25 = (unsigned __int8)Path;
    v8 = v23;
    if( v47 < v22 )
      v25 = 1;
    v26 = NamespaceNode[4].MaximumLength - v22 + v47;
    LODWORD(Path) = v25;
    v47 = v26;
    if( !v24 )
    {
      if( v49 )
      {
        if( !(_BYTE)v25 )
        {
          ObfReferenceObject(NewKeyPath);
          v27 = NewKeyPath;
          goto LABEL_19;
        }
        ObjectAttributes.Length = 48;
        ObjectAttributes.ObjectName = (_UNICODE_STRING *)((char *)NamespaceNode + 24);
        ObjectAttributes.RootDirectory = 0i64;
        ObjectAttributes.Attributes = 576;
        *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
        v17 = ZwOpenKey(
                PathToken,
                0x80000000ui64,
                &ObjectAttributes,
                v19,
                v35,
                (INT64)HandleInformation,
                Position,
                Path);
        if( v17 < 0
          || (v42 = 0i64,
              v17 = ObReferenceObjectByHandle(PathToken[0], 0i64, (_OBJECT_TYPE *)CmKeyObjectType, 0, &v42, 0i64),
              v27 = v42,
              v17 < 0) )
        {
LABEL_29:
          v6 = AbsolutePath;
          goto LABEL_30;
        }
LABEL_19:
        v26 = v47;
        *v49 = v27;
      }
      v28 = v50;
      if( v50 )
      {
        v29 = Path_8.Buffer;
        v30 = Path_8.Length;
        if( (_BYTE)v25 )
        {
          for( i = (unsigned __int64)LOWORD(NamespaceNode[1].Buffer) >> 1; ; ++i )
          {
            Position = i;
            if( 2 * i >= Path_8.Length || Path_8.Buffer[i] != 92 )
              break;
          }
        }
        else
        {
          Position = 0i64;
          i = 0i64;
          v32 = 0i64;
          if( v26 > 0 )
          {
            do
            {
              VrpGetNextToken(&Path_8, &Position, (_UNICODE_STRING *)&PathToken[1]);
              ++v32;
            }
            while( (int)v32 < v47 );
            i = Position;
            v28 = v50;
            v29 = Path_8.Buffer;
          }
        }
        v33 = v30 - 2 * i;
        *(_QWORD *)(v28 + 8) = &v29[i];
        *(_WORD *)v28 = v33;
        *(_WORD *)(v28 + 2) = v33;
      }
      if( v51 )
        *v51 = v8;
      *v52 = HIDWORD(NamespaceNode[3].Buffer);
      *(_UNICODE_STRING *)JobContext = v18;
      RtlInitUnicodeString(&Path_8, 0i64);
      v17 = 0;
      goto LABEL_29;
    }
    ObfReferenceObjectWithTag(v24, 0x67655256ui64);
    if( _InterlockedCompareExchange64(&v7[2]._bf_0, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v7 + 2);
    KeAbPostRelease(&v7[2]);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    v6 = AbsolutePath;
    if( v7 != (_EX_PUSH_LOCK *)AbsolutePath )
      ObfDereferenceObjectWithTag(v7, 0x67655256ui64);
    v7 = v24;
  }
  v17 = -1073741772;
LABEL_30:
  if( _InterlockedCompareExchange64(&v7[2]._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(v7 + 2);
  KeAbPostRelease(&v7[2]);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( v7 && v7 != (_EX_PUSH_LOCK *)v6 )
    ObfDereferenceObjectWithTag(v7, 0x67655256ui64);
  if( Path_8.Buffer && Path_8.Buffer != NewRootObject[1] )
    ExFreePoolWithTag(Path_8.Buffer, 0);
  if( PathToken[0] )
    ZwClose((_HANDLE)PathToken[0]);
  return v17;
}

Referenced by:

VrpPreOpenOrCreate