|
|
/*++
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_
|