cpp_quote("/**")
cpp_quote(" * This file is part of the mingw-w64 runtime package.")
cpp_quote(" * No warranty is given; refer to the file DISCLAIMER within this package.")
cpp_quote(" */")
cpp_quote("")

import "objidl.idl";
import "oleidl.idl";
import "oaidl.idl";
import "wbemcli.idl";

cpp_quote("#include <winapifamily.h>")
cpp_quote("")
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")

interface IWbemTransport;
interface IWbemLevel1Login;
interface IWbemConnectorLogin;
interface IWbemAddressResolution;
interface IWbemClientTransport;
interface IWbemClientConnectionTransport;

typedef enum tag_WBEM_LOGIN_TYPE {
  WBEM_FLAG_INPROC_LOGIN = 0,
  WBEM_FLAG_LOCAL_LOGIN = 1,
  WBEM_FLAG_REMOTE_LOGIN = 2,
  WBEM_AUTHENTICATION_METHOD_MASK = 0xf,
  WBEM_FLAG_USE_MULTIPLE_CHALLENGES = 0x10
} WBEM_LOGIN_TYPE;

typedef /*[size_is (16), length_is (16)]*/ BYTE *WBEM_128BITS;

[uuid (027947f3-d731-11ce-a357-000000000001)]
library WbemTransports_v1 {
  [uuid (8bc3f05e-d86b-11d0-a075-00c04fb68820)] /* restricted */
  coclass WbemLevel1Login {
    interface IWbemLevel1Login;
    interface IWbemConnectorLogin;
  };

  [uuid (a1044801-8f7e-11d1-9e7c-00c04fc324a8)] /* restricted */
  coclass WbemLocalAddrRes {
    interface IWbemAddressResolution;
  };

  [uuid (7a0227f6-7108-11d1-ad90-00c04fd8fdff)] /* restricted */
  coclass WbemUninitializedClassObject {
    interface IWbemClassObject;
    interface IWbemObjectAccess;
    interface IWbemConstructClassObject;
  };

  [uuid (f7ce2e13-8c90-11d1-9e7b-00c04fc324a8)] /* restricted */
  coclass WbemDCOMTransport {
    interface IWbemClientTransport;
    interface IWbemClientConnectionTransport;
  };
};

[object, restricted, uuid (f309ad18-d86a-11d0-a075-00c04fb68820), pointer_default (unique)]
interface IWbemLevel1Login : IUnknown {
  HRESULT EstablishPosition ([in, unique, string] LPWSTR wszLocaleList,[in] DWORD dwNumLocales,[out] DWORD *reserved);
  HRESULT RequestChallenge ([in, unique, string] LPWSTR wszNetworkResource,[in, unique, string] LPWSTR wszUser,[out] WBEM_128BITS Nonce);
  HRESULT WBEMLogin ([in, unique, string] LPWSTR wszPreferredLocale,[in, unique] WBEM_128BITS AccessToken,[in] long lFlags,[in] IWbemContext *pCtx,[out] IWbemServices **ppNamespace);
  HRESULT NTLMLogin ([in, unique, string] LPWSTR wszNetworkResource,[in, unique, string] LPWSTR wszPreferredLocale,[in] long lFlags,[in] IWbemContext *pCtx,[out] IWbemServices **ppNamespace);
};

[object, restricted, uuid (d8ec9cb1-b135-4f10-8b1b-c7188bb0d186), pointer_default (unique)]
interface IWbemConnectorLogin : IUnknown {
  HRESULT ConnectorLogin ([in, unique, string] LPWSTR wszNetworkResource,[in, unique, string] LPWSTR wszPreferredLocale,[in] long lFlags,[in] IWbemContext *pCtx,[in] REFIID riid,[out, iid_is (riid)] void **pInterface);
};

[object, local, uuid (F7CE2E12-8c90-11d1-9e7b-00c04fc324a8), restricted, pointer_default (unique)]
interface IWbemAddressResolution : IUnknown {
  HRESULT Resolve ([in] LPWSTR wszNamespacePath,[out] LPWSTR wszAddressType,[out] DWORD *pdwAddressLength,[out, size_is (,*pdwAddressLength)] BYTE **pabBinaryAddress);
};

[local, object, restricted, uuid (553fe584-2156-11d0-b6ae-00aa003240c7)]
interface IWbemTransport : IUnknown {
  HRESULT Initialize ();
}
[local, object, restricted, uuid (9ef76194-70d5-11d1-ad90-00c04fd8fdff)]
interface IWbemConstructClassObject : IUnknown {
  HRESULT SetInheritanceChain ([in] long lNumAntecedents,[in, size_is (lNumAntecedents), string] LPWSTR *awszAntecedents);
  HRESULT SetPropertyOrigin ([in, string] LPCWSTR wszPropertyName,[in] long lOriginIndex);
  HRESULT SetMethodOrigin ([in, string] LPCWSTR wszMethodName,[in] long lOriginIndex);
  HRESULT SetServerNamespace ([in, string] LPCWSTR wszServer,[in, string] LPCWSTR wszNamespace);
};

[object, local, restricted, uuid (f7ce2e11-8c90-11d1-9e7b-00c04fc324a8), pointer_default (unique)]
interface IWbemClientTransport : IUnknown {
  HRESULT ConnectServer ([in] BSTR strAddressType,[in] DWORD dwBinaryAddressLength,[in, size_is (dwBinaryAddressLength)] BYTE *abBinaryAddress,[in] BSTR strNetworkResource,[in] BSTR strUser,[in] BSTR strPassword,[in] BSTR strLocale,[in] long lSecurityFlags,[in] BSTR strAuthority,[in] IWbemContext *pCtx,[out] IWbemServices **ppNamespace);
};

[object, local, restricted, uuid (a889c72a-fcc1-4a9e-af61-ed071333fb5b), pointer_default (unique)]
interface IWbemClientConnectionTransport : IUnknown {
  HRESULT Open ([in] BSTR strAddressType,[in] DWORD dwBinaryAddressLength,[in, size_is (dwBinaryAddressLength)] BYTE *abBinaryAddress,[in] const BSTR strObject,[in] const BSTR strUser,[in] const BSTR strPassword,[in] const BSTR strLocale,[in] long lFlags,[in] IWbemContext *pCtx,[in] REFIID riid,[out, iid_is (riid)] void **pInterface,[out] IWbemCallResult **pCallRes);
  HRESULT OpenAsync ([in] BSTR strAddressType,[in] DWORD dwBinaryAddressLength,[in, size_is (dwBinaryAddressLength)] BYTE *abBinaryAddress,[in] const BSTR strObject,[in] const BSTR strUser,[in] const BSTR strPassword,[in] const BSTR strLocale,[in] long lFlags,[in] IWbemContext *pCtx,[in] REFIID riid,[in] IWbemObjectSink *pResponseHandler);
  HRESULT Cancel ([in] long lFlags,[in] IWbemObjectSink *pHandler);
};

cpp_quote("#endif")
