4 * Copyright 1995 Anand Kumria
13 #define VXD_BARF(context,name) \
14 DUMP( "vxd %s: unknown/not implemented parameters:\n" \
15 "vxd %s: AX %04x, BX %04x, CX %04x, DX %04x, " \
16 "SI %04x, DI %04x, DS %04x, ES %04x\n", \
17 (name), (name), AX_reg(context), BX_reg(context), \
18 CX_reg(context), DX_reg(context), SI_reg(context), \
19 DI_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context) )
22 static WORD
VXD_WinVersion(void)
24 WORD version
= LOWORD(GetVersion16());
25 return (version
>> 8) | (version
<< 8);
28 /***********************************************************************
31 void WINAPI
VXD_PageFile( CONTEXT
*context
)
33 unsigned service
= AX_reg(context
);
35 /* taken from Ralf Brown's Interrupt List */
37 TRACE(vxd
,"[%04x] PageFile\n", (UINT16
)service
);
41 case 0x00: /* get version, is this windows version? */
42 TRACE(vxd
,"returning version\n");
43 AX_reg(context
) = VXD_WinVersion();
47 case 0x01: /* get swap file info */
48 TRACE(vxd
,"VxD PageFile: returning swap file info\n");
49 AX_reg(context
) = 0x00; /* paging disabled */
50 ECX_reg(context
) = 0; /* maximum size of paging file */
51 /* FIXME: do I touch DS:SI or DS:DI? */
55 case 0x02: /* delete permanent swap on exit */
56 TRACE(vxd
,"VxD PageFile: supposed to delete swap\n");
60 case 0x03: /* current temporary swap file size */
61 TRACE(vxd
,"VxD PageFile: what is current temp. swap size\n");
65 case 0x04: /* read or write?? INTERRUP.D */
66 case 0x05: /* cancel?? INTERRUP.D */
67 case 0x06: /* test I/O valid INTERRUP.D */
69 VXD_BARF( context
, "pagefile" );
75 /***********************************************************************
78 void WINAPI
VXD_Shell( CONTEXT
*context
)
80 unsigned service
= DX_reg(context
);
82 TRACE(vxd
,"[%04x] Shell\n", (UINT16
)service
);
84 switch (service
) /* Ralf Brown says EDX, but I use DX instead */
87 TRACE(vxd
,"returning version\n");
88 AX_reg(context
) = VXD_WinVersion();
89 EBX_reg(context
) = 1; /* system VM Handle */
97 TRACE(vxd
,"VxD Shell: EDX = %08lx\n",EDX_reg(context
));
98 VXD_BARF( context
, "shell" );
101 case 0x0006: /* SHELL_Get_VM_State */
102 TRACE(vxd
,"VxD Shell: returning VM state\n");
103 /* Actually we don't, not yet. We have to return a structure
104 * and I am not to sure how to set it up and return it yet,
105 * so for now let's do nothing. I can (hopefully) get this
106 * by the next release
108 /* RESET_CFLAG(context); */
128 TRACE(vxd
,"VxD Shell: EDX = %08lx\n",EDX_reg(context
));
129 VXD_BARF( context
, "shell");
135 /***********************************************************************
138 void WINAPI
VXD_Comm( CONTEXT
*context
)
140 unsigned service
= AX_reg(context
);
142 TRACE(vxd
,"[%04x] Comm\n", (UINT16
)service
);
146 case 0x0000: /* get version */
147 TRACE(vxd
,"returning version\n");
148 AX_reg(context
) = VXD_WinVersion();
149 RESET_CFLAG(context
);
152 case 0x0001: /* set port global */
153 case 0x0002: /* get focus */
154 case 0x0003: /* virtualise port */
156 VXD_BARF( context
, "comm" );
160 /***********************************************************************
163 void VXD_Timer( CONTEXT
*context
)
165 unsigned service
= AX_reg(context
);
167 TRACE(vxd
,"[%04x] Virtual Timer\n", (UINT16
)service
);
171 case 0x0000: /* version */
172 AX_reg(context
) = VXD_WinVersion();
173 RESET_CFLAG(context
);
176 case 0x0100: /* clock tick time, in 840nsecs */
177 EAX_reg(context
) = GetTickCount();
179 EDX_reg(context
) = EAX_reg(context
) >> 22;
180 EAX_reg(context
) <<= 10; /* not very precise */
183 case 0x0101: /* current Windows time, msecs */
184 case 0x0102: /* current VM time, msecs */
185 EAX_reg(context
) = GetTickCount();
189 VXD_BARF( context
, "VTD" );