Win10Pcap网络驱动学习(2)

Win10Pcap网络驱动学习(2)

协议驱动的一些回调函数(1)

msdn上一些内容的简单翻译

SET_OPTIONS 回调函数

NDIS调用协议驱动的ProtocolSetOptions 函数来允许驱动注册可选的服务.
注意,用户必须将函数声明为SET_OPTIONS 类型。

SET_OPTIONS ProtocolSetOptions;
NDIS_STATUS ProtocolSetOptions(
  _In_ NDIS_HANDLE NdisDriverHandle,
  _In_ NDIS_HANDLE DriverContext
)
{ ... }

参数:
NdisDriverHandle [in]
表示协议驱动的句柄。NDIS的NdisRegisterProtocolDriver 函数返回这个句柄。
DriverContext [in]
驱动上下文句柄,由用户传递给NdisRegisterProtocolDriver 函数并由函数内部赋值。

返回值:
NDIS_STATUS_SUCCESS 成功注册服务与资源。

NDIS_STATUS_RESOURCES 函数无法分配驱动要求的资源

NDIS_STATUS_XXX or NTSTATUS_XXX 驱动尝试注册失败。通常,这个错误状态由一个NdisXxx函数或内核模式支持常规传出。

注意:
ProtocolSetOptions 是一个可选的函数。NDIS在NdisRegisterProtocolDriver 函数中调用该函数。ProtocolSetOptions 注册可选的服务并分配其它的驱动资源。为了注册可选的ProtocolXxx 函数,驱动调用NdisSetOptionalHandlers 函数。协议驱动通过NdisSetOptionalHandlers 函数的NdisHandle参数传递句柄,通过OptionalHandlers 参数传递characteristics 结构体。

可选的服务通过以下结构体定义:
NDIS_PROTOCOL_CO_CHARACTERISTICS
NDIS_CO_CLIENT_OPTIONAL_HANDLERS
NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS
在ProtocolSetOptions 函数返回之后,NDIS可以在任意时间调用驱动的其它ProtocolXxx函数。驱动需要准备好ProtocolBindAdapterEx 函数的回调。在NDIS调用ProtocolBindAdapterEx函数之前,驱动状态为Unbound。如果对于资源分配的尝试失败,ProtocolSetOptions 应该在返回之前释放所有成功分配的资源。

NDIS在IRQL=LEVEL时调用ProtocolSetOptions 。

PROTOCOL_BIND_ADAPTER_EX 回调函数

NDIS调用驱动的ProtocolBindAdapterEx 函数来要求驱动绑定到一个微型端口适配器。
注意,必须声明函数指针为PROTOCOL_BIND_ADAPTER_EX 类型。
语法如下:

PROTOCOL_BIND_ADAPTER_EX ProtocolBindAdapterEx;

NDIS_STATUS ProtocolBindAdapterEx(
  _In_ NDIS_HANDLE           ProtocolDriverContext,
  _In_ NDIS_HANDLE           BindContext,
  _In_ PNDIS_BIND_PARAMETERS BindParameters
)
{ ... }

参数
ProtocolDriverContext [in]
驱动分配的用来维护状态与配置信息的环境区块的句柄。在 NdisRegisterProtocolDriver 函数中传入。
BindContext [in]
标识本次绑定操作的NDIS环境的句柄
BindParameters [in]
指向NDIS创建的NDIS_BIND_PARAMETERS 结构体指针。

返回值
NDIS_STATUS_SUCCESS 成功完成了绑定下层的迷你端口适配器

NDIS_STATUS_PENDING 未完成绑定,并且绑定将会异步完成。当操作完成时协议驱动必须调用NdisCompleteBindAdapterEx 。

NDIS_STATUS_RESOURCES 无法分配驱动需要的资源来进行网络I/O操作。

NDIS_STATUS_XXX or NTSTATUS_XXX 驱动的绑定尝试失败。

注意:
ProtocolBindAdapterEx是必须的函数. 当任意一个可绑定的miniport adapter可用时,NDIS调用ProtocolBindAdapterEx 来执行绑定。ProtocolBindAdapterEx 分配足够的空间来存放绑定环境信息并调用NdisOpenAdapterEx 来绑定到底层的miniport adapter。ProtocolBindAdapterEx 通过NdisOpenAdapterEx函数的ProtocolBindingContext 参数传入指向绑定环境信息的指针。将BindParameters 中的AdapterName 参数的值传递给OpenParameters 的AdapterName 成员。

