#include "idl_types.h"

/*
  winreg interface definition
*/

[ uuid("338cd001-2244-31f1-aaaa-900038001003"),
  version(1.0),
  endpoint("ncacn_np:[\\pipe\\winreg]","ncacn_ip_tcp:","ncalrpc:"),
  pointer_default(unique),
  helpstring("Remote Registry Service")
] interface winreg
{
	typedef struct {
		[value(strlen_m_term(r->name)*2)] uint16 name_len;
		[value(r->name_len)]              uint16 name_size;
		unistr *name;
	} winreg_String;

	typedef struct {
		uint16 unknown0;
		uint16 unknown1;
	} winreg_OpenUnknown;

	/******************/
	/* Function: 0x00 */
	WERROR winreg_OpenHKCR(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x01 */
	WERROR winreg_OpenHKCU(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x02 */
	WERROR winreg_OpenHKLM(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x03 */
	WERROR winreg_OpenHKPD(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x04 */
	WERROR winreg_OpenHKU(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x05 */
	WERROR winreg_CloseKey(
		[in,out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x06 */
	WERROR winreg_CreateKey(
		[in,out,ref] policy_handle *handle,
		[in] winreg_String key,
		[in] winreg_String class,
		[in] uint32 reserved,
		[out] uint32 *unknown,
		[in] uint32 access_mask,
		[in,ref] uint32 *sec_info,
		[in] sec_desc_buf *sec_desc
	);

	/******************/
	/* Function: 0x07 */
	WERROR winreg_DeleteKey(
		[in,ref] policy_handle *handle,
		[in]	 winreg_String key
	);

	/******************/
	/* Function: 0x08 */
	WERROR winreg_DeleteValue(
		[in,ref] policy_handle *handle,
		[in]	 winreg_String value
	);

	typedef struct {
		uint32 low;
		uint32 high;
	} winreg_Time;

	typedef struct {
		uint32 unknown;
		winreg_String key_name;
	} winreg_EnumKeyNameRequest;

	typedef struct {
		uint32 unknown1;
		uint32 unknown2;
		lstring name;
	} winreg_EnumKeyNameResponse;

	/******************/
	/* Function: 0x09 */
	WERROR winreg_EnumKey(
		[in,ref]    policy_handle *handle,
		[in] uint32 enum_index,
		[in,out]    uint16 key_name_len,
		[in,out]    uint16 unknown,
		[in]        winreg_EnumKeyNameRequest *in_name,
		[out]       winreg_EnumKeyNameResponse *out_name,
		[in,out]    winreg_String *class,
		[in,out]    winreg_Time *last_changed_time
	);

        typedef struct {
	        uint32 max_len;
	        uint32 offset;
 	        uint32 len;
        } EnumValueIn;

        typedef struct {
                uint16 len;
                uint16 max_len;
                EnumValueIn *buffer;
        } EnumValueNameIn;

        typedef struct {
	        uint32 max_len;
	        uint32 offset;
	        DATA_BLOB buffer;
        } EnumValueOut;

        typedef struct {
                uint16 len;
                uint16 max_len;
                unistr *name;
        } EnumValueNameOut;

	/******************/
	/* Function: 0x0a */
	WERROR winreg_EnumValue(
		[in,ref] policy_handle *handle,
		[in] uint32 enum_index,
		[in] EnumValueNameIn name_in,
		[out] EnumValueNameOut name_out,
		[in,out] uint32 *type,
		[in] EnumValueIn *value_in,
		[out] EnumValueOut *value_out,
		[in,out] uint32 *value_len1,
		[in,out] uint32 *value_len2
	);

	/******************/
	/* Function: 0x0b */
	WERROR winreg_FlushKey(
		[in,ref] policy_handle *handle
	);

	typedef struct {
		uint32 max_len;
		uint32 offset;
		uint32 len;
	} KeySecuritySize;

	typedef struct {
		uint32 max_len;
		DATA_BLOB data;
	} KeySecurityData;

	/******************/
	/* Function: 0x0c */
	WERROR winreg_GetKeySecurity(
		[in,ref] policy_handle *handle,
		[in] uint32 unknown,
		[in,out] KeySecuritySize *size,
		[in,out] KeySecurityData data
	);

	/******************/
	/* Function: 0x0d */
	WERROR winreg_LoadKey(
	);

	/******************/
	/* Function: 0x0e */
	WERROR winreg_NotifyChangeKeyValue(
	);

	/******************/
	/* Function: 0x0f */
	WERROR winreg_OpenKey(
		[in,ref] policy_handle *handle,
		[in] winreg_String keyname,
		[in] uint32 unknown,
		[in] uint32 access_mask,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x10 */
	WERROR winreg_QueryInfoKey(
		[in,ref] policy_handle *handle,
		[in] winreg_String class,
		[out] winreg_String class,
		[out] uint32 num_subkeys,
		[out] uint32 max_subkeylen,
		[out] uint32 max_subkeysize,
		[out] uint32 num_values,
		[out] uint32 max_valnamelen,
		[out] uint32 max_valbufsize,
		[out] uint32 secdescsize,
		[out] winreg_Time last_changed_time
	);

	/******************/
	/* Function: 0x11 */
	WERROR winreg_QueryValue(
		[in,ref] policy_handle *handle,
		[in] winreg_String valuename,
		[in] uint32 *reserved,
		[in] uint32 *offered,
		[in] uint32 *unknown1,
		[in] uint32 *unknown2,
		[out] uint32 *type, 
		[out] uint8 *data,
		[in,out] uint32 *offered2,
		[in,out] uint32 *val_length
	);

	/******************/
	/* Function: 0x12 */
	WERROR winreg_ReplaceKey(
	);

	/******************/
	/* Function: 0x13 */
	WERROR winreg_RestoreKey(
	);

	/******************/
	/* Function: 0x14 */
	WERROR winreg_SaveKey(
	);

	/******************/
	/* Function: 0x15 */
	WERROR winreg_SetKeySecurity(
		[in,ref] policy_handle *handle,
		[in] uint32 sec_info,
		[in] sec_desc_buf *sec_desc
	);

	typedef struct {
		uint32 max_len;
		[length_is(buf_max_len)] uint8 *buffer;
		uint32 len;
	} winreg_Value;

	/******************/
	/* Function: 0x16 */
	WERROR winreg_SetValue(
		[in,ref] policy_handle *handle,
		[in] winreg_String name,
		[in] uint32 type,
		[in] winreg_Value value
	);

	/******************/
	/* Function: 0x17 */
	WERROR winreg_UnLoadKey(
	);

	/******************/
	/* Function: 0x18 */
	WERROR winreg_InitiateSystemShutdown(
		[in]	winreg_String hostname,
		[in]	winreg_String message,
		[in]	uint32 timeout,
		[in]	uint16 flags,
		[out]	uint16 status
	);

	/******************/
	/* Function: 0x19 */
	WERROR winreg_AbortSystemShutdown(
		[in,ref]	uint16 *server
	);

	/******************/
	/* Function: 0x1a */
	WERROR winreg_GetVersion(
		[in,ref] policy_handle *handle,
		[out]    uint32 version
	);

	/******************/
	/* Function: 0x1b */
	WERROR winreg_OpenHKCC(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x1c */
	WERROR winreg_OpenHKDD(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x1d */
	WERROR winreg_QueryMultipleValues(
	);

	/******************/
	/* Function: 0x1e */
	WERROR winreg_InitiateSystemShutdownEx(
		);

	/******************/
	/* Function: 0x1f */
	WERROR winreg_SaveKeyEx(
	);

	/******************/
	/* Function: 0x20 */
	WERROR winreg_OpenHKPT(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x21 */
	WERROR winreg_OpenHKPN(
		[in]      winreg_OpenUnknown *unknown,
		[in]      uint32 access_required,
		[out,ref] policy_handle *handle
	);

	/******************/
	/* Function: 0x22 */
	WERROR winreg_QueryMultipleValues2(
	);
}