/*
 * kcom.h
 *
 * This file is part of the ReactOS PSDK package.
 *
 * Contributors:
 *   Created by Andrew Greenwood.
 *
 * THIS SOFTWARE IS NOT COPYRIGHTED
 *
 * This source code is offered for use in the public domain. You may
 * use, modify or distribute it freely.
 *
 * This code is distributed in the hope that it will be useful but
 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 * DISCLAIMED. This includes but is not limited to warranties of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#if !defined(_KCOM_)
#define _KCOM_

#include <ks.h>

#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)(
  REFCLSID ClassId,
  IUnknown* UnkOuter,
  REFIID InterfaceId,
  PVOID* Interface);

#undef INTERFACE
#define INTERFACE INonDelegatedUnknown
DECLARE_INTERFACE(INonDelegatedUnknown) {
  STDMETHOD(NonDelegatedQueryInterface)(
    THIS_
	REFIID InterfaceId,
	PVOID* Interface
  ) PURE;

  STDMETHOD_(ULONG,NonDelegatedAddRef)(
    THIS
  ) PURE;

  STDMETHOD_(ULONG,NonDelegatedRelease)(
    THIS
  ) PURE;
};

#undef INTERFACE
#define INTERFACE IIndirectedUnknown
DECLARE_INTERFACE(IIndirectedUnknown) {
  STDMETHOD(IndirectedQueryInterface)(
    THIS_
	REFIID InterfaceId,
	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_
	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 (REFCLSID ClassId, IUnknown* UnknownOuter = NULL);
    COMDDKMETHOD CBaseUnknown(IUnknown* UnknownOuter = NULL);
    COMDDKMETHOD virtual ~CBaseUnknown();
    COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedAddRef();
    COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedRelease();
    COMDDKMETHOD STDMETHODIMP NonDelegatedQueryInterface(REFIID InterfaceId, PVOID* Interface);
    COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedAddRef();
    COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedRelease();
    COMDDKMETHOD STDMETHODIMP IndirectedQueryInterface(REFIID InterfaceId, 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(
  REFCLSID ClassId);

#endif /* !__cplusplus */

COMDDKAPI
NTSTATUS
NTAPI
KoCreateInstance(
  REFCLSID ClassId,
  IUnknown* UnkOuter,
  ULONG ClsContext,
  REFIID InterfaceId,
  PVOID* Interface);

COMDDKAPI
NTSTATUS
NTAPI
KoDeviceInitialize(
  PDEVICE_OBJECT DeviceObject);

COMDDKAPI
NTSTATUS
NTAPI
KoDriverInitialize(
  PDRIVER_OBJECT DriverObject,
  PUNICODE_STRING RegistryPathName,
  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)
{
  if (pVoid) ExFreePool(pVoid);
}

#endif /* _NEW_DELETE_OPERATORS_ */

#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 WINBOOL operator==(const GUID& guidOne, const GUID& guidOther) {
  return IsEqualGUIDAligned(guidOne,guidOther);
}

__inline WINBOOL operator!=(const GUID& guidOne, const GUID& guidOther) {
  return !(guidOne == guidOther);
}

#endif /* _GUID_OPERATORS_ */

#endif /* __cplusplus */

#endif /* _KCOM_ */
