/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error This stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __iwamreg_h__
#define __iwamreg_h__

#ifndef __IWamAdmin_FWD_DEFINED__
#define __IWamAdmin_FWD_DEFINED__
typedef struct IWamAdmin IWamAdmin;
#endif

#ifndef __IWamAdmin2_FWD_DEFINED__
#define __IWamAdmin2_FWD_DEFINED__
typedef struct IWamAdmin2 IWamAdmin2;
#endif

#ifndef __IIISApplicationAdmin_FWD_DEFINED__
#define __IIISApplicationAdmin_FWD_DEFINED__
typedef struct IIISApplicationAdmin IIISApplicationAdmin;
#endif

#ifndef __WamAdmin_FWD_DEFINED__
#define __WamAdmin_FWD_DEFINED__
#ifdef __cplusplus
typedef class WamAdmin WamAdmin;
#else
typedef struct WamAdmin WamAdmin;
#endif
#endif

#include "oaidl.h"
#include "ocidl.h"
#ifdef __cplusplus
extern "C"{
#endif

#ifndef __MIDL_user_allocate_free_DEFINED__
#define __MIDL_user_allocate_free_DEFINED__
  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);
#endif

#ifndef __WAMREG_IADM__IID
#define __WAMREG_IADM__IID
  DEFINE_GUID(IID_IWamAdmin,0x29822AB7,0xF302,0x11D0,0x99,0x53,0x00,0xC0,0x4F,0xD9,0x19,0xC1);
  DEFINE_GUID(IID_IWamAdmin2,0x29822AB8,0xF302,0x11D0,0x99,0x53,0x00,0xC0,0x4F,0xD9,0x19,0xC1);
  DEFINE_GUID(IID_IIISApplicationAdmin,0x7C4E1804,0xE342,0x483D,0xA4,0x3E,0xA8,0x50,0xCF,0xCC,0x8D,0x18);
  DEFINE_GUID(LIBID_WAMREGLib,0x29822AA8,0xF302,0x11D0,0x99,0x53,0x00,0xC0,0x4F,0xD9,0x19,0xC1);
  DEFINE_GUID(CLSID_WamAdmin,0x61738644,0xF196,0x11D0,0x99,0x53,0x00,0xC0,0x4F,0xD9,0x19,0xC1);
#endif

#define APPSTATUS_STOPPED 0
#define APPSTATUS_RUNNING 1
#define APPSTATUS_NOTDEFINED 2

  typedef enum __MIDL___MIDL_itf_wamreg_0000_0001 {
    eAppRunInProc = 0,eAppRunOutProcIsolated = eAppRunInProc + 1,eAppRunOutProcInDefaultPool = eAppRunOutProcIsolated + 1
  } EAppMode;

  extern RPC_IF_HANDLE __MIDL_itf_wamreg_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_wamreg_0000_v0_0_s_ifspec;

#ifndef __IWamAdmin_INTERFACE_DEFINED__
#define __IWamAdmin_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IWamAdmin;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IWamAdmin : public IUnknown {
  public:
    virtual HRESULT WINAPI AppCreate(LPCWSTR szMDPath,WINBOOL fInProc) = 0;
    virtual HRESULT WINAPI AppDelete(LPCWSTR szMDPath,WINBOOL fRecursive) = 0;
    virtual HRESULT WINAPI AppUnLoad(LPCWSTR szMDPath,WINBOOL fRecursive) = 0;
    virtual HRESULT WINAPI AppGetStatus(LPCWSTR szMDPath,DWORD *pdwAppStatus) = 0;
    virtual HRESULT WINAPI AppDeleteRecoverable(LPCWSTR szMDPath,WINBOOL fRecursive) = 0;
    virtual HRESULT WINAPI AppRecover(LPCWSTR szMDPath,WINBOOL fRecursive) = 0;
  };
