📄 registry.c
字号:
rc = RegQueryValueExW(k->key, J2W(name), NULL, NULL, (LPBYTE)vw, &l);
if (rc != ERROR_SUCCESS) {
tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(rc));
free(vw);
goto cleanup;
}
v = (*e)->NewString((e), vw, wcslen(vw));
free(vw);
}
cleanup:
TCN_FREE_WSTRING(name);
return v;
}
TCN_IMPLEMENT_CALL(jbyteArray, Registry, getValueB)(TCN_STDARGS, jlong key,
jstring name)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
TCN_ALLOC_WSTRING(name);
LONG rc;
DWORD t, l;
jbyteArray v = NULL;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
TCN_INIT_WSTRING(name);
rc = RegQueryValueExW(k->key, J2W(name), NULL, &t, NULL, &l);
if (rc != ERROR_SUCCESS) {
tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(rc));
goto cleanup;
}
if (t == REG_BINARY) {
BYTE *b = (BYTE *)malloc(l);
rc = RegQueryValueExW(k->key, J2W(name), NULL, NULL, b, &l);
if (rc != ERROR_SUCCESS) {
tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(rc));
free(b);
goto cleanup;
}
v = tcn_new_arrayb(e, b, l);
free(b);
}
cleanup:
TCN_FREE_WSTRING(name);
return v;
}
static jsize get_multi_sz_count(LPCWSTR str)
{
LPCWSTR p = str;
jsize cnt = 0;
for ( ; p && *p; p++) {
cnt++;
while (*p)
p++;
}
return cnt;
}
TCN_IMPLEMENT_CALL(jobjectArray, Registry, getValueA)(TCN_STDARGS, jlong key,
jstring name)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
TCN_ALLOC_WSTRING(name);
LONG rc;
DWORD t, l;
jobjectArray v = NULL;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
TCN_INIT_WSTRING(name);
rc = RegQueryValueExW(k->key, J2W(name), NULL, &t, NULL, &l);
if (rc != ERROR_SUCCESS) {
tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(rc));
goto cleanup;
}
if (t == REG_MULTI_SZ) {
jsize cnt = 0;
jchar *p;
jchar *vw = (jchar *)malloc(l);
rc = RegQueryValueExW(k->key, J2W(name), NULL, NULL, (LPBYTE)vw, &l);
if (rc != ERROR_SUCCESS) {
tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(rc));
free(vw);
goto cleanup;
}
cnt = get_multi_sz_count(vw);
if (cnt) {
jsize idx = 0;
v = tcn_new_arrays(e, cnt);
for (p = vw ; p && *p; p++) {
jstring s;
jchar *b = p;
while (*p)
p++;
s = (*e)->NewString((e), b, (jsize)(p - b));
(*e)->SetObjectArrayElement((e), v, idx++, s);
}
}
free(vw);
}
cleanup:
TCN_FREE_WSTRING(name);
return v;
}
TCN_IMPLEMENT_CALL(jint, Registry, setValueI)(TCN_STDARGS, jlong key,
jstring name, jint val)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
TCN_ALLOC_WSTRING(name);
LONG rc;
DWORD v = (DWORD)val;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
TCN_INIT_WSTRING(name);
rc = RegSetValueExW(k->key, J2W(name), 0, REG_DWORD, (CONST BYTE *)&v, sizeof(DWORD));
TCN_FREE_WSTRING(name);
return v;
}
TCN_IMPLEMENT_CALL(jint, Registry, setValueJ)(TCN_STDARGS, jlong key,
jstring name, jlong val)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
TCN_ALLOC_WSTRING(name);
LONG rc;
UINT64 v = (UINT64)val;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
TCN_INIT_WSTRING(name);
rc = RegSetValueExW(k->key, J2W(name), 0, REG_QWORD, (CONST BYTE *)&v, sizeof(UINT64));
TCN_FREE_WSTRING(name);
return rc;
}
TCN_IMPLEMENT_CALL(jint, Registry, setValueS)(TCN_STDARGS, jlong key,
jstring name, jstring val)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
TCN_ALLOC_WSTRING(name);
TCN_ALLOC_WSTRING(val);
LONG rc;
DWORD len;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
TCN_INIT_WSTRING(name);
TCN_INIT_WSTRING(val);
len = wcslen(J2W(val));
rc = RegSetValueExW(k->key, J2W(name), 0, REG_SZ,
(CONST BYTE *)J2W(val), (len + 1) * 2);
TCN_FREE_WSTRING(name);
TCN_FREE_WSTRING(val);
return rc;
}
TCN_IMPLEMENT_CALL(jint, Registry, setValueE)(TCN_STDARGS, jlong key,
jstring name, jstring val)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
TCN_ALLOC_WSTRING(name);
TCN_ALLOC_WSTRING(val);
LONG rc;
DWORD len;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
TCN_INIT_WSTRING(name);
TCN_INIT_WSTRING(val);
len = wcslen(J2W(val));
rc = RegSetValueExW(k->key, J2W(name), 0, REG_EXPAND_SZ,
(CONST BYTE *)J2W(val), (len + 1) * 2);
TCN_FREE_WSTRING(name);
TCN_FREE_WSTRING(val);
return rc;
}
TCN_IMPLEMENT_CALL(jint, Registry, setValueA)(TCN_STDARGS, jlong key,
jstring name,
jobjectArray vals)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
TCN_ALLOC_WSTRING(name);
LONG rc;
jsize i, len;
jsize sl = 0;
jchar *msz, *p;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
TCN_INIT_WSTRING(name);
len = (*e)->GetArrayLength((e), vals);
for (i = 0; i < len; i++) {
jstring s = (jstring)(*e)->GetObjectArrayElement((e), vals, i);
sl += (*e)->GetStringLength((e), s) + 1;
}
sl = (sl + 1) * 2;
p = msz = (jchar *)calloc(1, sl);
for (i = 0; i < len; i++) {
jsize l;
jstring s = (jstring)(*e)->GetObjectArrayElement((e), vals, i);
l = (*e)->GetStringLength((e), s);
wcsncpy(p, (*e)->GetStringChars(e, s, 0), l);
p += l + 1;
}
rc = RegSetValueExW(k->key, J2W(name), 0, REG_MULTI_SZ,
(CONST BYTE *)msz, sl);
TCN_FREE_WSTRING(name);
free(msz);
return rc;
}
TCN_IMPLEMENT_CALL(jint, Registry, setValueB)(TCN_STDARGS, jlong key,
jstring name,
jbyteArray val)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
TCN_ALLOC_WSTRING(name);
jsize nbytes = (*e)->GetArrayLength(e, val);
jbyte *bytes = (*e)->GetByteArrayElements(e, val, NULL);
LONG rc;
rc = RegSetValueExW(k->key, J2W(name), 0, REG_BINARY,
bytes, (DWORD)nbytes);
(*e)->ReleaseByteArrayElements(e, val, bytes, JNI_ABORT);
TCN_FREE_WSTRING(name);
return rc;
}
#define MAX_VALUE_NAME 4096
TCN_IMPLEMENT_CALL(jobjectArray, Registry, enumKeys)(TCN_STDARGS, jlong key)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
LONG rc;
jobjectArray v = NULL;
jsize cnt = 0;
WCHAR achKey[MAX_PATH];
WCHAR achClass[MAX_PATH] = L"";
DWORD cchClassName = MAX_PATH;
DWORD cSubKeys;
DWORD cbMaxSubKey;
DWORD cchMaxClass;
DWORD cValues;
DWORD cchMaxValue;
DWORD cbMaxValueData;
DWORD cbSecurityDescriptor;
FILETIME ftLastWriteTime;
DWORD cchValue = MAX_VALUE_NAME;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
rc = RegQueryInfoKeyW(k->key,
achClass,
&cchClassName,
NULL,
&cSubKeys,
&cbMaxSubKey,
&cchMaxClass,
&cValues,
&cchMaxValue,
&cbMaxValueData,
&cbSecurityDescriptor,
&ftLastWriteTime);
if (rc != ERROR_SUCCESS) {
tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(rc));
goto cleanup;
}
cnt = cSubKeys;
if (cnt) {
jsize idx = 0;
v = tcn_new_arrays(e, cnt);
for (idx = 0; idx < cnt; idx++) {
jstring s;
DWORD achKeyLen = MAX_PATH;
rc = RegEnumKeyExW(k->key,
idx,
achKey,
&achKeyLen,
NULL,
NULL,
NULL,
&ftLastWriteTime);
if (rc == (DWORD)ERROR_SUCCESS) {
s = (*e)->NewString((e), achKey, wcslen(achKey));
(*e)->SetObjectArrayElement((e), v, idx, s);
}
}
}
cleanup:
return v;
}
TCN_IMPLEMENT_CALL(jobjectArray, Registry, enumValues)(TCN_STDARGS, jlong key)
{
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
LONG rc;
jobjectArray v = NULL;
jsize cnt = 0;
WCHAR achClass[MAX_PATH] = L"";
DWORD cchClassName = MAX_PATH;
DWORD cSubKeys;
DWORD cbMaxSubKey;
DWORD cchMaxClass;
DWORD cValues;
DWORD cchMaxValue;
DWORD cbMaxValueData;
DWORD cbSecurityDescriptor;
FILETIME ftLastWriteTime;
WCHAR achValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
UNREFERENCED(o);
TCN_ASSERT(key != 0);
/* Get the class name and the value count. */
rc = RegQueryInfoKeyW(k->key,
achClass,
&cchClassName,
NULL,
&cSubKeys,
&cbMaxSubKey,
&cchMaxClass,
&cValues,
&cchMaxValue,
&cbMaxValueData,
&cbSecurityDescriptor,
&ftLastWriteTime);
if (rc != ERROR_SUCCESS) {
tcn_ThrowAPRException(e, APR_FROM_OS_ERROR(rc));
goto cleanup;
}
cnt = cValues;
if (cnt) {
jsize idx = 0;
v = tcn_new_arrays(e, cnt);
for (idx = 0; idx < cnt; idx++) {
jstring s;
cchValue = MAX_VALUE_NAME;
achValue[0] = '\0';
rc = RegEnumValueW(k->key, idx,
achValue,
&cchValue,
NULL,
NULL, // &dwType,
NULL, // &bData,
NULL); // &bcData
if (rc == (DWORD)ERROR_SUCCESS) {
s = (*e)->NewString((e), achValue, wcslen(achValue));
(*e)->SetObjectArrayElement((e), v, idx, s);
}
}
}
cleanup:
return v;
}
TCN_IMPLEMENT_CALL(jint, Registry, deleteKey)(TCN_STDARGS, jint root, jstring name,
jboolean only_if_empty)
{
DWORD rv;
TCN_ALLOC_WSTRING(name);
UNREFERENCED(o);
if (root < TCN_HKEY_CLASSES_ROOT || root > TCN_HKEY_USERS) {
rv = EBADF;
goto cleanup;
}
if (only_if_empty)
rv = SHDeleteEmptyKeyW(TCN_KEYS[root].k, J2W(name));
else
rv = SHDeleteKeyW(TCN_KEYS[root].k, J2W(name));
cleanup:
TCN_FREE_WSTRING(name);
return rv;
}
TCN_IMPLEMENT_CALL(jint, Registry, deleteValue)(TCN_STDARGS, jlong key,
jstring name)
{
LONG rv;
TCN_ALLOC_WSTRING(name);
tcn_nt_registry_t *k = J2P(key, tcn_nt_registry_t *);
UNREFERENCED(o);
rv = RegDeleteValueW(k->key, J2W(name));
TCN_FREE_WSTRING(name);
return (jint)rv;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -