For the RECT struct:
msvc x86 will pass rc as a reference in eax
msvc x64 will pass rc as a reference in rcx
masm x86 will push rc
masm x64 will return error (no invoke)
uasm x86 will push rc
uasm x64 will pass rc as a reference in rcx
For the 3 byte struct:
msvc x86 will push ms (8 bytes)
msvc x64 will pass ms as a reference in rcx
masm x86 will push ms - push ax + push word ptr ms
masm x64 will return error (no invoke)
usmc x86 will return error A2070: invalid instruction operands - push ms
uasm x64 will pass ms in rcx - mov rcx, qword ptr [rbp-5H]
asmc x64 will pass ms in cx - mov cx, word ptr [rbp-5H]
I may be wrong but I don't think so on this:
msvc x86 will push ms (8 bytes):
mov BYTE PTR _somethree$[ebp], 11 ; 0000000bH
mov BYTE PTR _somethree$[ebp+1], 22 ; 00000016H
mov BYTE PTR _somethree$[ebp+2], 33 ; 00000021H
mov eax, esp
mov cx, WORD PTR _somethree$[ebp]
mov WORD PTR [eax], cx
mov dl, BYTE PTR _somethree$[ebp+2]
mov BYTE PTR [eax+2], dl
call _threeByteFunction@4