cidentifier
驱动牛犊
驱动牛犊
  • 注册日期2003-11-13
  • 最后登录2009-09-20
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:2338回复: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
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-21 17:32
你的想法好像有问题

系统引导的过程很复杂,以下几点说明你的思路不可行:
1。一直到NTLDR,都在实模式下运行,在NTLDR以前,根本没有文件系统这个概念,你怎么定位TCPIP.SYS;
2。NTLDR做以下工作:
    A。将CPU从实模式转换到保护模式下;
    B。建立1M以下的内存页描述符;
    C。开启页映射功能,使NT可以访问4G内存;
    D。NTLDR通过内建的文件系统代码来查找根目录下的BOOT.INI并根据BOOT.INI(这也是我们可以修改启动选项的地方)的内容提示用户可选的操作系统.
    e:引导选择的操作系统(或者缺省)

这里有文件系统,但整个都在NTLDR的控制下,你无法干预。
3。引导过程
    这一段引导过程本身还是NTLDR完成的
    A。加载NTDECT.COM.执行一大堆的BIOS系统调用.进行系统配置的检测.所有检测到的东西将被存到系统注册表的HKLM\\HARDWARE\\DESCRIPTION项下.
    B。加载HAL.DLL,NTOSKRNL.EXE两个核心文件;
    C。加载HKEY_LOCAL_MACHINE\\SYSTEM\\Services里的值SERVICE_BOOT_START的DRIVER,但是此时不初始化
    D。NTLDR锁定NTOSKRNL.EXE的main()函数,然后将控制转移给NTOSKRNL.EXE.
4。中间我省略,要下班了,需要的话就在这个帖子留言。

5。HAL依次调用Object Manager, Executive, Kernel, Security Reference Monitor,Memory Manager,Cache Manager,Configuration Manager,I/O Manager, Process Manager.  
6。IO管理器负责完成启动值为SERVICE_BOOT_START的驱动程序的初始化,紧接着,启动注册表内启动值为SERVICE_SYSTEM_START的装载.

TCPIP。SYS的START类型是1,这个时候才开始加载。也就是说你现在才可以利用TCPIP。SYS

[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-21 17:37
在看看网卡驱动

网卡驱动的START类型是3

我感觉你实现无盘的思路应该换一下
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-22 16:37
关注
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
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-24 08:52
还是有问题

一、NTLDR的文件系统不在你的控制之下,甚至不在OS的控制之下(因为还没有加载),你还是不能利用他的文件系统,此其一;(我现在也想控制NTLDR的行为,如果你有什么突破,能否和我交流一下)
二、START=0的驱动在NTLDR到IOMGR这段时间,是被加载,并没有被初始化,你还是不能在BOOT的时候使用相关驱动;
三、你的思路如果一定要做,至少自己实现BOOTLOADER(可以用第三方的),NTLDR,DHCP,TCP/IP,网卡实模式驱动(因为没有HAL),个人看法。
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
cidentifier
驱动牛犊
驱动牛犊
  • 注册日期2003-11-13
  • 最后登录2009-09-20
  • 粉丝1
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-24 13:17
建议不敢说,因为我没有做过,怕误导。

关于获得IP的问题
你机器初始化时,只有MAC地址,没有其他信息。
由MAC查IP可以用RARP

http://www.ekany.com/wdg98/network/ch02/tcp020202.htm
是我午休时找的一点资料,也许你已经看过了,参考。
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-09 11:49
to walkonthesky:
    你的上面的贴子很好,对操作系统的启动应该有比较深的研究吧,按照你的意思,我的scsi驱动现在运行在保护模式下,现在有几个问题请教:
   1,我如何在保护模式下的驱动中获取实模式下的高端内存中的数据(640~1M之间),我扫描了整个内存都没有发现,我怀疑我的方法有些问题。
 2、当驱动加载从第0级向第一级转换时要做些什么事情,怎么样才能够让网络在这个转换过程前能够启动呢?(我得网卡以及ndis,tcp/ip都在转换前加载了。
谢谢!
gantleman
驱动小牛
驱动小牛
  • 注册日期2003-10-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望127点
  • 贡献值1点
  • 好评度18点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-10 21:42
看的有点糊涂,既然IP地址是有主机发的。那为何要到客户那去拦截主机发的IP地址呢?记得WIN2K有一个内置的无盘,好象是主机先感觉网络环境,配置客户的系统,用客户系统引导客户机。 :)用在有MAC地址环境是可行的。如果是广域网好象不行
root60931
驱动大牛
驱动大牛
  • 注册日期2002-10-25
  • 最后登录2023-10-29
  • 粉丝2
  • 关注0
  • 积分1013分
  • 威望432点
  • 贡献值0点
  • 好评度311点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2004-07-17 10:18
关注中.....
好好学习,天天向上! root60931@gmail.com
zhleonix
驱动牛犊
驱动牛犊
  • 注册日期2002-04-04
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-17 17:54
这个要使用PXE模式从网卡启动,PXE启动时会自动分配IP。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-07-17 22:54
关于你的问题,我的想法如下:

答:我并不试图控制NTLDR,我认为NTLDR是由BOOTSECTOR(引导扇区)装入的,而引导扇区在硬盘的固定位置,我只要把服务器上的虚拟硬盘上的引导扇区读入,并把控制权交给BOOTSECTOR,让BOOTSECTOR去加载NTLDR就可以了。NTLDR获得控制权后,它按注册表的配置去加载start=0的驱动。NTLDR知道NTFS,它自己知道怎么去找文件(也就是把文件名转换为磁盘块号,然后我把块号发到网络服务器(利用重定向的int 13h),服务器那端有虚拟硬盘(实际就是文件),我在服务器端再读文件,发回给无盘工作站)。


我没做过无盘启动,我只是针对你所说的有个疑问,既然你的网卡驱动还没有被加载,那你又怎样在一开始把你的文件从服务器上读回来。我看你说的很像是bootroom的工作,这方面的资料应该很多,实现方案也应该很成熟了。
游客

返回顶部