为防止死锁,用于读写请求的驱动存储驱动程序不应包含可分页代码,也不应试图去访问可分页内存。这是因为驱动程序的读分发例程DispatchRead和写分发例程DispatchWrite能在IRQL > PASSIVE_LEVEL调用,而缺页page I/O发生在IRQL = APC_LEVEL。
类似的规则应用于存储驱动的设备控制分发例程DispatchDeviceControl和一些限制条件。存储驱动程序的设备控制分发例程不应包含任何可分页代码和访问可分页内存。分发例程必须可以接受IOCTL请求——在任意IRQL为其它驱动程序并向下传递请求到驱动栈。驱动程序必须在不能改变IRQL的情况下,传递所有未能处理的IOCTL请求或请求的内容。
然而,Microsoft要求所有的存储IOCTL请求必须在PASSIVE_LEVEL提交。尽管分发例程本身不是可分页的,它能调用可分页子例程来处理存储IOCTL请求。这些子例程能访问可分页内存。
例程,如DriverEntry, Reinitialize, 和Unload,不做任何I/O处理,运行在IRQL = PASSIVE_LEVEL,可以使用可分页代码。
在分页路径中管理存储设备的驱动程序需要特殊考虑。分页文件中参与I/O操作的驱动程序时“分页路径”。当驱动程序在分页路径中,其处理IRP_MJ_POWER的 DispatchPower例程不可以为可分页的。
缺省情况下,驱动程序内核模式代码为不可分页的,也不可为可分页的内核模式驱动程序使用的全局内存。关于如何使用可分页代码,请参考编写驱动代码或可分页数据。