]> granicus.if.org Git - apache/commitdiff
Move the last little useful bit of registry.c into services.c, and
authorWilliam A. Rowe Jr <wrowe@apache.org>
Mon, 24 Jun 2002 07:53:50 +0000 (07:53 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Mon, 24 Jun 2002 07:53:50 +0000 (07:53 +0000)
  blast it.  All Win32 registry foo is going through ap_regkey now.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@95880 13f79535-47bb-0310-9956-ffa450edef68

libhttpd.dsp
server/mpm/winnt/mpm_winnt.c
server/mpm/winnt/mpm_winnt.h
server/mpm/winnt/registry.c [deleted file]
server/mpm/winnt/service.c

index c0ffcc79aa2b7731c425a23b307628c12077387f..9e0b512c5cbf99efb9820e9e93ec828bb039ad28 100644 (file)
@@ -223,6 +223,35 @@ InputPath=.\server\gen_test_char.exe
 # End Source File
 # Begin Source File
 
+SOURCE=.\os\win32\ap_regkey.h
+
+!IF  "$(CFG)" == "libhttpd - Win32 Release"
+
+# PROP Ignore_Default_Tool 1
+# Begin Custom Build - Creating include/ap_regkey.h
+InputPath=.\os\win32\ap_regkey.h
+
+".\include\ap_regkey.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       type .\os\win32\ap_regkey.h > .\include\ap_regkey.h
+       
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "libhttpd - Win32 Debug"
+
+# PROP Ignore_Default_Tool 1
+# Begin Custom Build - Creating include/ap_regkey.h
+InputPath=.\os\win32\ap_regkey.h
+
+".\include\ap_regkey.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       type .\os\win32\ap_regkey.h > .\include\ap_regkey.h
+       
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
 SOURCE=.\modules\http\mod_core.h
 
 !IF  "$(CFG)" == "libhttpd - Win32 Release"
@@ -499,10 +528,6 @@ SOURCE=.\os\win32\ap_regkey.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\os\win32\ap_regkey.h
-# End Source File
-# Begin Source File
-
 SOURCE=.\server\error_bucket.c
 # End Source File
 # Begin Source File
@@ -623,10 +648,6 @@ SOURCE=.\server\mpm\winnt\nt_eventlog.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\server\mpm\winnt\registry.c
-# End Source File
-# Begin Source File
-
 SOURCE=.\server\mpm\winnt\service.c
 # End Source File
 # End Group
index b5f99e5523f9d2231b0932f3342b560807691ff9..45e2c1360deee458a22180c44074b8dd6a96cc13 100644 (file)
@@ -110,7 +110,7 @@ server_rec *ap_server_conf;
 typedef HANDLE thread;
 
 /* Definitions of WINNT MPM specific config globals */
-static apr_pool_t *pconf;
+apr_pool_t *pconf;
 static apr_pool_t *pchild = NULL;
 static int workers_may_exit = 0;
 static int shutdown_in_progress = 0;
@@ -2071,6 +2071,8 @@ void winnt_rewrite_args(process_rec *process)
     int running_as_service = 1;
     int errout = 0;
 
+    pconf = process->pconf;
+
     osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
     GetVersionEx(&osver);
 
index e3229b374184fb2690a5867305e403c8660a8d0e..ab3d0011d91d01c13f0b4b4227a9109e0a59659c 100644 (file)
 
 #include "ap_listen.h"
 
-/* From registry.c: */
-
-apr_status_t ap_registry_create_key(const char *key);
-apr_status_t ap_registry_delete_key(const char *key);
-
-apr_status_t ap_registry_store_value(const char *key, const char *name, 
-                                    const char *value);
-apr_status_t ap_registry_get_value(apr_pool_t *p, const char *key, 
-                                  const char *name, char **ppValue);
-apr_status_t ap_registry_store_array(apr_pool_t *p, const char *key, 
-                                    const char *name, int nelts, 
-                                    char const* const* elts);
-apr_status_t ap_registry_get_array(apr_pool_t *p, const char *key, 
-                                  const char *name, 
-                                  apr_array_header_t **parray);
-apr_status_t ap_registry_delete_value(const char *key, const char *name);
-
-
 /* From service.c: */
 
 #define SERVICE_APACHE_RESTART 128
diff --git a/server/mpm/winnt/registry.c b/server/mpm/winnt/registry.c
deleted file mode 100644 (file)
index 4b5b326..0000000
+++ /dev/null
@@ -1,492 +0,0 @@
-/* ====================================================================
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        Apache Software Foundation (http://www.apache.org/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Apache" and "Apache Software Foundation" must
- *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- *    nor may "Apache" appear in their name, without prior written
- *    permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- * Portions of this software are based upon public domain software
- * originally written at the National Center for Supercomputing Applications,
- * University of Illinois, Urbana-Champaign.
- */
-
-/*
- * Functions to handle interacting with the Win32 registry
- */
-
-/*
- * Apache registry key structure
- *
- * Apache's registry information is stored in the HKEY_LOCAL_MACHINE
- * key, under
- *
- *  HKLM\SOFTWARE\Apache Software Foundation\Apache\version
- *
- * These keys are defined in this file. The definition of the "version" part
- * will need updating each time Apache moves from beta to non-beta or from a
- * release to a development or beta version.
- */
-
-#include "httpd.h"
-#include "http_log.h"
-#include "mpm_winnt.h"
-#include "apr_strings.h"
-
-/* bet you are looking to change revisions to roll the tarball...
- * Guess what, you already did.  Revised May '00 to save you from 
- * searching all over creation for every revision tag.
- */
-
-#define VENDOR   AP_SERVER_BASEVENDOR
-#define SOFTWARE AP_SERVER_BASEPRODUCT
-#define VERSION  AP_SERVER_BASEREVISION
-
-#define REGKEY "SOFTWARE\\" VENDOR "\\" SOFTWARE "\\" VERSION
-
-/*
- * The Windows API registry key functions don't set the last error
- * value (the windows equivalent of errno). So we need to set it
- * with SetLastError() before calling the aplog_error() function.
- * Because this is common, let's have a macro.
- */
-#define return_error(rv) return (apr_set_os_error(APR_FROM_OS_ERROR(rv)),\
-                                 APR_FROM_OS_ERROR(rv));
-
-apr_status_t ap_registry_create_key(const char *key)
-{
-    HKEY hKey = HKEY_LOCAL_MACHINE;
-    HKEY hKeyNext;
-    char keystr[MAX_PATH + 1];        
-    char *parsekey = keystr;
-    char *nextkey = keystr;
-    DWORD result;
-    int rv;
-
-    apr_cpystrn(keystr, key, sizeof(keystr) - 1);
-       
-    /* Walk the tree, creating at each stage if necessary */
-    while (parsekey) {
-        if (nextkey = strchr(parsekey, '\\'))
-            *(nextkey++) = '\0';
-
-        rv = RegCreateKeyEx(hKey,
-                           parsekey,    /* subkey */
-                           0,           /* reserved */
-                           NULL,        /* class */
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_WRITE,
-                           NULL,
-                           &hKeyNext,
-                           &result);
-
-       /* Close the old key */
-        if (hKey != HKEY_LOCAL_MACHINE)
-           RegCloseKey(hKey);
-        hKey = hKeyNext;
-        
-        if (rv != ERROR_SUCCESS)
-           break;
-
-        parsekey = nextkey;
-    }
-
-    if (hKey != HKEY_LOCAL_MACHINE)
-        RegCloseKey(hKey);
-
-    return_error(rv);
-}
-
-apr_status_t ap_registry_delete_key(const char *key)
-{
-    apr_status_t rv;
-    HKEY hKey;
-    int nSize = 0;
-    char tempkey[MAX_PATH + 1];
-    char *parsekey;
-
-    apr_cpystrn(tempkey, key, sizeof(parsekey) - 1);
-    parsekey = strrchr(tempkey, '\\');
-    
-    if (parsekey) {
-        *(parsekey++) = '\0';
-        rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                          tempkey,
-                         0,
-                         KEY_WRITE,
-                         &hKey);
-
-        if (rv != ERROR_SUCCESS)
-            return_error(rv);
-    }
-    else {
-        parsekey = tempkey;
-        hKey = HKEY_LOCAL_MACHINE;
-    }
-    
-    rv = RegDeleteKey(hKey, key);
-
-    if (hKey != HKEY_LOCAL_MACHINE)
-        RegCloseKey(hKey);
-
-    return_error(rv);
-}
-
-/* Clean up a way over complicated process.
- *
- * The return value is APR_SUCCESS, APR_ENOENT, APR_NOTFOUND, or the OS error
- */
-
-apr_status_t ap_registry_get_value(apr_pool_t *p, const char *key, const char *name, char **ppValue)
-{
-    apr_status_t rv;
-    HKEY hKey;
-    int nSize = 0;
-
-    rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                      key,
-                     0,
-                     KEY_READ,
-                     &hKey);
-
-    if (rv != ERROR_SUCCESS)
-        return_error(rv);
-
-    /* Find the size required for the data by passing NULL as the buffer
-     * pointer. On return nSize will contain the size required for the
-     * buffer if the return value is ERROR_SUCCESS.
-     */
-    rv = RegQueryValueEx(hKey, 
-                        name,          /* key name */
-                        NULL,          /* reserved */
-                        NULL,          /* type */
-                        NULL,          /* for value */
-                        &nSize);               /* for size of "value" */
-
-    if (rv != ERROR_SUCCESS)
-       return_error(rv);
-
-    *ppValue = apr_palloc(p, nSize + 1);
-    (*ppValue)[nSize] = '\0';
-
-    rv = RegQueryValueEx(hKey, 
-                        name,          /* key name */
-                        NULL,          /* reserved */
-                        NULL,          /* type */
-                        *ppValue,      /* for value */
-                        &nSize);       /* for size of "value" */
-
-    RegCloseKey(hKey);
-
-    return_error(rv);
-}
-
-apr_status_t ap_registry_get_array(apr_pool_t *p, const char *key, const char *name, apr_array_header_t **parray)
-{
-    char *pValue;
-    char *tmp;
-    char **newelem;
-    apr_status_t rv;
-    HKEY hKey;
-    int nSize = 0;
-
-    rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                      key,
-                     0,
-                     KEY_READ,
-                     &hKey);
-
-    if (rv != ERROR_SUCCESS)
-        return_error(rv);
-
-    /* Find the size required for the data by passing NULL as the buffer
-     * pointer. On return nSize will contain the size required for the
-     * buffer if the return value is ERROR_SUCCESS.
-     */
-    rv = RegQueryValueEx(hKey, 
-                        name,          /* key name */
-                        NULL,          /* reserved */
-                        NULL,          /* type */
-                        NULL,          /* for value */
-                        &nSize);               /* for size of "value" */
-
-    if (rv != ERROR_SUCCESS) {
-       return_error(rv);
-    }
-    else 
-    {
-        /* Small possiblity the array is either unterminated 
-         * or single NULL terminated.  Avert.
-         */
-        pValue = apr_palloc(p, nSize + 2);
-        pValue[nSize + 1] = '\0';
-        pValue[nSize] = '\0';
-        
-        rv = RegQueryValueEx(hKey, 
-                            name,              /* key name */
-                            NULL,              /* reserved */
-                            NULL,              /* type */
-                            pValue,        /* for value */
-                            &nSize);   /* for size of "value" */
-
-        nSize = 0;    /* Element Count */
-        for (tmp = pValue; *tmp; ++tmp) {
-            ++nSize;
-            while (*tmp) {
-                ++tmp;
-            }
-        }
-
-        *parray = apr_array_make(p, nSize, sizeof(char *));
-        for (tmp = pValue; *tmp; ++tmp) {
-            newelem = (char **) apr_array_push(*parray);
-            *newelem = tmp;
-            while (*tmp) {
-                ++tmp;
-            }
-        }
-    }    
-    
-    RegCloseKey(hKey);
-
-    return_error(rv);
-}
-
-/*
- * ap_registry_store_key_value() stores a value name and value under the
- * Apache registry key. If the Apache key does not exist it is created
- * first. This function is intended to be called from a wrapper function
- * in this file to set particular data values, such as 
- * ap_registry_set_server_root() below.
- *
- * Returns 0 if the value name and data was stored successfully, or
- * returns -1 if the Apache key does not exist (since we try to create 
- * this key, this should never happen), or -4 if any other error occurred
- * (these values are consistent with ap_registry_get_key_value()).
- * If the return value is negative then the error will already have been
- * logged via aplog_error().
- */
-
-apr_status_t ap_registry_store_value(const char *key, const char *name, const char *value)
-{
-    long rv;
-    HKEY hKey;
-
-    rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                     key,
-                     0,
-                     KEY_WRITE,
-                     &hKey);
-
-    if (rv == ERROR_FILE_NOT_FOUND) 
-    {
-       rv = ap_registry_create_key(key);
-
-        if (rv != APR_SUCCESS)
-           return_error(rv);
-       
-       rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         key,
-                         0,
-                         KEY_WRITE,
-                         &hKey);
-    }
-
-    if (rv != ERROR_SUCCESS)
-        return_error(rv);
-
-    /* Now set the value and data */
-    rv = RegSetValueEx(hKey, 
-                       name,   /* value key name */
-                      0,       /* reserved */
-                      REG_SZ,  /* type */
-                      value,   /* value data */
-                      (DWORD) strlen(value) + 1); /* for size of "value" */
-
-    if (rv == ERROR_SUCCESS) {
-       ap_log_error(APLOG_MARK,APLOG_INFO,rv,NULL,
-           "Registry stored HKLM\\" REGKEY "\\%s value %s", key, value);
-    }
-
-    /* Make sure we close the key even if there was an error storing
-     * the data
-     */
-    RegCloseKey(hKey);
-    
-    return_error(rv);
-}
-
-apr_status_t ap_registry_store_array(apr_pool_t *p,
-                                     const char *key, const char *name,
-                                     int nelts, const char * const * elts)
-{
-    int  bufsize, i;
-    char *buf, *tmp;
-    long rv;
-    HKEY hKey;
-
-    rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                     key,
-                     0,
-                     KEY_WRITE,
-                     &hKey);
-
-    if (rv == ERROR_FILE_NOT_FOUND) 
-    {
-       rv = ap_registry_create_key(key);
-
-        if (rv != APR_SUCCESS)
-           return_error(rv);
-       
-       rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         key,
-                         0,
-                         KEY_WRITE,
-                         &hKey);
-    }
-
-    if (rv != ERROR_SUCCESS)
-        return_error(rv);
-
-    bufsize = 1; /* For trailing second null */
-    for (i = 0; i < nelts; ++i)
-    {
-        bufsize += strlen(elts[i]) + 1;
-    }
-    if (!nelts) 
-        ++bufsize;
-
-    buf = apr_palloc(p, bufsize);
-    tmp = buf;
-    for (i = 0; i < nelts; ++i)
-    {
-        strcpy(tmp, elts[i]);
-        tmp += strlen(elts[i]) + 1;
-    }
-    if (!nelts) 
-        (*tmp++) = '\0';
-    *tmp = '\0'; /* Trailing second null */
-
-    /* Now set the value and data */
-    rv = RegSetValueEx(hKey, 
-                       name,        /* value key name */
-                      0,            /* reserved */
-                      REG_MULTI_SZ, /* type */
-                      buf,          /* value data */
-                      (DWORD) bufsize); /* for size of "value" */
-
-    if (rv == ERROR_SUCCESS) {
-       ap_log_error(APLOG_MARK,APLOG_INFO,rv,NULL,
-           "Registry stored HKLM\\" REGKEY "\\%s", key);
-    }
-
-    /* Make sure we close the key even if there was an error storing
-     * the data
-     */
-    RegCloseKey(hKey);
-    
-    return_error(rv);
-}
-
-/* A key or value that does not exist is _not_ an error while deleting. */
-
-apr_status_t ap_registry_delete_value(const char *key, const char *name)
-{
-    apr_status_t rv;
-    HKEY hKey;
-    
-    rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                      key,
-                     0,
-                     KEY_WRITE,
-                     &hKey);
-
-    if (rv == ERROR_FILE_NOT_FOUND)
-        return APR_SUCCESS;
-    
-    if (rv != ERROR_SUCCESS)
-        return_error(rv);
-
-    rv = RegDeleteValue(hKey, name);
-
-    if (rv == ERROR_FILE_NOT_FOUND)
-        rv = APR_SUCCESS;
-    
-    RegCloseKey(hKey);
-    return_error(rv);
-}
-
-/*
- * Get the server root from the registry into 'dir' which is
- * size bytes long. Returns 0 if the server root was found
- * or if the serverroot key does not exist (in which case
- * dir will contain an empty string), or -1 if there was
- * an error getting the key.
- */
-apr_status_t ap_registry_get_server_root(apr_pool_t *p, char **buf)
-{
-    apr_status_t rv;
-
-    rv = ap_registry_get_value(p, REGKEY, "ServerRoot", buf);
-    if (rv) 
-        *buf = NULL;
-
-    return rv;
-}
-
-
-/*
- * Sets the serverroot value within the registry. Returns 0 on success
- * or -1 on error. If -1 is return the error will already have been
- * logged via aplog_error().
- */
-
-apr_status_t ap_registry_set_server_root(char *dir)
-{
-    return ap_registry_store_value(REGKEY, "ServerRoot", dir);
-}
index afec0e8463a29b639b38c89bed6185a5ad257f5e..01ec697b16dc63c040e24bf3778a76f7ff3f1cb4 100644 (file)
@@ -69,6 +69,7 @@
 #include "mpm_winnt.h"
 #include "apr_strings.h"
 #include "apr_lib.h"
