4 * This file is part of the ReactOS PSDK package.
7 * Created by Andrew Greenwood.
9 * THIS SOFTWARE IS NOT COPYRIGHTED
11 * This source code is offered for use in the public domain. You may
12 * use, modify or distribute it freely.
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.
22 #error KS.H must be included before KCOM.H
28 #if defined(__cplusplus)
32 #define STATIC_KoCreateObject 0x72CF721CL, 0x525A, 0x11D1, {0x9A, 0xA1, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
33 DEFINE_GUIDSTRUCT("72CF721C-525A-11D1-9AA1-00A0C9223196", KoCreateObject
);
34 #define KOSTRING_CreateObject L"{72CF721C-525A-11D1-9AA1-00A0C9223196}"
36 #ifndef CLSCTX_KERNEL_SERVER
37 #define CLSCTX_KERNEL_SERVER 0x00000200
40 #if !defined(__cplusplus) || _MSC_VER < 1100
42 #define STATIC_IID_IKoInitializeParentDeviceObject 0x21B36996, 0x8DE3, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
43 DEFINE_GUIDEX(IID_IKoInitializeParentDeviceObject
);
47 interface
__declspec(uuid("21B36996-8DE3-11D1-8AE0-00A0C9223196")) IKoInitializeParentDeviceObject
;
55 #define COMDDKMETHOD DECLSPEC_IMPORT
62 #define COMDDKAPI DECLSPEC_IMPORT
67 (*KoCreateObjectHandler
)(
69 IN IUnknown
* UnkOuter OPTIONAL
,
70 IN REFIID InterfaceId
,
71 OUT PVOID
* Interface
);
74 #define INTERFACE INonDelegatedUnknown
75 DECLARE_INTERFACE(INonDelegatedUnknown
) {
76 STDMETHOD(NonDelegatedQueryInterface
)(
78 IN REFIID InterfaceId
,
82 STDMETHOD_(ULONG
,NonDelegatedAddRef
)(
86 STDMETHOD_(ULONG
,NonDelegatedRelease
)(
92 #define INTERFACE IIndirectedUnknown
93 DECLARE_INTERFACE(IIndirectedUnknown
) {
94 STDMETHOD(IndirectedQueryInterface
)(
96 IN REFIID InterfaceId
,
100 STDMETHOD_(ULONG
,IndirectedAddRef
)(
104 STDMETHOD_(ULONG
,IndirectedRelease
)(
110 #define INTERFACE IKoInitializeParentDeviceObject
111 DECLARE_INTERFACE_(IKoInitializeParentDeviceObject
, IUnknown
) {
112 STDMETHOD(SetParentDeviceObject
)(
114 IN PDEVICE_OBJECT ParentDeviceObject
118 #if defined(__cplusplus)
120 class CBaseUnknown
: public INonDelegatedUnknown
, public IIndirectedUnknown
{
124 BOOLEAN m_UsingClassId
;
127 IUnknown
* m_UnknownOuter
;
129 COMDDKMETHOD
CBaseUnknown (IN REFCLSID ClassId
, IN IUnknown
* UnknownOuter OPTIONAL
= NULL
);
130 COMDDKMETHOD
CBaseUnknown(IN IUnknown
* UnknownOuter OPTIONAL
= NULL
);
131 COMDDKMETHOD
virtual ~CBaseUnknown();
132 COMDDKMETHOD
STDMETHODIMP_(ULONG
) NonDelegatedAddRef();
133 COMDDKMETHOD
STDMETHODIMP_(ULONG
) NonDelegatedRelease();
134 COMDDKMETHOD STDMETHODIMP
NonDelegatedQueryInterface(IN REFIID InterfaceId
,OUT PVOID
* Interface
);
135 COMDDKMETHOD
STDMETHODIMP_(ULONG
) IndirectedAddRef();
136 COMDDKMETHOD
STDMETHODIMP_(ULONG
) IndirectedRelease();
137 COMDDKMETHOD STDMETHODIMP
IndirectedQueryInterface(IN REFIID InterfaceId
, OUT PVOID
* Interface
);
140 #if !defined(DEFINE_ABSTRACT_UNKNOWN)
141 #define DEFINE_ABSTRACT_UNKNOWN() \
142 STDMETHOD(QueryInterface)(THIS_ REFIID InterfaceId, PVOID* Interface) PURE; \
143 STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
144 STDMETHOD_(ULONG,Release)(THIS) PURE;
147 #define DEFINE_STD_UNKNOWN() \
148 STDMETHODIMP NonDelegatedQueryInterface( REFIID InterfaceId, PVOID* Interface); \
149 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); \
150 STDMETHODIMP_(ULONG) AddRef(); \
151 STDMETHODIMP_(ULONG) Release();
153 #define IMPLEMENT_STD_UNKNOWN(Class) \
154 STDMETHODIMP Class::QueryInterface( REFIID InterfaceId, PVOID* Interface) { \
155 return m_UnknownOuter->QueryInterface(InterfaceId, Interface);\
157 STDMETHODIMP_(ULONG) Class::AddRef() { \
158 return m_UnknownOuter->AddRef(); \
160 STDMETHODIMP_(ULONG) Class::Release() { \
161 return m_UnknownOuter->Release(); \
170 IN REFCLSID ClassId
);
172 #endif /* !__cplusplus */
179 IN IUnknown
* UnkOuter OPTIONAL
,
181 IN REFIID InterfaceId
,
182 OUT PVOID
* Interface
);
188 IN PDEVICE_OBJECT DeviceObject
);
194 IN PDRIVER_OBJECT DriverObject
,
195 IN PUNICODE_STRING RegistryPathName
,
196 IN KoCreateObjectHandler CreateObjectHandler
);
199 #if defined(__cplusplus)
205 #ifndef _NEW_DELETE_OPERATORS_
206 #define _NEW_DELETE_OPERATORS_
208 inline PVOID
operator new(
212 PVOID result
= ExAllocatePoolWithTag(poolType
,iSize
,'wNCK');
214 RtlZeroMemory(result
,iSize
);
219 inline PVOID
operator new(
224 PVOID result
= ExAllocatePoolWithTag(poolType
,iSize
,tag
);
226 RtlZeroMemory(result
,iSize
);
231 inline void __cdecl
operator delete(
234 if (pVoid
) ExFreePool(pVoid
);
237 inline void __cdecl
operator delete(
238 PVOID pVoid
, UINT_PTR
)
240 if (pVoid
) ExFreePool(pVoid
);
243 #endif /* _NEW_DELETE_OPERATORS_ */
245 #if defined(_SYS_GUID_OPERATOR_EQ_)
246 #define _GUID_OPERATORS_
247 //#pragma message("WARNING: Using system operator==/!= for GUIDs")
250 #ifndef _GUID_OPERATORS_
251 #define _GUID_OPERATORS_
253 __inline BOOL
operator==(const GUID
& guidOne
, const GUID
& guidOther
) {
254 return IsEqualGUIDAligned(guidOne
,guidOther
);
257 __inline BOOL
operator!=(const GUID
& guidOne
, const GUID
& guidOther
) {
258 return !(guidOne
== guidOther
);
261 #endif /* _GUID_OPERATORS_ */
263 #endif /* __cplusplus */