#ifndef _REGIDL_
#define _REGIDL_

import "objidl.idl";
import "oleidl.idl";

interface IRegistryW;
interface IRegistryA;

//+---------------------------------------------------------------------------
//
//  Copyright (C) Microsoft Corporation, 1995 - 1996.
//
//  Contents:   IRegistry interface definition
//
//  Description:
//
//----------------------------------------------------------------------------
cpp_quote("#ifndef _LPREGISTRY_DEFINED")
cpp_quote("#define _LPREGISTRY_DEFINED")

[
        local,
        object,
        uuid(c733e4b0-576e-11d0-b28c-00c04fd7cd22),
        pointer_default(unique)
]

interface IRegistryW : IUnknown
{
    typedef [unique] IRegistryW *LPREGISTRYW;

    typedef DWORD ACCESS_MASK;
    typedef ACCESS_MASK REGSAM;
    //typedef DWORD HKEY;
    typedef HKEY *PHKEY;
    typedef BYTE *LPBYTE;
    typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
    typedef PVOID PSECURITY_DESCRIPTOR;

    typedef struct value_entXW {
        LPWSTR  ve_valuename;
        DWORD ve_valuelen;
        DWORD ve_valueptr;
        DWORD ve_type;
    } VALENTXW, *PVALENTXW;

    // can this method be supported
    LONG ConnectRegistry (
        [in]  LPWSTR lpMachineName,
        [in]  HKEY hKey,
        [out] IRegistryW **ppReg
        );

    LONG CloseKey (
        [in]  HKEY hKey
        );

    LONG CreateKey (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpSubKey,
        [out] PHKEY phkResult
        );

    LONG CreateKeyEx (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpSubKey,
        [in]  DWORD Reserved,
        [in]  LPWSTR lpClass,
        [in]  DWORD dwOptions,
        [in]  REGSAM samDesired,
        [in]  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        [out] PHKEY phkResult,
        [out] LPDWORD lpdwDisposition
        );

    LONG DeleteKey (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpSubKey
        );

    LONG DeleteValue (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpValueName
        );

    LONG EnumKey (
        [in]  HKEY hKey,
        [in]  DWORD dwIndex,
        [in]  LPWSTR lpName,
        [in]  DWORD cbName
        );

    LONG EnumKeyEx (
        [in]  HKEY hKey,
        [in]  DWORD dwIndex,
        [in]  LPWSTR lpName,
        [out] LPDWORD lpcbName,
        [out] LPDWORD lpReserved,
        [in]  LPWSTR lpClass,
        [out] LPDWORD lpcbClass,
        [out] PFILETIME lpftLastWriteTime
        );

    LONG EnumValue (
        [in]  HKEY hKey,
        [in]  DWORD dwIndex,
        [in]  LPWSTR lpValueName,
        [out] LPDWORD lpcbValueName,
        [out] LPDWORD lpReserved,
        [out] LPDWORD lpType,
        [out] LPBYTE lpData,
        [in,out] LPDWORD lpcbData
        );

    LONG FlushKey (
        HKEY hKey
        );

    LONG GetKeySecurity (
        [in]  HKEY hKey,
        [in]  SECURITY_INFORMATION SecurityInformation,
        [out] PSECURITY_DESCRIPTOR pSecurityDescriptor,
        [in, out] LPDWORD lpcbSecurityDescriptor
        );

    LONG LoadKey (
        [in]  HKEY  hKey,
        [in]  LPCWSTR  lpSubKey,
        [in]  LPCWSTR  lpFile
        );

    LONG NotifyChangeKeyValue (
        [in]  HKEY hKey,
        [in]  BOOL bWatchSubtree,
        [in]  DWORD dwNotifyFilter,
        [in]  HANDLE hEvent,
        [in]  BOOL fAsynchronus
        );

    LONG OpenKey (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpSubKey,
        [out] PHKEY phkResult
        );

    LONG OpenKeyEx (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpSubKey,
        [in]  DWORD ulOptions,
        [in]  REGSAM samDesired,
        [out] PHKEY phkResult
        );