驱动调用NdisOpenAdapterEx之前,可以传入BindParameters 指针到NdisOpenConfigurationEx 函数来读取与miniport adapter相关的配置参数。
成功打开 miniport adapter之后,驱动可以将NdisOpenAdapterEx 的NdisHandle 参数传递到NdisOpenConfigurationEx 来获取存储了协议绑定配置参数的注册表句柄。

ProtocolBindAdapterEx 传入NdisOpenAdapterEx 一个指向类型列表的指针,该列表表示了协议驱动支持的medium 类型。NDIS在OpenParameters结构体的SelectedMediumIndex参数中标识了选择的medium 类型。
如果NdisOpenAdapterEx 返回错误状态,ProtocolBindAdapterEx 将会返回该错误,释放任何分配的资源并立即返回。
如果NdisOpenAdapterEx 返回NDIS_STATUS_SUCCESS,ProtocolBindAdapterEx 将会分配协议驱动需要的用来进行网络I/O的剩下的资源。驱动同样会配置驱动程序用来跟踪网络I/O操作的特定上下文信息。
如果NdisOpenAdapterEx 返回NDIS_STATUS_PENDING,NDIS将会在打开操作完成之后调用协议驱动的ProtocolOpenAdapterCompleteEx 函数。ProtocolOpenAdapterCompleteEx 将会完成绑定操作。
ProtocolBindAdapterEx函数会保存BindContext 句柄。NDIS 将会以传入参数的形式将ProtocolBindingContext 传入ProtocolOpenAdapterCompleteEx 函数。

如果NdisOpenAdapterEx 返回NDIS_STATUS_PENDING,NDIS将会在NdisOpenAdapterEx 函数返回之后设置OpenParameters 参数的SelectedMediumIndex 成员以及NdisBindingHandle 参数的值。NDIS在调用ProtocolOpenAdapterCompleteEx之前设置这些值,因此,协议驱动必须在ProtocolBindingContext中保存open parameters结构体以及protocol binding句柄(或者任意有效的地方直到NDIS调用ProtocolOpenAdapterCompleteEx)

一个协议驱动在绑定过程中不能够发出OID请求,直到打开操作完成。因为在打开操作完成之后绑定是在暂停状态,协议驱动无法发送请求直到NDIS重新开始绑定。
当打开操作完成之后,ProtocolBindAdapterEx 将会返回NDIS_STATUS_SUCCESS 来完成绑定操作。ProtocolBindAdapterEx 可能会返回NDIS_STATUS_PENDING 来推迟绑定的完成。如果返回了NDIS_STATUS_PENDING,驱动必须调用NdisCompleteBindAdapterEx 函数。

驱动应该使用NDIS_BIND_PARAMETERS 结构体来觉决定底层miniport adapter的功能。在打开操作完成之后,取决于底层media,协议驱动可以调用NdisOidRequest 来查询底层miniport驱动额外的端口适配器的功能。
在驱动为OID_GEN_CURRENT_PACKET_FILTER的绑定 设置了包过滤器之后,NDIS可以调用协议驱动的ProtocolReceiveNetBufferLists 函数。如果底层miniport adapter 没有使用过滤器,接受指示在打开操作之后即为可用。在打开操作完成之后,协议驱动ProtocolStatusEx 函数中可接收到状态指示。
每一个协议驱动应该分配足够的NET_BUFFER 和NET_BUFFER_LIST 结构体池。驱动程序从这些池中为后续的发送操作分配网络数据描述符。如果ProtocolBindAdapterEx 不能分配网络I/O操作需要的资源,它必须释放已分配的资源并返回操作错误。

NDIS调用协议驱动的ProtocolUnbindAdapterEx 函数来请求驱动与一个绑定的底层迷你启动适配器解绑。
如果驱动成功的打开了miniport adapter但是绑定失败了,驱动必须在ProtocolBindAdapterEx 或者ProtocolUnbindAdapterEx中关闭打开的miniport adapter。比如,驱动在ProtocolBindAdapterEx 中调用NdisCloseAdapterEx 并等待操作完成。作为一个可替代的选择,如果驱动返回NDIS_STATUS_PENDING ,可以调用NdisUnbindAdapter 并在ProtocolUnbindAdapterEx 中调用NdisCloseAdapterEx 函数。
NDIS在 IRQL = PASSIVE_LEVEL.时调用ProtocolBindAdapterEx 。

