#ifndef REGISTRY_H
#define REGISTRY_H

#define NSSM_REGISTRY _T("SYSTEM\\CurrentControlSet\\Services\\%s")
#define NSSM_REG_PARAMETERS _T("Parameters")
#define NSSM_REGISTRY_GROUPS _T("SYSTEM\\CurrentControlSet\\Control\\ServiceGroupOrder")
#define NSSM_REG_GROUPS _T("List")
#define NSSM_REG_EXE _T("Application")
#define NSSM_REG_FLAGS _T("AppParameters")
#define NSSM_REG_DIR _T("AppDirectory")
#define NSSM_REG_ENV _T("AppEnvironment")
#define NSSM_REG_ENV_EXTRA _T("AppEnvironmentExtra")
#define NSSM_REG_EXIT _T("AppExit")
#define NSSM_REG_RESTART_DELAY _T("AppRestartDelay")
#define NSSM_REG_THROTTLE _T("AppThrottle")
#define NSSM_REG_STOP_METHOD_SKIP _T("AppStopMethodSkip")
#define NSSM_REG_KILL_CONSOLE_GRACE_PERIOD _T("AppStopMethodConsole")
#define NSSM_REG_KILL_WINDOW_GRACE_PERIOD _T("AppStopMethodWindow")
#define NSSM_REG_KILL_THREADS_GRACE_PERIOD _T("AppStopMethodThreads")
#define NSSM_REG_KILL_PROCESS_TREE _T("AppKillProcessTree")
#define NSSM_REG_STDIN _T("AppStdin")
#define NSSM_REG_STDOUT _T("AppStdout")
#define NSSM_REG_STDERR _T("AppStderr")
#define NSSM_REG_STDIO_SHARING _T("ShareMode")
#define NSSM_REG_STDIO_DISPOSITION _T("CreationDisposition")
#define NSSM_REG_STDIO_FLAGS _T("FlagsAndAttributes")
#define NSSM_REG_STDIO_COPY_AND_TRUNCATE _T("CopyAndTruncate")
#define NSSM_REG_HOOK_SHARE_OUTPUT_HANDLES _T("AppRedirectHook")
#define NSSM_REG_ROTATE _T("AppRotateFiles")
#define NSSM_REG_ROTATE_ONLINE _T("AppRotateOnline")
#define NSSM_REG_ROTATE_SECONDS _T("AppRotateSeconds")
#define NSSM_REG_ROTATE_BYTES_LOW _T("AppRotateBytes")
#define NSSM_REG_ROTATE_BYTES_HIGH _T("AppRotateBytesHigh")
#define NSSM_REG_ROTATE_DELAY _T("AppRotateDelay")
#define NSSM_REG_TIMESTAMP_LOG _T("AppTimestampLog")
#define NSSM_REG_PRIORITY _T("AppPriority")
#define NSSM_REG_AFFINITY _T("AppAffinity")
#define NSSM_REG_NO_CONSOLE _T("AppNoConsole")
#define NSSM_REG_HOOK _T("AppEvents")
#define NSSM_STDIO_LENGTH 29

HKEY open_service_registry(const TCHAR *, REGSAM sam, bool);
long open_registry(const TCHAR *, const TCHAR *, REGSAM sam, HKEY *, bool);
HKEY open_registry(const TCHAR *, const TCHAR *, REGSAM sam, bool);
HKEY open_registry(const TCHAR *, const TCHAR *, REGSAM sam);
HKEY open_registry(const TCHAR *, REGSAM sam);
long enumerate_registry_values(HKEY, unsigned long *, TCHAR *, unsigned long);
int create_messages();
int create_parameters(nssm_service_t *, bool);
int create_exit_action(TCHAR *, const TCHAR *, bool);
int get_environment(TCHAR *, HKEY, TCHAR *, TCHAR **, unsigned long *);
int get_string(HKEY, TCHAR *, TCHAR *, unsigned long, bool, bool, bool);
int get_string(HKEY, TCHAR *, TCHAR *, unsigned long, bool);
int expand_parameter(HKEY, TCHAR *, TCHAR *, unsigned long, bool, bool);
int expand_parameter(HKEY, TCHAR *, TCHAR *, unsigned long, bool);
int set_string(HKEY, TCHAR *, TCHAR *, bool);
int set_string(HKEY, TCHAR *, TCHAR *);
int set_expand_string(HKEY, TCHAR *, TCHAR *);
int set_number(HKEY, TCHAR *, unsigned long);
int get_number(HKEY, TCHAR *, unsigned long *, bool);
int get_number(HKEY, TCHAR *, unsigned long *);
int format_double_null(TCHAR *, unsigned long, TCHAR **, unsigned long *);
int unformat_double_null(TCHAR *, unsigned long, TCHAR **, unsigned long *);
int copy_double_null(TCHAR *, unsigned long, TCHAR **);
int append_to_double_null(TCHAR *, unsigned long, TCHAR **, unsigned long *, TCHAR *, size_t, bool);
int remove_from_double_null(TCHAR *, unsigned long, TCHAR **, unsigned long *, TCHAR *, size_t, bool);
void override_milliseconds(TCHAR *, HKEY, TCHAR *, unsigned long *, unsigned long, unsigned long);
int get_io_parameters(nssm_service_t *, HKEY);
int get_parameters(nssm_service_t *, STARTUPINFO *);
int get_exit_action(const TCHAR *, unsigned long *, TCHAR *, bool *);
int set_hook(const TCHAR *, const TCHAR *, const TCHAR *, TCHAR *);
int get_hook(const TCHAR *, const TCHAR *, const TCHAR *, TCHAR *, unsigned long);

#endif
