Using Dispatcher Objects
Except for Thread objects themselves, the driver must allocate storage for any dispatcher objects that are used. The objects must be permanently resident and are, therefore, usually allocated within the Device or Controller Extension. In any case, they must be in nonpaged memory.
Also, the dispatch object must be initialized once with the proper KeInitializeXxx function before it is used. Since the initialization functions can only be called at PASSIVE_LEVEL IRQL, dispatcher objects are usually prepared in the DriverEntry or AddDevice routine.
The following sections describe each category of dispatcher objects in greater detail.
An event is a dispatcher object that must be explicitly set to the signaled ...