mirror of
https://github.com/reactos/reactos.git
synced 2024-08-26 05:08:39 +00:00
339 lines
10 KiB
C
339 lines
10 KiB
C
/*
|
|
* COPYRIGHT: GPL - See COPYING in the top level directory
|
|
* PROJECT: ReactOS Virtual DOS Machine
|
|
* FILE: subsystems/mvdm/ntvdm/dos/dos32krnl/dos.h
|
|
* PURPOSE: DOS32 Kernel
|
|
* PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
|
|
*/
|
|
|
|
#ifndef _DOS_H_
|
|
#define _DOS_H_
|
|
|
|
/* INCLUDES *******************************************************************/
|
|
|
|
#include "device.h"
|
|
|
|
/**/ #include "int32.h" /**/
|
|
|
|
/* DEFINES ********************************************************************/
|
|
|
|
//
|
|
// We are DOS 5.00 (reported by INT 21h, AH=30h)
|
|
// and DOS 5.50 (reported by INT 21h, AX=3306h) for Windows NT Compatibility
|
|
//
|
|
#define DOS_VERSION MAKEWORD(5, 00)
|
|
#define NTDOS_VERSION MAKEWORD(5, 50)
|
|
|
|
#define DOS_CONFIG_PATH L"%SystemRoot%\\system32\\CONFIG.NT"
|
|
#define DOS_COMMAND_INTERPRETER L"%SystemRoot%\\system32\\COMMAND.COM /k %SystemRoot%\\system32\\AUTOEXEC.NT"
|
|
|
|
#define BIOS_CODE_SEGMENT 0x70
|
|
#define BIOS_DATA_SEGMENT 0x70
|
|
#define DOS_CODE_SEGMENT 0x80
|
|
#define DOS_DATA_SEGMENT 0xA5
|
|
|
|
#define DOS_DATA_OFFSET(x) FIELD_OFFSET(DOS_DATA, x)
|
|
|
|
#define SYSTEM_ENV_BLOCK 0x600 // FIXME: Should be dynamically initialized!
|
|
|
|
#define SYSTEM_PSP 0x0008
|
|
|
|
#define INVALID_DOS_HANDLE 0xFFFF
|
|
#define DOS_INPUT_HANDLE 0
|
|
#define DOS_OUTPUT_HANDLE 1
|
|
#define DOS_ERROR_HANDLE 2
|
|
|
|
#define DOS_SFT_SIZE 255 // Value of the 'FILES=' command; maximum 255
|
|
#define DOS_DIR_LENGTH 64
|
|
#define NUM_DRIVES ('Z' - 'A' + 1)
|
|
#define DOS_CHAR_ATTRIBUTE 0x07
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
typedef struct _DOS_FCB
|
|
{
|
|
BYTE DriveNumber;
|
|
CHAR FileName[8];
|
|
CHAR FileExt[3];
|
|
WORD BlockNumber;
|
|
WORD RecordSize;
|
|
DWORD FileSize;
|
|
WORD LastWriteDate;
|
|
WORD LastWriteTime;
|
|
BYTE Reserved[8];
|
|
BYTE BlockRecord;
|
|
BYTE RecordNumber[3];
|
|
} DOS_FCB, *PDOS_FCB;
|
|
|
|
// http://www.ctyme.com/intr/rb-2983.htm
|
|
typedef struct _DOS_SYSVARS
|
|
{
|
|
DWORD OemHandler;
|
|
WORD Int21hReturn;
|
|
WORD ShareRetryCount;
|
|
WORD ShareRetryDelay;
|
|
DWORD DiskBuffer;
|
|
WORD UnreadConInput;
|
|
WORD FirstMcb;
|
|
|
|
/* This is where the SYSVARS really start */
|
|
DWORD FirstDpb; // 0x00
|
|
DWORD FirstSft; // 0x04
|
|
DWORD ActiveClock; // 0x08
|
|
DWORD ActiveCon; // 0x0c
|
|
BYTE Reserved0[6]; // 0x10
|
|
DWORD CurrentDirs; // 0x16
|
|
BYTE Reserved1[6]; // 0x1a
|
|
BYTE NumBlockDevices; // 0x20
|
|
BYTE NumLocalDrives; // 0x21 - Set by LASTDRIVE
|
|
DOS_DRIVER NullDevice; // 0x22
|
|
BYTE Reserved2; // 0x34
|
|
WORD ProgramVersionTable; // 0x35
|
|
DWORD SetVerTable; // 0x37
|
|
WORD Reserved3[2]; // 0x3b
|
|
WORD BuffersNumber; // 0x3f - 'x' parameter in "BUFFERS=x,y" command
|
|
WORD BuffersLookaheadNumber; // 0x41 - 'y' parameter in "BUFFERS=x,y" command
|
|
BYTE BootDrive; // 0x43
|
|
BYTE UseDwordMoves; // 0x44
|
|
WORD ExtMemSize; // 0x45
|
|
BYTE Reserved4[0x1C]; // 0x47
|
|
BYTE UmbLinked; // 0x63 - 0/1: UMB chain (un)linked to MCB chain
|
|
WORD Reserved5; // 0x64
|
|
WORD UmbChainStart; // 0x66 - Segment of the first UMB MCB
|
|
WORD MemAllocScanStart; // 0x68 - Segment where allocation scan starts
|
|
} DOS_SYSVARS, *PDOS_SYSVARS;
|
|
|
|
typedef struct _DOS_CLOCK_TRANSFER_RECORD
|
|
{
|
|
WORD NumberOfDays;
|
|
BYTE Minutes;
|
|
BYTE Hours;
|
|
BYTE Hundredths;
|
|
BYTE Seconds;
|
|
} DOS_CLOCK_TRANSFER_RECORD, *PDOS_CLOCK_TRANSFER_RECORD;
|
|
|
|
typedef struct _DOS_INPUT_BUFFER
|
|
{
|
|
BYTE MaxLength;
|
|
BYTE Length;
|
|
CHAR Buffer[ANYSIZE_ARRAY];
|
|
} DOS_INPUT_BUFFER, *PDOS_INPUT_BUFFER;
|
|
|
|
typedef struct _DOS_FIND_FILE_BLOCK
|
|
{
|
|
CHAR DriveLetter;
|
|
CHAR Pattern[11];
|
|
UCHAR AttribMask;
|
|
DWORD Unused;
|
|
HANDLE SearchHandle;
|
|
|
|
/* The following part of the structure is documented */
|
|
UCHAR Attributes;
|
|
WORD FileTime;
|
|
WORD FileDate;
|
|
DWORD FileSize;
|
|
CHAR FileName[13];
|
|
} DOS_FIND_FILE_BLOCK, *PDOS_FIND_FILE_BLOCK;
|
|
|
|
// http://www.ctyme.com/intr/rb-3023.htm
|
|
typedef struct _DOS_SDA
|
|
{
|
|
BYTE PrinterEchoFlag;
|
|
CHAR CurrentSwitchChar;
|
|
BYTE AllocStrategy;
|
|
BYTE Unused0[28];
|
|
|
|
/* This is where the SDA really starts */
|
|
BYTE ErrorMode;
|
|
BYTE InDos;
|
|
BYTE ErrorDrive;
|
|
BYTE LastErrorLocus;
|
|
WORD LastErrorCode;
|
|
BYTE LastErrorAction;
|
|
BYTE LastErrorClass;
|
|
DWORD LastErrorPointer;
|
|
DWORD DiskTransferArea;
|
|
WORD CurrentPsp;
|
|
WORD Int23StackPointer;
|
|
WORD ErrorLevel;
|
|
BYTE CurrentDrive;
|
|
BYTE ExtendedBreakFlag;
|
|
|
|
/* This part is only valid while in DOS */
|
|
WORD LastAX;
|
|
WORD NetworkPsp;
|
|
WORD NetworkMachineNumber;
|
|
WORD FirstFreeMcb;
|
|
WORD BestFreeMcb;
|
|
WORD LastFreeMcb;
|
|
WORD MemorySize;
|
|
WORD LastSearchDirEntry;
|
|
BYTE Int24FailFlag;
|
|
BYTE DirectoryFlag;
|
|
BYTE CtrlBreakFlag;
|
|
BYTE AllowFcbBlanks;
|
|
BYTE Unused1;
|
|
BYTE DayOfMonth;
|
|
BYTE Month;
|
|
WORD Year;
|
|
WORD NumDays;
|
|
BYTE DayOfWeek;
|
|
BYTE ConsoleSwappedFlag;
|
|
BYTE Int28CallOk;
|
|
BYTE Int24AbortFlag;
|
|
DOS_RW_REQUEST Request;
|
|
DWORD DriverEntryPoint;
|
|
BYTE Unused2[44];
|
|
BYTE PspCopyType;
|
|
BYTE Unused3;
|
|
BYTE UserNumber[3];
|
|
BYTE OemNumber;
|
|
WORD ErrorCodeTable;
|
|
DOS_CLOCK_TRANSFER_RECORD ClockTransferRecord;
|
|
BYTE ByteBuffer;
|
|
BYTE Unused4;
|
|
CHAR FileNameBuffer[256];
|
|
BYTE Unused5[53];
|
|
CHAR CurrentDirectory[81];
|
|
CHAR FcbFilename[12];
|
|
CHAR FcbRenameDest[12];
|
|
BYTE Unused6[8];
|
|
BYTE ExtendedAttribute;
|
|
BYTE FcbType;
|
|
BYTE DirSearchAttributes;
|
|
BYTE FileOpenMode;
|
|
BYTE FileFound;
|
|
BYTE DeviceNameFound;
|
|
BYTE SpliceFlag;
|
|
BYTE DosCallFlag;
|
|
BYTE Unused7[5];
|
|
BYTE InsertMode;
|
|
BYTE ParsedFcbExists;
|
|
BYTE VolumeIDFlag;
|
|
BYTE TerminationType;
|
|
BYTE CreateFileFlag;
|
|
BYTE FileDeletedChar;
|
|
DWORD CriticalErrorDpb;
|
|
DWORD UserRegistersStack;
|
|
WORD Int24StackPointer;
|
|
BYTE Unused8[14];
|
|
DWORD DeviceHeader;
|
|
DWORD CurrentSft;
|
|
DWORD CurrentDirPointer;
|
|
DWORD CallerFcb;
|
|
WORD SftNumber;
|
|
WORD TempFileHandle;
|
|
DWORD JftEntry;
|
|
WORD FirstArgument;
|
|
WORD SecondArgument;
|
|
WORD LastComponent;
|
|
WORD TransferOffset;
|
|
BYTE Unused9[38];
|
|
DWORD WorkingSft;
|
|
WORD Int21CallerBX;
|
|
WORD Int21CallerDS;
|
|
WORD Unused10;
|
|
DWORD PrevCallFrame;
|
|
} DOS_SDA, *PDOS_SDA;
|
|
|
|
/*
|
|
* DOS kernel data structure
|
|
*/
|
|
typedef struct _DOS_DATA
|
|
{
|
|
DOS_SYSVARS SysVars;
|
|
BYTE NullDriverRoutine[7];
|
|
WORD DosVersion; // DOS version to report to programs (can be different from the true one)
|
|
DOS_SDA Sda;
|
|
CHAR CurrentDirectories[NUM_DRIVES][DOS_DIR_LENGTH];
|
|
BYTE UnreadConInputBuffer[128];
|
|
BYTE DosStack[384];
|
|
BYTE Sft[ANYSIZE_ARRAY];
|
|
} DOS_DATA, *PDOS_DATA;
|
|
|
|
/*
|
|
* DOS BIOS data structure at segment 70h
|
|
*/
|
|
typedef struct _BIOS_DATA
|
|
{
|
|
BYTE StartupCode[20]; // 0x00 - 20 bytes: large enough for now!
|
|
|
|
/*
|
|
* INT 13h (BIOS Disk Services) handler chain support.
|
|
*
|
|
* RomBiosInt13: The original INT 13h vector (normally from ROM BIOS).
|
|
* PrevInt13 : The previous INT 13h vector in the handler chain (initially
|
|
* initialized with the RomBiosInt13 value; each time some
|
|
* program calls INT 2Fh, AH=13h, PrevInt13 is updated).
|
|
*
|
|
* DOS hooks INT 13h with its own code, then (in normal circumstances) calls
|
|
* PrevInt13, so that when a program calls INT 13h, the DOS hook is first called,
|
|
* followed by the previous INT 13h (be it the original or some other hooked one).
|
|
* DOS may call PrevInt13 directly in some internal operations too.
|
|
* RomBiosInt13 is intended to be the original INT 13h vector that existed
|
|
* before DOS was loaded. A particular version of PC-AT's IBM's ROM BIOS
|
|
* (on systems with model byte FCh and BIOS date "01/10/84" only, see
|
|
* http://www.ctyme.com/intr/rb-4453.htm for more details) had a bug on disk
|
|
* reads so that it was patched by DOS, and therefore PrevInt13 was the fixed
|
|
* INT 13 interrupt (for the other cases, a direct call to RomBiosInt13 is done).
|
|
*
|
|
* NOTE: For compatibility with some programs (including virii), PrevInt13 should
|
|
* be at 0070:00B4, see for more details:
|
|
* http://repo.hackerzvoice.net/depot_madchat/vxdevl/vdat/tuvd0001.htm
|
|
* http://vxheaven.org/lib/vsm01.html
|
|
*/
|
|
BYTE Padding0[0xB0 - /*FIELD_OFFSET(BIOS_DATA, StartupCode)*/ 20];
|
|
DWORD RomBiosInt13; // 0xb0
|
|
DWORD PrevInt13; // 0xb4
|
|
BYTE Padding1[0x100 - 0xB8]; // 0xb8
|
|
} BIOS_DATA, *PBIOS_DATA;
|
|
|
|
C_ASSERT(sizeof(BIOS_DATA) == 0x100);
|
|
|
|
#pragma pack(pop)
|
|
|
|
/* VARIABLES ******************************************************************/
|
|
|
|
extern PBIOS_DATA BiosData;
|
|
extern PDOS_DATA DosData;
|
|
extern PDOS_SYSVARS SysVars;
|
|
extern PDOS_SDA Sda;
|
|
|
|
/* FUNCTIONS ******************************************************************/
|
|
|
|
extern CALLBACK16 DosContext;
|
|
#define RegisterDosInt32(IntNumber, IntHandler) \
|
|
do { \
|
|
ASSERT((0x20 <= IntNumber) && (IntNumber <= 0x2F)); \
|
|
RegisterInt32(DosContext.TrampolineFarPtr + \
|
|
DosContext.TrampolineSize + \
|
|
(IntNumber - 0x20) * Int16To32StubSize, \
|
|
(IntNumber), (IntHandler), NULL); \
|
|
} while(0);
|
|
|
|
VOID ConDrvInitialize(VOID);
|
|
VOID ConDrvCleanup(VOID);
|
|
|
|
/*
|
|
* DOS BIOS Functions
|
|
* See bios.c
|
|
*/
|
|
CHAR DosReadCharacter(WORD FileHandle, BOOLEAN Echo);
|
|
BOOLEAN DosCheckInput(VOID);
|
|
VOID DosPrintCharacter(WORD FileHandle, CHAR Character);
|
|
|
|
BOOLEAN DosBIOSInitialize(VOID);
|
|
|
|
BOOLEAN DosControlBreak(VOID);
|
|
VOID DosEchoCharacter(CHAR Character);
|
|
|
|
/*
|
|
* DOS Kernel Functions
|
|
* See dos.c
|
|
*/
|
|
BOOLEAN DosKRNLInitialize(VOID);
|
|
|
|
#endif // _DOS_H_
|
|
|
|
/* EOF */
|