#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"),
  depends(lsa)
] 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 options,
		[in] uint32 access_mask,
		[in,out,ref] uint32 *action_taken,
		[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
	);

	/******************/
	/* Function: 0x0a */

	/* 
	   this is equivalent IDL to a winreg_String, but we need to
	   have absolute control over the length/size fields as the
	   server looks at those to see what size buffer we have, so
	   we can't use the automatic unistr handing in pidl.
	*/
	typedef struct {
		uint16 length;
		uint16 size;
		[size_is(size/2),length_is(length/2)] uint16 *name;
	} winreg_EnumValueString;

	WERROR winreg_EnumValue(
		[in,ref] policy_handle *handle,
		[in]     uint32 enum_index,
		[in]     winreg_EnumValueString name_in,
		[out]    winreg_String name_out,
		[in,out] uint32 *type,
		[in,out,size_is(*size),length_is(*length)] uint8 *value,
		[in,out] uint32 *size,
		[in,out] uint32 *length
	);

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

	typedef struct {
		[size_is(size),length_is(len)] uint8 *data;
		uint32 size;
		uint32 len;
	} KeySecurityData;

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

	/******************/
	/* Function: 0x0d */
	WERROR winreg_LoadKey(
		[in,ref] policy_handle *handle,
		[in] winreg_String *keyname,
		[in] winreg_String *filename
	);

	/******************/
	/* Function: 0x0e */
	WERROR winreg_NotifyChangeKeyValue(
		[in,ref] policy_handle *handle,
		[in] uint8 watch_subtree,
		[in] uint32 notify_filter,
		[in] uint32 unknown,
		[in] winreg_String string1,
		[in] winreg_String string2, 
		[in] uint32 unknown2
	);

	/******************/
	/* 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 value_name,
		[in,out] uint32 *type,
		[in,out,size_is(*size),length_is(*length)] uint8 *data,
		[in,out] uint32 *size,
		[in,out] uint32 *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 access_mask,
		[in,out,ref] KeySecurityData *data
	);

	/******************/
	/* Function: 0x16 */
	WERROR winreg_SetValue(
		[in,ref]           policy_handle *handle,
		[in]               winreg_String name,
		[in]               uint32 type,
		[in,size_is(size)] uint8  *data,
		[in]               uint32 size
	);

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

	/******************/
	/* Function: 0x18 */
	WERROR winreg_InitiateSystemShutdown(
		[in]	uint16 *hostname,
		[in]	winreg_String *message,
		[in]	uint32 timeout,
		[in]	uint8 force_apps,
		[in]	uint8 reboot
	);

	/******************/
	/* Function: 0x19 */
	WERROR winreg_AbortSystemShutdown(
		[in]	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
	);

	typedef struct {
		winreg_String *name;
		uint32 type;
		uint32 offset;
		uint32 length;
	} QueryMultipleValue;
	
	/******************/
	/* Function: 0x1d */
	WERROR winreg_QueryMultipleValues(
		[in,ref] policy_handle *key_handle, 
		[in,out,size_is(num_values),length_is(num_values),ref] QueryMultipleValue *values,
        [in] uint32 num_values,
        [in,out,size_is(*buffer_size),length_is(*buffer_size)] uint8 *buffer,
        [in,out,ref] uint32 *buffer_size
	);

	/******************/
	/* Function: 0x1e */
	WERROR winreg_InitiateSystemShutdownEx(
		[in] uint16 *hostname,
		[in] winreg_String *message,
		[in] uint32 timeout,
		[in] uint8 force_apps,
		[in] uint8 reboot,
		[in] uint32 reason
	);

	/******************/
	/* 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(
	);
}