⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ap_regkey.c

📁 linux网络服务器工具
💻 C
📖 第 1 页 / 共 2 页
字号:
                            (LPBYTE)wvalue, (DWORD)size);        if (rc != ERROR_SUCCESS)            return APR_FROM_OS_ERROR(rc);    }#endif /* APR_HAS_UNICODE_FS */#if APR_HAS_ANSI_FS    ELSE_WIN_OS_IS_ANSI    {        rc = RegSetValueEx(key->hkey, valuename, 0, type, value, (DWORD)size);        if (rc != ERROR_SUCCESS)            return APR_FROM_OS_ERROR(rc);    }#endif    return APR_SUCCESS;}AP_DECLARE(apr_status_t) ap_regkey_value_raw_get(void **result,                                                 apr_size_t *resultsize,                                                 apr_int32_t *resulttype,                                                 ap_regkey_t *key,                                                 const char *valuename,                                                 apr_pool_t *pool){    /* Retrieve a registry string value, and explode any envvars     * that the system has configured (e.g. %SystemRoot%/someapp.exe)     */    LONG rc;#if APR_HAS_UNICODE_FS    IF_WIN_OS_IS_UNICODE    {        apr_size_t valuelen = strlen(valuename) + 1;        apr_size_t wvallen = 256;        apr_wchar_t wvalname[256];        apr_status_t rv;        rv = apr_conv_utf8_to_ucs2(valuename, &valuelen, wvalname, &wvallen);        if (rv != APR_SUCCESS)            return rv;        else if (valuelen)            return APR_ENAMETOOLONG;        /* Read to NULL buffer to determine value size */        rc = RegQueryValueExW(key->hkey, wvalname, 0, resulttype,                              NULL, (LPDWORD)resultsize);        if (rc != ERROR_SUCCESS) {            return APR_FROM_OS_ERROR(rc);        }        /* Read value based on size query above */        *result = apr_palloc(pool, *resultsize);        rc = RegQueryValueExW(key->hkey, wvalname, 0, resulttype,                             (LPBYTE)*result, (LPDWORD)resultsize);    }#endif /* APR_HAS_UNICODE_FS */#if APR_HAS_ANSI_FS    ELSE_WIN_OS_IS_ANSI    {        /* Read to NULL buffer to determine value size */        rc = RegQueryValueEx(key->hkey, valuename, 0, resulttype,                             NULL, (LPDWORD)resultsize);        if (rc != ERROR_SUCCESS)            return APR_FROM_OS_ERROR(rc);        /* Read value based on size query above */        *result = apr_palloc(pool, *resultsize);        rc = RegQueryValueEx(key->hkey, valuename, 0, resulttype,                             (LPBYTE)*result, (LPDWORD)resultsize);        if (rc != ERROR_SUCCESS)            return APR_FROM_OS_ERROR(rc);    }#endif    if (rc != ERROR_SUCCESS) {        return APR_FROM_OS_ERROR(rc);    }    return APR_SUCCESS;}AP_DECLARE(apr_status_t) ap_regkey_value_raw_set(ap_regkey_t *key,                                                 const char *valuename,                                                 const void *value,                                                 apr_size_t valuesize,                                                 apr_int32_t valuetype,                                                 apr_pool_t *pool){    LONG rc;#if APR_HAS_UNICODE_FS    IF_WIN_OS_IS_UNICODE    {        apr_size_t valuelen = strlen(valuename) + 1;        apr_size_t wvallen = 256;        apr_wchar_t wvalname[256];        apr_status_t rv;        rv = apr_conv_utf8_to_ucs2(valuename, &valuelen, wvalname, &wvallen);        if (rv != APR_SUCCESS)            return rv;        else if (valuelen)            return APR_ENAMETOOLONG;        rc = RegSetValueExW(key->hkey, wvalname, 0, valuetype,                            (LPBYTE)value, (DWORD)valuesize);    }#endif /* APR_HAS_UNICODE_FS */#if APR_HAS_ANSI_FS    ELSE_WIN_OS_IS_ANSI    {        rc = RegSetValueEx(key->hkey, valuename, 0, valuetype,                            (LPBYTE)value, (DWORD)valuesize);    }#endif    if (rc != ERROR_SUCCESS) {        return APR_FROM_OS_ERROR(rc);    }    return APR_SUCCESS;}AP_DECLARE(apr_status_t) ap_regkey_value_array_get(apr_array_header_t **result,                                                   ap_regkey_t *key,                                                   const char *valuename,                                                   apr_pool_t *pool){    /* Retrieve a registry string value, and explode any envvars     * that the system has configured (e.g. %SystemRoot%/someapp.exe)     */    apr_status_t rv;    void *value;    char *buf;    char *tmp;    DWORD type;    apr_size_t size = 0;    rv = ap_regkey_value_raw_get(&value, &size, &type, key, valuename, pool);    if (rv != APR_SUCCESS) {        return rv;    }    else if (type != REG_MULTI_SZ) {        return APR_EINVAL;    }#if APR_HAS_UNICODE_FS    IF_WIN_OS_IS_UNICODE    {        apr_size_t alloclen;        apr_size_t valuelen = strlen(valuename) + 1;        apr_size_t wvallen = 256;        apr_wchar_t *wvalue = (apr_wchar_t *)value;        /* ###: deliberately overallocate plus two extra nulls.         * We could precalculate the exact buffer here instead, the question         * is a matter of storage v.s. cpu cycles.         */        size /= 2;        alloclen = valuelen = size * 3 + 2;        buf = apr_palloc(pool, valuelen);        rv = apr_conv_ucs2_to_utf8(value, &size, buf, &valuelen);        if (rv != APR_SUCCESS)            return rv;        else if (size)            return APR_ENAMETOOLONG;        buf[(alloclen - valuelen)] = '\0';        buf[(alloclen - valuelen) + 1] = '\0';    }#endif /* APR_HAS_UNICODE_FS */#if APR_HAS_ANSI_FS    ELSE_WIN_OS_IS_ANSI    {        /* Small possiblity the array is either unterminated         * or single NULL terminated.  Avert.         */        buf = (char *)value;        if (size < 2 || buf[size - 1] != '\0' || buf[size - 2] != '\0') {            buf = apr_palloc(pool, size + 2);            memcpy(buf, value, size);            buf[size + 1] = '\0';            buf[size] = '\0';        }    }#endif    size = 0;    /* Element Count */    for (tmp = buf; *tmp; ++tmp) {        ++size;        while (*tmp) {            ++tmp;        }    }    *result = apr_array_make(pool, (int)size, sizeof(char *));    for (tmp = buf; *tmp; ++tmp) {        char **newelem = (char **) apr_array_push(*result);        *newelem = tmp;        while (*tmp) {            ++tmp;        }    }   return APR_SUCCESS;}AP_DECLARE(apr_status_t) ap_regkey_value_array_set(ap_regkey_t *key,                                                   const char *valuename,                                                   int nelts,                                                   const char * const * elts,                                                   apr_pool_t *pool){    /* Retrieve a registry string value, and explode any envvars     * that the system has configured (e.g. %SystemRoot%/someapp.exe)     */    int i;    const void *value;    apr_size_t bufsize;#if APR_HAS_UNICODE_FS    IF_WIN_OS_IS_UNICODE    {        apr_status_t rv;        apr_wchar_t *buf;        apr_wchar_t *tmp;        apr_size_t bufrem;        bufsize = 1; /* For trailing second null */        for (i = 0; i < nelts; ++i) {            bufsize += strlen(elts[i]) + 1;        }        if (!nelts) {            ++bufsize;        }        bufrem = bufsize;        buf = apr_palloc(pool, bufsize * 2);        tmp = buf;        for (i = 0; i < nelts; ++i) {            apr_size_t eltsize = strlen(elts[i]) + 1;            apr_size_t size = eltsize;            rv = apr_conv_utf8_to_ucs2(elts[i], &size, tmp, &bufrem);            if (rv != APR_SUCCESS)                return rv;            else if (size)                return APR_ENAMETOOLONG;            tmp += eltsize;        }        if (!nelts) {            --bufrem;            (*tmp++) = L'\0';        }        --bufrem;        *tmp = L'\0'; /* Trailing second null */        bufsize = (bufsize - bufrem) * 2;        value = (void*)buf;    }#endif /* APR_HAS_UNICODE_FS */#if APR_HAS_ANSI_FS    ELSE_WIN_OS_IS_ANSI    {        char *buf;        char *tmp;        bufsize = 1; /* For trailing second null */        for (i = 0; i < nelts; ++i) {            bufsize += strlen(elts[i]) + 1;        }        if (!nelts) {            ++bufsize;        }        buf = apr_palloc(pool, bufsize);        tmp = buf;        for (i = 0; i < nelts; ++i) {            apr_size_t len = strlen(elts[i]) + 1;            memcpy(tmp, elts[i], len);            tmp += len;        }        if (!nelts) {            (*tmp++) = '\0';        }        *tmp = '\0'; /* Trailing second null */        value = buf;    }#endif    return ap_regkey_value_raw_set(key, valuename, value,                                   bufsize, REG_MULTI_SZ, pool);}AP_DECLARE(apr_status_t) ap_regkey_value_remove(const ap_regkey_t *key,                                                const char *valuename,                                                apr_pool_t *pool){    LONG rc;#if APR_HAS_UNICODE_FS    IF_WIN_OS_IS_UNICODE    {        apr_size_t valuelen = strlen(valuename) + 1;        apr_size_t wvallen = 256;        apr_wchar_t wvalname[256];        apr_status_t rv = apr_conv_utf8_to_ucs2(valuename, &valuelen, wvalname, &wvallen);        if (rv != APR_SUCCESS)            return rv;        else if (valuelen)            return APR_ENAMETOOLONG;        rc = RegDeleteValueW(key->hkey, wvalname);    }#endif /* APR_HAS_UNICODE_FS */#if APR_HAS_ANSI_FS    ELSE_WIN_OS_IS_ANSI    {        rc = RegDeleteValue(key->hkey, valuename);    }#endif    if (rc != ERROR_SUCCESS) {        return APR_FROM_OS_ERROR(rc);    }    return APR_SUCCESS;}#endif /* defined WIN32 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -