views:

75

answers:

2

Hi all,

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

A: 

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.

doron
Thanks deus-ex-machina399 but i couldn't get the expected result :(I'm using Visual Studio 2008 and I passed that code to separate cpp file and compile it. I wroteextern "C" bool IsInsideVMWare(void){return true};in to header file but it says "identifier not found" for IsInsideVMWare
togikan
A: 

I don't think the linker will accept linking 32bit code with 64bit code together.

karlphillip
It is okay converting just 32bit one. I guess I'll modify if I have a asm file which represents this function.
togikan