CmpCmdRenameHive

INT64 __stdcall CmpCmdRenameHive(
        PVOID Handle,
        _OBJECT_NAME_INFORMATION *OldName,
        _UNICODE_STRING *NewName,
        UINT64 NameInfoLength,
        UINT8 ReplaceIfExists){
  INT64 result; 
  VOID **PoolWithTag; 
  INT8 *v9; 
  unsigned int v10; 
  UINT64 *ReturnLength; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  UINT64 v13; 

  LODWORD(v13) = NameInfoLength;
  IoStatusBlock = 0i64;
  if( !OldName
    || (LODWORD(result) = ZwQueryObject(Handle, ObjectNameInformation, OldName, NameInfoLength, &v13), (int)result >= 0) )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, NewName->Length + 24i64, 538987843i64);
    v9 = (INT8 *)PoolWithTag;
    if( PoolWithTag )
    {
      PoolWithTag[1] = 0i64;
      *(_BYTE *)PoolWithTag = ReplaceIfExists;
      *((_DWORD *)PoolWithTag + 4) = NewName->Length;
      memmove((char *)PoolWithTag + 20, NewName->Buffer, NewName->Length);
      LODWORD(ReturnLength) = 10;
      v10 = ZwSetInformationFile(
              (UINT64)Handle,
              (UINT64)&IoStatusBlock,
              v9,
              (unsigned int)NewName->Length + 24,
              (UINT64)ReturnLength);
      ExFreePoolWithTag(v9, 0);
      return v10;
    }
    else
    {
      return 3221225626i64;
    }
  }
  return result;
}

Referenced by:

CmReplaceKey
CmpFlushBackupHive