+#include "ap_regkey.h"
 
 #ifdef NOUSER
 #undef NOUSER
@@ -92,6 +93,43 @@ static struct
 
 static int ReportStatusToSCMgr(int currentState, int exitCode, int waitHint);
 
+
+#define PRODREGKEY "SOFTWARE\\" AP_SERVER_BASEVENDOR "\\" \
+                   AP_SERVER_BASEPRODUCT "\\" AP_SERVER_BASEREVISION
+
+/*
+ * Get the server root from the registry into 'dir' which is
+ * size bytes long. Returns 0 if the server root was found
+ * or if the serverroot key does not exist (in which case
+ * dir will contain an empty string), or -1 if there was
+ * an error getting the key.
+ */
+apr_status_t ap_registry_get_server_root(apr_pool_t *p, char **buf)
+{
+    apr_status_t rv;
+    ap_regkey_t *key;
+
+    if ((rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, PRODREGKEY, 
+                             APR_READ, p)) == APR_SUCCESS) {
+        rv = ap_regkey_value_get(buf, key, "ServerRoot", p);
+        ap_regkey_close(key);
+        if (rv == APR_SUCCESS) 
+            return rv;
+    }
+
+    if ((rv = ap_regkey_open(&key, AP_REGKEY_CURRENT_USER, PRODREGKEY, 
+                             APR_READ, p)) == APR_SUCCESS) {
+        rv = ap_regkey_value_get(buf, key, "ServerRoot", p);
+        ap_regkey_close(key);
+        if (rv == APR_SUCCESS) 
+            return rv;
+    }
+
+    *buf = NULL;
+    return rv;
+}
+
+
 /* The service configuration's is stored under the following trees:
  *
  * HKLM\System\CurrentControlSet\Services\[service name]
@@ -420,6 +458,9 @@ static int ReportStatusToSCMgr(int currentState, int exitCode, int waitHint)
  * notify the service control manager of the name change.
  */
 
