首页 >> 编程开发 >> 其他 >> 正文

reactos操作系统实现(78)

  ARC命名是Windows NT系统用来定位其引导分区所在的路径,也就是利用它指明引导分区在哪一个磁盘控制器,哪一个硬盘,哪一个分区内。ARC命名可分为两大类,以scsi为首或以multi为首,现分别说明如下: scsi(x)disk(y)rdisk(0)partition(z): 以scsi为首,表明该磁盘控制器为SCSI卡,并且该卡上的BIOS被设置为禁用(disable) scsi(x):表示第几个控制卡,x以0为起始数字。

  disk(y):表示该控制卡下的第几块物理磁盘,y以0为起始数字。

  partition(z):表示该物理磁盘上第几个分区,z以1为起始数字。

  注意:以scsi为首的ARC命名的rdisk项总是rdisk(0)。

  multi(x)disk(0)rdisk(y)partition(z): 以multi为首,表明该磁盘控制器是IDE,ESDI,或是BIOS允许使用(enable)的SCSI卡。

  multi(x):表示第几个控制卡,x以0为起始数字。

  rdisk(y):表示该控制卡下的第几块物理磁盘,y以0为起始数字。

  partition(z):表示该物理磁盘上第几个分区,z以1为起始数字。

  注意:以multi为首的ARC命名的disk项总是disk(0)。 还有一点必须注意的是,系统给NT分区编号时,主分区的编号永远排在扩展分区前。例题 windows2000安装在D盘下,D盘为扩展分区的一个逻辑驱动器,系统可以正常启动。后来,又添加了一个分区。重启时发现系统无法引导了,是何原因,如何解决。 分析:一个磁盘上最多只能有一个扩展分区,则新添加的分区为主分区,而主分区的编号排在扩展分区前,所以D盘的实际ARC路径的partition值增加了1,而boot.ini文件的内容没变,这样再利用原来的ARC路径就找不到D盘的系统目录了。解决的方法就是修改boot.ini文件。

  ARC命名是Windows NT系统用来定位其引导分区所在的路径,也就是利用它指明引导分区在哪一个磁盘控制器,哪一个硬盘,哪一个分区内。  

  ARC命名可分为两大类,以scsi为首或以multi为首,现分别说明如下:  

  scsi(x)disk(y)rdisk(0)partition(z):   以scsi为首,表明该磁盘控制器为SCSI卡,并且该卡上的BIOS被设置为禁用(disable)  

  scsi(x):表示第几个控制卡,x以0为起始数字。  

  disk(y):表示该控制卡下的第几块物理磁盘,y以0为起始数字。

  partition(z):表示该物理磁盘上第几个分区,z以1为起始数字。

  注意:以scsi为首的ARC命名的rdisk项总是rdisk(0)。  

  multi(x)disk(0)rdisk(y)partition(z):   以multi为首,表明该磁盘控制器是IDE,ESDI,或是BIOS允许使用(enable)的SCSI卡。

  multi(x):表示第几个控制卡,x以0为起始数字。  

  rdisk(y):表示该控制卡下的第几块物理磁盘,y以0为起始数字。  

  partition(z):表示该物理磁盘上第几个分区,z以1为起始数字。   

  注意:以multi为首的ARC命名的disk项总是disk(0)。  

  还有一点必须注意的是,系统给NT分区编号时,主分区的编号永远排在扩展分区前,故当引导分区处于原硬盘的剩余磁盘空间时,必须将此磁盘空间设为主分区(已存在扩展分区),该分区虽然后编号,但其编号反而在原来扩展分区中的逻辑分区编号之前。

  下面来分析创建引导的ARC名称,代码如下:

#001  NTSTATUS
#002  INIT_FUNCTION
#003  NTAPI
#004  IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
#005  {

  获取配置信息。

#006      PCONFIGURATION_INFORMATION ConfigInfo = IoGetConfigurationInformation();

  获取Freeloader的参数。

#007      PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation;
#008      CHAR Buffer[128];
#009      ANSI_STRING ArcBootString, ArcSystemString, ArcString;
#010      UNICODE_STRING ArcName, BootPath, DeviceName;
#011      BOOLEAN SingleDisk;
#012      ULONG i, j, Length;
#013      PDEVICE_OBJECT DeviceObject;
#014      ULONG Signature, Checksum, PartitionCount;
#015      PLIST_ENTRY NextEntry;
#016      PARC_DISK_SIGNATURE ArcDiskEntry;
#017      NTSTATUS Status;
#018      BOOLEAN FoundBoot = FALSE;
#019      PULONG PartitionBuffer;
#020