2 #error KS.H must be included before KCOM.H
8 #if defined(__cplusplus)
12 #define STATIC_KoCreateObject 0x72CF721CL, 0x525A, 0x11D1, 0x9A, 0xA1, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
13 DEFINE_GUIDSTRUCT("72CF721C-525A-11D1-9AA1-00A0C9223196", KoCreateObject
);
14 #define KOSTRING_CreateObject L"{72CF721C-525A-11D1-9AA1-00A0C9223196}"
16 #ifndef CLSCTX_KERNEL_SERVER
17 #define CLSCTX_KERNEL_SERVER 0x00000200
20 #if !defined(__cplusplus) || _MSC_VER < 1100
22 #define STATIC_IID_IKoInitializeParentDeviceObject 0x21B36996, 0x8DE3, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
23 DEFINE_GUIDEX(IID_IKoInitializeParentDeviceObject
);
27 interface
__declspec(uuid("21B36996-8DE3-11D1-8AE0-00A0C9223196")) IKoInitializeParentDeviceObject
;
35 #define COMDDKMETHOD DECLSPEC_IMPORT
42 #define COMDDKAPI DECLSPEC_IMPORT
47 (*KoCreateObjectHandler
)(
49 IN IUnknown
* UnkOuter OPTIONAL
,
50 IN REFIID InterfaceId
,
51 OUT PVOID
* Interface
);
54 #define INTERFACE INonDelegatedUnknown
55 DECLARE_INTERFACE(INonDelegatedUnknown
) {
56 STDMETHOD(NonDelegatedQueryInterface
)(
58 IN REFIID InterfaceId
,
62 STDMETHOD_(ULONG
,NonDelegatedAddRef
)(
66 STDMETHOD_(ULONG
,NonDelegatedRelease
)(
72 #define INTERFACE IIndirectedUnknown
73 DECLARE_INTERFACE(IIndirectedUnknown
) {
74 STDMETHOD(IndirectedQueryInterface
)(
76 IN REFIID InterfaceId
,
80 STDMETHOD_(ULONG
,IndirectedAddRef
)(
84 STDMETHOD_(ULONG
,IndirectedRelease
)(
90 #define INTERFACE IKoInitializeParentDeviceObject
91 DECLARE_INTERFACE_(IKoInitializeParentDeviceObject
, IUnknown
) {
92 STDMETHOD(SetParentDeviceObject
)(
94 IN PDEVICE_OBJECT ParentDeviceObject
98 #if defined(__cplusplus)
100 class CBaseUnknown
: public INonDelegatedUnknown
, public IIndirectedUnknown
{
104 BOOLEAN m_UsingClassId
;
107 IUnknown
* m_UnknownOuter
;
109 COMDDKMETHOD
CBaseUnknown (IN REFCLSID ClassId
, IN IUnknown
* UnknownOuter OPTIONAL
= NULL
);
110 COMDDKMETHOD
CBaseUnknown(IN IUnknown
* UnknownOuter OPTIONAL
= NULL
);
111 COMDDKMETHOD
virtual ~CBaseUnknown();
112 COMDDKMETHOD
STDMETHODIMP_(ULONG
) NonDelegatedAddRef();
113 COMDDKMETHOD
STDMETHODIMP_(ULONG
) NonDelegatedRelease();
114 COMDDKMETHOD STDMETHODIMP
NonDelegatedQueryInterface(IN REFIID InterfaceId
,OUT PVOID
* Interface
);
115 COMDDKMETHOD
STDMETHODIMP_(ULONG
) IndirectedAddRef();
116 COMDDKMETHOD
STDMETHODIMP_(ULONG
) IndirectedRelease();
117 COMDDKMETHOD STDMETHODIMP
IndirectedQueryInterface(IN REFIID InterfaceId
, OUT PVOID
* Interface
);
120 #if !defined(DEFINE_ABSTRACT_UNKNOWN)
121 #define DEFINE_ABSTRACT_UNKNOWN() \
122 STDMETHOD(QueryInterface)(THIS_ REFIID InterfaceId, PVOID* Interface) PURE; \
123 STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
124 STDMETHOD_(ULONG,Release)(THIS) PURE;
127 #define DEFINE_STD_UNKNOWN() \
128 STDMETHODIMP NonDelegatedQueryInterface( REFIID InterfaceId, PVOID* Interface); \
129 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); \
130 STDMETHODIMP_(ULONG) AddRef(); \
131 STDMETHODIMP_(ULONG) Release();
133 #define IMPLEMENT_STD_UNKNOWN(Class) \
134 STDMETHODIMP Class::QueryInterface( REFIID InterfaceId, PVOID* Interface) { \
135 return m_UnknownOuter->QueryInterface(InterfaceId, Interface);\
137 STDMETHODIMP_(ULONG) Class::AddRef() { \
138 return m_UnknownOuter->AddRef(); \
140 STDMETHODIMP_(ULONG) Class::Release() { \
141 return m_UnknownOuter->Release(); \
150 IN REFCLSID ClassId
);
152 #endif /* !__cplusplus */
159 IN IUnknown
* UnkOuter OPTIONAL
,
161 IN REFIID InterfaceId
,
162 OUT PVOID
* Interface
);
168 IN PDEVICE_OBJECT DeviceObject
);
174 IN PDRIVER_OBJECT DriverObject
,
175 IN PUNICODE_STRING RegistryPathName
,
176 IN KoCreateObjectHandler CreateObjectHandler
);
179 #if defined(__cplusplus)
185 #ifndef _NEW_DELETE_OPERATORS_
186 #define _NEW_DELETE_OPERATORS_
188 inline PVOID
operator new(
192 PVOID result
= ExAllocatePoolWithTag(poolType
,iSize
,'wNCK');
194 RtlZeroMemory(result
,iSize
);
199 inline PVOID
operator new(
204 PVOID result
= ExAllocatePoolWithTag(poolType
,iSize
,tag
);
206 RtlZeroMemory(result
,iSize
);
211 inline void __cdecl
operator delete(
214 if (pVoid
) ExFreePool(pVoid
);
217 #endif /* _NEW_DELETE_OPERATORS_ */
219 #if defined(_SYS_GUID_OPERATOR_EQ_)
220 #define _GUID_OPERATORS_
221 //#pragma message("WARNING: Using system operator==/!= for GUIDs")
224 #ifndef _GUID_OPERATORS_
225 #define _GUID_OPERATORS_
227 __inline BOOL
operator==(const GUID
& guidOne
, const GUID
& guidOther
) {
228 return IsEqualGUIDAligned(guidOne
,guidOther
);
231 __inline BOOL
operator!=(const GUID
& guidOne
, const GUID
& guidOther
) {
232 return !(guidOne
== guidOther
);
235 #endif /* _GUID_OPERATORS_ */
237 #endif /* __cplusplus */