驱动程序开发人员应尽可能将代码指定为可分页代码,为必须驻留内存的代码释放系统空间。 可以使用 NDIS_PAGEABLE_FUNCTION 宏将函数标记为可分页。 IRQL、资源管理功能和函数的其他特征可能会禁止该函数进行分页。
每个 ProtocolXxx 函数在从 PASSIVE_LEVEL 到 DISPATCH_LEVEL 范围内的 IRQL 上运行。 以 IRQL = PASSIVE_LEVEL独占方式运行的函数应标记为可分页。
如果一个驱动程序函数在 IRQL = PASSIVE_LEVEL 上运行,并且既不调用也不被运行在 IRQL = DISPATCH_LEVEL 上的任何函数调用(例如获取旋转锁的函数),那么这个函数就可以分页。 获取自旋锁会导致获取线程的 IRQL 被提升到 DISPATCH_LEVEL。 在 IRQL = PASSIVE_LEVEL 运行的驱动程序函数(如 ProtocolBindAdapterEx)不得调用在 IRQL >= DISPATCH_LEVEL 运行的任何 NdisXxx 函数(如果该驱动程序函数标记为可分页代码)。 有关每个 NdisXxx 函数的 IRQL 的详细信息,请参阅 NDIS 库函数。
NDIS 协议驱动程序的 DriverEntry 函数以及仅从 DriverEntry 调用的代码应通过使用 NDIS_INIT_FUNCTION 宏指定为仅初始化代码。 假定使用此宏标识的代码仅在系统初始化时运行一次,因此仅在该时间映射。 标记为仅初始化的函数在返回后将被丢弃。