ReactOS 0.0.21从开机启动,到加载驱动的过程

首先是在main.c中ExpInitializeExecutive函数。遍历所有加载的模块,其中有ntoskrnl、各个驱动、nls、注册表文件等。找出驱动程序,依次调用LdrInitializeBootStartDriver函数。

然后调用IoCreateArcNames函数,将\reactos 变为 multi(0)disk(0)rdisk(0)partition(1)\reactos

最后调用IoCreateSystemRootLink函数,建立系统的对象的根目录,系统里所有的系统对象都是这个根的子节点或间接子节点。

IoCreateSystemRootLink函数会根据启动参数找到相应的设备,如multi(0)disk(0)rdisk(0)partition(1)\reactos,它就会定位到\Device\Harddisk0\Partition1\reactos。然后为它建立符号链接\SystemRoot,然后就是用NtOpenFile函数测试这个设备是否能够打开。

multi(0)disk(0)rdisk(0)partition(1)\reactos是传进来的参数,分为两部分。
1)Boot path: \reactos
2)ARC name: multi(0)disk(0)rdisk(0)partition(1)
然后打开符号链接\ArcName\multi(0)disk(0)rdisk(0)partition(1),查看它对应的设备名,发现是\Device\Harddisk0\Partition1

这时候将\Device\Harddisk0\Partition1\reactos。然后为它建立符号链接\SystemRoot。然后用NtOpenFile打开\SystemRoot

打开驱动调用NtOpenFile=>IoCreateFile
首先调用ObCreateObject创建或打开对象。

ObCreateObject会调用ObFindObject将设备名中,提取出真正的设备对象地址和remaining path。
例如打开\Device\Harddisk0\Partition1\reactos,会分解为\Device\Harddisk0\Partition1 和 \reactos(这部分称为remaining path)。

\Device\Harddisk0\Partition1是设备名,但怎么找到这个设备呢。应该从左扫描,从根目录找起。即
\
\Device
\Device\Harddisk0
\Device\Harddisk0\Partition1
当找到这个设备对象的地址时,调用它的Create回调函数,这个函数一般为IopCreateFile或IopCreateDevice。


\Device\Harddisk0\Partition是disk.sys的设备,不是vtfat.sys的设备


现在问题是ScsiClassCreateDeviceObject得到PartitionEntry,其中的PartitionEntry->PartitionType为6,而不是PARTITION_FAT32或者PARTITION_FAT16

posted @ 2009-06-02 15:47  Fan Zhang  阅读(580)  评论(0编辑  收藏  举报