/*++ Copyright (c) 1998 Microsoft Corporation Module Name: trackirp.h Abstract: The module associated with the header asserts Irps are handled correctly by drivers. No IRP-major specific testing is done; Author: Adrian J. Oney (adriao) 20-Apr-1998 Revision History: --*/ #ifndef _TRACKIRP_H_ #define _TRACKIRP_H_ #if DBG extern ULONG IovpIrpTrackingSpewLevel; #endif #define IRP_DIAG_HAS_SURROGATE 0x02000000 #define IRP_DIAG_IS_SURROGATE 0x01000000 //#define TRACKFLAG_ACTIVE 0x00000001 #define TRACKFLAG_SURROGATE 0x00000002 #define TRACKFLAG_HAS_SURROGATE 0x00000004 #define TRACKFLAG_PROTECTEDIRP 0x00000008 #define TRACKFLAG_QUEUED_INTERNALLY 0x00000010 #define TRACKFLAG_BOGUS 0x00000020 #define TRACKFLAG_RELEASED 0x00000040 #define TRACKFLAG_SRB_MUNGED 0x00000080 #define TRACKFLAG_SWAPPED_BACK 0x00000100 #define TRACKFLAG_DIRECT_BUFFERED 0x00000200 #define TRACKFLAG_WATERMARKED 0x00100000 #define TRACKFLAG_IO_ALLOCATED 0x00200000 #define TRACKFLAG_UNWOUND_BADLY 0x00400000 #define TRACKFLAG_PASSED_AT_BAD_IRQL 0x02000000 #define TRACKFLAG_IN_TRANSIT 0x40000000 #define STACKFLAG_NO_HANDLER 0x80000000 #define STACKFLAG_REQUEST_COMPLETED 0x40000000 #define STACKFLAG_CHECK_FOR_REFERENCE 0x20000000 #define STACKFLAG_REACHED_PDO 0x10000000 #define STACKFLAG_FIRST_REQUEST 0x08000000 #define STACKFLAG_UNWOUND_PENDING 0x04000000 #define STACKFLAG_FAILURE_FORWARDED 0x02000000 #define STACKFLAG_BOGUS_IRP_TOUCHED 0x01000000 #define CALLFLAG_STACK_DATA_ALLOCATED 0x80000000 #define CALLFLAG_COMPLETED 0x40000000 #define CALLFLAG_IS_REMOVE_IRP 0x20000000 #define CALLFLAG_REMOVING_FDO_STACK_DO 0x10000000 #define CALLFLAG_OVERRIDE_STATUS 0x08000000 #define CALLFLAG_TOPMOST_IN_SLOT 0x04000000 #define CALLFLAG_MARKED_PENDING 0x02000000 #define CALLFLAG_ARRIVED_PENDING 0x01000000 #define ALLOCFLAG_PROTECTEDIRP 0x00000001 #define SESSIONFLAG_UNWOUND_INCONSISTANT 0x00000001 #define SESSIONFLAG_MARKED_INCONSISTANT 0x00000002 #define IRP_SYSTEM_RESTRICTED 0x00000001 #define IRP_BOGUS 0x00000002 #define SL_NOTCOPIED 0x10 #define IRP_ALLOCATION_MONITORED 0x80 #define STARTED_TOP_OF_STACK 1 #define FORWARDED_TO_NEXT_DO 2 #define SKIPPED_A_DO 3 #define STARTED_INSIDE_STACK 4 #define CHANGED_STACKS_AT_BOTTOM 5 #define CHANGED_STACKS_MID_STACK 6 typedef enum { DEFERACTION_QUEUE_WORKITEM, DEFERACTION_QUEUE_PASSIVE_TIMER, DEFERACTION_QUEUE_DISPATCH_TIMER, DEFERACTION_NORMAL } DEFER_ACTION; typedef struct _DEFERRAL_CONTEXT { PIOV_REQUEST_PACKET IovRequestPacket; PIO_COMPLETION_ROUTINE OriginalCompletionRoutine; PVOID OriginalContext; PIRP OriginalIrp; CCHAR OriginalPriorityBoost; PDEVICE_OBJECT DeviceObject; PIO_STACK_LOCATION IrpSpNext; WORK_QUEUE_ITEM WorkQueueItem; KDPC DpcItem; KTIMER DeferralTimer; DEFER_ACTION DeferAction; } DEFERRAL_CONTEXT, *PDEFERRAL_CONTEXT; // // These are in trackirp.c // VOID FASTCALL IovpPacketFromIrp( IN PIRP Irp, OUT PIOV_REQUEST_PACKET *IovPacket ); BOOLEAN FASTCALL IovpCheckIrpForCriticalTracking( IN PIRP Irp ); VOID FASTCALL IovpCallDriver1( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP *IrpPointer, IN OUT PIOFCALLDRIVER_STACKDATA IofCallDriverStackData OPTIONAL ); VOID FASTCALL IovpCallDriver2( IN PDEVICE_OBJECT DeviceObject, IN OUT NTSTATUS *FinalStatus, IN PIOFCALLDRIVER_STACKDATA IofCallDriverStackData OPTIONAL ); VOID FASTCALL IovpCompleteRequest1( IN PIRP Irp, IN CCHAR PriorityBoost, IN OUT PIOFCOMPLETEREQUEST_STACKDATA CompletionPacket ); VOID FASTCALL IovpCompleteRequest2( IN PIRP Irp, IN OUT PIOFCOMPLETEREQUEST_STACKDATA CompletionPacket ); VOID FASTCALL IovpCompleteRequest3( IN PIRP Irp, IN PVOID Routine, IN OUT PIOFCOMPLETEREQUEST_STACKDATA CompletionPacket ); VOID FASTCALL IovpCompleteRequest4( IN PIRP Irp, IN NTSTATUS ReturnedStatus, IN OUT PIOFCOMPLETEREQUEST_STACKDATA CompletionPacket ); VOID FASTCALL IovpCompleteRequest5( IN PIRP Irp, IN OUT PIOFCOMPLETEREQUEST_STACKDATA CompletionPacket ); VOID FASTCALL IovpCompleteRequestApc( IN PIRP Irp, IN PVOID BestStackOffset ); VOID FASTCALL IovpCancelIrp( IN PIRP Irp, IN OUT PBOOLEAN CancelHandled, IN OUT PBOOLEAN ReturnValue ); VOID IovpExamineIrpStackForwarding( IN OUT PIOV_REQUEST_PACKET IovPacket, IN BOOLEAN IsNewSession, IN ULONG ForwardMethod, IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID CallerAddress, IN OUT PIO_STACK_LOCATION *IoCurrentStackLocation, OUT PIO_STACK_LOCATION *IoLastStackLocation, OUT ULONG *StackLocationsAdvanced ); NTSTATUS IovpSwapSurrogateIrp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID FASTCALL IovpExamineDevObjForwarding( IN PDEVICE_OBJECT DeviceBeingCalled, IN PDEVICE_OBJECT DeviceLastCalled, OUT PULONG ForwardingTechnique ); VOID FASTCALL IovpFinalizeIrpSettings( IN OUT PIOV_REQUEST_PACKET IrpTrackingData, IN BOOLEAN SurrogateIrpSwapped ); NTSTATUS IovpInternalCompletionTrap( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); NTSTATUS IovpInternalDeferredCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID IovpInternalCompleteAfterWait( IN PVOID Context ); VOID IovpInternalCompleteAtDPC( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); BOOLEAN IovpAdvanceStackDownwards( IN PIOV_STACK_LOCATION StackDataArray, IN CCHAR CurrentLocation, IN PIO_STACK_LOCATION IrpSp, IN PIO_STACK_LOCATION IrpLastSp OPTIONAL, IN ULONG LocationsAdvanced, IN BOOLEAN IsNewRequest, IN BOOLEAN MarkAsTaken, OUT PIOV_STACK_LOCATION *StackLocationInfo ); VOID IovpBuildIrpSnapshot( IN PIRP Irp, OUT IRP_SNAPSHOT *IrpSnapshot ); #define SPECIALIRP_MARK_NON_TRACKABLE(Irp) { \ (Irp)->Flags |= IRPFLAG_EXAMINE_NOT_TRACKED; \ } #define SPECIALIRP_IOF_COMPLETE_1(Irp, PriorityBoost, CompletionPacket) \ {\ IovpCompleteRequest1((Irp), (PriorityBoost), (CompletionPacket));\ } #define SPECIALIRP_IOF_COMPLETE_2(Irp, CompletionPacket) \ {\ IovpCompleteRequest2((Irp), (CompletionPacket));\ } #define SPECIALIRP_IOF_COMPLETE_3(Irp, Routine, CompletionPacket) \ {\ IovpCompleteRequest3((Irp), (Routine), (CompletionPacket));\ } #define SPECIALIRP_IOF_COMPLETE_4(Irp, ReturnedStatus, CompletionPacket) \ {\ IovpCompleteRequest4((Irp), (ReturnedStatus), (CompletionPacket));\ } #define SPECIALIRP_IOF_COMPLETE_5(Irp, CompletionPacket) \ {\ IovpCompleteRequest5((Irp), (CompletionPacket));\ } #define SPECIALIRP_IO_CANCEL_IRP(Irp, CancelHandled, ReturnValue) \ {\ IovpCancelIrp((Irp), (CancelHandled), (ReturnValue));\ } #define SPECIALIRP_WATERMARK_IRP(Irp, Flags) \ {\ IovUtilWatermarkIrp(Irp, Flags);\ } #define SPECIALIRP_IOP_COMPLETE_REQUEST(Irp, StackPointer) \ {\ IovpCompleteRequestApc(Irp, StackPointer);\ } #if DBG #define TRACKIRP_DBGPRINT(txt,level) \ { \ if (IovpIrpTrackingSpewLevel>(level)) { \ DbgPrint##txt ; \ }\ } #else #define TRACKIRP_DBGPRINT(txt,level) #endif #endif // _TRACKIRP_H_