diff fuhtark_test/include/ddk/stdunk.h @ 1500:91c8c3b7cbf0

add: futhark tests for generating vulkan api
author sam <sam@basx.dev>
date Wed, 26 Nov 2025 21:36:48 +0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fuhtark_test/include/ddk/stdunk.h	Wed Nov 26 21:36:48 2025 +0700
@@ -0,0 +1,215 @@
+/*
+    ReactOS Kernel-Mode COM
+    IUnknown implementations
+
+    This file is in the public domain.
+
+    AUTHORS
+        Andrew Greenwood
+*/
+
+#ifndef STDUNK_H
+#define STDUNK_H
+
+#include <punknown.h>
+
+/* ===============================================================
+    INonDelegatingUnknown interface
+*/
+
+DECLARE_INTERFACE(INonDelegatingUnknown)
+{
+    STDMETHOD_(NTSTATUS, NonDelegatingQueryInterface)( THIS_
+        IN  REFIID,
+        OUT PVOID*) PURE;
+
+    STDMETHOD_(ULONG, NonDelegatingAddRef)( THIS ) PURE;
+    STDMETHOD_(ULONG, NonDelegatingRelease)( THIS ) PURE;
+};
+
+typedef INonDelegatingUnknown *PNONDELEGATINGUNKNOWN;
+
+
+/* ===============================================================
+    CUnknown declaration / definition
+
+    There are 2 variants for this, and I'm not sure if the C
+    version is correct.
+*/
+
+#ifdef __cplusplus
+
+class CUnknown : public INonDelegatingUnknown
+{
+    private :
+        LONG m_ref_count;
+        PUNKNOWN m_outer_unknown;
+
+    public :
+        /* CUnknown */
+        CUnknown(PUNKNOWN pUnknownOuter);
+        virtual ~CUnknown();
+
+        PUNKNOWN GetOuterUnknown()
+        { return m_outer_unknown; }
+
+        /* INonDelegatingUnknown */
+        STDMETHODIMP_(ULONG) NonDelegatingAddRef();
+        STDMETHODIMP_(ULONG) NonDelegatingRelease();
+
+        STDMETHODIMP_(NTSTATUS) NonDelegatingQueryInterface(
+            REFIID  rIID,
+            PVOID* ppVoid);
+};
+
+#define DECLARE_STD_UNKNOWN() \
+    STDMETHODIMP_(NTSTATUS) NonDelegatingQueryInterface( \
+        REFIID iid, \
+        PVOID* ppvObject); \
+\
+    STDMETHODIMP_(NTSTATUS) QueryInterface( \
+        REFIID riid, \
+        void** ppv) \
+    { \
+        return GetOuterUnknown()->QueryInterface(riid, ppv); \
+    } \
+\
+    STDMETHODIMP_(ULONG) AddRef() \
+    { \
+        return GetOuterUnknown()->AddRef(); \
+    } \
+\
+    STDMETHODIMP_(ULONG) Release() \
+    { \
+        return GetOuterUnknown()->Release(); \
+    }
+
+#define DEFINE_STD_CONSTRUCTOR(classname) \
+    classname(PUNKNOWN outer_unknown) \
+    : CUnknown(outer_unknown) \
+    { }
+
+#else   /* Not C++ - this is probably very buggy... */
+
+NTSTATUS
+STDMETHODCALLTYPE
+Unknown_QueryInterface(
+    IUnknown* this,
+    IN  REFIID refiid,
+    OUT PVOID* output);
+
+ULONG
+STDMETHODCALLTYPE
+Unknown_AddRef(
+    IUnknown* unknown_this);
+
+ULONG
+STDMETHODCALLTYPE
+Unknown_Release(
+    IUnknown* unknown_this);
+
+typedef struct CUnknown
+{
+    union
+    {
+        IUnknown IUnknown;
+        INonDelegatingUnknown INonDelegatingUnknown;
+    };
+
+    LONG m_ref_count;
+    PUNKNOWN m_outer_unknown;
+} CUnknown;
+
+#endif  /* __cplusplus */
+
+
+
+#ifdef __cplusplus
+
+
+/* ===============================================================
+    Construction helpers
+*/
+
+#define QICAST(typename) \
+    PVOID( (typename) (this) )
+
+#define QICASTUNKNOWN(typename) \
+    PVOID( PUNKNOWN( (typename) (this) ) )
+
+#define STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, tag, base) \
+    classname *new_ptr = new(pool_type, tag) classname(outer_unknown); \
+\
+    if ( ! new_ptr ) \
+        return STATUS_INSUFFICIENT_RESOURCES; \
+\
+    *unknown = PUNKNOWN((base)(new_ptr)); \
+    (*unknown)->AddRef(); \
+    return STATUS_SUCCESS
+
+#define STD_CREATE_BODY_WITH_TAG(classname, unknown, outer_unknown, pool_type, tag, base) \
+    STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, tag, PUNKNOWN)
+
+#define STD_CREATE_BODY_(classname, unknown, outer_unknown, pool_type, base) \
+    STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, 'rCcP', base)
+
+#define STD_CREATE_BODY(classname, unknown, outer_unknown, pool_type) \
+    STD_CREATE_BODY_(classname, unknown, outer_unknown, pool_type, PUNKNOWN)
+
+
+/* ===============================================================
+    Custom "new" and "delete" C++ operators
+*/
+
+#ifndef _NEW_DELETE_OPERATORS_
+#define _NEW_DELETE_OPERATORS_
+
+inline PVOID
+KCOM_New(
+    size_t size,
+    POOL_TYPE pool_type,
+    ULONG tag)
+{
+    PVOID result;
+
+    result = ExAllocatePoolWithTag(pool_type, size, tag);
+
+    if ( result )
+        RtlZeroMemory(result, size);
+
+    return result;
+}
+
+inline PVOID
+operator new (
+    size_t  size,
+    POOL_TYPE pool_type)
+{
+    return KCOM_New(size, pool_type, 'wNcP');
+}
+
+inline PVOID
+operator new (
+    size_t size,
+    POOL_TYPE pool_type,
+    ULONG tag)
+{
+    return KCOM_New(size, pool_type, tag);
+}
+
+inline void __cdecl
+operator delete(
+    PVOID ptr)
+{
+    ExFreePool(ptr);
+}
+
+#endif  /* ALLOCATION_OPERATORS_DEFINED */
+
+
+#else   /* Being compiled with C */
+
+
+#endif  /* __cplusplus */
+
+#endif  /* include guard */