//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1993. // // File: libmain.cxx // // Contents: LibMain for ADs.dll // // Functions: LibMain, DllGetClassObject // // History: 25-Oct-94 KrishnaG Created. // //---------------------------------------------------------------------------- #include "oleds.hxx" #pragma hdrstop LPCWSTR lpszTopLevel = L"SOFTWARE\\Microsoft\\ADs"; LPCWSTR lpszProviders = L"Providers"; PROUTER_ENTRY InitializeRouter() { HKEY hTopLevelKey = NULL; HKEY hMapKey = NULL; HKEY hProviderKey = NULL; DWORD dwIndex = 0; WCHAR lpszProvider[MAX_PATH]; DWORD dwchProvider = 0; WCHAR lpszNamespace[MAX_PATH]; WCHAR lpszAliases[MAX_PATH]; DWORD dwchNamespace = 0; DWORD dwchAliases = 0; PROUTER_ENTRY pRouterHead = NULL, pRouterEntry = NULL; LPCLSID pclsid = NULL; HRESULT hr; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszTopLevel, 0, KEY_READ, &hTopLevelKey ) != ERROR_SUCCESS) { // must succeed goto CleanupAndExit; } if (RegOpenKeyEx(hTopLevelKey, lpszProviders, 0, KEY_READ, &hMapKey ) != ERROR_SUCCESS) { // must succeed; at least one provider from ADSI goto CleanupAndExit; } memset(lpszProvider, 0, sizeof(lpszProvider)); // // Size has to be in number of TCHARS not in bytes. // dwchProvider = sizeof(lpszProvider)/sizeof(WCHAR); while(RegEnumKeyEx(hMapKey, dwIndex++, // + index even if last 1 bail out in mid loop lpszProvider, &dwchProvider, NULL, NULL, NULL, NULL ) == ERROR_SUCCESS) { // // Read namespace // if (RegOpenKeyEx(hMapKey, lpszProvider, 0, KEY_READ, &hProviderKey ) != ERROR_SUCCESS) { // // if cannot read registry of 1 provider, continue with others; // especially since providers can be written outside ADSI // memset(lpszProvider, 0, sizeof(lpszProvider)); dwchProvider = sizeof(lpszProvider)/sizeof(WCHAR); continue; } memset(lpszNamespace, 0, sizeof(lpszNamespace)); dwchNamespace = sizeof(lpszNamespace); if (RegQueryValueEx(hProviderKey, NULL, NULL, NULL, (LPBYTE) lpszNamespace, &dwchNamespace ) != ERROR_SUCCESS) { // // if cannot read registry of 1 provider, continue with others; // especially since providers can be written outside ADSI // RegCloseKey(hProviderKey); hProviderKey = NULL; memset(lpszProvider, 0, sizeof(lpszProvider)); dwchProvider = sizeof(lpszProvider)/sizeof(WCHAR); continue; } // // If Aliases value name is defined, get the values // memset(lpszAliases, 0, sizeof(lpszAliases)); dwchAliases = sizeof(lpszAliases); RegQueryValueEx(hProviderKey, L"Aliases", NULL, NULL, (LPBYTE) lpszAliases, &dwchAliases ); RegCloseKey(hProviderKey); hProviderKey = NULL; // // Generate CLSID from the ProgID // pclsid = (LPCLSID)LocalAlloc(LPTR, sizeof(CLSID)); if (!pclsid) { // // if cannot read registry of 1 provider, continue with others; // especially since providers can be written outside ADSI // memset(lpszProvider, 0, sizeof(lpszProvider)); dwchProvider = sizeof(lpszProvider)/sizeof(WCHAR); continue; } hr = CLSIDFromProgID(lpszNamespace, pclsid); if (FAILED(hr)) { LocalFree(pclsid); } else { if (pRouterEntry = (PROUTER_ENTRY)LocalAlloc(LPTR, sizeof(ROUTER_ENTRY))){ wcscpy(pRouterEntry->szProviderProgId, lpszProvider); wcscpy(pRouterEntry->szNamespaceProgId, lpszNamespace); wcscpy(pRouterEntry->szAliases, lpszAliases); pRouterEntry->pNamespaceClsid = pclsid; pRouterEntry->pNext = pRouterHead; pRouterHead = pRouterEntry; } } memset(lpszProvider, 0, sizeof(lpszProvider)); dwchProvider = sizeof(lpszProvider)/sizeof(WCHAR); } CleanupAndExit: if (hProviderKey) { RegCloseKey(hProviderKey); } if (hMapKey) { RegCloseKey(hMapKey); } if (hTopLevelKey) { RegCloseKey(hTopLevelKey); } return(pRouterHead); } void CleanupRouter( PROUTER_ENTRY pRouterHead ) { PROUTER_ENTRY pRouter = pRouterHead, pRouterNext = NULL; while (pRouter) { pRouterNext = pRouter->pNext; if (pRouter->pNamespaceClsid) { LocalFree(pRouter->pNamespaceClsid); } LocalFree(pRouter); pRouter = pRouterNext; } return; }