#ifndef __MSDOS_H
#define __MSDOS_H
#include <dirent.h>
#include <windows.h>

struct dosdirent {
	int  inuse;
	DIR *ds;
	char unixpath[256];
	char filename[256];
	char filemask[12];
	char attribute;
	char search_attribute;
	long filesize;
	long filetime;
};

struct fcb {
        BYTE drive;
	char name[8];
	char extension[3];
	BYTE dummy1[4];
	int filesize;
	WORD date_write;
	WORD time_write;
	struct dosdirent *directory;
	BYTE dummy2[9];
};

#define DOSVERSION 0x0330;
#define MAX_DOS_DRIVES	26

#define segment(a) 	((DWORD)(a) >> 16)
#define offset(a)	((DWORD)(a) & 0xffff)

#define setword(a,b)	*(BYTE*)(a)	  = (b) & 0xff; \
			*((BYTE*)((a)+1)) = ((b)>>8) & 0xff;
			
#define setdword(a,b)	*(BYTE*)(a)	= (b) & 0xff; \
			*((BYTE*)(a)+1) = ((b)>>8) & 0xff; \
			*((BYTE*)(a)+2) = ((b)>>16) & 0xff; \
			*((BYTE*)(a)+3) = ((b)>>24) & 0xff;

#define getword(a)	(WORD) *(BYTE*)(a) + \
			(*((BYTE*)(a) + 1) << 8)

#define getdword(a)	(DWORD) (*(BYTE*)(a) + \
			(*((BYTE*)(a) + 1) << 8) + \
			(*((BYTE*)(a) + 2) << 16) + \
			(*((BYTE*)(a) + 3) << 24))

/* dos file attributes */

#define FA_NORMAL   0x00        /* Normal file, no attributes */
#define FA_RDONLY   0x01        /* Read only attribute */
#define FA_HIDDEN   0x02        /* Hidden file */
#define FA_SYSTEM   0x04        /* System file */
#define FA_LABEL    0x08        /* Volume label */
#define FA_DIREC    0x10        /* Directory */
#define FA_ARCH     0x20        /* Archive */

/* extended error codes */

#define NoError		0x00
#define InvalidFunction 0x01
#define FileNotFound	0x02
#define PathNotFound	0x03
#define AccessDenied	0x05
#define InvalidHandle	0x06
#define MCBDestroyed	0x07
#define	OutOfMemory	0x08
#define MCBInvalid	0x09
#define DataInvalid	0x0d
#define InvalidDrive	0x0f
#define CanNotRemoveCwd	0x10
#define	NotSameDevice	0x11
#define NoMoreFiles	0x12
#define WriteProtected  0x13
#define	UnknownUnit	0x14
#define DriveNotReady	0x15
#define UnknownCommand	0x16
#define CRCError	0x17
#define	BadRqLength	0x18
#define SeekError	0x19
#define	UnknownMedia	0x1a
#define	SectorNotFound	0x1b
#define OutOfPaper	0x1c
#define WriteFault	0x1d
#define ReadFault	0x1e
#define	GeneralFailure	0x1f
#define ShareViolation	0x20
#define LockViolation	0x21
#define DiskFull	0x27
#define NoNetwork	0x49
#define FileExists	0x50
#define CanNotMakeDir	0x52

/* Error classes */

#define EC_Temporary	0x02
#define EC_AccessDenied	0x03
#define EC_AppError	0x04
#define EC_SystemFailure 0x06
#define EC_NotFound	0x08
#define	EC_MediaError	0x0b
#define EC_Exists	0x0c
#define	EC_Unknown	0x0d

/* Suggested actions */

#define	SA_Retry	0x01
#define SA_Abort	0x04
#define SA_Ignore	0x06
#define SA_Ask4Retry	0x07

/* Error locus */

#define EL_Unknown	0x01
#define EL_Disk		0x02
#define EL_Network	0x03
#define EL_Memory	0x05

#endif /* __MSDOS_H */
