I have a UInt64 value and want to join and separate the UInt64 into 2 DWords?

This has been mentioned here for the case where two single variables are the same size … Delphi 'absolute'

But it works equally for your case :

{$APPTYPE CONSOLE}
program Project1;

uses
  System.Types, System.SysUtils;
type
   DW_tuple = array[0..1] of UInt32;


function To_DWords( u:UInt64 ) : DW_tuple;  inline;
var
   dd : DW_tuple absolute u;
begin
   exit( dd );
end;


function To_UInt64( dd:DW_tuple ) : UInt64;  inline;
var
   u : UInt64 absolute dd;
begin
   exit( u );
end;


const
      u  : UInt64   = $FEDC_BA98_1234_5678;
      dd : DW_tuple = ($1111,$2222);

begin
  var d2 := To_DWords(u);
      writeln('0x', u.ToHexString);
      writeln('Ox', d2[0].ToHexString, '  ', 'Ox', d2[1].ToHexString);
      writeln;

  var u2 := To_UInt64(dd);
      writeln('Ox', dd[0].ToHexString, '  ', 'Ox', dd[1].ToHexString);
      writeln('0x', u2.ToHexString);
      writeln;

      readln;
end.

BUT as you can see, just interpreting the same memory leads to rearrangements that you might not expect in the interpretation of each data type.