IopCopyOverNewPath

VOID __stdcall IopCopyOverNewPath(
        WCHAR *OutBuffer,
        WCHAR *PathBuffer,
        UINT16 PathLength,
        _FILE_OBJECT *FileObject,
        UINT16 RemainingName){
  unsigned int v5; 
  WCHAR *v8; 
  __int16 v9; 
  _WORD *v10; 
  unsigned __int16 v11; 
  wchar_t *Buffer; 

  v5 = PathLength;
  v8 = OutBuffer;
  v9 = 2;
  if( PathLength )
  {
    memmove(OutBuffer, PathBuffer, PathLength);
    v8 = &OutBuffer[(unsigned __int64)v5 >> 1];
  }
  if( RemainingName )
  {
    v10 = (wchar_t *)((char *)FileObject->FileName.Buffer + FileObject->FileName.Length - RemainingName);
    if( v8 > OutBuffer && *(v8 - 1) == 92 && *v10 == 92 )
    {
      --v8;
      v9 = 0;
    }
    memmove(v8, v10, RemainingName);
    v8 += (unsigned __int64)RemainingName >> 1;
  }
  v11 = RemainingName + v5 + v9;
  FileObject->FileName.MaximumLength = v11;
  FileObject->FileName.Length = v11 - 2;
  *v8 = 0;
  Buffer = FileObject->FileName.Buffer;
  if( OutBuffer != Buffer )
  {
    if( Buffer )
      ExFreePoolWithTag(Buffer, 0);
    FileObject->FileName.Buffer = OutBuffer;
  }
}

Referenced by:

IopGraftName