286 lines
7.7 KiB
C
286 lines
7.7 KiB
C
//
|
|
// 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
|
|
|