/*++

Copyright (c) 1998  Microsoft Corporation

Module Name:

    registry.h

Abstract:

	SIS Groveler registry interface headers

Authors:

	John Douceur, 1998

Environment:

	User Mode


Revision History:


--*/

#ifndef _INC_REGISTRY

#define _INC_REGISTRY

#ifndef _DEF_ENTRY_INFO
#define _DEF_ENTRY_INFO

enum EntryType
{
	entry_bool,
	entry_char,
	entry_int,
	entry_int64,
	entry_double
};

struct EntrySpec
{
	const _TCHAR *identifier;
	EntryType type;
	const _TCHAR *default_value;
	void *pointer;
};

#endif	/* _DEF_ENTRY_INFO */

class Registry
{
public:

	static bool read(
		HKEY base_key,
		const _TCHAR *path,
		int num_entries,
		EntrySpec *entries);

	static bool write(
		HKEY base_key,
		const _TCHAR *path,
		int num_entries,
		EntrySpec *entries);

	static bool overwrite(
		HKEY base_key,
		const _TCHAR *path,
		int num_entries,
		EntrySpec *entries);

	static bool write_defaults(
		HKEY base_key,
		const _TCHAR *path,
		int num_entries,
		EntrySpec *entries);

	static bool overwrite_defaults(
		HKEY base_key,
		const _TCHAR *path,
		int num_entries,
		EntrySpec *entries);

	static bool read_string_set(
		HKEY base_key,
		const _TCHAR *path,
		int *num_strings,
		_TCHAR ***strings,
		BYTE **buffer);

	static bool write_string_set(
		HKEY base_key,
		const _TCHAR *path,
		int num_strings,
		_TCHAR **strings,
		_TCHAR **identifiers);

	static bool overwrite_string_set(
		HKEY base_key,
		const _TCHAR *path,
		int num_strings,
		_TCHAR **strings,
		_TCHAR **identifiers);

	static void create_key_ex(
		HKEY hKey,
		LPCTSTR lpSubKey,
		DWORD Reserved,
		LPTSTR lpClass,
		DWORD dwOptions,
		REGSAM samDesired,
		LPSECURITY_ATTRIBUTES lpSecurityAttributes,
		PHKEY phkResult,
		LPDWORD lpdwDisposition);

	static void open_key_ex(
		HKEY hKey,
		LPCTSTR lpSubKey,
		DWORD ulOptions,
		REGSAM samDesired,
		PHKEY phkResult);

	static void close_key(
		HKEY hKey);

	static void query_value_ex(
		HKEY hKey,
		LPCTSTR lpValueName,
		LPDWORD lpReserved,
		LPDWORD lpType,
		LPBYTE lpData,
		LPDWORD lpcbData);

	static void set_value_ex(
		HKEY hKey,
		LPCTSTR lpValueName,
		DWORD Reserved,
		DWORD dwType,
		CONST BYTE *lpData,
		DWORD cbData);

private:

	enum {id_buffer_length = 256};

	static void load_string_into_value(
		EntryType type,
		const _TCHAR *string,
		void *value);

	static void store_value_in_string(
		EntryType type,
		void *value,
		_TCHAR *string);

	Registry() {}
	~Registry() {}

	static _TCHAR id_buffer[id_buffer_length];
};

#endif	/* _INC_REGISTRY */