1 /* 2 * kcom.h 3 * 4 * This file is part of the ReactOS PSDK package. 5 * 6 * Contributors: 7 * Created by Andrew Greenwood. 8 * 9 * THIS SOFTWARE IS NOT COPYRIGHTED 10 * 11 * This source code is offered for use in the public domain. You may 12 * use, modify or distribute it freely. 13 * 14 * This code is distributed in the hope that it will be useful but 15 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY 16 * DISCLAIMED. This includes but is not limited to warranties of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 18 * 19 */ 20 21 #if !defined(_KCOM_) 22 #define _KCOM_ 23 24 #include <ks.h> 25 26 #if defined(__cplusplus) 27 extern "C" { 28 #endif 29 30 #define STATIC_KoCreateObject 0x72CF721C, 0x525A, 0x11D1, 0x9A, 0xA1, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 31 DEFINE_GUIDSTRUCT("72CF721C-525A-11D1-9AA1-00A0C9223196", KoCreateObject); 32 #define KOSTRING_CreateObject L"{72CF721C-525A-11D1-9AA1-00A0C9223196}" 33 34 #ifndef CLSCTX_KERNEL_SERVER 35 #define CLSCTX_KERNEL_SERVER 0x00000200 36 #endif 37 38 #if !defined(__cplusplus) || _MSC_VER < 1100 39 40 #define STATIC_IID_IKoInitializeParentDeviceObject 0x21B36996, 0x8DE3, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 41 DEFINE_GUIDEX(IID_IKoInitializeParentDeviceObject); 42 43 #else 44 45 interface __declspec(uuid("21B36996-8DE3-11D1-8AE0-00A0C9223196")) IKoInitializeParentDeviceObject; 46 47 #endif 48 49 #ifndef COMDDKMETHOD 50 #ifdef _COMDDK_ 51 #define COMDDKMETHOD 52 #else 53 #define COMDDKMETHOD DECLSPEC_IMPORT 54 #endif 55 #endif 56 57 #ifdef _COMDDK_ 58 #define COMDDKAPI 59 #else 60 #define COMDDKAPI DECLSPEC_IMPORT 61 #endif 62 63 typedef 64 NTSTATUS 65 (*KoCreateObjectHandler)( 66 REFCLSID ClassId, 67 IUnknown* UnkOuter, 68 REFIID InterfaceId, 69 PVOID* Interface); 70 71 #undef INTERFACE 72 #define INTERFACE INonDelegatedUnknown 73 DECLARE_INTERFACE(INonDelegatedUnknown) { 74 STDMETHOD(NonDelegatedQueryInterface)( 75 THIS_ 76 REFIID InterfaceId, 77 PVOID* Interface 78 ) PURE; 79 80 STDMETHOD_(ULONG,NonDelegatedAddRef)( 81 THIS 82 ) PURE; 83 84 STDMETHOD_(ULONG,NonDelegatedRelease)( 85 THIS 86 ) PURE; 87 }; 88 89 #undef INTERFACE 90 #define INTERFACE IIndirectedUnknown 91 DECLARE_INTERFACE(IIndirectedUnknown) { 92 STDMETHOD(IndirectedQueryInterface)( 93 THIS_ 94 REFIID InterfaceId, 95 PVOID* Interface 96 ) PURE; 97 98 STDMETHOD_(ULONG,IndirectedAddRef)( 99 THIS 100 ) PURE; 101 102 STDMETHOD_(ULONG,IndirectedRelease)( 103 THIS 104 ) PURE; 105 }; 106 107 #undef INTERFACE 108 #define INTERFACE IKoInitializeParentDeviceObject 109 DECLARE_INTERFACE_(IKoInitializeParentDeviceObject, IUnknown) { 110 STDMETHOD(SetParentDeviceObject)( 111 THIS_ 112 PDEVICE_OBJECT ParentDeviceObject 113 ) PURE; 114 }; 115 116 #if defined(__cplusplus) 117 118 class CBaseUnknown : public INonDelegatedUnknown, public IIndirectedUnknown { 119 protected: 120 LONG m_RefCount; 121 private: 122 BOOLEAN m_UsingClassId; 123 CLSID m_ClassId; 124 protected: 125 IUnknown* m_UnknownOuter; 126 public: 127 COMDDKMETHOD CBaseUnknown (REFCLSID ClassId, IUnknown* UnknownOuter = NULL); 128 COMDDKMETHOD CBaseUnknown(IUnknown* UnknownOuter = NULL); 129 COMDDKMETHOD virtual ~CBaseUnknown(); 130 COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedAddRef(); 131 COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedRelease(); 132 COMDDKMETHOD STDMETHODIMP NonDelegatedQueryInterface(REFIID InterfaceId, PVOID* Interface); 133 COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedAddRef(); 134 COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedRelease(); 135 COMDDKMETHOD STDMETHODIMP IndirectedQueryInterface(REFIID InterfaceId, PVOID* Interface); 136 }; 137 138 #if !defined(DEFINE_ABSTRACT_UNKNOWN) 139 #define DEFINE_ABSTRACT_UNKNOWN() \ 140 STDMETHOD(QueryInterface)(THIS_ REFIID InterfaceId, PVOID* Interface) PURE; \ 141 STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ 142 STDMETHOD_(ULONG,Release)(THIS) PURE; 143 #endif 144 145 #define DEFINE_STD_UNKNOWN() \ 146 STDMETHODIMP NonDelegatedQueryInterface( REFIID InterfaceId, PVOID* Interface); \ 147 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); \ 148 STDMETHODIMP_(ULONG) AddRef(); \ 149 STDMETHODIMP_(ULONG) Release(); 150 151 #define IMPLEMENT_STD_UNKNOWN(Class) \ 152 STDMETHODIMP Class::QueryInterface( REFIID InterfaceId, PVOID* Interface) { \ 153 return m_UnknownOuter->QueryInterface(InterfaceId, Interface);\ 154 } \ 155 STDMETHODIMP_(ULONG) Class::AddRef() { \ 156 return m_UnknownOuter->AddRef(); \ 157 } \ 158 STDMETHODIMP_(ULONG) Class::Release() { \ 159 return m_UnknownOuter->Release(); \ 160 } 161 162 #else 163 164 COMDDKAPI 165 void 166 NTAPI 167 KoRelease( 168 REFCLSID ClassId); 169 170 #endif /* !__cplusplus */ 171 172 COMDDKAPI 173 NTSTATUS 174 NTAPI 175 KoCreateInstance( 176 REFCLSID ClassId, 177 IUnknown* UnkOuter, 178 ULONG ClsContext, 179 REFIID InterfaceId, 180 PVOID* Interface); 181 182 COMDDKAPI 183 NTSTATUS 184 NTAPI 185 KoDeviceInitialize( 186 PDEVICE_OBJECT DeviceObject); 187 188 COMDDKAPI 189 NTSTATUS 190 NTAPI 191 KoDriverInitialize( 192 PDRIVER_OBJECT DriverObject, 193 PUNICODE_STRING RegistryPathName, 194 KoCreateObjectHandler CreateObjectHandler); 195 196 197 #if defined(__cplusplus) 198 } 199 #endif 200 201 #ifdef __cplusplus 202 203 #ifndef _NEW_DELETE_OPERATORS_ 204 #define _NEW_DELETE_OPERATORS_ 205 206 inline PVOID operator new( 207 size_t iSize, 208 POOL_TYPE poolType) 209 { 210 PVOID result = ExAllocatePoolWithTag(poolType,iSize,'wNCK'); 211 if (result) { 212 RtlZeroMemory(result,iSize); 213 } 214 return result; 215 } 216 217 inline PVOID operator new( 218 size_t iSize, 219 POOL_TYPE poolType, 220 ULONG tag) 221 { 222 PVOID result = ExAllocatePoolWithTag(poolType,iSize,tag); 223 if (result) { 224 RtlZeroMemory(result,iSize); 225 } 226 return result; 227 } 228 229 inline void __cdecl operator delete( 230 PVOID pVoid) 231 { 232 if (pVoid) ExFreePool(pVoid); 233 } 234 235 #endif /* _NEW_DELETE_OPERATORS_ */ 236 237 #if defined(_SYS_GUID_OPERATOR_EQ_) 238 #define _GUID_OPERATORS_ 239 //#pragma message("WARNING: Using system operator==/!= for GUIDs") 240 #endif 241 242 #ifndef _GUID_OPERATORS_ 243 #define _GUID_OPERATORS_ 244 245 __inline WINBOOL operator==(const GUID& guidOne, const GUID& guidOther) { 246 return IsEqualGUIDAligned(guidOne,guidOther); 247 } 248 249 __inline WINBOOL operator!=(const GUID& guidOne, const GUID& guidOther) { 250 return !(guidOne == guidOther); 251 } 252 253 #endif /* _GUID_OPERATORS_ */ 254 255 #endif /* __cplusplus */ 256 257 #endif /* _KCOM_ */ 258