Efectivamente eso es lo que pasa con su ejemplo compilado en 32 bits, los parametros que la funcion necesita son de 4 y no 8 bytes pero asi como en Windows en modo protegido en 32 bits los parametros son todos de 4 bytes en Windows en modo largo en x64 los parametros son todos de 8 bytes. Por eso le dije que en principio usara los tipos de parametros de la funcion y de ultima usara PVOID que al menos es el tamaño de un puntero y este se debe poder pasar en un registro y pila "nativamente".
En realidad si podes llamar a CreateProcessA sin problemas, cada parametro en pila ocupa 64 bits de por si, aunque despues la funcion llamada solo lea los primeros 8, 16 o 32 bits. Si bien hay una sutil diferencia en el codigo generado en ambos casos cada parametro ocupa 8 bytes (notese como el quinto - 1 - y sexto parametros - 0x1230 - se
mueven como DWORD o QWORD pero el siguiente parametro siempre esta a la misma distancia, 8 bytes):
; 45 : ((BOOL (__stdcall *)(LPCSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPCSTR, LPSTARTUPINFOA, LPPROCESS_INFORMATION))CreateProcessA_fn)
; 46 : (NULL, argv[1], NULL, NULL, TRUE, 0x1230, NULL, NULL, &si, &pi);
mov eax, 8
imul rax, rax, 1
lea rcx, QWORD PTR pi$3[rsp]
mov QWORD PTR [rsp+72], rcx
lea rcx, QWORD PTR si$5[rsp]
mov QWORD PTR [rsp+64], rcx
mov QWORD PTR [rsp+56], 0
mov QWORD PTR [rsp+48], 0
mov DWORD PTR [rsp+40], 4656 ; 00001230H
mov DWORD PTR [rsp+32], 1
xor r9d, r9d
xor r8d, r8d
mov rcx, QWORD PTR argv$[rsp]
mov rdx, QWORD PTR [rcx+rax]
xor ecx, ecx
call QWORD PTR CreateProcessA_fn$2[rsp]
; 48 : ((BOOL (__stdcall *)(PVOID, PVOID, PVOID, PVOID, PVOID, PVOID, PVOID, PVOID, PVOID, PVOID))CreateProcessA_fn)
; 49 : (NULL, argv[1], NULL, NULL, (PVOID)TRUE, (PVOID)0x1230, NULL, NULL, &si, &pi);
mov eax, 8
imul rax, rax, 1
lea rcx, QWORD PTR pi$3[rsp]
mov QWORD PTR [rsp+72], rcx
lea rcx, QWORD PTR si$5[rsp]
mov QWORD PTR [rsp+64], rcx
mov QWORD PTR [rsp+56], 0
mov QWORD PTR [rsp+48], 0
mov QWORD PTR [rsp+40], 4656 ; 00001230H
mov QWORD PTR [rsp+32], 1
xor r9d, r9d
xor r8d, r8d
mov rcx, QWORD PTR argv$[rsp]
mov rdx, QWORD PTR [rcx+rax]
xor ecx, ecx
call QWORD PTR CreateProcessA_fn$2[rsp]
Si podria tener problemas con tipos de coma flotante que se pasan en otros registros pero no recuerdo ninguna API de Windows que los use.
Y de cualquier manera si coincido en que es algo a evitar de ser posible.