I’m having a problem converting an inline assembler function to .asm file. I need seperate inline assembler code because in x64 architecture doesn’t have support for inline assembly.
Here is the code,
#include <windows.h>
#include <string>
#include <iostream>
#include <tlhelp32.h>
using namespace std;
int filter(int code)
{
if (code == EXCEPTION_PRIV_INSTRUCTION)
{
return EXCEPTION_EXECUTE_HANDLER;
}
else
{
return EXCEPTION_CONTINUE_SEARCH;
}
}
bool IsInsideVMWare(void)
{
bool rc = true;
__try
{
__asm
{
push edx
push ecx
push ebx
mov eax, 'VMXh'
mov ebx, 0 // any value but not the MAGIC VALUE
mov ecx, 10 // get VMWare version
mov edx, 'VX' // port number
in eax, dx // read port
// on return EAX returns the VERSION
cmp ebx, 'VMXh' // is it a reply from VMWare?
setz [rc] // set return value
pop ebx
pop ecx
pop edx
}
}
__except(GetExceptionCode())
{
rc = false;
}
return rc;
}
int main()
{
if(IsInsideVMWare())
cout << "You are in a VMware.." << endl;
else
cout << "You are in a native system.."<< endl;
system("PAUSE");
return 0;
}
Any idea how to convert and link to my cpp file?
Thanks from now.
T H K
Probably your best bet is to move the inline assembler listed into a separate function in a separate C source file and then compile the new source file into assembler (remembering that in your header file you will need to use
extern "C" { ... }). You can then take the assembler output and modify it for 64 bit.In the generated assembler file you will find that there are assembler directives for adding the symbol to the relocation table. You will also see the code needed for creating and clearing the stack. This will differ depending on the calling convention. Without more details about the assembler that you intend to use, I cannot provide more details.