磁盘的虚拟
9.5 FAT12/16 磁盘卷初始化
9.5.2 Ramdisk 对磁盘的初始化
在上一节中说到,在 Ramdisk 驱动中的 EvtDriverDeviceAdd 类函数里会调用 RamDiskFormatDisk 函数对所分配的用于做磁盘镜像的内存空间进行初始化。上一小节介绍了磁盘卷结构,接下来学习如何初始化这个空间。
首先看一下这个函数的本地变量声名。
//一个指向磁盘启动扇区的指针
PBOOT_SECTOR bootSector = (PBOOT_SECTOR) devExt->DiskImage;
//指向FAT第一个FAT表的指针
PUCHAR firstFatSector;
//用于记录有多少个根目录日寇点
ULONG rootDirEntries;
//用于记录每个簇由多少扇区组成
ULONG sectorsPerCluster;
//用于记录FAT文件系统的类型,是FAT12 还是16
USHORT fatType;
//用于记录在FAT表里一共有多少个表项
USHORT fatEntries;
//用于记录一个FAT表需要占用多少个扇区来存储
USHORT fatSectorCnt;
//用于指向第一个根目录入口点
PDIR_ENTRY rootDir;
//用于确定这个函数是可以存取分页内存的
PAGED_CODE();
//用于确定这个盘的引导扇区的大小确实是一个扇区大小
ASSERT(sizeof(BOOT_SECTOR)) == 512);
//用于确定我们操作的磁盘不是一个不可用的指针
ASSERT(devExt->DiskImage != NULL);
//清空磁盘镜像
RtlZeroMemory(devExt->DiskImage,devExt->DiskRegInfo.DiskSize);
接下来格式化磁盘设备的设备扩展里的数据结构 DiskGeometry 。它保存着与磁盘物理结构相关的信息。这个数据结构是 WinDDK 所定义好的,几乎适用于所有磁盘。
typedef struce _DISK_GEOMETRY{
//有多少个柱面
LARGE_INTEGER Cylinders;
//磁盘介质的类型
MEDIA_TYPE MediaType;
//每个柱面有多少磁道,也就是有多少个盘片
ULONG TracksPerCylinder;
//每个磁道有多少扇区
ULONG SectorsPerTrack;
//每个扇区有