网络-MiniportInitialize笔记.txt

来源:互联网 发布:单片机开发 编辑:程序博客网 时间:2024/04/29 02:20

知道它是基于NDIS构架的,我们只需要实现一个MINIPORT驱动,实现其中的一些接口函数就可以了。

 


问题1:mac地址是怎么打印出来的:如:
[DM9ISA]: MAC address is = 00 : 60 : 4d : 51 : 00 : 01 
[DM9ISA]: load NIC MAC address form register file
答:在NIC_DEVICE_OBJECT::DeviceMacAddress中的打印
过程:
 PU8  NIC_DEVICE_OBJECT::DeviceMacAddress(PU8 ptrBuffer)
这个读取mac地址,并且打印mac地址,实际上该函数是读取全局变量(U8)m_szConfigures[CID_MAC_ADDR_0];

 

///////////////////////////////////////////////////////////////////////////////////////////////////
 问题2:mac地址是怎么初始化的:
 m_szConfigures[CID_MAC_ADDR_0];保留mac地址,这个数组初始化,在这个函数:
void NIC_DEVICE_OBJECT::DeviceRetriveConfigurations,这个函数从注册表中读取全部的信息,保存到该变量中.

 CID_MAC_ADDR_0是枚举常数,被另外一个结构体数组引用:
CONFIG_PARAMETER g_szDm9ConfigParams[] =
{
    { CID_IO_BASE_ADDRESS, 0x00000300, NDIS_STRING_CONST("IoAddress")},
    { CID_IRQ_NUMBER, 3, NDIS_STRING_CONST("IrqNumber")},
    { CID_INT_ACTIVE, INT_ACTIVE_HIGH, NDIS_STRING_CONST("Int_Active_High")},
    { CID_FC_ENABLE, FLOW_CONTROL_ENABLE, NDIS_STRING_CONST("Flow_Control_Enable")},
    { CID_MAC_LOAD_MODE, 0, NDIS_STRING_CONST("MAC_Load_Mode")},
    { CID_MAC_ADDR_0, 0x00, NDIS_STRING_CONST("SoftwareMacAddress0")},

 g_szDm9ConfigParams只在这个函数引用,:
PCONFIG_PARAMETER C_DM9000::DeviceConfigureParameters(void)
{
    return (PCONFIG_PARAMETER)&g_szDm9ConfigParams[0];
}
 上面那个函数只在这个函数引用:void NIC_DEVICE_OBJECT::DeviceRetriveConfigurations
在这个函数中,遍历g_szDm9ConfigParams[]数组的每一个成员,然后初始化m_szConfigures[]数组
C_DM9000是NIC_DEVICE_OBJECT的子类, DeviceConfigureParameters函数并没有在父类实现,是个抽象函数,但是
这个函数在父类中得到了调用, 所以所有的函数都是在子类C_DM9000中得到调用的.
 
 在NIC_DEVICE_OBJECT::DeviceRetriveConfigurations函数中会打印如下信息:
DM9000 NIC_DEVICE_OBJECT *DeviceEntry!!***
[DM9ISA]: read register IoAddress 18000000 !
[DM9ISA]: read register IrqNumber 24 !
[DM9ISA]: read register Int_Active_High 1 !
[DM9ISA]: read register Flow_Control_Enable 1 !
[DM9ISA]: read register MAC_Load_Mode 0 !
[DM9ISA]: read register MAC_ADDR_0 0 !
[DM9ISA]: read register MAC_ADDR_1 60 !
[DM9ISA]: read register MAC_ADDR_1 4d !
[DM9ISA]: read register MAC_ADDR_2 51 !
[DM9ISA]: read register MAC_ADDR_3 0 !
[DM9ISA]: read register MAC_ADDR_5 1 !
///////////////////////////////////////////////////////////////////////////////////////////////////
 问题3:NIC_DEVICE_OBJECT::DeviceRetriveConfigurations怎么调用的?
该函数只在void NIC_DRIVER_OBJECT::EDriverInitialize()函数中得到调用,
在该函数中初始化一个DM9000的实例,然后通过这个实例调用DeviceRetriveConfigurations()

EDriverInitialize()函数在一个c语言函数被调用:
    NDIS_STATUS MiniportInitialize()
这个函数会创建一个NIC_DRIVER_OBJECT实例,通过这个实例调用EDriverInitialize();
MiniportInitialize函数在DriverEntry中被初始化到数组中:
ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize;
附录:类关系:
class C_DM9000 : public NIC_DEVICE_OBJECT