Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

207 lines
4.3 KiB

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996
//
// File: openobj.cxx
//
// Contents: ADs Wrapper Function to open an Active Directory object
//
//
// History: 11-15-95 krishnag Created.
//
//----------------------------------------------------------------------------
#include "oleds.hxx"
#pragma hdrstop
extern PROUTER_ENTRY g_pRouterHead;
extern CRITICAL_SECTION g_csRouterHeadCritSect;
//+---------------------------------------------------------------------------
// Function: ADsOpenObject
//
// Synopsis:
//
// Arguments: [LPWSTR lpszPathName]
// [LPWSTR lpszUserName]
// [LPWSTR lpszPassword]
// [REFIID riid]
// [void FAR * FAR * ppObject]
//
// Returns: HRESULT
//
// Modifies: -
//
// History: 07-12-96 krishnag Created.
//
//----------------------------------------------------------------------------
HRESULT
ADsOpenObject(
LPCWSTR lpszPathName,
LPCWSTR lpszUserName,
LPCWSTR lpszPassword,
DWORD dwReserved,
REFIID riid,
void FAR * FAR * ppObject
)
{
IADsOpenDSObject FAR * pNamespace = NULL;
IDispatch FAR * pDispatch = NULL;
HRESULT hr = S_OK;
GUID NamespaceClsid;
WCHAR lpszProgId[MAX_PATH];
hr = CopyADsProgId(
(LPWSTR)lpszPathName,
lpszProgId
);
BAIL_ON_FAILURE( hr );
hr = ADsGetCLSIDFromProgID(
lpszProgId,
&NamespaceClsid
);
BAIL_ON_FAILURE( hr );
hr = CoCreateInstance(
NamespaceClsid,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsOpenDSObject,
(void **)&pNamespace
);
BAIL_ON_FAILURE( hr );
hr = pNamespace->OpenDSObject(
(LPWSTR)lpszPathName,
(LPWSTR)lpszUserName,
(LPWSTR)lpszPassword,
(long)dwReserved,
&pDispatch
);
BAIL_ON_FAILURE( hr );
hr = pDispatch->QueryInterface(
riid,
ppObject
);
error:
if( pDispatch ) {
pDispatch->Release();
}
if( pNamespace ) {
pNamespace->Release();
}
RRETURN( hr );
}
//+---------------------------------------------------------------------------
// Function: CopyADsProgId
//
// Synopsis:
//
//
// Arguments: [LPWSTR Path]
// [LPWSTR szProgId]
//
// Returns: HRESULT
//
// Modifies: -
//
// History: 09-16-96 krishnag Created
//
//----------------------------------------------------------------------------
HRESULT
CopyADsProgId(
LPWSTR Path,
LPWSTR szProgId
)
{
LPWSTR pChar = NULL;
if( !Path )
return E_FAIL;
pChar = szProgId;
if( *Path == L'@' ) {
while (*Path != L'!' && *Path != L'\0') {
*pChar = *Path;
pChar++;
Path++;
}
if( *Path == L'\0' ) {
//
// couldn't find the terminating ! for the ProgID
//
return( E_FAIL );
}
}else {
while (*Path != L':' && *Path != L'\0') {
*pChar = *Path;
pChar++;
Path++;
}
if( *Path == L'\0' ) {
//
// couldn't find the terminating : for the ProgID
//
return( E_FAIL );
}
}
*pChar = L'\0';
return S_OK;
}
HRESULT
ADsGetCLSIDFromProgID(
LPWSTR pszProgId,
GUID * pClsid
)
{
//
// Make sure the router has been initialized
//
EnterCriticalSection(&g_csRouterHeadCritSect);
if (!g_pRouterHead) {
g_pRouterHead = InitializeRouter();
}
LeaveCriticalSection(&g_csRouterHeadCritSect);
PROUTER_ENTRY lpRouter = g_pRouterHead;
while (lpRouter){
if (!wcscmp(lpRouter->szProviderProgId, pszProgId)) {
memcpy(pClsid, lpRouter->pNamespaceClsid, sizeof(CLSID));
RRETURN(S_OK);
}
else if (!wcscmp(lpRouter->szAliases, pszProgId)) {
//
// Check Aliases
//
memcpy(pClsid, lpRouter->pNamespaceClsid, sizeof(CLSID));
RRETURN(S_OK);
}
lpRouter = lpRouter->pNext;
}
RRETURN( E_ADS_BAD_PATHNAME );
}