+/* borrowed from mpm_winnt.c */
+extern apr_pool_t *pconf;
+
 /* Windows 2000 alone supports ChangeServiceConfig2 in order to
  * register our server_version string... so we need some fixups
  * to avoid binding to that function if we are on WinNT/9x.
@@ -450,6 +491,7 @@ static void set_service_description(void)
             /* Cast is necessary, ChangeServiceConfig2 handles multiple
              * object types, some volatile, some not.
              */
+            /* ###: utf-ize */
             if (ChangeServiceConfig2(schService,
                                      1 /* SERVICE_CONFIG_DESCRIPTION */,
                                      (LPVOID) &full_description)) {
@@ -463,22 +505,21 @@ static void set_service_description(void)
     if (full_description) 
     {
         char szPath[MAX_PATH];
-        HKEY hkey;
+        ap_regkey_t *svckey;
+        apr_status_t rv;
 
-        /* Create/Find the Service key that Monitor Applications iterate */
+        /* Find the Service key that Monitor Applications iterate */
         apr_snprintf(szPath, sizeof(szPath), 
                      "SYSTEM\\CurrentControlSet\\Services\\%s", 
                      mpm_service_name);
-        if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szPath, 0, KEY_SET_VALUE, &hkey) 
-                != ERROR_SUCCESS) {
+        rv = ap_regkey_open(&svckey, AP_REGKEY_LOCAL_MACHINE, szPath,
+                            APR_WRITE, pconf);
+        if (rv != APR_SUCCESS) {
             return;
         }
-
         /* Attempt to set the Description value for our service */
-        RegSetValueEx(hkey, "Description", 0, REG_SZ,  
-                      (unsigned char *) full_description, 
-                      strlen(full_description) + 1);
-        RegCloseKey(hkey);
+        ap_regkey_value_set(svckey, "Description", full_description, pconf);
+        ap_regkey_close(svckey);
     }
 }
 
