83 lines
1.8 KiB
Text
83 lines
1.8 KiB
Text
|
alloc(TypeName,256)
|
||
|
alloc(ByteSize,4)
|
||
|
alloc(ConvertRoutine,1024)
|
||
|
alloc(ConvertBackRoutine,1024)
|
||
|
|
||
|
TypeName:
|
||
|
db '2 Byte Big Endian',0
|
||
|
|
||
|
ByteSize:
|
||
|
dd 2
|
||
|
|
||
|
//The convert routine should hold a routine that converts the data to an integer (in eax)
|
||
|
//function declared as: stdcall int ConvertRoutine(unsigned char *input);
|
||
|
//Note: Keep in mind that this routine can be called by multiple threads at the same time.
|
||
|
ConvertRoutine:
|
||
|
//jmp dllname.functionname
|
||
|
[64-bit]
|
||
|
//or manual:
|
||
|
//parameters: (64-bit)
|
||
|
//rcx=address of input
|
||
|
xor eax,eax
|
||
|
mov ax,[rcx] //eax now contains the bytes 'input' pointed to
|
||
|
xchg ah,al //convert to big endian
|
||
|
|
||
|
ret
|
||
|
[/64-bit]
|
||
|
|
||
|
[32-bit]
|
||
|
//jmp dllname.functionname
|
||
|
//or manual:
|
||
|
//parameters: (32-bit)
|
||
|
push ebp
|
||
|
mov ebp,esp
|
||
|
//[ebp+8]=input
|
||
|
//example:
|
||
|
mov eax,[ebp+8] //place the address that contains the bytes into eax
|
||
|
mov ax,[eax] //place the bytes into eax so it's handled as a normal 4 byte value
|
||
|
and eax,ffff //cleanup
|
||
|
xchg ah,al //convert to big endian
|
||
|
|
||
|
pop ebp
|
||
|
ret 4
|
||
|
[/32-bit]
|
||
|
|
||
|
//The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new value)
|
||
|
//function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output);
|
||
|
ConvertBackRoutine:
|
||
|
//jmp dllname.functionname
|
||
|
//or manual:
|
||
|
[64-bit]
|
||
|
//parameters: (64-bit)
|
||
|
//ecx=input
|
||
|
//rdx=address of output
|
||
|
//example:
|
||
|
xchg ch,cl //convert the little endian input into a big endian input
|
||
|
mov [rdx],cx //place the integer the 4 bytes pointed to by rdx
|
||
|
|
||
|
ret
|
||
|
[/64-bit]
|
||
|
|
||
|
[32-bit]
|
||
|
//parameters: (32-bit)
|
||
|
push ebp
|
||
|
mov ebp,esp
|
||
|
//[ebp+8]=input
|
||
|
//[ebp+c]=address of output
|
||
|
//example:
|
||
|
push eax
|
||
|
push ebx
|
||
|
mov eax,[ebp+8] //load the value into eax
|
||
|
mov ebx,[ebp+c] //load the address into ebx
|
||
|
|
||
|
//convert the value to big endian
|
||
|
xchg ah,al
|
||
|
|
||
|
mov [ebx],ax //write the value into the address
|
||
|
pop ebx
|
||
|
pop eax
|
||
|
|
||
|
pop ebp
|
||
|
ret 8
|
||
|
[/32-bit]
|