#else
  typedef struct IWamAdminVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IWamAdmin *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IWamAdmin *This);
      ULONG (WINAPI *Release)(IWamAdmin *This);
      HRESULT (WINAPI *AppCreate)(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fInProc);
      HRESULT (WINAPI *AppDelete)(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
      HRESULT (WINAPI *AppUnLoad)(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
      HRESULT (WINAPI *AppGetStatus)(IWamAdmin *This,LPCWSTR szMDPath,DWORD *pdwAppStatus);
      HRESULT (WINAPI *AppDeleteRecoverable)(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
      HRESULT (WINAPI *AppRecover)(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
    END_INTERFACE
  } IWamAdminVtbl;
  struct IWamAdmin {
    CONST_VTBL struct IWamAdminVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IWamAdmin_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWamAdmin_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWamAdmin_Release(This) (This)->lpVtbl->Release(This)
#define IWamAdmin_AppCreate(This,szMDPath,fInProc) (This)->lpVtbl->AppCreate(This,szMDPath,fInProc)
#define IWamAdmin_AppDelete(This,szMDPath,fRecursive) (This)->lpVtbl->AppDelete(This,szMDPath,fRecursive)
#define IWamAdmin_AppUnLoad(This,szMDPath,fRecursive) (This)->lpVtbl->AppUnLoad(This,szMDPath,fRecursive)
#define IWamAdmin_AppGetStatus(This,szMDPath,pdwAppStatus) (This)->lpVtbl->AppGetStatus(This,szMDPath,pdwAppStatus)
#define IWamAdmin_AppDeleteRecoverable(This,szMDPath,fRecursive) (This)->lpVtbl->AppDeleteRecoverable(This,szMDPath,fRecursive)
#define IWamAdmin_AppRecover(This,szMDPath,fRecursive) (This)->lpVtbl->AppRecover(This,szMDPath,fRecursive)
#endif
#endif
  HRESULT WINAPI IWamAdmin_AppCreate_Proxy(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fInProc);
  void __RPC_STUB IWamAdmin_AppCreate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IWamAdmin_AppDelete_Proxy(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
  void __RPC_STUB IWamAdmin_AppDelete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IWamAdmin_AppUnLoad_Proxy(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
  void __RPC_STUB IWamAdmin_AppUnLoad_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IWamAdmin_AppGetStatus_Proxy(IWamAdmin *This,LPCWSTR szMDPath,DWORD *pdwAppStatus);
  void __RPC_STUB IWamAdmin_AppGetStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IWamAdmin_AppDeleteRecoverable_Proxy(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
  void __RPC_STUB IWamAdmin_AppDeleteRecoverable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IWamAdmin_AppRecover_Proxy(IWamAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
  void __RPC_STUB IWamAdmin_AppRecover_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IWamAdmin2_INTERFACE_DEFINED__
#define __IWamAdmin2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IWamAdmin2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IWamAdmin2 : public IWamAdmin {
  public:
    virtual HRESULT WINAPI AppCreate2(LPCWSTR szMDPath,DWORD dwAppMode) = 0;
  };
#else
  typedef struct IWamAdmin2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IWamAdmin2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IWamAdmin2 *This);
      ULONG (WINAPI *Release)(IWamAdmin2 *This);
      HRESULT (WINAPI *AppCreate)(IWamAdmin2 *This,LPCWSTR szMDPath,WINBOOL fInProc);
      HRESULT (WINAPI *AppDelete)(IWamAdmin2 *This,LPCWSTR szMDPath,WINBOOL fRecursive);
      HRESULT (WINAPI *AppUnLoad)(IWamAdmin2 *This,LPCWSTR szMDPath,WINBOOL fRecursive);
      HRESULT (WINAPI *AppGetStatus)(IWamAdmin2 *This,LPCWSTR szMDPath,DWORD *pdwAppStatus);
      HRESULT (WINAPI *AppDeleteRecoverable)(IWamAdmin2 *This,LPCWSTR szMDPath,WINBOOL fRecursive);
      HRESULT (WINAPI *AppRecover)(IWamAdmin2 *This,LPCWSTR szMDPath,WINBOOL fRecursive);
      HRESULT (WINAPI *AppCreate2)(IWamAdmin2 *This,LPCWSTR szMDPath,DWORD dwAppMode);
    END_INTERFACE
  } IWamAdmin2Vtbl;
  struct IWamAdmin2 {
    CONST_VTBL struct IWamAdmin2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IWamAdmin2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWamAdmin2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWamAdmin2_Release(This) (This)->lpVtbl->Release(This)
#define IWamAdmin2_AppCreate(This,szMDPath,fInProc) (This)->lpVtbl->AppCreate(This,szMDPath,fInProc)
#define IWamAdmin2_AppDelete(This,szMDPath,fRecursive) (This)->lpVtbl->AppDelete(This,szMDPath,fRecursive)
#define IWamAdmin2_AppUnLoad(This,szMDPath,fRecursive) (This)->lpVtbl->AppUnLoad(This,szMDPath,fRecursive)
#define IWamAdmin2_AppGetStatus(This,szMDPath,pdwAppStatus) (This)->lpVtbl->AppGetStatus(This,szMDPath,pdwAppStatus)
#define IWamAdmin2_AppDeleteRecoverable(This,szMDPath,fRecursive) (This)->lpVtbl->AppDeleteRecoverable(This,szMDPath,fRecursive)
#define IWamAdmin2_AppRecover(This,szMDPath,fRecursive) (This)->lpVtbl->AppRecover(This,szMDPath,fRecursive)
#define IWamAdmin2_AppCreate2(This,szMDPath,dwAppMode) (This)->lpVtbl->AppCreate2(This,szMDPath,dwAppMode)
#endif
#endif
  HRESULT WINAPI IWamAdmin2_AppCreate2_Proxy(IWamAdmin2 *This,LPCWSTR szMDPath,DWORD dwAppMode);
  void __RPC_STUB IWamAdmin2_AppCreate2_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IIISApplicationAdmin_INTERFACE_DEFINED__
#define __IIISApplicationAdmin_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IIISApplicationAdmin;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IIISApplicationAdmin : public IUnknown {
  public:
    virtual HRESULT WINAPI CreateApplication(LPCWSTR szMDPath,DWORD dwAppMode,LPCWSTR szAppPoolId,WINBOOL fCreatePool) = 0;
    virtual HRESULT WINAPI DeleteApplication(LPCWSTR szMDPath,WINBOOL fRecursive) = 0;
    virtual HRESULT WINAPI CreateApplicationPool(LPCWSTR szPool) = 0;
    virtual HRESULT WINAPI DeleteApplicationPool(LPCWSTR szPool) = 0;
    virtual HRESULT WINAPI EnumerateApplicationsInPool(LPCWSTR szPool,BSTR *bstrBuffer) = 0;
    virtual HRESULT WINAPI RecycleApplicationPool(LPCWSTR szPool) = 0;
    virtual HRESULT WINAPI GetProcessMode(DWORD *pdwMode) = 0;
  };
#else
  typedef struct IIISApplicationAdminVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IIISApplicationAdmin *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IIISApplicationAdmin *This);
      ULONG (WINAPI *Release)(IIISApplicationAdmin *This);
      HRESULT (WINAPI *CreateApplication)(IIISApplicationAdmin *This,LPCWSTR szMDPath,DWORD dwAppMode,LPCWSTR szAppPoolId,WINBOOL fCreatePool);
      HRESULT (WINAPI *DeleteApplication)(IIISApplicationAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
      HRESULT (WINAPI *CreateApplicationPool)(IIISApplicationAdmin *This,LPCWSTR szPool);
      HRESULT (WINAPI *DeleteApplicationPool)(IIISApplicationAdmin *This,LPCWSTR szPool);
      HRESULT (WINAPI *EnumerateApplicationsInPool)(IIISApplicationAdmin *This,LPCWSTR szPool,BSTR *bstrBuffer);
      HRESULT (WINAPI *RecycleApplicationPool)(IIISApplicationAdmin *This,LPCWSTR szPool);
      HRESULT (WINAPI *GetProcessMode)(IIISApplicationAdmin *This,DWORD *pdwMode);
    END_INTERFACE
  } IIISApplicationAdminVtbl;
  struct IIISApplicationAdmin {
    CONST_VTBL struct IIISApplicationAdminVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IIISApplicationAdmin_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IIISApplicationAdmin_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IIISApplicationAdmin_Release(This) (This)->lpVtbl->Release(This)
#define IIISApplicationAdmin_CreateApplication(This,szMDPath,dwAppMode,szAppPoolId,fCreatePool) (This)->lpVtbl->CreateApplication(This,szMDPath,dwAppMode,szAppPoolId,fCreatePool)
#define IIISApplicationAdmin_DeleteApplication(This,szMDPath,fRecursive) (This)->lpVtbl->DeleteApplication(This,szMDPath,fRecursive)
#define IIISApplicationAdmin_CreateApplicationPool(This,szPool) (This)->lpVtbl->CreateApplicationPool(This,szPool)
#define IIISApplicationAdmin_DeleteApplicationPool(This,szPool) (This)->lpVtbl->DeleteApplicationPool(This,szPool)
#define IIISApplicationAdmin_EnumerateApplicationsInPool(This,szPool,bstrBuffer) (This)->lpVtbl->EnumerateApplicationsInPool(This,szPool,bstrBuffer)
#define IIISApplicationAdmin_RecycleApplicationPool(This,szPool) (This)->lpVtbl->RecycleApplicationPool(This,szPool)
#define IIISApplicationAdmin_GetProcessMode(This,pdwMode) (This)->lpVtbl->GetProcessMode(This,pdwMode)
#endif
#endif
  HRESULT WINAPI IIISApplicationAdmin_CreateApplication_Proxy(IIISApplicationAdmin *This,LPCWSTR szMDPath,DWORD dwAppMode,LPCWSTR szAppPoolId,WINBOOL fCreatePool);
  void __RPC_STUB IIISApplicationAdmin_CreateApplication_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IIISApplicationAdmin_DeleteApplication_Proxy(IIISApplicationAdmin *This,LPCWSTR szMDPath,WINBOOL fRecursive);
  void __RPC_STUB IIISApplicationAdmin_DeleteApplication_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IIISApplicationAdmin_CreateApplicationPool_Proxy(IIISApplicationAdmin *This,LPCWSTR szPool);
  void __RPC_STUB IIISApplicationAdmin_CreateApplicationPool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IIISApplicationAdmin_DeleteApplicationPool_Proxy(IIISApplicationAdmin *This,LPCWSTR szPool);
  void __RPC_STUB IIISApplicationAdmin_DeleteApplicationPool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IIISApplicationAdmin_EnumerateApplicationsInPool_Proxy(IIISApplicationAdmin *This,LPCWSTR szPool,BSTR *bstrBuffer);
  void __RPC_STUB IIISApplicationAdmin_EnumerateApplicationsInPool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IIISApplicationAdmin_RecycleApplicationPool_Proxy(IIISApplicationAdmin *This,LPCWSTR szPool);
  void __RPC_STUB IIISApplicationAdmin_RecycleApplicationPool_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IIISApplicationAdmin_GetProcessMode_Proxy(IIISApplicationAdmin *This,DWORD *pdwMode);
  void __RPC_STUB IIISApplicationAdmin_GetProcessMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __WAMREGLib_LIBRARY_DEFINED__
#define __WAMREGLib_LIBRARY_DEFINED__
  EXTERN_C const IID LIBID_WAMREGLib;
  EXTERN_C const CLSID CLSID_WamAdmin;
#ifdef __cplusplus
  class WamAdmin;
#endif
#endif

  unsigned long __RPC_API BSTR_UserSize(unsigned long *,unsigned long,BSTR *);
  unsigned char *__RPC_API BSTR_UserMarshal(unsigned long *,unsigned char *,BSTR *);
  unsigned char *__RPC_API BSTR_UserUnmarshal(unsigned long *,unsigned char *,BSTR *);
  void __RPC_API BSTR_UserFree(unsigned long *,BSTR *);

#ifdef __cplusplus
}
#endif
#endif