@@ -509,6 +550,7 @@ static VOID WINAPI service_nt_ctrl(DWORD dwCtrlCode)
  */
 extern apr_array_header_t *mpm_new_argv;
 
+/* ###: utf-ize */
 static void __stdcall service_nt_main_fn(DWORD argc, LPTSTR *argv)
 {
     const char *ignored;
@@ -521,6 +563,7 @@ static void __stdcall service_nt_main_fn(DWORD argc, LPTSTR *argv)
     globdat.ssStatus.dwCurrentState = SERVICE_START_PENDING;
     globdat.ssStatus.dwCheckPoint = 1;
 
+    /* ###: utf-ize */
     if (!(globdat.hServiceStatus = RegisterServiceCtrlHandler(argv[0], service_nt_ctrl)))
     {
         ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, apr_get_os_error(), 
@@ -574,6 +617,7 @@ DWORD WINAPI service_nt_dispatch_thread(LPVOID nada)
         { NULL, NULL }
     };
 
+    /* ###: utf-ize */
     if (!StartServiceCtrlDispatcher(dispatchTable))
     {
         /* This is a genuine failure of the SCM. */
@@ -590,6 +634,7 @@ apr_status_t mpm_service_set_name(apr_pool_t *p, const char **display_name,
                                   const char *set_name)
 {
     char key_name[MAX_PATH];
+    ap_regkey_t *key;
     apr_status_t rv;
 
     /* ### Needs improvement, on Win2K the user can _easily_ 
@@ -599,11 +644,15 @@ apr_status_t mpm_service_set_name(apr_pool_t *p, const char **display_name,
     mpm_service_name = apr_palloc(p, strlen(set_name) + 1);
     apr_collapse_spaces((char*) mpm_service_name, set_name);
     apr_snprintf(key_name, sizeof(key_name), SERVICECONFIG, mpm_service_name);
-    rv = ap_registry_get_value(p, key_name, "DisplayName", &mpm_display_name);
+    rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, key_name, APR_READ, pconf);
+    if (rv == APR_SUCCESS) {
+        rv = ap_regkey_value_get(&mpm_display_name, key, "DisplayName", pconf);
+        ap_regkey_close(key);
+    }
     if (rv != APR_SUCCESS) {
         /* Take the given literal name if there is no service entry */
         mpm_display_name = apr_pstrdup(p, set_name);
-    }
+    } 
     *display_name = mpm_display_name;
     return rv;
 }
