forked from Mirrors/wine-wine
Implemented (most) VWin32.VxD DeviceIoControl routines.
parent
ca1c74751a
commit
1298062519
|
@ -236,6 +236,7 @@ typedef struct tagDIOCRegs {
|
||||||
#define VWIN32_DIOC_DOS_INT25 2 /* This is the Absolute Disk Read command - Interrupt 25h */
|
#define VWIN32_DIOC_DOS_INT25 2 /* This is the Absolute Disk Read command - Interrupt 25h */
|
||||||
#define VWIN32_DIOC_DOS_INT26 3 /* This is the Absolute Disk Write command - Interrupt 25h */
|
#define VWIN32_DIOC_DOS_INT26 3 /* This is the Absolute Disk Write command - Interrupt 25h */
|
||||||
#define VWIN32_DIOC_DOS_INT13 4 /* This is Interrupt 13h commands */
|
#define VWIN32_DIOC_DOS_INT13 4 /* This is Interrupt 13h commands */
|
||||||
|
#define VWIN32_DIOC_SIMCTRLC 5 /* Simulate Ctrl-C */
|
||||||
#define VWIN32_DIOC_DOS_DRIVEINFO 6 /* This is Interrupt 21h Function 730X commands */
|
#define VWIN32_DIOC_DOS_DRIVEINFO 6 /* This is Interrupt 21h Function 730X commands */
|
||||||
|
|
||||||
/* Important: All MS_DOS data structures must be packed on a one-byte boundary - good old 16 bit. */
|
/* Important: All MS_DOS data structures must be packed on a one-byte boundary - good old 16 bit. */
|
||||||
|
|
108
win32/device.c
108
win32/device.c
|
@ -74,6 +74,12 @@ static BOOL32 DeviceIo_IFSMgr(DEVICE_OBJECT *dev, DWORD dwIoControlCode,
|
||||||
LPDWORD lpcbBytesReturned,
|
LPDWORD lpcbBytesReturned,
|
||||||
LPOVERLAPPED lpOverlapped);
|
LPOVERLAPPED lpOverlapped);
|
||||||
|
|
||||||
|
static BOOL32 DeviceIo_VWin32(DEVICE_OBJECT *dev, DWORD dwIoControlCode,
|
||||||
|
LPVOID lpvInBuffer, DWORD cbInBuffer,
|
||||||
|
LPVOID lpvOutBuffer, DWORD cbOutBuffer,
|
||||||
|
LPDWORD lpcbBytesReturned,
|
||||||
|
LPOVERLAPPED lpOverlapped);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VxD names are taken from the Win95 DDK
|
* VxD names are taken from the Win95 DDK
|
||||||
*/
|
*/
|
||||||
|
@ -130,7 +136,7 @@ struct VxDInfo
|
||||||
{ "VXDLDR", 0x0027, NULL, NULL },
|
{ "VXDLDR", 0x0027, NULL, NULL },
|
||||||
{ "NDIS", 0x0028, NULL, NULL },
|
{ "NDIS", 0x0028, NULL, NULL },
|
||||||
{ "BIOS_EXT", 0x0029, NULL, NULL },
|
{ "BIOS_EXT", 0x0029, NULL, NULL },
|
||||||
{ "VWIN32", 0x002A, NULL, NULL },
|
{ "VWIN32", 0x002A, NULL, DeviceIo_VWin32 },
|
||||||
{ "VCOMM", 0x002B, NULL, NULL },
|
{ "VCOMM", 0x002B, NULL, NULL },
|
||||||
{ "SPOOLER", 0x002C, NULL, NULL },
|
{ "SPOOLER", 0x002C, NULL, NULL },
|
||||||
{ "WIN32S", 0x002D, NULL, NULL },
|
{ "WIN32S", 0x002D, NULL, NULL },
|
||||||
|
@ -838,6 +844,106 @@ static BOOL32 DeviceIo_IFSMgr(DEVICE_OBJECT *dev, DWORD dwIoControlCode,
|
||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DeviceIo_VWin32
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void DIOCRegs_2_CONTEXT( DIOC_REGISTERS *pIn, CONTEXT *pCxt )
|
||||||
|
{
|
||||||
|
memset( pCxt, 0, sizeof(CONTEXT) );
|
||||||
|
/* Note: segment registers == 0 means that CTX_SEG_OFF_TO_LIN
|
||||||
|
will interpret 32-bit register contents as linear pointers */
|
||||||
|
|
||||||
|
pCxt->ContextFlags=CONTEXT_INTEGER|CONTEXT_CONTROL;
|
||||||
|
pCxt->Eax = pIn->reg_EAX;
|
||||||
|
pCxt->Ebx = pIn->reg_EBX;
|
||||||
|
pCxt->Ecx = pIn->reg_ECX;
|
||||||
|
pCxt->Edx = pIn->reg_EDX;
|
||||||
|
pCxt->Esi = pIn->reg_ESI;
|
||||||
|
pCxt->Edi = pIn->reg_EDI;
|
||||||
|
|
||||||
|
/* FIXME: Only partial CONTEXT_CONTROL */
|
||||||
|
pCxt->EFlags = pIn->reg_Flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CONTEXT_2_DIOCRegs( CONTEXT *pCxt, DIOC_REGISTERS *pOut )
|
||||||
|
{
|
||||||
|
memset( pOut, 0, sizeof(DIOC_REGISTERS) );
|
||||||
|
|
||||||
|
pOut->reg_EAX = pCxt->Eax;
|
||||||
|
pOut->reg_EBX = pCxt->Ebx;
|
||||||
|
pOut->reg_ECX = pCxt->Ecx;
|
||||||
|
pOut->reg_EDX = pCxt->Edx;
|
||||||
|
pOut->reg_ESI = pCxt->Esi;
|
||||||
|
pOut->reg_EDI = pCxt->Edi;
|
||||||
|
|
||||||
|
/* FIXME: Only partial CONTEXT_CONTROL */
|
||||||
|
pOut->reg_Flags = pCxt->EFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL32 DeviceIo_VWin32(DEVICE_OBJECT *dev, DWORD dwIoControlCode,
|
||||||
|
LPVOID lpvInBuffer, DWORD cbInBuffer,
|
||||||
|
LPVOID lpvOutBuffer, DWORD cbOutBuffer,
|
||||||
|
LPDWORD lpcbBytesReturned,
|
||||||
|
LPOVERLAPPED lpOverlapped)
|
||||||
|
{
|
||||||
|
BOOL32 retv = TRUE;
|
||||||
|
|
||||||
|
switch (dwIoControlCode)
|
||||||
|
{
|
||||||
|
case VWIN32_DIOC_DOS_IOCTL:
|
||||||
|
case VWIN32_DIOC_DOS_INT13:
|
||||||
|
case VWIN32_DIOC_DOS_INT25:
|
||||||
|
case VWIN32_DIOC_DOS_INT26:
|
||||||
|
{
|
||||||
|
CONTEXT cxt;
|
||||||
|
DIOC_REGISTERS *pIn = (DIOC_REGISTERS *)lpvInBuffer;
|
||||||
|
DIOC_REGISTERS *pOut = (DIOC_REGISTERS *)lpvOutBuffer;
|
||||||
|
|
||||||
|
TRACE( win32, "Control '%s': "
|
||||||
|
"eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, "
|
||||||
|
"edx=0x%08lx, esi=0x%08lx, edi=0x%08lx ",
|
||||||
|
(dwIoControlCode == VWIN32_DIOC_DOS_IOCTL)? "VWIN32_DIOC_DOS_IOCTL" :
|
||||||
|
(dwIoControlCode == VWIN32_DIOC_DOS_INT13)? "VWIN32_DIOC_DOS_INT13" :
|
||||||
|
(dwIoControlCode == VWIN32_DIOC_DOS_INT25)? "VWIN32_DIOC_DOS_INT25" :
|
||||||
|
(dwIoControlCode == VWIN32_DIOC_DOS_INT26)? "VWIN32_DIOC_DOS_INT26" : "???",
|
||||||
|
pIn->reg_EAX, pIn->reg_EBX, pIn->reg_ECX,
|
||||||
|
pIn->reg_EDX, pIn->reg_ESI, pIn->reg_EDI );
|
||||||
|
|
||||||
|
DIOCRegs_2_CONTEXT( pIn, &cxt );
|
||||||
|
|
||||||
|
switch (dwIoControlCode)
|
||||||
|
{
|
||||||
|
case VWIN32_DIOC_DOS_IOCTL: DOS3Call( &cxt ); break; /* Call int 21h */
|
||||||
|
case VWIN32_DIOC_DOS_INT13: INT_Int13Handler( &cxt ); break;
|
||||||
|
case VWIN32_DIOC_DOS_INT25: INT_Int25Handler( &cxt ); break;
|
||||||
|
case VWIN32_DIOC_DOS_INT26: INT_Int26Handler( &cxt ); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONTEXT_2_DIOCRegs( &cxt, pOut );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VWIN32_DIOC_SIMCTRLC:
|
||||||
|
FIXME(win32, "Control VWIN32_DIOC_SIMCTRLC not implemented\n");
|
||||||
|
retv = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FIXME(win32, "Unknown Control %ld\n", dwIoControlCode);
|
||||||
|
retv = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* this is used by some Origin games */
|
/* this is used by some Origin games */
|
||||||
static BOOL32 DeviceIo_MONODEBG(DEVICE_OBJECT *dev, DWORD dwIoControlCode,
|
static BOOL32 DeviceIo_MONODEBG(DEVICE_OBJECT *dev, DWORD dwIoControlCode,
|
||||||
LPVOID lpvInBuffer, DWORD cbInBuffer,
|
LPVOID lpvInBuffer, DWORD cbInBuffer,
|
||||||
|
|
Loading…
Reference in New Issue