/* * VxD emulation * * Copyright 1995 Anand Kumria */ #include #include "windows.h" #include "msdos.h" #include "miscemu.h" #include "wine.h" #include "stddebug.h" /* #define DEBUG_VXD */ #include "debug.h" /*********************************************************************** * VXD_PageFile */ void VXD_PageFile( struct sigcontext_struct context ) { /* taken from Ralf Brown's Interrupt List */ dprintf_vxd(stddeb,"VxD PageFile called ...\n"); switch(AX_reg(&context)) { case 0x00: /* get version, is this windows version? */ dprintf_vxd(stddeb,"VxD PageFile: returning version\n"); AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00); RESET_CFLAG(&context); break; case 0x01: /* get swap file info */ dprintf_vxd(stddeb,"VxD PageFile: returning swap file info\n"); AX_reg(&context) = 0x00; /* paging disabled */ ECX_reg(&context) = 0; /* maximum size of paging file */ /* FIXME: do I touch DS:SI or DS:DI? */ RESET_CFLAG(&context); break; case 0x02: /* delete permanent swap on exit */ dprintf_vxd(stddeb,"VxD PageFile: supposed to delete swap\n"); RESET_CFLAG(&context); break; case 0x03: /* current temporary swap file size */ dprintf_vxd(stddeb,"VxD PageFile: what is current temp. swap size\n"); RESET_CFLAG(&context); break; case 0x04: /* read or write?? INTERRUP.D */ case 0x05: /* cancel?? INTERRUP.D */ case 0x06: /* test I/O valid INTERRUP.D */ default: INT_BARF( &context, 0x2f); break; } } /*********************************************************************** * VXD_Shell */ void VXD_Shell( struct sigcontext_struct context ) { dprintf_vxd(stddeb,"VxD Shell called ...\n"); switch (DX_reg(&context)) /* Ralf Brown says EDX, but I use DX instead */ { case 0x0000: dprintf_vxd(stddeb,"VxD Shell: returning version\n"); AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00); EBX_reg(&context) = 1; /* system VM Handle */ break; case 0x0001: case 0x0002: case 0x0003: case 0x0004: case 0x0005: dprintf_vxd(stddeb,"VxD Shell: EDX = %08lx\n",EDX_reg(&context)); INT_BARF( &context, 0x2f); break; case 0x0006: /* SHELL_Get_VM_State */ dprintf_vxd(stddeb,"VxD Shell: returning VM state\n"); /* Actually we don't, not yet. We have to return a structure * and I am not to sure how to set it up and return it yet, * so for now let's do nothing. I can (hopefully) get this * by the next release */ /* RESET_CFLAG(&context); */ break; case 0x0007: case 0x0008: case 0x0009: case 0x000A: case 0x000B: case 0x000C: case 0x000D: case 0x000E: case 0x000F: case 0x0010: case 0x0011: case 0x0012: case 0x0013: case 0x0014: case 0x0015: case 0x0016: default: dprintf_vxd(stddeb,"VxD Shell: EDX = %08lx\n",EDX_reg(&context)); INT_BARF( &context, 0x2f); break; } } /*********************************************************************** * VXD_Comm */ void VXD_Comm( struct sigcontext_struct context ) { dprintf_vxd(stddeb,"VxD Comm called ...\n"); switch (AX_reg(&context)) { case 0x0000: /* get version */ dprintf_vxd(stddeb,"VxD Comm: returning version\n"); AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00); RESET_CFLAG(&context); break; case 0x0001: /* set port global */ case 0x0002: /* get focus */ case 0x0003: /* virtualise port */ default: INT_BARF( &context, 0x2f); } }