PROTOCOL_UNBIND_ADAPTER_EX回调函数

NDIS调用协议驱动的ProtocolUnbindAdapterEx 函数来将驱动与底层miniport adapter解绑。
注意,必须将函数指针声明为PROTOCOL_UNBIND_ADAPTER_EX 类型。
语法如下:

PROTOCOL_UNBIND_ADAPTER_EX ProtocolUnbindAdapterEx;

NDIS_STATUS ProtocolUnbindAdapterEx(
  _In_ NDIS_HANDLE UnbindContext,
  _In_ NDIS_HANDLE ProtocolBindingContext
)
{ ... }

参数
UnbindContext [in]
NDIS用于解绑的上下文环境句柄
ProtocolBindingContext [in]
协议驱动分配的内容(自定义结构体)。协议驱动在该结构中保存每个绑定的信息。驱动在调用NdisOpenAdapterEx 函数时传入这个结构体。

返回值
NDIS_STATUS_SUCCESS ProtocolUnbindAdapterEx 函数成功的解绑
NDIS_STATUS_PENDING ProtocolUnbindAdapterEx 未能完成解绑,而解绑将会在之后异步完成。协议驱动可以在解绑操作完成之后调用NdisCompleteUnbindAdapterEx 函数。

注意
ProtocolUnbindAdapterEx 是必须的函数。作为ProtocolBindAdapterEx 函数对应的函数,NDIS调用ProtocolUnbindAdapterEx 来释放驱动程序为特定绑定的网络I/O操作申请的资源。协议驱动不能不取消绑定操作。
在调用ProtocolUnbindAdapterEx函数之前,NDIS暂停协议绑定。而为了暂停绑定,NDIS调用ProtocolNetPnPEvent 函数并指定一个NetEventPause事件。
ProtocolUnbindAdapterEx 必须调用NdisCloseAdapterEx 函数来关闭绑定的底层迷你端口。如果NdisCloseAdapterEx 返回NDIS_STATUS_SUCCESS,表示关闭操作完成了。如果返回NDIS_STATUS_PENDING,NDIS将在关闭完成之后调用驱动协议的ProtocolCloseAdapterCompleteEx 回调函数。
在调用NdisCloseAdapterEx之前,协议驱动需要清空组播地址列表以及包过滤器。协议驱动设置组播地址列表为NULL,设置包过滤器为0。更多信息请查看OID_802_3_MULTICAST_LIST 以及OID_GEN_CURRENT_PACKET_FILTER.
如果已指定唤醒模式,协议驱动需要移除OID_PNP_REMOVE_WAKE_UP_PATTERN OID 并通过OID_GEN_RECEIVE_SCALE_PARAMETERS OID清空接收端标定参数。NDIS6.2以及之后版本的协议驱动应该通过OID_PM_REMOVE_WOL_PATTERN OID移除局域网唤醒模式并通过OID_PM_REMOVE_PROTOCOL_OFFLOAD OID移除低功耗协议卸载。
ProtocolUnbindAdapterEx 不能释放ProtocolBindingContext 的资源,直到关闭操作完成。NDIS将传递ProtocolBindingContext 的句柄到ProtocolCloseAdapterCompleteEx。
如果协议驱动完成了解绑操作,ProtocolUnbindAdapterEx 可以返回NDIS_STATUS_SUCCESS。如果NdisCloseAdapterEx 返回了NDIS_STATUS_PENDING,ProtocolUnbindAdapterEx 必须等待NDIS调用ProtocolCloseAdapterCompleteEx之后才能返回NDIS_STATUS_SUCCESS 。
ProtocolUnbindAdapterEx 可以返回NDIS_STATUS_PENDING 来推迟解绑操作的完成。如果ProtocolUnbindAdapterEx 返回NDIS_STATUS_PENDING,驱动最后必须调用NdisCompleteUnbindAdapterEx 来完成解绑操作。如果NdisCloseAdapterEx 返回NDIS_STATUS_PENDING,驱动可以在ProtocolCloseAdapterCompleteEx中完成解绑。ProtocolUnbindAdapterEx 可以在调用NdisCloseAdapterEx之前保存UnbindContext 的句柄。如果ProtocolUnbindAdapterEx 保存了句柄,ProtocolCloseAdapterCompleteEx 可以将其传递给NdisCompleteUnbindAdapterEx 来完成解绑操作。一旦ProtocolUnbindAdapterEx 调用了NdisCloseAdapterEx,句柄就无效了,ProtocolUnbindAdapterEx 不能以该句柄为参数调用任何NdisXxx 函数。驱动可以通过底层迷你端口获取接收与状态指示直到关闭操作完成。