    LONG QueryInfoKey (
        [in]  HKEY    hKey,
        [in]  LPWSTR  lpClass,
        [out] LPDWORD lpcbClass,
        [out] LPDWORD lpReserved,
        [out] LPDWORD lpcSubKeys,
        [out] LPDWORD lpcbMaxSubKeyLen,
        [out] LPDWORD lpcbMaxClassLen,
        [out] LPDWORD lpcValues,
        [out] LPDWORD lpcbMaxValueNameLen,
        [out] LPDWORD lpcbMaxValueLen,
        [out] LPDWORD lpcbSecurityDescriptor,
        [out] PFILETIME lpftLastWriteTime
        );

    LONG QueryValue (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpSubKey,
        [in]  LPWSTR lpValue,
        [in, out] LONG   *lpcbValue
        );

    LONG QueryMultipleValues (
        [in]  HKEY hKey,
        [in]  PVALENTXW val_list,
        [in]  DWORD num_vals,
        [in]  LPWSTR lpValueBuf,
        [in,out] LPDWORD ldwTotsize
        );

    LONG QueryValueEx (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpValueName,
        [out] LPDWORD lpReserved,
        [out] LPDWORD lpType,
        [in,out] LPBYTE lpData,
        [in,out] LPDWORD lpcbData
        );

    LONG ReplaceKey (
        [in]  HKEY     hKey,
        [in]  LPCWSTR  lpSubKey,
        [in]  LPCWSTR  lpNewFile,
        [in]  LPCWSTR  lpOldFile
        );

    LONG RestoreKey (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpFile,
        [in]  DWORD   dwFlags
        );

    LONG SaveKey (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpFile,
        [out] LPSECURITY_ATTRIBUTES lpSecurityAttributes
        );

    LONG SetKeySecurity (
        [in]  HKEY hKey,
        [in]  SECURITY_INFORMATION SecurityInformation,
        [out] PSECURITY_DESCRIPTOR pSecurityDescriptor
        );

    LONG SetValue (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpSubKey,
        [in]  DWORD dwType,
        [in]  LPCWSTR lpData,
        [in]  DWORD cbData
        );

    LONG SetValueEx (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpValueName,
        [in]  DWORD Reserved,
        [in]  DWORD dwType,
        [in]  const BYTE* lpData,
        [in]  DWORD cbData
        );

    LONG UnLoadKey (
        [in]  HKEY hKey,
        [in]  LPCWSTR lpSubKey
        );

}


[
        local,
        object,
        uuid(c733e4b1-576e-11d0-b28c-00c04fd7cd22),
        pointer_default(unique)
]

interface IRegistryA : IUnknown
{
    typedef [unique] IRegistryA *LPREGISTRYA;

    typedef struct value_entXA {
        LPSTR  ve_valuename;
        DWORD ve_valuelen;
        DWORD ve_valueptr;
        DWORD ve_type;
    } VALENTXA, *PVALENTXA;

    // can this method be supported
    LONG ConnectRegistry (
        [in]  LPSTR lpMachineName,
        [in]  HKEY hKey,
        [out] IRegistryA **ppReg
        );

    LONG CloseKey (
        [in]  HKEY hKey
        );

    LONG CreateKey (
        [in]  HKEY hKey,
        [in]  LPCSTR lpSubKey,
        [out] PHKEY phkResult
        );

    LONG CreateKeyEx (
        [in]  HKEY hKey,
        [in]  LPCSTR lpSubKey,
        [in]  DWORD Reserved,
        [in]  LPSTR lpClass,
        [in]  DWORD dwOptions,
        [in]  REGSAM samDesired,
        [in]  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        [out] PHKEY phkResult,
        [out] LPDWORD lpdwDisposition
        );

    LONG DeleteKey (
        [in]  HKEY hKey,
        [in]  LPCSTR lpSubKey
        );

    LONG DeleteValue (
        [in]  HKEY hKey,
        [in]  LPCSTR lpValueName
        );

    LONG EnumKey (
        [in]  HKEY hKey,
        [in]  DWORD dwIndex,
        [in]  LPSTR lpName,
        [in]  DWORD cbName
        );

    LONG EnumKeyEx (
        [in]  HKEY hKey,
        [in]  DWORD dwIndex,
        [in]  LPSTR lpName,
        [out] LPDWORD lpcbName,
        [out] LPDWORD lpReserved,
        [in]  LPSTR lpClass,
        [out] LPDWORD lpcbClass,
        [out] PFILETIME lpftLastWriteTime
        );

