Estimados colegas
Yo utilizo el componente mxProtector en algunas aplicaciones para realizar el control de registro de seriales, etc...
El problema al que me vi enfrentado era que al intentar compilar algunas de estas aplicaciones en x64, este componente no lo permitia ya que tenia una restricción que esta en el archivo MAX.INC.
Código Delphi
[-]
{$IFNDEF WIN32}
Sorry, only 32bit versions of Delphi/C++ Builder are supported by this component!
{$ENDIF}
Nota: Luego de realizar las modificaciones esta línea hay que comentarla...
La razón de esto son las funciones en Asembler que forman parte del componente:
- IsCPUIDAvailable
- GetCPUID
- GetCPUVendor
Y como dicen la necesidad tiene cara de hereje, me di a la labor de buscar opciones para estas funciones y afortunadamente encontre soluciones.
Ahora puedo compilar este componente en aplicaciones x32 y x64 y mis aplicaciones siguen operando como si nada hubiera pasado.
Les comparto el código que utilice para superar este pequeño problema, no si antes indicar las fuentes de donde obtuve las soluciones, que son:
David Heffernan
https://stackoverflow.com/questions/...-code-to-amd64
JBontes
https://github.com/JBontes/FastCode/...tcodeCPUID.pas
Aquí va los segmentos de códigos que hay que tocar en archivo mxProtector.Pas:
Código Delphi
[-]
....
/ *************************************************************************************
Const
ID_BIT = $200000;
Type
TCPUID = Array[ 1..4 ] Of Longint;
TVendor = Array[ 0..11 ] Of Ansichar;
Function IsCPUIDAvailable: Boolean; Register;
Asm
{$IF Defined(CPUX86)}
PUSHFD
POP EAX
MOV EDX,EAX
XOR EAX,ID_BIT
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX,EDX
JZ @exit
MOV AL,True
@exit:
{$ELSE}
MOV EAX, True {x64 always has CPUID}
{$ENDIF}
End;
function GetCPUID: TCPUID; Assembler; Register;
asm
{$IF Defined(CPUX86)}
push ebx
push edi
mov edi, eax
mov eax, 1
xor ecx,ecx
cpuid
mov [edi+$0], eax
mov [edi+$4], ebx
mov [edi+$8], ecx
mov [edi+$c], edx
pop edi
pop ebx
{$ELSEIF Defined(CPUX64)}
mov r8, rbx
mov r9, rcx
mov eax, 1
cpuid
mov [r9+$0], eax
mov [r9+$4], ebx
mov [r9+$8], ecx
mov [r9+$c], edx
mov rbx, r8
{$IFEND}
end;
function GetCPUVendor:TVendor; Assembler; Register;
type
TRegisters = record
EAX,
EBX,
ECX,
EDX: Cardinal;
end;
var
Registers: TRegisters;
procedure GetCPUID_Internal(var Registers: TRegisters);
asm
{$ifdef cpux86}
PUSH EBX {save affected registers}
PUSH EDI
MOV EDI, Registers
XOR EBX, EBX {clear EBX register}
XOR ECX, ECX {clear ECX register}
XOR EDX, EDX {clear EDX register}
DB $0F, $A2 {CPUID opcode}
MOV TRegisters(EDI).&EAX, EAX {save EAX register}
MOV TRegisters(EDI).&EBX, EBX {save EBX register}
MOV TRegisters(EDI).&ECX, ECX {save ECX register}
MOV TRegisters(EDI).&EDX, EDX {save EDX register}
POP EDI {restore registers}
POP EBX
{$else X64}
PUSH RBX
PUSH RDI
MOV RDI, Registers
MOV EAX, ECX
XOR EBX, EBX
XOR ECX, ECX
XOR EDX, EDX
CPUID
MOV TRegisters(RDI).&EAX, EAX
MOV TRegisters(RDI).&EBX, EBX
MOV TRegisters(RDI).&ECX, ECX
MOV TRegisters(RDI).&EDX, EDX
POP RDI
POP RBX
{$endif}
end;
begin
GetCPUID_Internal( Registers);
Move(Registers.EBX, Result[0], 4);
Move(Registers.EDX, Result[4], 4);
Move(Registers.ECX, Result[8], 4);
end;
Function TmxProtector.InternalGetHardwareID: String;
...
Espero les sirva...Saludos cordiales