首先是在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