2 #include "os_crypto/md5/md5_op.h"
3 #include "os_crypto/sha1/sha1_op.h"
6 #define MAX_KEY_LENGTH 255
8 #define MAX_VALUE_NAME 16383
10 char *(os_winreg_ignore_list[]) = {"SOFTWARE\\Classes", "test123", NULL};
13 void os_winreg_open_key(char *subkey);
16 void os_winreg_querykey(HKEY hKey, char *p_key)
21 /* QueryInfo and EnumKey variables */
22 TCHAR sub_key_name_b[MAX_KEY_LENGTH + 1];
23 TCHAR class_name_b[MAX_PATH + 1];
25 DWORD class_name_s = MAX_PATH;
27 /* Number of sub keys */
28 DWORD subkey_count = 0;
30 /* Number of values */
33 /* Variables for RegEnumValue */
34 TCHAR value_buffer[MAX_VALUE_NAME + 1];
35 TCHAR data_buffer[MAX_VALUE_NAME + 1];
39 /* Data type for RegEnumValue */
42 /* Initialize the memory for some variables */
43 class_name_b[0] = '\0';
44 class_name_b[MAX_PATH] = '\0';
45 sub_key_name_b[0] = '\0';
46 sub_key_name_b[MAX_KEY_LENGTH] = '\0';
48 /* We only use the class_name, subkey_count and value count */
49 rc = RegQueryInfoKey(hKey, class_name_b, &class_name_s, NULL,
50 &subkey_count, NULL, NULL, &value_count,
51 NULL, NULL, NULL, NULL);
53 /* Check return code of QueryInfo */
54 if (rc != ERROR_SUCCESS) {
58 /* Check if we have sub keys */
60 /* Open each subkey and call open_key */
61 for (i = 0; i < subkey_count; i++) {
62 sub_key_name_s = MAX_KEY_LENGTH;
63 rc = RegEnumKeyEx(hKey, i, sub_key_name_b, &sub_key_name_s,
64 NULL, NULL, NULL, NULL);
66 /* Check for the rc */
67 if (rc == ERROR_SUCCESS) {
68 char new_key[MAX_KEY_LENGTH + 2];
69 new_key[MAX_KEY_LENGTH + 1] = '\0';
72 snprintf(new_key, MAX_KEY_LENGTH,
73 "%s\\%s", p_key, sub_key_name_b);
75 snprintf(new_key, MAX_KEY_LENGTH, "%s", sub_key_name_b);
79 os_winreg_open_key(new_key);
84 /* Get Values (if available) */
90 /* Clear the values for value_size and data_size */
91 value_buffer[MAX_VALUE_NAME] = '\0';
92 data_buffer[MAX_VALUE_NAME] = '\0';
94 for (i = 0; i < value_count; i++) {
95 value_size = MAX_VALUE_NAME;
96 data_size = MAX_VALUE_NAME;
98 value_buffer[0] = '\0';
99 data_buffer[0] = '\0';
101 rc = RegEnumValue(hKey, i, value_buffer, &value_size,
102 NULL, &data_type, data_buffer, &data_size);
104 /* No more values available */
105 if (rc != ERROR_SUCCESS) {
109 /* Check if no value name is specified */
110 if (value_buffer[0] == '\0') {
111 value_buffer[0] = '@';
112 value_buffer[1] = '\0';
114 printf(" (%d) %s=", i + 1, value_buffer);
118 printf("%s\n", data_buffer);
121 /* Print multiple strings */
125 mt_data = data_buffer;
127 printf("%s ", mt_data);
128 mt_data += strlen(mt_data) + 1;
133 printf("%08x\n", (unsigned int)*data_buffer);
136 printf("UNSUPPORTED(%d-%d):", (int)data_type, data_size);
137 for (j = 0; j < data_size; j++) {
138 printf("%02x", (unsigned int)data_buffer[j]);
147 /* Open the registry key */
148 void os_winreg_open_key(char *subkey)
153 /* Registry ignore list */
155 while (os_winreg_ignore_list[i] != NULL) {
156 if (strcasecmp(os_winreg_ignore_list[i], subkey) == 0) {
163 if(RegOpenKeyEx(sub_tree, subkey, 0, (KEY_READ | KEY_WOW64_64KEY), &oshkey) != ERROR_SUCCESS)
165 merror(SK_REG_OPEN64, ARGV0, subkey);
169 if(RegOpenKeyEx(sub_tree, subkey, 0, (KEY_READ | KEY_WOW64_32KEY), &oshkey) != ERROR_SUCCESS)
171 merror(SK_REG_OPEN, ARGV0, subkey);
175 os_winreg_querykey(oshkey, subkey);
176 RegCloseKey(sub_tree);
179 /* Main function to read the registry */
182 sub_tree = HKEY_LOCAL_MACHINE;
185 os_winreg_open_key(rk);