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

231 lines
4.3 KiB
C++
Raw Normal View History

/*++
Copyright (c) Microsoft Corporation
Module Name:
FxPkgGeneral.hpp
Abstract:
This module implements a package to handle general dispath entry points
such as IRP_MJ_CREATE and IRP_MJ_CLOSE.
Author:
Environment:
Both kernel and user mode
Revision History:
--*/
#ifndef _FXPKGGENERAL_H_
#define _FXPKGGENERAL_H_
#include "fxfileobjectcallbacks.hpp"
class FxShutDown : public FxCallback {
public:
PFN_WDF_DEVICE_SHUTDOWN_NOTIFICATION m_Method;
FxShutDown(
VOID
) :
FxCallback(),
m_Method(NULL)
{
}
VOID
Invoke(
__in WDFDEVICE Device
)
{
if (m_Method != NULL) {
CallbackStart();
m_Method(Device);
CallbackEnd();
}
}
};
#define FX_PKG_GENERAL_FLAG_CX_INFO 0x00000001
#define FX_PKG_GENERAL_FLAG_CLIENT_INFO 0x00000002
#define FX_PKG_GENERAL_FLAG_CX_CREATE 0x00000004
#define FX_PKG_GENERAL_FLAG_CLIENT_CREATE 0x00000008
#define FX_PKG_GENERAL_FLAG_CREATE \
(FX_PKG_GENERAL_FLAG_CX_CREATE | FX_PKG_GENERAL_FLAG_CLIENT_CREATE)
class FxPkgGeneral : public FxPackage {
private:
//
// FileObject attributes
//
LONG m_OpenHandleCount;
//
// List of file objects info (driver and cx).
//
LIST_ENTRY m_FileObjectInfoHeadList;
FxIoQueue* m_DefaultQueueForCreates;
FxIoQueue* m_DriverCreatedQueue;
//
// Generic file object flags.
//
ULONG m_Flags;
//
// Execution and synchronization for cx and client driver.
//
WDF_EXECUTION_LEVEL m_ExecutionLevel;
WDF_SYNCHRONIZATION_SCOPE m_SynchronizationScope;
//
// This pointer allows the proper lock to be acquired
// based on the configuration with a minimal of runtime
// checks. This is configured by ConfigureConstraints().
// We basically inherit device's lock.
//
FxCallbackLock* m_CallbackLockPtr;
FxObject* m_CallbackLockObjectPtr;
FxShutDown m_EvtDeviceShutdown;
private:
_Must_inspect_result_
NTSTATUS
OnCreate(
__inout FxIrp* FxIrp
);
_Must_inspect_result_
NTSTATUS
OnClose(
__inout FxIrp* FxIrp
);
BOOLEAN
AcquireRemoveLockForClose(
__inout FxIrp* FxIrp
);
_Must_inspect_result_
NTSTATUS
OnCleanup(
__inout FxIrp* FxIrp
);
_Must_inspect_result_
NTSTATUS
OnShutdown(
__inout FxIrp* FxIrp
);
_Must_inspect_result_
NTSTATUS
ConfigureConstraints(
__in PLIST_ENTRY FileObjInfoList
);
_Must_inspect_result_
NTSTATUS
ConfigureFileObjectClass(
__in PLIST_ENTRY FileObjInfoList
);
VOID
DecrementOpenHandleCount(
VOID
);
_Must_inspect_result_
NTSTATUS
ForwardCreateRequest(
__in FxIrp* FxIrp,
__in MdCompletionRoutine CompletionRoutine,
__in PVOID Context
);
static
MdCompletionRoutineType _CreateCompletionRoutine;
static
MdCompletionRoutineType _CreateCompletionRoutine2;
public:
FxPkgGeneral(
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
__in CfxDevice *Device
);
~FxPkgGeneral();
_Must_inspect_result_
virtual
NTSTATUS
Dispatch(
__inout MdIrp Irp
);
_Must_inspect_result_
NTSTATUS
Initialize(
__in PWDFDEVICE_INIT DeviceInit
);
_Must_inspect_result_
NTSTATUS
PostCreateDeviceInitialize(
__in PWDFDEVICE_INIT Init
);
VOID
CreateCompleted(
__in FxIrp *Irp
);
_Must_inspect_result_
NTSTATUS
ConfigureForwarding(
__in FxIoQueue *FxQueue
);
BOOLEAN
CanDestroyControlDevice(
VOID
);
VOID
GetConstraintsHelper(
__out_opt WDF_EXECUTION_LEVEL* ExecutionLevel,
__out_opt WDF_SYNCHRONIZATION_SCOPE* SynchronizationScope
) ;
FxCallbackLock*
GetCallbackLockPtrHelper(
__deref_out_opt FxObject** LockObject
);
__inline
FxIoQueue*
GetDeafultInternalCreateQueue(
)
{
return m_DefaultQueueForCreates;
}
};
#endif // _FXPKGGENERAL_H_