Annotation of mstools/mssetup/sample/msregdb.c, revision 1.1.1.1

1.1       root        1: #ifndef STF_LITE
                      2: #include <windows.h>
                      3: #ifdef WIN32
                      4: #include <malloc.h>
                      5: #endif
                      6: #include "setupapi.h"
                      7: #include "msregdb.h"
                      8: 
                      9: HANDLE   hinstDLL = NULL;
                     10: 
                     11: #ifdef WIN16
                     12: typedef LONG (APIENTRY *LPFNRCLK)(LONG);
                     13: typedef LONG (APIENTRY *LPFNRCRK)(LONG, LPSTR, LPSTR);
                     14: typedef LONG (APIENTRY *LPFNRDLK)(LONG, LPSTR);
                     15: typedef LONG (APIENTRY *LPFNROPK)(LONG, LPSTR, LPSTR);
                     16: typedef LONG (APIENTRY *LPFNRQRV)(LONG, LPSTR, LPSTR, LPSTR);
                     17: typedef LONG (APIENTRY *LPFNRSTV)(LONG, LPSTR, LONG, LPSTR, LONG);
                     18: 
                     19: LPFNRCLK lpfnRegCloseKey;
                     20: LPFNRCRK lpfnRegCreateKey;
                     21: LPFNRDLK lpfnRegDeleteKey;
                     22: LPFNROPK lpfnRegOpenKey;
                     23: LPFNRQRV lpfnRegQueryValue;
                     24: LPFNRSTV lpfnRegSetValue;
                     25: #endif
                     26: 
                     27: #ifdef WIN32
                     28: typedef LONG (APIENTRY *LPFNRCLK)(HKEY);
                     29: typedef LONG (APIENTRY *LPFNRCRK)(HKEY, LPCTSTR, PHKEY);
                     30: typedef LONG (APIENTRY *LPFNRDLK)(HKEY, LPCTSTR);
                     31: typedef LONG (APIENTRY *LPFNROPK)(HKEY, LPCTSTR, PHKEY);
                     32: typedef LONG (APIENTRY *LPFNRQRV)(HKEY, LPCTSTR, LPTSTR, PLONG);
                     33: typedef LONG (APIENTRY *LPFNRSTV)(HKEY, LPCTSTR, DWORD, LPTSTR, DWORD);
                     34: typedef LONG (APIENTRY *LPFNRCRKe)(HKEY, LPCTSTR, DWORD, LPTSTR, DWORD,
                     35:                                REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD);
                     36: typedef LONG (APIENTRY *LPFNROPKe)(HKEY, LPCTSTR, DWORD, REGSAM, PHKEY);
                     37: typedef LONG (APIENTRY *LPFNRQRVe)(HKEY, LPTSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD);
                     38: typedef LONG (APIENTRY *LPFNRSTVe)(HKEY, LPCTSTR, DWORD, DWORD, LPBYTE, DWORD);
                     39: typedef LONG (APIENTRY *LPFNREK)(HKEY, DWORD, LPTSTR, LPDWORD);
                     40: typedef LONG (APIENTRY *LPFNRQIK)(HKEY, LPTSTR, LPDWORD, LPDWORD, LPDWORD,
                     41:                LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, PFILETIME);
                     42: 
                     43: LPFNRCLK lpfnRegCloseKey;
                     44: LPFNRCRK lpfnRegCreateKey;
                     45: LPFNRDLK lpfnRegDeleteKey;
                     46: LPFNROPK lpfnRegOpenKey;
                     47: LPFNRQRV lpfnRegQueryValue;
                     48: LPFNRSTV lpfnRegSetValue;
                     49: LPFNRCRKe lpfnRegCreateKeyEx;
                     50: LPFNROPKe lpfnRegOpenKeyEx;
                     51: LPFNRQRVe lpfnRegQueryValueEx;
                     52: LPFNRSTVe lpfnRegSetValueEx;
                     53: LPFNREK lpfnRegEnumKey;
                     54: LPFNRQIK lpfnRegQueryInfoKey;
                     55: #endif
                     56: 
                     57: // **************************************************************************
                     58: void CreateRegKey(LPSTR szKey)
                     59: {
                     60:        HKEY hKey;
                     61:        INT i;
                     62: 
                     63:        if ((*lpfnRegCreateKey)(HKEY_CLASSES_ROOT, szKey, &hKey)
                     64:                        > ERROR_SUCCESS)
                     65:                {
                     66:                i = EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKey", NULL, NULL);
                     67: #ifdef DEBUG
                     68:                StfApiErr(saeFail, "CreateRegKey", szKey);
                     69: #endif // DEBUG
                     70:                SetupError(STFERR);
                     71:                }
                     72: 
                     73:        if ((*lpfnRegCloseKey)(hKey) > ERROR_SUCCESS)
                     74:                {
                     75:                i = EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKey", NULL, NULL);
                     76: #ifdef DEBUG
                     77:                StfApiErr(saeFail, "CreateRegKey", szKey);
                     78: #endif // DEBUG
                     79:                SetupError(STFERR);
                     80:                }
                     81: }
                     82: 
                     83: 
                     84: // **************************************************************************
                     85: void CreateRegKeyValue(LPSTR szKey, LPSTR szValue)
                     86: {
                     87:        if ((*lpfnRegSetValue)(HKEY_CLASSES_ROOT, (LPCTSTR)szKey, REG_SZ, szValue,
                     88:                        lstrlen(szKey)) > ERROR_SUCCESS)
                     89:                {
                     90:                EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKeyValue", NULL, NULL);
                     91: #ifdef DEBUG
                     92:                StfApiErr(saeFail, "CreateRegKeyValue",SzCat2Str((LPSTR)szKey,", ",(LPSTR)szValue));
                     93: #endif // DEBUG
                     94:                SetupError(STFERR);
                     95:                }
                     96: }
                     97: 
                     98: 
                     99: // **************************************************************************
                    100: INT DoesRegKeyExist(LPSTR szKey)
                    101: {
                    102:        HKEY hKey;
                    103: 
                    104:        if ((*lpfnRegOpenKey)(HKEY_CLASSES_ROOT, szKey, &hKey)
                    105:                        != ERROR_SUCCESS)
                    106:                return(0);
                    107: 
                    108:        (*lpfnRegCloseKey)(hKey);
                    109: 
                    110:        return(1);
                    111: }
                    112: 
                    113: 
                    114: // **************************************************************************
                    115: void SetRegKeyValue(LPSTR szKey, LPSTR szValue)
                    116: {
                    117:        if ((*lpfnRegSetValue)(HKEY_CLASSES_ROOT, szKey, REG_SZ,  szValue,
                    118:                        lstrlen(szKey)) > ERROR_SUCCESS)
                    119:                {
                    120:                EercErrorHandler(GRC_API_FAILED, 1, "SetRegKeyValue", NULL, NULL);
                    121: #ifdef DEBUG
                    122:                StfApiErr(saeFail, "SetRegKeyValue", SzCat2Str((LPSTR)szKey, ", ", (LPSTR)szValue));
                    123: #endif // DEBUG
                    124:                SetupError(STFERR);
                    125:                }
                    126: }
                    127: 
                    128: 
                    129: // **************************************************************************
                    130: LPSTR GetRegKeyValue(LPSTR szKey, LPSTR szBuf, INT cbBuf)
                    131: {
                    132:        LONG cb = cbBuf;
                    133: 
                    134:        if (szBuf != NULL && cbBuf > 0)
                    135:                *szBuf = '\0';
                    136: 
                    137:        if (!DoesRegKeyExist(szKey))
                    138:                return(szBuf);
                    139: 
                    140:        if ((*lpfnRegQueryValue)(HKEY_CLASSES_ROOT, szKey, szBuf, &cb)
                    141:                        != ERROR_SUCCESS)
                    142:                {
                    143:                EercErrorHandler(GRC_API_FAILED, 1, "SetRegKeyValue", NULL, NULL);
                    144: #ifdef DEBUG
                    145:                StfApiErr(saeFail, "GetRegKeyValue", szKey);
                    146: #endif // DEBUG
                    147:                SetupError(STFERR);
                    148:                }
                    149: 
                    150:        if (cb > cbBuf)
                    151:                {
                    152:                DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK);
                    153:                SetupError(STFERR);
                    154:                }
                    155:        *(szBuf + cb) = '\0';
                    156: 
                    157:        return(szBuf);
                    158: }
                    159: 
                    160: 
                    161: // **************************************************************************
                    162: void DeleteRegKey(LPSTR szKey)
                    163: {
                    164: #ifdef WIN16
                    165:     (*lpfnRegDeleteKey)(HKEY_CLASSES_ROOT, szKey);
                    166: #elif defined(WIN32)
                    167:     if (DoesRegKeyExistEx(HKEY_CLASSES_ROOT, szKey))
                    168:        {
                    169:        //
                    170:        // The Win32 "RegDeleteKey()" function will not delete a key
                    171:        // that has existing subkeys (unlike the Win16 version).
                    172:        // DeleteAllSubkeys is a recursive function that removes a
                    173:        // complete "tree" of registry keys.
                    174:        //
                    175:        if (!DeleteAllSubKeys(HKEY_CLASSES_ROOT, (LPCTSTR)szKey))
                    176:            {
                    177:            EercErrorHandler(GRC_API_FAILED, 1, "DeleteAllSubKeys", NULL, NULL);
                    178: #ifdef DEBUG
                    179:            StfApiErr(saeFail, "DeleteAllSubKeys", (LPSTR)szKey);
                    180: #endif // DEBUG
                    181:            SetupError(STFERR);
                    182:            }
                    183:        }
                    184: #endif
                    185: }
                    186: 
                    187: 
                    188: 
                    189: #ifdef WIN32
                    190: 
                    191: //
                    192: // All the functions that follow are "extended" functions for
                    193: // Win32.  They are not limited to the HKEY_CLASSES_ROOT key
                    194: // as the original Setup Toolkit functions are.
                    195: //
                    196: 
                    197: BOOL DeleteAllSubKeys(HKEY hKey, LPCTSTR szKey)
                    198: {
                    199:     HKEY hKey2;
                    200:     TCHAR ClassStr[128];
                    201:     LPTSTR szClass = ClassStr;
                    202:     LPTSTR szSubKey;
                    203:     LPTSTR szFullSubKey;
                    204:     LONG lResult;
                    205:     DWORD cchClass, dwNumSubKeys, cchMaxSubKey, cchMaxClass,
                    206:                cValues, cchMaxValName, cbMaxValData, cbSecurityDescriptor;
                    207:     DWORD i, cchName;
                    208:     FILETIME ftLastWrite;
                    209: 
                    210:     if ((lResult = (*lpfnRegOpenKeyEx)(hKey, szKey,
                    211:                                0, KEY_READ, &hKey2)) > ERROR_SUCCESS)
                    212:        {
                    213:        EercErrorHandler(GRC_API_FAILED, 1, "DeleteAllSubKeys:open", NULL, NULL);
                    214: #ifdef DEBUG
                    215:        StfApiErr(saeFail, "DeleteAllSubKeys:open", (LPSTR)szKey);
                    216: #endif // DEBUG
                    217:        return(FALSE);
                    218:        }
                    219: 
                    220:     //
                    221:     // First, see how many subkeys this key has.
                    222:     //
                    223:     cchClass=128;
                    224:     if ((lResult = (*lpfnRegQueryInfoKey)(hKey2, szClass, &cchClass, NULL, &dwNumSubKeys, 
                    225:                &cchMaxSubKey, &cchMaxClass, &cValues, &cchMaxValName,
                    226:                &cbMaxValData, &cbSecurityDescriptor, &ftLastWrite)) != ERROR_SUCCESS)
                    227:        {
                    228:        (*lpfnRegCloseKey)(hKey2);
                    229:        return(FALSE);
                    230:        }
                    231: 
                    232:     //
                    233:     // if this key has no subkeys at all, we can remove
                    234:     // it immediately and finish.
                    235:     //
                    236:     if (dwNumSubKeys == 0)
                    237:        {
                    238:        (*lpfnRegCloseKey)(hKey2);
                    239:        lResult = (*lpfnRegDeleteKey)(hKey, szKey);
                    240:        }
                    241:     else
                    242:        {
                    243:        //
                    244:        // This key has subkeys; we'll need to enumerate them
                    245:        // and "zap" each one in turn.
                    246:        //
                    247:        // RegQueryInfoKey() has indicated what the maximum length
                    248:        // of a subkey name will be for this particular key
                    249:        // in "cchMaxSubKey", so we can allocate just what we
                    250:        // need to hold the names.
                    251:        //
                    252:        szSubKey = (LPTSTR)malloc((cchMaxSubKey+1) * sizeof(TCHAR));
                    253:        szFullSubKey = (LPTSTR)malloc((cchMaxSubKey + lstrlen(szKey) + 2)*sizeof(TCHAR));
                    254: 
                    255:        for (i = dwNumSubKeys; i > 0; i--)
                    256:            {
                    257:            cchName = cchMaxSubKey;
                    258:            if ((lResult = (*lpfnRegEnumKey)(hKey2, i - 1,
                    259:                        szSubKey, &cchName)) == ERROR_SUCCESS)
                    260:                {
                    261:                //
                    262:                // Construct the full hierarchical key name, and
                    263:                // nuke it.
                    264:                // (RegEnumKey just returns the name of the subkey)
                    265:                //
                    266:                wsprintf(szFullSubKey, "%s\\%s", szKey, szSubKey);
                    267:                if (!DeleteAllSubKeys(hKey, szFullSubKey))
                    268:                    {
                    269:                    (*lpfnRegCloseKey)(hKey2);
                    270:                    free(szSubKey);
                    271:                    free(szFullSubKey);
                    272:                    return(FALSE);
                    273:                    }
                    274:                }
                    275:            else
                    276:                {
                    277:                if (lResult != ERROR_NO_MORE_ITEMS)
                    278:                    {
                    279:                    // Usually, you only see NO_MORE_ITEMS
                    280:                    // when you're counting up from 0 and
                    281:                    // gone past the end.
                    282:                    // Some other tragedy has befallen us.
                    283:                    //
                    284:                    EercErrorHandler(GRC_API_FAILED, 1, "DeleteAllSubKeys:enum", NULL, NULL);
                    285: #ifdef DEBUG
                    286:                    StfApiErr(saeFail, "DeleteAllSubKeys:Enum", (LPSTR)szKey);
                    287: #endif // DEBUG
                    288:                    (*lpfnRegCloseKey)(hKey2);
                    289:                    free(szSubKey);
                    290:                    free(szFullSubKey);
                    291:                    return(FALSE);
                    292:                    }
                    293:                }
                    294:            }
                    295:        //
                    296:        // Now that the count of subkeys is down to 0, we
                    297:        // can delete ourselves.
                    298:        //
                    299:        (*lpfnRegCloseKey)(hKey2);
                    300:        lResult = (*lpfnRegDeleteKey)(hKey, szKey);
                    301:         free(szSubKey);
                    302:         free(szFullSubKey);
                    303:        }
                    304:     return(TRUE);
                    305: }
                    306: 
                    307: // **************************************************************************
                    308: void CreateRegKeyEx(HKEY hKey, LPCSTR szKey)
                    309: {
                    310:        HKEY hKey2;
                    311:        INT i;
                    312: 
                    313:        if ((*lpfnRegCreateKey)(hKey, szKey, &hKey2)
                    314:                        > ERROR_SUCCESS)
                    315:                {
                    316:                i = EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKeyEx", NULL, NULL);
                    317: #ifdef DEBUG
                    318:                StfApiErr(saeFail, "CreateRegKeyEx", (LPSTR)szKey);
                    319: #endif // DEBUG
                    320:                SetupError(STFERR);
                    321:                }
                    322: 
                    323:        if ((*lpfnRegCloseKey)(hKey2) > ERROR_SUCCESS)
                    324:                {
                    325:                i = EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKeyEx", NULL, NULL);
                    326: #ifdef DEBUG
                    327:                StfApiErr(saeFail, "CreateRegKeyEx", (LPSTR)szKey);
                    328: #endif // DEBUG
                    329:                SetupError(STFERR);
                    330:                }
                    331: }
                    332: 
                    333: 
                    334: // **************************************************************************
                    335: void CreateRegKeyValueEx(HKEY hKey, LPCTSTR szKey,
                    336:                         LPTSTR szValueName, DWORD dwType,
                    337:                         LPBYTE lpValueData, DWORD dwDataLen)
                    338: {
                    339:        HKEY hKey2;
                    340: 
                    341:         if ((*lpfnRegOpenKeyEx)(hKey, szKey, 0, KEY_WRITE, &hKey2) > ERROR_SUCCESS)
                    342:                {
                    343:                EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKeyValueEx:open", NULL, NULL);
                    344: #ifdef DEBUG
                    345:                StfApiErr(saeFail, "CreateRegKeyValueEx:open", SzCat2Str((LPSTR)szKey, ", ", (LPSTR)szValueName));
                    346: #endif // DEBUG
                    347:                SetupError(STFERR);
                    348:                }
                    349: 
                    350:        if ((*lpfnRegSetValueEx)(hKey2, szValueName, 0, dwType, lpValueData,
                    351:                        dwDataLen) > ERROR_SUCCESS)
                    352:                {
                    353:                EercErrorHandler(GRC_API_FAILED, 1, "CreateRegKeyValueEx", NULL, NULL);
                    354: #ifdef DEBUG
                    355:                StfApiErr(saeFail, "CreateRegKeyValueEx", SzCat2Str((LPSTR)szKey, ", ", (LPSTR)szValueName));
                    356: #endif // DEBUG
                    357:                SetupError(STFERR);
                    358:                }
                    359: }
                    360: 
                    361: 
                    362: // **************************************************************************
                    363: INT DoesRegKeyExistEx(HKEY hKey, LPCSTR szKey)
                    364: {
                    365:        HKEY hKey2;
                    366: 
                    367:        if ((*lpfnRegOpenKey)(hKey, szKey, &hKey2)
                    368:                        != ERROR_SUCCESS)
                    369:                return(0);
                    370: 
                    371:        (*lpfnRegCloseKey)(hKey2);
                    372: 
                    373:        return(1);
                    374: }
                    375: 
                    376: 
                    377: // **************************************************************************
                    378: void SetRegKeyValueEx(HKEY hKey, LPCTSTR szKey,
                    379:                        LPTSTR szValueName, DWORD dwType,
                    380:                        LPBYTE lpValueData, DWORD dwDataLen)
                    381: {
                    382:        HKEY hKey2;
                    383: 
                    384:         if ((*lpfnRegOpenKeyEx)(hKey, szKey, 0, KEY_WRITE, &hKey2) > ERROR_SUCCESS)
                    385:                {
                    386:                EercErrorHandler(GRC_API_FAILED, 1, "SetRegKeyValueEx:open", NULL, NULL);
                    387: #ifdef DEBUG
                    388:                StfApiErr(saeFail, "SetRegKeyValueEx:open", SzCat2Str((LPSTR)szKey, ", ", (LPSTR)szValueName));
                    389: #endif // DEBUG
                    390:                SetupError(STFERR);
                    391:                }
                    392: 
                    393:        if ((*lpfnRegSetValueEx)(hKey2, szValueName, 0, dwType, lpValueData,
                    394:                        dwDataLen) > ERROR_SUCCESS)
                    395:                {
                    396:                EercErrorHandler(GRC_API_FAILED, 1, "SetRegKeyValueEx", NULL, NULL);
                    397: #ifdef DEBUG
                    398:                StfApiErr(saeFail, "SetRegKeyValueEx", SzCat2Str((LPSTR)szKey, ", ", (LPSTR)szValueName));
                    399: #endif // DEBUG
                    400:                SetupError(STFERR);
                    401:                }
                    402: }
                    403: 
                    404: 
                    405: // **************************************************************************
                    406: LONG GetRegKeyValueEx(HKEY hKey, LPCTSTR szKey, LPTSTR szValueName, LPDWORD lpdwType, LPBYTE lpBuf, DWORD cbBuf)
                    407: {
                    408:        HKEY    hKey2;
                    409:        DWORD   cb = cbBuf;
                    410:         LONG   lRetVal;
                    411: 
                    412:        if (!DoesRegKeyExistEx(hKey, szKey))
                    413:                return(ERROR_BADKEY);
                    414: 
                    415:         if ((*lpfnRegOpenKeyEx)(hKey, szKey, 0, KEY_READ, &hKey2) > ERROR_SUCCESS)
                    416:                {
                    417:                EercErrorHandler(GRC_API_FAILED, 1, "GetRegKeyValueEx", NULL, NULL);
                    418: #ifdef DEBUG
                    419:                StfApiErr(saeFail, "GetRegKeyValueEx", SzCat2Str((LPSTR)szKey, ", ", (LPSTR)szValueName));
                    420: #endif // DEBUG
                    421:                SetupError(STFERR);
                    422:                }
                    423: 
                    424:        if ((*lpfnRegQueryValueEx)(hKey2, (LPTSTR)szValueName, NULL,
                    425:                         lpdwType, lpBuf, &cb)
                    426:                        != ERROR_SUCCESS)
                    427:                {
                    428:                EercErrorHandler(GRC_API_FAILED, 1, "SetRegKeyValueEx", NULL, NULL);
                    429: #ifdef DEBUG
                    430:                StfApiErr(saeFail, "GetRegKeyValueEx", (LPSTR)szKey);
                    431: #endif // DEBUG
                    432:                SetupError(STFERR);
                    433:                }
                    434: 
                    435:        if (cb > cbBuf)
                    436:                {
                    437:                DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK);
                    438:                SetupError(STFERR);
                    439:                lRetVal = ERROR_MORE_DATA;
                    440:                }
                    441:        else
                    442:                lRetVal = ERROR_SUCCESS;
                    443: 
                    444:        return(lRetVal);
                    445: }
                    446: 
                    447: 
                    448: // **************************************************************************
                    449: void DeleteRegKeyEx(HKEY hKey, LPCTSTR szKey)
                    450: {
                    451:     if (DoesRegKeyExistEx(hKey, szKey))
                    452:        {
                    453:        //
                    454:        // DeleteAllSubkeys is a recursive function that removes a
                    455:        // key tree from the bottom up.  The Win32 "RegDeleteKey()"
                    456:        // function will not delete a key that has existing subkeys.
                    457:        //
                    458:        if (!DeleteAllSubKeys(hKey, szKey))
                    459:            {
                    460:            EercErrorHandler(GRC_API_FAILED, 1, "DeleteAllSubKeys", NULL, NULL);
                    461: #ifdef DEBUG
                    462:            StfApiErr(saeFail, "DeleteAllSubKeys", (LPSTR)szKey);
                    463: #endif // DEBUG
                    464:            SetupError(STFERR);
                    465:            }
                    466:        }
                    467: }
                    468: 
                    469: #endif
                    470: 
                    471: // **************************************************************************
                    472: BOOL FInitRegDb(void)
                    473: {
                    474: #ifdef WIN16
                    475:        if ((hinstDLL = LoadLibrary("SHELL.DLL")) == NULL)
                    476:                return(FALSE);
                    477: 
                    478:        if (hinstDLL < 32)
                    479:                {
                    480:                hinstDLL = NULL;
                    481:                return(FALSE);
                    482:                }
                    483: #elif defined(WIN32)
                    484:        if ((hinstDLL = LoadLibrary("ADVAPI32.DLL")) == NULL)
                    485:                return(FALSE);
                    486: #endif
                    487: 
                    488:        lpfnRegCloseKey =   (LPFNRCLK)GetProcAddress(hinstDLL, "RegCloseKey");
                    489: #ifdef UNICODE
                    490:        lpfnRegCreateKey =  (LPFNRCRK)GetProcAddress(hinstDLL, "RegCreateKeyW");
                    491:        lpfnRegDeleteKey =  (LPFNRDLK)GetProcAddress(hinstDLL, "RegDeleteKeyW");
                    492:        lpfnRegOpenKey =    (LPFNROPK)GetProcAddress(hinstDLL, "RegOpenKeyW");
                    493:        lpfnRegQueryValue = (LPFNRQRV)GetProcAddress(hinstDLL, "RegQueryValueW");
                    494:        lpfnRegSetValue =   (LPFNRSTV)GetProcAddress(hinstDLL, "RegSetValueW");
                    495: #else
                    496:        lpfnRegCreateKey =  (LPFNRCRK)GetProcAddress(hinstDLL, "RegCreateKeyA");
                    497:        lpfnRegDeleteKey =  (LPFNRDLK)GetProcAddress(hinstDLL, "RegDeleteKeyA");
                    498:        lpfnRegOpenKey =    (LPFNROPK)GetProcAddress(hinstDLL, "RegOpenKeyA");
                    499:        lpfnRegQueryValue = (LPFNRQRV)GetProcAddress(hinstDLL, "RegQueryValueA");
                    500:        lpfnRegSetValue =   (LPFNRSTV)GetProcAddress(hinstDLL, "RegSetValueA");
                    501: #endif
                    502: 
                    503:        if (lpfnRegCloseKey == NULL
                    504:                        || lpfnRegCreateKey == NULL
                    505:                        || lpfnRegDeleteKey == NULL
                    506:                        || lpfnRegOpenKey == NULL
                    507:                        || lpfnRegQueryValue == NULL
                    508:                        || lpfnRegSetValue == NULL)
                    509:                {
                    510:                FreeLibrary(hinstDLL);
                    511: 
                    512:                hinstDLL = NULL;
                    513:                return(FALSE);
                    514:                }
                    515: 
                    516: #ifdef WIN32
                    517: #ifdef UNICODE
                    518:        lpfnRegCreateKeyEx = (LPFNRCRKe)GetProcAddress(hinstDLL, "RegCreateKeyExW");
                    519:        lpfnRegOpenKeyEx = (LPFNROPKe)GetProcAddress(hinstDLL, "RegOpenKeyExW");
                    520:        lpfnRegQueryValueEx = (LPFNRQRVe)GetProcAddress(hinstDLL, "RegQueryValueExW");
                    521:        lpfnRegSetValueEx = (LPFNRSTVe)GetProcAddress(hinstDLL, "RegSetValueExW");
                    522:        lpfnRegEnumKey = (LPFNREK)GetProcAddress(hinstDLL, "RegEnumKeyW");
                    523:        lpfnRegQueryInfoKey = (LPFNRQIK)GetProcAddress(hinstDLL, "RegQueryInfoKeyW");
                    524: #else
                    525:        lpfnRegCreateKeyEx = (LPFNRCRKe)GetProcAddress(hinstDLL, "RegCreateKeyExA");
                    526:        lpfnRegOpenKeyEx = (LPFNROPKe)GetProcAddress(hinstDLL, "RegOpenKeyExA");
                    527:        lpfnRegQueryValueEx = (LPFNRQRVe)GetProcAddress(hinstDLL, "RegQueryValueExA");
                    528:        lpfnRegSetValueEx = (LPFNRSTVe)GetProcAddress(hinstDLL, "RegSetValueExA");
                    529:        lpfnRegEnumKey = (LPFNREK)GetProcAddress(hinstDLL, "RegEnumKeyA");
                    530:        lpfnRegQueryInfoKey = (LPFNRQIK)GetProcAddress(hinstDLL, "RegQueryInfoKeyA");
                    531: #endif // UNICODE
                    532: #endif // WIN32
                    533: 
                    534:        return(TRUE);
                    535: }
                    536: 
                    537: 
                    538: // **************************************************************************
                    539: VOID TerminateRegDb(void)
                    540: {
                    541:        if (hinstDLL != NULL)
                    542:                {
                    543:                FreeLibrary(hinstDLL);
                    544: 
                    545:                hinstDLL = NULL;
                    546:                }
                    547: }
                    548: 
                    549: 
                    550: #endif  /* !STF_LITE */

unix.superglobalmegacorp.com

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