|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
kcom.h
Abstract:
Kernel COM
--*/
#if !defined(_KS_)
#error KS.H must be included before KCOM.H
#endif // !defined(_KS_)
#if !defined(_KCOM_)
#define _KCOM_
#if defined(__cplusplus)
extern "C" { #endif // defined(__cplusplus)
#define STATIC_KoCreateObject \
0x72CF721CL, 0x525A, 0x11D1, 0x9A, 0xA1, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96 DEFINE_GUIDSTRUCT("72CF721C-525A-11D1-9AA1-00A0C9223196", KoCreateObject);
#define KOSTRING_CreateObject L"{72CF721C-525A-11D1-9AA1-00A0C9223196}"
#ifndef CLSCTX_KERNEL_SERVER
#define CLSCTX_KERNEL_SERVER 0x00000200
#endif
typedef NTSTATUS (*KoCreateObjectHandler)( IN REFCLSID ClassId, IN IUnknown* UnkOuter OPTIONAL, IN REFIID InterfaceId, OUT PVOID* Interface );
#undef INTERFACE
#define INTERFACE INonDelegatedUnknown
DECLARE_INTERFACE(INonDelegatedUnknown) { STDMETHOD(NonDelegatedQueryInterface)( THIS_ IN REFIID InterfaceId, OUT PVOID* Interface ) PURE;
STDMETHOD_(ULONG,NonDelegatedAddRef)( THIS ) PURE;
STDMETHOD_(ULONG,NonDelegatedRelease)( THIS ) PURE; };
#undef INTERFACE
#define INTERFACE IIndirectedUnknown
DECLARE_INTERFACE(IIndirectedUnknown) { STDMETHOD(IndirectedQueryInterface)( THIS_ IN REFIID InterfaceId, OUT PVOID* Interface ) PURE;
STDMETHOD_(ULONG,IndirectedAddRef)( THIS ) PURE;
STDMETHOD_(ULONG,IndirectedRelease)( THIS ) PURE; };
#if !defined(__cplusplus) || _MSC_VER < 1100
#define STATIC_IID_IKoInitializeParentDeviceObject\
0x21B36996L, 0x8DE3, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 DEFINE_GUIDEX(IID_IKoInitializeParentDeviceObject); #else
interface __declspec(uuid("21B36996-8DE3-11D1-8AE0-00A0C9223196")) IKoInitializeParentDeviceObject; #endif
#undef INTERFACE
#define INTERFACE IKoInitializeParentDeviceObject
DECLARE_INTERFACE_(IKoInitializeParentDeviceObject, IUnknown) { STDMETHOD(SetParentDeviceObject)( THIS_ IN PDEVICE_OBJECT ParentDeviceObject ) PURE; };
#ifndef COMDDKMETHOD
#ifdef _COMDDK_
#define COMDDKMETHOD
#else // !_COMDDK_
#define COMDDKMETHOD DECLSPEC_IMPORT
#endif // _COMDDK_
#endif // !COMDDKMETHOD
#ifdef _COMDDK_
#define COMDDKAPI
#else // !_COMDDK_
#define COMDDKAPI DECLSPEC_IMPORT
#endif // _COMDDK_
#if defined(__cplusplus)
class CBaseUnknown : public INonDelegatedUnknown, public IIndirectedUnknown {
protected: LONG m_RefCount;
private: BOOLEAN m_UsingClassId; CLSID m_ClassId;
protected: IUnknown* m_UnknownOuter;
public: COMDDKMETHOD CBaseUnknown( IN REFCLSID ClassId, IN IUnknown* UnknownOuter OPTIONAL = NULL ); COMDDKMETHOD CBaseUnknown( IN IUnknown* UnknownOuter OPTIONAL = NULL ); COMDDKMETHOD virtual ~CBaseUnknown();
// INonDelegatedUnknown
COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedAddRef(); COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedRelease(); COMDDKMETHOD STDMETHODIMP NonDelegatedQueryInterface( IN REFIID InterfaceId, OUT PVOID* Interface );
//IIndirectedUnknown
COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedAddRef(); COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedRelease(); COMDDKMETHOD STDMETHODIMP IndirectedQueryInterface( IN REFIID InterfaceId, OUT PVOID* Interface ); };
#if !defined(DEFINE_ABSTRACT_UNKNOWN)
#define DEFINE_ABSTRACT_UNKNOWN() \
STDMETHOD(QueryInterface)(THIS_ \ REFIID InterfaceId, \ PVOID* Interface \ ) PURE; \ STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ STDMETHOD_(ULONG,Release)(THIS) PURE;
#endif //!defined(DEFINE_ABSTRACT_UNKNOWN)
#define DEFINE_STD_UNKNOWN() \
STDMETHODIMP NonDelegatedQueryInterface( \ REFIID InterfaceId, \ PVOID* Interface \ ); \ STDMETHODIMP QueryInterface( \ REFIID InterfaceId, \ PVOID* Interface \ ); \ STDMETHODIMP_(ULONG) AddRef(); \ STDMETHODIMP_(ULONG) Release();
#define IMPLEMENT_STD_UNKNOWN(Class) \
STDMETHODIMP Class::QueryInterface( \ REFIID InterfaceId, \ PVOID* Interface \ ) \ { \ return m_UnknownOuter->QueryInterface(InterfaceId, Interface);\ } \ STDMETHODIMP_(ULONG) Class::AddRef() \ { \ return m_UnknownOuter->AddRef(); \ } \ STDMETHODIMP_(ULONG) Class::Release() \ { \ return m_UnknownOuter->Release(); \ } #else // !__cplusplus
COMDDKAPI void NTAPI KoRelease( IN REFCLSID ClassId ); #endif // !__cplusplus
COMDDKAPI NTSTATUS NTAPI KoCreateInstance( IN REFCLSID ClassId, IN IUnknown* UnkOuter OPTIONAL, IN ULONG ClsContext, IN REFIID InterfaceId, OUT PVOID* Interface ); COMDDKAPI NTSTATUS NTAPI KoDriverInitialize( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPathName, IN KoCreateObjectHandler CreateObjectHandler ); COMDDKAPI NTSTATUS NTAPI KoDeviceInitialize( IN PDEVICE_OBJECT DeviceObject );
#if defined(__cplusplus)
} #endif // defined(__cplusplus)
#ifdef __cplusplus
#ifndef _NEW_DELETE_OPERATORS_
#define _NEW_DELETE_OPERATORS_
inline PVOID operator new ( size_t iSize, POOL_TYPE poolType ) { PVOID result = ExAllocatePoolWithTag(poolType,iSize,'wNCK');
if (result) { RtlZeroMemory(result,iSize); }
return result; }
inline PVOID operator new ( size_t iSize, POOL_TYPE poolType, ULONG tag ) { PVOID result = ExAllocatePoolWithTag(poolType,iSize,tag);
if (result) { RtlZeroMemory(result,iSize); }
return result; }
inline void __cdecl operator delete ( PVOID pVoid ) { ExFreePool(pVoid); }
#endif //!_NEW_DELETE_OPERATORS_
#if defined(_SYS_GUID_OPERATOR_EQ_)
// Define _SYS_GUID_OPERATOR_EQ_ before including guiddef.h to get the aligned guid test.
#define _GUID_OPERATORS_
#pragma message("WARNING: Using system operator==/!= for GUIDs")
#endif
#ifndef _GUID_OPERATORS_
#define _GUID_OPERATORS_
__inline BOOL operator==(const GUID& guidOne, const GUID& guidOther) { return IsEqualGUIDAligned(guidOne,guidOther); } __inline BOOL operator!=(const GUID& guidOne, const GUID& guidOther) { return !(guidOne == guidOther); }
#endif // _GUID_OPERATORS_
#endif // __cplusplus
#endif // !_KCOM_
|