/*
 * Basic types used by COM interfaces
 *
 * Copyright 2002 Ove Kaaven
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "basetsd.h";
import "guiddef.h";

[
  uuid(D3980A60-910C-1068-9341-00DD010F2F1C),
  version(0.1),
  pointer_default(unique)
]

interface IWinTypes
{

/******************** BASIC WIN32 TYPES ********************/
cpp_quote("#if 0 /* winnt.h */") /* don't redefine these */

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long BOOL;
typedef unsigned char UCHAR;
typedef int INT;
typedef unsigned int UINT;
typedef short SHORT;
typedef unsigned short USHORT;
typedef long LONG;
typedef unsigned long ULONG;
typedef float FLOAT;

typedef void *PVOID, *LPVOID;

typedef DWORD *LPDWORD;

typedef char CHAR;
typedef [string] CHAR *LPSTR;
typedef [string] const CHAR *LPCSTR;

typedef wchar_t WCHAR;
typedef [string] WCHAR *LPWSTR;
typedef [string] const WCHAR *LPCWSTR;

typedef boolean BOOLEAN;

typedef DWORD COLORREF;

typedef void *HANDLE;
#define DECLARE_HANDLE(name) typedef void *name
#define DECLARE_WIREM_HANDLE(name) typedef [wire_marshal(wire##name)] void*name

DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HTASK);
DECLARE_HANDLE(HKEY);
DECLARE_HANDLE(HDESK);
DECLARE_HANDLE(HMF);
DECLARE_HANDLE(HEMF);
DECLARE_HANDLE(HPEN);
DECLARE_HANDLE(HRSRC);
DECLARE_HANDLE(HSTR);
DECLARE_HANDLE(HWINSTA);
DECLARE_HANDLE(HKL);
DECLARE_HANDLE(HGDIOBJ);

typedef HANDLE HDWP;

typedef LONG_PTR LRESULT;

typedef LONG HRESULT;
typedef DWORD LCID;

typedef unsigned __int64 DWORDLONG;
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;

typedef struct _LARGE_INTEGER {
  LONGLONG QuadPart;
} LARGE_INTEGER;

typedef struct _ULARGE_INTEGER {
  ULONGLONG QuadPart;
} ULARGE_INTEGER;

