#include <rpc.h>
#include <rpcndr.h>

#ifndef _WTYPES_H
#    define _WTYPES_H
#    if __GNUC__ >= 3
#        pragma GCC system_header
#    endif

#    ifdef __cplusplus
extern "C"
{
#    endif

#    define IID_NULL GUID_NULL
#    define CLSID_NULL GUID_NULL
#    define CBPCLIPDATA(d) ((d).cbSize - sizeof((d).ulClipFmt))
#    define ROTFLAGS_REGISTRATIONKEEPSALIVE 0x01
#    define ROTFLAGS_ALLOWANYCLIENT 0x02

#    ifndef __BLOB_T_DEFINED /* also in winsock2.h */
#        define __BLOB_T_DEFINED
    typedef struct _BLOB
    {
        ULONG cbSize;
        BYTE* pBlobData;
    } BLOB, *PBLOB, *LPBLOB;
#    endif
    typedef enum tagDVASPECT
    {
        DVASPECT_CONTENT = 1,
        DVASPECT_THUMBNAIL = 2,
        DVASPECT_ICON = 4,
        DVASPECT_DOCPRINT = 8
    } DVASPECT;
    typedef enum tagDVASPECT2
    {
        DVASPECT_OPAQUE = 16,
        DVASPECT_TRANSPARENT = 32
    } DVASPECT2;
    typedef enum tagSTATFLAG
    {
        STATFLAG_DEFAULT = 0,
        STATFLAG_NONAME = 1
    } STATFLAG;
    typedef enum tagMEMCTX
    {
        MEMCTX_LOCAL = 0,
        MEMCTX_TASK,
        MEMCTX_SHARED,
        MEMCTX_MACSYSTEM,
        MEMCTX_UNKNOWN = -1,
        MEMCTX_SAME = -2
    } MEMCTX;
    typedef enum tagMSHCTX
    {
        MSHCTX_LOCAL = 0,
        MSHCTX_NOSHAREDMEM,
        MSHCTX_DIFFERENTMACHINE,
        MSHCTX_INPROC,
        MSHCTX_CROSSCTX
    } MSHCTX;
    typedef enum tagCLSCTX
    {
        CLSCTX_INPROC_SERVER = 1,
        CLSCTX_INPROC_HANDLER = 2,
        CLSCTX_LOCAL_SERVER = 4,
        CLSCTX_INPROC_SERVER16 = 8,
        CLSCTX_REMOTE_SERVER = 16
    } CLSCTX;
    typedef enum tagMSHLFLAGS
    {
        MSHLFLAGS_NORMAL,
        MSHLFLAGS_TABLESTRONG,
        MSHLFLAGS_TABLEWEAK
    } MSHLFLAGS;
    typedef struct _FLAGGED_WORD_BLOB
    {
        unsigned long fFlags;
        unsigned long clSize;
        unsigned short asData[1];
    } FLAGGED_WORD_BLOB;

#    ifndef OLE2ANSI
    typedef WCHAR OLECHAR;
    typedef LPWSTR LPOLESTR;
    typedef LPCWSTR LPCOLESTR;
#        define OLESTR(s) L##s
#    else
typedef char OLECHAR;
typedef LPSTR LPOLESTR;
typedef LPCSTR LPCOLESTR;
#        define OLESTR(s) s
#    endif
    typedef unsigned short VARTYPE;
    typedef short VARIANT_BOOL;
    typedef VARIANT_BOOL _VARIANT_BOOL;
#    define VARIANT_TRUE ((VARIANT_BOOL)0xffff)
#    define VARIANT_FALSE ((VARIANT_BOOL)0)
    typedef OLECHAR* BSTR;
    typedef FLAGGED_WORD_BLOB* wireBSTR;
    typedef BSTR* LPBSTR;
    typedef LONG SCODE;
    typedef void* HCONTEXT;
    typedef union tagCY
    {
        _ANONYMOUS_STRUCT struct
        {
            unsigned long Lo;
            long Hi;
        } _STRUCT_NAME(s);
        LONGLONG int64;
    } CY;
    typedef double DATE;
    typedef struct tagBSTRBLOB
    {
        ULONG cbSize;
        PBYTE pData;
    } BSTRBLOB;
    typedef struct tagBSTRBLOB* LPBSTRBLOB;
    typedef struct tagCLIPDATA
    {
        ULONG cbSize;
        long ulClipFmt;
        PBYTE pClipData;
    } CLIPDATA;
    typedef enum tagSTGC
    {
        STGC_DEFAULT,
        STGC_OVERWRITE,
        STGC_ONLYIFCURRENT,
        STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE
    } STGC;
    typedef enum tagSTGMOVE
    {
        STGMOVE_MOVE,
        STGMOVE_COPY,
        STGMOVE_SHALLOWCOPY
    } STGMOVE;
    enum VARENUM
    {
        VT_EMPTY,
        VT_NULL,
        VT_I2,
        VT_I4,
        VT_R4,
        VT_R8,
        VT_CY,
        VT_DATE,
        VT_BSTR,
        VT_DISPATCH,
        VT_ERROR,
        VT_BOOL,
        VT_VARIANT,
        VT_UNKNOWN,
        VT_DECIMAL,
        VT_I1 = 16,
        VT_UI1,
        VT_UI2,
        VT_UI4,
        VT_I8,
        VT_UI8,
        VT_INT,
        VT_UINT,
        VT_VOID,
        VT_HRESULT,
        VT_PTR,
        VT_SAFEARRAY,
        VT_CARRAY,
        VT_USERDEFINED,
        VT_LPSTR,
        VT_LPWSTR,
        VT_RECORD = 36,
        VT_INT_PTR = 37,
        VT_UINT_PTR = 38,
        VT_FILETIME = 64,
        VT_BLOB,
        VT_STREAM,
        VT_STORAGE,
        VT_STREAMED_OBJECT,
        VT_STORED_OBJECT,
        VT_BLOB_OBJECT,
        VT_CF,
        VT_CLSID,
        VT_BSTR_BLOB = 0xfff,
        VT_VECTOR = 0x1000,
        VT_ARRAY = 0x2000,
        VT_BYREF = 0x4000,
        VT_RESERVED = 0x8000,
        VT_ILLEGAL = 0xffff,
        VT_ILLEGALMASKED = 0xfff,
        VT_TYPEMASK = 0xfff
    };

    typedef struct _BYTE_SIZEDARR
    {
        unsigned long clSize;
        byte* pData;
    } BYTE_SIZEDARR;
    typedef struct _SHORT_SIZEDARR
    {
        unsigned long clSize;
        unsigned short* pData;
    } WORD_SIZEDARR;
    typedef struct _LONG_SIZEDARR
    {
        unsigned long clSize;
        unsigned long* pData;
    } DWORD_SIZEDARR;
    typedef struct _HYPER_SIZEDARR
    {
        unsigned long clSize;
        hyper* pData;
    } HYPER_SIZEDARR;
    typedef double DOUBLE;
    typedef struct tagDEC
    {
        USHORT wReserved;
        _ANONYMOUS_UNION union
        {
            _ANONYMOUS_STRUCT struct
            {
                BYTE scale;
                BYTE sign;
            } _STRUCT_NAME(s);
            USHORT signscale;
        } DUMMYUNIONNAME;
        ULONG Hi32;
        _ANONYMOUS_UNION union
        {
            _ANONYMOUS_STRUCT struct
            {
                ULONG Lo32;
                ULONG Mid32;
            } _STRUCT_NAME(s2);
            ULONGLONG Lo64;
        } DUMMYUNIONNAME2;
    } DECIMAL;
    typedef DECIMAL* LPDECIMAL;
#    define DECIMAL_NEG ((BYTE)0x80)
#    ifdef NONAMELESSUNION
#        define DECIMAL_SETZERO(d)                                                      \
            {                                                                           \
                (d).DUMMYUNIONNAME2.Lo64 = (d).Hi32 = (d).DUMMYUNIONNAME.signscale = 0; \
            }
#    else
#        define DECIMAL_SETZERO(d)                       \
            {                                            \
                (d).Lo64 = (d).Hi32 = (d).signscale = 0; \
            }
#    endif
    typedef void* HMETAFILEPICT;
#    ifdef __cplusplus
}
#    endif
#endif
