windows-nt/Source/XPSP1/NT/ds/adsi/router/router.cxx
2020-09-26 16:20:57 +08:00

220 lines
5.7 KiB
C++

//+---------------------------------------------------------------------------
//
// 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;
}