cidentifier
驱动牛犊
驱动牛犊
  • 注册日期2003-11-13
  • 最后登录2009-09-20
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:2352回复:12

如何在系统启动之前分配IP地址??????

楼主#
更多 发布于:2004-05-21 14:38
我们在实现无盘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分,容我日后补上。谢了。

最新喜欢:

TOMG2004TOMG20...
control it, or forget it
cidentifier
驱动牛犊
驱动牛犊
  • 注册日期2003-11-13
  • 最后登录2009-09-20
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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,否则就要自己实现一个传输层协议栈了,那就比较痛苦了。

愿听高见!
control it, or forget it
cidentifier
驱动牛犊
驱动牛犊
  • 注册日期2003-11-13
  • 最后登录2009-09-20
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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地址,有什么建议吗?
control it, or forget it
游客

返回顶部