Author: greatlrd Date: Sat Mar 31 02:58:02 2007 New Revision: 26218
URL: http://svn.reactos.org/svn/reactos?rev=26218&view=rev Log: more compatible fix betwin reactos ddk and ms DDK version 3790.1830
Modified: trunk/reactos/include/ddk/kcom.h
Modified: trunk/reactos/include/ddk/kcom.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ddk/kcom.h?rev=2621... ============================================================================== --- trunk/reactos/include/ddk/kcom.h (original) +++ trunk/reactos/include/ddk/kcom.h Sat Mar 31 02:58:02 2007 @@ -1,43 +1,261 @@ -/* - ReactOS - Kernel-Mode COM for Kernel Streaming - - Author: - Andrew Greenwood - - Notes: - This is untested, and is for internal use by Kernel Streaming. The - functions here are documented on MSDN. Does this even compile?? - Implementation should be in KS.SYS -*/ - -#ifndef KCOM_H -#define KCOM_H - -#include <ntddk.h> - -COMDDKAPI NTSTATUS NTAPI -KoCreateInstance( - IN REFCLSID ClassId, - IN IUnknown* UnkOuter OPTIONAL, - IN ULONG ClsContext, - IN REFIID InterfaceId, - OUT PVOID* Interface); - -/* Add a kernel COM Create-item entry to a device object */ -COMDDKAPI NTSTATUS NTAPI -KoDeviceInitialize( - IN PDEVICE_OBJECT DeviceObject); - -COMDDKAPI NTSTATUS NTAPI -KoDriverInitialize( - IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPathName, - IN KoCreateObjectHandler CreateObjectHandler); - -/* Decrements refcount for calling interface on an object */ -COMDDKAPI NTSTATUS NTAPI -KoRelease( - IN REFCLSID ClassId); - -#endif + + +#if !defined(_KS_) +#error KS.H must be included before KCOM.H +#endif + +#if !defined(_KCOM_) +#define _KCOM_ + +#if defined(__cplusplus) +extern "C" { +#endif + +#define STATIC_KoCreateObject 0x72CF721CL, 0x525A, 0x11D1, 0x9A, 0xA1, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 +DEFINE_GUIDSTRUCT("72CF721C-525A-11D1-9AA1-00A0C9223196", KoCreateObject); +#define KOSTRING_CreateObject L"{72CF721C-525A-11D1-9AA1-00A0C9223196}" + +#ifndef CLSCTX_KERNEL_SERVER +#define CLSCTX_KERNEL_SERVER 0x00000200 +#endif + +#if !defined(__cplusplus) || _MSC_VER < 1100 +#define STATIC_IID_IKoInitializeParentDeviceObject 0x21B36996, 0x8DE3, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 +DEFINE_GUIDEX(IID_IKoInitializeParentDeviceObject); +#else +interface __declspec(uuid("21B36996-8DE3-11D1-8AE0-00A0C9223196")) IKoInitializeParentDeviceObject; +#endif + +#ifndef COMDDKMETHOD +#ifdef _COMDDK_ +#define COMDDKMETHOD +#else +#define COMDDKMETHOD DECLSPEC_IMPORT +#endif +#endif + +#ifdef _COMDDK_ +#define COMDDKAPI +#else +#define COMDDKAPI DECLSPEC_IMPORT +#endif + +typedef +NTSTATUS +(*KoCreateObjectHandler)( IN REFCLSID ClassId, + IN IUnknown* UnkOuter OPTIONAL, + IN REFIID InterfaceId, + OUT PVOID* Interface); + +#undef INTERFACE +#define INTERFACE INonDelegatedUnknown +DECLARE_INTERFACE(INonDelegatedUnknown) +{ + STDMETHOD(NonDelegatedQueryInterface) + ( + THIS_ + IN REFIID InterfaceId, + OUT PVOID* Interface + ) PURE; + + STDMETHOD_(ULONG,NonDelegatedAddRef) + ( + THIS + ) PURE; + + STDMETHOD_(ULONG,NonDelegatedRelease) + ( + THIS + ) PURE; +}; + +#undef INTERFACE +#define INTERFACE IIndirectedUnknown +DECLARE_INTERFACE(IIndirectedUnknown) +{ + STDMETHOD(IndirectedQueryInterface) + ( + THIS_ + IN REFIID InterfaceId, + OUT PVOID* Interface + ) PURE; + + STDMETHOD_(ULONG,IndirectedAddRef) + ( + THIS + ) PURE; + + STDMETHOD_(ULONG,IndirectedRelease) + ( + THIS + ) PURE; +}; + + +#undef INTERFACE +#define INTERFACE IKoInitializeParentDeviceObject +DECLARE_INTERFACE_(IKoInitializeParentDeviceObject, IUnknown) +{ + STDMETHOD(SetParentDeviceObject) + ( + THIS_ + IN PDEVICE_OBJECT ParentDeviceObject + ) PURE; +}; + + + +#if defined(__cplusplus) + + +class CBaseUnknown : public INonDelegatedUnknown, public IIndirectedUnknown +{ + protected: + LONG m_RefCount; + private: + BOOLEAN m_UsingClassId; + CLSID m_ClassId; + protected: + IUnknown* m_UnknownOuter; + public: + COMDDKMETHOD CBaseUnknown (IN REFCLSID ClassId, IN IUnknown* UnknownOuter OPTIONAL = NULL); + COMDDKMETHOD CBaseUnknown(IN IUnknown* UnknownOuter OPTIONAL = NULL); + COMDDKMETHOD virtual ~CBaseUnknown(); + COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedAddRef(); + COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedRelease(); + COMDDKMETHOD STDMETHODIMP NonDelegatedQueryInterface(IN REFIID InterfaceId,OUT PVOID* Interface); + COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedAddRef(); + COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedRelease(); + COMDDKMETHOD STDMETHODIMP IndirectedQueryInterface(IN REFIID InterfaceId, OUT PVOID* Interface); +}; + + +#if !defined(DEFINE_ABSTRACT_UNKNOWN) + +#define DEFINE_ABSTRACT_UNKNOWN() \ + STDMETHOD(QueryInterface)(THIS_ REFIID InterfaceId, PVOID* Interface) PURE; \ + STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ + STDMETHOD_(ULONG,Release)(THIS) PURE; + +#endif + +#define DEFINE_STD_UNKNOWN() \ + STDMETHODIMP NonDelegatedQueryInterface( REFIID InterfaceId, PVOID* Interface); \ + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); \ + STDMETHODIMP_(ULONG) AddRef(); \ + STDMETHODIMP_(ULONG) Release(); + +#define IMPLEMENT_STD_UNKNOWN(Class) \ + STDMETHODIMP Class::QueryInterface( REFIID InterfaceId, PVOID* Interface) \ + { \ + return m_UnknownOuter->QueryInterface(InterfaceId, Interface);\ + } \ + STDMETHODIMP_(ULONG) Class::AddRef() \ + { \ + return m_UnknownOuter->AddRef(); \ + } \ + STDMETHODIMP_(ULONG) Class::Release() \ + { \ + return m_UnknownOuter->Release(); \ + } +#else + +COMDDKAPI +void +NTAPI +KoRelease( IN REFCLSID ClassId); +#endif // !__cplusplus + +COMDDKAPI +NTSTATUS +NTAPI +KoCreateInstance( IN REFCLSID ClassId, + IN IUnknown* UnkOuter OPTIONAL, + IN ULONG ClsContext, + IN REFIID InterfaceId, + OUT PVOID* Interface); + +COMDDKAPI +NTSTATUS +NTAPI +KoDeviceInitialize( IN PDEVICE_OBJECT DeviceObject); + +COMDDKAPI +NTSTATUS +NTAPI +KoDriverInitialize( IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPathName, + IN KoCreateObjectHandler CreateObjectHandler); + + +#if defined(__cplusplus) +} +#endif + +#ifdef __cplusplus + +#ifndef _NEW_DELETE_OPERATORS_ +#define _NEW_DELETE_OPERATORS_ + +inline PVOID operator new +( + size_t iSize, + POOL_TYPE poolType +) +{ + PVOID result = ExAllocatePoolWithTag(poolType,iSize,'wNCK'); + if (result) + { + RtlZeroMemory(result,iSize); + } + return result; +} + +inline PVOID operator new +( + size_t iSize, + POOL_TYPE poolType, + ULONG tag +) +{ + PVOID result = ExAllocatePoolWithTag(poolType,iSize,tag); + if (result) + { + RtlZeroMemory(result,iSize); + } + return result; +} + +inline void __cdecl operator delete +( + PVOID pVoid +) +{ + ExFreePool(pVoid); +} + +#endif + +#if defined(_SYS_GUID_OPERATOR_EQ_) +#define _GUID_OPERATORS_ +#pragma message("WARNING: Using system operator==/!= for GUIDs") +#endif + +#ifndef _GUID_OPERATORS_ +#define _GUID_OPERATORS_ + +__inline BOOL operator==(const GUID& guidOne, const GUID& guidOther) +{ + return IsEqualGUIDAligned(guidOne,guidOther); +} +__inline BOOL operator!=(const GUID& guidOne, const GUID& guidOther) +{ + return !(guidOne == guidOther); +} + +#endif + +#endif + +#endif +