|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 Microsoft Corporation
4:
5: Module Name:
6:
7: registry.c
8:
9: Abstract:
10:
11: This file implements the apis for DRWTSN32 to access the registry.
12: All access to the registry are done in this file. If additional
13: registry control is needed then a function should be added in this file
14: and exposed to the other files in DRWTSN32.
15:
16: Author:
17:
18: Wesley Witt (wesw) 1-May-1993
19:
20: Environment:
21:
22: User Mode
23:
24: --*/
25:
26: #include <windows.h>
27: #include <stdlib.h>
28: #include <stdio.h>
29: #include <string.h>
30:
31: #include "drwatson.h"
32: #include "proto.h"
33: #include "messages.h"
34:
35:
36: //
37: // string constants for accessing the registry
38: // there is a string constant here for each key and each value
39: // that is accessed in the registry.
40: //
41: #define DRWATSON_EXE_NAME "drwtsn32.exe"
42: #define REGKEY_SOFTWARE "software\\microsoft"
43: #define REGKEY_MESSAGEFILE "EventMessageFile"
44: #define REGKEY_TYPESSUPP "TypesSupported"
45: #define REGKEY_SYSTEMROOT "%SystemRoot%\\System32\\"
46: #define REGKEY_EVENTLOG "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\"
47: #define REGKEY_APPNAME "ApplicationName"
48: #define REGKEY_FUNCTION "FunctionName"
49: #define REGKEY_EXCEPTIONCODE "ExceptionCode"
50: #define REGKEY_ADDRESS "Address"
51: #define REGKEY_LOG_PATH "LogFilePath"
52: #define REGKEY_DUMPSYMBOLS "DumpSymbols"
53: #define REGKEY_DUMPALLTHREADS "DumpAllThreads"
54: #define REGKEY_APPENDTOLOGFILE "AppendToLogFile"
55: #define REGKEY_INSTRUCTIONS "Instructions"
56: #define REGKEY_VISUAL "VisualNotification"
57: #define REGKEY_SOUND "SoundNotification"
58: #define REGKEY_WAVE_FILE "WaveFile"
59: #define REGKEY_NUM_CRASHES "NumberOfCrashes"
60: #define REGKEY_MAX_CRASHES "MaximumCrashes"
61: #define REGKEY_CURRENTVERSION "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
62: #define REGKEY_CURRENT_BUILD "CurrentBuild"
63: #define REGKEY_CURRENT_TYPE "CurrentType"
64: #define REGKEY_REG_ORGANIZATION "RegisteredOrganization"
65: #define REGKEY_REG_OWNER "RegisteredOwner"
66: #define REGKEY_AEDEBUG "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"
67: #define REGKEY_AUTO "Auto"
68: #define REGKEY_DEBUGGER "Debugger"
69:
70:
71: //
72: // local prototypes
73: //
74: void RegSetDWORD( HKEY hkey, char *szSubKey, DWORD dwValue );
75: void RegSetBOOL( HKEY hkey, char *szSubKey, BOOL dwValue );
76: void RegSetSZ( HKEY hkey, char *szSubKey, char *szValue );
77: void RegSetEXPANDSZ( HKEY hkey, char *szSubKey, char *szValue );
78: BOOL RegQueryBOOL( HKEY hkey, char *szSubKey );
79: DWORD RegQueryDWORD( HKEY hkey, char *szSubKey );
80: void RegQuerySZ( HKEY hkey, char *szSubKey, char *szValue );
81: BOOL RegSaveAllValues( HKEY hKeyDrWatson, POPTIONS o );
82: BOOL RegGetAllValues( POPTIONS o, HKEY hKeyDrWatson );
83: BOOL RegInitializeDefaults( HKEY hKeyDrWatson );
84: HKEY RegGetAppKey( void );
85: BOOL RegCreateEventSource( void );
86:
87:
88:
89: BOOL
90: RegGetAllValues( POPTIONS o, HKEY hKeyDrWatson )
91:
92: /*++
93:
94: Routine Description:
95:
96: This functions retrieves all registry data for DRWTSN32 and puts
97: the data in the OPTIONS structure passed in.
98:
99: Arguments:
100:
101: o - pointer to an OPTIONS structure
102: hKeyDrWatson - handle to a registry key for DRWTSN32 registry data
103:
104: Return Value:
105:
106: TRUE - retrieved all data without error
107: FALSE - errors occurred and did not get all data
108:
109: --*/
110:
111: {
112: RegQuerySZ( hKeyDrWatson, REGKEY_LOG_PATH, o->szLogPath );
113: RegQuerySZ( hKeyDrWatson, REGKEY_WAVE_FILE, o->szWaveFile );
114: o->fDumpSymbols = RegQueryBOOL( hKeyDrWatson, REGKEY_DUMPSYMBOLS );
115: o->fDumpAllThreads = RegQueryBOOL( hKeyDrWatson, REGKEY_DUMPALLTHREADS );
116: o->fAppendToLogFile = RegQueryBOOL( hKeyDrWatson, REGKEY_APPENDTOLOGFILE );
117: o->fVisual = RegQueryBOOL( hKeyDrWatson, REGKEY_VISUAL );
118: o->fSound = RegQueryBOOL( hKeyDrWatson, REGKEY_SOUND );
119: o->dwInstructions = RegQueryDWORD( hKeyDrWatson, REGKEY_INSTRUCTIONS );
120: o->dwMaxCrashes = RegQueryDWORD( hKeyDrWatson, REGKEY_MAX_CRASHES );
121:
122: return TRUE;
123: }
124:
125: BOOL
126: RegSaveAllValues( HKEY hKeyDrWatson, POPTIONS o )
127:
128: /*++
129:
130: Routine Description:
131:
132: This functions saves all registry data for DRWTSN32 that is passed
133: in via the OPTIONS structure.
134:
135: Arguments:
136:
137: hKeyDrWatson - handle to a registry key for DRWTSN32 registry data
138: o - pointer to an OPTIONS structure
139:
140: Return Value:
141:
142: TRUE - saved all data without error
143: FALSE - errors occurred and did not save all data
144:
145: --*/
146:
147: {
148: RegSetSZ( hKeyDrWatson, REGKEY_LOG_PATH, o->szLogPath );
149: RegSetSZ( hKeyDrWatson, REGKEY_WAVE_FILE, o->szWaveFile );
150: RegSetBOOL( hKeyDrWatson, REGKEY_DUMPSYMBOLS, o->fDumpSymbols );
151: RegSetBOOL( hKeyDrWatson, REGKEY_DUMPALLTHREADS, o->fDumpAllThreads );
152: RegSetBOOL( hKeyDrWatson, REGKEY_APPENDTOLOGFILE, o->fAppendToLogFile );
153: RegSetBOOL( hKeyDrWatson, REGKEY_VISUAL, o->fVisual );
154: RegSetBOOL( hKeyDrWatson, REGKEY_SOUND, o->fSound );
155: RegSetDWORD( hKeyDrWatson, REGKEY_INSTRUCTIONS, o->dwInstructions );
156: RegSetDWORD( hKeyDrWatson, REGKEY_MAX_CRASHES, o->dwMaxCrashes );
157:
158: return TRUE;
159: }
160:
161: BOOL
162: RegInitializeDefaults( HKEY hKeyDrWatson )
163:
164: /*++
165:
166: Routine Description:
167:
168: This functions initializes the registry with the default values.
169:
170: Arguments:
171:
172: hKeyDrWatson - handle to a registry key for DRWTSN32 registry data
173:
174: Return Value:
175:
176: TRUE - saved all data without error
177: FALSE - errors occurred and did not save all data
178:
179: --*/
180:
181: {
182: OPTIONS o;
183:
184: GetWindowsDirectory( o.szLogPath, sizeof(o.szLogPath) );
185: o.szWaveFile[0] = '\0';
186: o.fDumpSymbols = FALSE;
187: o.fDumpAllThreads = TRUE;
188: o.fAppendToLogFile = TRUE;
189: o.fVisual = TRUE;
190: o.fSound = FALSE;
191: o.dwInstructions = 10;
192: o.dwMaxCrashes = 10;
193:
194: RegSetNumCrashes( 0 );
195:
196: RegSaveAllValues( hKeyDrWatson, &o );
197:
198: RegCreateEventSource();
199:
200: return TRUE;
201: }
202:
203: BOOL
204: RegCreateEventSource( void )
205:
206: /*++
207:
208: Routine Description:
209:
210: This function creates an event source in the registry. The event
211: source is used by the event viewer to display the data in a
212: presentable manner.
213:
214: Arguments:
215:
216: None.
217:
218: Return Value:
219:
220: TRUE - saved all data without error
221: FALSE - errors occurred and did not save all data
222:
223: --*/
224:
225: {
226: HKEY hk;
227: char szBuf[1024];
228: DWORD dwDisp;
229: char szAppName[MAX_PATH];
230:
231: GetAppName( szAppName, sizeof(szAppName) );
232: strcpy( szBuf, REGKEY_EVENTLOG );
233: strcat( szBuf, szAppName );
234: if (RegCreateKeyEx( HKEY_LOCAL_MACHINE,
235: szBuf,
236: 0,
237: NULL,
238: REG_OPTION_NON_VOLATILE,
239: KEY_QUERY_VALUE | KEY_SET_VALUE,
240: NULL,
241: &hk,
242: &dwDisp
243: )) {
244: return FALSE;
245: }
246:
247: if (dwDisp == REG_OPENED_EXISTING_KEY) {
248: RegCloseKey(hk);
249: return TRUE;
250: }
251:
252: strcpy( szBuf, REGKEY_SYSTEMROOT );
253: strcat( szBuf, DRWATSON_EXE_NAME );
254: RegSetEXPANDSZ( hk, REGKEY_MESSAGEFILE, szBuf );
255: RegSetDWORD( hk, REGKEY_TYPESSUPP, EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE );
256:
257: RegCloseKey(hk);
258:
259: return TRUE;
260: }
261:
262: HKEY
263: RegGetAppKey( void )
264:
265: /*++
266:
267: Routine Description:
268:
269: This function gets a handle to the DRWTSN32 registry key.
270:
271: Arguments:
272:
273: None.
274:
275: Return Value:
276:
277: Valid handle - handle opened ok
278: NULL - could not open the handle
279:
280: --*/
281:
282: {
283: DWORD rc;
284: DWORD dwDisp;
285: HKEY hKeyDrWatson;
286: HKEY hKeyMicrosoft;
287: char szAppName[MAX_PATH];
288:
289: rc = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
290: REGKEY_SOFTWARE,
291: 0,
292: KEY_QUERY_VALUE | KEY_SET_VALUE |
293: KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS,
294: &hKeyMicrosoft
295: );
296:
297: if (rc != ERROR_SUCCESS) {
298: return NULL;
299: }
300:
301: GetAppName( szAppName, sizeof(szAppName) );
302:
303: rc = RegCreateKeyEx( hKeyMicrosoft,
304: szAppName,
305: 0,
306: NULL,
307: REG_OPTION_NON_VOLATILE,
308: KEY_READ | KEY_WRITE,
309: NULL,
310: &hKeyDrWatson,
311: &dwDisp
312: );
313:
314: if (rc != ERROR_SUCCESS) {
315: return NULL;
316: }
317:
318: if (dwDisp == REG_CREATED_NEW_KEY) {
319: RegInitializeDefaults( hKeyDrWatson );
320: }
321:
322: return hKeyDrWatson;
323: }
324:
325: BOOL
326: RegInitialize( POPTIONS o )
327:
328: /*++
329:
330: Routine Description:
331:
332: This function is used to initialize the OPTIONS structure passed in
333: with the current values in the registry. Note that if the registry
334: is empty then the defaults are stored in the registry and also
335: returned in the OPTIONS structure.
336:
337: Arguments:
338:
339: None.
340:
341: Return Value:
342:
343: TRUE - all data was retrieved ok
344: NULL - could not get all data
345:
346: --*/
347:
348: {
349: HKEY hKeyDrWatson;
350:
351: hKeyDrWatson = RegGetAppKey();
352: Assert( hKeyDrWatson != NULL );
353:
354: if (!RegGetAllValues( o, hKeyDrWatson )) {
355: return FALSE;
356: }
357:
358: RegCloseKey( hKeyDrWatson );
359:
360: return TRUE;
361: }
362:
363: BOOL
364: RegSave( POPTIONS o )
365:
366: /*++
367:
368: Routine Description:
369:
370: This function is used to save the data in the OPTIONS structure
371: to the registry.
372:
373: Arguments:
374:
375: o - pointer to an OPTIONS structure
376:
377: Return Value:
378:
379: TRUE - all data was saved ok
380: NULL - could not save all data
381:
382: --*/
383:
384: {
385: HKEY hKeyDrWatson;
386:
387: hKeyDrWatson = RegGetAppKey();
388: Assert( hKeyDrWatson != NULL );
389: RegSaveAllValues( hKeyDrWatson, o );
390: RegCloseKey( hKeyDrWatson );
391:
392: return TRUE;
393: }
394:
395: void
396: RegSetNumCrashes( DWORD dwNumCrashes )
397:
398: /*++
399:
400: Routine Description:
401:
402: This function changes the value in the registry that contains the
403: number of crashes that have occurred.
404:
405: Arguments:
406:
407: dwNumCrashes - the number of craches to save
408:
409: Return Value:
410:
411: None.
412:
413: --*/
414:
415: {
416: HKEY hKeyDrWatson;
417:
418: hKeyDrWatson = RegGetAppKey();
419: Assert( hKeyDrWatson != NULL );
420: RegSetDWORD( hKeyDrWatson, REGKEY_NUM_CRASHES, dwNumCrashes );
421: RegCloseKey( hKeyDrWatson );
422:
423: return;
424: }
425:
426: DWORD
427: RegGetNumCrashes( void )
428:
429: /*++
430:
431: Routine Description:
432:
433: This function get the value in the registry that contains the
434: number of crashes that have occurred.
435:
436: Arguments:
437:
438: None.
439:
440: Return Value:
441:
442: the number of craches that have occurred
443:
444: --*/
445:
446: {
447: HKEY hKeyDrWatson;
448: DWORD dwNumCrashes;
449:
450: hKeyDrWatson = RegGetAppKey();
451: Assert( hKeyDrWatson != NULL );
452: dwNumCrashes = RegQueryDWORD( hKeyDrWatson, REGKEY_NUM_CRASHES );
453: RegCloseKey( hKeyDrWatson );
454:
455: return dwNumCrashes;
456: }
457:
458: BOOLEAN
459: RegInstallDrWatson( void )
460:
461: /*++
462:
463: Routine Description:
464:
465: This function gets a handle to the DRWTSN32 registry key.
466:
467: Arguments:
468:
469: None.
470:
471: Return Value:
472:
473: Valid handle - handle opened ok
474: NULL - could not open the handle
475:
476: --*/
477:
478: {
479: DWORD rc;
480: HKEY hKeyMicrosoft;
481:
482: rc = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
483: REGKEY_AEDEBUG,
484: 0,
485: KEY_QUERY_VALUE | KEY_SET_VALUE,
486: &hKeyMicrosoft
487: );
488:
489: if (rc != ERROR_SUCCESS) {
490: return FALSE;
491: }
492:
493: RegSetSZ( hKeyMicrosoft, REGKEY_AUTO, "1" );
494: RegSetSZ( hKeyMicrosoft, REGKEY_DEBUGGER, "drwtsn32 -p %ld -e %ld -g" );
495:
496: RegCloseKey( hKeyMicrosoft );
497:
498: return TRUE;
499: }
500:
501: void
502: RegSetDWORD( HKEY hkey, char *szSubKey, DWORD dwValue )
503:
504: /*++
505:
506: Routine Description:
507:
508: This function changes a DWORD value in the registry using the
509: hkey and szSubKey as the registry key info.
510:
511: Arguments:
512:
513: hkey - handle to a registry key
514: szSubKey - pointer to a subkey string
515: dwValue - new registry value
516:
517: Return Value:
518:
519: None.
520:
521: --*/
522:
523: {
524: DWORD rc;
525:
526: rc = RegSetValueEx( hkey, szSubKey, 0, REG_DWORD, (LPBYTE)&dwValue, 4 );
527: Assert( rc == ERROR_SUCCESS );
528: }
529:
530: void
531: RegSetBOOL( HKEY hkey, char *szSubKey, BOOL dwValue )
532:
533: /*++
534:
535: Routine Description:
536:
537: This function changes a BOOL value in the registry using the
538: hkey and szSubKey as the registry key info.
539:
540: Arguments:
541:
542: hkey - handle to a registry key
543: szSubKey - pointer to a subkey string
544: dwValue - new registry value
545:
546: Return Value:
547:
548: None.
549:
550: --*/
551:
552: {
553: DWORD rc;
554:
555: rc = RegSetValueEx( hkey, szSubKey, 0, REG_DWORD, (LPBYTE)&dwValue, 4 );
556: Assert( rc == ERROR_SUCCESS );
557: }
558:
559: void
560: RegSetSZ( HKEY hkey, char *szSubKey, char *szValue )
561:
562: /*++
563:
564: Routine Description:
565:
566: This function changes a SZ value in the registry using the
567: hkey and szSubKey as the registry key info.
568:
569: Arguments:
570:
571: hkey - handle to a registry key
572: szSubKey - pointer to a subkey string
573: szValue - new registry value
574:
575: Return Value:
576:
577: None.
578:
579: --*/
580:
581: {
582: DWORD rc;
583:
584: rc = RegSetValueEx( hkey, szSubKey, 0, REG_SZ, szValue, strlen(szValue)+1 );
585: Assert( rc == ERROR_SUCCESS );
586: }
587:
588: void
589: RegSetEXPANDSZ( HKEY hkey, char *szSubKey, char *szValue )
590:
591: /*++
592:
593: Routine Description:
594:
595: This function changes a SZ value in the registry using the
596: hkey and szSubKey as the registry key info.
597:
598: Arguments:
599:
600: hkey - handle to a registry key
601: szSubKey - pointer to a subkey string
602: szValue - new registry value
603:
604: Return Value:
605:
606: None.
607:
608: --*/
609:
610: {
611: DWORD rc;
612:
613: rc = RegSetValueEx( hkey, szSubKey, 0, REG_EXPAND_SZ, szValue, strlen(szValue)+1 );
614: Assert( rc == ERROR_SUCCESS );
615: }
616:
617: BOOL
618: RegQueryBOOL( HKEY hkey, char *szSubKey )
619:
620: /*++
621:
622: Routine Description:
623:
624: This function queries BOOL value in the registry using the
625: hkey and szSubKey as the registry key info. If the value is not
626: found in the registry, it is added with a FALSE value.
627:
628: Arguments:
629:
630: hkey - handle to a registry key
631: szSubKey - pointer to a subkey string
632:
633: Return Value:
634:
635: TRUE or FALSE.
636:
637: --*/
638:
639: {
640: DWORD rc;
641: DWORD len;
642: DWORD dwType;
643: BOOL fValue;
644:
645: len = 4;
646: rc = RegQueryValueEx( hkey, szSubKey, 0, &dwType, (LPBYTE)&fValue, &len );
647: if (rc != ERROR_SUCCESS) {
648: if (rc == ERROR_FILE_NOT_FOUND) {
649: fValue = FALSE;
650: RegSetBOOL( hkey, szSubKey, fValue );
651: }
652: else {
653: Assert( rc == ERROR_SUCCESS );
654: }
655: }
656: else {
657: Assert( dwType == REG_DWORD );
658: }
659:
660: return fValue;
661: }
662:
663: DWORD
664: RegQueryDWORD( HKEY hkey, char *szSubKey )
665:
666: /*++
667:
668: Routine Description:
669:
670: This function queries BOOL value in the registry using the
671: hkey and szSubKey as the registry key info. If the value is not
672: found in the registry, it is added with a zero value.
673:
674: Arguments:
675:
676: hkey - handle to a registry key
677: szSubKey - pointer to a subkey string
678:
679: Return Value:
680:
681: registry value
682:
683: --*/
684:
685: {
686: DWORD rc;
687: DWORD len;
688: DWORD dwType;
689: DWORD fValue;
690:
691: len = 4;
692: rc = RegQueryValueEx( hkey, szSubKey, 0, &dwType, (LPBYTE)&fValue, &len );
693: if (rc != ERROR_SUCCESS) {
694: if (rc == ERROR_FILE_NOT_FOUND) {
695: fValue = 0;
696: RegSetDWORD( hkey, szSubKey, fValue );
697: }
698: else {
699: Assert( rc == ERROR_SUCCESS );
700: }
701: }
702: else {
703: Assert( dwType == REG_DWORD );
704: }
705:
706: return fValue;
707: }
708:
709: void
710: RegQuerySZ( HKEY hkey, char *szSubKey, char *szValue )
711:
712: /*++
713:
714: Routine Description:
715:
716: This function queries BOOL value in the registry using the
717: hkey and szSubKey as the registry key info. If the value is not
718: found in the registry, it is added with a zero value.
719:
720: Arguments:
721:
722: hkey - handle to a registry key
723: szSubKey - pointer to a subkey string
724:
725: Return Value:
726:
727: registry value
728:
729: --*/
730:
731: {
732: DWORD rc;
733: DWORD len;
734: DWORD dwType;
735: char buf[1024];
736:
737: len = sizeof(buf);
738: rc = RegQueryValueEx( hkey, szSubKey, 0, &dwType, (LPBYTE)buf, &len );
739: if (rc != ERROR_SUCCESS) {
740: if (rc == ERROR_FILE_NOT_FOUND) {
741: buf[0] = 0;
742: RegSetSZ( hkey, szSubKey, buf );
743: }
744: else {
745: Assert( rc == ERROR_SUCCESS );
746: }
747: }
748: else {
749: Assert( dwType == REG_SZ );
750: }
751:
752: strcpy( szValue, buf );
753: }
754:
755: void
756: RegLogCurrentVersion( void )
757: {
758: char buf[1024];
759: DWORD rc;
760: HKEY hKeyCurrentVersion;
761:
762: rc = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
763: REGKEY_CURRENTVERSION,
764: 0,
765: KEY_QUERY_VALUE,
766: &hKeyCurrentVersion
767: );
768:
769: if (rc != ERROR_SUCCESS) {
770: return;
771: }
772:
773: RegQuerySZ( hKeyCurrentVersion,REGKEY_CURRENT_BUILD, buf );
774: lprintf( MSG_CURRENT_BUILD, buf );
775: RegQuerySZ( hKeyCurrentVersion,REGKEY_CURRENT_TYPE, buf );
776: lprintf( MSG_CURRENT_TYPE, buf );
777: RegQuerySZ( hKeyCurrentVersion,REGKEY_REG_ORGANIZATION, buf );
778: lprintf( MSG_REG_ORGANIZATION, buf );
779: RegQuerySZ( hKeyCurrentVersion,REGKEY_REG_OWNER, buf );
780: lprintf( MSG_REG_OWNER, buf );
781:
782: return;
783: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.