NDIS在IRQL = PASSIVE_LEVEL.时调用ProtocolUnbindAdapterEx 

更新电源管理以及RSS设置
NDIS6.0以及6.1的协议驱动应该在适应的地方执行以下操作:
1.通过OID_PNP_REMOVE_WAKE_UP_PATTERN OID移除迷你端口的局域网唤醒电源模式。

2.通过OID_GEN_RECEIVE_SCALE_PARAMETERS清除接收端的标定参数。

NDIS6.2以及之后的协议驱动应该执行以下操作:
1.通过OID_PM_REMOVE_WOL_PATTERN 移除迷你端口的局域网唤醒电源模式。

2.通过OID_PM_REMOVE_PROTOCOL_OFFLOAD移除power management protocol offloads

PROTOCOL_OPEN_ADAPTER_COMPLETE_EX回调函数

当NdisOpenAdapterEx 函数返回NDIS_STATUS_PENDING时NDIS调用协议驱动的ProtocolOpenAdapterCompleteEx 函数来完成打开适配器的操作。
注意,必须将函数指针声明为PROTOCOL_OPEN_ADAPTER_COMPLETE_EX。

语法

PROTOCOL_OPEN_ADAPTER_COMPLETE_EX ProtocolOpenAdapterCompleteEx;
VOID ProtocolOpenAdapterCompleteEx(
  _In_ NDIS_HANDLE ProtocolBindingContext,
  _In_ NDIS_STATUS Status
)
{ ... }

参数
ProtocolBindingContext [in]
协议驱动分配的(自定义)结构体的指针。在这个结构体中协议驱动保存每个绑定需要用到的变量。当调用NdisOpenAdapterEx时,传入这个变量。

Status [in]
绑定操作的最终状态值。如果这个状态为NDIS_STATUS_SUCCESS 表示绑定成功,否则为底层驱动返回的错误状态。

返回值

注意
ProtocolOpenAdapterCompleteEx 函数试必须的。协议驱动在自定义的绑定函数中调用NdisOpenAdapterEx 函数,在一个异步打开操作完成之后,NDIS调用驱动的ProtocolOpenAdapterCompleteEx 函数。这个函数可以仅仅只是保存一些状态与指示值。这个函数配合ProtocolBindAdapterEx 函数完成绑定操作。

如果自定义绑定函数还没有完成,ProtocolOpenAdapterCompleteEx 函数可以分配驱动绑定需要的资源。如果自定义绑定函数返回NDIS_STATUS_PENDING,ProtocolOpenAdapterCompleteEx 函数可以调用NdisCompleteBindAdapterEx 函数来完成绑定操作。在这种情况下,ProtocolOpenAdapterCompleteEx 将BindContext 句柄传递给NdisCompleteBindAdapterEx函数,这个参数是之前NDIS传递给ProtocolBindAdapterEx函数的。如果状态参数提示了错误,ProtocolOpenAdapterCompleteEx 可以释放在ProtocolBindAdapterEx中分配的绑定资源。

NDIS calls ProtocolOpenAdapterCompleteEx at IRQL = PASSIVE_LEVEL.

PROTOCOL_CLOSE_ADAPTER_COMPLETE_EX 回调函数

当NdisCloseAdapterEx函数返回NDIS_STATUS_PENDING时,NDIS调用驱动协议的ProtocolCloseAdapterCompleteEx 函数来完成关闭底层适配器的操作。
注意,方法必须声明为PROTOCOL_CLOSE_ADAPTER_COMPLETE_EX 类型。

语法

PROTOCOL_CLOSE_ADAPTER_COMPLETE_EX ProtocolCloseAdapterCompleteEx;

VOID ProtocolCloseAdapterCompleteEx(
  _In_ NDIS_HANDLE ProtocolBindingContext
)
{ ... }

