/*
 * Copyright (C) 2000 Ulrich Czekalla
 * Copyright (C) 2003 Alexandre Julliard
 *
 * 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 "objidl.idl";
import "oleidl.idl";
import "servprov.idl";
import "msxml.idl";

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef GetUserName")
cpp_quote("#undef SetPort")
cpp_quote("#endif")

interface IInternetProtocolSink;

/*****************************************************************************
 * IInternet interface
 */
[
    object,
    uuid(79eac9e0-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique),
    local
]
interface IInternet : IUnknown
{
    typedef [unique] IInternet *LPIINTERNET;
}

/*****************************************************************************
 * IBinding interface
 */
[
    object,
    uuid(79eac9c0-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IBinding : IUnknown
{
    typedef [unique] IBinding *LPBINDING;

    HRESULT Abort();
    HRESULT Suspend();
    HRESULT Resume();

    HRESULT SetPriority(
        [in] LONG nPriority);

    HRESULT GetPriority(
        [out] LONG * pnPriority);

    [local]
    HRESULT GetBindResult(
        [out] CLSID *pclsidProtocol,
        [out] DWORD *pdwResult,
        [out] LPOLESTR *pszResult,
        [in, out] DWORD *pdwReserved);

    [call_as(GetBindResult)]
    HRESULT RemoteGetBindResult(
        [out] CLSID *pclsidProtocol,
        [out] DWORD *pdwResult,
        [out] LPOLESTR *pszResult,
        [in] DWORD dwReserved);
}


/*****************************************************************************
 * IBindStatusCallback interface
 */
[
    object,
    uuid(79eac9c1-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IBindStatusCallback : IUnknown
{
    typedef [unique] IBindStatusCallback *LPBINDSTATUSCALLBACK;

    typedef enum
    {
        BINDVERB_GET    = 0x00000000,
        BINDVERB_POST   = 0x00000001,
        BINDVERB_PUT    = 0x00000002,
        BINDVERB_CUSTOM = 0x00000003
    } BINDVERB;

    typedef enum
    {
        BINDINFOF_URLENCODESTGMEDDATA = 0x00000001,
        BINDINFOF_URLENCODEDEXTRAINFO = 0x00000002
    } BINDINFOF;

    typedef enum
    {
        BINDF_ASYNCHRONOUS = 0x00000001,
        BINDF_ASYNCSTORAGE = 0x00000002,
        BINDF_NOPROGRESSIVERENDERING = 0x00000004,
        BINDF_OFFLINEOPERATION = 0x00000008,
        BINDF_GETNEWESTVERSION = 0x00000010,
        BINDF_NOWRITECACHE = 0x00000020,
        BINDF_NEEDFILE = 0x00000040,
        BINDF_PULLDATA = 0x00000080,
        BINDF_IGNORESECURITYPROBLEM = 0x00000100,
        BINDF_RESYNCHRONIZE = 0x00000200,
        BINDF_HYPERLINK = 0x00000400,
        BINDF_NO_UI = 0x00000800,
        BINDF_SILENTOPERATION = 0x00001000,
        BINDF_PRAGMA_NO_CACHE = 0x00002000,
        BINDF_GETCLASSOBJECT = 0x00004000,
        BINDF_RESERVED_1 = 0x00008000,
        BINDF_FREE_THREADED = 0x00010000,
        BINDF_DIRECT_READ = 0x00020000,
        BINDF_FORMS_SUBMIT = 0x00040000,
        BINDF_GETFROMCACHE_IF_NET_FAIL = 0x00080000,
        BINDF_FROMURLMON = 0x00100000,
        BINDF_FWD_BACK = 0x00200000,
        BINDF_PREFERDEFAULTHANDLER = 0x00400000,
        BINDF_ENFORCERESTRICTED = 0x00800000
    } BINDF;

    typedef enum
    {
        URL_ENCODING_NONE         = 0x00000000,
        URL_ENCODING_ENABLE_UTF8  = 0x10000000,
        URL_ENCODING_DISABLE_UTF8 = 0x20000000
    } URL_ENCODING;

    typedef struct _tagBINDINFO
    {
        ULONG cbSize;
        LPWSTR szExtraInfo;
        STGMEDIUM stgmedData;
        DWORD grfBindInfoF;
        DWORD dwBindVerb;
        LPWSTR szCustomVerb;
        DWORD cbstgmedData;
        DWORD dwOptions;
        DWORD dwOptionsFlags;
        DWORD dwCodePage;
        SECURITY_ATTRIBUTES securityAttributes;
        IID iid;
        IUnknown *pUnk;
        DWORD dwReserved;
    } BINDINFO;

    typedef struct _REMSECURITY_ATTRIBUTES
    {
        DWORD nLength;
        DWORD lpSecurityDescriptor;
        BOOL bInheritHandle;
    } REMSECURITY_ATTRIBUTES, *PREMSECURITY_ATTRIBUTES, *LPREMSECURITY_ATTRIBUTES;

    typedef struct _tagRemBINDINFO
    {
        ULONG cbSize;
        LPWSTR szExtraInfo;
        DWORD grfBindInfoF;
        DWORD dwBindVerb;
        LPWSTR szCustomVerb;
        DWORD cbstgmedData;
        DWORD dwOptions;
        DWORD dwOptionsFlags;
        DWORD dwCodePage;
        REMSECURITY_ATTRIBUTES securityAttributes;
        IID iid;
        IUnknown *pUnk;
        DWORD dwReserved;
    } RemBINDINFO;

    typedef struct tagRemFORMATETC
    {
        DWORD cfFormat;
        DWORD ptd;
        DWORD dwAspect;
        LONG lindex;
        DWORD tymed;
    } RemFORMATETC, *LPREMFORMATETC;

    typedef enum
    {
        BSCF_FIRSTDATANOTIFICATION = 0x01,
        BSCF_INTERMEDIATEDATANOTIFICATION = 0x02,
        BSCF_LASTDATANOTIFICATION = 0x04,
        BSCF_DATAFULLYAVAILABLE = 0x08,
        BSCF_AVAILABLEDATASIZEUNKNOWN = 0x10,
        BSCF_SKIPDRAINDATAFORFILEURLS = 0x20,
        BSCF_64BITLENGTHDOWNLOAD = 0x40
    } BSCF;

    typedef enum BINDSTATUS
    {
	BINDSTATUS_FINDINGRESOURCE = 1,
	BINDSTATUS_CONNECTING,
	BINDSTATUS_REDIRECTING,
	BINDSTATUS_BEGINDOWNLOADDATA,
	BINDSTATUS_DOWNLOADINGDATA,
	BINDSTATUS_ENDDOWNLOADDATA,
	BINDSTATUS_BEGINDOWNLOADCOMPONENTS,
	BINDSTATUS_INSTALLINGCOMPONENTS,
	BINDSTATUS_ENDDOWNLOADCOMPONENTS,
	BINDSTATUS_USINGCACHEDCOPY,
	BINDSTATUS_SENDINGREQUEST,
	BINDSTATUS_CLASSIDAVAILABLE,
	BINDSTATUS_MIMETYPEAVAILABLE,
	BINDSTATUS_CACHEFILENAMEAVAILABLE,
	BINDSTATUS_BEGINSYNCOPERATION,
	BINDSTATUS_ENDSYNCOPERATION,
	BINDSTATUS_BEGINUPLOADDATA,
	BINDSTATUS_UPLOADINGDATA,
	BINDSTATUS_ENDUPLOADINGDATA,
	BINDSTATUS_PROTOCOLCLASSID,
	BINDSTATUS_ENCODING,
	BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE,
	BINDSTATUS_CLASSINSTALLLOCATION,
	BINDSTATUS_DECODING,
	BINDSTATUS_LOADINGMIMEHANDLER,
	BINDSTATUS_CONTENTDISPOSITIONATTACH,
	BINDSTATUS_FILTERREPORTMIMETYPE,
	BINDSTATUS_CLSIDCANINSTANTIATE,
	BINDSTATUS_IUNKNOWNAVAILABLE,
	BINDSTATUS_DIRECTBIND,
	BINDSTATUS_RAWMIMETYPE,
	BINDSTATUS_PROXYDETECTING,
	BINDSTATUS_ACCEPTRANGES,
        BINDSTATUS_COOKIE_SENT,
        BINDSTATUS_COMPACT_POLICY_RECEIVED,
        BINDSTATUS_COOKIE_SUPPRESSED,
        BINDSTATUS_COOKIE_STATE_UNKNOWN,
        BINDSTATUS_COOKIE_STATE_ACCEPT,
        BINDSTATUS_COOKIE_STATE_REJECT,
        BINDSTATUS_COOKIE_STATE_PROMPT,
        BINDSTATUS_COOKIE_STATE_LEASH,
        BINDSTATUS_COOKIE_STATE_DOWNGRADE,
        BINDSTATUS_POLICY_HREF,
        BINDSTATUS_P3P_HEADER,
        BINDSTATUS_SESSION_COOKIE_RECEIVED,
        BINDSTATUS_PERSISTENT_COOKIE_RECEIVED,
        BINDSTATUS_SESSION_COOKIES_ALLOWED,
        BINDSTATUS_CACHECONTROL,
        BINDSTATUS_CONTENTDISPOSITIONFILENAME,
        BINDSTATUS_MIMETEXTPLAINMISMATCH,
        BINDSTATUS_PUBLISHERAVAILABLE,
        BINDSTATUS_DISPLAYNAMEAVAILABLE
    } BINDSTATUS;


    HRESULT OnStartBinding(
        [in] DWORD dwReserved,
        [in] IBinding * pib);

    HRESULT GetPriority(
        [out] LONG * pnPriority);

    HRESULT OnLowResource(
        [in] DWORD reserved);

    HRESULT OnProgress(
        [in] ULONG ulProgress,
        [in] ULONG ulProgressMax,
        [in] ULONG ulStatusCode,
        [in] LPCWSTR szStatusText);

    HRESULT OnStopBinding(
        [in] HRESULT hresult,
        [in, unique] LPCWSTR szError);

    [local]
    HRESULT GetBindInfo(
        [out] DWORD *grfBINDF,
        [in, out, unique] BINDINFO * pbindinfo);

    [call_as(GetBindInfo)]
    HRESULT RemoteGetBindInfo(
        [out] DWORD *grfBINDF,
        [in, out, unique] RemBINDINFO * pbindinfo,
        [in, out, unique] RemSTGMEDIUM* pstgmed);

    [local]
    HRESULT OnDataAvailable(
        [in] DWORD grfBSCF,
        [in] DWORD dwSize,
        [in] FORMATETC* pformatetc,
        [in] STGMEDIUM* pstgmed);

    [call_as(OnDataAvailable)]
    HRESULT RemoteOnDataAvailable(
        [in] DWORD grfBSCF,
        [in] DWORD dwSize,
        [in] RemFORMATETC *pformatetc,
        [in] RemSTGMEDIUM* pstgmed);

    HRESULT OnObjectAvailable(
        [in] REFIID riid,
        [in, iid_is(riid)] IUnknown* punk);
}

/*****************************************************************************
 * IBindStatusCallbackEx interface
 */
[
    object,
    uuid(aaa74ef9-8ee7-4659-88d9-f8c504da73cc),
    pointer_default(unique)
]
interface IBindStatusCallbackEx : IBindStatusCallback
{
    typedef [unique] IBindStatusCallbackEx *LPBINDSTATUSCALLBACKEX;

    typedef enum {
        BINDF2_DISABLEBASICOVERHTTP               = 0x00000001,
        BINDF2_DISABLEAUTOCOOKIEHANDLING          = 0x00000002,
        BINDF2_READ_DATA_GREATER_THAN_4GB         = 0x00000004,
        BINDF2_DISABLE_HTTP_REDIRECT_XSECURITYID  = 0x00000008,
        BINDF2_RESERVED_3                         = 0x20000000,
        BINDF2_RESERVED_2                         = 0x40000000,
        BINDF2_RESERVED_1                         = 0x80000000,
    } BINDF2;

    [local]
    HRESULT GetBindInfoEx(
            [out] DWORD *grfBINDF,
            [in, out, unique] BINDINFO *pbindinfo,
            [out] DWORD *grfBINDF2,
            [out] DWORD *pdwReserved);

    [call_as(GetBindInfoEx)]
    HRESULT RemoteGetBindInfoEx(
            [out] DWORD *grfBINDF,
            [in, out, unique] RemBINDINFO *pbindinfo,
            [in, out, unique] RemSTGMEDIUM *pstgmed,
            [out] DWORD *grfBINDF2,
            [out] DWORD *pdwReserved);
}


/*****************************************************************************
 * IAuthenticate interface
 */
[
    local,
    object,
    uuid(79EAC9D0-BAf9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IAuthenticate : IUnknown
{
    typedef [unique] IAuthenticate *LPAUTHENTICATION;

    HRESULT Authenticate(
        [out] HWND* phwnd,
        [out] LPWSTR *pszUsername,
        [out] LPWSTR *pszPassword);
}

/*****************************************************************************
 * IHttpNegotiate interface
 */
[
    object,
    uuid(79EAC9D2-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IHttpNegotiate : IUnknown
{
    typedef [unique] IHttpNegotiate *LPHTTPNEGOTIATE;

    HRESULT BeginningTransaction(
        [in] LPCWSTR szURL,
        [in, unique] LPCWSTR szHeaders,
        [in] DWORD dwReserved,
        [out] LPWSTR *pszAdditionalHeaders);

    HRESULT OnResponse(
        [in] DWORD dwResponseCode,
        [in, unique] LPCWSTR szResponseHeaders,
        [in, unique] LPCWSTR szRequestHeaders,
        [out] LPWSTR *pszAdditionalRequestHeaders);
}

/*****************************************************************************
 * IHttpNegotiate2 interface
 */
[
    object,
    uuid(4F9F9FCB-E0F4-48eb-B7AB-FA2EA9365CB4),
    pointer_default(unique)
]
interface IHttpNegotiate2 : IHttpNegotiate
{
    typedef [unique] IHttpNegotiate2 *LPHTTPNEGOTIATE2;

    HRESULT GetRootSecurityId(
         [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId,
         [in, out] DWORD *pcbSecurityId,
         [in] DWORD_PTR dwReserved);
}

/*****************************************************************************
 * IBindHost interface
 */
cpp_quote("#define SID_IBindHost IID_IBindHost")
cpp_quote("#define SID_SBindHost IID_IBindHost")
[
    object,
    uuid(fc4801a1-2ba9-11cf-a229-00aa003d7352),
    pointer_default(unique)
]
interface IBindHost : IUnknown
{
    typedef [unique] IBindHost *LPBINDHOST;

    HRESULT CreateMoniker(
        [in] LPOLESTR szName,
        [in] IBindCtx *pBC,
        [out] IMoniker** ppmk,
        [in] DWORD dwReserved);

    [local]
    HRESULT MonikerBindToStorage(
        [in] IMoniker *pMk,
        [in] IBindCtx *pBC,
        [in] IBindStatusCallback *pBSC,
        [in] REFIID riid,
        [out] void **ppvObj);

    [call_as(MonikerBindToStorage)]
    HRESULT RemoteMonikerBindToStorage(
        [in, unique] IMoniker *pMk,
        [in, unique] IBindCtx *pBC,
        [in, unique] IBindStatusCallback *pBSC,
        [in] REFIID riid,
        [out, iid_is(riid)] IUnknown **ppvObj);

    [local]
    HRESULT MonikerBindToObject(
        [in] IMoniker *pMk,
        [in] IBindCtx *pBC,
        [in] IBindStatusCallback *pBSC,
        [in] REFIID riid,
        [out] void **ppvObj);

    [call_as(MonikerBindToObject)]
    HRESULT RemoteMonikerBindToObject(
        [in, unique] IMoniker *pMk,
        [in, unique] IBindCtx *pBC,
        [in, unique] IBindStatusCallback *pBSC,
        [in] REFIID riid,
        [out, iid_is(riid)] IUnknown **ppvObj);
}


/*****************************************************************************
 * IWinInetInfo interface
 */
[
    object,
    uuid(79eac9d6-bafa-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IWinInetInfo : IUnknown
{
    typedef [unique] IWinInetInfo *LPWININETINFO;

    [local]
    HRESULT QueryOption(
        [in] DWORD dwOption,
        [in, out, size_is(*pcbBuf)] LPVOID pBuffer,
        [in, out] DWORD *pcbBuf);

    [call_as(QueryOption)]
    HRESULT RemoteQueryOption(
        [in] DWORD  dwOption,
        [in, out, size_is(*pcbBuf)] BYTE *pBuffer,
        [in, out] DWORD *pcbBuf);
}



/*****************************************************************************
 * IWinInetHttpInfo interface
 */
[
    object,
    uuid(79eac9d8-bafa-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IWinInetHttpInfo : IWinInetInfo
{
    typedef [unique] IWinInetHttpInfo *LPWININETHTTPINFO;

    [local]
    HRESULT QueryInfo(
        [in] DWORD dwOption,
        [in, out,size_is(*pcbBuf)] LPVOID pBuffer,
        [in, out] DWORD *pcbBuf,
        [in, out] DWORD *pdwFlags,
        [in, out] DWORD *pdwReserved);

    [call_as(QueryInfo)]
    HRESULT RemoteQueryInfo(
        [in] DWORD dwOption,
        [in,out,size_is(*pcbBuf)] BYTE *pBuffer,
        [in, out] DWORD *pcbBuf,
        [in, out] DWORD *pdwFlags,
        [in, out] DWORD *pdwReserved);
}

/*****************************************************************************
 * IWindowForBindingUI interface
 */
[
    local,
    object,
    uuid(79eac9d5-bafa-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IWindowForBindingUI : IUnknown
{
    typedef [unique] IWindowForBindingUI *LPWINDOWFORBINDINGUI;

    HRESULT GetWindow(
        [in] REFGUID rguidReason,
        [out] HWND *phwnd);
}

/*****************************************************************************
 * IHttpSecurity interface
 */
[
    object,
    uuid(79eac9d7-bafa-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IHttpSecurity : IWindowForBindingUI
{
    typedef [unique] IHttpSecurity *LPHTTPSECURITY;

    HRESULT OnSecurityProblem(
        [in] DWORD dwProblem);
}


/*****************************************************************************
 * IPersistMoniker interface
 */
[
    object,
    uuid(79eac9c9-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IPersistMoniker : IUnknown
{
    typedef [unique] IPersistMoniker *LPPERSISTMONIKER;

    HRESULT GetClassID(
        [out] CLSID *pClassID);

    HRESULT IsDirty();

    HRESULT Load(
        [in] BOOL fFullyAvailable,
        [in] IMoniker *pimkName,
        [in] LPBC pibc,
        [in] DWORD grfMode);

    HRESULT Save(
        [in] IMoniker *pimkName,
        [in] LPBC pbc,
        [in] BOOL fRemember);

    HRESULT SaveCompleted(
        [in] IMoniker *pimkName,
        [in] LPBC pibc);

    HRESULT GetCurMoniker(
        [out] IMoniker **ppimkName);
}

/*****************************************************************************
 * IMonikerProp interface
 */
[
    object,
    uuid(A5CA5F7F-1847-4D87-9C5B-918509F7511D),
    pointer_default(unique)
]
interface IMonikerProp : IUnknown
{
    typedef [unique] IMonikerProp *LPMONIKERPROP;

    typedef enum {
        MIMETYPEPROP        = 0,
        USE_SRC_URL         = 1,
        CLASSIDPROP         = 2,
        TRUSTEDDOWNLOADPROP = 3,
        POPUPLEVELPROP      = 4
    } MONIKERPROPERTY;

    HRESULT PutProperty(
        [in] MONIKERPROPERTY mkp,
        [in] LPCWSTR val);
}

cpp_quote("#ifndef _LPBINDPROTOCOL_DEFINED")
cpp_quote("#define _LPBINDPROTOCOL_DEFINED")

/*****************************************************************************
 * IBindProtocol interface
 */
[
    local,
    object,
    uuid(79EAC9CD-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IBindProtocol : IUnknown
{
    typedef [unique] IBindProtocol *LPBINDPROTOCOL;

    HRESULT CreateBinding(
        [in] LPCWSTR szUrl,
        [in] IBindCtx *pbc,
        [out] IBinding **ppb);
}

cpp_quote("#endif /* !defined _LPBINDPROTOCOL_DEFINED */")

/*****************************************************************************
 * IInternetBindInfo interface
 */
[
    local,
    object,
    uuid(79EAC9E1-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetBindInfo : IUnknown
{
    typedef [unique] IInternetBindInfo *LPIINTERNETBINDINFO;

    typedef enum tagBINDSTRING
    {
        BINDSTRING_HEADERS = 1,
        BINDSTRING_ACCEPT_MIMES,
        BINDSTRING_EXTRA_URL,
        BINDSTRING_LANGUAGE,
        BINDSTRING_USERNAME,
        BINDSTRING_PASSWORD,
        BINDSTRING_UA_PIXELS,
        BINDSTRING_UA_COLOR,
        BINDSTRING_OS,
        BINDSTRING_USER_AGENT,
        BINDSTRING_ACCEPT_ENCODINGS,
        BINDSTRING_POST_COOKIE,
        BINDSTRING_POST_DATA_MIME,
        BINDSTRING_URL,
        BINDSTRING_IID,
        BINDSTRING_FLAG_BIND_TO_OBJECT,
        BINDSTRING_PTR_BIND_CONTEXT
    } BINDSTRING;

    HRESULT GetBindInfo(
        [out] DWORD *grfBINDF,
        [in, out, unique] BINDINFO *pbindinfo);

    HRESULT GetBindString(
        [in]      ULONG ulStringType,
        [in, out] LPOLESTR *ppwzStr,
        [in]      ULONG cEl,
        [in, out] ULONG *pcElFetched);
}

/*****************************************************************************
 * IInternetPriority interface
 */
[
    local,
    object,
    uuid(79EAC9EB-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetPriority : IUnknown
{
    typedef [unique] IInternetPriority *LPIINTERNETPRIORITY;

    HRESULT SetPriority([in] LONG nPriority);
    HRESULT GetPriority([out] LONG *pnPriority);
}

/*****************************************************************************
 * IInternetProtocolRoot interface
 */
[
    local,
    object,
    uuid(79EAC9E3-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetProtocolRoot : IUnknown
{
    typedef [unique] IInternetProtocolRoot *LPIINTERNETPROTOCOLROOT;

    typedef enum _tagPI_FLAGS
    {
        PI_PARSE_URL         = 0x00000001,
        PI_FILTER_MODE       = 0x00000002,
        PI_FORCE_ASYNC       = 0x00000004,
        PI_USE_WORKERTHREAD  = 0x00000008,
        PI_MIMEVERIFICATION  = 0x00000010,
        PI_CLSIDLOOKUP       = 0x00000020,
        PI_DATAPROGRESS      = 0x00000040,
        PI_SYNCHRONOUS       = 0x00000080,
        PI_APARTMENTTHREADED = 0x00000100,
        PI_CLASSINSTALL      = 0x00000200,
        PD_FORCE_SWITCH      = 0x00010000
    } PI_FLAGS;

    typedef struct _tagPROTOCOLDATA
    {
        DWORD grfFlags;
        DWORD dwState;
        LPVOID pData;
        ULONG cbData;
    } PROTOCOLDATA;

    HRESULT Start(
        [in] LPCWSTR szUrl,
        [in] IInternetProtocolSink *pOIProtSink,
        [in] IInternetBindInfo *pOIBindInfo,
        [in] DWORD grfPI,
        [in] HANDLE_PTR dwReserved);

    HRESULT Continue(
        [in] PROTOCOLDATA *pProtocolData);

    HRESULT Abort(
        [in] HRESULT hrReason,
        [in] DWORD dwOptions);

    HRESULT Terminate(
        [in] DWORD dwOptions);

    HRESULT Suspend();

    HRESULT Resume();
}

/*****************************************************************************
 * IInternetProtocolSink interface
 */
[
    local,
    object,
    uuid(79EAC9E5-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetProtocolSink : IUnknown
{
    typedef [unique] IInternetProtocolSink *LPIINTERNETPROTOCOLSINK;

    HRESULT Switch(
        [in] PROTOCOLDATA *pProtocolData);

    HRESULT ReportProgress(
        [in] ULONG ulStatusCode,
        [in] LPCWSTR szStatusText);

    HRESULT ReportData(
        [in] DWORD grfBSCF,
        [in] ULONG ulProgress,
        [in] ULONG ulProgressMax);

    HRESULT ReportResult(
        [in] HRESULT hrResult,
        [in] DWORD dwError,
        [in] LPCWSTR szResult);
}

/*****************************************************************************
 * IInternetProtocol interface
 */
[
    local,
    object,
    uuid(79EAC9E4-BAF9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetProtocol : IInternetProtocolRoot
{
    typedef [unique] IInternetProtocol *LPIINTERNETPROTOCOL;

    HRESULT Read(
        [in,out, size_is(cb), length_is(*pcbRead)] void *pv,
        [in]  ULONG cb,
        [out] ULONG *pcbRead);

    HRESULT Seek(
        [in]  LARGE_INTEGER dlibMove,
        [in]  DWORD dwOrigin,
        [out] ULARGE_INTEGER *plibNewPosition);

    HRESULT LockRequest(
        [in] DWORD dwOptions);

    HRESULT UnlockRequest();
}

/*****************************************************************************
 * IInternetProtocolInfo interface
 */
[
    local,
    object,
    uuid(79eac9ec-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IInternetProtocolInfo : IUnknown
{
    typedef [unique] IInternetProtocolInfo *LPIINTERNETPROTOCOLINFO;

    typedef enum _tagPARSEACTION
    {
        PARSE_CANONICALIZE = 1,
        PARSE_FRIENDLY,
        PARSE_SECURITY_URL,
        PARSE_ROOTDOCUMENT,
        PARSE_DOCUMENT,
        PARSE_ANCHOR,
        PARSE_ENCODE,
        PARSE_DECODE,
        PARSE_PATH_FROM_URL,
        PARSE_URL_FROM_PATH,
        PARSE_MIME,
        PARSE_SERVER,
        PARSE_SCHEMA,
        PARSE_SITE,
        PARSE_DOMAIN,
        PARSE_LOCATION,
        PARSE_SECURITY_DOMAIN,
        PARSE_ESCAPE,
        PARSE_UNESCAPE
    } PARSEACTION;

    typedef enum _tagPSUACTION
    {
        PSU_DEFAULT = 1,
        PSU_SECURITY_URL_ONLY
    } PSUACTION;

    typedef enum _tagQUERYOPTION
    {
        QUERY_EXPIRATION_DATE = 1,
        QUERY_TIME_OF_LAST_CHANGE,
        QUERY_CONTENT_ENCODING,
        QUERY_CONTENT_TYPE,
        QUERY_REFRESH,
        QUERY_RECOMBINE,
        QUERY_CAN_NAVIGATE,
        QUERY_USES_NETWORK,
        QUERY_IS_CACHED,
        QUERY_IS_INSTALLEDENTRY,
        QUERY_IS_CACHED_OR_MAPPED,
        QUERY_USES_CACHE,
        QUERY_IS_SECURE,
        QUERY_IS_SAFE,
        QUERY_USES_HISTORYFOLDER
    } QUERYOPTION;

    HRESULT ParseUrl(
        [in] LPCWSTR pwzUrl,
        [in] PARSEACTION ParseAction,
        [in] DWORD dwParseFlags,
        [out] LPWSTR pwzResult,
        [in] DWORD cchResult,
        [out] DWORD *pcchResult,
        [in] DWORD dwReserved);

    HRESULT CombineUrl(
        [in] LPCWSTR pwzBaseUrl,
        [in] LPCWSTR pwzRelativeUrl,
        [in] DWORD dwCombineFlags,
        [out] LPWSTR pwzResult,
        [in] DWORD cchResult,
        [out] DWORD *pcchResult,
        [in] DWORD dwReserved);

    HRESULT CompareUrl(
        [in] LPCWSTR pwzUrl1,
        [in] LPCWSTR pwzUrl2,
        [in] DWORD dwCompareFlags);

    HRESULT QueryInfo(
        [in] LPCWSTR pwzUrl,
        [in] QUERYOPTION OueryOption,
        [in] DWORD dwQueryFlags,
        [in, out,size_is(*pcbBuf)] LPVOID pBuffer,
        [in] DWORD cbBuffer,
        [in, out] DWORD *pcbBuf,
        [in] DWORD dwReserved);
}

/*****************************************************************************
 * IInternetSession interface
 */
[
    local,
    object,
    uuid(79eac9e7-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IInternetSession : IUnknown
{
    typedef [unique] IInternetSession *LPIINTERNETSESSION;

    typedef enum _tagOIBDG_FLAGS
    {
        OIBDG_APARTMENTTHREADED = 0x0100,
        OIBDG_DATAONLY          = 0x1000
    } OIBDG_FLAGS;

    HRESULT RegisterNameSpace(
        [in] IClassFactory *pCF,
        [in] REFCLSID rclsid,
        [in] LPCWSTR pwzProtocol,
        [in] ULONG cPatterns,
        [in] const LPCWSTR *ppwzPatterns,
        [in] DWORD dwReserved);

    HRESULT UnregisterNameSpace(
        [in] IClassFactory *pCF,
        [in] LPCWSTR pszProtocol);

    HRESULT RegisterMimeFilter(
        [in] IClassFactory *pCF,
        [in] REFCLSID rclsid,
        [in] LPCWSTR pwzType);

    HRESULT UnregisterMimeFilter(
        [in] IClassFactory *pCF,
        [in] LPCWSTR pwzType);

    HRESULT CreateBinding(
        [in] LPBC pBC,
        [in] LPCWSTR szUrl,
        [in] IUnknown *pUnkOuter,
        [out, unique] IUnknown **ppUnk,
        [out, unique] IInternetProtocol **ppOInetProt,
        [in] DWORD dwOption);

    HRESULT SetSessionOption(
        [in] DWORD dwOption,
        [in] LPVOID pBuffer,
        [in] DWORD dwBufferLength,
        [in] DWORD dwReserved);
}

/*****************************************************************************
 * IInternetSecurityMgrSite interface
 */
[
    local,
    object,
    uuid(79eac9ed-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IInternetSecurityMgrSite : IUnknown
{
    HRESULT GetWindow(
        [out] HWND *phwnd);

    HRESULT EnableModeless(
        [in] BOOL fEnable);
}


/*****************************************************************************
 * IInternetSecurityManager interface
 */
cpp_quote("#define SID_SInternetSecurityManager IID_IInternetSecurityManager")

[
    object,
    uuid(79eac9ee-baf9-11ce-8c82-00aa004ba90b),
    pointer_default(unique)
]
interface IInternetSecurityManager : IUnknown
{
    HRESULT SetSecuritySite(
        [in, unique] IInternetSecurityMgrSite *pSite);

    HRESULT GetSecuritySite(
        [out] IInternetSecurityMgrSite **ppSite);

    HRESULT MapUrlToZone(
        [in] LPCWSTR pwszUrl,
        [out] DWORD *pdwZone,
        [in] DWORD dwFlags);

cpp_quote("#define MAX_SIZE_SECURITY_ID 512")

    HRESULT GetSecurityId(
        [in] LPCWSTR pwszUrl,
        [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId,
        [in, out] DWORD *pcbSecurityId,
        [in] DWORD_PTR dwReserved);


    typedef enum {
        PUAF_DEFAULT                = 0x00,
        PUAF_NOUI                   = 0x01,
        PUAF_ISFILE                 = 0x02,
        PUAF_WARN_IF_DENIED         = 0x04,
        PUAF_FORCEUI_FOREGROUND     = 0x08,
        PUAF_CHECK_TIPS             = 0x10
    } PUAF;

    HRESULT ProcessUrlAction(
        [in] LPCWSTR pwszUrl,
        [in] DWORD dwAction,
        [out, size_is(cbPolicy)] BYTE *pPolicy,
        [in] DWORD cbPolicy,
        [in] BYTE *pContext,
        [in] DWORD cbContext,
        [in] DWORD dwFlags,
        [in] DWORD dwReserved);

    HRESULT QueryCustomPolicy(
        [in] LPCWSTR pwszUrl,
        [in] REFGUID guidKey,
        [out, size_is(,*pcbPolicy)] BYTE **ppPolicy,
        [out] DWORD *pcbPolicy,
        [in] BYTE *pContext,
        [in] DWORD cbContext,
        [in] DWORD dwReserved);

    typedef enum {
        SZM_CREATE = 0x0,
        SZM_DELETE = 0x1
    } SZM_FLAGS;

    HRESULT SetZoneMapping(
        [in] DWORD dwZone,
        [in] LPCWSTR lpszPattern,
        [in] DWORD dwFlags);

    HRESULT GetZoneMappings(
        [in] DWORD dwZone,
        [out] IEnumString **ppenumString,
        [in] DWORD dwFlags);
}

/*****************************************************************************
 * IInternetHostSecurityManager interface
 */
cpp_quote("#define SID_SInternetHostSecurityManager IID_IInternetHostSecurityManager")

[
    local,
    object,
    uuid(3af280b6-cb3f-11d0-891e-00c04fb6bfc4),
    pointer_default(unique)
]
interface IInternetHostSecurityManager : IUnknown
{
    HRESULT GetSecurityId(
            [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId,
            [in, out] DWORD *pcbSecurityId,
            [in] DWORD_PTR dwReserved);

    HRESULT ProcessUrlAction(
            [in] DWORD dwAction,
            [out, size_is(cbPolicy)] BYTE *pPolicy,
            [in] DWORD cbPolicy,
            [in] BYTE *pContext,
            [in] DWORD cbContext,
            [in] DWORD dwFlags,
            [in] DWORD dwReserved);

    HRESULT QueryCustomPolicy(
            [in] REFGUID guidKey,
            [out, size_is(,*pcbPolicy)] BYTE **ppPolicy,
            [out] DWORD *pcbPolicy,
            [in] BYTE *pContext,
            [in] DWORD cbContext,
            [in] DWORD dwReserved);
}

cpp_quote("#define URLACTION_MIN                        0x00001000")
cpp_quote("#define URLACTION_DOWNLOAD_MIN               0x00001000")
cpp_quote("#define URLACTION_DOWNLOAD_SIGNED_ACTIVEX    0x00001001")
cpp_quote("#define URLACTION_DOWNLOAD_UNSIGNED_ACTIVEX  0x00001004")
cpp_quote("#define URLACTION_DOWNLOAD_CURR_MAX          0x00001004")
cpp_quote("#define URLACTION_DOWNLOAD_MAX               0x000011ff")

cpp_quote("#define URLACTION_ACTIVEX_MIN                     0x00001200")
cpp_quote("#define URLACTION_ACTIVEX_RUN                     0x00001200")
cpp_quote("#define URLPOLICY_ACTIVEX_CHECK_LIST              0x00010000")
cpp_quote("#define URLACTION_ACTIVEX_OVERRIDE_OBJECT_SAFETY  0x00001201")
cpp_quote("#define URLACTION_ACTIVEX_OVERRIDE_DATA_SAFETY    0x00001202")
cpp_quote("#define URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETY  0x00001203")
cpp_quote("#define URLACTION_SCRIPT_OVERRIDE_SAFETY          0x00001401")
cpp_quote("#define URLACTION_ACTIVEX_CONFIRM_NOOBJECTSAFETY  0x00001204")
cpp_quote("#define URLACTION_ACTIVEX_TREATASUNTRUSTED        0x00001205")
cpp_quote("#define URLACTION_ACTIVEX_CURR_MAX                0x00001205")
cpp_quote("#define URLACTION_ACTIVEX_MAX                     0x000013ff")

cpp_quote("#define URLACTION_SCRIPT_MIN           0x00001400")
cpp_quote("#define URLACTION_SCRIPT_RUN           0x00001400")
cpp_quote("#define URLACTION_SCRIPT_JAVA_USE      0x00001402")
cpp_quote("#define URLACTION_SCRIPT_SAFE_ACTIVEX  0x00001405")
cpp_quote("#define URLACTION_CROSS_DOMAIN_DATA    0x00001406")
cpp_quote("#define URLACTION_SCRIPT_PASTE         0x00001407")
cpp_quote("#define URLACTION_SCRIPT_CURR_MAX      0x00001407")
cpp_quote("#define URLACTION_SCRIPT_MAX           0x000015ff")

cpp_quote("#define URLACTION_HTML_MIN                0x00001600")
cpp_quote("#define URLACTION_HTML_SUBMIT_FORMS       0x00001601")
cpp_quote("#define URLACTION_HTML_SUBMIT_FORMS_FROM  0x00001602")
cpp_quote("#define URLACTION_HTML_SUBMIT_FORMS_TO    0x00001603")
cpp_quote("#define URLACTION_HTML_FONT_DOWNLOAD      0x00001604")
cpp_quote("#define URLACTION_HTML_JAVA_RUN           0x00001605")
cpp_quote("#define URLACTION_HTML_USERDATA_SAVE      0x00001606")
cpp_quote("#define URLACTION_HTML_SUBFRAME_NAVIGATE  0x00001607")
cpp_quote("#define URLACTION_HTML_META_REFRESH       0x00001608")
cpp_quote("#define URLACTION_HTML_MIXED_CONTENT      0x00001609")
cpp_quote("#define URLACTION_HTML_MAX                0x000017ff")

cpp_quote("#define URLACTION_SHELL_MIN              0x00001800")
cpp_quote("#define URLACTION_SHELL_INSTALL_DTITEMS  0x00001800")
cpp_quote("#define URLACTION_SHELL_MOVE_OR_COPY     0x00001802")
cpp_quote("#define URLACTION_SHELL_FILE_DOWNLOAD    0x00001803")
cpp_quote("#define URLACTION_SHELL_VERB             0x00001804")
cpp_quote("#define URLACTION_SHELL_WEBVIEW_VERB     0x00001805")
cpp_quote("#define URLACTION_SHELL_CURR_MAX         0x00001805")
cpp_quote("#define URLACTION_SHELL_MAX              0x000019ff")

cpp_quote("#define URLACTION_NETWORK_MIN                  0x00001a00")
cpp_quote("#define URLACTION_CREDENTIALS_USE              0x00001a00")
cpp_quote("#define URLACTION_AUTHENTICATE_CLIENT          0x00001a01")
cpp_quote("#define URLACTION_COOKIES                      0x00001a02")
cpp_quote("#define URLACTION_COOKIES_SESSION              0x00001a03")
cpp_quote("#define URLACTION_CLIENT_CERT_PROMPT           0x00001a04")
cpp_quote("#define URLACTION_COOKIES_THIRD_PARTY          0x00001a05")
cpp_quote("#define URLACTION_COOKIES_SESSION_THIRD_PARTY  0x00001a06")
cpp_quote("#define URLACTION_COOKIES_ENABLED              0x00001a10")
cpp_quote("#define URLACTION_NETWORK_CURR_MAX             0x00001a10")
cpp_quote("#define URLACTION_NETWORK_MAX                  0x00001bff")

cpp_quote("#define URLACTION_JAVA_MIN          0x00001c00")
cpp_quote("#define URLACTION_JAVA_PERMISSIONS  0x00001c00")
cpp_quote("#define URLPOLICY_JAVA_PROHIBIT     0x00000000")
cpp_quote("#define URLPOLICY_JAVA_HIGH         0x00010000")
cpp_quote("#define URLPOLICY_JAVA_MEDIUM       0x00020000")
cpp_quote("#define URLPOLICY_JAVA_LOW          0x00030000")
cpp_quote("#define URLPOLICY_JAVA_CUSTOM       0x00800000")
cpp_quote("#define URLACTION_JAVA_CURR_MAX     0x00001c00")
cpp_quote("#define URLACTION_JAVA_MAX          0x00001cff")

cpp_quote("#define URLACTION_INFODELIVERY_MIN                        0x00001d00")
cpp_quote("#define URLACTION_INFODELIVERY_NO_ADDING_CHANNELS         0x00001d00")
cpp_quote("#define URLACTION_INFODELIVERY_NO_EDITING_CHANNELS        0x00001d01")
cpp_quote("#define URLACTION_INFODELIVERY_NO_REMOVING_CHANNELS       0x00001d02")
cpp_quote("#define URLACTION_INFODELIVERY_NO_ADDING_SUBSCRIPTIONS    0x00001d03")
cpp_quote("#define URLACTION_INFODELIVERY_NO_EDITING_SUBSCRIPTIONS   0x00001d04")
cpp_quote("#define URLACTION_INFODELIVERY_NO_REMOVING_SUBSCRIPTIONS  0x00001d05")
cpp_quote("#define URLACTION_INFODELIVERY_NO_CHANNEL_LOGGING         0x00001d06")
cpp_quote("#define URLACTION_INFODELIVERY_CURR_MAX                   0x00001d06")
cpp_quote("#define URLACTION_INFODELIVERY_MAX                        0x00001dff")

cpp_quote("#define URLACTION_CHANNEL_SOFTDIST_MIN          0x00001e00")
cpp_quote("#define URLACTION_CHANNEL_SOFTDIST_PERMISSIONS  0x00001e05")
cpp_quote("#define URLPOLICY_CHANNEL_SOFTDIST_PROHIBIT     0x00010000")
cpp_quote("#define URLPOLICY_CHANNEL_SOFTDIST_PRECACHE     0x00020000")
cpp_quote("#define URLPOLICY_CHANNEL_SOFTDIST_AUTOINSTALL  0x00030000")
cpp_quote("#define URLACTION_CHANNEL_SOFTDIST_MAX          0x00001eff")

cpp_quote("#define URLPOLICY_ALLOW     0x00")
cpp_quote("#define URLPOLICY_QUERY     0x01")
cpp_quote("#define URLPOLICY_DISALLOW  0x03")

cpp_quote("#define URLPOLICY_NOTIFY_ON_ALLOW     0x10")
cpp_quote("#define URLPOLICY_NOTIFY_ON_DISALLOW  0x20")

cpp_quote("#define URLPOLICY_LOG_ON_ALLOW     0x40")
cpp_quote("#define URLPOLICY_LOG_ON_DISALLOW  0x80")

cpp_quote("#define URLPOLICY_DONTCHECKDLGBOX     0x100")

cpp_quote("#define URLPOLICY_CREDENTIALS_SILENT_LOGON_OK     0x00000000")
cpp_quote("#define URLPOLICY_CREDENTIALS_MUST_PROMPT_USER    0x00010000")
cpp_quote("#define URLPOLICY_CREDENTIALS_CONDITIONAL_PROMPT  0x00020000")
cpp_quote("#define URLPOLICY_CREDENTIALS_ANONYMOUS_ONLY      0x00030000")

cpp_quote("#define URLPOLICY_AUTHENTICATE_CLEARTEXT_OK        0x00000000")
cpp_quote("#define URLPOLICY_AUTHENTICATE_CHALLENGE_RESPONSE  0x00010000")
cpp_quote("#define URLPOLICY_AUTHENTICATE_MUTUAL_ONLY         0x00030000")

cpp_quote("#define URLPOLICY_MASK_PERMISSIONS  0x0f")
cpp_quote("#define GetUrlPolicyPermissions(dw)      (dw & URLPOLICY_MASK_PERMISSIONS)")
cpp_quote("#define SetUrlPolicyPermissions(dw,dw2)  ((dw) = ((dw) & ~URLPOLICY_MASK_PERMISSIONS) | (dw2))")

/*****************************************************************************
 * IInternetZoneManager interface
 */
[
    local,
    object,
    uuid(79EAC9EF-BAf9-11CE-8C82-00AA004BA90B),
    pointer_default(unique)
]
interface IInternetZoneManager : IUnknown
{
    typedef [unique] IInternetZoneManager* LPURLZONEMANAGER;

    typedef enum tagURLZONE
    {
        URLZONE_PREDEFINED_MIN  = 0,
        URLZONE_LOCAL_MACHINE   = 0,
        URLZONE_INTRANET        = 1,
        URLZONE_TRUSTED         = 2,
        URLZONE_INTERNET        = 3,
        URLZONE_UNTRUSTED       = 4,
        URLZONE_PREDEFINED_MAX  = 999,
        URLZONE_USER_MIN        = 1000,
        URLZONE_USER_MAX        = 10000,
    }  URLZONE;

    typedef enum tagURLTEMPLATE
    {
        URLTEMPLATE_CUSTOM         = 0x00000,
        URLTEMPLATE_PREDEFINED_MIN = 0x10000,
        URLTEMPLATE_LOW            = 0x10000,
        URLTEMPLATE_MEDLOW         = 0x10500,
        URLTEMPLATE_MEDIUM         = 0x11000,
        URLTEMPLATE_MEDHIGH        = 0x11500,
        URLTEMPLATE_HIGH           = 0x12000,
        URLTEMPLATE_PREDEFINED_MAX = 0x20000,
    } URLTEMPLATE ;

    typedef enum {
        ZAFLAGS_CUSTOM_EDIT              = 0x00000001,
        ZAFLAGS_ADD_SITES                = 0x00000002,
        ZAFLAGS_REQUIRE_VERIFICATION     = 0x00000004,
        ZAFLAGS_INCLUDE_PROXY_OVERRIDE   = 0x00000008,
        ZAFLAGS_INCLUDE_INTRANET_SITES   = 0x00000010,
        ZAFLAGS_NO_UI                    = 0x00000020,
        ZAFLAGS_SUPPORTS_VERIFICATION    = 0x00000040,
        ZAFLAGS_UNC_AS_INTRANET          = 0x00000080,
        ZAFLAGS_DETECT_INTRANET          = 0x00000100,
        ZAFLAGS_USE_LOCKED_ZONES         = 0x00010000,
        ZAFLAGS_VERIFY_TEMPLATE_SETTINGS = 0x00020000,
        ZAFLAGS_NO_CACHE                 = 0x00040000,
    } ZAFLAGS ;

    enum {
        MAX_ZONE_PATH        = 260,
        MAX_ZONE_DESCRIPTION = 200
    };

    typedef struct _ZONEATTRIBUTES {
        ULONG cbSize;
        WCHAR szDisplayName[MAX_ZONE_PATH];
        WCHAR szDescription[MAX_ZONE_DESCRIPTION];
        WCHAR szIconPath[MAX_ZONE_PATH];
        DWORD dwTemplateMinLevel;
        DWORD dwTemplateRecommended;
        DWORD dwTemplateCurrentLevel;
        DWORD dwFlags;
    } ZONEATTRIBUTES, *LPZONEATTRIBUTES;

    typedef enum _URLZONEREG {
        URLZONEREG_DEFAULT,
        URLZONEREG_HKLM,
        URLZONEREG_HKCU
    } URLZONEREG;

    HRESULT GetZoneAttributes(
        [in]              DWORD dwZone,
        [in, out, unique] ZONEATTRIBUTES* pZoneAttributes);

    HRESULT SetZoneAttributes(
        [in] DWORD dwZone,
        [in] ZONEATTRIBUTES* pZoneAttributes);

    HRESULT GetZoneCustomPolicy(
        [in]  DWORD dwZone,
        [in]  REFGUID guidKey,
        [out] BYTE **ppPolicy,
        [out] DWORD* pcbPolicy,
        [in]  URLZONEREG ulrZoneReg);

    HRESULT SetZoneCustomPolicy(
        [in] DWORD dwZone,
        [in] REFGUID guidKey,
        [in] BYTE *ppPolicy,
        [in] DWORD pcbPolicy,
        [in] URLZONEREG ulrZoneReg);

    HRESULT GetZoneActionPolicy(
        [in]  DWORD dwZone,
        [in]  DWORD dwAction,
        [out] BYTE* pPolicy,
        [in]  DWORD cbPolicy,
        [in]  URLZONEREG urlZoneReg);

    HRESULT SetZoneActionPolicy(
        [in] DWORD dwZone,
        [in] DWORD dwAction,
        [in] BYTE* pPolicy,
        [in] DWORD cbPolicy,
        [in] URLZONEREG urlZoneReg);

    HRESULT PromptAction(
        [in] DWORD dwAction,
        [in] HWND hwndParent,
        [in] LPCWSTR pwszUrl,
        [in] LPCWSTR pwszText,
        [in] DWORD dwPromptFlags );

    HRESULT LogAction(
        [in] DWORD dwAction,
        [in] LPCWSTR pwszUrl,
        [in] LPCWSTR pwszText,
        [in] DWORD dwLogFlags);

    HRESULT CreateZoneEnumerator(
        [out] DWORD* pdwEnum,
        [out] DWORD* pdwCount,
        [in]  DWORD dwFlags);

    HRESULT GetZoneAt(
        [in]  DWORD dwEnum,
        [in]  DWORD dwIndex,
        [out] DWORD* pdwZone);

    HRESULT DestroyZoneEnumerator(
        [in] DWORD dwEnum);

    HRESULT CopyTemplatePoliciesToZone(
        [in] DWORD dwTemplate,
        [in] DWORD dwZone,
        [in] DWORD dwReserved);
}

/*****************************************************************************
 * IInternetZoneManagerEx interface
 */
[
    local,
    object,
    uuid(A4C23339-8E06-431E-9BF4-7E711C085648),
    pointer_default(unique)
]
interface IInternetZoneManagerEx : IInternetZoneManager
{
    HRESULT GetZoneActionPolicyEx(
        [in]  DWORD dwZone,
        [in]  DWORD dwAction,
        [out] BYTE* pPolicy,
        [in]  DWORD cbPolicy,
        [in]  URLZONEREG urlZoneReg,
        [in]  DWORD dwFlags);

    HRESULT SetZoneActionPolicyEx(
        [in] DWORD dwZone,
        [in] DWORD dwAction,
        [in] BYTE* pPolicy,
        [in] DWORD cbPolicy,
        [in] URLZONEREG urlZoneReg,
        [in] DWORD dwFlags);

}

/*****************************************************************************
 * IInternetZoneManagerEx2 interface
 */

cpp_quote("#define SECURITY_IE_STATE_GREEN 0")
cpp_quote("#define SECURITY_IE_STATE_RED   1")

[
    local,
    object,
    uuid(EDC17559-DD5D-4846-8EEF-8BECBA5A4ABF),
    pointer_default(unique)
]
interface IInternetZoneManagerEx2 : IInternetZoneManagerEx
{
    HRESULT GetZoneAttributesEx(
        [in]              DWORD dwZone,
        [in, out, unique] ZONEATTRIBUTES* pZoneAttributes,
        [in]              DWORD dwFlags);

    HRESULT GetZoneSecurityState(
        [in]      DWORD dwZoneIndex,
        [in]      BOOL fRespectPolicy,
        [in, out] LPDWORD pdwState,
        [in, out] BOOL *pfPolicyEncountered);

    HRESULT GetIESecurityState(
        [in]      BOOL fRespectPolicy,
        [in, out] LPDWORD pdwState,
        [in, out] BOOL *pfPolicyEncountered,
        [in]      BOOL fNoCache);

    HRESULT FixInsecureSettings(void);

}


typedef struct _tagSOFTDISTINFO
{
    ULONG cbSize;
    DWORD dwFlags;
    DWORD dwAdState;
    LPWSTR szTitle;
    LPWSTR szAbstract;
    LPWSTR szHREF;
    DWORD dwInstalledVersionMS;
    DWORD dwInstalledVersionLS;
    DWORD dwUpdateVersionMS;
    DWORD dwUpdateVersionLS;
    DWORD dwAdvertisedVersionMS;
    DWORD dwAdvertisedVersionLS;
    DWORD dwReserved;
} SOFTDISTINFO, *LPSOFTDISTINFO;

typedef struct _tagCODEBASEHOLD
{
    DWORD cbSize;
    LPWSTR szDistUnit;
    LPWSTR szCodeBase;
    DWORD dwVersionMS;
    DWORD dwVersionLS;
    DWORD dwStyle;
} CODEBASEHOLD, *LPCODEBASEHOLD;

[
    local,
    object,
    uuid(b15b8dc1-c7e1-11d0-8680-00aa00bdcb71),
    pointer_default(unique)
]
interface ISoftDistExt : IUnknown
{
    HRESULT ProcessSoftDist(
        [in] LPCWSTR szCDFURL,
        [in] IXMLElement *pSoftDistElement,
        [in, out] LPSOFTDISTINFO lpsdi );

    HRESULT GetFirstCodeBase(
        [in] LPWSTR *szCodeBase,
        [in] LPDWORD dwMaxSize );

    HRESULT GetNextCodeBase(
        [in] LPWSTR *szCodeBase,
        [in] LPDWORD dwMaxSize );

    HRESULT AsyncInstallDistributionUnit(
        [in] IBindCtx *pbc,
        [in] LPVOID lpReserved,
        [in] DWORD flags,
        [in] LPCODEBASEHOLD lpcbh);
}

typedef enum _tagINTERNETFEATURELIST
{
    FEATURE_OBJECT_CACHING,
    FEATURE_ZONE_ELEVATION,
    FEATURE_MIME_HANDLING,
    FEATURE_MIME_SNIFFING,
    FEATURE_WINDOW_RESTRICTIONS,
    FEATURE_WEBOC_POPUPMANAGEMENT,
    FEATURE_BEHAVIORS,
    FEATURE_DISABLE_MK_PROTOCOL,
    FEATURE_LOCALMACHINE_LOCKDOWN,
    FEATURE_SECURITYBAND,
    FEATURE_RESTRICT_ACTIVEXINSTALL,
    FEATURE_VALIDATE_NAVIGATE_URL,
    FEATURE_RESTRICT_FILEDOWNLOAD,
    FEATURE_ADDON_MANAGEMENT,
    FEATURE_PROTOCOL_LOCKDOWN,
    FEATURE_HTTP_USERNAME_PASSWORD_DISABLE,
    FEATURE_SAFE_BINDTOOBJECT,
    FEATURE_UNC_SAVEDFILECHECK,
    FEATURE_GET_URL_DOM_FILEPATH_UNENCODED,
    FEATURE_TABBED_BROWSING,
    FEATURE_SSLUX,
    FEATURE_DISABLE_NAVIGATION_SOUNDS,
    FEATURE_DISABLE_LEGACY_COMPRESSION,
    FEATURE_FORCE_ADDR_AND_STATUS,
    FEATURE_XMLHTTP,
    FEATURE_DISABLE_TELNET_PROTOCOL,
    FEATURE_FEEDS,
    FEATURE_BLOCK_INPUT_PROMPTS,
    FEATURE_DOMSTORAGE,
    FEATURE_XDOMAINREQUEST,
    FEATURE_DATAURI,
    FEATURE_AJAX_CONNECTIONSERVICES,
    FEATURE_ENTRY_COUNT
} INTERNETFEATURELIST;

typedef struct _tagPROTOCOLFILTERDATA {
    DWORD cbSize;
    IInternetProtocolSink *pProtocolSink;
    IInternetProtocol *pProtocol;
    IUnknown *pUnk;
    DWORD dwFilterFlags;
} PROTOCOLFILTERDATA;

/*****************************************************************************
 * IUri interface
 */
[
    local,
    object,
    uuid(a39ee748-6a27-4817-a6f2-13914bef5890),
    pointer_default(unique)
]
interface IUri : IUnknown
{
    typedef enum
    {
        Uri_PROPERTY_ABSOLUTE_URI = 0,
        Uri_PROPERTY_STRING_START = Uri_PROPERTY_ABSOLUTE_URI,
        Uri_PROPERTY_AUTHORITY = 1,
        Uri_PROPERTY_DISPLAY_URI = 2,
        Uri_PROPERTY_DOMAIN = 3,
        Uri_PROPERTY_EXTENSION = 4,
        Uri_PROPERTY_FRAGMENT = 5,
        Uri_PROPERTY_HOST = 6,
        Uri_PROPERTY_PASSWORD = 7,
        Uri_PROPERTY_PATH = 8,
        Uri_PROPERTY_PATH_AND_QUERY = 9,
        Uri_PROPERTY_QUERY = 10,
        Uri_PROPERTY_RAW_URI = 11,
        Uri_PROPERTY_SCHEME_NAME = 12,
        Uri_PROPERTY_USER_INFO = 13,
        Uri_PROPERTY_USER_NAME = 14,
        Uri_PROPERTY_STRING_LAST = Uri_PROPERTY_USER_NAME,
        Uri_PROPERTY_HOST_TYPE = 15,
        Uri_PROPERTY_DWORD_START = Uri_PROPERTY_HOST_TYPE,
        Uri_PROPERTY_PORT = 16,
        Uri_PROPERTY_SCHEME = 17,
        Uri_PROPERTY_ZONE = 18,
        Uri_PROPERTY_DWORD_LAST = Uri_PROPERTY_ZONE
    } Uri_PROPERTY;

    HRESULT GetPropertyBSTR(
        [in]  Uri_PROPERTY uriProp,
        [out] BSTR *pbstrProperty,
        [in]  DWORD dwFlags);

    HRESULT GetPropertyLength(
        [in]  Uri_PROPERTY uriProp,
        [out] DWORD *pcchProperty,
        [in]  DWORD dwFlags);

    HRESULT GetPropertyDWORD(
        [in]  Uri_PROPERTY uriProp,
        [out] DWORD *pdwProperty,
        [in]  DWORD dwFlags);

    HRESULT HasProperty(
        [in] Uri_PROPERTY uriProp,
        [out] BOOL *pfHasProperty);

    HRESULT GetAbsoluteUri(
        [out] BSTR *pbstrAbsoluteUri);

    HRESULT GetAuthority(
        [out] BSTR *pbstrAuthority);

    HRESULT GetDisplayUri(
        [out] BSTR *pbstrDisplayString);

    HRESULT GetDomain(
        [out] BSTR *pbstrDomain);

    HRESULT GetExtension(
        [out] BSTR *pbstrExtension);

    HRESULT GetFragment(
        [out] BSTR *pbstrFragment);

    HRESULT GetHost(
        [out] BSTR *pbstrHost);

    HRESULT GetPassword(
        [out] BSTR *pbstrPassword);

    HRESULT GetPath(
        [out] BSTR *pbstrPath);

    HRESULT GetPathAndQuery(
        [out] BSTR *pbstrPathAndQuery);

    HRESULT GetQuery(
        [out] BSTR *pbstrQuery);

    HRESULT GetRawUri(
        [out] BSTR *pbstrRawUri);

    HRESULT GetSchemeName(
        [out] BSTR *pbstrSchemeName);

    HRESULT GetUserInfo(
        [out] BSTR *pbstrUserInfo);

    HRESULT GetUserName(
        [out] BSTR *pbstrUserName);

    HRESULT GetHostType(
        [out] DWORD *pdwHostType);

    HRESULT GetPort(
        [out] DWORD *pdwPort);

    HRESULT GetScheme(
        [out] DWORD *pdwScheme);

    HRESULT GetZone(
        [out] DWORD *pdwZone);

    HRESULT GetProperties(
        [out] LPDWORD pdwFlags);

    HRESULT IsEqual(
        [in]  IUri *pUri,
        [out] BOOL *pfEqual);
}

cpp_quote("HRESULT WINAPI CreateUri(LPCWSTR,DWORD,DWORD_PTR,IUri**);")
cpp_quote("HRESULT WINAPI CreateUriWithFragment(LPCWSTR,LPCWSTR,DWORD,DWORD_PTR,IUri**);")
cpp_quote("HRESULT WINAPI CreateUriFromMultiByteString(LPCSTR,DWORD,DWORD,DWORD,DWORD_PTR,IUri**);")

cpp_quote("#define Uri_HAS_ABSOLUTE_URI    (1 << Uri_PROPERTY_ABSOLUTE_URI)")
cpp_quote("#define Uri_HAS_AUTHORITY       (1 << Uri_PROPERTY_AUTHORITY)")
cpp_quote("#define Uri_HAS_DISPLAY_URI     (1 << Uri_PROPERTY_DISPLAY_URI)")
cpp_quote("#define Uri_HAS_DOMAIN          (1 << Uri_PROPERTY_DOMAIN)")
cpp_quote("#define Uri_HAS_EXTENSION       (1 << Uri_PROPERTY_EXTENSION)")
cpp_quote("#define Uri_HAS_FRAGMENT        (1 << Uri_PROPERTY_FRAGMENT)")
cpp_quote("#define Uri_HAS_HOST            (1 << Uri_PROPERTY_HOST)")
cpp_quote("#define Uri_HAS_PASSWORD        (1 << Uri_PROPERTY_PASSWORD)")
cpp_quote("#define Uri_HAS_PATH            (1 << Uri_PROPERTY_PATH)")
cpp_quote("#define Uri_HAS_QUERY           (1 << Uri_PROPERTY_QUERY)")
cpp_quote("#define Uri_HAS_RAW_URI         (1 << Uri_PROPERTY_RAW_URI)")
cpp_quote("#define Uri_HAS_SCHEME_NAME     (1 << Uri_PROPERTY_SCHEME_NAME)")
cpp_quote("#define Uri_HAS_USER_NAME       (1 << Uri_PROPERTY_USER_NAME)")
cpp_quote("#define Uri_HAS_PATH_AND_QUERY  (1 << Uri_PROPERTY_PATH_AND_QUERY)")
cpp_quote("#define Uri_HAS_USER_INFO       (1 << Uri_PROPERTY_USER_INFO)")
cpp_quote("#define Uri_HAS_HOST_TYPE       (1 << Uri_PROPERTY_HOST_TYPE)")
cpp_quote("#define Uri_HAS_PORT            (1 << Uri_PROPERTY_PORT)")
cpp_quote("#define Uri_HAS_SCHEME          (1 << Uri_PROPERTY_SCHEME)")
cpp_quote("#define Uri_HAS_ZONE            (1 << Uri_PROPERTY_ZONE)")

cpp_quote("#define Uri_CREATE_ALLOW_RELATIVE                  0x0001")
cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME  0x0002")
cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME      0x0004")
cpp_quote("#define Uri_CREATE_NOFRAG                          0x0008")
cpp_quote("#define Uri_CREATE_NO_CANONICALIZE                 0x0010")
cpp_quote("#define Uri_CREATE_CANONICALIZE                    0x0100")
cpp_quote("#define Uri_CREATE_FILE_USE_DOS_PATH               0x0020")
cpp_quote("#define Uri_CREATE_DECODE_EXTRA_INFO               0x0040")
cpp_quote("#define Uri_CREATE_NO_DECODE_EXTRA_INFO            0x0080")
cpp_quote("#define Uri_CREATE_CRACK_UNKNOWN_SCHEMES           0x0200")
cpp_quote("#define Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES        0x0400")
cpp_quote("#define Uri_CREATE_PRE_PROCESS_HTML_URI            0x0800")
cpp_quote("#define Uri_CREATE_NO_PRE_PROCESS_HTML_URI         0x1000")
cpp_quote("#define Uri_CREATE_IE_SETTINGS                     0x2000")
cpp_quote("#define Uri_CREATE_NO_IE_SETTINGS                  0x4000")
cpp_quote("#define Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS  0x8000")

cpp_quote("#define Uri_DISPLAY_NO_FRAGMENT  0x00000001")
cpp_quote("#define Uri_PUNYCODE_IDN_HOST    0x00000002")
cpp_quote("#define Uri_DISPLAY_IDN_HOST     0x00000004")

cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8   0x00000001")
cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_CP                     0x00000002")
cpp_quote("#define Uri_ENCODING_HOST_IS_IDN                                  0x00000004")
cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8                 0x00000008")
cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_CP                   0x00000010")
cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8   0x00000020")
cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_CP                     0x00000040")
cpp_quote("#define Uri_ENCODING_RFC (Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8)")

cpp_quote("#define UriBuilder_USE_ORIGINAL_FLAGS  0x00000001")

/*****************************************************************************
 * IUriContainer interface
 */
[
    local,
    object,
    uuid(a158a630-ed6f-45fb-b987-f68676f57752),
    pointer_default(unique)
]
interface IUriContainer : IUnknown
{
    HRESULT GetIUri([out] IUri **ppIUri);
}

/*****************************************************************************
 * IUriBuilder interface
 */
[
    local,
    object,
    uuid(4221b2e1-8955-46c0-bd5b-de9897565de7),
    pointer_default(unique)
]
interface IUriBuilder: IUnknown
{
    HRESULT CreateUriSimple(
        [in]  DWORD       dwAllowEncodingPropertyMask,
        [in]  DWORD_PTR   dwReserved,
        [out] IUri      **ppIUri);

    HRESULT CreateUri(
        [in]  DWORD       dwCreateFlags,
        [in]  DWORD       dwAllowEncodingPropertyMask,
        [in]  DWORD_PTR   dwReserved,
        [out] IUri      **ppIUri);

    HRESULT CreateUriWithFlags(
        [in]  DWORD       dwCreateFlags,
        [in]  DWORD       dwUriBuilderFlags,
        [in]  DWORD       dwAllowEncodingPropertyMask,
        [in]  DWORD_PTR   dwReserved,
        [out] IUri      **ppIUri);

    HRESULT GetIUri(
        [out] IUri **ppIUri);

    HRESULT SetIUri(
        [in, unique] IUri *pIUri);

    HRESULT GetFragment(
        [out] DWORD   *pcchFragment,
        [out] LPCWSTR *ppwzFragment);

    HRESULT GetHost(
        [out] DWORD   *pcchHost,
        [out] LPCWSTR *ppwzHost);

    HRESULT GetPassword(
        [out] DWORD   *pcchPassword,
        [out] LPCWSTR *ppwzPassword);

    HRESULT GetPath(
        [out] DWORD   *pcchPath,
        [out] LPCWSTR *ppwzPath);

    HRESULT GetPort(
        [out] BOOL  *pfHasPort,
        [out] DWORD *pdwPort);

    HRESULT GetQuery(
        [out] DWORD   *pcchQuery,
        [out] LPCWSTR *ppwzQuery);

    HRESULT GetSchemeName(
        [out] DWORD   *pcchSchemeName,
        [out] LPCWSTR *ppwzSchemeName);

    HRESULT GetUserName(
        [out] DWORD   *pcchUserName,
        [out] LPCWSTR *ppwzUserName);

    HRESULT SetFragment(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetHost(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetPassword(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetPath(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetPort(
        [in] BOOL  fHasPort,
        [in] DWORD dwNewValue);

    HRESULT SetQuery(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetSchemeName(
        [in] LPCWSTR pwzNewValue);

    HRESULT SetUserName(
        [in] LPCWSTR pwzNewValue);

    HRESULT RemoveProperties(
        [in] DWORD dwPropertyMask);

    HRESULT HasBeenModified(
        [out] BOOL *pfModified);
};

/*****************************************************************************
 * IInternetProtocolEx interface
 */
[
    local,
    object,
    uuid(c7a98e66-1010-492c-a1c8-c809e1f75905),
    pointer_default(unique)
]
interface IInternetProtocolEx : IInternetProtocol
{
    HRESULT StartEx(
        [in] IUri *pUri,
        [in] IInternetProtocolSink *pOIProtSink,
        [in] IInternetBindInfo *pOIBindInfo,
        [in] DWORD grfPI,
        [in] HANDLE *dwReserved);
}

cpp_quote("#define CONFIRMSAFETYACTION_LOADOBJECT  0x00000001")

struct CONFIRMSAFETY
{
    CLSID clsid;
    IUnknown *pUnk;
    DWORD dwFlags;
};

cpp_quote("EXTERN_C const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY;")

cpp_quote("DEFINE_GUID(CLSID_InternetSecurityManager, 0x7b8a2d94, 0x0ac9, 0x11d1, 0x89, 0x6c, 0x00, 0xc0, 0x4f, 0xB6, 0xbf, 0xc4);")
cpp_quote("DEFINE_GUID(CLSID_InternetZoneManager, 0x7B8A2D95, 0x0AC9, 0x11D1, 0x89, 0x6C, 0x00, 0xC0, 0x4F, 0xB6, 0xBF, 0xC4);")
cpp_quote("DEFINE_GUID(IID_IAsyncMoniker, 0x79EAC9D3, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);")
cpp_quote("DEFINE_GUID(IID_IAsyncBindCtx, 0x79EAC9D4, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);")
cpp_quote("DEFINE_GUID(CLSID_StdURLMoniker, 0x79EAC9E0, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);")
cpp_quote("DEFINE_GUID(CLSID_DeCompMimeFilter, 0x8f6b0360, 0xb80d, 0x11d0, 0xa9,0xb3, 0x00,0x60,0x97,0x94,0x23,0x11);")

cpp_quote("DEFINE_GUID(CLSID_CdlProtocol, 0x3dd53d40, 0x7b8b, 0x11D0, 0xb0,0x13, 0x00,0xaa,0x00,0x59,0xce,0x02);")
cpp_quote("DEFINE_GUID(CLSID_FileProtocol, 0x79EAC9E7, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_FtpProtocol, 0x79EAC9E3, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_GopherProtocol, 0x79EAC9E4, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_HttpProtocol, 0x79EAC9E2, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_HttpSProtocol, 0x79EAC9E5, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")
cpp_quote("DEFINE_GUID(CLSID_MkProtocol, 0x79EAC9E6, 0xBAF9, 0x11CE, 0x8C,0x82, 0x00,0xAA,0x00,0x4B,0xA9,0x0B);")

cpp_quote("#define URLMON_OPTION_USERAGENT          0x10000001")
cpp_quote("#define URLMON_OPTION_USERAGENT_REFRESH  0x10000002")
cpp_quote("#define URLMON_OPTION_URL_ENCODING       0x10000004")

cpp_quote("#define MK_S_ASYNCHRONOUS                _HRESULT_TYPEDEF_(0x000401E8)")
cpp_quote("#ifndef S_ASYNCHRONOUS")
cpp_quote("#define S_ASYNCHRONOUS                   MK_S_ASYNCHRONOUS")
cpp_quote("#endif")

cpp_quote("#define INET_E_ERROR_FIRST               _HRESULT_TYPEDEF_(0x800C0002)")
cpp_quote("#define INET_E_INVALID_URL               _HRESULT_TYPEDEF_(0x800C0002)")
cpp_quote("#define INET_E_NO_SESSION                _HRESULT_TYPEDEF_(0x800C0003)")
cpp_quote("#define INET_E_CANNOT_CONNECT            _HRESULT_TYPEDEF_(0x800C0004)")
cpp_quote("#define INET_E_RESOURCE_NOT_FOUND        _HRESULT_TYPEDEF_(0x800C0005)")
cpp_quote("#define INET_E_OBJECT_NOT_FOUND          _HRESULT_TYPEDEF_(0x800C0006)")
cpp_quote("#define INET_E_DATA_NOT_AVAILABLE        _HRESULT_TYPEDEF_(0x800C0007)")
cpp_quote("#define INET_E_DOWNLOAD_FAILURE          _HRESULT_TYPEDEF_(0x800C0008)")
cpp_quote("#define INET_E_AUTHENTICATION_REQUIRED   _HRESULT_TYPEDEF_(0x800C0009)")
cpp_quote("#define INET_E_NO_VALID_MEDIA            _HRESULT_TYPEDEF_(0x800C000A)")
cpp_quote("#define INET_E_CONNECTION_TIMEOUT        _HRESULT_TYPEDEF_(0x800C000B)")
cpp_quote("#define INET_E_INVALID_REQUEST           _HRESULT_TYPEDEF_(0x800C000C)")
cpp_quote("#define INET_E_UNKNOWN_PROTOCOL          _HRESULT_TYPEDEF_(0x800C000D)")
cpp_quote("#define INET_E_SECURITY_PROBLEM          _HRESULT_TYPEDEF_(0x800C000E)")
cpp_quote("#define INET_E_CANNOT_LOAD_DATA          _HRESULT_TYPEDEF_(0x800C000F)")
cpp_quote("#define INET_E_CANNOT_INSTANTIATE_OBJECT _HRESULT_TYPEDEF_(0x800C0010)")
cpp_quote("#define INET_E_USE_DEFAULT_PROTOCOLHANDLER _HRESULT_TYPEDEF_(0x800C0011)")
cpp_quote("#define INET_E_QUERYOPTION_UNKNOWN       _HRESULT_TYPEDEF_(0x800C0013)")
cpp_quote("#define INET_E_REDIRECT_FAILED           _HRESULT_TYPEDEF_(0x800C0014)")
cpp_quote("#define INET_E_REDIRECT_TO_DIR           _HRESULT_TYPEDEF_(0x800C0015)")
cpp_quote("#define INET_E_CANNOT_LOCK_REQUEST       _HRESULT_TYPEDEF_(0x800C0016)")
cpp_quote("#define INET_E_ERROR_LAST                INET_E_REDIRECT_TO_DIR")
cpp_quote("#define INET_E_DEFAULT_ACTION            INET_E_USE_DEFAULT_PROTOCOLHANDLER")

cpp_quote("HRESULT WINAPI CoGetClassObjectFromURL(REFCLSID, LPCWSTR, DWORD, DWORD, LPCWSTR, LPBINDCTX, DWORD, LPVOID, REFIID, LPVOID*);")
cpp_quote("HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk);")
cpp_quote("HRESULT WINAPI CreateURLMonikerEx(IMoniker*,LPCWSTR,IMoniker**,DWORD);")
cpp_quote("HRESULT WINAPI CreateURLMonikerEx2(IMoniker*,IUri*,IMoniker**,DWORD);")
cpp_quote("HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbsc, DWORD dwReserved);")
cpp_quote("HRESULT WINAPI CompareSecurityIds(BYTE*,DWORD,BYTE*,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI URLDownloadToFileA(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN,LPCWSTR,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLDownloadToCacheFileA(LPUNKNOWN,LPCSTR,LPSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLDownloadToCacheFileW(LPUNKNOWN,LPCWSTR,LPWSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI CoInternetGetSession(DWORD,IInternetSession**,DWORD);")
cpp_quote("HRESULT WINAPI MkParseDisplayNameEx(IBindCtx*,LPCWSTR,ULONG*,IMoniker**);")
cpp_quote("HRESULT WINAPI IsAsyncMoniker(IMoniker* pmk);")
cpp_quote("HRESULT WINAPI CreateAsyncBindCtx(DWORD, IBindStatusCallback*, IEnumFORMATETC*, IBindCtx**);")
cpp_quote("HRESULT WINAPI CreateAsyncBindCtxEx(IBindCtx*,DWORD,IBindStatusCallback*,IEnumFORMATETC*,IBindCtx**,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCreateSecurityManager(IServiceProvider*,IInternetSecurityManager**,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCombineUrl(LPCWSTR,LPCWSTR,DWORD,LPWSTR,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCompareUrl(LPCWSTR,LPCWSTR,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider*, IInternetZoneManager**, DWORD);")
cpp_quote("HRESULT WINAPI CoInternetParseUrl(LPCWSTR,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetQueryInfo(LPCWSTR,QUERYOPTION,DWORD,LPVOID,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetSetFeatureEnabled(INTERNETFEATURELIST,DWORD,BOOL);")
cpp_quote("HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR,LPWSTR*,PSUACTION,DWORD);")
cpp_quote("HRESULT WINAPI CreateFormatEnumerator(UINT,FORMATETC*,IEnumFORMATETC**);")
cpp_quote("HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi);")
cpp_quote("HRESULT WINAPI FaultInIEFeature(HWND,uCLSSPEC*,QUERYCONTEXT*,DWORD);")
cpp_quote("HRESULT WINAPI FindMimeFromData(LPBC,LPCWSTR,LPVOID,DWORD,LPCWSTR,DWORD,LPWSTR*,DWORD);")
cpp_quote("HRESULT WINAPI GetClassFileOrMime(LPBC,LPCWSTR,LPVOID,DWORD,LPCWSTR,DWORD,CLSID*);")
cpp_quote("HRESULT WINAPI HlinkGoBack(IUnknown*);")
cpp_quote("HRESULT WINAPI HlinkGoForward(IUnknown*);")
cpp_quote("HRESULT WINAPI HlinkNavigateMoniker(IUnknown*,IMoniker*);")
cpp_quote("HRESULT WINAPI HlinkNavigateString(IUnknown*,LPCWSTR);")
cpp_quote("HRESULT WINAPI HlinkSimpleNavigateToMoniker(IMoniker*,LPCWSTR,LPCWSTR,IUnknown*,IBindCtx*,IBindStatusCallback*,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI HlinkSimpleNavigateToString(LPCWSTR,LPCWSTR,LPCWSTR,IUnknown*,IBindCtx*,IBindStatusCallback*,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI IsValidURL(LPBC,LPCWSTR,DWORD);")
cpp_quote("HRESULT WINAPI ObtainUserAgentString(DWORD,LPSTR,DWORD*);")
cpp_quote("HRESULT WINAPI RegisterFormatEnumerator(LPBC,IEnumFORMATETC*,DWORD);")
cpp_quote("HRESULT WINAPI RevokeFormatEnumerator(LPBC,IEnumFORMATETC*);")
cpp_quote("HRESULT WINAPI RevokeBindStatusCallback(LPBC,IBindStatusCallback*);")
cpp_quote("HRESULT WINAPI CopyStgMedium(const STGMEDIUM*,STGMEDIUM*);")
cpp_quote("void WINAPI ReleaseBindInfo(BINDINFO*);")
cpp_quote("HRESULT WINAPI UrlMkGetSessionOption(DWORD,LPVOID,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI UrlMkSetSessionOption(DWORD,LPVOID,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI URLOpenStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenPullStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenPullStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenBlockingStreamA(LPUNKNOWN,LPCSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);")
cpp_quote("HRESULT WINAPI URLOpenBlockingStreamW(LPUNKNOWN,LPCWSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);")

cpp_quote("#define OInetCombineUrl CoInternetCombineUrl")
cpp_quote("#define OInetCompareUrl CoInternetCompareUrl")
cpp_quote("#define OInetGetSession CoInternetGetSession")

cpp_quote("BOOL WINAPI IsLoggingEnabledA(LPCSTR);")
cpp_quote("BOOL WINAPI IsLoggingEnabledW(LPCWSTR);")
cpp_quote("#define IsLoggingEnabled WINELIB_NAME_AW(IsLoggingEnabled)")

cpp_quote("#define MKSYS_URLMONIKER 6")
cpp_quote("#define URL_MK_LEGACY            0")
cpp_quote("#define URL_MK_UNIFORM           1")