typedef struct _SID_IDENTIFIER_AUTHORITY {
  UCHAR Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;

typedef struct _SID {
  UCHAR Revision;
  UCHAR SubAuthorityCount;
  SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
  [size_is(SubAuthorityCount)] ULONG SubAuthority[*];
} SID, *PSID;

typedef USHORT SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;

typedef struct _ACL {
  UCHAR AclRevision;
  UCHAR Sbz1;
  USHORT AclSize;
  USHORT AceCount;
  USHORT Sbz2;
} ACL;
typedef ACL *PACL;

typedef struct _SECURITY_DESCRIPTOR {
  UCHAR Revision;
  UCHAR Sbz1;
  SECURITY_DESCRIPTOR_CONTROL Control;
  PSID Owner;
  PSID Group;
  PACL Sacl;
  PACL Dacl;
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;

typedef struct _SECURITY_ATTRIBUTES
{
    DWORD nLength;
    [size_is(nLength)] LPVOID lpSecurityDescriptor;
    BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;

typedef struct tagSIZE
{
    LONG cx;
    LONG cy;
} SIZE, *PSIZE, *LPSIZE;
typedef SIZE SIZEL, *PSIZEL, *LPSIZEL;

typedef struct tagPOINT
{
    LONG  x;
    LONG  y;
} POINT, *PPOINT, *LPPOINT;

typedef struct _POINTL
{
    LONG x;
    LONG y;
} POINTL, *PPOINTL;

typedef struct tagRECT
{
    LONG left;
    LONG top;
    LONG right;
    LONG bottom;
} RECT, *PRECT, *LPRECT;
typedef const RECT *LPCRECT;

typedef struct _RECTL
{
    LONG left;
    LONG top;
    LONG right;
    LONG bottom;
} RECTL, *PRECTL, *LPRECTL;
typedef const RECTL *LPCRECTL;

typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;

cpp_quote("#endif /* winnt.h */")

cpp_quote("#ifdef _MSC_VER") /* for IDL and MSVC only */
typedef double DOUBLE;
cpp_quote("#else")
cpp_quote("typedef double DECLSPEC_ALIGN(8) DOUBLE;")
cpp_quote("#endif")

cpp_quote("#ifndef _PALETTEENTRY_DEFINED")
cpp_quote("#define _PALETTEENTRY_DEFINED")
typedef struct tagPALETTEENTRY {
  BYTE peRed;
  BYTE peGreen;
  BYTE peBlue;
  BYTE peFlags;
} PALETTEENTRY, *PPALETTEENTRY, *LPPALETTEENTRY;
cpp_quote("#endif")

cpp_quote("#ifndef _LOGPALETTE_DEFINED")
cpp_quote("#define _LOGPALETTE_DEFINED")
typedef struct tagLOGPALETTE
{
  WORD palVersion;
  WORD palNumEntries;
  [size_is(palNumEntries)] PALETTEENTRY palPalEntry[*];
} LOGPALETTE, *PLOGPALETTE, *LPLOGPALETTE;
cpp_quote("#endif")

cpp_quote("#ifndef _FILETIME_")
cpp_quote("#define _FILETIME_")
typedef struct _FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
cpp_quote("#endif")

cpp_quote("#ifndef _TEXTMETRIC_DEFINED")
cpp_quote("#define _TEXTMETRIC_DEFINED")
typedef struct tagTEXTMETRICA
{
    LONG      tmHeight;
    LONG      tmAscent;
    LONG      tmDescent;
    LONG      tmInternalLeading;
    LONG      tmExternalLeading;
    LONG      tmAveCharWidth;
    LONG      tmMaxCharWidth;
    LONG      tmWeight;
    LONG      tmOverhang;
    LONG      tmDigitizedAspectX;
    LONG      tmDigitizedAspectY;
    BYTE      tmFirstChar;
    BYTE      tmLastChar;
    BYTE      tmDefaultChar;
    BYTE      tmBreakChar;
    BYTE      tmItalic;
    BYTE      tmUnderlined;
    BYTE      tmStruckOut;
    BYTE      tmPitchAndFamily;
    BYTE      tmCharSet;
} TEXTMETRICA, *LPTEXTMETRICA, *PTEXTMETRICA;

typedef struct tagTEXTMETRICW
{
    LONG      tmHeight;
    LONG      tmAscent;
    LONG      tmDescent;
    LONG      tmInternalLeading;
    LONG      tmExternalLeading;
    LONG      tmAveCharWidth;
    LONG      tmMaxCharWidth;
    LONG      tmWeight;
    LONG      tmOverhang;
    LONG      tmDigitizedAspectX;
    LONG      tmDigitizedAspectY;
    WCHAR     tmFirstChar;
    WCHAR     tmLastChar;
    WCHAR     tmDefaultChar;
    WCHAR     tmBreakChar;
    BYTE      tmItalic;
    BYTE      tmUnderlined;
    BYTE      tmStruckOut;
    BYTE      tmPitchAndFamily;
    BYTE      tmCharSet;
} TEXTMETRICW, *LPTEXTMETRICW, *PTEXTMETRICW;
cpp_quote("#endif")

/******************** BASIC COM/OLE TYPES ********************/

typedef WCHAR OLECHAR;
typedef [string] OLECHAR *LPOLESTR;
typedef [string] const OLECHAR *LPCOLESTR;
cpp_quote("#ifndef __WINESRC__")
cpp_quote("#define OLESTR(str) L##str")
cpp_quote("#endif")

typedef LONG SCODE;

typedef struct _COAUTHIDENTITY {
  [size_is(UserLength+1)] USHORT *User;
  ULONG UserLength;
  [size_is(DomainLength+1)] USHORT *Domain;
  ULONG DomainLength;
  [size_is(PasswordLength+1)] USHORT *Password;
  ULONG PasswordLength;
  ULONG Flags;
} COAUTHIDENTITY;

typedef struct _COAUTHINFO {
  DWORD dwAuthnSvc;
  DWORD dwAuthzSvc;
  LPWSTR pwszServerPrincName;
  DWORD dwAuthnLevel;
  DWORD dwImpersonationLevel;
  COAUTHIDENTITY *pAuthIdentityData;
  DWORD dwCapabilities;
} COAUTHINFO;

typedef enum tagMEMCTX {
  MEMCTX_TASK      = 1,
  MEMCTX_SHARED    = 2,
  MEMCTX_MACSYSTEM = 3,
  MEMCTX_UNKNOWN   = -1,
  MEMCTX_SAME      = -2
} MEMCTX;

cpp_quote("#ifndef _ROT_COMPARE_MAX_DEFINED")
cpp_quote("#define _ROT_COMPARE_MAX_DEFINED")
cpp_quote("#define ROT_COMPARE_MAX 2048")
cpp_quote("#endif")

cpp_quote("#ifndef _ROTFLAGS_DEFINED")
cpp_quote("#define _ROTFLAGS_DEFINED")
cpp_quote("#define ROTFLAGS_REGISTRATIONKEEPSALIVE 0x1")
cpp_quote("#define ROTFLAGS_ALLOWANYCLIENT 0x2")
cpp_quote("#endif")

typedef enum tagCLSCTX {
  CLSCTX_INPROC_SERVER        = 0x1,
  CLSCTX_INPROC_HANDLER       = 0x2,
  CLSCTX_LOCAL_SERVER         = 0x4,
  CLSCTX_INPROC_SERVER16      = 0x8,
  CLSCTX_REMOTE_SERVER        = 0x10,
  CLSCTX_INPROC_HANDLER16     = 0x20,
  CLSCTX_INPROC_SERVERX86     = 0x40,
  CLSCTX_INPROC_HANDLERX86    = 0x80,
  CLSCTX_ESERVER_HANDLER      = 0x100,
  CLSCTX_NO_CODE_DOWNLOAD     = 0x400,
  CLSCTX_NO_CUSTOM_MARSHAL    = 0x1000,
  CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
  CLSCTX_NO_FAILURE_LOG       = 0x4000,
  CLSCTX_DISABLE_AAA          = 0x8000,
  CLSCTX_ENABLE_AAA           = 0x10000,
  CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000
} CLSCTX;

cpp_quote("#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER)")
cpp_quote("#define CLSCTX_ALL (CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)")
cpp_quote("#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)")

typedef enum tagMSHLFLAGS {
  MSHLFLAGS_NORMAL      = 0,
  MSHLFLAGS_TABLESTRONG = 1,
  MSHLFLAGS_TABLEWEAK   = 2,
  MSHLFLAGS_NOPING      = 4
} MSHLFLAGS;

typedef enum tagMSHCTX {
  MSHCTX_LOCAL            = 0,
  MSHCTX_NOSHAREDMEM      = 1,
  MSHCTX_DIFFERENTMACHINE = 2,
  MSHCTX_INPROC           = 3,
  MSHCTX_CROSSCTX         = 4
} MSHCTX;

/******************** BLOB TYPES ********************/

typedef struct _BYTE_BLOB {
  unsigned long clSize;
  [size_is(clSize)] byte abData[];
} BYTE_BLOB;
typedef [unique] BYTE_BLOB *UP_BYTE_BLOB;

typedef struct _FLAGGED_BYTE_BLOB {
  unsigned long fFlags;
  unsigned long clSize;
  [size_is(clSize)] byte abData[];
} FLAGGED_BYTE_BLOB;
typedef [unique] FLAGGED_BYTE_BLOB *UP_FLAGGED_BYTE_BLOB;

typedef struct _FLAGGED_WORD_BLOB {
  unsigned long fFlags;
  unsigned long clSize;
  [size_is(clSize)] unsigned short asData[];
} FLAGGED_WORD_BLOB;
typedef [unique] FLAGGED_WORD_BLOB *UP_FLAGGED_WORD_BLOB;

typedef struct _BYTE_SIZEDARR {
  unsigned long clSize;
  [size_is(clSize)] byte *pData;
} BYTE_SIZEDARR;

typedef struct _SHORT_SIZEDARR {
  unsigned long clSize;
  [size_is(clSize)] unsigned short *pData;
} WORD_SIZEDARR;

typedef struct _LONG_SIZEDARR {
  unsigned long clSize;
  [size_is(clSize)] unsigned long *pData;
} DWORD_SIZEDARR;

typedef struct _HYPER_SIZEDARR {
  unsigned long clSize;
  [size_is(clSize)] hyper *pData;
} HYPER_SIZEDARR;

/******************** GDI TYPES ********************/

const unsigned long WDT_INPROC_CALL   = 0x48746457;
const unsigned long WDT_REMOTE_CALL   = 0x52746457;
const unsigned long WDT_INPROC64_CALL = 0x50746457;

typedef union _userCLIPFORMAT switch(long fContext) u {
  case WDT_INPROC_CALL: DWORD dwValue;
  case WDT_REMOTE_CALL: LPWSTR pwszName;
} userCLIPFORMAT;

typedef [unique] userCLIPFORMAT *wireCLIPFORMAT;
typedef [wire_marshal(wireCLIPFORMAT)] WORD CLIPFORMAT;

typedef struct tagRemHGLOBAL {
  long fNullHGlobal;
  unsigned long cbData;
  [size_is(cbData)] byte data[];
} RemHGLOBAL;

typedef union _userHGLOBAL switch(long fContext) u {
  case WDT_INPROC_CALL: long               hInproc;
  case WDT_REMOTE_CALL: FLAGGED_BYTE_BLOB *hRemote;
  default:              long               hGlobal;
} userHGLOBAL;

typedef [unique] userHGLOBAL *wireHGLOBAL;

typedef struct tagRemHMETAFILEPICT {
  long mm;
  long xExt;
  long yExt;
  unsigned long cbData;
  [size_is(cbData)] byte data[];
} RemHMETAFILEPICT;

typedef union _userHMETAFILE switch(long fContext) u {
  case WDT_INPROC_CALL: long       hInproc;
  case WDT_REMOTE_CALL: BYTE_BLOB *hRemote;
  default:              long       hGlobal;
} userHMETAFILE;

typedef [unique] userHMETAFILE *wireHMETAFILE;

typedef struct _remoteMETAFILEPICT {
  long mm;
  long xExt;
  long yExt;
  userHMETAFILE *hMF;
} remoteMETAFILEPICT;

typedef union _userHMETAFILEPICT switch(long fContext) u {
  case WDT_INPROC_CALL: long                hInproc;
  case WDT_REMOTE_CALL: remoteMETAFILEPICT *hRemote;
  default:              long                hGlobal;
} userHMETAFILEPICT;

typedef [unique] userHMETAFILEPICT *wireHMETAFILEPICT;

typedef struct tagRemHENHMETAFILE {
  unsigned long cbData;
  [size_is(cbData)] byte data[];
} RemHENHMETAFILE;

typedef union _userHENHMETAFILE switch(long fContext) u {
  case WDT_INPROC_CALL: long       hInproc;
  case WDT_REMOTE_CALL: BYTE_BLOB *hRemote;
  default:              long       hGlobal;
} userHENHMETAFILE;

typedef [unique] userHENHMETAFILE *wireHENHMETAFILE;

typedef struct tagRemHBITMAP
{
  unsigned long cbData;
  [size_is(cbData)] byte data[];
} RemHBITMAP;

typedef struct _userBITMAP {
  LONG bmType;
  LONG bmWidth;
  LONG bmHeight;
  LONG bmWidthBytes;
  WORD bmPlanes;
  WORD bmBitsPixel;
  ULONG cbSize;
  [size_is(cbSize)] byte pBuffer[];
} userBITMAP;

typedef union _userHBITMAP switch(long fContext) u {
  case WDT_INPROC_CALL: long        hInproc;
  case WDT_REMOTE_CALL: userBITMAP *hRemote;
  default:              long        hGlobal;
} userHBITMAP;

typedef [unique] userHBITMAP *wireHBITMAP;

typedef struct tagRemHPALETTE {
  unsigned long cbData;
  [size_is(cbData)] byte data[];
} RemHPALETTE;

typedef struct tagrpcLOGPALETTE {
  WORD palVersion;
  WORD palNumEntries;
  [size_is(palNumEntries)] PALETTEENTRY palPalEntry[];
} rpcLOGPALETTE;

typedef union _userHPALETTE switch(long fContext) u {
  case WDT_INPROC_CALL: long           hInproc;
  case WDT_REMOTE_CALL: rpcLOGPALETTE *hRemote;
  default:              long           hGlobal;
} userHPALETTE;

typedef [unique] userHPALETTE *wireHPALETTE;

cpp_quote("#if 0")
DECLARE_WIREM_HANDLE(HGLOBAL);
typedef HGLOBAL HLOCAL;
DECLARE_WIREM_HANDLE(HBITMAP);
DECLARE_WIREM_HANDLE(HPALETTE);
DECLARE_WIREM_HANDLE(HENHMETAFILE);
DECLARE_WIREM_HANDLE(HMETAFILE);
cpp_quote("#endif")
DECLARE_WIREM_HANDLE(HMETAFILEPICT);

typedef union _RemotableHandle switch (long fContext) u
{
    case WDT_INPROC_CALL: long hInproc;
    case WDT_REMOTE_CALL: long hRemote;
} RemotableHandle;

typedef [unique] RemotableHandle *wireHACCEL;
typedef [unique] RemotableHandle *wireHBRUSH;
typedef [unique] RemotableHandle *wireHDC;
typedef [unique] RemotableHandle *wireHFONT;
typedef [unique] RemotableHandle *wireHICON;
typedef [unique] RemotableHandle *wireHMENU;
typedef [unique] RemotableHandle *wireHWND;

cpp_quote("#if 0") /* for IDL only (C/C++ defs are in windef.h) */
DECLARE_WIREM_HANDLE(HACCEL);
DECLARE_WIREM_HANDLE(HBRUSH);
DECLARE_WIREM_HANDLE(HDC);
DECLARE_WIREM_HANDLE(HFONT);
DECLARE_WIREM_HANDLE(HICON);
DECLARE_WIREM_HANDLE(HMENU);
DECLARE_WIREM_HANDLE(HWND);

typedef HICON HCURSOR;

typedef struct tagMSG
{
    HWND   hwnd;
    UINT   message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD  time;
    POINT  pt;
} MSG, *PMSG, *NPMSG, *LPMSG;

cpp_quote("#endif")

/******************** GUID TYPES ********************/

cpp_quote("#if 0") /* for IDL only (C/C++ defs are in guiddef.h) */
typedef GUID *REFGUID;
typedef IID *REFIID;
typedef CLSID *REFCLSID;
typedef FMTID *REFFMTID;
cpp_quote("#endif")

/******************** MISC TYPES ********************/

typedef enum tagDVASPECT {
  DVASPECT_CONTENT   = 1,
  DVASPECT_THUMBNAIL = 2,
  DVASPECT_ICON      = 4,
  DVASPECT_DOCPRINT  = 8
} DVASPECT;

typedef enum tagSTGC {
  STGC_DEFAULT       = 0,
  STGC_OVERWRITE     = 1,
  STGC_ONLYIFCURRENT = 2,
  STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE = 4,
  STGC_CONSOLIDATE   = 8
} STGC;

typedef enum tagSTGMOVE {
  STGMOVE_MOVE        = 0,
  STGMOVE_COPY        = 1,
  STGMOVE_SHALLOWCOPY = 2
} STGMOVE;

typedef enum tagSTATFLAG {
  STATFLAG_DEFAULT = 0,
  STATFLAG_NONAME  = 1,
  STATFLAG_NOOPEN  = 2
} STATFLAG;

/******************** OLE Automation ********************/

cpp_quote("#ifdef _MSC_VER") /* for IDL and MSVC only */
typedef double DATE;
cpp_quote("#else")
cpp_quote("typedef double DECLSPEC_ALIGN(8) DATE;")
cpp_quote("#endif")

cpp_quote("#if 0") /* for IDL only */
typedef struct tagCY {
  LONGLONG int64;
} CY;
cpp_quote("#else") /* C/C++ defs */
cpp_quote("#ifndef _tagCY_DEFINED")
cpp_quote("#define _tagCY_DEFINED")
cpp_quote("typedef union tagCY {")
cpp_quote("    struct {")
cpp_quote("#ifdef WORDS_BIGENDIAN")
cpp_quote("        LONG  Hi;")
cpp_quote("        ULONG Lo;")
cpp_quote("#else")
cpp_quote("        ULONG Lo;")
cpp_quote("        LONG  Hi;")
cpp_quote("#endif")
cpp_quote("    } DUMMYSTRUCTNAME;")
cpp_quote("    LONGLONG int64;")
cpp_quote("} CY;")
cpp_quote("#endif")
cpp_quote("#endif")

typedef CY *LPCY;

cpp_quote("#if 0") /* for IDL only */
typedef struct tagDEC {
  USHORT wReserved;
  BYTE scale;
  BYTE sign;
  ULONG Hi32;
  ULONGLONG Lo64;
} DECIMAL;
cpp_quote("#else") /* C/C++ defs */
cpp_quote("typedef struct tagDEC {")
cpp_quote("  USHORT wReserved;")
cpp_quote("  union {")
cpp_quote("    struct {")
cpp_quote("      BYTE scale;")
cpp_quote("      BYTE sign;")
cpp_quote("    } DUMMYSTRUCTNAME;")
cpp_quote("    USHORT signscale;")
cpp_quote("  } DUMMYUNIONNAME;")
cpp_quote("  ULONG Hi32;")
cpp_quote("  union {")
cpp_quote("    struct {")
cpp_quote("#ifdef WORDS_BIGENDIAN")
cpp_quote("      ULONG Mid32;")
cpp_quote("      ULONG Lo32;")
cpp_quote("#else")
cpp_quote("      ULONG Lo32;")
cpp_quote("      ULONG Mid32;")
cpp_quote("#endif")
cpp_quote("    } DUMMYSTRUCTNAME1;")
cpp_quote("    ULONGLONG Lo64;")
cpp_quote("  } DUMMYUNIONNAME1;")
cpp_quote("} DECIMAL;")
cpp_quote("#endif")
cpp_quote("#define DECIMAL_NEG ((BYTE)0x80)")
cpp_quote("#define DECIMAL_SETZERO(d) do{ memset(((char*)&(d)) + sizeof(USHORT), 0, sizeof(ULONG) * 3u + sizeof(USHORT)); }while (0)")

typedef DECIMAL *LPDECIMAL;

typedef [unique] FLAGGED_WORD_BLOB *wireBSTR;
typedef [wire_marshal(wireBSTR)] OLECHAR *BSTR;
typedef BSTR *LPBSTR;

typedef short VARIANT_BOOL;
typedef VARIANT_BOOL _VARIANT_BOOL;
cpp_quote("#define VARIANT_TRUE  ((VARIANT_BOOL)0xFFFF)")
cpp_quote("#define VARIANT_FALSE ((VARIANT_BOOL)0x0000)")

typedef struct tagBSTRBLOB {
  ULONG cbSize;
  [size_is(cbSize)] BYTE *pData;
} BSTRBLOB, *LPBSTRBLOB;

cpp_quote("#ifndef _tagBLOB_DEFINED")
cpp_quote("#define _tagBLOB_DEFINED")
cpp_quote("#define _BLOB_DEFINED")
cpp_quote("#define _LPBLOB_DEFINED")
typedef struct tagBLOB {
  ULONG cbSize;
  [size_is(cbSize)] BYTE *pBlobData;
} BLOB, *LPBLOB;
cpp_quote("#endif")

typedef struct tagCLIPDATA {
  ULONG cbSize;
  long ulClipFmt;
  [size_is(cbSize-sizeof(long))] BYTE *pClipData;
} CLIPDATA;
cpp_quote("#define CBPCLIPDATA(cb) ((cb).cbSize - sizeof((cb).ulClipFmt))")

typedef ULONG PROPID;

/******************** VARTYPE ********************/

typedef unsigned short VARTYPE;
enum VARENUM {
  VT_EMPTY           = 0,
  VT_NULL            = 1,
  VT_I2              = 2,
  VT_I4              = 3,
  VT_R4              = 4,
  VT_R8              = 5,
  VT_CY              = 6,
  VT_DATE            = 7,
  VT_BSTR            = 8,
  VT_DISPATCH        = 9,
  VT_ERROR           = 10,
  VT_BOOL            = 11,
  VT_VARIANT         = 12,
  VT_UNKNOWN         = 13,
  VT_DECIMAL         = 14,
  VT_I1              = 16,
  VT_UI1             = 17,
  VT_UI2             = 18,
  VT_UI4             = 19,
  VT_I8              = 20,
  VT_UI8             = 21,
  VT_INT             = 22,
  VT_UINT            = 23,
  VT_VOID            = 24,
  VT_HRESULT         = 25,
  VT_PTR             = 26,
  VT_SAFEARRAY       = 27,
  VT_CARRAY          = 28,
  VT_USERDEFINED     = 29,
  VT_LPSTR           = 30,
  VT_LPWSTR          = 31,
  VT_RECORD          = 36,
  VT_INT_PTR         = 37,
  VT_UINT_PTR        = 38,
  VT_FILETIME        = 64,
  VT_BLOB            = 65,
  VT_STREAM          = 66,
  VT_STORAGE         = 67,
  VT_STREAMED_OBJECT = 68,
  VT_STORED_OBJECT   = 69,
  VT_BLOB_OBJECT     = 70,
  VT_CF              = 71,
  VT_CLSID           = 72,
  VT_VERSIONED_STREAM= 73,
  VT_BSTR_BLOB       = 0x0fff,
  VT_VECTOR          = 0x1000,
  VT_ARRAY           = 0x2000,
  VT_BYREF           = 0x4000,
  VT_RESERVED        = 0x8000,
  VT_ILLEGAL         = 0xffff,
  VT_ILLEGALMASKED   = 0x0fff,
  VT_TYPEMASK        = 0x0fff
};

typedef struct tagCSPLATFORM
{
    DWORD dwPlatformId;
    DWORD dwVersionHi;
    DWORD dwVersionLo;
    DWORD dwProcessorArch;
} CSPLATFORM;

typedef struct tagQUERYCONTEXT
{
    DWORD dwContext;
    CSPLATFORM Platform;
    LCID Locale;
    DWORD dwVersionHi;
    DWORD dwVersionLo;
} QUERYCONTEXT;

typedef [v1_enum] enum tagTYSPEC 
{
    TYSPEC_CLSID,
    TYSPEC_FILEEXT,
    TYSPEC_MIMETYPE,
    TYSPEC_PROGID,
    TYSPEC_FILENAME,
    TYSPEC_PACKAGENAME,
    TYSPEC_OBJECTID
} TYSPEC;

typedef union switch(DWORD tyspec)
{
    case TYSPEC_CLSID:
        CLSID clsid;
    case TYSPEC_FILEEXT:
        LPOLESTR pFileExt;
    case TYSPEC_MIMETYPE:
        LPOLESTR pMimeType;
    case TYSPEC_PROGID:
        LPOLESTR pProgId;
    case TYSPEC_FILENAME:
        LPOLESTR pFileName;
    case TYSPEC_PACKAGENAME:
        struct
        {
            LPOLESTR pPackageName;
            GUID PolicyId;
        } ByName;
    case TYSPEC_OBJECTID:
        struct
        {
            GUID ObjectId;
            GUID PolicyId;
        } ByObjectId;
} uCLSSPEC;

} /* interface IWinTypes */