参数
ProtocolBindingContext [in]
协议驱动分配的自定义上下文内容(结构体)的句柄。协议驱动在这个区域中保存每个绑定的信息。驱动在调用NdisOpenAdapterEx 时将这个句柄传递给NDIS。

返回值

注意:
ProtocolCloseAdapterCompleteEx 是必须的函数。如果ProtocolUnbindAdapterEx正在等待NDIS调用ProtocolCloseAdapterCompleteEx,这个函数可以简单地表明它已被调用并返回(例如,函数可以更新ProtocolBindingContext 的内容)。这使得ProtocolCloseAdapterCompleteEx 函数可以完成解绑操作。

在协议驱动调用NdisCloseAdapterEx 之后,NdisOpenAdapterEx 函数返回的NdisBindingHandle句柄就不可用了。因此,ProtocolCloseAdapterCompleteEx 不允许以该句柄作为参数调用任何NdisXxx 函数。

如果ProtocolUnbindAdapterEx 函数还未这么做,ProtocolCloseAdapterCompleteEx 可以释放协议驱动自己为每个绑定分配的网络i/o操作资源。

如果ProtocolUnbindAdapterEx 函数返回NDIS_STATUS_PENDING 并将UnbindContext 句柄保存到ProtocolBindingContext,ProtocolCloseAdapterCompleteEx 可以调用NdisCompleteUnbindAdapterEx 函数来完成解绑操作。因此,ProtocolCloseAdapterCompleteEx 在调用NdisCompleteUnbindAdapterEx函数之前不能释放资源。

NDIS calls ProtocolCloseAdapterCompleteEx at IRQL = PASSIVE_LEVEL.

PROTOCOL_NET_PNP_EVENT回调函数

NDIS调用驱动协议的ProtocolNetPnPEvent 方法来指示网络即插即用事件,NDIS PnP事件或者电源管理事件。

注意,必须声明为PROTOCOL_NET_PNP_EVENT 类型

语法

PROTOCOL_NET_PNP_EVENT ProtocolNetPnPEvent;

NDIS_STATUS ProtocolNetPnPEvent(
  _In_ NDIS_HANDLE                 ProtocolBindingContext,
  _In_ PNET_PNP_EVENT_NOTIFICATION NetPnPEvent
)
{ ... }

参数
ProtocolBindingContext [in]
协议驱动分配的区域的句柄,用来保存每个绑定的运行时状态信息。协议驱动在调用NdisOpenAdapterEx 使传入。一个通过空的NULLProtocolBindingContext 指定的NetEventXxx事件 ,对应于所有的绑定。NetEventBindList 以及NetEventBindsComplete 经常指定一个空的NULLProtocolBindingContext 。NetEventReconfigure 可能指定一个特定的ProtocolBindingContext ,也可能为空。

NetPnPEvent [in]
指向NET_PNP_EVENT_NOTIFICATION 结构体的指针,用来描述即插即用事件或者电源管理事件。

返回值
NDIS_STATUS_SUCCESS
协议驱动成功的处理了指示的网络即插即用事件,NDIS PnP事件或电源管理事件。这个返回值表示的含义根据NET_PNP_EVENT_NOTIFICATION 结构体中的NetPnPEvent成员而有所不同:
NetEventSetPower
协议驱动执行了所有需要的的驱动指定的操作来准备将设备过度到要求的电源状

NetEventQueryPower
底层适配器可以过渡到要求的状态。

NetEventQueryRemoveDevice
底层适配器可以被移除

NetEventCancelRemoveDevice
协议驱动以及执行了所有必须的操作来准备底层驱动的取消移除

NetEventReconfigure
协议驱动接受了配置的改变

NetEventBindList
协议驱动具有新的绑定列表并已执行相关处理。

NetEventBindsComplete
协议驱动承认NDIS的指示,表示协议驱动程序绑定到的所有可用的适配器指示标
The protocol driver has acknowledged the indication from NDIS that the protocol driver is bound to all available underlying adapters.

NetEventPnPCapabilities
The protocol driver has acknowledged that it has received the current wake-up capabilities of the underlying adapter that is associated with the specified binding.

NetEventPause
特定的绑定操作进入了暂停状态。在NDIS完成所有的未完成的绑定发送请求之后,绑定将会进入暂停状态。跟多信息请查看Pausing a Binding

