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=262…
==============================================================================
--- 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
+