c++ - Why doesn't GCC compile this code? -


i java, python programmer trying fiddle c++. have following code snippet -

#include <windows.h>  bool isinsidevmware() {   bool rc = true;    __try   {     __asm     {       push   edx       push   ecx       push   ebx        mov    eax, 'vmxh'       mov    ebx, 0 // value not magic value       mov    ecx, 10 // vmware version       mov    edx, 'vx' // port number        in     eax, dx // read port                      // on return eax returns version       cmp    ebx, 'vmxh' // reply vmware?       setz   [rc] // set return value        pop    ebx       pop    ecx       pop    edx     }   }   __except(exception_execute_handler)   {     rc = false;   }    return rc; } 

i getting following compile error -

__try' undeclared (first use function) __except' undeclared (first use function)

what vague message mean? because try undeclared should try use first??

edit:

ide - codeblocks

compiler - gcc

this code relies on microsoft specific functionality of __try , __except. there no other way solve this, doing in instruction user-mode process in windows fail. in vmware, such operation intercepted vmware vmm (virtual machine monitor, called hypervisor). checks special values in registers , "accepts" instruction new value in ebx indicate "yes, i'm vmware system". if run on plain old windows system, general protection fault trying use io-port isn't available application [in general, io ports aren't availbe user-mode application code].

you need compile using microsoft compiler (and suitable "enable exception handling" flag set - sorry, can't remember flag is, tell if it's not on it's wrong). gcc doesn't support feature.

however, can test vmware using cpuid instruction instead of using in. work better in gcc compiler, not fault processor if there no vm present [for pedants: long processor later version of 486 1990's]. instead, not give right values in registers (no change register values). may need write cpuid inline assembler function, shouldn't difficult google up.

see kb-article on vmwares site: http://kb.vmware.com/selfservice/microsites/search.do?language=en_us&cmd=displaykc&externalid=1009458

alternatively, if insist on using windows structured exception handling, can yourself:

   push handler   // save address of handler.     push fs:[0]    // save address of previous handler    mov  fs:[0], esp    // save pointer current exception record.      ...    // stuff setting registers, doing in, etc.      jmp  cleanup  handler:    mov  [rc], 0       // set "rc= false".   cleanup:    pop  fs:[0]    add  esp, 4   // remove handler 

(note, wrote bit of googling - it's long time since used on windows, may not work)


Comments

Popular posts from this blog

image - ClassNotFoundException when add a prebuilt apk into system.img in android -

I need to import mysql 5.1 to 5.5? -

Java, Hibernate, MySQL - store UTC date-time -