/*++

Copyright(c) 1992  Microsoft Corporation

Module Name:

    Regrpc.idl

Abstract:

    This module contains the MIDL definitions for the Win32 Registry
    service.

Author:

    David J. Gilman (davegi) 27-Jan-1992

--*/

//
// Interface Attributes
//

[
    uuid( 338CD001-2244-31F1-AAAA-900038001003 ),
    pointer_default( unique ),
#ifdef __midl
        ms_union,
#endif // __midl
    version( 1.0 )
]

//
// Interface Keyword
//

interface winreg

//
// Interface Body
//

{		// Start of interface definition

import "imports.idl";


//
// Context handle for registry keys.
//

typedef [context_handle] HKEY RPC_HKEY;
typedef RPC_HKEY *PRPC_HKEY;

//
// Server name, binding handles.
//

typedef [handle] PWCHAR PREGISTRY_SERVER_NAME;

//
// RPCable security structures (see winbase.h).
//

typedef struct _RPC_SECURITY_DESCRIPTOR {
    [ size_is( cbInSecurityDescriptor ), length_is( cbOutSecurityDescriptor ) ] PBYTE lpSecurityDescriptor;
    DWORD cbInSecurityDescriptor;
    DWORD cbOutSecurityDescriptor;
} RPC_SECURITY_DESCRIPTOR, *PRPC_SECURITY_DESCRIPTOR;


typedef struct _RPC_SECURITY_ATTRIBUTES {
    DWORD nLength;
    RPC_SECURITY_DESCRIPTOR RpcSecurityDescriptor;
    BOOLEAN bInheritHandle;
} RPC_SECURITY_ATTRIBUTES, *PRPC_SECURITY_ATTRIBUTES;

//
// Local function prototypes.
//

[local]
LONG
ClosePredefinedHandle(
    [ in ] RPC_HKEY Handle
    );

[local]
BOOL
CleanupPredefinedHandles(
    );

[local]
BOOL
InitializeWinreg(
    );

[local]
RPC_HKEY
MapPredefinedHandle(
    [ in ] RPC_HKEY Handle,
    [ out ] PRPC_HKEY phToClose
    );

[local]
LONG
RemapPredefinedHandle(
    [in] RPC_HKEY     Handle,
    [in] RPC_HKEY     NewHandle
    );

[local]
LONG
MapSAToRpcSA(
    [ in ] LPSECURITY_ATTRIBUTES lpSA,
    [ out ] PRPC_SECURITY_ATTRIBUTES pRpcSA
    );

[local]
LONG
MapSDToRpcSD(
    [ in ] PSECURITY_DESCRIPTOR lpSD,
    [ in, out ] PRPC_SECURITY_DESCRIPTOR pRpcSD
    );

[local]
LONG
OpenPredefinedKeyForSpecialAccess(
    [ in ] RPC_HKEY Handle,
    [ in ] REGSAM AccessMask,
    [ out ] PRPC_HKEY pKey
    );

//
// Perflib pseudo APIs. Signatures should mirror the real server
// (i.e.Base...) functions.
//

[local]
LONG
PerfRegCloseKey (
    [ in, out ] PRPC_HKEY hKey
    );

[local]
LONG
PerfRegEnumKey (
    [ in ] RPC_HKEY hKey,
    [ in ] DWORD dwIndex,
    [ in, out ] PUNICODE_STRING lpName,
    [ in, out, unique ] LPDWORD lpReserved,
    [ in, out, unique ] PUNICODE_STRING lpClass,
    [ in, out, unique ] PFILETIME lpftLastWriteTime
    );

[local]
LONG
PerfRegQueryInfoKey (
    [ in ] RPC_HKEY hKey,
    [ in, out ] PUNICODE_STRING lpClass,
    [ in, out, unique ] 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
    );

[local]
LONG
PerfRegQueryValue (
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpValueName,
    [ in, out, unique ] LPDWORD lpReserved,
    [ in, out, unique ] LPDWORD lpType,
    [ in, out, unique, size_is( lpcbData ? *lpcbData : 0 ), length_is ( lpcbLen ? *lpcbLen : 0 ) ] LPBYTE lpData,
    [ in, out, unique ] LPDWORD lpcbData,
    [ in, out, unique ] LPDWORD lpcbLen
    );

[local]
LONG
PerfRegSetValue (
    [ in ] RPC_HKEY hKey,
    [ in ] LPWSTR lpValueName,
    [ in ] DWORD Reserved,
    [ in ] DWORD dwType,
    [ in, size_is( cbData )] LPBYTE lpData,
    [ in ] DWORD cbData
    );

[local]
LONG
PerfRegEnumValue (
    [ in ] RPC_HKEY hKey,
    [ in ] DWORD dwIndex,
    [ in, out ] PUNICODE_STRING lpValueName,
    [ in, out, unique ] LPDWORD lpReserved,
    [ in, out, unique ] LPDWORD lpType,
    [ in, out, unique, size_is( lpcbData ? *lpcbData : 0 ), length_is ( lpcbLen ? *lpcbLen : 0 ) ] LPBYTE lpData,
    [ in, out, unique ] LPDWORD lpcbData,
    [ in, out, unique ] LPDWORD lpcbLen
    );

//
// RegNotifyChangeKeyValue support functions.
//

[local]
BOOL
MakeSemiUniqueName(
    [ out ] PUNICODE_STRING    Name,
    [ in ]  DWORD              Sequence
    );

[local]
BOOL
InitializeRegNotifyChangeKeyValue(
    );

[local]
BOOL
CleanDeadClientInfo(
    HKEY    hKey
    );

[local]
BOOL
CleanupRegNotifyChangeKeyValue(
    );

//
//******
//
// Local versions of server functions. Make sure these stay in synch
// with the remote (ssrver) versions below.
//
//******
//

//
// RPC stubs for opening predefined handles.
//

[local]
error_status_t
LocalOpenClassesRoot(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

[local]
error_status_t
LocalOpenCurrentUser(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

[local]
error_status_t
LocalOpenLocalMachine(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

[local]
error_status_t
LocalOpenUsers(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

[local]
error_status_t
LocalOpenPerformanceData(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

[local]
error_status_t
LocalOpenCurrentConfig(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

[local]
error_status_t
LocalOpenDynData(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

//
// API (server) function prototypes.
//

[local]
error_status_t
LocalBaseRegCloseKey(
    [ in, out ] PRPC_HKEY hKey
    );

[local]
error_status_t
LocalBaseRegCreateKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpSubKey,
    [ in ] PUNICODE_STRING lpClass,
    [ in ] DWORD dwOptions,
    [ in ] REGSAM samDesired,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES lpSecurityAttributes,
    [ out ] PRPC_HKEY phkResult,
    [ in, out, unique ] LPDWORD lpdwDisposition
    );

[local]
error_status_t
LocalBaseRegDeleteKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpSubKey
    );

[local]
error_status_t
LocalBaseRegDeleteValue(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpValueName
    );

[local]
error_status_t
LocalBaseRegEnumKey(
    [ in ] RPC_HKEY hKey,
    [ in ] DWORD dwIndex,
    [ in, out ] PUNICODE_STRING lpName,
    [ in, out, unique ] PUNICODE_STRING lpClass,
    [ in, out, unique ] PFILETIME lpftLastWriteTime
    );

[local]
error_status_t
LocalBaseRegEnumValue (
    [ in ] RPC_HKEY hKey,
    [ in ] DWORD dwIndex,
    [ in, out ] PUNICODE_STRING lpValueName,
    [ in, out, unique ] LPDWORD lpType,
    [ in, out, unique, size_is( lpcbData ? *lpcbData : 0 ), length_is ( lpcbLen ? *lpcbLen : 0 ) ] LPBYTE lpData,
    [ in, out, unique ] LPDWORD lpcbData,
    [ in, out, unique ] LPDWORD lpcbLen
    );

[local]
error_status_t
LocalBaseRegFlushKey(
    [ in ] RPC_HKEY hKey
    );

[local]
error_status_t
LocalBaseRegGetKeySecurity(
    [ in ] RPC_HKEY hKey,
    [ in ] SECURITY_INFORMATION SecurityInformation,
    [ in, out ] PRPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor
    );

[local]
error_status_t
LocalBaseRegLoadKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpSubKey,
    [ in ] PUNICODE_STRING lpFile
    );

[local]
error_status_t
LocalBaseRegNotifyChangeKeyValue(
    [ in ] RPC_HKEY         hKey,
    [ in ] BOOLEAN          bWatchSubtree,
    [ in ] DWORD            dwNotifyFilter,
    [ in ] DWORD            hEvent,
    [ in ] PUNICODE_STRING  MachineName,
    [ in ] PUNICODE_STRING  PipeName,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES pRpcSecurityAttributes
    );

[local]
error_status_t
LocalBaseRegOpenKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpSubKey,
    [ in ] DWORD dwOptions,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phkResult
    );

[local]
error_status_t
LocalBaseRegQueryInfoKey(
    [ in ] RPC_HKEY hKey,
    [ in, out ] PUNICODE_STRING lpClass,
    [ out ] LPDWORD lpcSubKeys,
    [ out ] LPDWORD lpcbMaxSubKeyLen,
    [ out ] LPDWORD lpcbMaxClassLen,
    [ out ] LPDWORD lpcValues,
    [ out ] LPDWORD lpcbMaxValueNameLen,
    [ out ] LPDWORD lpcbMaxValueLen,
    [ out ] LPDWORD lpcbSecurityDescriptor,
    [ out ] PFILETIME lpftLastWriteTime
    );

[local]
error_status_t
LocalBaseRegQueryValue(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpValueName,
    [ in, out, unique ] LPDWORD lpType,
    [ in, out, unique, size_is( lpcbData ? *lpcbData : 0 ), length_is ( lpcbLen ? *lpcbLen : 0 ) ] LPBYTE lpData,
    [ in, out, unique ] LPDWORD lpcbData,
    [ in, out, unique ] LPDWORD lpcbLen
    );

[local]
error_status_t
LocalBaseRegQueryMultipleValues(
    [ in ] RPC_HKEY hKey,
    [ in, out, size_is(num_vals), length_is(num_vals) ] PRVALENT val_list,
    [ in ] DWORD num_vals,
    [ in, out, unique, size_is(*ldwTotsize), length_is(*ldwTotsize) ] LPSTR lpvalueBuf,
    [ in, out, ref ] LPDWORD ldwTotsize
    );

[local]
error_status_t
LocalBaseRegReplaceKey(
    [ in ] RPC_HKEY  hKey,
    [ in ] PUNICODE_STRING lpSubKey,
    [ in ] PUNICODE_STRING lpNewFile,
    [ in ] PUNICODE_STRING lpOldFile
    );

[local]
error_status_t
LocalBaseRegRestoreKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpFile,
    [ in ] DWORD    Flags
    );

[local]
error_status_t
LocalBaseRegSaveKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpFile,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES pSecurityAttributes
    );

[local]
error_status_t
LocalBaseRegSetKeySecurity(
    [ in ] RPC_HKEY hKey,
    [ in ] SECURITY_INFORMATION SecurityInformation,
    [ in ] PRPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor
    );

[local]
error_status_t
LocalBaseRegSetValue(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpValueName,
    [ in ] DWORD dwType,
    [ in, size_is( cbData )] LPBYTE lpData,
    [ in ] DWORD cbData
    );

[local]
error_status_t
LocalBaseRegUnLoadKey(
    [ in ] RPC_HKEY  hKey,
    [ in ] PUNICODE_STRING lpSubKey
    );

//
//******
//
// Remote versions of server functions. Make sure these stay in synch
// with the local versions above.
//
//******
//

//
// RPC stubs for opening predefined handles.
//

error_status_t
OpenClassesRoot(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

error_status_t
OpenCurrentUser(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

error_status_t
OpenLocalMachine(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

error_status_t
OpenPerformanceData(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

error_status_t
OpenUsers(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

//
// API (server) function prototypes.
//

error_status_t
BaseRegCloseKey(
    [ in, out ] PRPC_HKEY hKey
    );

error_status_t
BaseRegCreateKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpSubKey,
    [ in ] PUNICODE_STRING lpClass,
    [ in ] DWORD dwOptions,
    [ in ] REGSAM samDesired,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES lpSecurityAttributes,
    [ out ] PRPC_HKEY phkResult,
    [ in, out, unique ] LPDWORD lpdwDisposition
    );

error_status_t
BaseRegDeleteKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpSubKey
    );

error_status_t
BaseRegDeleteValue(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpValueName
    );

error_status_t
BaseRegEnumKey(
    [ in ] RPC_HKEY hKey,
    [ in ] DWORD dwIndex,
    [ in, out ] PUNICODE_STRING lpName,
    [ in, out, unique ] PUNICODE_STRING lpClass,
    [ in, out, unique ] PFILETIME lpftLastWriteTime
    );

error_status_t
BaseRegEnumValue (
    [ in ] RPC_HKEY hKey,
    [ in ] DWORD dwIndex,
    [ in, out ] PUNICODE_STRING lpValueName,
    [ in, out, unique ] LPDWORD lpType,
    [ in, out, unique, size_is( lpcbData ? *lpcbData : 0 ), length_is ( lpcbLen ? *lpcbLen : 0 ) ] LPBYTE lpData,
    [ in, out, unique ] LPDWORD lpcbData,
    [ in, out, unique ] LPDWORD lpcbLen
    );

error_status_t
BaseRegFlushKey(
    [ in ] RPC_HKEY hKey
    );

error_status_t
BaseRegGetKeySecurity(
    [ in ] RPC_HKEY hKey,
    [ in ] SECURITY_INFORMATION SecurityInformation,
    [ in, out ] PRPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor
    );

error_status_t
BaseRegLoadKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpSubKey,
    [ in ] PUNICODE_STRING lpFile
    );

error_status_t
BaseRegNotifyChangeKeyValue(
    [ in ] RPC_HKEY         hKey,
    [ in ] BOOLEAN          bWatchSubtree,
    [ in ] DWORD            dwNotifyFilter,
    [ in ] DWORD            hEvent,
    [ in ] PUNICODE_STRING  MachineName,
    [ in ] PUNICODE_STRING  PipeName,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES pRpcSecurityAttributes
    );

error_status_t
BaseRegOpenKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpSubKey,
    [ in ] DWORD dwOptions,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phkResult
    );

error_status_t
BaseRegQueryInfoKey(
    [ in ] RPC_HKEY hKey,
    [ in, out ] PUNICODE_STRING lpClass,
    [ out ] LPDWORD lpcSubKeys,
    [ out ] LPDWORD lpcbMaxSubKeyLen,
    [ out ] LPDWORD lpcbMaxClassLen,
    [ out ] LPDWORD lpcValues,
    [ out ] LPDWORD lpcbMaxValueNameLen,
    [ out ] LPDWORD lpcbMaxValueLen,
    [ out ] LPDWORD lpcbSecurityDescriptor,
    [ out ] PFILETIME lpftLastWriteTime
    );

error_status_t
BaseRegQueryValue(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpValueName,
    [ in, out, unique ] LPDWORD lpType,
    [ in, out, unique, size_is( lpcbData ? *lpcbData : 0 ), length_is ( lpcbLen ? *lpcbLen : 0 ) ] LPBYTE lpData,
    [ in, out, unique ] LPDWORD lpcbData,
    [ in, out, unique ] LPDWORD lpcbLen
    );

error_status_t
BaseRegReplaceKey(
    [ in ] RPC_HKEY  hKey,
    [ in ] PUNICODE_STRING lpSubKey,
    [ in ] PUNICODE_STRING lpNewFile,
    [ in ] PUNICODE_STRING lpOldFile
    );

error_status_t
BaseRegRestoreKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpFile,
    [ in ] DWORD    Flags
    );

error_status_t
BaseRegSaveKey(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpFile,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES pSecurityAttributes
    );

error_status_t
BaseRegSetKeySecurity(
    [ in ] RPC_HKEY hKey,
    [ in ] SECURITY_INFORMATION SecurityInformation,
    [ in ] PRPC_SECURITY_DESCRIPTOR pRpcSecurityDescriptor
    );

error_status_t
BaseRegSetValue(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpValueName,
    [ in ] DWORD dwType,
    [ in, size_is( cbData )] LPBYTE lpData,
    [ in ] DWORD cbData
    );

error_status_t
BaseRegUnLoadKey(
    [ in ] RPC_HKEY  hKey,
    [ in ] PUNICODE_STRING lpSubKey
    );

//
// Shutdown APIs.
//

ULONG
BaseInitiateSystemShutdown(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in, unique ] PUNICODE_STRING lpMessage,
    [ in ] DWORD dwTimeout,
    [ in ] BOOLEAN bForceAppsClosed,
    [ in ] BOOLEAN bRebootAfterShutdown
    );

ULONG
BaseAbortSystemShutdown(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName
    );


//
// New Remote Registry APIs for Chicago
//

error_status_t
BaseRegGetVersion(
    [ in ] RPC_HKEY hKey,
    [ out ] LPDWORD lpdwVersion
    );

error_status_t
OpenCurrentConfig(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

error_status_t
OpenDynData(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

error_status_t
BaseRegQueryMultipleValues(
    [ in ] RPC_HKEY hKey,
    [ in, out, size_is(num_vals), length_is(num_vals) ] PRVALENT val_list,
    [ in ] DWORD num_vals,
    [ in, out, unique, size_is(*ldwTotsize), length_is(*ldwTotsize) ] LPSTR lpvalueBuf,
    [ in, out, ref ] LPDWORD ldwTotsize
    );


//
// Dragos Sambotin (dragoss) 01/07/1999 - Moved at the end to persist compatibility with NT4 !
// New Shutdown API .
//
ULONG
BaseInitiateSystemShutdownEx(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in, unique ] PUNICODE_STRING lpMessage,
    [ in ] DWORD dwTimeout,
    [ in ] BOOLEAN bForceAppsClosed,
    [ in ] BOOLEAN bRebootAfterShutdown,
    [ in ] DWORD dwReason
    );                      

[local]
BOOL
ShutdownWinreg(
	);

//
// needed for setup in order to save hives in %systemroot%\system32 in the latest format
//
error_status_t
BaseRegSaveKeyEx(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpFile,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES pSecurityAttributes,
    [ in ] DWORD    Flags
    );

[local]
error_status_t
LocalBaseRegSaveKeyEx(
    [ in ] RPC_HKEY hKey,
    [ in ] PUNICODE_STRING lpFile,
    [ in, unique ] PRPC_SECURITY_ATTRIBUTES pSecurityAttributes,
    [ in ] DWORD    Flags
    );


//
// Adding support for HKEY_PERFORMANCE_TEXT and HKEY_PERFORMANCE_NLSTEXT over remote connections
//
[local]
error_status_t
LocalOpenPerformanceText(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

[local]
error_status_t
LocalOpenPerformanceNlsText(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );


error_status_t
OpenPerformanceText(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );

error_status_t
OpenPerformanceNlsText(
    [ in, unique ] PREGISTRY_SERVER_NAME ServerName,
    [ in ] REGSAM samDesired,
    [ out ] PRPC_HKEY phKey
    );
    
}		// End of interface defintion
