📄 ap_regkey.c
字号:
(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 + -