mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
more compatible fix betwin reactos ddk and ms DDK version 3790.1830
svn path=/trunk/; revision=26218
This commit is contained in:
parent
898210e00d
commit
151cc9133b
1 changed files with 261 additions and 43 deletions
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue