/*** Autogenerated by WIDL 1.6 from include/windows.storage.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

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

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_storage_h__
#define __windows_storage_h__

/* Forward declarations */

#ifndef __IStorageItem_FWD_DEFINED__
#define __IStorageItem_FWD_DEFINED__
typedef interface IStorageItem IStorageItem;
#endif

#ifndef __IKnownFoldersStatics_FWD_DEFINED__
#define __IKnownFoldersStatics_FWD_DEFINED__
typedef interface IKnownFoldersStatics IKnownFoldersStatics;
#endif

#ifndef __IStorageFolder_FWD_DEFINED__
#define __IStorageFolder_FWD_DEFINED__
typedef interface IStorageFolder IStorageFolder;
#endif

#ifndef __IApplicationDataContainer_FWD_DEFINED__
#define __IApplicationDataContainer_FWD_DEFINED__
typedef interface IApplicationDataContainer IApplicationDataContainer;
#endif

#ifndef __IApplicationData_FWD_DEFINED__
#define __IApplicationData_FWD_DEFINED__
typedef interface IApplicationData IApplicationData;
#endif

#ifndef __IApplicationDataStatics_FWD_DEFINED__
#define __IApplicationDataStatics_FWD_DEFINED__
typedef interface IApplicationDataStatics IApplicationDataStatics;
#endif

#ifndef __ApplicationDataSetVersionHandler_FWD_DEFINED__
#define __ApplicationDataSetVersionHandler_FWD_DEFINED__
typedef interface ApplicationDataSetVersionHandler ApplicationDataSetVersionHandler;
#endif

#ifndef __ISetVersionRequest_FWD_DEFINED__
#define __ISetVersionRequest_FWD_DEFINED__
typedef interface ISetVersionRequest ISetVersionRequest;
#endif

#ifndef __ISetVersionDeferral_FWD_DEFINED__
#define __ISetVersionDeferral_FWD_DEFINED__
typedef interface ISetVersionDeferral ISetVersionDeferral;
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <hstring.h>
#include <windows.foundation.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IAsyncAction_FWD_DEFINED__
#define __IAsyncAction_FWD_DEFINED__
typedef interface IAsyncAction IAsyncAction;
#endif

#ifndef __TypedEventHandler_FWD_DEFINED__
#define __TypedEventHandler_FWD_DEFINED__
typedef interface TypedEventHandler TypedEventHandler;
#endif

#ifndef __IPropertySet_FWD_DEFINED__
#define __IPropertySet_FWD_DEFINED__
typedef interface IPropertySet IPropertySet;
#endif

#ifndef __IMapView_FWD_DEFINED__
#define __IMapView_FWD_DEFINED__
typedef interface IMapView IMapView;
#endif

#ifndef __IStorageItem_FWD_DEFINED__
#define __IStorageItem_FWD_DEFINED__
typedef interface IStorageItem IStorageItem;
#endif

#ifndef __IStorageFolder_FWD_DEFINED__
#define __IStorageFolder_FWD_DEFINED__
typedef interface IStorageFolder IStorageFolder;
#endif

#ifndef __IApplicationData_FWD_DEFINED__
#define __IApplicationData_FWD_DEFINED__
typedef interface IApplicationData IApplicationData;
#endif

#ifndef __IApplicationDataStatics_FWD_DEFINED__
#define __IApplicationDataStatics_FWD_DEFINED__
typedef interface IApplicationDataStatics IApplicationDataStatics;
#endif

#ifndef __IApplicationDataSetVersionHandler_FWD_DEFINED__
#define __IApplicationDataSetVersionHandler_FWD_DEFINED__
typedef interface IApplicationDataSetVersionHandler IApplicationDataSetVersionHandler;
#endif

#ifndef __ApplicationDataContainer_FWD_DEFINED__
#define __ApplicationDataContainer_FWD_DEFINED__
typedef interface ApplicationDataContainer ApplicationDataContainer;
#endif

#ifndef __ApplicationDataSetVersionHandler_FWD_DEFINED__
#define __ApplicationDataSetVersionHandler_FWD_DEFINED__
typedef interface ApplicationDataSetVersionHandler ApplicationDataSetVersionHandler;
#endif

#ifndef __ISetVersionRequest_FWD_DEFINED__
#define __ISetVersionRequest_FWD_DEFINED__
typedef interface ISetVersionRequest ISetVersionRequest;
#endif

#ifndef __ISetVersionDeferral_FWD_DEFINED__
#define __ISetVersionDeferral_FWD_DEFINED__
typedef interface ISetVersionDeferral ISetVersionDeferral;
#endif

enum StorageDeleteOption;

enum NameCollisionOption;

enum StorageItemTypes;

enum ApplicationDataLocality;

enum ApplicationDataCreateDisposition;

enum FileAttributes;

enum CreationCollisionOption;

typedef enum NameCollisionoption {
    NameCollisionoption_GenerateUniqueName = 0,
    NameCollisionoption_ReplaceExisting = 1,
    NameCollisionoption_FailIfExists = 2
} NameCollisionOption;
typedef enum StorageDeleteOption {
    StorageDeleteOption_Default = 0,
    StorageDeleteOption_PermanentDelete = 1
} StorageDeleteOption;
typedef enum StorageItemTypes {
    StorageItemTypes_None = 0,
    StorageItemTypes_File = 1,
    StorageItemTypes_Folder = 2
} StorageItemTypes;
typedef enum ApplicationDataCreateDisposition {
    ApplicationDataCreateDisposition_Always = 0,
    ApplicationDataCreateDisposition_Existing = 1
} ApplicationDataCreateDisposition;
typedef enum ApplicationDataLocality {
    ApplicationDataLocality_Local = 0,
    ApplicationDataLocality_Roaming = 1,
    ApplicationDataLocality_Temporary = 2
} ApplicationDataLocality;
typedef enum FileAttributes {
    FileAttributes_Normal = 0,
    FileAttributes_ReadOnly = 1,
    FileAttributes_Directory = 2,
    FileAttributes_Archive = 3,
    FileAttributes_Temporary = 4
} FileAttributes;
typedef enum CreationCollisionOption {
    CreationCollisionOption_GenerateUniqueName = 0,
    CreationCollisionOption_ReplaceExisting = 1,
    CreationCollisionOption_FailIfExists = 2,
    CreationCollisionOption_OpenIfExists = 3
} CreationCollisionOption;
/*****************************************************************************
 * IStorageItem interface
 */
