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 int os_winreg_open_key(char *subkey);
15 void os_winreg_querykey(HKEY hKey, char *p_key)
20 /* QueryInfo and EnumKey variables */
21 TCHAR sub_key_name_b[MAX_KEY_LENGTH +1];
22 TCHAR class_name_b[MAX_PATH +1];
24 DWORD class_name_s = MAX_PATH;
26 /* Number of sub keys */
27 DWORD subkey_count = 0;
29 /* Number of values */
32 /* Variables for RegEnumValue */
33 TCHAR value_buffer[MAX_VALUE_NAME +1];
34 TCHAR data_buffer[MAX_VALUE_NAME +1];
38 /* Data type for RegEnumValue */
42 /* Initializing 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';
49 /* We use the class_name, subkey_count and the value count. */
50 rc = RegQueryInfoKey(hKey, class_name_b, &class_name_s, NULL,
51 &subkey_count, NULL, NULL, &value_count,
52 NULL, NULL, NULL, NULL);
54 /* Check return code of QueryInfo */
55 if(rc != ERROR_SUCCESS)
62 /* Checking if we have sub keys */
65 /* We open each subkey and call open_key */
66 for(i=0;i<subkey_count;i++)
68 sub_key_name_s = MAX_KEY_LENGTH;
69 rc = RegEnumKeyEx(hKey, i, sub_key_name_b, &sub_key_name_s,
70 NULL, NULL, NULL, NULL);
72 /* Checking for the rc. */
73 if(rc == ERROR_SUCCESS)
75 char new_key[MAX_KEY_LENGTH + 2];
76 new_key[MAX_KEY_LENGTH +1] = '\0';
80 snprintf(new_key, MAX_KEY_LENGTH,
81 "%s\\%s", p_key, sub_key_name_b);
85 snprintf(new_key, MAX_KEY_LENGTH, "%s", sub_key_name_b);
89 os_winreg_open_key(new_key);
94 /* Getting Values (if available) */
97 /* md5 and sha1 sum */
102 /* Clearing the values for value_size and data_size */
103 value_buffer[MAX_VALUE_NAME] = '\0';
104 data_buffer[MAX_VALUE_NAME] = '\0';
106 for(i=0;i<value_count;i++)
108 value_size = MAX_VALUE_NAME;
109 data_size = MAX_VALUE_NAME;
111 value_buffer[0] = '\0';
112 data_buffer[0] = '\0';
114 rc = RegEnumValue(hKey, i, value_buffer, &value_size,
115 NULL, &data_type, data_buffer, &data_size);
117 /* No more values available */
118 if(rc != ERROR_SUCCESS)
123 /* Checking if no value name is specified */
124 if(value_buffer[0] == '\0')
126 value_buffer[0] = '@';
127 value_buffer[1] = '\0';
129 printf(" (%d) %s=", i+1, value_buffer);
134 printf("%s\n", data_buffer);
137 /* Printing multiple strings */
141 mt_data = data_buffer;
144 printf("%s ", mt_data);
145 mt_data += strlen(mt_data) +1;
150 printf("%08x\n", (unsigned int)*data_buffer);
153 printf("UNSUPPORTED(%d-%d):", (int)data_type, data_size);
154 for(j = 0;j<data_size;j++)
156 printf("%02x", (unsigned int)data_buffer[j]);
162 /* Generating checksum of the values */
169 /* Open the registry key */
170 int os_winreg_open_key(char *subkey)
176 /* Registry ignore list */
179 while(os_winreg_ignore_list[i] != NULL)
181 if(strcasecmp(os_winreg_ignore_list[i], subkey) == 0)
189 if(RegOpenKeyEx(sub_tree, subkey, 0, KEY_READ, &oshkey) != ERROR_SUCCESS)
194 os_winreg_querykey(oshkey, subkey);
195 RegCloseKey(sub_tree);
199 /* Main function to read the registry.
203 sub_tree = HKEY_LOCAL_MACHINE;
206 os_winreg_open_key(rk);