Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
66b29b27
Commit
66b29b27
authored
Jan 23, 2003
by
Jukka Heinonen
Committed by
Alexandre Julliard
Jan 23, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Return number of bytes written when writing to DOS console using int21
function 0x40. Move some int21 functions to winedos.
parent
fcba2b53
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
112 additions
and
118 deletions
+112
-118
int21.c
dlls/winedos/int21.c
+112
-33
int21.c
msdos/int21.c
+0
-85
No files found.
dlls/winedos/int21.c
View file @
66b29b27
...
...
@@ -33,6 +33,7 @@
#include "msdos.h"
#include "file.h"
#include "winerror.h"
#include "winuser.h"
#include "wine/unicode.h"
#include "wine/debug.h"
...
...
@@ -706,18 +707,15 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
case
0x11
:
/* FIND FIRST MATCHING FILE USING FCB */
case
0x12
:
/* FIND NEXT MATCHING FILE USING FCB */
case
0x13
:
/* DELETE FILE USING FCB */
INT_Int21Handler
(
context
);
break
;
case
0x13
:
/* DELETE FILE USING FCB */
case
0x14
:
/* SEQUENTIAL READ FROM FCB FILE */
case
0x15
:
/* SEQUENTIAL WRITE TO FCB FILE */
case
0x16
:
/* CREATE OR TRUNCATE FILE USING FCB */
INT_BARF
(
context
,
0x21
);
break
;
case
0x17
:
/* RENAME FILE USING FCB */
INT_
Int21Handler
(
context
);
INT_
BARF
(
context
,
0x21
);
break
;
case
0x18
:
/* NULL FUNCTION FOR CP/M COMPATIBILITY */
...
...
@@ -814,11 +812,26 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
/* we cannot change the behaviour anyway, so just ignore it */
break
;
case
0x2f
:
/* GET DISK TRANSFER AREA ADDRESS */
case
0x30
:
/* GET DOS VERSION */
case
0x2f
:
/* GET DISK TRANSFER AREA ADDRESS */
INT_Int21Handler
(
context
);
break
;
case
0x30
:
/* GET DOS VERSION */
TRACE
(
"GET DOS VERSION - %s requested
\n
"
,
(
AL_reg
(
context
)
==
0x00
)
?
"OEM number"
:
"version flag"
);
SET_AL
(
context
,
HIBYTE
(
HIWORD
(
GetVersion16
()))
);
/* major version */
SET_AH
(
context
,
LOBYTE
(
HIWORD
(
GetVersion16
()))
);
/* minor version */
if
(
AL_reg
(
context
)
==
0x00
)
SET_BH
(
context
,
0xff
);
/* OEM number => undefined */
else
SET_BH
(
context
,
0x08
);
/* version flag => DOS is in ROM */
SET_BL
(
context
,
0x12
);
/* 0x123456 is Wine's serial # */
SET_CX
(
context
,
0x3456
);
break
;
case
0x31
:
/* TERMINATE AND STAY RESIDENT */
FIXME
(
"TERMINATE AND STAY RESIDENT stub
\n
"
);
break
;
...
...
@@ -880,17 +893,29 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
break
;
case
0x40
:
/* "WRITE" - WRITE TO FILE OR DEVICE */
/* Writes to stdout are handled here. */
if
(
!
DOSVM_IsWin16
()
&&
BX_reg
(
context
)
==
1
)
{
BYTE
*
ptr
=
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
);
int
i
;
TRACE
(
"WRITE from %04lX:%04X to handle %d for %d byte
\n
"
,
context
->
SegDs
,
DX_reg
(
context
),
BX_reg
(
context
),
CX_reg
(
context
)
);
{
BYTE
*
ptr
=
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
);
for
(
i
=
0
;
i
<
CX_reg
(
context
);
i
++
)
DOSVM_PutChar
(
ptr
[
i
]);
}
else
INT_Int21Handler
(
context
);
if
(
!
DOSVM_IsWin16
()
&&
BX_reg
(
context
)
==
1
)
{
int
i
;
for
(
i
=
0
;
i
<
CX_reg
(
context
);
i
++
)
DOSVM_PutChar
(
ptr
[
i
]);
SET_AX
(
context
,
CX_reg
(
context
));
}
else
{
HFILE
handle
=
(
HFILE
)
DosFileHandleToWin32Handle
(
BX_reg
(
context
));
LONG
result
=
_hwrite
(
handle
,
ptr
,
CX_reg
(
context
)
);
if
(
result
==
HFILE_ERROR
)
bSetDOSExtendedError
=
TRUE
;
else
SET_AX
(
context
,
(
WORD
)
result
);
}
}
break
;
case
0x41
:
/* "UNLINK" - DELETE FILE */
...
...
@@ -904,6 +929,25 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
break
;
case
0x45
:
/* "DUP" - DUPLICATE FILE HANDLE */
TRACE
(
"DUPLICATE FILE HANDLE %d
\n
"
,
BX_reg
(
context
)
);
{
HANDLE
handle32
;
HFILE
handle16
=
HFILE_ERROR
;
if
(
DuplicateHandle
(
GetCurrentProcess
(),
DosFileHandleToWin32Handle
(
BX_reg
(
context
)),
GetCurrentProcess
(),
&
handle32
,
0
,
TRUE
,
DUPLICATE_SAME_ACCESS
))
handle16
=
Win32HandleToDosFileHandle
(
handle32
);
if
(
handle16
==
HFILE_ERROR
)
bSetDOSExtendedError
=
TRUE
;
else
SET_AX
(
context
,
handle16
);
}
break
;
case
0x46
:
/* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */
case
0x47
:
/* "CWD" - GET CURRENT DIRECTORY */
INT_Int21Handler
(
context
);
...
...
@@ -964,17 +1008,26 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
break
;
case
0x4b
:
/* "EXEC" - LOAD AND/OR EXECUTE PROGRAM */
if
(
DOSVM_IsWin16
())
{
INT_Int21Handler
(
context
);
break
;
}
TRACE
(
"EXEC %s
\n
"
,
(
LPCSTR
)
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
));
if
(
!
MZ_Exec
(
context
,
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
),
AL_reg
(
context
),
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegEs
,
context
->
Ebx
)
))
{
SET_AX
(
context
,
GetLastError
()
);
SET_CFLAG
(
context
);
BYTE
*
program
=
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
);
BYTE
*
paramblk
=
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegEs
,
context
->
Ebx
);
TRACE
(
"EXEC %s
\n
"
,
program
);
if
(
DOSVM_IsWin16
())
{
HINSTANCE16
instance
=
WinExec16
(
program
,
SW_NORMAL
);
if
(
instance
<
32
)
{
SET_CFLAG
(
context
);
SET_AX
(
context
,
instance
);
}
}
else
{
if
(
!
MZ_Exec
(
context
,
program
,
AL_reg
(
context
),
paramblk
))
bSetDOSExtendedError
=
TRUE
;
}
}
break
;
...
...
@@ -1115,23 +1168,49 @@ void WINAPI DOSVM_Int21Handler( CONTEXT86 *context )
break
;
case
0x68
:
/* "FFLUSH" - COMMIT FILE */
TRACE
(
"FFLUSH - handle %d
\n
"
,
BX_reg
(
context
)
);
if
(
!
FlushFileBuffers
(
DosFileHandleToWin32Handle
(
BX_reg
(
context
))
))
bSetDOSExtendedError
=
TRUE
;
break
;
case
0x69
:
/* DISK SERIAL NUMBER */
case
0x6a
:
/* COMMIT FILE */
INT_Int21Handler
(
context
);
break
;
case
0x6a
:
/* COMMIT FILE */
TRACE
(
"COMMIT FILE - handle %d
\n
"
,
BX_reg
(
context
)
);
if
(
!
FlushFileBuffers
(
DosFileHandleToWin32Handle
(
BX_reg
(
context
))
))
bSetDOSExtendedError
=
TRUE
;
break
;
case
0x6b
:
/* NULL FUNCTION FOR CP/M COMPATIBILITY */
SET_AL
(
context
,
0
);
break
;
case
0x6c
:
/* EXTENDED OPEN/CREATE */
case
0x70
:
/* MS-DOS 7 (Windows95) - ??? (country-specific?)*/
case
0x71
:
/* MS-DOS 7 (Windows95) - LONG FILENAME FUNCTIONS */
case
0x72
:
/* MS-DOS 7 (Windows95) - ??? */
case
0x73
:
/* MULTIPLEXED: Win95 OSR2/Win98 FAT32 calls */
INT_Int21Handler
(
context
);
break
;
case
0x70
:
/* MSDOS 7 - GET/SET INTERNATIONALIZATION INFORMATION */
FIXME
(
"MS-DOS 7 - GET/SET INTERNATIONALIZATION INFORMATION
\n
"
);
SET_CFLAG
(
context
);
SET_AL
(
context
,
0
);
break
;
case
0x71
:
/* MSDOS 7 - LONG FILENAME FUNCTIONS */
INT_Int21Handler
(
context
);
break
;
case
0x73
:
/* MSDOS7 - FAT32 */
INT_Int21Handler
(
context
);
break
;
case
0xdc
:
/* CONNECTION SERVICES - GET CONNECTION NUMBER */
TRACE
(
"CONNECTION SERVICES - GET CONNECTION NUMBER - ignored
\n
"
);
break
;
case
0xea
:
/* NOVELL NETWARE - RETURN SHELL VERSION */
INT_Int21Handler
(
context
);
TRACE
(
"NOVELL NETWARE - RETURN SHELL VERSION - ignored
\n
"
);
break
;
default:
...
...
msdos/int21.c
View file @
66b29b27
...
...
@@ -877,18 +877,6 @@ static int INT21_FindNextFCB( CONTEXT86 *context )
}
static
void
DeleteFileFCB
(
CONTEXT86
*
context
)
{
FIXME
(
"(%p): stub
\n
"
,
context
);
}
static
void
RenameFileFCB
(
CONTEXT86
*
context
)
{
FIXME
(
"(%p): stub
\n
"
,
context
);
}
static
void
fLock
(
CONTEXT86
*
context
)
{
...
...
@@ -1033,14 +1021,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
SET_AL
(
context
,
INT21_FindNextFCB
(
context
)
?
0x00
:
0xff
);
break
;
case
0x13
:
/* DELETE FILE USING FCB */
DeleteFileFCB
(
context
);
break
;
case
0x17
:
/* RENAME FILE USING FCB */
RenameFileFCB
(
context
);
break
;
case
0x19
:
/* GET CURRENT DEFAULT DRIVE */
SET_AL
(
context
,
DRIVE_GetCurrentDrive
()
);
break
;
...
...
@@ -1079,19 +1059,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
break
;
case
0x30
:
/* GET DOS VERSION */
TRACE
(
"GET DOS VERSION %s requested
\n
"
,
(
AL_reg
(
context
)
==
0x00
)
?
"OEM number"
:
"version flag"
);
SET_AX
(
context
,
(
HIWORD
(
GetVersion16
())
>>
8
)
|
(
HIWORD
(
GetVersion16
())
<<
8
)
);
#if 0
SET_AH( context, 0x7 );
SET_AL( context, 0xA );
#endif
SET_BX
(
context
,
0x00FF
);
/* 0x123456 is Wine's serial # */
SET_CX
(
context
,
0x0000
);
break
;
case
0x32
:
/* GET DOS DRIVE PARAMETER BLOCK FOR SPECIFIC DRIVE */
TRACE
(
"GET DOS DRIVE PARAMETER BLOCK FOR DRIVE %s
\n
"
,
INT21_DriveName
(
DL_reg
(
context
)));
...
...
@@ -1247,19 +1214,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
break
;
case
0x40
:
/* "WRITE" - WRITE TO FILE OR DEVICE */
TRACE
(
"WRITE from %04lX:%04X to handle %d for %d byte
\n
"
,
context
->
SegDs
,
DX_reg
(
context
),
BX_reg
(
context
),
CX_reg
(
context
)
);
{
LONG
result
=
_hwrite16
(
BX_reg
(
context
),
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
),
CX_reg
(
context
)
);
if
(
result
==
-
1
)
bSetDOSExtendedError
=
TRUE
;
else
SET_AX
(
context
,
(
WORD
)
result
);
}
break
;
case
0x41
:
/* "UNLINK" - DELETE FILE */
TRACE
(
"UNLINK %s
\n
"
,
(
LPCSTR
)
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
));
...
...
@@ -1433,20 +1387,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
break
;
case
0x45
:
/* "DUP" - DUPLICATE FILE HANDLE */
{
HANDLE
handle
;
TRACE
(
"DUP - DUPLICATE FILE HANDLE %d
\n
"
,
BX_reg
(
context
));
if
((
bSetDOSExtendedError
=
!
DuplicateHandle
(
GetCurrentProcess
(),
DosFileHandleToWin32Handle
(
BX_reg
(
context
)),
GetCurrentProcess
(),
&
handle
,
0
,
TRUE
,
DUPLICATE_SAME_ACCESS
)))
SET_AX
(
context
,
HFILE_ERROR16
);
else
SET_AX
(
context
,
Win32HandleToDosFileHandle
(
handle
)
);
break
;
}
case
0x46
:
/* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */
TRACE
(
"FORCEDUP - FORCE DUPLICATE FILE HANDLE %d to %d
\n
"
,
BX_reg
(
context
),
CX_reg
(
context
));
...
...
@@ -1476,13 +1416,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
break
;
case
0x4b
:
/* "EXEC" - LOAD AND/OR EXECUTE PROGRAM */
TRACE
(
"EXEC %s
\n
"
,
(
LPCSTR
)
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
));
SET_AX
(
context
,
WinExec16
(
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
),
SW_NORMAL
));
if
(
AX_reg
(
context
)
<
32
)
SET_CFLAG
(
context
);
break
;
case
0x4e
:
/* "FINDFIRST" - FIND FIRST MATCHING FILE */
TRACE
(
"FINDFIRST mask 0x%04x spec %s
\n
"
,
CX_reg
(
context
),
(
LPCSTR
)
CTX_SEG_OFF_TO_LIN
(
context
,
context
->
SegDs
,
context
->
Edx
));
...
...
@@ -1612,12 +1545,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
break
;
case
0x68
:
/* "FFLUSH" - COMMIT FILE */
case
0x6a
:
/* COMMIT FILE */
TRACE
(
"FFLUSH/COMMIT handle %d
\n
"
,
BX_reg
(
context
));
bSetDOSExtendedError
=
(
!
FlushFileBuffers
(
DosFileHandleToWin32Handle
(
BX_reg
(
context
))
));
break
;
case
0x69
:
/* DISK SERIAL NUMBER */
switch
(
AL_reg
(
context
))
{
...
...
@@ -1837,14 +1764,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
}
break
;
case
0x70
:
/* MS-DOS 7 (Windows95) - ??? (country-specific?)*/
case
0x72
:
/* MS-DOS 7 (Windows95) - ??? */
TRACE
(
"windows95 function AX %04x
\n
"
,
AX_reg
(
context
));
WARN
(
" returning unimplemented
\n
"
);
SET_CFLAG
(
context
);
SET_AL
(
context
,
0
);
break
;
case
0x73
:
/* MULTIPLEXED: Win95 OSR2/Win98 FAT32 calls */
TRACE
(
"windows95 function AX %04x
\n
"
,
...
...
@@ -1925,10 +1844,6 @@ void WINAPI INT_Int21Handler( CONTEXT86 *context )
break
;
case
0xdc
:
/* CONNECTION SERVICES - GET CONNECTION NUMBER */
case
0xea
:
/* NOVELL NETWARE - RETURN SHELL VERSION */
break
;
default:
INT_BARF
(
context
,
0x21
);
break
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment