In int21_ioctl - get device data-, set the "is console" bits if the
device handle is a tty or a proper console io handle.
This commit is contained in:
parent
c3ead97b4e
commit
b08f958157
|
@ -46,6 +46,7 @@
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
#include "wine/exception.h"
|
#include "wine/exception.h"
|
||||||
|
|
||||||
|
BOOL WINAPI VerifyConsoleIoHandle(HANDLE);
|
||||||
/*
|
/*
|
||||||
* Note:
|
* Note:
|
||||||
* - Most of the file related functions are wrong. NT's kernel32
|
* - Most of the file related functions are wrong. NT's kernel32
|
||||||
|
@ -2731,27 +2732,34 @@ static void INT21_Ioctl_Char( CONTEXT86 *context )
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int status, i, fd;
|
int status, i, fd;
|
||||||
|
int IsConsoleIOHandle = 0;
|
||||||
HANDLE handle = DosFileHandleToWin32Handle(BX_reg(context));
|
HANDLE handle = DosFileHandleToWin32Handle(BX_reg(context));
|
||||||
|
|
||||||
status = wine_server_handle_to_fd( handle, 0, &fd, NULL );
|
status = wine_server_handle_to_fd( handle, 0, &fd, NULL );
|
||||||
if (status)
|
if (status)
|
||||||
{
|
{
|
||||||
SET_AX( context, RtlNtStatusToDosError(status) );
|
if( VerifyConsoleIoHandle( handle))
|
||||||
SET_CFLAG( context );
|
IsConsoleIOHandle = 1;
|
||||||
return;
|
else {
|
||||||
}
|
SET_AX( context, RtlNtStatusToDosError(status) );
|
||||||
fstat( fd, &st );
|
SET_CFLAG( context );
|
||||||
wine_server_release_fd( handle, fd );
|
|
||||||
|
|
||||||
for (i = 0; i < NB_MAGIC_DEVICES; i++)
|
|
||||||
{
|
|
||||||
if (!magic_devices[i].handle) continue;
|
|
||||||
if (magic_devices[i].dev == st.st_dev && magic_devices[i].ino == st.st_ino)
|
|
||||||
{
|
|
||||||
/* found it */
|
|
||||||
magic_devices[i].ioctl_handler( context );
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
fstat( fd, &st );
|
||||||
|
IsConsoleIOHandle = isatty( fd);
|
||||||
|
wine_server_release_fd( handle, fd );
|
||||||
|
for (i = 0; i < NB_MAGIC_DEVICES; i++)
|
||||||
|
{
|
||||||
|
if (!magic_devices[i].handle) continue;
|
||||||
|
if (magic_devices[i].dev == st.st_dev &&
|
||||||
|
magic_devices[i].ino == st.st_ino)
|
||||||
|
{
|
||||||
|
/* found it */
|
||||||
|
magic_devices[i].ioctl_handler( context );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* no magic device found, do default handling */
|
/* no magic device found, do default handling */
|
||||||
|
@ -2760,7 +2768,7 @@ static void INT21_Ioctl_Char( CONTEXT86 *context )
|
||||||
{
|
{
|
||||||
case 0x00: /* GET DEVICE INFORMATION */
|
case 0x00: /* GET DEVICE INFORMATION */
|
||||||
TRACE( "IOCTL - GET DEVICE INFORMATION - %d\n", BX_reg(context) );
|
TRACE( "IOCTL - GET DEVICE INFORMATION - %d\n", BX_reg(context) );
|
||||||
if (S_ISCHR(st.st_mode))
|
if (IsConsoleIOHandle || S_ISCHR(st.st_mode))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Returns attribute word in DX:
|
* Returns attribute word in DX:
|
||||||
|
@ -2774,10 +2782,10 @@ static void INT21_Ioctl_Char( CONTEXT86 *context )
|
||||||
* Bit 4 - Device is special (uses int29).
|
* Bit 4 - Device is special (uses int29).
|
||||||
* Bit 3 - Clock device.
|
* Bit 3 - Clock device.
|
||||||
* Bit 2 - NUL device.
|
* Bit 2 - NUL device.
|
||||||
* Bit 1 - Standard output.
|
* Bit 1 - Console output device.
|
||||||
* Bit 0 - Standard input.
|
* Bit 0 - Console input device.
|
||||||
*/
|
*/
|
||||||
SET_DX( context, 0x80c0 /* FIXME */ );
|
SET_DX( context, IsConsoleIOHandle ? 0x80c3 : 0x80c0 /* FIXME */ );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue