Dispatch Routine IRQL and Thread Context

The following table summarizes the IRQL and thread context requirements for file system filter driver dispatch routines.

DriverEntry routines are called in the context of a system thread at IRQL = PASSIVE_LEVEL.

  Most drivers' dispatch routines are called in an arbitrary thread context at IRQL = PASSIVE_LEVEL, with the following exceptions:

1. Any highest-level driver's dispatch routines are called in the context of the thread that originated the I/O request, which is commonly a user-mode application thread.

    In other words, the dispatch routines of file system drivers and other highest-level drivers are called in a   nonarbitrary thread context at IRQL = PASSIVE_LEVEL.

2.The DispatchReadDispatchWrite, and DispatchDeviceControl routines of lowest-level device drivers, and of intermediate drivers layered above them in the system paging path, can be called at IRQL = APC_LEVEL and in an arbitrary thread context.

   The DispatchRead and/or DispatchWrite routines, and any other routine that also processes read and/or write requests in such a lowest-level device or intermediate driver, must be resident at all timesThese driver routines can neither be pageable nor be part of a driver's pageable-image section; they must not access any pageable memory. Furthermore, they should not be dependent on any blocking calls (such as KeWaitForSingleObject with a nonzero time-out).

3. The DispatchPower routine of drivers in the hibernation and/or paging paths can be called at IRQL = DISPATCH_LEVEL. TheDispatchPnP routines of such drivers must be prepared to handle PnP  IRP_MN_DEVICE_USAGE_NOTIFICATION requests.

4. The DispatchPower routine of drivers that require inrush power at start-up can be called at IRQL = DISPATCH_LEVEL. 

Dispatch Routine Caller's IRQL: Caller's Thread Context:
Cleanup PASSIVE_LEVEL   Nonarbitrary
Close APC_LEVEL Arbitrary
Create PASSIVE_LEVEL Nonarbitrary
DeviceControl (except paging I/O) PASSIVE_LEVEL Nonarbitrary
DeviceControl (paging I/O path) APC_LEVEL Arbitrary
DirectoryControl APC_LEVEL Arbitrary
FlushBuffers PASSIVE_LEVEL Nonarbitrary
FsControl (except paging I/O) PASSIVE_LEVEL Nonarbitrary
FsControl (paging I/O path) APC_LEVEL Arbitrary
LockControl PASSIVE_LEVEL Nonarbitrary
PnP PASSIVE_LEVEL Arbitrary
QueryEa PASSIVE_LEVEL Nonarbitrary
QueryInformation PASSIVE_LEVEL Nonarbitrary
QueryQuota PASSIVE_LEVEL Nonarbitrary
QuerySecurity PASSIVE_LEVEL Nonarbitrary
QueryVolumeInfo PASSIVE_LEVEL Nonarbitrary
Read (except paging I/O) PASSIVE_LEVEL Nonarbitrary
Read (paging I/O path) APC_LEVEL Arbitrary
SetEa PASSIVE_LEVEL Nonarbitrary
SetInformation PASSIVE_LEVEL Nonarbitrary
SetQuota PASSIVE_LEVEL Nonarbitrary
SetSecurity PASSIVE_LEVEL Nonarbitrary
SetVolumeInfo PASSIVE_LEVEL Nonarbitrary
Shutdown APC_LEVEL Arbitrary
Write (except paging I/O) PASSIVE_LEVEL Nonarbitrary
Write (paging I/O path) APC_LEVEL

Arbitrary

 

IRQL等级:

PASSIVE_LEVEL:普通线程执行的中断等级;

 APC_LEVEL:异步过程调用等级;

 DISPATCH_LEVEL:线程分派(调度)和延迟过程调用中断等级。在此等级和更高等级上线程调度会被挂起(不再有线程调度)。此等级上不能使用分页内存。

 

 

 

你可能感兴趣的:(thread,职场,Dispatch,休闲,routine,IRQL,Contex)