阅读:3036回复:0
中文版Introduction to NDIS 6.0 (Windows Drivers)MSDN
NDIS6.0的协议驱动程序注册的NDIS驱动在DriverEntry函数中。在的NDIS6.0中,NdisRegisterProtocol函数被淘汰。注册NDIS6.0的协议驱动程序,调用NdisRegisterProtocolDriver函数。
像NdisRegisterProtocol ,NdisRegisterProtocolDriver的输入参数包括NDIS_PROTOCOL_DRIVER_CHARACTERISTICS结构(原名NDIS_PROTOCOL_CHARACTERISTICS)和一个指针NDIS_HANDLE在NdisProtocolHandle中。NDIS提供了识别驱动程序的操作处理。此外,NdisRegisterProtocolDriver包括ProtocolDriverContext参数,指定了一个驱动程序分配上下文的句柄用来保持驱动维持状态和配置信息。NDIS稍后会传送ProtocolBindAdapterEx函数的ProtocolDriverContext。 如果调用NdisRegisterProtocolDriver成功,后来协议驱动程序必须调用NdisDeregisterProtocolDriver函数。协议驱动程序的上下文卸载例程中调用NdisDeregisterProtocolDriver。 如果出现错误调用NdisRegisterProtocolDriver成功后驱动程序必须调用NdisDeregisterProtocolDriver函数在驱动入口返回之前。 NDIS协议驱动会调用ProtocolSetOptions函数在驱动程序调用NdisRegisterProtocolDriver函数时。如果驱动程序不注册optional services,ProtocolSetOptions的函数入口点设置为NULL,在NDIS_PROTOCOL_DRIVER_CHARACTERISTICS结构中。提供额外的入口点,从ProtocolSetOptions中,协议驱动程序调用NdisSetOptionalHandlers函数。 配置可选的协议驱动程序服务 NDIS调用协议驱动ProtocolSetOptions函数,可以允许一个协议驱动程序配置可选服务。NDIS的协议驱动上下文中调用ProtocolSetOptions ,协议驱动程序的调用函数NdisRegisterProtocolDriver的 ProtocolSetOptions注册的默认入口点可选ProtocolXxx功能并且可以分配其他的驱动资源。注册可选ProtocolXxx功能,协议驱动程序调用NdisSetOptionalHandlers函数并且在OptionalHandlers的参数中传递一个特殊的结构。在这种情况下,协议驱动程序通过在NdisSetOptionalHandlers 中的NdisHandle参数处理ProtocolSetOptions中的 NdisDriverHandle 。 协议驱动程序有一个有效的来自于NdisOpenAdapterEx函数的NdisHandle以后,协议驱动程序也可以调用ProtocolBindAdapterEx功能或ProtocolOpenAdapterCompleteEx函数的NdisSetOptionalHandlers。在这种情况下,协议驱动程序可以传递NdisOpenAdapterEx 的NdisBindingHandle,在NdisSetOptionalHandlers 的NdisHandle参数。 在这种情况下,有效的结构特点: NDIS_PROTOCOL_CO_CHARACTERISTICS NDIS_CO_CLIENT_OPTIONAL_HANDLERS NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS NDIS_CLIENT_CHIMNEY_OFFLOAD_GENERIC_CHARACTERISTICS(见6.0的NDIS TCP烟囱将文档) NDIS_CLIENT_CHIMNEY_OFFLOAD_TCP_CHARACTERISTICS(见6.0的NDIS TCP烟囱将文档) Updating the NDIS 6.0 Protocol Driver characteristics Structure 许多的NDIS 5.x中发现的入口点在NDIS_PROTOCOL_CHARACTERISTICS结构中的,已经在NDIS 6.0版本的结构中拆除。NDIS 6.0版本的结构是NDIS_PROTOCOL_DRIVER_CHARACTERISTICS名称。 大多数的NDIS 6.0数据结构包含结构版本信息对象头成员,这是结构的第一个成员。版本信息被是指定的,在NDIS_OBJECT_HEADER结构中。 对象的头有三个成员:类型,大小和修订。如果头信息是不正确的,调用将失败到NDIS 6.0函数。下面的例子说明了头初始化: ProtocolChar.Header.Type = NDIS_OBJECT_TYPE_PROTOCOL_DRIVER_CHARACTERISTICS, ProtocolChar.Header.Size = sizeof(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS); ProtocolChar.Header.Revision = NDIS_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_1; 在下面的例子中,ProtocolChar NDIS_PROTOCOL_DRIVER_CHARACTERISTICS类型的结构。三次失败指明改变的NDIS 5.x驱动程序。 分别设置的NDIS 6.0协议驱动的主要和次要版本号6和 0。 ProtocolChar.MajorNdisVersion = 5; ProtocolChar.MajorNdisVersion = 6; ProtocolChar.MinorNdisVersion = 1; ProtocolChar.MinorNdisVersion = 0; NDIS6.0协议驱动程序必须指定驱动程序的版本。驱动程序版本是独立于NDIS主要和次要版本。 ProtocolChar.MajorDriverVersion = PROTOCOL_MAJOR_DRIVER_VERSION; ProtocolChar.MinorDriverVersion = PROTOCOL_MINOR_DRIVER_VERSION; ProtocolBindAdapterEx函数的函数取代ProtocolBindAdapter: ProtocolChar.BindAdapterHandler = ProtocolBindAdapter; ProtocolChar.BindAdapterHandlerEx = ProtocolBindAdapterEx; ProtocolUnbindAdapterEx函数取代ProtocolUnbindAdapter 的函数: ProtocolChar.UnbindAdapterHandler = ProtocolUnbindAdapter; ProtocolChar.UnbindAdapterHandlerEx = ProtocolUnbindAdapterEx; ProtocolOpenAdapterCompleteEx取代ProtocolOpenAdapterComplete函数的函数: ProtocolChar.OpenAdapterCompleteHandler = ProtocolOpenAdapterComplete; ProtocolChar.OpenAdapterCompleteHandlerEx = ProtocolOpenAdapterCompleteEx; ProtocolCloseAdapterCompleteEx函数的函数取代 ProtocolCloseAdapterComplete : ProtocolChar.CloseAdapterCompleteHandler = ProtocolCloseAdapterComplete; ProtocolChar.CloseAdapterCompleteHandlerEx = ProtocolCloseAdapterCompleteEx; ProtocolNetPnPEvent函数取代ProtocolPnPEvent : the ProtocolChar.PnPEventHandler = ProtocolPnPEvent; ProtocolChar.NetPnPEventHandler = ProtocolNetPnPEvent; ProtocolOidRequestComplete 函数取代 ProtocolRequestComplete : ProtocolChar.RequestCompleteHandler = ProtocolRequestComplete; ProtocolChar.OidRequestCompleteHandler = ProtocolOidRequestComplete 注册可选服务,为ProtocolSetOptions函数提供一个入口点 ProtocolChar.SetOptionsHandler = ProtocolSetOptions; 发送和接收功能,使用NET_BUFFER和NET_BUFFER_LIST结构取代函数使用NDIS_PACKET结构: ProtocolChar.ReceivePacketHandler = ProtocolReceivePacket; ProtocolChar.SendPacketsCompleteHandler = ProtocolSendPacketsComplete; ProtocolChar.ReceiveNetBufferListsHandler = ProtocolReceiveNetBufferLists; ProtocolChar.SendNetBufferListsCompleteHandler = ProtocolSendNetBufferListsComplete; 关于NET_BUFFER和NET_BUFFER_LIST结构的更多信息,参见NET_BUFFER架构。 支持系统的卸载驱动程序,替换ProtocolUnload功能,如果有的话,ProtocolUninstall功能。 ProtocolChar.UnloadHandler = ProtocolUnload; ProtocolChar.UninstallHandler = ProtocolUninstall; Porting Protocol Driver Unload Operations to NDIS 6.0 在的NDIS 6.0中,一个协议驱动程序必须调用NdisDeregisterProtocolDriver函数,在其卸载程序,取消注册协议驱动程序时。驱动程序通过NdisDeregisterProtocolDriver处理,获得NdisProtocolHandle时称为NdisRegisterProtocolDriver功能。 6.0的NDIS,ProtocolUnload函数——电话的NDIS协议驱动程序卸载时——是ProtocolUninstall功能所取代。协议驱动程序指定一个ProtocolUninstall NDIS_PROTOCOL_DRIVER_CHARACTERISTICS结构函数入口点。 ProtocolUninstall是一个可选的功能。在响应用户请求的NDIS调用ProtocolUninstall卸载一个中间驱动程序。的NDIS ProtocolUnbindAdapterEx曾经呼吁每个绑定适配器,然后ProtocolUninstall的NDIS调用。之前的NDIS调用ProtocolUninstall系统实际卸载驱动程序。这个时机提供了一个机会释放任何设备对象或其他资源,否则防止系统调用中间驱动程序的MiniportDriverUnload函数和卸载驱动程序。 有关卸载一个6.0的NDIS协议驱动程序的更多信息,参见初始化协议驱动程序。 在的NDIS 6.0中,一个协议驱动程序必须调用NdisDeregisterProtocolDriver函数,在其卸载程序,取消注册协议驱动程序。驱动程序通过NdisDeregisterProtocolDriver处理操作NdisProtocolHandle ,这个Handle是调用NdisRegisterProtocolDriver函数获得的。 对于NDIS6.0来说,NDIS协议驱动程序卸载时调用的旧的ProtocolUnload函数是被ProtocolUninstall函数所取代。协议驱动程序指定一个ProtocolUninstall函数在 NDIS_PROTOCOL_DRIVER_CHARACTERISTICS结构中保存函数的入口点。 ProtocolUninstall是一个可选的函数功能。在响应用户请求, NDIS调用ProtocolUninstall卸载一个中间驱动程序。为每个绑定的适配器,NDIS 一旦调用ProtocolUnbindAdapterEx,那么NDIS就会调用ProtocolUninstall函数。系统实际卸载驱动程序之前的NDIS调用ProtocolUninstall。这个时机提供了一个机会释放任何设备对象或其他资源,否则防止系统调用中间驱动程序的MiniportDriverUnload函数和卸载驱动程序。 有关卸载一个6.0的NDIS协议驱动程序的更多信息,参见初始化协议驱动程序。 初始化一个协议驱动程序 系统调用加载驱动程序后调用这个协议驱动程序的驱动入口函数。协议驱动程序加载就像加载系统服务。期间,他们可以在任何时间加载在微端口驱动加载的时间前后。 协议驱动程序分配驱动资源和注册ProtocolXxx功能在DriverEntry函数中。注册用的NDIS ProtocolXxx功能,协议驱动程序调用NdisRegisterProtocolDriver函数。 NDIS协议驱动程序提供以下ProtocolXxx函数,遗留驱动程序提供的函数的更新版本: ProtocolSetOptions NDIS调用协议驱动程序的ProtocolSetOptions功能允许协议驱动程序注册可选服务。 注意您必须使用SET_OPTIONS类型声明的函数。有关更多信息,请参见下面的例子。 SET_OPTIONS ProtocolSetOptions; NDIS_STATUS ProtocolSetOptions( _In_ NDIS_HANDLE NdisDriverHandle, _In_ NDIS_HANDLE DriverContext ) { ... }
ProtocolSetOptions是一个可选的功能。 NdisRegisterProtocolDriver函数的调用的NDIS协议驱动程序的上下文中调用被保存的ProtocolSetOptions 指针。 ProtocolSetOptions注册可选服务和可以分配其他驱动程序资源。注册可选ProtocolXxx函数,协议驱动程序调用NdisSetOptionalHandlers函数。协议驱动程序将处理NdisDriverHandle参数,是在NdisSetOptionalHandlers函数的NdisHandleparameter参数里,并且通过在 OptionalHandlers的特殊结构characteristics structure 。 可选的服务中定义以下结构: NDIS_PROTOCOL_CO_CHARACTERISTICS NDIS_CO_CLIENT_OPTIONAL_HANDLERS NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS ProtocolBindAdapterEx routine NDIS协议驱动程序的ProtocolBindAdapterEx函数来请求驱动程序绑定到微端口适配器。 注意您必须使用PROTOCOL_BIND_ADAPTER_EX类型声明的函数。有关更多信息,请参见下面的例子。 ProtocolDriverContext[IN] 句柄驱动分配的上下文区域是用来驱动程序保持状态和配置信息。协议驱动程序通过NdisRegisterProtocolDriver函数传递驱动上下文。 BindContext[IN] 标识的NDIS处理绑定操作上下文区域的。 BindParameters[IN] NDIS创建一个NDIS_BIND_PARAMETERS结构的指针。 返回代码描述 NDIS_STATUS_SUCCESS ProtocolBindAdapterEx成功完成绑定到底层端口适配器。 NDIS_STATUS_PENDING ProtocolBindAdapterEx没有完成绑定操作和异步操作完成。协议驱动程序必须调用NdisCompleteBindAdapterEx函数操作完成。 返回代码描述 NDIS_STATUS_SUCCESS ProtocolBindAdapterEx成功完成绑定到底层端口适配器。 NDIS_STATUS_PENDING ProtocolBindAdapterEx没有完成绑定操作和异步操作完成。协议驱动程序必须调用NdisCompleteBindAdapterEx函数操作完成。 NdisOpenAdapterEx function 协议驱动程序调用NdisOpenAdapterEx函数从ProtocolBindAdapterEx函数建立一个协议驱动程序和底层驱动程序之间的绑定。 NDIS_STATUS NdisOpenAdapterEx( _In_ NDIS_HANDLE NdisProtocolHandle, _In_ NDIS_HANDLE ProtocolBindingContext, _In_ PNDIS_OPEN_PARAMETERS OpenParameters, _In_ NDIS_HANDLE BindContext, _Out_ PNDIS_HANDLE NdisBindingHandle ); 参数 NdisProtocolHandle[在] NdisRegisterProtocolDriver函数返回的句柄。 ProtocolBindingContext[IN] 调用者提供的上下文的区域用来存储协议驱动程序绑定的维护状态信息。 OpenParameters[IN] 指针调用者所建立的NDIS_OPEN_PARAMETERS结构。 BindContext[IN] 标识的NDIS上下文区域的处理绑定操作。 theProtocolBindAdapterEx函数传递的BindContext参数的句柄给Ndis。 NdisBindingHandle[OUT] 一个指向调用者提供的变量。NDIS输出句柄在NdisBindingHandle变量中,确定调用者绑定在调用者和端口适配器之间的规定,在 AdapterName的成员OpenParameters中指定。调用者在后续的调用中使用这个句柄处理NdisXxx函数。 返回代码描述 NDIS_STATUS_SUCCESS NdisOpenAdapterEx打开操作成功完成。 NDIS_STATUS_PENDING NdisOpenAdapterEx打开操作没有完成。后来的NDIS调用协议驱动程序'sProtocolOpenAdapterCompleteEx函数完成打开操作。 NDIS_STATUS_RESOURCES NdisOpenAdapterEx因资源不足而失败。 NDIS_STATUS_ADAPTER_NOT_FOUND NdisOpenAdapterEx失败是因为AdapterName成员中指定一个端口适配器atOpenParameters不能被发现。 NDIS_STATUS_UNSUPPORTED_MEDIA 摘要 协议驱动程序必须调用 NdisOpenAdapterEx函数在 ProtocolBindAdapterEx函数后。NDIS失败任何试图调用NdisOpenAdapterEx在 ProtocolBindAdapterEx的上下文之外。 如果NdisOpenAdapterEx 返回NDIS_STATUS_PENDING,调用者不比使用在OpenParameters中的 SelectedMediumIndexmember何 NdisBindingHandle的值,直到NDIS调用ProtocolOpenAdapterCompleteEx函数。 在AdapterName的字符串必须保持有效直到NdisOpenAdapterEx打开返回。因此,如果NdisOpenAdapterEx返回NDIS_STATUS_PENDING,驱动程序不需要继续保留这个字符串,在NdisOpenAdapterEx返回后。 打开操作成功完成后,调用者可以使用NDIS返回的值 NdisBindingHandle,在后续调用NdisXxx函数时。调用者可以使用OpenParameters参数SelectedMediumIndex 来确定怎样应该与底层驱动程序互相作用。
读取注册表的NDIS 6.0协议驱动程序 在NDIS6.0中, NdisOpenConfigurationEx功能取代了NdisOpenConfiguration功能。NdisOpenConfigurationEx接收,作为参数的NDIS Handle和一个指向一个配置的句柄。 如果驱动程序得到了NDIS处理通过在函数通过调用NdisRegisterProtocolDriver得道 NdisHandle, 它是NdisOpenConfigurationExprovide提供的句柄用于存储协议驱动程序的配置参数。 如果司机获得处理ProtocolBindAdapterEx BindParameters的指针参数的函数,NdisOpenConfigurationEx提供了一个配置处理注册表位置底层存储端口适配器配置参数。 协议驱动程序在后续的调用NdisReadConfiguration和NdisWriteConfiguration函数中使用的配置句柄。关于配置功能的更多信息,参见NDIS6.0配置功能。 在NDIS6.0中,NdisAllocateMemoryWithTagPriority函数取代了NdisAllocateMemory和NdisAllocateMemoryWithTag函数。除了特别说明协议驱动程序句柄,池的大小,和标签,NdisAllocateMemoryWithTagPriority要求分配优先级,表示请求的重要性。最重要的是为ExAllocatePoolWithTagPriority函数定义的一样。 NDIS 6.0引入了驱动程序栈暂停和重新启动功能。暂停操作转换协议绑定到协议暂停状态。重启操作转换协议绑定到协议运行状态。请参阅绑定的协议驱动程序绑定状态去概述协议绑定状态。 NDIS6.0可以暂停驱动堆栈在发生即插即用操作时,比如添加或删除一个过滤器驱动程序绑定或卸载协议驱动程序。停止协议驱动程序数据流执行即插即用操作之前,NDIS协议驱动程序调用ProtocolNetPnPEvent功能和指定一个暂停事件。协议绑定仍处于暂停状态,直到暂停操作已经完成。 NDIS调用协议驱动程序的ProtocolNetPnPEvent函数和指定重启事件返回协议绑定到运行状态。 有关暂停和重新启动操作的更多信息,请参阅驱动堆栈管理。 关于NDIS6.0的NDIS协议驱动程序的更多信息即插即用的事件,看到移植到NDIS协议驱动程序即插即用事件通知处理6.0。 本文是www.dyy123.net站长Dyy原创转载请标明出处 全本在www.dyy123.net/article.asp?aid=19 |
|||||||||||||||