    LONG EnumValue (
        [in]  HKEY hKey,
        [in]  DWORD dwIndex,
        [in]  LPSTR lpValueName,
        [out] LPDWORD lpcbValueName,
        [out] LPDWORD lpReserved,
        [out] LPDWORD lpType,
        [out] LPBYTE lpData,
        [in,out] LPDWORD lpcbData
        );

    LONG FlushKey (
        HKEY hKey
        );

    LONG GetKeySecurity (
        [in]  HKEY hKey,
        [in]  SECURITY_INFORMATION SecurityInformation,
        [out] PSECURITY_DESCRIPTOR pSecurityDescriptor,
        [in, out] LPDWORD lpcbSecurityDescriptor
        );

    LONG LoadKey (
        [in]  HKEY  hKey,
        [in]  LPCSTR  lpSubKey,
        [in]  LPCSTR  lpFile
        );

    LONG NotifyChangeKeyValue (
        [in]  HKEY hKey,
        [in]  BOOL bWatchSubtree,
        [in]  DWORD dwNotifyFilter,
        [in]  HANDLE hEvent,
        [in]  BOOL fAsynchronus
        );

    LONG OpenKey (
        [in]  HKEY hKey,
        [in]  LPCSTR lpSubKey,
        [out] PHKEY phkResult
        );

    LONG OpenKeyEx (
        [in]  HKEY hKey,
        [in]  LPCSTR lpSubKey,
        [in]  DWORD ulOptions,
        [in]  REGSAM samDesired,
        [out] PHKEY phkResult
        );

    LONG QueryInfoKey (
        [in]  HKEY    hKey,
        [in]  LPSTR  lpClass,
        [out] LPDWORD lpcbClass,
        [out] LPDWORD lpReserved,
        [out] LPDWORD lpcSubKeys,
        [out] LPDWORD lpcbMaxSubKeyLen,
        [out] LPDWORD lpcbMaxClassLen,
        [out] LPDWORD lpcValues,
        [out] LPDWORD lpcbMaxValueNameLen,
        [out] LPDWORD lpcbMaxValueLen,
        [out] LPDWORD lpcbSecurityDescriptor,
        [out] PFILETIME lpftLastWriteTime
        );

    LONG QueryValue (
        [in]  HKEY hKey,
        [in]  LPCSTR lpSubKey,
        [in]  LPSTR lpValue,
        [in, out] LONG   *lpcbValue
        );

    LONG QueryMultipleValues (
        [in]  HKEY hKey,
        [in]  PVALENTXA val_list,
        [in]  DWORD num_vals,
        [in]  LPSTR lpValueBuf,
        [in,out] LPDWORD ldwTotsize
        );

    LONG QueryValueEx (
        [in]  HKEY hKey,
        [in]  LPCSTR lpValueName,
        [out] LPDWORD lpReserved,
        [out] LPDWORD lpType,
        [in,out] LPBYTE lpData,
        [in,out] LPDWORD lpcbData
        );

    LONG ReplaceKey (
        [in]  HKEY     hKey,
        [in]  LPCSTR  lpSubKey,
        [in]  LPCSTR  lpNewFile,
        [in]  LPCSTR  lpOldFile
        );

    LONG RestoreKey (
        [in]  HKEY hKey,
        [in]  LPCSTR lpFile,
        [in]  DWORD   dwFlags
        );

    LONG SaveKey (
        [in]  HKEY hKey,
        [in]  LPCSTR lpFile,
        [out] LPSECURITY_ATTRIBUTES lpSecurityAttributes
        );

    LONG SetKeySecurity (
        [in]  HKEY hKey,
        [in]  SECURITY_INFORMATION SecurityInformation,
        [out] PSECURITY_DESCRIPTOR pSecurityDescriptor
        );

    LONG SetValue (
        [in]  HKEY hKey,
        [in]  LPCSTR lpSubKey,
        [in]  DWORD dwType,
        [in]  LPCSTR lpData,
        [in]  DWORD cbData
        );

    LONG SetValueEx (
        [in]  HKEY hKey,
        [in]  LPCSTR lpValueName,
        [in]  DWORD Reserved,
        [in]  DWORD dwType,
        [in]  const BYTE* lpData,
        [in]  DWORD cbData
        );

    LONG UnLoadKey (
        [in]  HKEY hKey,
        [in]  LPCSTR lpSubKey
        );

}


cpp_quote("#endif")


#endif // _REGIDL_
