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