#ifndef __IStorageItem_INTERFACE_DEFINED__
#define __IStorageItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IStorageItem, 0x4207a996, 0xca2f, 0x42f7, 0xbd,0xe8, 0x8b,0x10,0x45,0x7a,0x7f,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4207a996-ca2f-42f7-bde8-8b10457a7f30")
IStorageItem : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE RenameAsyncOverloadDefaultOptions(
        HSTRING desiredName,
        IInspectable **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenameAsync(
        HSTRING desiredName,
        NameCollisionOption option,
        IInspectable **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAsyncOverloadDefaultOptions(
        IInspectable **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAsync(
        StorageDeleteOption option,
        IInspectable **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBasicPropertiesAsync(
        IInspectable **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        HSTRING *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Path(
        HSTRING *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Attributes(
        FileAttributes *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DateCreated(
        DateTime *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsOfType(
        StorageItemTypes itemType,
        boolean *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IStorageItem, 0x4207a996, 0xca2f, 0x42f7, 0xbd,0xe8, 0x8b,0x10,0x45,0x7a,0x7f,0x30)
#endif
#else
typedef struct IStorageItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IStorageItem* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IStorageItem* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IStorageItem* This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        IStorageItem* This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        IStorageItem* This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        IStorageItem* This,
        TrustLevel *trustLevel);

    /*** IStorageItem methods ***/
    HRESULT (STDMETHODCALLTYPE *RenameAsyncOverloadDefaultOptions)(
        IStorageItem* This,
        HSTRING desiredName,
        IInspectable **action);

    HRESULT (STDMETHODCALLTYPE *RenameAsync)(
        IStorageItem* This,
        HSTRING desiredName,
        NameCollisionOption option,
        IInspectable **action);

    HRESULT (STDMETHODCALLTYPE *DeleteAsyncOverloadDefaultOptions)(
        IStorageItem* This,
        IInspectable **action);

    HRESULT (STDMETHODCALLTYPE *DeleteAsync)(
        IStorageItem* This,
        StorageDeleteOption option,
        IInspectable **action);

    HRESULT (STDMETHODCALLTYPE *GetBasicPropertiesAsync)(
        IStorageItem* This,
        IInspectable **action);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IStorageItem* This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IStorageItem* This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Attributes)(
        IStorageItem* This,
        FileAttributes *value);

    HRESULT (STDMETHODCALLTYPE *get_DateCreated)(
        IStorageItem* This,
        DateTime *value);

    HRESULT (STDMETHODCALLTYPE *IsOfType)(
        IStorageItem* This,
        StorageItemTypes itemType,
        boolean *value);

    END_INTERFACE
} IStorageItemVtbl;
interface IStorageItem {
    CONST_VTBL IStorageItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IStorageItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IStorageItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IStorageItem_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IStorageItem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IStorageItem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IStorageItem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IStorageItem methods ***/
#define IStorageItem_RenameAsyncOverloadDefaultOptions(This,desiredName,action) (This)->lpVtbl->RenameAsyncOverloadDefaultOptions(This,desiredName,action)
#define IStorageItem_RenameAsync(This,desiredName,option,action) (This)->lpVtbl->RenameAsync(This,desiredName,option,action)
#define IStorageItem_DeleteAsyncOverloadDefaultOptions(This,action) (This)->lpVtbl->DeleteAsyncOverloadDefaultOptions(This,action)
#define IStorageItem_DeleteAsync(This,option,action) (This)->lpVtbl->DeleteAsync(This,option,action)
#define IStorageItem_GetBasicPropertiesAsync(This,action) (This)->lpVtbl->GetBasicPropertiesAsync(This,action)
#define IStorageItem_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define IStorageItem_get_Path(This,value) (This)->lpVtbl->get_Path(This,value)
#define IStorageItem_get_Attributes(This,value) (This)->lpVtbl->get_Attributes(This,value)
#define IStorageItem_get_DateCreated(This,value) (This)->lpVtbl->get_DateCreated(This,value)
#define IStorageItem_IsOfType(This,itemType,value) (This)->lpVtbl->IsOfType(This,itemType,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IStorageItem_QueryInterface(IStorageItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IStorageItem_AddRef(IStorageItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IStorageItem_Release(IStorageItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IStorageItem_GetIids(IStorageItem* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IStorageItem_GetRuntimeClassName(IStorageItem* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IStorageItem_GetTrustLevel(IStorageItem* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IStorageItem methods ***/
static FORCEINLINE HRESULT IStorageItem_RenameAsyncOverloadDefaultOptions(IStorageItem* This,HSTRING desiredName,IInspectable **action) {
    return This->lpVtbl->RenameAsyncOverloadDefaultOptions(This,desiredName,action);
}
static FORCEINLINE HRESULT IStorageItem_RenameAsync(IStorageItem* This,HSTRING desiredName,NameCollisionOption option,IInspectable **action) {
    return This->lpVtbl->RenameAsync(This,desiredName,option,action);
}
static FORCEINLINE HRESULT IStorageItem_DeleteAsyncOverloadDefaultOptions(IStorageItem* This,IInspectable **action) {
    return This->lpVtbl->DeleteAsyncOverloadDefaultOptions(This,action);
}
static FORCEINLINE HRESULT IStorageItem_DeleteAsync(IStorageItem* This,StorageDeleteOption option,IInspectable **action) {
    return This->lpVtbl->DeleteAsync(This,option,action);
}
static FORCEINLINE HRESULT IStorageItem_GetBasicPropertiesAsync(IStorageItem* This,IInspectable **action) {
    return This->lpVtbl->GetBasicPropertiesAsync(This,action);
}
static FORCEINLINE HRESULT IStorageItem_get_Name(IStorageItem* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static FORCEINLINE HRESULT IStorageItem_get_Path(IStorageItem* This,HSTRING *value) {
    return This->lpVtbl->get_Path(This,value);
}
static FORCEINLINE HRESULT IStorageItem_get_Attributes(IStorageItem* This,FileAttributes *value) {
    return This->lpVtbl->get_Attributes(This,value);
}
static FORCEINLINE HRESULT IStorageItem_get_DateCreated(IStorageItem* This,DateTime *value) {
    return This->lpVtbl->get_DateCreated(This,value);
}
static FORCEINLINE HRESULT IStorageItem_IsOfType(IStorageItem* This,StorageItemTypes itemType,boolean *value) {
    return This->lpVtbl->IsOfType(This,itemType,value);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IStorageItem_RenameAsyncOverloadDefaultOptions_Proxy(
    IStorageItem* This,
    HSTRING desiredName,
    IInspectable **action);
void __RPC_STUB IStorageItem_RenameAsyncOverloadDefaultOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_RenameAsync_Proxy(
    IStorageItem* This,
    HSTRING desiredName,
    NameCollisionOption option,
    IInspectable **action);
void __RPC_STUB IStorageItem_RenameAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_DeleteAsyncOverloadDefaultOptions_Proxy(
    IStorageItem* This,
    IInspectable **action);
void __RPC_STUB IStorageItem_DeleteAsyncOverloadDefaultOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_DeleteAsync_Proxy(
    IStorageItem* This,
    StorageDeleteOption option,
    IInspectable **action);
void __RPC_STUB IStorageItem_DeleteAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_GetBasicPropertiesAsync_Proxy(
    IStorageItem* This,
    IInspectable **action);
void __RPC_STUB IStorageItem_GetBasicPropertiesAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_get_Name_Proxy(
    IStorageItem* This,
    HSTRING *value);
void __RPC_STUB IStorageItem_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_get_Path_Proxy(
    IStorageItem* This,
    HSTRING *value);
void __RPC_STUB IStorageItem_get_Path_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_get_Attributes_Proxy(
    IStorageItem* This,
    FileAttributes *value);
void __RPC_STUB IStorageItem_get_Attributes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_get_DateCreated_Proxy(
    IStorageItem* This,
    DateTime *value);
void __RPC_STUB IStorageItem_get_DateCreated_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageItem_IsOfType_Proxy(
    IStorageItem* This,
    StorageItemTypes itemType,
    boolean *value);
void __RPC_STUB IStorageItem_IsOfType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IStorageItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IKnownFoldersStatics interface
 */
#ifndef __IKnownFoldersStatics_INTERFACE_DEFINED__
#define __IKnownFoldersStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID_IKnownFoldersStatics, 0x5a2a7520, 0x4802, 0x452d, 0x9a,0xd9, 0x43,0x51,0xad,0xa7,0xec,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5a2a7520-4802-452d-9ad9-4351ada7ec35")
IKnownFoldersStatics : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE get_MusicLibrary(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PicturesLibrary(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_VideosLibrary(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DocumentsLibrary(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HomeGroup(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RemovableDevices(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MediaServerDevices(
        IStorageFolder **value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IKnownFoldersStatics, 0x5a2a7520, 0x4802, 0x452d, 0x9a,0xd9, 0x43,0x51,0xad,0xa7,0xec,0x35)
#endif
#else
typedef struct IKnownFoldersStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IKnownFoldersStatics* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IKnownFoldersStatics* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IKnownFoldersStatics* This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        IKnownFoldersStatics* This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        IKnownFoldersStatics* This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        IKnownFoldersStatics* This,
        TrustLevel *trustLevel);

    /*** IKnownFoldersStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MusicLibrary)(
        IKnownFoldersStatics* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_PicturesLibrary)(
        IKnownFoldersStatics* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_VideosLibrary)(
        IKnownFoldersStatics* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_DocumentsLibrary)(
        IKnownFoldersStatics* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_HomeGroup)(
        IKnownFoldersStatics* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_RemovableDevices)(
        IKnownFoldersStatics* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_MediaServerDevices)(
        IKnownFoldersStatics* This,
        IStorageFolder **value);

    END_INTERFACE
} IKnownFoldersStaticsVtbl;
interface IKnownFoldersStatics {
    CONST_VTBL IKnownFoldersStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IKnownFoldersStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IKnownFoldersStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IKnownFoldersStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IKnownFoldersStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IKnownFoldersStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IKnownFoldersStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKnownFoldersStatics methods ***/
#define IKnownFoldersStatics_get_MusicLibrary(This,value) (This)->lpVtbl->get_MusicLibrary(This,value)
#define IKnownFoldersStatics_get_PicturesLibrary(This,value) (This)->lpVtbl->get_PicturesLibrary(This,value)
#define IKnownFoldersStatics_get_VideosLibrary(This,value) (This)->lpVtbl->get_VideosLibrary(This,value)
#define IKnownFoldersStatics_get_DocumentsLibrary(This,value) (This)->lpVtbl->get_DocumentsLibrary(This,value)
#define IKnownFoldersStatics_get_HomeGroup(This,value) (This)->lpVtbl->get_HomeGroup(This,value)
#define IKnownFoldersStatics_get_RemovableDevices(This,value) (This)->lpVtbl->get_RemovableDevices(This,value)
#define IKnownFoldersStatics_get_MediaServerDevices(This,value) (This)->lpVtbl->get_MediaServerDevices(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IKnownFoldersStatics_QueryInterface(IKnownFoldersStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IKnownFoldersStatics_AddRef(IKnownFoldersStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IKnownFoldersStatics_Release(IKnownFoldersStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IKnownFoldersStatics_GetIids(IKnownFoldersStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IKnownFoldersStatics_GetRuntimeClassName(IKnownFoldersStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IKnownFoldersStatics_GetTrustLevel(IKnownFoldersStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKnownFoldersStatics methods ***/
static FORCEINLINE HRESULT IKnownFoldersStatics_get_MusicLibrary(IKnownFoldersStatics* This,IStorageFolder **value) {
    return This->lpVtbl->get_MusicLibrary(This,value);
}
static FORCEINLINE HRESULT IKnownFoldersStatics_get_PicturesLibrary(IKnownFoldersStatics* This,IStorageFolder **value) {
    return This->lpVtbl->get_PicturesLibrary(This,value);
}
static FORCEINLINE HRESULT IKnownFoldersStatics_get_VideosLibrary(IKnownFoldersStatics* This,IStorageFolder **value) {
    return This->lpVtbl->get_VideosLibrary(This,value);
}
static FORCEINLINE HRESULT IKnownFoldersStatics_get_DocumentsLibrary(IKnownFoldersStatics* This,IStorageFolder **value) {
    return This->lpVtbl->get_DocumentsLibrary(This,value);
}
static FORCEINLINE HRESULT IKnownFoldersStatics_get_HomeGroup(IKnownFoldersStatics* This,IStorageFolder **value) {
    return This->lpVtbl->get_HomeGroup(This,value);
}
static FORCEINLINE HRESULT IKnownFoldersStatics_get_RemovableDevices(IKnownFoldersStatics* This,IStorageFolder **value) {
    return This->lpVtbl->get_RemovableDevices(This,value);
}
static FORCEINLINE HRESULT IKnownFoldersStatics_get_MediaServerDevices(IKnownFoldersStatics* This,IStorageFolder **value) {
    return This->lpVtbl->get_MediaServerDevices(This,value);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_MusicLibrary_Proxy(
    IKnownFoldersStatics* This,
    IStorageFolder **value);
void __RPC_STUB IKnownFoldersStatics_get_MusicLibrary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_PicturesLibrary_Proxy(
    IKnownFoldersStatics* This,
    IStorageFolder **value);
void __RPC_STUB IKnownFoldersStatics_get_PicturesLibrary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_VideosLibrary_Proxy(
    IKnownFoldersStatics* This,
    IStorageFolder **value);
void __RPC_STUB IKnownFoldersStatics_get_VideosLibrary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_DocumentsLibrary_Proxy(
    IKnownFoldersStatics* This,
    IStorageFolder **value);
void __RPC_STUB IKnownFoldersStatics_get_DocumentsLibrary_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_HomeGroup_Proxy(
    IKnownFoldersStatics* This,
    IStorageFolder **value);
void __RPC_STUB IKnownFoldersStatics_get_HomeGroup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_RemovableDevices_Proxy(
    IKnownFoldersStatics* This,
    IStorageFolder **value);
void __RPC_STUB IKnownFoldersStatics_get_RemovableDevices_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IKnownFoldersStatics_get_MediaServerDevices_Proxy(
    IKnownFoldersStatics* This,
    IStorageFolder **value);
void __RPC_STUB IKnownFoldersStatics_get_MediaServerDevices_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IKnownFoldersStatics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IStorageFolder interface
 */
#ifndef __IStorageFolder_INTERFACE_DEFINED__
#define __IStorageFolder_INTERFACE_DEFINED__

DEFINE_GUID(IID_IStorageFolder, 0x72d1cb78, 0xb3ef, 0x4f75, 0xa8,0x0b, 0x6f,0xd9,0xda,0xe2,0x94,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("72d1cb78-b3ef-4f75-a80b-6fd9dae2944b")
IStorageFolder : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE CreateFileAsyncOverloadDefaultOptions(
        HSTRING desiredName,
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFileAsync(
        HSTRING desiredName,
        CreationCollisionOption options,
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFolderAsyncOverloadDefaultOptions(
        HSTRING desiredName,
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFolderAsync(
        HSTRING desiredName,
        CreationCollisionOption options,
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileAsync(
        HSTRING name,
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFolderAsync(
        HSTRING name,
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemAsync(
        HSTRING name,
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFilesAsyncOverloadDefaultOptionsStartAndCount(
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFoldersAsyncOverloadDefaultOptionsStartAndCount(
        IInspectable **operation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetItemsAsyncOverloadDefaultStartAndCount(
        IInspectable **operation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IStorageFolder, 0x72d1cb78, 0xb3ef, 0x4f75, 0xa8,0x0b, 0x6f,0xd9,0xda,0xe2,0x94,0x4b)
#endif
#else
typedef struct IStorageFolderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IStorageFolder* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IStorageFolder* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IStorageFolder* This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        IStorageFolder* This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        IStorageFolder* This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        IStorageFolder* This,
        TrustLevel *trustLevel);

    /*** IStorageFolder methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateFileAsyncOverloadDefaultOptions)(
        IStorageFolder* This,
        HSTRING desiredName,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *CreateFileAsync)(
        IStorageFolder* This,
        HSTRING desiredName,
        CreationCollisionOption options,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *CreateFolderAsyncOverloadDefaultOptions)(
        IStorageFolder* This,
        HSTRING desiredName,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *CreateFolderAsync)(
        IStorageFolder* This,
        HSTRING desiredName,
        CreationCollisionOption options,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *GetFileAsync)(
        IStorageFolder* This,
        HSTRING name,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *GetFolderAsync)(
        IStorageFolder* This,
        HSTRING name,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *GetItemAsync)(
        IStorageFolder* This,
        HSTRING name,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *GetFilesAsyncOverloadDefaultOptionsStartAndCount)(
        IStorageFolder* This,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *GetFoldersAsyncOverloadDefaultOptionsStartAndCount)(
        IStorageFolder* This,
        IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *GetItemsAsyncOverloadDefaultStartAndCount)(
        IStorageFolder* This,
        IInspectable **operation);

    END_INTERFACE
} IStorageFolderVtbl;
interface IStorageFolder {
    CONST_VTBL IStorageFolderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IStorageFolder_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IStorageFolder_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IStorageFolder_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IStorageFolder_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IStorageFolder_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IStorageFolder_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IStorageFolder methods ***/
#define IStorageFolder_CreateFileAsyncOverloadDefaultOptions(This,desiredName,operation) (This)->lpVtbl->CreateFileAsyncOverloadDefaultOptions(This,desiredName,operation)
#define IStorageFolder_CreateFileAsync(This,desiredName,options,operation) (This)->lpVtbl->CreateFileAsync(This,desiredName,options,operation)
#define IStorageFolder_CreateFolderAsyncOverloadDefaultOptions(This,desiredName,operation) (This)->lpVtbl->CreateFolderAsyncOverloadDefaultOptions(This,desiredName,operation)
#define IStorageFolder_CreateFolderAsync(This,desiredName,options,operation) (This)->lpVtbl->CreateFolderAsync(This,desiredName,options,operation)
#define IStorageFolder_GetFileAsync(This,name,operation) (This)->lpVtbl->GetFileAsync(This,name,operation)
#define IStorageFolder_GetFolderAsync(This,name,operation) (This)->lpVtbl->GetFolderAsync(This,name,operation)
#define IStorageFolder_GetItemAsync(This,name,operation) (This)->lpVtbl->GetItemAsync(This,name,operation)
#define IStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount(This,operation) (This)->lpVtbl->GetFilesAsyncOverloadDefaultOptionsStartAndCount(This,operation)
#define IStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount(This,operation) (This)->lpVtbl->GetFoldersAsyncOverloadDefaultOptionsStartAndCount(This,operation)
#define IStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount(This,operation) (This)->lpVtbl->GetItemsAsyncOverloadDefaultStartAndCount(This,operation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IStorageFolder_QueryInterface(IStorageFolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IStorageFolder_AddRef(IStorageFolder* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IStorageFolder_Release(IStorageFolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IStorageFolder_GetIids(IStorageFolder* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IStorageFolder_GetRuntimeClassName(IStorageFolder* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IStorageFolder_GetTrustLevel(IStorageFolder* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IStorageFolder methods ***/
static FORCEINLINE HRESULT IStorageFolder_CreateFileAsyncOverloadDefaultOptions(IStorageFolder* This,HSTRING desiredName,IInspectable **operation) {
    return This->lpVtbl->CreateFileAsyncOverloadDefaultOptions(This,desiredName,operation);
}
static FORCEINLINE HRESULT IStorageFolder_CreateFileAsync(IStorageFolder* This,HSTRING desiredName,CreationCollisionOption options,IInspectable **operation) {
    return This->lpVtbl->CreateFileAsync(This,desiredName,options,operation);
}
static FORCEINLINE HRESULT IStorageFolder_CreateFolderAsyncOverloadDefaultOptions(IStorageFolder* This,HSTRING desiredName,IInspectable **operation) {
    return This->lpVtbl->CreateFolderAsyncOverloadDefaultOptions(This,desiredName,operation);
}
static FORCEINLINE HRESULT IStorageFolder_CreateFolderAsync(IStorageFolder* This,HSTRING desiredName,CreationCollisionOption options,IInspectable **operation) {
    return This->lpVtbl->CreateFolderAsync(This,desiredName,options,operation);
}
static FORCEINLINE HRESULT IStorageFolder_GetFileAsync(IStorageFolder* This,HSTRING name,IInspectable **operation) {
    return This->lpVtbl->GetFileAsync(This,name,operation);
}
static FORCEINLINE HRESULT IStorageFolder_GetFolderAsync(IStorageFolder* This,HSTRING name,IInspectable **operation) {
    return This->lpVtbl->GetFolderAsync(This,name,operation);
}
static FORCEINLINE HRESULT IStorageFolder_GetItemAsync(IStorageFolder* This,HSTRING name,IInspectable **operation) {
    return This->lpVtbl->GetItemAsync(This,name,operation);
}
static FORCEINLINE HRESULT IStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount(IStorageFolder* This,IInspectable **operation) {
    return This->lpVtbl->GetFilesAsyncOverloadDefaultOptionsStartAndCount(This,operation);
}
static FORCEINLINE HRESULT IStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount(IStorageFolder* This,IInspectable **operation) {
    return This->lpVtbl->GetFoldersAsyncOverloadDefaultOptionsStartAndCount(This,operation);
}
static FORCEINLINE HRESULT IStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount(IStorageFolder* This,IInspectable **operation) {
    return This->lpVtbl->GetItemsAsyncOverloadDefaultStartAndCount(This,operation);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IStorageFolder_CreateFileAsyncOverloadDefaultOptions_Proxy(
    IStorageFolder* This,
    HSTRING desiredName,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_CreateFileAsyncOverloadDefaultOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_CreateFileAsync_Proxy(
    IStorageFolder* This,
    HSTRING desiredName,
    CreationCollisionOption options,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_CreateFileAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_CreateFolderAsyncOverloadDefaultOptions_Proxy(
    IStorageFolder* This,
    HSTRING desiredName,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_CreateFolderAsyncOverloadDefaultOptions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_CreateFolderAsync_Proxy(
    IStorageFolder* This,
    HSTRING desiredName,
    CreationCollisionOption options,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_CreateFolderAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_GetFileAsync_Proxy(
    IStorageFolder* This,
    HSTRING name,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_GetFileAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_GetFolderAsync_Proxy(
    IStorageFolder* This,
    HSTRING name,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_GetFolderAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_GetItemAsync_Proxy(
    IStorageFolder* This,
    HSTRING name,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_GetItemAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount_Proxy(
    IStorageFolder* This,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_GetFilesAsyncOverloadDefaultOptionsStartAndCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount_Proxy(
    IStorageFolder* This,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_GetFoldersAsyncOverloadDefaultOptionsStartAndCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount_Proxy(
    IStorageFolder* This,
    IInspectable **operation);
void __RPC_STUB IStorageFolder_GetItemsAsyncOverloadDefaultStartAndCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IStorageFolder_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IApplicationDataContainer interface
 */
#ifndef __IApplicationDataContainer_INTERFACE_DEFINED__
#define __IApplicationDataContainer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationDataContainer, 0xc5aefd1e, 0xf467, 0x40ba, 0x85,0x66, 0xab,0x64,0x0a,0x44,0x1e,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c5aefd1e-f467-40ba-8566-ab640a441e1d")
IApplicationDataContainer : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        HSTRING *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Locality(
        ApplicationDataLocality *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Values(
        IInspectable **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Containers(
        IInspectable **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateContainer(
        HSTRING name,
        ApplicationDataCreateDisposition disposition,
        IApplicationDataContainer **container) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteContainer(
        HSTRING name) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationDataContainer, 0xc5aefd1e, 0xf467, 0x40ba, 0x85,0x66, 0xab,0x64,0x0a,0x44,0x1e,0x1d)
#endif
#else
typedef struct IApplicationDataContainerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationDataContainer* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationDataContainer* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationDataContainer* This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        IApplicationDataContainer* This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        IApplicationDataContainer* This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        IApplicationDataContainer* This,
        TrustLevel *trustLevel);

    /*** IApplicationDataContainer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IApplicationDataContainer* This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Locality)(
        IApplicationDataContainer* This,
        ApplicationDataLocality *value);

    HRESULT (STDMETHODCALLTYPE *get_Values)(
        IApplicationDataContainer* This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_Containers)(
        IApplicationDataContainer* This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *CreateContainer)(
        IApplicationDataContainer* This,
        HSTRING name,
        ApplicationDataCreateDisposition disposition,
        IApplicationDataContainer **container);

    HRESULT (STDMETHODCALLTYPE *DeleteContainer)(
        IApplicationDataContainer* This,
        HSTRING name);

    END_INTERFACE
} IApplicationDataContainerVtbl;
interface IApplicationDataContainer {
    CONST_VTBL IApplicationDataContainerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationDataContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationDataContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationDataContainer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IApplicationDataContainer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IApplicationDataContainer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IApplicationDataContainer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationDataContainer methods ***/
#define IApplicationDataContainer_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define IApplicationDataContainer_get_Locality(This,value) (This)->lpVtbl->get_Locality(This,value)
#define IApplicationDataContainer_get_Values(This,value) (This)->lpVtbl->get_Values(This,value)
#define IApplicationDataContainer_get_Containers(This,value) (This)->lpVtbl->get_Containers(This,value)
#define IApplicationDataContainer_CreateContainer(This,name,disposition,container) (This)->lpVtbl->CreateContainer(This,name,disposition,container)
#define IApplicationDataContainer_DeleteContainer(This,name) (This)->lpVtbl->DeleteContainer(This,name)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationDataContainer_QueryInterface(IApplicationDataContainer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationDataContainer_AddRef(IApplicationDataContainer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationDataContainer_Release(IApplicationDataContainer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IApplicationDataContainer_GetIids(IApplicationDataContainer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IApplicationDataContainer_GetRuntimeClassName(IApplicationDataContainer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IApplicationDataContainer_GetTrustLevel(IApplicationDataContainer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationDataContainer methods ***/
static FORCEINLINE HRESULT IApplicationDataContainer_get_Name(IApplicationDataContainer* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static FORCEINLINE HRESULT IApplicationDataContainer_get_Locality(IApplicationDataContainer* This,ApplicationDataLocality *value) {
    return This->lpVtbl->get_Locality(This,value);
}
static FORCEINLINE HRESULT IApplicationDataContainer_get_Values(IApplicationDataContainer* This,IInspectable **value) {
    return This->lpVtbl->get_Values(This,value);
}
static FORCEINLINE HRESULT IApplicationDataContainer_get_Containers(IApplicationDataContainer* This,IInspectable **value) {
    return This->lpVtbl->get_Containers(This,value);
}
static FORCEINLINE HRESULT IApplicationDataContainer_CreateContainer(IApplicationDataContainer* This,HSTRING name,ApplicationDataCreateDisposition disposition,IApplicationDataContainer **container) {
    return This->lpVtbl->CreateContainer(This,name,disposition,container);
}
static FORCEINLINE HRESULT IApplicationDataContainer_DeleteContainer(IApplicationDataContainer* This,HSTRING name) {
    return This->lpVtbl->DeleteContainer(This,name);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IApplicationDataContainer_get_Name_Proxy(
    IApplicationDataContainer* This,
    HSTRING *value);
void __RPC_STUB IApplicationDataContainer_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationDataContainer_get_Locality_Proxy(
    IApplicationDataContainer* This,
    ApplicationDataLocality *value);
void __RPC_STUB IApplicationDataContainer_get_Locality_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationDataContainer_get_Values_Proxy(
    IApplicationDataContainer* This,
    IInspectable **value);
void __RPC_STUB IApplicationDataContainer_get_Values_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationDataContainer_get_Containers_Proxy(
    IApplicationDataContainer* This,
    IInspectable **value);
void __RPC_STUB IApplicationDataContainer_get_Containers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationDataContainer_CreateContainer_Proxy(
    IApplicationDataContainer* This,
    HSTRING name,
    ApplicationDataCreateDisposition disposition,
    IApplicationDataContainer **container);
void __RPC_STUB IApplicationDataContainer_CreateContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationDataContainer_DeleteContainer_Proxy(
    IApplicationDataContainer* This,
    HSTRING name);
void __RPC_STUB IApplicationDataContainer_DeleteContainer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IApplicationDataContainer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IApplicationData interface
 */
#ifndef __IApplicationData_INTERFACE_DEFINED__
#define __IApplicationData_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationData, 0xc3da6fb7, 0xb744, 0x4b45, 0xb0,0xb8, 0x22,0x3a,0x09,0x38,0xd0,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c3da6fb7-b744-4b45-b0b8-223a0938d0dc")
IApplicationData : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE get_Version(
        int *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVersionAsync(
        int desiredVersion,
        ApplicationDataSetVersionHandler *handler,
        IInspectable **setVersionOperation) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearAllAsync(
        IInspectable **clearOperation) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearAsync(
        ApplicationDataLocality locality,
        IInspectable **clearOperation) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalSettings(
        IApplicationDataContainer **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RoamingSettings(
        IApplicationDataContainer **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalFolder(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RoamingFolder(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TemporaryFolder(
        IStorageFolder **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE DataChanged(
        EventRegistrationToken token) = 0;

    virtual HRESULT STDMETHODCALLTYPE SignalDataChanged(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RoamingStorageQuota(
        UINT64 *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationData, 0xc3da6fb7, 0xb744, 0x4b45, 0xb0,0xb8, 0x22,0x3a,0x09,0x38,0xd0,0xdc)
#endif
#else
typedef struct IApplicationDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationData* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationData* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationData* This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        IApplicationData* This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        IApplicationData* This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        IApplicationData* This,
        TrustLevel *trustLevel);

    /*** IApplicationData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Version)(
        IApplicationData* This,
        int *value);

    HRESULT (STDMETHODCALLTYPE *SetVersionAsync)(
        IApplicationData* This,
        int desiredVersion,
        ApplicationDataSetVersionHandler *handler,
        IInspectable **setVersionOperation);

    HRESULT (STDMETHODCALLTYPE *ClearAllAsync)(
        IApplicationData* This,
        IInspectable **clearOperation);

    HRESULT (STDMETHODCALLTYPE *ClearAsync)(
        IApplicationData* This,
        ApplicationDataLocality locality,
        IInspectable **clearOperation);

    HRESULT (STDMETHODCALLTYPE *get_LocalSettings)(
        IApplicationData* This,
        IApplicationDataContainer **value);

    HRESULT (STDMETHODCALLTYPE *get_RoamingSettings)(
        IApplicationData* This,
        IApplicationDataContainer **value);

    HRESULT (STDMETHODCALLTYPE *get_LocalFolder)(
        IApplicationData* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_RoamingFolder)(
        IApplicationData* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *get_TemporaryFolder)(
        IApplicationData* This,
        IStorageFolder **value);

    HRESULT (STDMETHODCALLTYPE *DataChanged)(
        IApplicationData* This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *SignalDataChanged)(
        IApplicationData* This);

    HRESULT (STDMETHODCALLTYPE *RoamingStorageQuota)(
        IApplicationData* This,
        UINT64 *value);

    END_INTERFACE
} IApplicationDataVtbl;
interface IApplicationData {
    CONST_VTBL IApplicationDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationData_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IApplicationData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IApplicationData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IApplicationData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationData methods ***/
#define IApplicationData_get_Version(This,value) (This)->lpVtbl->get_Version(This,value)
#define IApplicationData_SetVersionAsync(This,desiredVersion,handler,setVersionOperation) (This)->lpVtbl->SetVersionAsync(This,desiredVersion,handler,setVersionOperation)
#define IApplicationData_ClearAllAsync(This,clearOperation) (This)->lpVtbl->ClearAllAsync(This,clearOperation)
#define IApplicationData_ClearAsync(This,locality,clearOperation) (This)->lpVtbl->ClearAsync(This,locality,clearOperation)
#define IApplicationData_get_LocalSettings(This,value) (This)->lpVtbl->get_LocalSettings(This,value)
#define IApplicationData_get_RoamingSettings(This,value) (This)->lpVtbl->get_RoamingSettings(This,value)
#define IApplicationData_get_LocalFolder(This,value) (This)->lpVtbl->get_LocalFolder(This,value)
#define IApplicationData_get_RoamingFolder(This,value) (This)->lpVtbl->get_RoamingFolder(This,value)
#define IApplicationData_get_TemporaryFolder(This,value) (This)->lpVtbl->get_TemporaryFolder(This,value)
#define IApplicationData_DataChanged(This,token) (This)->lpVtbl->DataChanged(This,token)
#define IApplicationData_SignalDataChanged(This) (This)->lpVtbl->SignalDataChanged(This)
#define IApplicationData_RoamingStorageQuota(This,value) (This)->lpVtbl->RoamingStorageQuota(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationData_QueryInterface(IApplicationData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationData_AddRef(IApplicationData* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationData_Release(IApplicationData* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IApplicationData_GetIids(IApplicationData* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IApplicationData_GetRuntimeClassName(IApplicationData* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IApplicationData_GetTrustLevel(IApplicationData* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationData methods ***/
static FORCEINLINE HRESULT IApplicationData_get_Version(IApplicationData* This,int *value) {
    return This->lpVtbl->get_Version(This,value);
}
static FORCEINLINE HRESULT IApplicationData_SetVersionAsync(IApplicationData* This,int desiredVersion,ApplicationDataSetVersionHandler *handler,IInspectable **setVersionOperation) {
    return This->lpVtbl->SetVersionAsync(This,desiredVersion,handler,setVersionOperation);
}
static FORCEINLINE HRESULT IApplicationData_ClearAllAsync(IApplicationData* This,IInspectable **clearOperation) {
    return This->lpVtbl->ClearAllAsync(This,clearOperation);
}
static FORCEINLINE HRESULT IApplicationData_ClearAsync(IApplicationData* This,ApplicationDataLocality locality,IInspectable **clearOperation) {
    return This->lpVtbl->ClearAsync(This,locality,clearOperation);
}
static FORCEINLINE HRESULT IApplicationData_get_LocalSettings(IApplicationData* This,IApplicationDataContainer **value) {
    return This->lpVtbl->get_LocalSettings(This,value);
}
static FORCEINLINE HRESULT IApplicationData_get_RoamingSettings(IApplicationData* This,IApplicationDataContainer **value) {
    return This->lpVtbl->get_RoamingSettings(This,value);
}
static FORCEINLINE HRESULT IApplicationData_get_LocalFolder(IApplicationData* This,IStorageFolder **value) {
    return This->lpVtbl->get_LocalFolder(This,value);
}
static FORCEINLINE HRESULT IApplicationData_get_RoamingFolder(IApplicationData* This,IStorageFolder **value) {
    return This->lpVtbl->get_RoamingFolder(This,value);
}
static FORCEINLINE HRESULT IApplicationData_get_TemporaryFolder(IApplicationData* This,IStorageFolder **value) {
    return This->lpVtbl->get_TemporaryFolder(This,value);
}
static FORCEINLINE HRESULT IApplicationData_DataChanged(IApplicationData* This,EventRegistrationToken token) {
    return This->lpVtbl->DataChanged(This,token);
}
static FORCEINLINE HRESULT IApplicationData_SignalDataChanged(IApplicationData* This) {
    return This->lpVtbl->SignalDataChanged(This);
}
static FORCEINLINE HRESULT IApplicationData_RoamingStorageQuota(IApplicationData* This,UINT64 *value) {
    return This->lpVtbl->RoamingStorageQuota(This,value);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IApplicationData_get_Version_Proxy(
    IApplicationData* This,
    int *value);
void __RPC_STUB IApplicationData_get_Version_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_SetVersionAsync_Proxy(
    IApplicationData* This,
    int desiredVersion,
    ApplicationDataSetVersionHandler *handler,
    IInspectable **setVersionOperation);
void __RPC_STUB IApplicationData_SetVersionAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_ClearAllAsync_Proxy(
    IApplicationData* This,
    IInspectable **clearOperation);
void __RPC_STUB IApplicationData_ClearAllAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_ClearAsync_Proxy(
    IApplicationData* This,
    ApplicationDataLocality locality,
    IInspectable **clearOperation);
void __RPC_STUB IApplicationData_ClearAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_get_LocalSettings_Proxy(
    IApplicationData* This,
    IApplicationDataContainer **value);
void __RPC_STUB IApplicationData_get_LocalSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_get_RoamingSettings_Proxy(
    IApplicationData* This,
    IApplicationDataContainer **value);
void __RPC_STUB IApplicationData_get_RoamingSettings_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_get_LocalFolder_Proxy(
    IApplicationData* This,
    IStorageFolder **value);
void __RPC_STUB IApplicationData_get_LocalFolder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_get_RoamingFolder_Proxy(
    IApplicationData* This,
    IStorageFolder **value);
void __RPC_STUB IApplicationData_get_RoamingFolder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_get_TemporaryFolder_Proxy(
    IApplicationData* This,
    IStorageFolder **value);
void __RPC_STUB IApplicationData_get_TemporaryFolder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_DataChanged_Proxy(
    IApplicationData* This,
    EventRegistrationToken token);
void __RPC_STUB IApplicationData_DataChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_SignalDataChanged_Proxy(
    IApplicationData* This);
void __RPC_STUB IApplicationData_SignalDataChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IApplicationData_RoamingStorageQuota_Proxy(
    IApplicationData* This,
    UINT64 *value);
void __RPC_STUB IApplicationData_RoamingStorageQuota_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IApplicationData_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IApplicationDataStatics interface
 */
#ifndef __IApplicationDataStatics_INTERFACE_DEFINED__
#define __IApplicationDataStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID_IApplicationDataStatics, 0x5612147b, 0xe843, 0x45e3, 0x94,0xd8, 0x06,0x16,0x9e,0x3c,0x8e,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5612147b-e843-45e3-94d8-06169e3c8e17")
IApplicationDataStatics : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE get_Current(
        IApplicationData **data) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IApplicationDataStatics, 0x5612147b, 0xe843, 0x45e3, 0x94,0xd8, 0x06,0x16,0x9e,0x3c,0x8e,0x17)
#endif
#else
typedef struct IApplicationDataStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IApplicationDataStatics* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IApplicationDataStatics* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IApplicationDataStatics* This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        IApplicationDataStatics* This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        IApplicationDataStatics* This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        IApplicationDataStatics* This,
        TrustLevel *trustLevel);

    /*** IApplicationDataStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        IApplicationDataStatics* This,
        IApplicationData **data);

    END_INTERFACE
} IApplicationDataStaticsVtbl;
interface IApplicationDataStatics {
    CONST_VTBL IApplicationDataStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IApplicationDataStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IApplicationDataStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IApplicationDataStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define IApplicationDataStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define IApplicationDataStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define IApplicationDataStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IApplicationDataStatics methods ***/
#define IApplicationDataStatics_get_Current(This,data) (This)->lpVtbl->get_Current(This,data)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IApplicationDataStatics_QueryInterface(IApplicationDataStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IApplicationDataStatics_AddRef(IApplicationDataStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IApplicationDataStatics_Release(IApplicationDataStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT IApplicationDataStatics_GetIids(IApplicationDataStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT IApplicationDataStatics_GetRuntimeClassName(IApplicationDataStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT IApplicationDataStatics_GetTrustLevel(IApplicationDataStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IApplicationDataStatics methods ***/
static FORCEINLINE HRESULT IApplicationDataStatics_get_Current(IApplicationDataStatics* This,IApplicationData **data) {
    return This->lpVtbl->get_Current(This,data);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IApplicationDataStatics_get_Current_Proxy(
    IApplicationDataStatics* This,
    IApplicationData **data);
void __RPC_STUB IApplicationDataStatics_get_Current_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IApplicationDataStatics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ApplicationDataSetVersionHandler interface
 */
#ifndef __ApplicationDataSetVersionHandler_INTERFACE_DEFINED__
#define __ApplicationDataSetVersionHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_ApplicationDataSetVersionHandler, 0xa05791e6, 0xcc9f, 0x4687, 0xac,0xab, 0xa3,0x64,0xfd,0x78,0x54,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a05791e6-cc9f-4687-acab-a364fd785463")
ApplicationDataSetVersionHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ApplicationDataSetVersionHandler(
        ISetVersionRequest *setVersionRequest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ApplicationDataSetVersionHandler, 0xa05791e6, 0xcc9f, 0x4687, 0xac,0xab, 0xa3,0x64,0xfd,0x78,0x54,0x63)
#endif
#else
typedef struct ApplicationDataSetVersionHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ApplicationDataSetVersionHandler* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ApplicationDataSetVersionHandler* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ApplicationDataSetVersionHandler* This);

    /*** ApplicationDataSetVersionHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *ApplicationDataSetVersionHandler)(
        ApplicationDataSetVersionHandler* This,
        ISetVersionRequest *setVersionRequest);

    END_INTERFACE
} ApplicationDataSetVersionHandlerVtbl;
interface ApplicationDataSetVersionHandler {
    CONST_VTBL ApplicationDataSetVersionHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ApplicationDataSetVersionHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ApplicationDataSetVersionHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ApplicationDataSetVersionHandler_Release(This) (This)->lpVtbl->Release(This)
/*** ApplicationDataSetVersionHandler methods ***/
#define ApplicationDataSetVersionHandler_ApplicationDataSetVersionHandler(This,setVersionRequest) (This)->lpVtbl->ApplicationDataSetVersionHandler(This,setVersionRequest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ApplicationDataSetVersionHandler_QueryInterface(ApplicationDataSetVersionHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ApplicationDataSetVersionHandler_AddRef(ApplicationDataSetVersionHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ApplicationDataSetVersionHandler_Release(ApplicationDataSetVersionHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ApplicationDataSetVersionHandler methods ***/
static FORCEINLINE HRESULT ApplicationDataSetVersionHandler_ApplicationDataSetVersionHandler(ApplicationDataSetVersionHandler* This,ISetVersionRequest *setVersionRequest) {
    return This->lpVtbl->ApplicationDataSetVersionHandler(This,setVersionRequest);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ApplicationDataSetVersionHandler_ApplicationDataSetVersionHandler_Proxy(
    ApplicationDataSetVersionHandler* This,
    ISetVersionRequest *setVersionRequest);
void __RPC_STUB ApplicationDataSetVersionHandler_ApplicationDataSetVersionHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ApplicationDataSetVersionHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISetVersionRequest interface
 */
#ifndef __ISetVersionRequest_INTERFACE_DEFINED__
#define __ISetVersionRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISetVersionRequest, 0xb9c76b9b, 0x1056, 0x4e69, 0x83,0x30, 0x16,0x26,0x19,0x95,0x6f,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b9c76b9b-1056-4e69-8330-162619956f9b")
ISetVersionRequest : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentVersion(
        UINT32 *currentVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DesiredVersion(
        UINT32 *desiredVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
        ISetVersionDeferral **deferral) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISetVersionRequest, 0xb9c76b9b, 0x1056, 0x4e69, 0x83,0x30, 0x16,0x26,0x19,0x95,0x6f,0x9b)
#endif
#else
typedef struct ISetVersionRequestVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISetVersionRequest* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISetVersionRequest* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISetVersionRequest* This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        ISetVersionRequest* This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        ISetVersionRequest* This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        ISetVersionRequest* This,
        TrustLevel *trustLevel);

    /*** ISetVersionRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentVersion)(
        ISetVersionRequest* This,
        UINT32 *currentVersion);

    HRESULT (STDMETHODCALLTYPE *get_DesiredVersion)(
        ISetVersionRequest* This,
        UINT32 *desiredVersion);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        ISetVersionRequest* This,
        ISetVersionDeferral **deferral);

    END_INTERFACE
} ISetVersionRequestVtbl;
interface ISetVersionRequest {
    CONST_VTBL ISetVersionRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISetVersionRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISetVersionRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISetVersionRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define ISetVersionRequest_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define ISetVersionRequest_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define ISetVersionRequest_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISetVersionRequest methods ***/
#define ISetVersionRequest_get_CurrentVersion(This,currentVersion) (This)->lpVtbl->get_CurrentVersion(This,currentVersion)
#define ISetVersionRequest_get_DesiredVersion(This,desiredVersion) (This)->lpVtbl->get_DesiredVersion(This,desiredVersion)
#define ISetVersionRequest_GetDeferral(This,deferral) (This)->lpVtbl->GetDeferral(This,deferral)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISetVersionRequest_QueryInterface(ISetVersionRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISetVersionRequest_AddRef(ISetVersionRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISetVersionRequest_Release(ISetVersionRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT ISetVersionRequest_GetIids(ISetVersionRequest* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT ISetVersionRequest_GetRuntimeClassName(ISetVersionRequest* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT ISetVersionRequest_GetTrustLevel(ISetVersionRequest* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISetVersionRequest methods ***/
static FORCEINLINE HRESULT ISetVersionRequest_get_CurrentVersion(ISetVersionRequest* This,UINT32 *currentVersion) {
    return This->lpVtbl->get_CurrentVersion(This,currentVersion);
}
static FORCEINLINE HRESULT ISetVersionRequest_get_DesiredVersion(ISetVersionRequest* This,UINT32 *desiredVersion) {
    return This->lpVtbl->get_DesiredVersion(This,desiredVersion);
}
static FORCEINLINE HRESULT ISetVersionRequest_GetDeferral(ISetVersionRequest* This,ISetVersionDeferral **deferral) {
    return This->lpVtbl->GetDeferral(This,deferral);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISetVersionRequest_get_CurrentVersion_Proxy(
    ISetVersionRequest* This,
    UINT32 *currentVersion);
void __RPC_STUB ISetVersionRequest_get_CurrentVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISetVersionRequest_get_DesiredVersion_Proxy(
    ISetVersionRequest* This,
    UINT32 *desiredVersion);
void __RPC_STUB ISetVersionRequest_get_DesiredVersion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISetVersionRequest_GetDeferral_Proxy(
    ISetVersionRequest* This,
    ISetVersionDeferral **deferral);
void __RPC_STUB ISetVersionRequest_GetDeferral_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISetVersionRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISetVersionDeferral interface
 */
#ifndef __ISetVersionDeferral_INTERFACE_DEFINED__
#define __ISetVersionDeferral_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISetVersionDeferral, 0x033508a2, 0x781a, 0x437a, 0xb0,0x78, 0x3f,0x32,0xba,0xdc,0xfe,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("033508a2-781a-437a-b078-3f32badcfe47")
ISetVersionDeferral : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE Complete(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISetVersionDeferral, 0x033508a2, 0x781a, 0x437a, 0xb0,0x78, 0x3f,0x32,0xba,0xdc,0xfe,0x47)
#endif
#else
typedef struct ISetVersionDeferralVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISetVersionDeferral* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISetVersionDeferral* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISetVersionDeferral* This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        ISetVersionDeferral* This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        ISetVersionDeferral* This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        ISetVersionDeferral* This,
        TrustLevel *trustLevel);

    /*** ISetVersionDeferral methods ***/
    HRESULT (STDMETHODCALLTYPE *Complete)(
        ISetVersionDeferral* This);

    END_INTERFACE
} ISetVersionDeferralVtbl;
interface ISetVersionDeferral {
    CONST_VTBL ISetVersionDeferralVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISetVersionDeferral_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISetVersionDeferral_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISetVersionDeferral_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define ISetVersionDeferral_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define ISetVersionDeferral_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define ISetVersionDeferral_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISetVersionDeferral methods ***/
#define ISetVersionDeferral_Complete(This) (This)->lpVtbl->Complete(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISetVersionDeferral_QueryInterface(ISetVersionDeferral* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISetVersionDeferral_AddRef(ISetVersionDeferral* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISetVersionDeferral_Release(ISetVersionDeferral* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT ISetVersionDeferral_GetIids(ISetVersionDeferral* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT ISetVersionDeferral_GetRuntimeClassName(ISetVersionDeferral* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT ISetVersionDeferral_GetTrustLevel(ISetVersionDeferral* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISetVersionDeferral methods ***/
static FORCEINLINE HRESULT ISetVersionDeferral_Complete(ISetVersionDeferral* This) {
    return This->lpVtbl->Complete(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISetVersionDeferral_Complete_Proxy(
    ISetVersionDeferral* This);
void __RPC_STUB ISetVersionDeferral_Complete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISetVersionDeferral_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_storage_h__ */
