📄 registry.c
字号:
&num_values, NULL, NULL, NULL, NULL); torture_assert_werr_ok(tctx, error, "get info key"); torture_assert_int_equal(tctx, num_subkeys, 1, "num subkeys"); torture_assert_int_equal(tctx, num_values, 1, "num values"); return true;}/** * Test that the subkeys of a key can be enumerated, that * the returned parameters for get_subkey_by_index are optional and * that enumerating the parents of a non-top-level node works. */static bool test_list_subkeys(struct torture_context *tctx, void *_data){ struct registry_context *rctx = (struct registry_context *)_data; struct registry_key *subkey = NULL, *root; WERROR error; NTTIME last_mod_time; const char *classname, *name; if (!create_test_key(tctx, rctx, "Goettingen", &root, &subkey)) return false; error = reg_key_get_subkey_by_index(tctx, root, 0, &name, &classname, &last_mod_time); torture_assert_werr_ok(tctx, error, "Enum keys return code"); torture_assert_str_equal(tctx, name, "Goettingen", "Enum keys data"); error = reg_key_get_subkey_by_index(tctx, root, 0, NULL, NULL, NULL); torture_assert_werr_ok(tctx, error, "Enum keys with NULL arguments return code"); error = reg_key_get_subkey_by_index(tctx, root, 1, NULL, NULL, NULL); torture_assert_werr_equal(tctx, error, WERR_NO_MORE_ITEMS, "Invalid error for no more items"); error = reg_key_get_subkey_by_index(tctx, subkey, 0, NULL, NULL, NULL); torture_assert_werr_equal(tctx, error, WERR_NO_MORE_ITEMS, "Invalid error for no more items"); return true;}/** * Test setting a value */static bool test_set_value(struct torture_context *tctx, void *_data){ struct registry_context *rctx = (struct registry_context *)_data; struct registry_key *subkey = NULL, *root; WERROR error; char data[4]; SIVAL(data, 0, 42); if (!create_test_key(tctx, rctx, "Dusseldorf", &root, &subkey)) return false; error = reg_val_set(subkey, "Answer", REG_DWORD, data_blob_talloc(tctx, data, sizeof(data))); torture_assert_werr_ok (tctx, error, "setting value"); return true;}/** * Test getting/setting security descriptors */static bool test_security(struct torture_context *tctx, void *_data){ struct registry_context *rctx = (struct registry_context *)_data; struct registry_key *subkey = NULL, *root; WERROR error; struct security_descriptor *osd, *nsd; if (!create_test_key(tctx, rctx, "Düsseldorf", &root, &subkey)) return false; osd = security_descriptor_dacl_create(tctx, 0, NULL, NULL, SID_NT_AUTHENTICATED_USERS, SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_GENERIC_ALL, SEC_ACE_FLAG_OBJECT_INHERIT, NULL); error = reg_set_sec_desc(subkey, osd); torture_assert_werr_ok(tctx, error, "setting security descriptor"); error = reg_get_sec_desc(tctx, subkey, &nsd); torture_assert_werr_ok (tctx, error, "getting security descriptor"); torture_assert(tctx, security_descriptor_equal(osd, nsd), "security descriptor changed!"); return true;}/** * Test getting a value */static bool test_get_value(struct torture_context *tctx, void *_data){ struct registry_context *rctx = (struct registry_context *)_data; struct registry_key *subkey = NULL, *root; WERROR error; DATA_BLOB data; char value[4]; uint32_t type; SIVAL(value, 0, 42); if (!create_test_key(tctx, rctx, "Duisburg", &root, &subkey)) return false; error = reg_key_get_value_by_name(tctx, subkey, __FUNCTION__, &type, &data); torture_assert_werr_equal(tctx, error, WERR_BADFILE, "getting missing value"); error = reg_val_set(subkey, __FUNCTION__, REG_DWORD, data_blob_talloc(tctx, value, sizeof(value))); torture_assert_werr_ok(tctx, error, "setting value"); error = reg_key_get_value_by_name(tctx, subkey, __FUNCTION__, &type, &data); torture_assert_werr_ok(tctx, error, "getting value"); torture_assert_int_equal(tctx, sizeof(value), data.length, "value length ok"); torture_assert_mem_equal(tctx, data.data, value, sizeof(value), "value content ok"); torture_assert_int_equal(tctx, REG_DWORD, type, "value type"); return true;}/** * Test unsetting a value */static bool test_del_value(struct torture_context *tctx, void *_data){ struct registry_context *rctx =(struct registry_context *)_data; struct registry_key *subkey = NULL, *root; WERROR error; DATA_BLOB data; uint32_t type; char value[4]; SIVAL(value, 0, 42); if (!create_test_key(tctx, rctx, "Warschau", &root, &subkey)) return false; error = reg_key_get_value_by_name(tctx, subkey, __FUNCTION__, &type, &data); torture_assert_werr_equal(tctx, error, WERR_BADFILE, "getting missing value"); error = reg_val_set(subkey, __FUNCTION__, REG_DWORD, data_blob_talloc(tctx, value, sizeof(value))); torture_assert_werr_ok (tctx, error, "setting value"); error = reg_del_value(subkey, __FUNCTION__); torture_assert_werr_ok (tctx, error, "unsetting value"); error = reg_key_get_value_by_name(tctx, subkey, __FUNCTION__, &type, &data); torture_assert_werr_equal(tctx, error, WERR_BADFILE, "getting missing value"); return true;}/** * Test listing values */static bool test_list_values(struct torture_context *tctx, void *_data){ struct registry_context *rctx = (struct registry_context *)_data; struct registry_key *subkey = NULL, *root; WERROR error; DATA_BLOB data; uint32_t type; const char *name; char value[4]; SIVAL(value, 0, 42); if (!create_test_key(tctx, rctx, "Bonn", &root, &subkey)) return false; error = reg_val_set(subkey, "bar", REG_DWORD, data_blob_talloc(tctx, value, sizeof(value))); torture_assert_werr_ok (tctx, error, "setting value"); error = reg_key_get_value_by_index(tctx, subkey, 0, &name, &type, &data); torture_assert_werr_ok(tctx, error, "getting value"); torture_assert_str_equal(tctx, name, "bar", "value name"); torture_assert_int_equal(tctx, sizeof(value), data.length, "value length"); torture_assert_mem_equal(tctx, data.data, value, sizeof(value), "value content"); torture_assert_int_equal(tctx, REG_DWORD, type, "value type"); error = reg_key_get_value_by_index(tctx, subkey, 1, &name, &type, &data); torture_assert_werr_equal(tctx, error, WERR_NO_MORE_ITEMS, "getting missing value"); return true;}static bool setup_local_registry(struct torture_context *tctx, void **data){ struct registry_context *rctx; WERROR error; char *tempdir; NTSTATUS status; struct hive_key *hive_key; const char *filename; error = reg_open_local(tctx, &rctx); torture_assert_werr_ok(tctx, error, "Opening local registry failed"); status = torture_temp_dir(tctx, "registry-local", &tempdir); torture_assert_ntstatus_ok(tctx, status, "Creating temp dir failed"); filename = talloc_asprintf(tctx, "%s/classes_root.ldb", tempdir); error = reg_open_ldb_file(tctx, filename, NULL, NULL, tctx->ev, tctx->lp_ctx, &hive_key); torture_assert_werr_ok(tctx, error, "Opening classes_root file failed"); error = reg_mount_hive(rctx, hive_key, HKEY_CLASSES_ROOT, NULL); torture_assert_werr_ok(tctx, error, "Mounting hive failed"); *data = rctx; return true;}static void tcase_add_tests(struct torture_tcase *tcase){ torture_tcase_add_simple_test(tcase, "list_subkeys", test_list_subkeys); torture_tcase_add_simple_test(tcase, "get_predefined_key", test_get_predefined); torture_tcase_add_simple_test(tcase, "get_predefined_key", test_get_predefined_unknown); torture_tcase_add_simple_test(tcase, "create_key", test_create_subkey); torture_tcase_add_simple_test(tcase, "create_key", test_create_nested_subkey); torture_tcase_add_simple_test(tcase, "key_add_abs", test_key_add_abs); torture_tcase_add_simple_test(tcase, "key_add_abs_top", test_key_add_abs_top); torture_tcase_add_simple_test(tcase, "set_value", test_set_value); torture_tcase_add_simple_test(tcase, "get_value", test_get_value); torture_tcase_add_simple_test(tcase, "list_values", test_list_values); torture_tcase_add_simple_test(tcase, "del_key", test_del_key); torture_tcase_add_simple_test(tcase, "del_value", test_del_value); torture_tcase_add_simple_test(tcase, "flush_key", test_flush_key); torture_tcase_add_simple_test(tcase, "query_key", test_query_key); torture_tcase_add_simple_test(tcase, "query_key_nums", test_query_key_nums); torture_tcase_add_simple_test(tcase, "test_predef_key_by_name", test_predef_key_by_name); torture_tcase_add_simple_test(tcase, "security", test_security); torture_tcase_add_simple_test(tcase,"test_predef_key_by_name_invalid", test_predef_key_by_name_invalid);}struct torture_suite *torture_registry_registry(TALLOC_CTX *mem_ctx){ struct torture_tcase *tcase; struct torture_suite *suite = torture_suite_create(mem_ctx, "REGISTRY"); tcase = torture_suite_add_tcase(suite, "local"); torture_tcase_set_fixture(tcase, setup_local_registry, NULL); tcase_add_tests(tcase); return suite;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -