6 #define WRITE(x) write(1, x, strlen(x))
7 #define DWRITE(x) do{ \
16 static inline char tohex(char c) {
17 return c>=10?c-10+'a':c+'0';
20 unsigned int fmt_xlong(char *dest,unsigned long i) {
21 register unsigned long len,tmp;
22 /* first count the number of bytes needed */
23 for (len=1, tmp=i; tmp>15; ++len) tmp>>=4;
25 for (tmp=i, dest+=len; ; ) {
26 *--dest = tohex(tmp&15);
27 if (!(tmp>>=4)) break;
33 void printIdtr(const unsigned char* idtr, unsigned size)
36 for(i=0; i<=size; ++i) {
38 fmt_xlong(out, idtr[i]);
45 #if defined (__i386__)
46 int checkVmware(const int debug)
48 unsigned char idtr[6] = {0};
49 asm("sidt %0" : "=m" (idtr));
52 return (0xff==idtr[5]) ? 1 : 0;
56 unsigned int vmaj, vmin, magic, dout = 11;
58 "mov $0x564D5868, %%eax; /* magic number */"
59 "mov $0x3c6cf712, %%ebx; /* random number */"
60 "mov $0x0000000A, %%ecx; /* specifies command */"
61 "mov $0x5658, %%edx; /* VMware I/O port */"
67 : "=r"(vmaj), "=r"(magic), "=r"(vmin), "=r"(dout));
69 fprintf(stderr, "version: major=%x, minor=%x, magic=%x, dout=%x\n",
70 vmaj, vmin, magic, dout);
72 return (0x564D5868 == magic) ? 1 : 0;
77 #elif defined (__x86_64__)
78 // only guessed, possible need to check against 0xffff?
79 int checkVmware(const int debug)
81 unsigned char idtr[10];
82 asm("sidt %0" : "=m" (idtr));
85 return (0xff==idtr[9]) ? 1 : 0;
87 int checkVmwareIO() { return 0; }
92 // vmware runs only on the archs above
93 int checkVmware(const int) { return 0; }
94 int checkVmwareIO() { return 0; }
98 // returns 0 if running inside vmware, 1 otherwise
99 int main(int argc, char* argv[]) {
101 if(argc == 2 && !strcmp(argv[1], "--debug"))
105 // known to be false positives
106 a = checkVmware(debug);
107 DWRITE("idt-check: ")
115 // never returns if not running under vmware
116 void dummy() { DWRITE("false\n"); exit(1); }
117 signal(SIGSEGV, dummy);
118 DWRITE("ioport-check: ");
125 WRITE("Error: IO check hasn't killed the program but no vmware found either!\n");
128 // vim: foldmethod=marker