IopCopyOverNewPath

VOID __stdcall IopCopyOverNewPath(
        PWCHAR OutBuffer,
        PWCHAR PathBuffer,
        UINT16 PathLength,
        FILE_OBJECT *FileObject,
        UINT16 RemainingName){
  unsigned int v5; 
  PWCHAR v8; 
  __int16 v9; 
  UINT8 *v10; 
  unsigned __int16 v11; 
  wchar_t *Buffer; 
  v5 = PathLength;
  v8 = OutBuffer;
  v9 = 2;
  if( PathLength )
  {
    memmove((UINT8 *)OutBuffer, (UINT8 *)PathBuffer, PathLength);
    v8 = &OutBuffer[(unsigned __int64)v5 >> 1];
  }
  if( RemainingName )
  {
    v10 = (UINT8 *)FileObject->FileName.Buffer + FileObject->FileName.Length - RemainingName;
    if( v8 > OutBuffer && *(v8 - 1) == 92 && *(_WORD *)v10 == 92 )
    {
      --v8;
      v9 = 0;
    }
    memmove((UINT8 *)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