1 /* Copyright (C) 2001-2006 Artifex Software, Inc.
2 All Rights Reserved.
3
4 This software is provided AS-IS with no warranty, either express or
5 implied.
6
7 This software is distributed under license and may not be copied, modified
8 or distributed except as expressly authorized under the terms of that
9 license. Refer to licensing information at http://www.artifex.com/
10 or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
11 San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
12 */
13
14 /* $Id: dwreg.c 9043 2008-08-28 22:48:19Z giles $ */
15 /* MS Windows registry values */
16
17 #include <windows.h>
18 #include <stdio.h>
19 #include <stdlib.h> /* for getenv */
20 #include <string.h>
21 #include "gscdefs.h" /* for gs_productfamily and gs_revision */
22
23 /* We store registry named values under the key
24 * "Software\\GPL Ghostscript"
25 * where "GPL Ghostscript" is actually gs_productfamily.
26 * Either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER will be used.
27 */
28 int
win_registry_key(char * buf,int len)29 win_registry_key(char *buf, int len)
30 {
31 const char *software = "Software";
32 if (strlen(software) + 1 + strlen(gs_productfamily) >= len)
33 return -1;
34
35 strcpy(buf, software);
36 strcat(buf, "\\");
37 strcat(buf, gs_productfamily);
38 return 0;
39 }
40
41 /*
42 * Get a named registry value from HKCU.
43 * name, ptr, plen and return values are the same as in gp_getenv();
44 */
45 int
win_get_reg_value(const char * name,char * ptr,int * plen)46 win_get_reg_value(const char *name, char *ptr, int *plen)
47 {
48 HKEY hkey;
49 DWORD cbData, keytype;
50 BYTE b;
51 LONG rc;
52 BYTE *bptr = (BYTE *)ptr;
53 char key[256];
54
55 win_registry_key(key, sizeof(key));
56 if (RegOpenKeyEx(HKEY_CURRENT_USER, key, 0, KEY_READ, &hkey)
57 == ERROR_SUCCESS) {
58 keytype = REG_SZ;
59 cbData = *plen;
60 if (bptr == (char *)NULL)
61 bptr = &b; /* Registry API won't return ERROR_MORE_DATA */
62 /* if ptr is NULL */
63 rc = RegQueryValueEx(hkey, (char *)name, 0, &keytype, bptr, &cbData);
64 RegCloseKey(hkey);
65 if (rc == ERROR_SUCCESS) {
66 *plen = cbData;
67 return 0; /* found environment variable and copied it */
68 } else if (rc == ERROR_MORE_DATA) {
69 /* buffer wasn't large enough */
70 *plen = cbData;
71 return -1;
72 }
73 }
74 return 1; /* not found */
75 }
76
77 /*
78 * Set a named registry value under HKCU.
79 * name = name of named value
80 * str = value of named value
81 * Returns 0 on success.
82 */
83 int
win_set_reg_value(const char * name,const char * value)84 win_set_reg_value(const char *name, const char *value)
85 {
86 HKEY hkey;
87 LONG rc;
88 char key[256];
89 DWORD dwDisposition;
90
91 win_registry_key(key, sizeof(key));
92 rc = RegOpenKeyEx(HKEY_CURRENT_USER, key, 0, KEY_WRITE, &hkey);
93 if (rc != ERROR_SUCCESS)
94 rc = RegCreateKeyEx(HKEY_CURRENT_USER, key, 0, "", 0,
95 KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition);
96 if (rc == ERROR_SUCCESS) {
97 rc = RegSetValueEx(hkey, name, 0, REG_SZ,
98 (CONST BYTE *)value, strlen(value)+1);
99 RegCloseKey(hkey);
100 }
101
102 return rc == ERROR_SUCCESS ? 0 : -1;
103 }
104
105