Home | History | Annotate | Download | only in include
      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