/*++ Copyright (c) 2000 Microsoft Corporation Module Name: vfirp.h Abstract: This module contains prototypes for functions used to manage IRPs used in the verification process. Author: Adrian J. Oney (adriao) 20-Apr-1998 Environment: Kernel mode Revision History: AdriaO 05/02/2000 - Seperated out from ntos\io\hashirp.h --*/ struct _IOV_STACK_LOCATION; struct _IOV_REQUEST_PACKET; struct _IOFCALLDRIVER_STACKDATA; typedef struct _IOV_STACK_LOCATION *PIOV_STACK_LOCATION; typedef struct _IOV_REQUEST_PACKET *PIOV_REQUEST_PACKET; typedef struct _IOV_SESSION_DATA *PIOV_SESSION_DATA; typedef struct _IOFCALLDRIVER_STACKDATA *PIOFCALLDRIVER_STACKDATA; // // Mini-snapshots of the IRP are stored on the stack for cases when the // verifier needs to inform the developer as to the mistake, but no longer // has the original IRP in memory. Because these may be stored on the stack, // they need to be small and light. // typedef struct _IRP_MINI_SNAPSHOT { PIRP Irp; IO_STACK_LOCATION IoStackLocation; } IRP_MINI_SNAPSHOT, *PIRP_MINI_SNAPSHOT; typedef struct _IOV_STACK_LOCATION { BOOLEAN InUse; ULONG Flags; PIOV_STACK_LOCATION RequestsFirstStackLocation; LIST_ENTRY CallStackData; PIO_STACK_LOCATION IrpSp; PVOID LastDispatch; LARGE_INTEGER PerfDispatchStart; LARGE_INTEGER PerfStackLocationStart; PDEVICE_OBJECT ReferencingObject; LONG ReferencingCount; IO_STATUS_BLOCK InitialStatusBlock; IO_STATUS_BLOCK LastStatusBlock; PETHREAD ThreadDispatchedTo; } IOV_STACK_LOCATION; typedef struct _IOV_SESSION_DATA { PIOV_REQUEST_PACKET IovRequestPacket; LONG SessionRefCount; LIST_ENTRY SessionLink; ULONG SessionFlags; PETHREAD OriginatorThread; PDEVICE_OBJECT DeviceLastCalled; // Last device called ULONG ForwardMethod; PIRP BestVisibleIrp; PVERIFIER_SETTINGS_SNAPSHOT VerifierSettings; IOV_STACK_LOCATION StackData[ANYSIZE_ARRAY]; } IOV_SESSION_DATA; typedef struct _IOFCALLDRIVER_STACKDATA { PIOV_SESSION_DATA IovSessionData; PIOV_STACK_LOCATION IovStackLocation; PIOV_REQUEST_PACKET IovPacket; ULONG Flags; LIST_ENTRY SharedLocationList; PDRIVER_DISPATCH DispatchRoutine; NTSTATUS ExpectedStatus; NTSTATUS NewStatus; PDEVICE_OBJECT RemovePdo; IRP_MINI_SNAPSHOT IrpSnapshot; } IOFCALLDRIVER_STACKDATA; typedef struct _IOFCOMPLETEREQUEST_STACKDATA { PIOV_SESSION_DATA IovSessionData; PIOV_REQUEST_PACKET IovRequestPacket; BOOLEAN IsRemoveIrp; LONG LocationsAdvanced; ULONG RaisedCount; KIRQL PreviousIrql; PVOID CompletionRoutine; } IOFCOMPLETEREQUEST_STACKDATA, *PIOFCOMPLETEREQUEST_STACKDATA; VOID FASTCALL VfIrpInit( VOID ); PIRP FASTCALL VfIrpAllocate( IN CCHAR StackSize ); VOID FASTCALL VfIrpMakeTouchable( IN PIRP Irp ); VOID FASTCALL VfIrpMakeUntouchable( IN PIRP Irp OPTIONAL ); VOID FASTCALL VfIrpFree( IN PIRP Irp OPTIONAL ); VOID FASTCALL VerifierIoAllocateIrp1( IN CCHAR StackSize, IN BOOLEAN ChargeQuota, IN OUT PIRP *IrpPointer ); VOID FASTCALL VerifierIoAllocateIrp2( IN PIRP Irp ); VOID FASTCALL VerifierIoFreeIrp( IN PIRP Irp, IN OUT PBOOLEAN FreeHandled ); VOID FASTCALL VerifierIoInitializeIrp( IN OUT PIRP Irp, IN USHORT PacketSize, IN CCHAR StackSize, IN OUT PBOOLEAN InitializeHandled ); BOOLEAN FASTCALL VfIrpReserveCallStackData( IN PIRP Irp, OUT PIOFCALLDRIVER_STACKDATA *IofCallDriverStackData ); VOID FASTCALL VfIrpPrepareAllocaCallStackData( OUT PIOFCALLDRIVER_STACKDATA IofCallDriverStackData ); VOID FASTCALL VfIrpReleaseCallStackData( IN PIOFCALLDRIVER_STACKDATA IofCallDriverStackData OPTIONAL ); // // VfIrpCallDriverPreprocess is a macro function that may do an alloca as // part of it's operation. As such callers must be careful not to use // variable lengthed arrays in a scope that encompasses // VfIrpCallDriverPreProcess but not VfIrpCallDriverPostProcess. // #define VfIrpCallDriverPreProcess(DeviceObject, IrpPointer, CallStackData, CallerAddress) \ if (!VfIrpReserveCallStackData(*(IrpPointer), (CallStackData))) { \ *(CallStackData) = alloca(sizeof(IOFCALLDRIVER_STACKDATA)); \ VfIrpPrepareAllocaCallStackData(*(CallStackData)); \ } \ IovpCallDriver1((DeviceObject), (IrpPointer), *(CallStackData), (CallerAddress)) #define VfIrpCallDriverPostProcess(DeviceObject, FinalStatus, CallStackData) \ IovpCallDriver2(DeviceObject, FinalStatus, CallStackData); \ VfIrpReleaseCallStackData(CallStackData) BOOLEAN VfIrpSendSynchronousIrp( IN PDEVICE_OBJECT DeviceObject, IN PIO_STACK_LOCATION TopStackLocation, IN BOOLEAN Untouchable, IN NTSTATUS InitialStatus, IN ULONG_PTR InitialInformation OPTIONAL, OUT ULONG_PTR *FinalInformation OPTIONAL, OUT NTSTATUS *FinalStatus OPTIONAL ); VOID FASTCALL VfIrpWatermark( IN PIRP Irp, IN ULONG Flags );