/* * kcom.h * * This file is part of the ReactOS PSDK package. * * Contributors: * Created by Andrew Greenwood. * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #if !defined(_KCOM_) #define _KCOM_ #include <ks.h> #if defined(__cplusplus) extern "C" { #endif #define STATIC_KoCreateObject 0x72CF721C, 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 #if !defined(__cplusplus) || _MSC_VER < 1100 #define STATIC_IID_IKoInitializeParentDeviceObject 0x21B36996, 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 #ifndef COMDDKMETHOD #ifdef _COMDDK_ #define COMDDKMETHOD #else #define COMDDKMETHOD DECLSPEC_IMPORT #endif #endif #ifdef _COMDDK_ #define COMDDKAPI #else #define COMDDKAPI DECLSPEC_IMPORT #endif typedef NTSTATUS (*KoCreateObjectHandler)( REFCLSID ClassId, IUnknown* UnkOuter, REFIID InterfaceId, PVOID* Interface); #undef INTERFACE #define INTERFACE INonDelegatedUnknown DECLARE_INTERFACE(INonDelegatedUnknown) { STDMETHOD(NonDelegatedQueryInterface)( THIS_ REFIID InterfaceId, PVOID* Interface ) PURE; STDMETHOD_(ULONG,NonDelegatedAddRef)( THIS ) PURE; STDMETHOD_(ULONG,NonDelegatedRelease)( THIS ) PURE; }; #undef INTERFACE #define INTERFACE IIndirectedUnknown DECLARE_INTERFACE(IIndirectedUnknown) { STDMETHOD(IndirectedQueryInterface)( THIS_ REFIID InterfaceId, PVOID* Interface ) PURE; STDMETHOD_(ULONG,IndirectedAddRef)( THIS ) PURE; STDMETHOD_(ULONG,IndirectedRelease)( THIS ) PURE; }; #undef INTERFACE #define INTERFACE IKoInitializeParentDeviceObject DECLARE_INTERFACE_(IKoInitializeParentDeviceObject, IUnknown) { STDMETHOD(SetParentDeviceObject)( THIS_ PDEVICE_OBJECT ParentDeviceObject ) PURE; }; #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 (REFCLSID ClassId, IUnknown* UnknownOuter = NULL); COMDDKMETHOD CBaseUnknown(IUnknown* UnknownOuter = NULL); COMDDKMETHOD virtual ~CBaseUnknown(); COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedAddRef(); COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedRelease(); COMDDKMETHOD STDMETHODIMP NonDelegatedQueryInterface(REFIID InterfaceId, PVOID* Interface); COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedAddRef(); COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedRelease(); COMDDKMETHOD STDMETHODIMP IndirectedQueryInterface(REFIID InterfaceId, 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 #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 COMDDKAPI void NTAPI KoRelease( REFCLSID ClassId); #endif /* !__cplusplus */ COMDDKAPI NTSTATUS NTAPI KoCreateInstance( REFCLSID ClassId, IUnknown* UnkOuter, ULONG ClsContext, REFIID InterfaceId, PVOID* Interface); COMDDKAPI NTSTATUS NTAPI KoDeviceInitialize( PDEVICE_OBJECT DeviceObject); COMDDKAPI NTSTATUS NTAPI KoDriverInitialize( PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPathName, KoCreateObjectHandler CreateObjectHandler); #if defined(__cplusplus) } #endif #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) { if (pVoid) ExFreePool(pVoid); } #endif /* _NEW_DELETE_OPERATORS_ */ #if defined(_SYS_GUID_OPERATOR_EQ_) #define _GUID_OPERATORS_ //#pragma message("WARNING: Using system operator==/!= for GUIDs") #endif #ifndef _GUID_OPERATORS_ #define _GUID_OPERATORS_ __inline WINBOOL operator==(const GUID& guidOne, const GUID& guidOther) { return IsEqualGUIDAligned(guidOne,guidOther); } __inline WINBOOL operator!=(const GUID& guidOne, const GUID& guidOther) { return !(guidOne == guidOther); } #endif /* _GUID_OPERATORS_ */ #endif /* __cplusplus */ #endif /* _KCOM_ */