下面我们来实现IDEHardDrive这个类。IDEHardDrive将真正和硬盘硬件打上交道,假如你已经忘了该如何操作硬盘,请参考前面的介绍 。
废话少说,我们先来看构造函数
大家看到这里我们include了一个叫intrin.h的头文件。这个头文件是一个VC标准头文件。里面声明了一些编译器内置函数,比如端口读写等等。我们使用了这些函数就可以不用内嵌汇编来读写端口了。
构造函数非常简单,仅仅初始化了IDE的端口基地址,对于第一个IDE控制器来说,这个基地址是1F0。对于第二个IDE控制器来说,这个基地址是170。用这种方式,我们就避免了硬编码端口地址,从而可以支持多个IDE控制器。当然,这里我还没有加上主从盘的区别,这里我们只支持硬盘挂在主盘的位置上,读者有兴趣可以将其改为支持从盘。
接下来我们来看看我们要如何打开一个硬盘。打开硬盘时我们需要做什么初始化工作呢?
这里我们看到,当打开一个硬盘的时候,我们读出了硬盘分区表。ReadBlock函数我们后面会介绍到,它将把制定的一个扇区读到buffer处,然后从里边得到硬盘分区表数据并存入m_PartitionTables数组。
有了分区表数据后,我们就可以枚举分区了。
枚举分区时,我们将依次检查4个分区表项。假如分区存在,我们就为其创建一个主分区对象,并把这个主分区对象加入返回的分区集合。另外,删除分区和修改分区暂时没有用,我们就不实现了,大不了抛出一个异常了事。读者可以自己来写代码,这里我就不多写了。