协议驱动程序中的可分页和可丢弃代码

驱动程序开发人员应尽可能将代码指定为可分页代码,为必须驻留在内存中的代码释放系统空间。 可以使用 NDIS_PAGEABLE_FUNCTION 宏将函数标记为可分页。 函数的 IRQL、资源管理功能和其他特征可能会禁止该函数可分页。

每个 ProtocolXxx 函数在 IRQL 上运行,范围从 PASSIVE_LEVEL 到 DISPATCH_LEVEL。 以 IRQL = PASSIVE_LEVEL 独占方式运行的函数应标记为可分页。

只要在 IRQL = PASSIVE_LEVEL 上运行的驱动程序函数既不调用也不由在 IRQL >= DISPATCH_LEVEL运行的任何函数(例如获取旋转锁的函数)调用,就可以使该函数可分页。 获取旋转锁会导致获取线程的 IRQL 提升为DISPATCH_LEVEL。 在 IRQL = PASSIVE_LEVEL运行的驱动程序函数(如 ProtocolBindAdapterEx)不得调用在 IRQL >= DISPATCH_LEVEL下运行的任何 NdisXxx 函数(如果该驱动程序函数被标记为可分页代码)。 有关每个 NdisXxx 函数的 IRQL 的详细信息,请参阅 NDIS 库函数

应使用 NDIS_INIT_FUNCTION 宏将 NDIS 协议驱动程序的 DriverEntry 函数以及仅从 DriverEntry 调用 的代码 指定为仅初始化代码。 假定使用此宏标识的代码在系统初始化时只运行一次,因此,仅在该时间内映射代码。 在标记为“仅初始化”的函数返回后,该函数将被丢弃。