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
DECLARE_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
DECLARE_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
DECLARE_INTERFACE_(IKoInitializeParentDeviceObject,IUnknown)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 
new(size_t iSize,POOL_TYPE poolType)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 
new(size_t iSize,POOL_TYPE poolType,ULONG tag)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 
delete(PVOID pVoid)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