windows-nt/Source/XPSP1/NT/base/ntsetup/textmode/kernel/cvf.h

254 lines
8.8 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
cvf.hxx
Abstract:
This module contains basic declarations and definitions for
the double-space file system format. Note that more extensive
description of the file system structures may be found in
ntos\fastfat\cvf.h
Author:
Bill McJohn [BillMc] 24-September-1993
Revision History:
Adapted from utils\ufat\inc\cvf.hxx
--*/
#if !defined( _CVF_DEFN_ )
#define _CVF_DEFN_
#include "bpb.h"
// Manifest constants for fixed values on a Double Space drive:
//
CONST DoubleSpaceBytesPerSector = 512;
CONST DoubleSpaceLog2BytesPerSector = 9;
CONST DoubleSpaceSectorsPerCluster = 16;
CONST DoubleSpaceLog2SectorsPerCluster = 4;
CONST DoubleSpaceReservedSectors = 16;
CONST DoubleSpaceFats = 1;
CONST DoubleSpaceSectorsInRootDir = 32;
CONST DoubleSpaceRootEntries = 512;
CONST DoubleSpaceMediaByte = 0xf8;
CONST DoubleSpaceSectorsPerTrack = 0x11;
CONST DoubleSpaceHeads = 6;
CONST DoubleSpaceHiddenSectors = 0;
CONST DoubleSpaceReservedSectors2 = 31;
CONST DSBytesPerBitmapPage = 2048;
CONST DSSectorsPerBitmapPage = 4;
CONST ULONG EIGHT_MEG = 8 * 1024L * 1024L;
CONST DbSignatureLength = 4;
CONST UCHAR FirstDbSignature[4 /* DbSignatureLength */] = { (UCHAR)0xf8, 'D', 'R', 0 };
CONST UCHAR SecondDbSignature[4 /* DbSignatureLength */] = "MDR";
#if 0
// INLINE
ULONG
ComputeMaximumCapacity(
IN ULONG HostDriveSize
)
/*++
Routine Description:
This function computes the maximum capacity for a compressed
volume file on a host volume of a given size.
Arguments:
HostDriveSize -- Supplies the size in bytes of the host drive.
Return Value:
The appropriate Maximum Capacity.
--*/
{
ULONG MaxCap;
if( HostDriveSize < 20 * 1024L * 1024L ) {
MaxCap = 16 * HostDriveSize;
} else if ( HostDriveSize < 64 * 1024L * 1024L ) {
MaxCap = 8 * HostDriveSize;
} else {
MaxCap = 4 * HostDriveSize;
}
if( MaxCap < 4 * 1024L * 1024L ) {
MaxCap = 4 * 1024L * 1024L;
} else if( MaxCap > 512 * 1024L * 1024L ) {
MaxCap = 512 * 1024L * 1024L;
}
return MaxCap;
}
#endif
typedef struct _PACKED_CVF_HEADER {
//
// First a typical start of a boot sector
//
UCHAR Jump[1]; // offset = 0x000 0
UCHAR JmpOffset[2];
UCHAR Oem[8]; // offset = 0x003 3
PACKED_BIOS_PARAMETER_BLOCK PackedBpb; // offset = 0x00B 11
//
// Now the DblSpace extensions
//
UCHAR CvfFatExtensionsLbnMinus1[2]; // offset = 0x024 36
UCHAR LogOfBytesPerSector[1]; // offset = 0x026 38
UCHAR DosBootSectorLbn[2]; // offset = 0x027 39
UCHAR DosRootDirectoryOffset[2]; // offset = 0x029 41
UCHAR CvfHeapOffset[2]; // offset = 0x02B 43
UCHAR CvfFatFirstDataEntry[2]; // offset = 0x02D 45
UCHAR CvfBitmap2KSize[1]; // offset = 0x02F 47
UCHAR Reserved1[2]; // offset = 0x030 48
UCHAR LogOfSectorsPerCluster[1]; // offset = 0x032 50
UCHAR Reserved2[2]; // offset = 0x033
UCHAR MinFile[4]; // offset = 0x035
UCHAR Reserved3[4]; // offset = 0x039
UCHAR Is12BitFat[1]; // offset = 0x03D 61
UCHAR CvfMaximumCapacity[2]; // offset = 0x03E 62
UCHAR StartBootCode;
} PACKED_CVF_HEADER; // sizeof = 0x040 64
typedef PACKED_CVF_HEADER *PPACKED_CVF_HEADER;
//
// For the unpacked version we'll only define the necessary field and skip
// the jump and oem fields.
//
typedef struct _CVF_HEADER {
UCHAR Jump;
USHORT JmpOffset;
UCHAR Oem[8];
BIOS_PARAMETER_BLOCK Bpb;
USHORT CvfFatExtensionsLbnMinus1;
UCHAR LogOfBytesPerSector;
USHORT DosBootSectorLbn;
USHORT DosRootDirectoryOffset;
USHORT CvfHeapOffset;
USHORT CvfFatFirstDataEntry;
UCHAR CvfBitmap2KSize;
UCHAR LogOfSectorsPerCluster;
UCHAR Is12BitFat;
ULONG MinFile;
USHORT CvfMaximumCapacity;
} CVF_HEADER;
typedef CVF_HEADER *PCVF_HEADER;
//
// Here is NT's typical routine/macro to unpack the cvf header because DOS
// doesn't bother to naturally align anything.
//
// VOID
// CvfUnpackCvfHeader (
// IN OUT PCVF_HEADER UnpackedHeader,
// IN PPACKED_CVF_HEADER PackedHeader
// );
//
#define CvfUnpackCvfHeader(UH,PH) { \
\
memcpy( &(UH)->Jump, &(PH)->Jump, 1 ); \
memcpy( &(UH)->JmpOffset, &(PH)->JmpOffset, 2 ); \
memcpy( &(UH)->Oem, &(PH)->Oem, 8 ); \
UnpackBios( &(UH)->Bpb, &(PH)->PackedBpb ); \
CopyUchar2( &(UH)->CvfFatExtensionsLbnMinus1, &(PH)->CvfFatExtensionsLbnMinus1[0] ); \
CopyUchar1( &(UH)->LogOfBytesPerSector, &(PH)->LogOfBytesPerSector[0] ); \
CopyUchar2( &(UH)->DosBootSectorLbn, &(PH)->DosBootSectorLbn[0] ); \
CopyUchar2( &(UH)->DosRootDirectoryOffset, &(PH)->DosRootDirectoryOffset[0] ); \
CopyUchar2( &(UH)->CvfHeapOffset, &(PH)->CvfHeapOffset[0] ); \
CopyUchar2( &(UH)->CvfFatFirstDataEntry, &(PH)->CvfFatFirstDataEntry[0] ); \
CopyUchar1( &(UH)->CvfBitmap2KSize, &(PH)->CvfBitmap2KSize[0] ); \
CopyUchar1( &(UH)->LogOfSectorsPerCluster, &(PH)->LogOfSectorsPerCluster[0] ); \
CopyUchar1( &(UH)->Is12BitFat, &(PH)->Is12BitFat[0] ); \
CopyUchar4( &(UH)->MinFile, &(PH)->MinFile[0] ); \
CopyUchar2( &(UH)->CvfMaximumCapacity, &(PH)->CvfMaximumCapacity[0] ); \
}
#define CvfPackCvfHeader(PH,UH) { \
\
memcpy( &(PH)->Jump, &(UH)->Jump, 1 ); \
memcpy( &(PH)->JmpOffset, &(UH)->JmpOffset, 2 ); \
memcpy( &(PH)->Oem, &(UH)->Oem, 8 ); \
PackBios( &(UH)->Bpb, &(PH)->PackedBpb, ); \
CopyUchar2( (PH)->CvfFatExtensionsLbnMinus1, &(UH)->CvfFatExtensionsLbnMinus1 ); \
CopyUchar1( (PH)->LogOfBytesPerSector, &(UH)->LogOfBytesPerSector ); \
CopyUchar2( (PH)->DosBootSectorLbn, &(UH)->DosBootSectorLbn ); \
CopyUchar2( (PH)->DosRootDirectoryOffset, &(UH)->DosRootDirectoryOffset ); \
CopyUchar2( (PH)->CvfHeapOffset, &(UH)->CvfHeapOffset ); \
CopyUchar2( (PH)->CvfFatFirstDataEntry, &(UH)->CvfFatFirstDataEntry ); \
CopyUchar1( (PH)->CvfBitmap2KSize, &(UH)->CvfBitmap2KSize ); \
CopyUchar1( (PH)->LogOfSectorsPerCluster, &(UH)->LogOfSectorsPerCluster ); \
CopyUchar1( (PH)->Is12BitFat, &(UH)->Is12BitFat ); \
CopyUchar4( (PH)->MinFile, &(UH)->MinFile ); \
CopyUchar2( (PH)->CvfMaximumCapacity, &(UH)->CvfMaximumCapacity ); \
memset( (PH)->Reserved1, 0, 2 ); \
memset( (PH)->Reserved2, 0, 2 ); \
memset( (PH)->Reserved3, 0, 4 ); \
}
//
// The CVF FAT EXTENSIONS is a table is ULONG entries. Each entry corresponds
// to a FAT cluster. The entries describe where in the CVF_HEAP to locate
// the data for the cluster. It indicates if the data is compressed and the
// length of the compressed and uncompressed form.
//
typedef struct _CVF_FAT_EXTENSIONS {
ULONG CvfHeapLbnMinus1 : 21;
ULONG Reserved : 1;
ULONG CompressedSectorLengthMinus1 : 4;
ULONG UncompressedSectorLengthMinus1 : 4;
ULONG IsDataUncompressed : 1;
ULONG IsEntryInUse : 1;
} CVF_FAT_EXTENSIONS;
typedef CVF_FAT_EXTENSIONS *PCVF_FAT_EXTENSIONS;
//
// Some sizes are fixed so we'll declare them as manifest constants
//
#define CVF_MINIMUM_DISK_SIZE (512 * 1024L)
#define CVF_FATFAILSAFE (1024L)
#define CVF_MIN_HEAP_SECTORS (60)
#define CVF_RESERVED_AREA_1_SECTOR_SIZE (1)
#define CVF_RESERVED_AREA_2_SECTOR_SIZE (31)
#define CVF_RESERVED_AREA_4_SECTOR_SIZE (2)
#endif // _CVF_DEFN_