reactos/sdk/lib/drivers/wdf/shared/inc/primitives/common/mxgeneral.h
Victor Perevertkin 1f377076d7
[WDF] Fix KMDF so it can compile with ReactOS SDK
Not all files are included, but these are necessary to compile cdrom driver.
So far it can only be statically linked with drivers, a proper
implementation requires wdfldr helper driver
2020-11-03 00:06:27 +03:00

607 lines
12 KiB
C++

/*++
Copyright (c) Microsoft Corporation
ModuleName:
MxGeneral.h
Abstract:
Mode agnostic definitions for general OS
functions used in framework code
See MxGeneralKm.h and MxGeneralUm.h for mode
specific implementations
Author:
Revision History:
--*/
#pragma once
//
// Placeholder macro for a no-op
//
#define DO_NOTHING() (0)
//
// We need to make these static functions of the class
// to force common definition to apply to um and km versions
//
// If we don't do this, um and km definitions can diverge
//
class Mx
{
public:
//
// IsUM/IsKM don't change at runtime
// but defining them as functions makes it more convenient to check
// for UM/KM as compared to using ifdef's in certain places
//
// Since they are forceinlined and return a constant value,
// optimized code is no different than using an ifdef
//
// See FxPoolAllocator in WdfPool.cpp for example of such usage
//
__inline
static
BOOLEAN
IsUM(
);
__inline
static
BOOLEAN
IsKM(
);
__inline
static
MxThread
MxGetCurrentThread(
);
__inline
static
MdEThread
GetCurrentEThread(
);
NTSTATUS
static
MxTerminateCurrentThread(
__in NTSTATUS Status
);
__inline
static
KIRQL
MxGetCurrentIrql(
);
__drv_maxIRQL(HIGH_LEVEL)
__drv_raisesIRQL(NewIrql)
__inline
static
VOID
MxRaiseIrql(
__in KIRQL NewIrql,
__out __deref __drv_savesIRQL PKIRQL OldIrql
);
__drv_maxIRQL(HIGH_LEVEL)
__inline
static
VOID
MxLowerIrql(
__in __drv_restoresIRQL __drv_nonConstant KIRQL NewIrql
);
__inline
static
VOID
MxQueryTickCount(
__out PLARGE_INTEGER TickCount
);
__inline
static
ULONG
MxQueryTimeIncrement(
);
static
DECLSPEC_NORETURN
VOID
MxBugCheckEx(
__in ULONG BugCheckCode,
__in ULONG_PTR BugCheckParameter1,
__in ULONG_PTR BugCheckParameter2,
__in ULONG_PTR BugCheckParameter3,
__in ULONG_PTR BugCheckParameter4
);
__inline
static
VOID
MxDbgBreakPoint(
);
static
VOID
MxDbgPrint(
__drv_formatString(printf)
__in PCSTR DebugMessage,
...
);
__inline
static
VOID
MxAssert(
__in BOOLEAN Condition
);
__inline
static
VOID
MxAssertMsg(
__in LPSTR Message,
__in BOOLEAN Condition
);
_Acquires_lock_(_Global_critical_region_)
__inline
static
VOID
MxEnterCriticalRegion(
);
_Releases_lock_(_Global_critical_region_) //implies _Requires_lock_held_(_Global_critical_region_)
__inline
static
VOID
MxLeaveCriticalRegion(
);
__inline
static
VOID
MxDelayExecutionThread(
__in KPROCESSOR_MODE WaitMode,
__in BOOLEAN Alertable,
__in PLARGE_INTEGER Interval
);
//
// Mode agnostic function to get address of a system function
// Should be used only for Rtl* functions applicable both to
// kernel mode and user mode
//
// User mode version is assumed to reside in ntdll.dll
//
// The argument type is MxFuncName so that it can be defined
// as LPCWSTR in kernel mode and LPCSTR in user mode
// which is what MmGetSystemRoutineAddress and GetProcAddress
// expect respectively
//
__inline
static
PVOID
MxGetSystemRoutineAddress(
__in MxFuncName FuncName
);
__inline
static
VOID
MxReferenceObject(
__in PVOID Object
);
__inline
static
VOID
MxDereferenceObject(
__in PVOID Object
);
__inline
static
VOID
MxInitializeRemoveLock(
__in MdRemoveLock Lock,
__in ULONG AllocateTag,
__in ULONG MaxLockedMinutes,
__in ULONG HighWatermark
);
__inline
static
NTSTATUS
MxAcquireRemoveLock(
__in MdRemoveLock RemoveLock,
__in_opt PVOID Tag
);
__inline
static
VOID
MxReleaseRemoveLock(
__in MdRemoveLock RemoveLock,
__in PVOID Tag
);
__inline
static
VOID
MxReleaseRemoveLockAndWait(
__in MdRemoveLock RemoveLock,
__in PVOID Tag
);
__inline
static
BOOLEAN
MxHasEnoughRemainingThreadStack(
VOID
);
_Releases_lock_(_Global_cancel_spin_lock_) //implies _Requires_lock_held_(_Global_cancel_spin_lock_)
__drv_requiresIRQL(DISPATCH_LEVEL)
__inline
static
VOID
ReleaseCancelSpinLock(
__in __drv_restoresIRQL __drv_useCancelIRQL KIRQL Irql
);
__inline
static
NTSTATUS
CreateCallback(
__out PCALLBACK_OBJECT *CallbackObject,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__in BOOLEAN Create,
__in BOOLEAN AllowMultipleCallbacks
);
__inline
static
PVOID
RegisterCallback(
__in PCALLBACK_OBJECT CallbackObject,
__in MdCallbackFunction CallbackFunction,
__in PVOID CallbackContext
);
__inline
static
VOID
UnregisterCallback(
__in PVOID CbRegistration
);
static
VOID
MxGlobalInit(
VOID
);
__inline
static
VOID
MxUnlockPages(
__in PMDL Mdl
);
__inline
static
PVOID
MxGetSystemAddressForMdlSafe(
__inout PMDL Mdl,
__in ULONG Priority
);
__inline
static
VOID
MxBuildMdlForNonPagedPool(
__inout PMDL Mdl
);
__inline
static
PVOID
MxGetDriverObjectExtension(
__in MdDriverObject DriverObject,
__in PVOID ClientIdentificationAddress
);
__inline
static
NTSTATUS
MxAllocateDriverObjectExtension(
_In_ MdDriverObject DriverObject,
_In_ PVOID ClientIdentificationAddress,
_In_ ULONG DriverObjectExtensionSize,
// When successful, this always allocates already-aliased memory.
_Post_ _At_(*DriverObjectExtension, _When_(return==0,
__drv_aliasesMem __drv_allocatesMem(Mem) _Post_notnull_))
_When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize))
PVOID *DriverObjectExtension
);
__inline
static
MdDeviceObject
MxGetAttachedDeviceReference(
__in MdDeviceObject DriverObject
);
__inline
static
VOID
MxDeleteSymbolicLink(
__in PUNICODE_STRING Link
);
__inline
static
VOID
MxDeleteNPagedLookasideList(
_In_ PNPAGED_LOOKASIDE_LIST LookasideList
);
__inline
static
VOID
MxDeletePagedLookasideList(
_In_ PPAGED_LOOKASIDE_LIST LookasideList
);
__inline
static
VOID
MxInitializeNPagedLookasideList(
_Out_ PNPAGED_LOOKASIDE_LIST Lookaside,
_In_opt_ PALLOCATE_FUNCTION Allocate,
_In_opt_ PFREE_FUNCTION Free,
_In_ ULONG Flags,
_In_ SIZE_T Size,
_In_ ULONG Tag,
_In_ USHORT Depth
);
__inline
static
VOID
MxInitializePagedLookasideList(
_Out_ PPAGED_LOOKASIDE_LIST Lookaside,
_In_opt_ PALLOCATE_FUNCTION Allocate,
_In_opt_ PFREE_FUNCTION Free,
_In_ ULONG Flags,
_In_ SIZE_T Size,
_In_ ULONG Tag,
_In_ USHORT Depth
);
__inline
static
VOID
MxDeleteDevice(
_In_ MdDeviceObject Device
);
static
VOID
MxDetachDevice(
_Inout_ MdDeviceObject Device
);
__inline
static
MdDeviceObject
MxAttachDeviceToDeviceStack(
_In_ MdDeviceObject SourceDevice,
_In_ MdDeviceObject TargetDevice
);
__inline
static
NTSTATUS
MxCreateDeviceSecure(
_In_ MdDriverObject DriverObject,
_In_ ULONG DeviceExtensionSize,
_In_opt_ PUNICODE_STRING DeviceName,
_In_ DEVICE_TYPE DeviceType,
_In_ ULONG DeviceCharacteristics,
_In_ BOOLEAN Exclusive,
_In_ PCUNICODE_STRING DefaultSDDLString,
_In_opt_ LPCGUID DeviceClassGuid,
_Out_ MdDeviceObject *DeviceObject
);
__inline
static
NTSTATUS
MxCreateDevice(
_In_ MdDriverObject DriverObject,
_In_ ULONG DeviceExtensionSize,
_In_opt_ PUNICODE_STRING DeviceName,
_In_ DEVICE_TYPE DeviceType,
_In_ ULONG DeviceCharacteristics,
_In_ BOOLEAN Exclusive,
_Out_ MdDeviceObject *DeviceObject
);
__inline
static
NTSTATUS
MxCreateSymbolicLink(
_In_ PUNICODE_STRING SymbolicLinkName,
_In_ PUNICODE_STRING DeviceName
);
__inline
static
VOID
MxFlushQueuedDpcs(
);
__inline
static
NTSTATUS
MxOpenKey(
_Out_ PHANDLE KeyHandle,
_In_ ACCESS_MASK DesiredAccess,
_In_ POBJECT_ATTRIBUTES ObjectAttributes
);
__inline
static
NTSTATUS
MxSetDeviceInterfaceState(
_In_ PUNICODE_STRING SymbolicLinkName,
_In_ BOOLEAN Enable
);
__inline
static
NTSTATUS
MxRegisterDeviceInterface(
_In_ PDEVICE_OBJECT PhysicalDeviceObject,
_In_ const GUID *InterfaceClassGuid,
_In_opt_ PUNICODE_STRING ReferenceString,
_Out_ PUNICODE_STRING SymbolicLinkName
);
__inline
static
NTSTATUS
MxDeleteKey(
_In_ HANDLE KeyHandle
);
__inline
static
VOID
MxInitializeMdl(
_In_ PMDL MemoryDescriptorList,
_In_ PVOID BaseVa,
_In_ SIZE_T Length
);
__inline
static
PVOID
MxGetMdlVirtualAddress(
_In_ PMDL Mdl
);
__inline
static
VOID
MxBuildPartialMdl(
_In_ PMDL SourceMdl,
_Inout_ PMDL TargetMdl,
_In_ PVOID VirtualAddress,
_In_ ULONG Length
);
__inline
static
VOID
MxQuerySystemTime(
_Out_ PLARGE_INTEGER CurrentTime
);
__inline
static
NTSTATUS
MxSetValueKey(
_In_ HANDLE KeyHandle,
_In_ PUNICODE_STRING ValueName,
_In_opt_ ULONG TitleIndex,
_In_ ULONG Type,
_In_opt_ PVOID Data,
_In_ ULONG DataSize
);
__inline
static
NTSTATUS
MxQueryValueKey(
_In_ HANDLE KeyHandle,
_In_ PUNICODE_STRING ValueName,
_In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
_Out_opt_ PVOID KeyValueInformation,
_In_ ULONG Length,
_Out_ PULONG ResultLength
);
__inline
static
NTSTATUS
MxReferenceObjectByHandle(
__in HANDLE Handle,
__in ACCESS_MASK DesiredAccess,
__in_opt POBJECT_TYPE ObjectType,
__in KPROCESSOR_MODE AccessMode,
__out PVOID *Object,
__out_opt POBJECT_HANDLE_INFORMATION HandleInformation
);
__inline
static
NTSTATUS
MxUnRegisterPlugPlayNotification(
__in __drv_freesMem(Pool) PVOID NotificationEntry
);
__inline
static
NTSTATUS
MxClose (
__in HANDLE Handle
);
__inline
static
KIRQL
MxAcquireInterruptSpinLock(
_Inout_ PKINTERRUPT Interrupt
);
__inline
static
VOID
MxReleaseInterruptSpinLock(
_Inout_ PKINTERRUPT Interrupt,
_In_ KIRQL OldIrql
);
__inline
static
BOOLEAN
MxInsertQueueDpc(
__inout PRKDPC Dpc,
__in_opt PVOID SystemArgument1,
__in_opt PVOID SystemArgument2
);
};