|
|
//
// FAT/FAT32 boot sectors.
//
#pragma pack(1)
/*
typedef struct _PACKED_BPB_EX { UCHAR BytesPerSector[2]; // offset = 0x000 0
UCHAR SectorsPerCluster[1]; // offset = 0x002 2
UCHAR ReservedSectors[2]; // offset = 0x003 3
UCHAR Fats[1]; // offset = 0x005 5
UCHAR RootEntries[2]; // offset = 0x006 6
UCHAR Sectors[2]; // offset = 0x008 8
UCHAR Media[1]; // offset = 0x00A 10
UCHAR SectorsPerFat[2]; // offset = 0x00B 11
UCHAR SectorsPerTrack[2]; // offset = 0x00D 13
UCHAR Heads[2]; // offset = 0x00F 15
UCHAR HiddenSectors[4]; // offset = 0x011 17
UCHAR LargeSectors[4]; // offset = 0x015 21
UCHAR LargeSectorsPerFat[4]; // offset = 0x019 25
UCHAR ExtendedFlags[2]; // offset = 0x01D 29
UCHAR FsVersion[2]; // offset = 0x01F 31
UCHAR RootDirFirstCluster[4]; // offset = 0x021 33
UCHAR FsInfoSector[2]; // offset = 0x025 37
UCHAR BackupBootSector[2]; // offset = 0x027 39
UCHAR Reserved[12]; // offset = 0x029 41
} PACKED_BPB_EX; // sizeof = 0x035 53
*/
typedef struct _PACKED_BPB_EX { USHORT BytesPerSector; // offset = 0x000 0
UCHAR SectorsPerCluster; // offset = 0x002 2
USHORT ReservedSectors; // offset = 0x003 3
UCHAR Fats; // offset = 0x005 5
USHORT RootEntries; // offset = 0x006 6
USHORT Sectors; // offset = 0x008 8
UCHAR Media; // offset = 0x00A 10
USHORT SectorsPerFat; // offset = 0x00B 11
USHORT SectorsPerTrack; // offset = 0x00D 13
USHORT Heads; // offset = 0x00F 15
ULONG HiddenSectors; // offset = 0x011 17
ULONG LargeSectors; // offset = 0x015 21
ULONG LargeSectorsPerFat; // offset = 0x019 25
USHORT ExtendedFlags; // offset = 0x01D 29
USHORT FsVersion; // offset = 0x01F 31
ULONG RootDirFirstCluster; // offset = 0x021 33
USHORT FsInfoSector; // offset = 0x025 37
USHORT BackupBootSector; // offset = 0x027 39
UCHAR Reserved[12]; // offset = 0x029 41
} PACKED_BPB_EX; // sizeof = 0x035 53
typedef PACKED_BPB_EX _far *FPPACKED_BPB_EX;
typedef struct _PACKED_BOOT_SECTOR_EX { UCHAR Jump[3]; // offset = 0x000 0
UCHAR Oem[8]; // offset = 0x003 3
PACKED_BPB_EX PackedBpb; // offset = 0x00B 11
UCHAR PhysicalDriveNumber; // offset = 0x040 64
UCHAR CurrentHead; // offset = 0x041 65
UCHAR Signature; // offset = 0x042 66
UCHAR Id[4]; // offset = 0x043 67
UCHAR VolumeLabel[11]; // offset = 0x047 71
UCHAR SystemId[8]; // offset = 0x058 88
} FAT32_BOOT_SECTOR; // sizeof = 0x060 96
typedef FAT32_BOOT_SECTOR _far *FPFAT32_BOOT_SECTOR;
//
// Define the FAT32 FsInfo sector.
//
typedef struct _FSINFO_SECTOR { ULONG SectorBeginSignature; // offset = 0x000 0
UCHAR ExtraBootCode[480]; // offset = 0x004 4
ULONG FsInfoSignature; // offset = 0x1e4 484
ULONG FreeClusterCount; // offset = 0x1e8 488
ULONG NextFreeCluster; // offset = 0x1ec 492
UCHAR Reserved[12]; // offset = 0x1f0 496
ULONG SectorEndSignature; // offset = 0x1fc 508
} FSINFO_SECTOR, _far *FPFSINFO_SECTOR;
#define FSINFO_SECTOR_BEGIN_SIGNATURE 0x41615252
#define FSINFO_SECTOR_END_SIGNATURE 0xAA550000
#define FSINFO_SIGNATURE 0x61417272
#pragma pack()
BOOL _far IsFat32( VOID *buf );
typedef BOOL (*PDISKSEL_VALIDATION_ROUTINE) ( IN USHORT DiskId );
INT _far SelectDisk( IN UINT DiskCount, IN FPCHAR Prompt, IN PDISKSEL_VALIDATION_ROUTINE Validate, OPTIONAL OUT char *AlternateResponse, OPTIONAL IN FPCHAR textDisk, IN FPCHAR textPaddedMbCount, IN FPCHAR textInvalidSelection, IN FPCHAR textMasterDisk );
INT _far SelectPartition( IN UINT PartitionCount, IN CHAR *Prompt, OUT CHAR *AlternateResponse, OPTIONAL IN FPCHAR textDisk, IN FPCHAR textPaddedMbCount, IN FPCHAR textInvalidSelection );
BOOL _far ConfirmOperation( IN FPCHAR ConfirmationText, IN char textYesChar, IN char textNoChar );
BOOL _far AllocTrackBuffer( IN BYTE SectorsPerTrack, OUT FPVOID _far *AlignedBuffer, OUT FPVOID _far *Buffer );
VOID _far FlushDisks( VOID );
ULONG _far DosSeek( IN unsigned Handle, IN ULONG Offset, IN BYTE Origin );
#define DOSSEEK_START 0
#define DOSSEEK_CURRENT 1
#define DOSSEEK_END 2
//** Must use this as initial value for CRC
#define CRC32_INITIAL_VALUE 0L
/*** CRC32Compute - Compute 32-bit
* * Entry: * pb - Pointer to buffer to computer CRC on * cb - Count of bytes in buffer to CRC * crc32 - Result from previous CRC32Compute call (on first call * to CRC32Compute, must be CRC32_INITIAL_VALUE!!!!). * * Exit: * Returns updated CRC value. */ ULONG _far CRC32Compute( IN FPBYTE pb, IN ULONG cb, IN ULONG crc32 );
VOID _far RebootSystem( VOID );
unsigned _far GetGlobalCodepage( VOID );
BOOL _far SetGlobalCodepage( IN unsigned Codepage );
unsigned _far GetScreenCodepage( VOID );
BOOL _far SetScreenCodepage( IN unsigned Codepage );
typedef struct _CMD_LINE_ARGS { UINT LanguageCount; BOOL Test; BOOL Quiet; BOOL Reinit; BOOL DebugLog; BYTE MasterDiskInt13Unit; char _far *FileListFile; char _far *ImageFile; } CMD_LINE_ARGS, _far *FPCMD_LINE_ARGS;
BOOL ParseArgs( IN int argc, IN FPCHAR argv[], IN BOOL Strict, IN FPCHAR AllowedSwitchChars, OUT FPCMD_LINE_ARGS CmdLineArgs );
//
// Compression stuff
//
typedef enum { CompressNone, CompressMrci1, CompressMrci2, CompressMax } CompressionType;
BOOL CompressAndSave( IN CompressionType Type, IN FPBYTE Data, IN unsigned DataSize, OUT FPBYTE CompressScratchBuffer, IN unsigned BufferSize, IN UINT FileHandle );
//
// Logging stuff
//
VOID _LogStart( IN char *FileName );
VOID _LogEnd( VOID );
VOID _Log( IN char *FormatString, ... );
VOID _LogSetFlags( IN unsigned Flags );
//
// If this flag is set the log file will be closed
// and reopened after every call to _Log(). Useful
// if a reboot is expected to occur.
//
#define LOGFLAG_CLOSE_REOPEN 0x0001
|