reactos/sdk/lib/drivers/wdf/shared/inc/private/common/fxirp.hpp

845 lines
12 KiB
C++
Raw Normal View History

/*++
Copyright (c) Microsoft Corporation
Module Name:
FxIrp.hpp
Abstract:
This module implements a class for handling irps.
Author:
Environment:
Both kernel and user mode
Revision History:
// A function for when not assigning
MdIrp
GetIrp(
VOID
);
VOID
CompleteRequest(
__in_opt CCHAR PriorityBoost=IO_NO_INCREMENT
);
NTSTATUS
CallDriver(
__in MdDeviceObject DeviceObject
);
NTSTATUS
PoCallDriver(
__in MdDeviceObject DeviceObject
);
VOID
StartNextPowerIrp(
);
MdCompletionRoutine
GetNextCompletionRoutine(
VOID
);
VOID
SetCompletionRoutine(
__in MdCompletionRoutine CompletionRoutine,
__in PVOID Context,
__in BOOLEAN InvokeOnSuccess = TRUE,
__in BOOLEAN InvokeOnError = TRUE,
__in BOOLEAN InvokeOnCancel = TRUE
);
VOID
SetCompletionRoutineEx(
__in MdDeviceObject DeviceObject,
__in MdCompletionRoutine CompletionRoutine,
__in PVOID Context,
__in BOOLEAN InvokeOnSuccess = TRUE,
__in BOOLEAN InvokeOnError = TRUE,
__in BOOLEAN InvokeOnCancel = TRUE
);
MdCancelRoutine
SetCancelRoutine(
__in_opt MdCancelRoutine CancelRoutine
);
//
// SendIrpSynchronously achieves synchronous behavior by waiting on an
// event after submitting the IRP. The event creation can fail in UM, but
// not in KM. Hence, in UM the return code could either indicate event
// creation failure or it could indicate the status set on the IRP by the
// lower driver. In KM, the return code only indicates the status set on
// the IRP by the lower lower, because event creation cannot fail.
//
CHECK_RETURN_IF_USER_MODE
NTSTATUS
SendIrpSynchronously(
__in MdDeviceObject DeviceObject
);
VOID
CopyCurrentIrpStackLocationToNext(
VOID
);
VOID
CopyToNextIrpStackLocation(
__in PIO_STACK_LOCATION Stack
);
VOID
SetNextIrpStackLocation(
VOID
);
UCHAR
GetMajorFunction(
VOID
);
UCHAR
GetMinorFunction(
VOID
);
UCHAR
GetCurrentStackFlags(
VOID
);
MdFileObject
GetCurrentStackFileObject(
VOID
);
KPROCESSOR_MODE
GetRequestorMode(
VOID
);
VOID
SetContext(
__in ULONG Index,
__in PVOID Value
);
VOID
SetSystemBuffer(
__in PVOID Value
);
VOID
SetUserBuffer(
__in PVOID Value
);
VOID
SetMdlAddress(
__in PMDL Value
);
VOID
SetFlags(
__in ULONG Flags
);
PVOID
GetContext(
__in ULONG Index
);
ULONG
GetFlags(
VOID
);
PIO_STACK_LOCATION
GetCurrentIrpStackLocation(
VOID
);
PIO_STACK_LOCATION
GetNextIrpStackLocation(
VOID
);
static
PIO_STACK_LOCATION
_GetAndClearNextStackLocation(
__in MdIrp Irp
);
VOID
SkipCurrentIrpStackLocation(
VOID
);
VOID
MarkIrpPending(
);
BOOLEAN
PendingReturned(
);
VOID
PropagatePendingReturned(
VOID
);
VOID
SetStatus(
__in NTSTATUS Status
);
NTSTATUS
GetStatus(
);
BOOLEAN
Cancel(
VOID
);
VOID
SetCancel(
__in BOOLEAN Cancel
);
BOOLEAN
IsCanceled(
);
KIRQL
GetCancelIrql(
);
VOID
SetInformation(
__in ULONG_PTR Information
);
ULONG_PTR
GetInformation(
);
CCHAR
GetCurrentIrpStackLocationIndex(
);
CCHAR
GetStackCount(
);
PLIST_ENTRY
ListEntry(
);
PVOID
GetSystemBuffer(
);
PVOID
GetOutputBuffer(
);
PMDL
GetMdl(
);
PMDL*
GetMdlAddressPointer(
);
PVOID
GetUserBuffer(
);
VOID
Reuse(
__in NTSTATUS Status = STATUS_SUCCESS
);
//
// Methods for IO_STACK_LOCATION members
//
VOID
SetMajorFunction(
__in UCHAR MajorFunction
);
VOID
SetMinorFunction(
__in UCHAR MinorFunction
);
//
// Get Methods for IO_STACK_LOCATION.Parameters.Power
//
SYSTEM_POWER_STATE_CONTEXT
GetParameterPowerSystemPowerStateContext(
);
POWER_STATE_TYPE
GetParameterPowerType(
);
POWER_STATE
GetParameterPowerState(
);
DEVICE_POWER_STATE
GetParameterPowerStateDeviceState(
);
SYSTEM_POWER_STATE
GetParameterPowerStateSystemState(
);
POWER_ACTION
GetParameterPowerShutdownType(
);
MdFileObject
GetFileObject(
VOID
);
//
// Get/Set Method for IO_STACK_LOCATION.Parameters.QueryDeviceRelations
//
DEVICE_RELATION_TYPE
GetParameterQDRType(
);
VOID
SetParameterQDRType(
__in DEVICE_RELATION_TYPE DeviceRelation
);
//
// Get/Set Methods for IO_STACK_LOCATION.Parameters.DeviceCapabilities
//
PDEVICE_CAPABILITIES
GetParameterDeviceCapabilities(
);
VOID
SetCurrentDeviceObject(
__in MdDeviceObject DeviceObject
);
MdDeviceObject
GetDeviceObject(
VOID
);
VOID
SetParameterDeviceCapabilities(
__in PDEVICE_CAPABILITIES DeviceCapabilities
);
//
// Get/Set Methods for IO_STACK_LOCATION.Parameters.Write.ByteOffset.QuadPart
//
LONGLONG
GetParameterWriteByteOffsetQuadPart(
);
VOID
SetNextParameterWriteByteOffsetQuadPart(
__in LONGLONG DeviceOffset
);
//
// Get/Set Methods for IO_STACK_LOCATION.Parameters.Write.Length
//
ULONG
GetCurrentParameterWriteLength(
);
VOID
SetNextParameterWriteLength(
__in ULONG IoLength
);
PVOID*
GetNextStackParameterOthersArgument1Pointer(
);
VOID
SetNextStackParameterOthersArgument1(
__in PVOID Argument1
);
PVOID*
GetNextStackParameterOthersArgument2Pointer(
);
PVOID*
GetNextStackParameterOthersArgument4Pointer(
);
//
// Get/Set Methods for IO_STACK_LOCATION.Parameters.StartDevice
//
PCM_RESOURCE_LIST
GetParameterAllocatedResources(
);
VOID
SetParameterAllocatedResources(
__in PCM_RESOURCE_LIST AllocatedResources
);
PCM_RESOURCE_LIST
GetParameterAllocatedResourcesTranslated(
);
VOID
SetParameterAllocatedResourcesTranslated(
__in PCM_RESOURCE_LIST AllocatedResourcesTranslated
);
//
// Get Method for IO_STACK_LOCATION.Parameters.QueryDeviceText
//
LCID
GetParameterQueryDeviceTextLocaleId(
);
DEVICE_TEXT_TYPE
GetParameterQueryDeviceTextType(
);
//
// Get Method for IO_STACK_LOCATION.Parameters.SetLock
//
BOOLEAN
GetParameterSetLockLock(
);
//
// Get Method for IO_STACK_LOCATION.Parameters.QueryId
//
BUS_QUERY_ID_TYPE
GetParameterQueryIdType(
);
//
// Get/Set Methods for IO_STACK_LOCATION.Parameters.QueryInterface
//
PINTERFACE
GetParameterQueryInterfaceInterface(
);
const GUID*
GetParameterQueryInterfaceType(
);
USHORT
GetParameterQueryInterfaceVersion(
);
USHORT
GetParameterQueryInterfaceSize(
);
PVOID
GetParameterQueryInterfaceInterfaceSpecificData(
);
VOID
SetParameterQueryInterfaceInterface(
__in PINTERFACE Interface
);
VOID
SetParameterQueryInterfaceType(
__in const GUID* InterfaceType
);
VOID
SetParameterQueryInterfaceVersion(
__in USHORT Version
);
VOID
SetParameterQueryInterfaceSize(
__in USHORT Size
);
VOID
SetParameterQueryInterfaceInterfaceSpecificData(
__in PVOID InterfaceSpecificData
);
//
// Get Method for IO_STACK_LOCATION.Parameters.UsageNotification
//
DEVICE_USAGE_NOTIFICATION_TYPE
GetParameterUsageNotificationType(
);
BOOLEAN
GetParameterUsageNotificationInPath(
);
VOID
SetParameterUsageNotificationInPath(
__in BOOLEAN InPath
);
BOOLEAN
GetNextStackParameterUsageNotificationInPath(
);
ULONG
GetParameterIoctlCode(
VOID
);
ULONG
GetParameterIoctlCodeBufferMethod(
VOID
);
ULONG
GetParameterIoctlInputBufferLength(
VOID
);
ULONG
GetParameterIoctlOutputBufferLength(
VOID
);
PVOID
GetParameterIoctlType3InputBuffer(
VOID
);
//
// Set Methods for IO_STACK_LOCATION.Parameters.DeviceControl members
//
VOID
SetParameterIoctlCode(
__in ULONG DeviceIoControlCode
);
VOID
SetParameterIoctlInputBufferLength(
__in ULONG InputBufferLength
);
VOID
SetParameterIoctlOutputBufferLength(
__in ULONG OutputBufferLength
);
VOID
SetParameterIoctlType3InputBuffer(
__in PVOID Type3InputBuffer
);
ULONG
GetParameterReadLength(
VOID
);
ULONG
GetParameterWriteLength(
VOID
);
VOID
SetNextStackFlags(
__in UCHAR Flags
);
VOID
SetNextStackFileObject(
_In_ MdFileObject FileObject
);
PVOID
GetCurrentParametersPointer(
VOID
);
//
// Methods for IO_STACK_LOCATION
//
VOID
ClearNextStack(
VOID
);
VOID
ClearNextStackLocation(
VOID
);
VOID
InitNextStackUsingStack(
__in FxIrp* Irp
);
ULONG
GetCurrentFlags(
VOID
);
VOID
FreeIrp(
VOID
);
MdEThread
GetThread(
VOID
);
BOOLEAN
Is32bitProcess(
VOID
);
private:
static
NTSTATUS
_IrpSynchronousCompletion(
__in MdDeviceObject DeviceObject,
__in MdIrp OriginalIrp,
__in PVOID Context
);
public:
_Must_inspect_result_
static
MdIrp
AllocateIrp(
_In_ CCHAR StackSize,
_In_opt_ FxDevice* Device = NULL
);
static
MdIrp
GetIrpFromListEntry(
__in PLIST_ENTRY Ple
);
_Must_inspect_result_
static
NTSTATUS
RequestPowerIrp(
__in MdDeviceObject DeviceObject,
__in UCHAR MinorFunction,
__in POWER_STATE PowerState,
__in MdRequestPowerComplete CompletionFunction,
__in PVOID Context
);
PIO_STATUS_BLOCK
GetStatusBlock(
VOID
);
PVOID
GetDriverContext(
);
ULONG
GetDriverContextSize(
);
VOID
CopyParameters(
_Out_ PWDF_REQUEST_PARAMETERS Parameters
);
VOID
CopyStatus(
_Out_ PIO_STATUS_BLOCK StatusBlock
);
BOOLEAN
HasStack(
_In_ UCHAR StackCount
);
BOOLEAN
IsCurrentIrpStackLocationValid(
VOID
);
#if (FX_CORE_MODE == FX_CORE_USER_MODE)
IWudfIoIrp*
GetIoIrp(
VOID
);
IWudfPnpIrp*
GetPnpIrp(
VOID
);
#endif
};
//
// FxAutoIrp adds value to FxIrp by automatically freeing the associated MdIrp
// when it goes out of scope
//
struct FxAutoIrp : public FxIrp {
FxAutoIrp(
__in_opt MdIrp Irp = NULL
) :
FxIrp(Irp)
{
}
~FxAutoIrp();
};
#endif // _FXIRP_H_