mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 18:24:02 +00:00
440 lines
8.7 KiB
C++
440 lines
8.7 KiB
C++
/*++
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
FxIoTargetRemote.hpp
|
|
|
|
Abstract:
|
|
|
|
Derivation of FxIoTarget specializing in targets remote to this device
|
|
stack.
|
|
|
|
Author:
|
|
|
|
|
|
|
|
Environment:
|
|
|
|
Both kernel and user mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _FXIOTARGETREMOTE_H_
|
|
#define _FXIOTARGETREMOTE_H_
|
|
|
|
enum FxIoTargetRemoteCloseReason {
|
|
FxIoTargetRemoteCloseReasonQueryRemove = 1,
|
|
FxIoTargetRemoteCloseReasonPlainClose,
|
|
FxIoTargetRemoteCloseReasonDelete
|
|
};
|
|
|
|
#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
|
|
typedef PVOID MdTargetNotifyHandle;
|
|
#else
|
|
typedef WUDF_TARGET_CONTEXT MdTargetNotifyHandle;
|
|
#endif
|
|
|
|
class FxIoTargetRemoteNotificationCallback;
|
|
|
|
struct FxIoTargetQueryRemove : public FxCallback {
|
|
|
|
FxIoTargetQueryRemove(
|
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals
|
|
) :
|
|
FxCallback(FxDriverGlobals),
|
|
m_Method(NULL)
|
|
{
|
|
}
|
|
|
|
_Must_inspect_result_
|
|
NTSTATUS
|
|
Invoke(
|
|
__in WDFIOTARGET IoTarget
|
|
)
|
|
{
|
|
NTSTATUS status;
|
|
|
|
CallbackStart();
|
|
status = m_Method(IoTarget);
|
|
CallbackEnd();
|
|
|
|
return status;
|
|
}
|
|
|
|
PFN_WDF_IO_TARGET_QUERY_REMOVE m_Method;
|
|
};
|
|
|
|
struct FxIoTargetRemoveCanceled : public FxCallback {
|
|
|
|
FxIoTargetRemoveCanceled(
|
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals
|
|
) :
|
|
FxCallback(FxDriverGlobals),
|
|
m_Method(NULL)
|
|
{
|
|
}
|
|
|
|
VOID
|
|
Invoke(
|
|
__in WDFIOTARGET Target
|
|
)
|
|
{
|
|
CallbackStart();
|
|
m_Method(Target);
|
|
CallbackEnd();
|
|
}
|
|
|
|
PFN_WDF_IO_TARGET_REMOVE_CANCELED m_Method;
|
|
};
|
|
|
|
struct FxIoTargetRemoveComplete : public FxCallback {
|
|
|
|
FxIoTargetRemoveComplete(
|
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals
|
|
) :
|
|
FxCallback(FxDriverGlobals),
|
|
m_Method(NULL)
|
|
{
|
|
}
|
|
|
|
VOID
|
|
Invoke(
|
|
__in WDFIOTARGET Target
|
|
)
|
|
{
|
|
CallbackStart();
|
|
m_Method(Target);
|
|
CallbackEnd();
|
|
}
|
|
|
|
PFN_WDF_IO_TARGET_REMOVE_COMPLETE m_Method;
|
|
};
|
|
|
|
enum FxIoTargetRemoteOpenState {
|
|
FxIoTargetRemoteOpenStateClosed = 1,
|
|
FxIoTargetRemoteOpenStateOpening,
|
|
FxIoTargetRemoteOpenStateOpen,
|
|
};
|
|
|
|
struct FxIoTargetRemoveOpenParams {
|
|
|
|
FxIoTargetRemoveOpenParams()
|
|
{
|
|
RtlZeroMemory(this, sizeof(FxIoTargetRemoveOpenParams));
|
|
}
|
|
|
|
VOID
|
|
Set(
|
|
__in PWDF_IO_TARGET_OPEN_PARAMS OpenParams,
|
|
__in PUNICODE_STRING Name,
|
|
__in PVOID Ea,
|
|
__in ULONG EaLength
|
|
);
|
|
|
|
VOID
|
|
Clear(
|
|
VOID
|
|
);
|
|
|
|
UNICODE_STRING TargetDeviceName;
|
|
|
|
WDF_IO_TARGET_OPEN_TYPE OpenType;
|
|
|
|
ACCESS_MASK DesiredAccess;
|
|
|
|
ULONG ShareAccess;
|
|
|
|
ULONG FileAttributes;
|
|
|
|
ULONG CreateDisposition;
|
|
|
|
ULONG CreateOptions;
|
|
|
|
__field_bcount(EaBufferLength) PVOID EaBuffer;
|
|
|
|
ULONG EaBufferLength;
|
|
|
|
LARGE_INTEGER AllocationSize;
|
|
|
|
PLARGE_INTEGER AllocationSizePointer;
|
|
|
|
};
|
|
|
|
struct FxIoTargetClearedPointers {
|
|
MdDeviceObject TargetPdo;
|
|
MdFileObject TargetFileObject;
|
|
HANDLE TargetHandle;
|
|
};
|
|
|
|
class FxIoTargetRemote : public FxIoTarget {
|
|
|
|
public:
|
|
|
|
static
|
|
_Must_inspect_result_
|
|
NTSTATUS
|
|
_Create(
|
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
|
|
__in PWDF_OBJECT_ATTRIBUTES Attributes,
|
|
__in FxDeviceBase* Device,
|
|
__out FxIoTargetRemote** Target
|
|
);
|
|
|
|
~FxIoTargetRemote();
|
|
|
|
NTSTATUS
|
|
InitRemote(
|
|
__in FxDeviceBase* Device
|
|
);
|
|
|
|
NTSTATUS
|
|
InitRemoteModeSpecific(
|
|
__in FxDeviceBase* Device
|
|
);
|
|
|
|
_Must_inspect_result_
|
|
NTSTATUS
|
|
Open(
|
|
__in PWDF_IO_TARGET_OPEN_PARAMS OpenParams
|
|
);
|
|
|
|
VOID
|
|
Close(
|
|
__in FxIoTargetRemoteCloseReason Reason
|
|
);
|
|
|
|
NTSTATUS
|
|
GetTargetDeviceRelations(
|
|
_Out_ BOOLEAN* Close
|
|
);
|
|
|
|
BOOLEAN
|
|
CanRegisterForPnpNotification(
|
|
VOID
|
|
)
|
|
{
|
|
BOOLEAN canRegister = FALSE;
|
|
|
|
#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
|
|
if (m_TargetFileObject != NULL) {
|
|
canRegister = TRUE;
|
|
}
|
|
#else // FX_CORE_USER_MODE
|
|
if (m_TargetHandle != NULL) {
|
|
canRegister = TRUE;
|
|
}
|
|
#endif
|
|
return canRegister;
|
|
}
|
|
|
|
VOID
|
|
ResetTargetNotifyHandle(
|
|
VOID
|
|
)
|
|
{
|
|
#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
|
|
m_TargetNotifyHandle = NULL;
|
|
#else // FX_CORE_USER_MODE
|
|
m_TargetNotifyHandle = WUDF_TARGET_CONTEXT_INVALID;
|
|
#endif
|
|
}
|
|
|
|
NTSTATUS
|
|
OpenTargetHandle(
|
|
_In_ PWDF_IO_TARGET_OPEN_PARAMS OpenParams,
|
|
_Inout_ FxIoTargetRemoveOpenParams* pParams
|
|
);
|
|
|
|
VOID
|
|
CloseTargetHandle(
|
|
VOID
|
|
);
|
|
|
|
HANDLE
|
|
GetTargetHandle(
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
RegisterForPnpNotification(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
UnregisterForPnpNotification(
|
|
_In_ MdTargetNotifyHandle Handle
|
|
);
|
|
|
|
__inline
|
|
WDFIOTARGET
|
|
GetHandle(
|
|
VOID
|
|
)
|
|
{
|
|
return (WDFIOTARGET) GetObjectHandle();
|
|
}
|
|
|
|
virtual
|
|
VOID
|
|
Remove(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RemoveModeSpecific(
|
|
VOID
|
|
);
|
|
|
|
protected:
|
|
FxIoTargetRemote(
|
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals
|
|
);
|
|
|
|
virtual
|
|
VOID
|
|
ClearTargetPointers(
|
|
VOID
|
|
);
|
|
|
|
_Must_inspect_result_
|
|
NTSTATUS
|
|
QueryInterface(
|
|
__in FxQueryInterfaceParams* Params
|
|
)
|
|
{
|
|
if (Params->Type == FX_TYPE_IO_TARGET_REMOTE) {
|
|
*Params->Object = (FxIoTargetRemote*) this;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
else {
|
|
return __super::QueryInterface(Params);
|
|
}
|
|
}
|
|
|
|
_Must_inspect_result_
|
|
NTSTATUS
|
|
FxIoTargetRemote::OpenLocalTargetByFile(
|
|
_In_ PWDF_IO_TARGET_OPEN_PARAMS OpenParams
|
|
);
|
|
|
|
#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
|
|
static
|
|
DRIVER_NOTIFICATION_CALLBACK_ROUTINE
|
|
_PlugPlayNotification;
|
|
|
|
#else // FX_CORE_USER_MODE
|
|
//
|
|
// I/O dispatcher to be used for IRPs forwarded to this remote target. It is
|
|
// created when the CWdfRemoteTarget is created. The win32 handle is
|
|
// associated with it via a call to m_pRemoteDispatcher->BindToHandle()
|
|
// right after we call CreateFile(...). We must call
|
|
// m_pRemoteDispatcher->CloseHandle() to close the handle.
|
|
//
|
|
// Because of the plug-in pattern of the IoDispatcher, we need two
|
|
// interface pointers (one to the outer object, and one to the plug-in.
|
|
//
|
|
IWudfIoDispatcher * m_pIoDispatcher;
|
|
IWudfRemoteDispatcher * m_pRemoteDispatcher;
|
|
|
|
//
|
|
// Implements host's callback interface for pnp notification
|
|
//
|
|
FxIoTargetRemoteNotificationCallback* m_NotificationCallback;
|
|
|
|
VOID
|
|
Forward(
|
|
_In_ MdIrp Irp
|
|
)
|
|
{
|
|
if (m_OpenParams.OpenType == WdfIoTargetOpenLocalTargetByFile) {
|
|
//
|
|
// Ignore the return value because once we have sent the request, we
|
|
// want all processing to be done in the completion routine.
|
|
//
|
|
(void) Irp->Forward();
|
|
}
|
|
else {
|
|
IWudfIoIrp* pSubmitIrp = FxIrp(Irp).GetIoIrp();
|
|
|
|
//
|
|
// Move the stack location to the next location
|
|
//
|
|
pSubmitIrp->SetNextIrpStackLocation();
|
|
|
|
//
|
|
// Route it using Remote dispatcher
|
|
//
|
|
m_pIoDispatcher->Dispatch(pSubmitIrp, NULL);
|
|
}
|
|
}
|
|
|
|
private:
|
|
|
|
NTSTATUS
|
|
BindToHandle(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
UnbindHandle(
|
|
_In_ FxIoTargetClearedPointers* TargetPointers
|
|
);
|
|
|
|
NTSTATUS
|
|
CreateWdfFileObject(
|
|
_In_opt_ PUNICODE_STRING FileName,
|
|
_Out_ MdFileObject* FileObject
|
|
);
|
|
|
|
VOID
|
|
CloseWdfFileObject(
|
|
_In_ MdFileObject FileObject
|
|
);
|
|
|
|
#endif // FX_CORE_USER-MODE)
|
|
|
|
public:
|
|
//
|
|
// File handle for m_TargetHandle
|
|
//
|
|
HANDLE m_TargetHandle;
|
|
|
|
//
|
|
// Notification handle returned by IoRegisterPlugPlayNotification for KMDF,
|
|
// or host's notification registartion interface for UMDf. Note that host
|
|
// uses the term RegistrationId for the same (with WUDF_CONTEXT_TYPE which
|
|
// is UINT64).
|
|
//
|
|
MdTargetNotifyHandle m_TargetNotifyHandle;
|
|
|
|
//
|
|
// Driver writer callbacks to indicate state changes
|
|
//
|
|
FxIoTargetQueryRemove m_EvtQueryRemove;
|
|
FxIoTargetRemoveCanceled m_EvtRemoveCanceled;
|
|
FxIoTargetRemoveComplete m_EvtRemoveComplete;
|
|
|
|
FxCREvent m_OpenedEvent;
|
|
|
|
FxIoTargetClearedPointers* m_ClearedPointers;
|
|
|
|
//
|
|
// Value from FxIoTargetRemoteOpenState
|
|
//
|
|
UCHAR m_OpenState;
|
|
|
|
protected:
|
|
FxIoTargetRemoveOpenParams m_OpenParams;
|
|
};
|
|
|
|
#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
|
|
#include "FxIoTargetRemoteKm.hpp"
|
|
#else
|
|
#include "FxIoTargetRemoteUm.hpp"
|
|
#endif
|
|
|
|
#endif // _FXIOTARGETREMOTE_H_
|