Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

285 lines
7.7 KiB

//
// 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