* Remove cases for vwin32 IOCTLs 0x10 and 0x29 numbers as they are unsupported by Windows 9x * Fix functions accepted by IOCTLs VWIN32_DIOC_DOS_IOCTL and VWIN32_DIOC_DOS_DRIVEINFO * Add missing IOCTL VWIN32_DIOC_DOS_INT13 case for TRACE log
From: Pali Rohár pali@kernel.org
Windows 9x does not support vwin32 IOCTLs 0x10 and 0x29. It returns invalid IOCTL for these two cases. There is really no Windows functionality for VWIN_DIOC_INT21 or VWIN_DIOC_INT31.
Signed-off-by: Pali Rohár pali@kernel.org --- dlls/vwin32.vxd/vwin32.c | 6 ------ 1 file changed, 6 deletions(-)
diff --git a/dlls/vwin32.vxd/vwin32.c b/dlls/vwin32.vxd/vwin32.c index 63c440fdbe4..a339d472482 100644 --- a/dlls/vwin32.vxd/vwin32.c +++ b/dlls/vwin32.vxd/vwin32.c @@ -110,11 +110,9 @@ BOOL WINAPI VWIN32_DeviceIoControl(DWORD dwIoControlCode, switch (dwIoControlCode) { case VWIN32_DIOC_DOS_IOCTL: - case 0x10: /* Int 0x21 call, call it VWIN_DIOC_INT21 ? */ case VWIN32_DIOC_DOS_INT13: case VWIN32_DIOC_DOS_INT25: case VWIN32_DIOC_DOS_INT26: - case 0x29: /* Int 0x31 call, call it VWIN_DIOC_INT31 ? */ case VWIN32_DIOC_DOS_DRIVEINFO: { CONTEXT cxt; @@ -137,7 +135,6 @@ BOOL WINAPI VWIN32_DeviceIoControl(DWORD dwIoControlCode, switch (dwIoControlCode) { case VWIN32_DIOC_DOS_IOCTL: /* Call int 21h */ - case 0x10: /* Int 0x21 call, call it VWIN_DIOC_INT21 ? */ case VWIN32_DIOC_DOS_DRIVEINFO: /* Call int 21h 730x */ intnum = 0x21; break; @@ -150,9 +147,6 @@ BOOL WINAPI VWIN32_DeviceIoControl(DWORD dwIoControlCode, case VWIN32_DIOC_DOS_INT26: intnum = 0x26; break; - case 0x29: /* Int 0x31 call, call it VWIN_DIOC_INT31 ? */ - intnum = 0x31; - break; }
__wine_call_int_handler16( intnum, &cxt );
From: Pali Rohár pali@kernel.org
Signed-off-by: Pali Rohár pali@kernel.org --- dlls/vwin32.vxd/vwin32.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/vwin32.vxd/vwin32.c b/dlls/vwin32.vxd/vwin32.c index a339d472482..c5a7c98212e 100644 --- a/dlls/vwin32.vxd/vwin32.c +++ b/dlls/vwin32.vxd/vwin32.c @@ -124,6 +124,7 @@ BOOL WINAPI VWIN32_DeviceIoControl(DWORD dwIoControlCode, "eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, " "edx=0x%08lx, esi=0x%08lx, edi=0x%08lx\n", (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" : (dwIoControlCode == VWIN32_DIOC_DOS_DRIVEINFO)? "VWIN32_DIOC_DOS_DRIVEINFO" : "???",
From: Pali Rohár pali@kernel.org
vwin32 IOCTL VWIN32_DIOC_DOS_IOCTL accepts only functions 4400h - 4411h and vwin32 IOCTL VWIN32_DIOC_DOS_DRIVEINFO accepts only functions 730x.
Add missing checks and TRACE logs.
Signed-off-by: Pali Rohár pali@kernel.org --- dlls/vwin32.vxd/vwin32.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/vwin32.vxd/vwin32.c b/dlls/vwin32.vxd/vwin32.c index c5a7c98212e..ae693bdf8d1 100644 --- a/dlls/vwin32.vxd/vwin32.c +++ b/dlls/vwin32.vxd/vwin32.c @@ -135,8 +135,20 @@ BOOL WINAPI VWIN32_DeviceIoControl(DWORD dwIoControlCode,
switch (dwIoControlCode) { - case VWIN32_DIOC_DOS_IOCTL: /* Call int 21h */ + case VWIN32_DIOC_DOS_IOCTL: /* Call int 21h 4400h - 4411h */ + if ((pIn->reg_EAX & 0xff00) != 0x4400) + { + TRACE( "Invalid VWIN32_DIOC_DOS_IOCTL function 0x%lx\n", (pIn->reg_EAX & 0xffff) ); + return FALSE; + } + intnum = 0x21; + break; case VWIN32_DIOC_DOS_DRIVEINFO: /* Call int 21h 730x */ + if ((pIn->reg_EAX & 0xff00) != 0x7300) + { + TRACE( "Invalid VWIN32_DIOC_DOS_DRIVEINFO function 0x%lx\n", (pIn->reg_EAX & 0xffff) ); + return FALSE; + } intnum = 0x21; break; case VWIN32_DIOC_DOS_INT13: