/*++ 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_