阅读:2352回复:12
如何在系统启动之前分配IP地址??????
我们在实现无盘Windows 2K,需要在系统引导时就初始化好一个网络环境,供我们的其它驱动使用。
我们想利用Windows自带的TCPIP.sys,因此想写一个TdiClient,但它要作为boot driver加载(StartType=0),并且需要在引导阶段就能进行网络通信。在通信之前,需要利用DHCP为无盘客户机分配一个IP地址。 我能否利用RAW IP在核态实现一个DHCP协议? 在利用自己实现的DHCP得到IP地址后,怎样让Windows的Tcpip知道这个地址,因为我要用Windows的Tcpip通信。 在正常情况下(有盘),如果采用静态IP地址分配,tcpip是从哪里得到IP地址的?是从注册表的HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters\\Interfaces\\{E460ADEA...}中吗? 在正常情况下(有盘),如果采用DHCP分配地址,得到地址后,地址保存在注册表中吗?tcpip又是怎样得知这个地址,并向TDI注册改地址的? 微软的东西隐藏的真深哪,我一头雾水。我目前只能给73分,容我日后补上。谢了。 |
|
最新喜欢:TOMG20...
|
沙发#
发布于:2004-05-23 21:13
多谢walkonthesky的comment,我的解释如下:
系统引导的过程很复杂,以下几点说明你的思路不可行: > >一直到NTLDR,都在实模式下运行,在NTLDR以前,根本没有文件> >系统这个概念,你怎么定位TCPIP.SYS; 答:NTLDR自己实现了小型的文件系统,可以识别fat和ntfs分区,就像NTLDR可以加载NTOSKRNL.EXE一样,它一样可以加载TCPIP.sys。NTLDR加载的设备驱动称为boot driver,这类驱动在注册表中的start type为0。我认为只要保证tcpip服务的start type为0,NTLDR就可以在boot阶段把它加载到内存。 同样,可以把网卡驱动的start type设为0,NDIS的start type本来就是0了。关于tcpip.sys的初始化问题。 关于NTLDR的加载则可以使用pxe,NTLDR使用bios int 13h访问硬盘,可以利用pxe加载一段小程序来截取int 13h,利用pxe的UNDI把int 13h重定向到网络。 ... 现在的关键是如何动态获取IP地址。我认为微软的tcpip.sys是支持即插即用的,一旦底层网卡被使能,tcpip.sys就会检测到绑定在网卡上的ip地址,并向tdi注册该地址,这是静态ip地址分配的情况。无盘系统需要动态分配ip地址,我们可以在内核中实现一个DHCP客户端(微软提供的DHCP客户端肯定是永不上的了,太上层了),分配得到一个ip地址,但如何让tcpip.sys得知这个地址,并向tdi注册,从而供上层tdiclient使用,这是我最困惑的地方。我想最好直接使用微软提供的tcpip.sys,否则就要自己实现一个传输层协议栈了,那就比较痛苦了。 愿听高见! |
|
|
板凳#
发布于:2004-05-24 11:23
关于你的问题,我的想法如下:
一、NTLDR的文件系统不在你的控制之下,甚至不在OS的控制之下(因为还没有加载),你还是不能利用他的文件系统,此其一;(我现在也想控制NTLDR的行为,如果你有什么突破,能否和我交流一下) 答:我并不试图控制NTLDR,我认为NTLDR是由BOOTSECTOR(引导扇区)装入的,而引导扇区在硬盘的固定位置,我只要把服务器上的虚拟硬盘上的引导扇区读入,并把控制权交给BOOTSECTOR,让BOOTSECTOR去加载NTLDR就可以了。NTLDR获得控制权后,它按注册表的配置去加载start=0的驱动。NTLDR知道NTFS,它自己知道怎么去找文件(也就是把文件名转换为磁盘块号,然后我把块号发到网络服务器(利用重定向的int 13h),服务器那端有虚拟硬盘(实际就是文件),我在服务器端再读文件,发回给无盘工作站)。 二、START=0的驱动在NTLDR到IOMGR这段时间,是被加载,并没有被初始化,你还是不能在BOOT的时候使用相关驱动; 答:我并不是要在boot阶段使用任何驱动,只要NTLDR能把要的驱动在boot阶段加载即可。然后由IOMGR(按加载次序)去初始化这些boot driver。 这个阶段IOMGR会枚举PCI总线,从而找到网卡等设备,如果网卡的驱动是start type=0,则加载网卡驱动;如果网卡驱动start type !=0,则仅为它创建devnode,并不加载它的驱动。所以,我想将网卡的start type设为0,就可以保证网卡驱动能够被初始化。 然后,PnP Mgr 加载所有的start type=1的驱动,包括tcpip.sys,但我想如果把tcpip.sys的start type设为0的话,是可以在上一个阶段加载并初始化的。 三、你的思路如果一定要做,至少自己实现BOOTLOADER(可以用第三方的),NTLDR,DHCP,TCP/IP,网卡实模式驱动(因为没有HAL),个人看法。 答:我觉得bootloader可以直接用ntldr,因为只有它知道怎么加载windows的各种系统文件。不过对于上几个回合讨论的ip地址的问题,我想我可能真的要实现tcp/ip和网卡驱动了。但不必要是实模式的吧,在实模式访问网络可以使用PXE的UNDI,我想。 Windows的动态ip地址分配是在系统初始化阶段,即由SCM加载DHCP Client服务(start type=2),而我想在更早的时间利用DHCP得到地址,并让系统(tcpip,tdi)知道这么个IP地址,有什么建议吗? |
|
|