驱动的初始化过程是自下而上的,系统探测到硬件设备后,将触发相应驱动的链式加载。对于ndis im驱动,具体过程大体如下:
1.下层设备初始化完成后,触发Ndis加载上层驱动
2.Ndis调用驱动的BindAdapterHandler(PtBindAdapter)
3.在BindAdapterHandler里,读取驱动注册表”UpperBindings”键得到上层驱动信息
4.分配驱动使用的资源,对于passthru例子,包括分配上下文Adapt结构和收发PACKET_POOL等
5.调用NdisOpenAdapter完成与下层设备的绑定,设置Medium信息
6.调用NdisIMInitializeDeviceInstanceEx进行设备初始化,将触发Ndis加载与”UpperBindings”对应的上层驱动
7.上层驱动在它的BindAdapterHandler里调用NdisOpenAdapter时,将导致InitializeHandler(MPInitialize)被调用
8.在InitializeHandler里,完成设备初始化,对于passthru例子,包括传递Medium信息给上层驱动,设置miniport接口属性,保存Adapt结构到全局列表中,并创建ioctl接口等
9.到此该层驱动的加载工作结束
ndis im驱动的卸载过程大体如下:
1.卸载协议或下层设备禁用触发驱动卸载
2.Ndis调用驱动的UnbindAdapterHandler(PtUnbindAdapter)
3.在UnbindAdapterHandler里,完成卸载前一些善后工作
4.如果设备存在,调用NdisIMDeInitializeDeviceInstance销毁设备,否则调用NdisCloseAdapter直接解除与下层的绑定
5.NdisIMDeInitializeDeviceInstance将触发HaltHandler(MPHalt)被调用
6.在HaltHandler里,做与InitializeHandler相反的工作,对于passthru例子,包括从全局列表中移除上下文Adapt结构,销毁ioctl接口等,如果与下层驱动存在绑定,则调用NdisCloseAdapter解除与下层的绑定
7.解除与下层的绑定后,释放驱动相关资源
8.到此该层驱动的卸载工作结束
1.下层设备初始化完成后,触发Ndis加载上层驱动
2.Ndis调用驱动的BindAdapterHandler(PtBindAdapter)
3.在BindAdapterHandler里,读取驱动注册表”UpperBindings”键得到上层驱动信息
4.分配驱动使用的资源,对于passthru例子,包括分配上下文Adapt结构和收发PACKET_POOL等
5.调用NdisOpenAdapter完成与下层设备的绑定,设置Medium信息
6.调用NdisIMInitializeDeviceInstanceEx进行设备初始化,将触发Ndis加载与”UpperBindings”对应的上层驱动
7.上层驱动在它的BindAdapterHandler里调用NdisOpenAdapter时,将导致InitializeHandler(MPInitialize)被调用
8.在InitializeHandler里,完成设备初始化,对于passthru例子,包括传递Medium信息给上层驱动,设置miniport接口属性,保存Adapt结构到全局列表中,并创建ioctl接口等
9.到此该层驱动的加载工作结束
ndis im驱动的卸载过程大体如下:
1.卸载协议或下层设备禁用触发驱动卸载
2.Ndis调用驱动的UnbindAdapterHandler(PtUnbindAdapter)
3.在UnbindAdapterHandler里,完成卸载前一些善后工作
4.如果设备存在,调用NdisIMDeInitializeDeviceInstance销毁设备,否则调用NdisCloseAdapter直接解除与下层的绑定
5.NdisIMDeInitializeDeviceInstance将触发HaltHandler(MPHalt)被调用
6.在HaltHandler里,做与InitializeHandler相反的工作,对于passthru例子,包括从全局列表中移除上下文Adapt结构,销毁ioctl接口等,如果与下层驱动存在绑定,则调用NdisCloseAdapter解除与下层的绑定
7.解除与下层的绑定后,释放驱动相关资源
8.到此该层驱动的卸载工作结束