220 lines
5.7 KiB
C++
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;
|
|
|
|
}
|
|
|