Annotation of mstools/samples/sdktools/image/drwatson/registry.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.