windows-nt/Source/XPSP1/NT/base/ntos/io/trackirp.h
2020-09-26 16:20:57 +08:00

336 lines
8.2 KiB
C

/*++
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_