Imported Upstream version 2.7
[ossec-hids.git] / src / win32 / read-registry.c
1 #include "shared.h"
2 #include "os_crypto/md5/md5_op.h"
3 #include "os_crypto/sha1/sha1_op.h"
4
5 /* Default values */
6 #define MAX_KEY_LENGTH 255
7 #define MAX_KEY 2048
8 #define MAX_VALUE_NAME 16383
9
10 char *(os_winreg_ignore_list[]) = {"SOFTWARE\\Classes","test123",NULL};
11
12 HKEY sub_tree;
13 int os_winreg_open_key(char *subkey);
14
15 void os_winreg_querykey(HKEY hKey, char *p_key)
16 {
17     int i, rc;
18     DWORD j;
19
20     /* QueryInfo and EnumKey variables */
21     TCHAR sub_key_name_b[MAX_KEY_LENGTH +1];
22     TCHAR class_name_b[MAX_PATH +1];
23     DWORD sub_key_name_s;
24     DWORD class_name_s = MAX_PATH;
25
26     /* Number of sub keys */
27     DWORD subkey_count = 0;
28
29     /* Number of values */
30     DWORD value_count;
31
32     /* Variables for RegEnumValue */
33     TCHAR value_buffer[MAX_VALUE_NAME +1];
34     TCHAR data_buffer[MAX_VALUE_NAME +1];
35     DWORD value_size;
36     DWORD data_size;
37
38     /* Data type for RegEnumValue */
39     DWORD data_type = 0;
40
41
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';
47
48
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);
53
54     /* Check return code of QueryInfo */
55     if(rc != ERROR_SUCCESS)
56     {
57         return;
58     }
59
60
61
62     /* Checking if we have sub keys */
63     if(subkey_count)
64     {
65         /* We open each subkey and call open_key */
66         for(i=0;i<subkey_count;i++)
67         {
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);
71
72             /* Checking for the rc. */
73             if(rc == ERROR_SUCCESS)
74             {
75                 char new_key[MAX_KEY_LENGTH + 2];
76                 new_key[MAX_KEY_LENGTH +1] = '\0';
77
78                 if(p_key)
79                 {
80                     snprintf(new_key, MAX_KEY_LENGTH,
81                                       "%s\\%s", p_key, sub_key_name_b);
82                 }
83                 else
84                 {
85                     snprintf(new_key, MAX_KEY_LENGTH, "%s", sub_key_name_b);
86                 }
87
88                 /* Opening subkey */
89                 os_winreg_open_key(new_key);
90             }
91         }
92     }
93
94     /* Getting Values (if available) */
95     if (value_count)
96     {
97         /* md5 and sha1 sum */
98         os_md5 mf_sum;
99         os_sha1 sf_sum;
100
101
102         /* Clearing the values for value_size and data_size */
103         value_buffer[MAX_VALUE_NAME] = '\0';
104         data_buffer[MAX_VALUE_NAME] = '\0';
105
106         for(i=0;i<value_count;i++)
107         {
108             value_size = MAX_VALUE_NAME;
109             data_size = MAX_VALUE_NAME;
110
111             value_buffer[0] = '\0';
112             data_buffer[0] = '\0';
113
114             rc = RegEnumValue(hKey, i, value_buffer, &value_size,
115                     NULL, &data_type, data_buffer, &data_size);
116
117             /* No more values available */
118             if(rc != ERROR_SUCCESS)
119             {
120                 break;
121             }
122
123             /* Checking if no value name is specified */
124             if(value_buffer[0] == '\0')
125             {
126                 value_buffer[0] = '@';
127                 value_buffer[1] = '\0';
128             }
129             printf("   (%d) %s=", i+1, value_buffer);
130             switch(data_type)
131             {
132                 case REG_SZ:
133                 case REG_EXPAND_SZ:
134                     printf("%s\n", data_buffer);
135                     break;
136                 case REG_MULTI_SZ:
137                     /* Printing multiple strings */
138                     printf("MULTI_SZ:");
139                     char *mt_data;
140
141                     mt_data = data_buffer;
142                     while(*mt_data)
143                     {
144                         printf("%s ", mt_data);
145                         mt_data += strlen(mt_data) +1;
146                     }
147                     printf("\n");
148                     break;
149                 case REG_DWORD:
150                     printf("%08x\n", (unsigned int)*data_buffer);       
151                     break;
152                 default:
153                     printf("UNSUPPORTED(%d-%d):", (int)data_type, data_size);
154                     for(j = 0;j<data_size;j++)
155                     {
156                         printf("%02x", (unsigned int)data_buffer[j]);
157                     }
158                     printf("\n");
159                     break;      
160             }
161
162             /* Generating checksum of the values */
163
164         }
165     }
166 }
167
168
169 /* Open the registry key */
170 int os_winreg_open_key(char *subkey)
171 {
172     int i = 0;  
173     HKEY oshkey;
174
175
176     /* Registry ignore list */
177     if(subkey)
178     {
179         while(os_winreg_ignore_list[i] != NULL)
180         {
181             if(strcasecmp(os_winreg_ignore_list[i], subkey) == 0)
182             {
183                 return(0);
184             }
185             i++;
186         }
187     }
188
189     if(RegOpenKeyEx(sub_tree, subkey, 0, KEY_READ, &oshkey) != ERROR_SUCCESS)
190     {
191         return(0);
192     }
193
194     os_winreg_querykey(oshkey, subkey);
195     RegCloseKey(sub_tree);
196 }
197
198
199 /* Main function to read the registry.
200  */
201 int main(void)
202 {
203     sub_tree = HKEY_LOCAL_MACHINE;
204     char *rk = NULL;
205
206     os_winreg_open_key(rk);
207
208     return(0);
209 }
210