Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a MAKELONGLONG function?

Tags:

windows

winapi

I need to combine two 32-bit values to create a 64-bit value. I'm looking for something analogous to MAKEWORD and MAKELONG. I can easily define my own macro or function, but if the API already provides one, I'd prefer to use that.

like image 463
Rob Kennedy Avatar asked Aug 12 '10 19:08

Rob Kennedy


1 Answers

I cannot find any in the Windows API. However, I do know that you work mostly (or, at least, a lot) with Delphi, so here is a quick Delphi function:

function MAKELONGLONG(A, B: cardinal): UInt64; inline;
begin
  PCardinal(@result)^ := A;
  PCardinal(cardinal(@result) + sizeof(cardinal))^ := B;
end;

Even faster:

function MAKELONGLONG(A, B: cardinal): UInt64;
asm
end;

Explanation: In the normal register calling convention, the first two arguments (if cardinal-sized) are stored in EAX and EDX, respetively. A (cardinal-sized) result is stored in EAX. Now, a 64-bit result is stored in EAX (less significant bits, low address) and EDX (more significant bits, high address); hence we need to move A to EAX and B to EDX, but they are already there!

like image 165
Andreas Rejbrand Avatar answered Oct 28 '22 06:10

Andreas Rejbrand