225 lines
6.0 KiB
C
225 lines
6.0 KiB
C
/*++
|
|
|
|
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
|
|
);
|
|
|