@@ -617,9 +666,14 @@ apr_status_t mpm_merge_service_args(apr_pool_t *p,
     char conf_key[MAX_PATH];
     char **cmb_data;
     apr_status_t rv;
+    ap_regkey_t *key;
 
     apr_snprintf(conf_key, sizeof(conf_key), SERVICEPARAMS, mpm_service_name);
-    rv = ap_registry_get_array(p, conf_key, "ConfigArgs", &svc_args);
+    rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, conf_key, APR_READ, p);
+    if (rv == APR_SUCCESS) {
+        rv = ap_regkey_value_array_get(&svc_args, key, "ConfigArgs", p);
+        ap_regkey_close(key);
+    }
     if (rv != APR_SUCCESS) {
         if (rv == ERROR_FILE_NOT_FOUND) {
             ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL,
@@ -781,11 +835,13 @@ apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc,
     char key_name[MAX_PATH];
     char exe_path[MAX_PATH];
     char *launch_cmd;
-    apr_status_t(rv);
+    ap_regkey_t *key;
+    apr_status_t rv;
     
     fprintf(stderr,reconfig ? "Reconfiguring the %s service\n"
                   : "Installing the %s service\n", mpm_display_name);
 
+    /* ###: utf-ize */
     if (GetModuleFileName(NULL, exe_path, sizeof(exe_path)) == 0)
     {
         apr_status_t rv = apr_get_os_error();
@@ -812,6 +868,7 @@ apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc,
         launch_cmd = apr_psprintf(ptemp, "\"%s\" -k runservice", exe_path);
 
         if (reconfig) {
+            /* ###: utf-ize */
             schService = OpenService(schSCManager, mpm_service_name, 
                                      SERVICE_ALL_ACCESS);
             if (!schService) {
@@ -819,6 +876,7 @@ apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc,
                              apr_get_os_error(), NULL,
                              "OpenService failed");
             }
+            /* ###: utf-ize */
             else if (!ChangeServiceConfig(schService, 
                                           SERVICE_WIN32_OWN_PROCESS,
                                           SERVICE_AUTO_START,
@@ -841,6 +899,7 @@ apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc,
              * be warned that future apache modules or ISAPI dll's may 
              * depend on it.
              */
+            /* ###: utf-ize */
             schService = CreateService(schSCManager,         // SCManager database
                                    mpm_service_name,     // name of service
                                    mpm_display_name,     // name to display
@@ -873,7 +932,12 @@ apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc,
         /* Store the launch command in the registry */
         launch_cmd = apr_psprintf(ptemp, "\"%s\" -n %s -k runservice", 
                                  exe_path, mpm_service_name);
-        rv = ap_registry_store_value(SERVICECONFIG9X, mpm_service_name, launch_cmd);
+        rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, SERVICECONFIG9X, 
+                            APR_READ, pconf);
+        if (rv == APR_SUCCESS) {
+            rv = ap_regkey_value_set(key, mpm_service_name, launch_cmd, pconf);
+            ap_regkey_close(key);
+        }
         if (rv != APR_SUCCESS) {
             ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, 
                          "%s: Failed to add the RunServices registry entry.", 
@@ -882,14 +946,24 @@ apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc,
         }
 
         apr_snprintf(key_name, sizeof(key_name), SERVICECONFIG, mpm_service_name);
-        rv = ap_registry_store_value(key_name, "ImagePath", launch_cmd);
+        rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, key_name, 
+                            APR_READ, pconf);
+        if (rv != APR_SUCCESS) {
+            ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, 
+                         "%s: Failed to create the registry service key.", 
+                         mpm_display_name);
+            return (rv);
+        }
+        rv = ap_regkey_value_set(key, "ImagePath", launch_cmd, pconf);
         if (rv != APR_SUCCESS) {
             ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, 
                          "%s: Failed to store ImagePath in the registry.", 
                          mpm_display_name);
+            ap_regkey_close(key);
             return (rv);
         }
-        rv = ap_registry_store_value(key_name, "DisplayName", mpm_display_name);
+        rv = ap_regkey_value_set(key, "DisplayName", mpm_display_name, pconf);
+        ap_regkey_close(key);
         if (rv != APR_SUCCESS) {
             ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, 
                          "%s: Failed to store DisplayName in the registry.", 
@@ -903,7 +977,12 @@ apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc,
     /* For both WinNT & Win9x store the service ConfigArgs in the registry...
      */
     apr_snprintf(key_name, sizeof(key_name), SERVICEPARAMS, mpm_service_name);
-    rv = ap_registry_store_array(ptemp, key_name, "ConfigArgs", argc, argv);
+    rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, key_name, 
+                        APR_READ, pconf);
+    if (rv == APR_SUCCESS) {
+        rv = ap_regkey_value_array_set(key, "ConfigArgs", argc, argv, pconf);
+        ap_regkey_close(key);
+    }
     if (rv != APR_SUCCESS) {
         ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, 
                      "%s: Failed to store the ConfigArgs in the registry.", 
@@ -937,6 +1016,7 @@ apr_status_t mpm_service_uninstall(void)
             return (rv);
         }
         
+        /* ###: utf-ize */
         schService = OpenService(schSCManager, mpm_service_name, SERVICE_ALL_ACCESS);
 
         if (!schService) {
@@ -968,28 +1048,38 @@ apr_status_t mpm_service_uninstall(void)
     }
     else /* osver.dwPlatformId != VER_PLATFORM_WIN32_NT */
     {
+        apr_status_t rv2, rv3;
+        ap_regkey_t *key;
         fprintf(stderr,"Removing the %s service\n", mpm_display_name);
 
         /* TODO: assure the service is stopped before continuing */
 
-        if (ap_registry_delete_value(SERVICECONFIG9X, mpm_service_name)) {
-            rv = apr_get_os_error();
+        rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, SERVICECONFIG9X, 
+                            APR_WRITE, pconf);
+        if (rv == APR_SUCCESS) {
+            rv = ap_regkey_value_remove(key, mpm_service_name, pconf);
+            ap_regkey_close(key);
+        }
+        if (rv != APR_SUCCESS) {
            ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL,
                          "%s: Failed to remove the RunServices registry "
                          "entry.", mpm_display_name);
-            return (rv);
         }
         
         /* we blast Services/us, not just the Services/us/Parameters branch */
+        apr_snprintf(key_name, sizeof(key_name), SERVICEPARAMS, mpm_service_name);
+        rv2 = ap_regkey_remove(AP_REGKEY_LOCAL_MACHINE, key_name, pconf);
         apr_snprintf(key_name, sizeof(key_name), SERVICECONFIG, mpm_service_name);
-        if (ap_registry_delete_key(key_name)) 
-        {
-            rv = apr_get_os_error();
-            ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL,
+        rv3 = ap_regkey_remove(AP_REGKEY_LOCAL_MACHINE, key_name, pconf);
+        rv2 = (rv2 != APR_SUCCESS) ? rv2 : rv3;
+        if (rv2 != APR_SUCCESS) {
+            ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv2, NULL,
                          "%s: Failed to remove the service config from the "
                          "registry.", mpm_display_name);
-            return (rv);
         }
+        rv = (rv != APR_SUCCESS) ? rv : rv2;
+        if (rv != APR_SUCCESS)
+            return rv;
     }
     fprintf(stderr,"The %s service has been removed successfully.\n", mpm_display_name);
     return APR_SUCCESS;
@@ -1041,6 +1131,7 @@ apr_status_t mpm_service_start(apr_pool_t *ptemp, int argc,
             return (rv);
         }
 
+        /* ###: utf-ize */
         schService = OpenService(schSCManager, mpm_service_name, 
                                  SERVICE_START | SERVICE_QUERY_STATUS);
         if (!schService) {
@@ -1065,6 +1156,7 @@ apr_status_t mpm_service_start(apr_pool_t *ptemp, int argc,
         start_argv[argc] = NULL;
 
         rv = APR_EINIT;
+        /* ###: utf-ize */
         if (StartService(schService, argc, start_argv)
             && signal_service_transition(schService, 0, /* test only */
                                          SERVICE_START_PENDING, 
@@ -1178,7 +1270,8 @@ void mpm_signal_service(apr_pool_t *ptemp, int signal)
                          "Failed to open the NT Service Manager");
             return;
         }
-        
+
+        /* ###: utf-ize */
         schService = OpenService(schSCManager, mpm_service_name, 
                                  SERVICE_ALL_ACCESS);