WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(六)——驱动程序的初始化与清除... 阅读

深度剖析WinPcap之(六)——驱动程序的初始化与清除

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: Ø 在NDIS_PROTOCOL_CHARACTERISTICS结构中指定协议兼容的NDIS版本;Ø 在NDIS_PROTOCOL_CHARACTERISTICS结构中设置驱动程序导出的必需的和可选的ProtocolXxx函数的地址,在WinPcap的NPF中的具体实

Ø         在NDIS_PROTOCOL_CHARACTERISTICS结构中指定协议兼容的NDIS版本;

Ø         在NDIS_PROTOCOL_CHARACTERISTICS结构中设置驱动程序导出的必需的和可选的ProtocolXxx函数的地址。

在WinPcap的NPF中的具体实现为:首先分配一个NDIS_PROTOCOL_CHARACTERISTICS的结构体,然后执行零初始化,接着用协议数据(版本、名称等)与驱动程序所需回调函数的地址设置该结构体。最后调用NdisRegisterProtocol函数把NPF注册为一个NDIS协议驱动程序。下面为NPF中对应的代码:

//声明一个NDIS_PROTOCOL_CHARACTERISTICS结构实例ProtocolChar;
NDIS_PROTOCOL_CHARACTERISTICS  ProtocolChar;
 
//协议名称PacketDriver
NDIS_STRING ProtoName = NDIS_STRING_CONST("PacketDriver");
 
//对ProtocolChar的内存空间清零
RtlZeroMemory(&ProtocolChar,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
 
//用协议数据(版本、名称等)与回调函数地址设置ProtocolChar
#ifdef #ifdef NDIS50
    ProtocolChar.MajorNdisVersion            = 5;
#else
    ProtocolChar.MajorNdisVersion            = 3;
#endif
    ProtocolChar.MinorNdisVersion            = 0;
    ProtocolChar.Reserved                    = 0;
    ProtocolChar.OpenAdapterCompleteHandler  = NPF_OpenAdapterComplete;
    ProtocolChar.CloseAdapterCompleteHandler = NPF_CloseAdapterComplete;
    ProtocolChar.SendCompleteHandler         = NPF_SendComplete;
    ProtocolChar.TransferDataCompleteHandler = NPF_TransferDataComplete;
    ProtocolChar.ResetCompleteHandler        = NPF_ResetComplete;
    ProtocolChar.RequestCompleteHandler      = NPF_RequestComplete;
    ProtocolChar.ReceiveHandler              = NPF_tap;
    ProtocolChar.ReceiveCompleteHandler      = NPF_ReceiveComplete;
    ProtocolChar.StatusHandler               = NPF_Status;
    ProtocolChar.StatusCompleteHandler       = NPF_StatusComplete;
#ifdef NDIS50
    ProtocolChar.BindAdapterHandler          = NPF_BindAdapter;
    ProtocolChar.UnbindAdapterHandler        = NPF_UnbindAdapter;
    ProtocolChar.PnPEventHandler             = NPF_PowerChange;
    ProtocolChar.ReceivePacketHandler        = NULL;
#endif
    ProtocolChar.Name                        = ProtoName;
 
//把NPF注册为一个NDIS协议驱动程序
    NdisRegisterProtocol(
        &Status,
        &g_NdisProtocolHandle,
        &ProtocolChar,
        sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
if (Status != NDIS_STATUS_SUCCESS) {
//注册协议驱动程序到NDIF失败,程序结束
        return Status;
    }

上一页  2 3 4 5 6 7 8  下一页

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接