kcom.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. #if !defined(_KCOM_)
  21. #define _KCOM_
  22. #include <ks.h>
  23. #if defined(__cplusplus)
  24. extern "C" {
  25. #endif
  26. #define STATIC_KoCreateObject 0x72CF721C, 0x525A, 0x11D1, 0x9A, 0xA1, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  27. DEFINE_GUIDSTRUCT("72CF721C-525A-11D1-9AA1-00A0C9223196", KoCreateObject);
  28. #define KOSTRING_CreateObject L"{72CF721C-525A-11D1-9AA1-00A0C9223196}"
  29. #ifndef CLSCTX_KERNEL_SERVER
  30. #define CLSCTX_KERNEL_SERVER 0x00000200
  31. #endif
  32. #if !defined(__cplusplus) || _MSC_VER < 1100
  33. #define STATIC_IID_IKoInitializeParentDeviceObject 0x21B36996, 0x8DE3, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  34. DEFINE_GUIDEX(IID_IKoInitializeParentDeviceObject);
  35. #else
  36. interface __declspec(uuid("21B36996-8DE3-11D1-8AE0-00A0C9223196")) IKoInitializeParentDeviceObject;
  37. #endif
  38. #ifndef COMDDKMETHOD
  39. #ifdef _COMDDK_
  40. #define COMDDKMETHOD
  41. #else
  42. #define COMDDKMETHOD DECLSPEC_IMPORT
  43. #endif
  44. #endif
  45. #ifdef _COMDDK_
  46. #define COMDDKAPI
  47. #else
  48. #define COMDDKAPI DECLSPEC_IMPORT
  49. #endif
  50. typedef
  51. NTSTATUS
  52. (*KoCreateObjectHandler)(
  53. REFCLSID ClassId,
  54. IUnknown* UnkOuter,
  55. REFIID InterfaceId,
  56. PVOID* Interface);
  57. #undef INTERFACE
  58. #define INTERFACE INonDelegatedUnknown
  59. DECLARE_INTERFACE(INonDelegatedUnknown) {
  60. STDMETHOD(NonDelegatedQueryInterface)(
  61. THIS_
  62. REFIID InterfaceId,
  63. PVOID* Interface
  64. ) PURE;
  65. STDMETHOD_(ULONG,NonDelegatedAddRef)(
  66. THIS
  67. ) PURE;
  68. STDMETHOD_(ULONG,NonDelegatedRelease)(
  69. THIS
  70. ) PURE;
  71. };
  72. #undef INTERFACE
  73. #define INTERFACE IIndirectedUnknown
  74. DECLARE_INTERFACE(IIndirectedUnknown) {
  75. STDMETHOD(IndirectedQueryInterface)(
  76. THIS_
  77. REFIID InterfaceId,
  78. PVOID* Interface
  79. ) PURE;
  80. STDMETHOD_(ULONG,IndirectedAddRef)(
  81. THIS
  82. ) PURE;
  83. STDMETHOD_(ULONG,IndirectedRelease)(
  84. THIS
  85. ) PURE;
  86. };
  87. #undef INTERFACE
  88. #define INTERFACE IKoInitializeParentDeviceObject
  89. DECLARE_INTERFACE_(IKoInitializeParentDeviceObject, IUnknown) {
  90. STDMETHOD(SetParentDeviceObject)(
  91. THIS_
  92. PDEVICE_OBJECT ParentDeviceObject
  93. ) PURE;
  94. };
  95. #if defined(__cplusplus)
  96. class CBaseUnknown : public INonDelegatedUnknown, public IIndirectedUnknown {
  97. protected:
  98. LONG m_RefCount;
  99. private:
  100. BOOLEAN m_UsingClassId;
  101. CLSID m_ClassId;
  102. protected:
  103. IUnknown* m_UnknownOuter;
  104. public:
  105. COMDDKMETHOD CBaseUnknown (REFCLSID ClassId, IUnknown* UnknownOuter = NULL);
  106. COMDDKMETHOD CBaseUnknown(IUnknown* UnknownOuter = NULL);
  107. COMDDKMETHOD virtual ~CBaseUnknown();
  108. COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedAddRef();
  109. COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedRelease();
  110. COMDDKMETHOD STDMETHODIMP NonDelegatedQueryInterface(REFIID InterfaceId, PVOID* Interface);
  111. COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedAddRef();
  112. COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedRelease();
  113. COMDDKMETHOD STDMETHODIMP IndirectedQueryInterface(REFIID InterfaceId, PVOID* Interface);
  114. };
  115. #if !defined(DEFINE_ABSTRACT_UNKNOWN)
  116. #define DEFINE_ABSTRACT_UNKNOWN() \
  117. STDMETHOD(QueryInterface)(THIS_ REFIID InterfaceId, PVOID* Interface) PURE; \
  118. STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
  119. STDMETHOD_(ULONG,Release)(THIS) PURE;
  120. #endif
  121. #define DEFINE_STD_UNKNOWN() \
  122. STDMETHODIMP NonDelegatedQueryInterface( REFIID InterfaceId, PVOID* Interface); \
  123. STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); \
  124. STDMETHODIMP_(ULONG) AddRef(); \
  125. STDMETHODIMP_(ULONG) Release();
  126. #define IMPLEMENT_STD_UNKNOWN(Class) \
  127. STDMETHODIMP Class::QueryInterface( REFIID InterfaceId, PVOID* Interface) { \
  128. return m_UnknownOuter->QueryInterface(InterfaceId, Interface);\
  129. } \
  130. STDMETHODIMP_(ULONG) Class::AddRef() { \
  131. return m_UnknownOuter->AddRef(); \
  132. } \
  133. STDMETHODIMP_(ULONG) Class::Release() { \
  134. return m_UnknownOuter->Release(); \
  135. }
  136. #else
  137. COMDDKAPI
  138. void
  139. NTAPI
  140. KoRelease(
  141. REFCLSID ClassId);
  142. #endif /* !__cplusplus */
  143. COMDDKAPI
  144. NTSTATUS
  145. NTAPI
  146. KoCreateInstance(
  147. REFCLSID ClassId,
  148. IUnknown* UnkOuter,
  149. ULONG ClsContext,
  150. REFIID InterfaceId,
  151. PVOID* Interface);
  152. COMDDKAPI
  153. NTSTATUS
  154. NTAPI
  155. KoDeviceInitialize(
  156. PDEVICE_OBJECT DeviceObject);
  157. COMDDKAPI
  158. NTSTATUS
  159. NTAPI
  160. KoDriverInitialize(
  161. PDRIVER_OBJECT DriverObject,
  162. PUNICODE_STRING RegistryPathName,
  163. KoCreateObjectHandler CreateObjectHandler);
  164. #if defined(__cplusplus)
  165. }
  166. #endif
  167. #ifdef __cplusplus
  168. #ifndef _NEW_DELETE_OPERATORS_
  169. #define _NEW_DELETE_OPERATORS_
  170. inline PVOID operator new(
  171. size_t iSize,
  172. POOL_TYPE poolType)
  173. {
  174. PVOID result = ExAllocatePoolWithTag(poolType,iSize,'wNCK');
  175. if (result) {
  176. RtlZeroMemory(result,iSize);
  177. }
  178. return result;
  179. }
  180. inline PVOID operator new(
  181. size_t iSize,
  182. POOL_TYPE poolType,
  183. ULONG tag)
  184. {
  185. PVOID result = ExAllocatePoolWithTag(poolType,iSize,tag);
  186. if (result) {
  187. RtlZeroMemory(result,iSize);
  188. }
  189. return result;
  190. }
  191. inline void __cdecl operator delete(
  192. PVOID pVoid)
  193. {
  194. if (pVoid) ExFreePool(pVoid);
  195. }
  196. #endif /* _NEW_DELETE_OPERATORS_ */
  197. #if defined(_SYS_GUID_OPERATOR_EQ_)
  198. #define _GUID_OPERATORS_
  199. //#pragma message("WARNING: Using system operator==/!= for GUIDs")
  200. #endif
  201. #ifndef _GUID_OPERATORS_
  202. #define _GUID_OPERATORS_
  203. __inline WINBOOL operator==(const GUID& guidOne, const GUID& guidOther) {
  204. return IsEqualGUIDAligned(guidOne,guidOther);
  205. }
  206. __inline WINBOOL operator!=(const GUID& guidOne, const GUID& guidOther) {
  207. return !(guidOne == guidOther);
  208. }
  209. #endif /* _GUID_OPERATORS_ */
  210. #endif /* __cplusplus */
  211. #endif /* _KCOM_ */