2020-09-24 20:41:01 +00:00
|
|
|
/*++
|
|
|
|
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
|
|
|
|
_WdfVersionBuild_
|
|
|
|
|
|
|
|
Module Name:
|
|
|
|
|
|
|
|
WdfQueryInterface.h
|
|
|
|
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
This file contains the DDIs for handling query interface
|
|
|
|
|
|
|
|
Environment:
|
|
|
|
|
|
|
|
kernel mode only
|
|
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
|
|
--*/
|
|
|
|
|
|
|
|
//
|
|
|
|
// NOTE: This header is generated by stubwork. Please make any
|
|
|
|
// modifications to the corresponding template files
|
|
|
|
// (.x or .y) and use stubwork to regenerate the header
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef _WDFQUERYINTERFACE_H_
|
|
|
|
#define _WDFQUERYINTERFACE_H_
|
|
|
|
|
|
|
|
#ifndef WDF_EXTERN_C
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#define WDF_EXTERN_C extern "C"
|
|
|
|
#define WDF_EXTERN_C_START extern "C" {
|
|
|
|
#define WDF_EXTERN_C_END }
|
|
|
|
#else
|
|
|
|
#define WDF_EXTERN_C
|
|
|
|
#define WDF_EXTERN_C_START
|
|
|
|
#define WDF_EXTERN_C_END
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
WDF_EXTERN_C_START
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef
|
|
|
|
_Function_class_(EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST)
|
|
|
|
_IRQL_requires_same_
|
|
|
|
_IRQL_requires_max_(PASSIVE_LEVEL)
|
|
|
|
NTSTATUS
|
2020-09-24 20:48:32 +00:00
|
|
|
STDCALL
|
2020-09-24 20:41:01 +00:00
|
|
|
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST(
|
|
|
|
_In_
|
|
|
|
WDFDEVICE Device,
|
|
|
|
_In_
|
|
|
|
LPGUID InterfaceType,
|
|
|
|
_Inout_
|
|
|
|
PINTERFACE ExposedInterface,
|
|
|
|
_Inout_opt_
|
|
|
|
PVOID ExposedInterfaceSpecificData
|
|
|
|
);
|
|
|
|
|
|
|
|
typedef EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST *PFN_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST;
|
|
|
|
|
|
|
|
typedef struct _WDF_QUERY_INTERFACE_CONFIG {
|
|
|
|
//
|
|
|
|
// Size of this structure in bytes.
|
|
|
|
//
|
|
|
|
ULONG Size;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Interface to be returned to the caller. Optional if BehaviorType is set
|
|
|
|
// to WdfQueryInterfaceTypePassThrough or ImportInterface is set to TRUE.
|
|
|
|
//
|
|
|
|
PINTERFACE Interface;
|
|
|
|
|
|
|
|
//
|
|
|
|
// The GUID identifying the interface
|
|
|
|
//
|
|
|
|
CONST GUID * InterfaceType;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Valid only for PDOs. The framework will allocate a new request and
|
|
|
|
// forward it down the parent's device stack.
|
|
|
|
//
|
|
|
|
BOOLEAN SendQueryToParentStack;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Driver supplied callback which is called after some basic interface
|
|
|
|
// validation has been performed (size, version, and guid checking). This
|
|
|
|
// is an optional parameter and may be NULL unless ImportInterface is
|
|
|
|
// specified.
|
|
|
|
//
|
|
|
|
// If the callback returns !NT_SUCCESS, this error will be returned to the
|
|
|
|
// caller and the query interface will fail.
|
|
|
|
//
|
|
|
|
// In this callback, the caller is free to modify the ExposedInterface in
|
|
|
|
// any manner of its choosing. For instance, the callback may change any
|
|
|
|
// field in the interface. The callback may also alloate a dynamic context
|
|
|
|
// to be associated with the interface; the InterfaceReference and
|
|
|
|
// InterfaceDereference functions may also be overridden.
|
|
|
|
//
|
|
|
|
// If ImportInterface is set to TRUE, then this is a required field and the
|
|
|
|
// callback must initialize the interface (the framework will leave the
|
|
|
|
// ExposedInterface buffer exactly as it received it) since the framework
|
|
|
|
// has no way of knowing which fields to fill in and which to leave alone.
|
|
|
|
//
|
|
|
|
PFN_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST EvtDeviceProcessQueryInterfaceRequest;
|
|
|
|
|
|
|
|
//
|
|
|
|
// If TRUE, the interface provided by the caller contains data that the
|
|
|
|
// driver is interested in. By setting to this field to TRUE, the
|
|
|
|
// EvtDeviceProcessQueryInterfaceRequest callback must initialize the
|
|
|
|
// ExposedInterface.
|
|
|
|
//
|
|
|
|
// If FALSE, the entire ExposedInterface is initialized through a memory
|
|
|
|
// copy before the EvtDeviceProcessQueryInterfaceRequest is called.
|
|
|
|
//
|
|
|
|
BOOLEAN ImportInterface;
|
|
|
|
|
|
|
|
} WDF_QUERY_INTERFACE_CONFIG, *PWDF_QUERY_INTERFACE_CONFIG;
|
|
|
|
|
|
|
|
FORCEINLINE
|
2020-09-24 20:48:32 +00:00
|
|
|
VOID
|
2020-09-24 20:41:01 +00:00
|
|
|
WDF_QUERY_INTERFACE_CONFIG_INIT(
|
|
|
|
_Out_ PWDF_QUERY_INTERFACE_CONFIG InterfaceConfig,
|
|
|
|
_In_opt_ PINTERFACE Interface,
|
|
|
|
_In_ CONST GUID* InterfaceType,
|
|
|
|
_In_opt_ PFN_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST EvtDeviceProcessQueryInterfaceRequest
|
|
|
|
)
|
|
|
|
{
|
|
|
|
RtlZeroMemory(InterfaceConfig, sizeof(WDF_QUERY_INTERFACE_CONFIG));
|
|
|
|
|
|
|
|
InterfaceConfig->Size = sizeof(WDF_QUERY_INTERFACE_CONFIG);
|
|
|
|
InterfaceConfig->Interface = Interface;
|
|
|
|
InterfaceConfig->InterfaceType = InterfaceType;
|
|
|
|
InterfaceConfig->EvtDeviceProcessQueryInterfaceRequest =
|
|
|
|
EvtDeviceProcessQueryInterfaceRequest;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// WDF Function: WdfDeviceAddQueryInterface
|
|
|
|
//
|
|
|
|
typedef
|
|
|
|
_Must_inspect_result_
|
|
|
|
_IRQL_requires_max_(PASSIVE_LEVEL)
|
|
|
|
WDFAPI
|
|
|
|
NTSTATUS
|
2020-09-24 20:48:32 +00:00
|
|
|
(STDCALL *PFN_WDFDEVICEADDQUERYINTERFACE)(
|
2020-09-24 20:41:01 +00:00
|
|
|
_In_
|
|
|
|
PWDF_DRIVER_GLOBALS DriverGlobals,
|
|
|
|
_In_
|
|
|
|
WDFDEVICE Device,
|
|
|
|
_In_
|
|
|
|
PWDF_QUERY_INTERFACE_CONFIG InterfaceConfig
|
|
|
|
);
|
|
|
|
|
|
|
|
_Must_inspect_result_
|
|
|
|
_IRQL_requires_max_(PASSIVE_LEVEL)
|
|
|
|
FORCEINLINE
|
2020-09-24 20:48:32 +00:00
|
|
|
NTSTATUS
|
2020-09-24 20:41:01 +00:00
|
|
|
WdfDeviceAddQueryInterface(
|
|
|
|
_In_
|
|
|
|
WDFDEVICE Device,
|
|
|
|
_In_
|
|
|
|
PWDF_QUERY_INTERFACE_CONFIG InterfaceConfig
|
|
|
|
)
|
|
|
|
{
|
|
|
|
return ((PFN_WDFDEVICEADDQUERYINTERFACE) WdfFunctions[WdfDeviceAddQueryInterfaceTableIndex])(WdfDriverGlobals, Device, InterfaceConfig);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
// The following functions can be assigned to INTERFACE::InterfaceReference
|
|
|
|
// and INTERFACE::InterfaceDeference
|
|
|
|
//
|
|
|
|
// o WdfDeviceInterfaceReferenceNoOp
|
|
|
|
// o WdfDeviceInterfaceDereferenceNoOp
|
|
|
|
//
|
|
|
|
// Thes 2 functions do nothing when called. These are appropriate for
|
|
|
|
// interfaces which can be queried for and used independent of the PNP state of
|
|
|
|
// the WDFDEVICE the interface was retrieved from.
|
|
|
|
//
|
|
|
|
FORCEINLINE
|
2020-09-24 20:48:32 +00:00
|
|
|
VOID
|
2020-09-24 20:41:01 +00:00
|
|
|
WdfDeviceInterfaceReferenceNoOp(
|
|
|
|
_In_ PVOID Context
|
|
|
|
)
|
|
|
|
{
|
|
|
|
UNREFERENCED_PARAMETER(Context);
|
|
|
|
}
|
|
|
|
|
|
|
|
FORCEINLINE
|
2020-09-24 20:48:32 +00:00
|
|
|
VOID
|
2020-09-24 20:41:01 +00:00
|
|
|
WdfDeviceInterfaceDereferenceNoOp(
|
|
|
|
_In_ PVOID Context
|
|
|
|
)
|
|
|
|
{
|
|
|
|
UNREFERENCED_PARAMETER(Context);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WDF_EXTERN_C_END
|
|
|
|
|
|
|
|
#endif // _WDFQUERYINTERFACE_H_
|
|
|
|
|