NetEventRestart
特定的绑定进入重新开始状态。在协议驱动准备好重新开始发送以及接收绑定的操作之后,绑定进入Running状态。

NetEventPortActivation
协议驱动承认了与指定绑定关联的端口的激活。For more information about port activation, see Activating an NDIS Port.

NetEventPortDeactivation
The protocol driver has acknowledged the activation of a port that is associated with the specified binding.

NDIS_STATUS_PENDING
协议驱动将会通过调用NdisCompleteNetPnPEvent 异步的返回它对于指定事件的反馈。
The protocol driver will return its response to the indicated event asynchronously with a call to the NdisCompleteNetPnPEvent function.

NDIS_STATUS_RESOURCES
协议驱动无法获取足够的系统资源来满足指定的即插即用以及电源管理事件。

NDIS_STATUS_NOT_SUPPORTED
NDIS6.0以及之后的协议驱动不允许返回该状态。哪些不支持即插即用的NDIS5.x的协议驱动可以返回此状态来响应一个NetEventSetPower ,表示NDIS可以解绑该驱动。

NDIS_STATUS_FAILURE
协议驱动由于其它的原因(非前面列出的原因)失败了。

协议驱动可以对于NetEventQueryRemoveDevice 以及NetEventPortActivation 事件失败。
如果协议驱动对于NetEventPortActivation 处理失败,那么就不能在后续的操作中使用任何相关的接口
协议驱动对于NetEventRestart, NetEventIMReEnableDevice, NetEventCancelRemoveDevice, NetEventReconfigure, NetEventBindList, NetEventBindsComplete, NetEventPause, NetEventPortDeactivation, and NetEventPnPCapabilities 事件必须成功处理,返回NDIS_STATUS_SUCCESS.

注意
ProtocolNetPnPEvent 对于支持即插即用以及电源管理是必须的。NDIS调用ProtocolNetPnPEvent 来通知驱动即插即用事件,NDIS PnP事件或者电源管理事件的发生。

NET_PNP_EVENT_NOTIFICATION 结构体被传入ProtocolNetPnPEvent 来描述事件。ProtocolNetPnPEvent
The NET_PNP_EVENT_NOTIFICATION structure that is passed to ProtocolNetPnPEvent describes the event. ProtocolNetPnPEvent 解释NET_PNP_EVENT_NOTIFICATION 结构体中的两个基本信息段:

成员NetEvent 中的code标识了即插即用或者电源管理事件的类型

事件相关的信息。例如,在NetEventSetPower 事件中,Buffer成员包含了驱动即将过度到的电源状态。

协议驱动应该保存NetPnPEvent 指针。这个指针是函数NdisCompleteNetPnPEvent 所需要的输入参数。在协议驱动的ProtocolNetPnPEvent 函数返回NDIS_STATUS_PENDING时,必须调用NdisCompleteNetPnPEvent 函数。

协议驱动应该总是成功的处理NetEventQueryPower 事件。在建立了一个活动的连接之后,协议驱动可以调用PoRegisterSystemState 函数来注册一个连续的忙碌状态。在状态生效的时间内,电源管理系统将不会进入休眠状态。在连接不可用之后,协议驱动通过调用PoUnregisterSystemState 取消忙碌状态。协议驱动不应该尝试通过失败处理NetEventQueryPower 事件来防止系统进入休眠状态。NetEventQueryPower 事件总是在NetEventSetPower 事件之后。指定底层驱动当前电源状态的NetEventSetPower 事件实际上取消了NetEventQueryPower 事件。

如果协议驱动无法释放设备(比如因为设备正在被使用),那么它必须在NetEventQueryRemoveDevice 事件中返回NDIS_STATUS_FAILURE。

协议驱动应该总是在NetEventCancelRemoveDevice, a NetEventReconfigure, NetEventBindList, NetEventBindsComplete, NetEventPnPCapabilities, NetEventPause, or NetEventPortDeactivation事件的处理中返回DIS_STATUS_SUCCESS.

当处理NetEventReconfigure 或者NetEventBindList时,协议驱动应该验证与事件的联系。跟多信息请查看NET_PNP_EVENT_NOTIFICATION。

NDIS calls ProtocolNetPnPEvent at IRQL = PASSIVE_LEVEL.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值