32 lines
1.3 KiB
Plaintext
32 lines
1.3 KiB
Plaintext
DOS treats the first 5 file handles as special cases. They map directly
|
|
to stdin, stdout, stderr, stdaux and stdprn. Windows 16 inherits this
|
|
behavoir, and in fact, win16 handles are interchangable with DOS handles.
|
|
Some nasty windows programs even do this!
|
|
|
|
Windows32 issues file handles starting from 1, on the grounds that
|
|
most GUI processes don't need a stdin, out, etc.
|
|
|
|
The wine handle code is implemented in the Win32 style, and the Win16
|
|
functions use two macros to convert to and from the two types.
|
|
|
|
The macros are defined in file.h as follows.:
|
|
#define HFILE16_TO_HFILE32(handle) \
|
|
(((handle)==0) ? GetStdHandle(STD_INPUT_HANDLE) : \
|
|
((handle)==1) ? GetStdHandle(STD_OUTPUT_HANDLE) : \
|
|
((handle)==2) ? GetStdHandle(STD_ERROR_HANDLE) : \
|
|
((handle)>0x400) ? handle : \
|
|
(handle)-5)
|
|
|
|
#define HFILE32_TO_HFILE16(handle) ({ HFILE32 hnd=handle; \
|
|
((hnd==HFILE_ERROR32) ? HFILE_ERROR16 : \
|
|
((handle>0x400) ? handle : \
|
|
(HFILE16)hnd+5); })
|
|
|
|
WARNING: be careful not to use the macro HFILE16_TO_HFILE32 on
|
|
functions with side-effects, as it will cause them to be evaluated
|
|
several times. This could be considered a bug, but the use of this
|
|
macro is limited enough not to need a rewrite.
|
|
|
|
NOTE: The 0x400 special case above deals with LZW filehandles (see
|
|
misc/lzexpand.c).
|