00284 {
00285 BOOL ret = FALSE;
00286 char *keyName;
00287 const char *funcName;
00288 HKEY key;
00289 LSTATUS rc;
00290
00291 keyName = CRYPT_GetKeyName(dwEncodingType, szFuncName, pszOID);
00292 rc = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ, &key);
00293 if (!rc)
00294 {
00295 DWORD type, size = 0;
00296
00297 rc = RegQueryValueExA(key, "FuncName", NULL, &type, NULL, &size);
00298 if ((!rc || rc == ERROR_MORE_DATA) && type == REG_SZ)
00299 {
00300 funcName = CryptMemAlloc(size);
00301 rc = RegQueryValueExA(key, "FuncName", NULL, &type,
00302 (LPBYTE)funcName, &size);
00303 }
00304 else
00305 funcName = szFuncName;
00306 rc = RegQueryValueExW(key, DllW, NULL, &type, NULL, &size);
00307 if ((!rc || rc == ERROR_MORE_DATA) && type == REG_SZ)
00308 {
00309 LPWSTR dllName = CryptMemAlloc(size);
00310
00311 if (dllName)
00312 {
00313 rc = RegQueryValueExW(key, DllW, NULL, NULL,
00314 (LPBYTE)dllName, &size);
00315 if (!rc)
00316 {
00317 HMODULE lib;
00318
00319
00320
00321
00322
00323 lib = LoadLibraryW(dllName);
00324 if (lib)
00325 {
00326 *ppvFuncAddr = GetProcAddress(lib, funcName);
00327 if (*ppvFuncAddr)
00328 {
00329 struct FuncAddr *addr =
00330 CryptMemAlloc(sizeof(struct FuncAddr));
00331
00332 if (addr)
00333 {
00334 addr->lib = lib;
00335 addr->dllList = addr->currentDll = NULL;
00336 *phFuncAddr = addr;
00337 ret = TRUE;
00338 }
00339 else
00340 {
00341 *phFuncAddr = NULL;
00342 FreeLibrary(lib);
00343 }
00344 }
00345 else
00346 {
00347
00348
00349
00350 FreeLibrary(lib);
00351 }
00352 }
00353 }
00354 else
00355 SetLastError(rc);
00356 CryptMemFree(dllName);
00357 }
00358 }
00359 else
00360 SetLastError(rc);
00361 if (funcName != szFuncName)
00362 CryptMemFree((char *)funcName);
00363 RegCloseKey(key);
00364 }
00365 else
00366 SetLastError(rc);
00367 CryptMemFree(keyName);
00368 return ret;
00369 }