443 lines
11 KiB
C++
443 lines
11 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1997.
|
|
//
|
|
// File: libmain.cxx
|
|
//
|
|
// Contents: DllMain for csadm.dll
|
|
//
|
|
// Functions: DllMain, DllGetClassObject
|
|
//
|
|
// History: 05-May-97 DebiM Created.
|
|
// 16-Feb-98 UShaji CsGetClassStorePathForUser
|
|
//----------------------------------------------------------------------------
|
|
#include "cstore.hxx"
|
|
|
|
#pragma hdrstop
|
|
|
|
void Uninitialize();
|
|
BOOL InitializeClassStore(BOOL fInit);
|
|
|
|
// Globals
|
|
HINSTANCE g_hInst = NULL;
|
|
ULONG g_ulObjCount = 0; // Number of objects alive in csadm.dll
|
|
|
|
CClassContainerCF *g_pCF = NULL;
|
|
extern CClassAccessCF * pCSAccessCF;
|
|
|
|
|
|
/*
|
|
void Uninit()
|
|
//
|
|
// This routine is called at dll detach time
|
|
//
|
|
{
|
|
//
|
|
// release the Class Factory object
|
|
//
|
|
if (g_pCF)
|
|
g_pCF->Release();
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Function: DllGetClassObject
|
|
//
|
|
// Synopsis: Standard DLL entrypoint for locating class factories
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDAPI
|
|
DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID FAR* ppv)
|
|
{
|
|
HRESULT hr;
|
|
size_t i;
|
|
|
|
if (IsEqualCLSID(clsid, CLSID_DirectoryClassBase))
|
|
{
|
|
return g_pCF->QueryInterface(iid, ppv);
|
|
}
|
|
|
|
if (IsEqualCLSID(clsid, CLSID_ClassAccess))
|
|
{
|
|
return pCSAccessCF->QueryInterface(iid, ppv);
|
|
}
|
|
|
|
*ppv = NULL;
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Function: DllCanUnloadNow
|
|
//
|
|
// Synopsis: Standard DLL entrypoint to determine if DLL can be unloaded
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
STDAPI
|
|
DllCanUnloadNow(void)
|
|
{
|
|
HRESULT hr;
|
|
|
|
hr = S_FALSE;
|
|
|
|
//
|
|
// BugBug
|
|
//
|
|
/*
|
|
if (ulObjectCount > 0)
|
|
hr = S_FALSE;
|
|
else
|
|
hr = S_OK;
|
|
*/
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Function: LibMain
|
|
//
|
|
// Synopsis: Standard DLL initialization entrypoint
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
EXTERN_C BOOL __cdecl
|
|
LibMain(HINSTANCE hInst, ULONG ulReason, LPVOID pvReserved)
|
|
{
|
|
HRESULT hr;
|
|
DWORD cbSize = _MAX_PATH;
|
|
WCHAR wszUserName [_MAX_PATH];
|
|
|
|
switch (ulReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
DisableThreadLibraryCalls(hInst);
|
|
g_hInst = hInst;
|
|
//g_pCF = new CClassContainerCF;
|
|
InitializeClassStore(FALSE);
|
|
break;
|
|
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
//Uninit();
|
|
Uninitialize();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: DllMain
|
|
//
|
|
// Synopsis: entry point for NT
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
BOOL
|
|
DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|
{
|
|
return LibMain((HINSTANCE)hDll, dwReason, lpReserved);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Function: CsCreateClassStore
|
|
//
|
|
// Synopsis: Public entrypoint for creating an empty class store. factories
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDAPI
|
|
CsCreateClassStore(LPOLESTR szParentPath, LPOLESTR szStoreName)
|
|
{
|
|
LPOLESTR szPath;
|
|
if (wcsncmp (szParentPath, L"ADCS:", 5) == 0)
|
|
szPath = szParentPath + 5;
|
|
else
|
|
szPath = szParentPath;
|
|
return CreateRepository(szPath, szStoreName);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Function: CsGetClassStore
|
|
//
|
|
// Synopsis: Public entrypoint for binding to a class store and
|
|
// get back IClassAdmin
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDAPI
|
|
CsGetClassStore(LPOLESTR szPath, void **ppIClassAdmin)
|
|
{
|
|
return g_pCF->CreateConnectedInstance(
|
|
szPath,
|
|
ppIClassAdmin);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Function: CsDeleteClassStore
|
|
//
|
|
// Synopsis: Public entrypoint for deleting a class store container from DS.
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDAPI
|
|
CsDeleteClassStore(LPOLESTR szPath)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// CsGetAppCategories
|
|
//
|
|
// Returns the complete list of Category GUIDs and Category Descriptions
|
|
// per the input Locale.
|
|
//
|
|
//
|
|
// This is used by Add/Remove programs to get the definitive list of
|
|
// Application Categories.
|
|
//
|
|
// The caller needs to free the memory allocated using CoTaskMemFree().
|
|
//
|
|
// Arguments:
|
|
// [in]
|
|
// LCID : Locale
|
|
// [out]
|
|
// APPCATEGORYINFOLIST *pAppCategoryList:
|
|
// Returned list of GUIDs and Unicode descriptions
|
|
//
|
|
// Returns :
|
|
// S_OK
|
|
//
|
|
//--------------------------------------------------------------------
|
|
STDAPI
|
|
CsGetAppCategories (APPCATEGORYINFOLIST *pAppCategoryList)
|
|
{
|
|
HRESULT hr;
|
|
IClassAdmin * pIClassAdmin = NULL;
|
|
|
|
hr = g_pCF->CreateInstance(
|
|
NULL,
|
|
IID_IClassAdmin,
|
|
(void **)&pIClassAdmin);
|
|
|
|
if (!SUCCEEDED(hr))
|
|
return hr;
|
|
|
|
hr = pIClassAdmin->GetAppCategories (
|
|
GetUserDefaultLCID(),
|
|
pAppCategoryList);
|
|
|
|
pIClassAdmin->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// CsGetClassStorePath
|
|
//
|
|
// Returns the class store path for the user.
|
|
//
|
|
//
|
|
// This is used by Winlogon to get the class store path for a given user.
|
|
//
|
|
// The caller needs to free the memory allocated using CoTaskMemFree().
|
|
//
|
|
// Arguments:
|
|
// [in]
|
|
// DSProfilePath: Path For the DS Object given to winlogon.
|
|
// User Doesn't have to any checks.
|
|
//
|
|
// [out]
|
|
// pCSPath: Unicode Path to the class store for the user.
|
|
//
|
|
// Returns :
|
|
// S_OK, or whatever error underlying DS layer returns.
|
|
// BUGBUG:: Error code have to be remapped.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
STDAPI
|
|
CsGetClassStorePath(LPOLESTR DSProfilePath, LPOLESTR *pCSPath)
|
|
{
|
|
#if (0)
|
|
HRESULT hr = S_OK;
|
|
IADs *pADs = NULL;
|
|
|
|
if ((!DSProfilePath) || (IsBadStringPtr(DSProfilePath, _MAX_PATH)))
|
|
return E_INVALIDARG;
|
|
|
|
hr = ADsGetObject(
|
|
DSProfilePath,
|
|
IID_IADs,
|
|
(void **)&pADs
|
|
);
|
|
|
|
RETURN_ON_FAILURE(hr);
|
|
|
|
hr = GetPropertyAlloc(pADs, DEFAULTCLASSSTOREPATH, pCSPath);
|
|
|
|
pADs->Release();
|
|
|
|
return hr;
|
|
#else // temporary hack until property is written to ds
|
|
|
|
if (!(*pCSPath = (WCHAR*) CoTaskMemAlloc(lstrlen(DSProfilePath) * sizeof (WCHAR) + sizeof L"CN=Class Store,")))
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
lstrcpy(*pCSPath, L"LDAP://");
|
|
lstrcat(*pCSPath, L"CN=Class Store,");
|
|
lstrcat(*pCSPath, DSProfilePath + ((sizeof(L"LDAP://") / sizeof(WCHAR)) - 1));
|
|
|
|
return S_OK;
|
|
#endif
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// CsSetClassStorePath
|
|
//
|
|
// Writes the user class store path.
|
|
//
|
|
//
|
|
// This is used by MMC snapin to write the class store path for a given user.
|
|
//
|
|
// Arguments:
|
|
// [in]
|
|
// DSProfilePath: Path For the DS Object.
|
|
// User Doesn't have to any checks.
|
|
//
|
|
// pCSPath: Unicode Path to the class store for the user.
|
|
//
|
|
// Returns :
|
|
// S_OK, or whatever error underlying DS layer returns.
|
|
// BUGBUG:: Error code have to be remapped.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
STDAPI
|
|
CsSetClassStorePath(LPOLESTR DSProfilePath, LPOLESTR szCSPath)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IADs *pADs = NULL;
|
|
|
|
if ((!DSProfilePath) || (IsBadStringPtr(DSProfilePath, _MAX_PATH)))
|
|
return E_INVALIDARG;
|
|
|
|
hr = ADsGetObject(
|
|
DSProfilePath,
|
|
IID_IADs,
|
|
(void **)&pADs
|
|
);
|
|
|
|
RETURN_ON_FAILURE(hr);
|
|
|
|
hr = SetProperty(pADs, DEFAULTCLASSSTOREPATH, szCSPath);
|
|
|
|
if (SUCCEEDED(hr))
|
|
hr = StoreIt(pADs);
|
|
|
|
pADs->Release();
|
|
|
|
return hr;
|
|
}
|
|
STDAPI
|
|
ReleasePackageInfo(PACKAGEDISPINFO *pPackageInfo)
|
|
{
|
|
DWORD i;
|
|
if (pPackageInfo)
|
|
{
|
|
CoTaskMemFree(pPackageInfo->pszScriptPath);
|
|
CoTaskMemFree(pPackageInfo->pszPackageName);
|
|
for (i = 0; i < (pPackageInfo->cUpgrades); i++)
|
|
CoTaskMemFree(pPackageInfo->prgUpgradeScript[i]);
|
|
CoTaskMemFree(pPackageInfo->prgUpgradeScript);
|
|
CoTaskMemFree(pPackageInfo->prgUpgradeFlag);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDAPI
|
|
ReleaseInstallInfo(INSTALLINFO *pInstallInfo)
|
|
{
|
|
DWORD i;
|
|
if (pInstallInfo)
|
|
{
|
|
CoTaskMemFree(pInstallInfo->pszSetupCommand);
|
|
CoTaskMemFree(pInstallInfo->pszScriptPath);
|
|
CoTaskMemFree(pInstallInfo->pszUrl);
|
|
CoTaskMemFree(pInstallInfo->pClsid);
|
|
for (i = 0; i < (pInstallInfo->cUpgrades); i++)
|
|
CoTaskMemFree(pInstallInfo->prgUpgradeScript[i]);
|
|
CoTaskMemFree(pInstallInfo->prgUpgradeScript);
|
|
CoTaskMemFree(pInstallInfo->prgUpgradeFlag);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
void
|
|
ReleaseClassDetail(CLASSDETAIL ClassDetail)
|
|
{
|
|
DWORD i;
|
|
for (i = 0; i < ClassDetail.cProgId; i++)
|
|
CoTaskMemFree(ClassDetail.prgProgId[i]);
|
|
CoTaskMemFree(ClassDetail.prgProgId);
|
|
}
|
|
|
|
STDAPI
|
|
ReleasePackageDetail(PACKAGEDETAIL *pPackageDetail)
|
|
{
|
|
DWORD i;
|
|
if (pPackageDetail)
|
|
{
|
|
if (pPackageDetail->pActInfo)
|
|
{
|
|
for (i = 0; i < pPackageDetail->pActInfo->cClasses; i++)
|
|
ReleaseClassDetail((pPackageDetail->pActInfo->pClasses)[i]);
|
|
CoTaskMemFree(pPackageDetail->pActInfo->pClasses);
|
|
|
|
CoTaskMemFree(pPackageDetail->pActInfo->prgShellFileExt);
|
|
CoTaskMemFree(pPackageDetail->pActInfo->prgPriority);
|
|
CoTaskMemFree(pPackageDetail->pActInfo->prgInterfaceId);
|
|
CoTaskMemFree(pPackageDetail->pActInfo->prgTlbId);
|
|
CoTaskMemFree(pPackageDetail->pActInfo);
|
|
}
|
|
|
|
if (pPackageDetail->pPlatformInfo)
|
|
{
|
|
CoTaskMemFree(pPackageDetail->pPlatformInfo->prgPlatform);
|
|
CoTaskMemFree(pPackageDetail->pPlatformInfo->prgLocale);
|
|
CoTaskMemFree(pPackageDetail->pPlatformInfo);
|
|
}
|
|
|
|
if (pPackageDetail->pInstallInfo)
|
|
{
|
|
ReleaseInstallInfo(pPackageDetail->pInstallInfo);
|
|
CoTaskMemFree(pPackageDetail->pInstallInfo);
|
|
}
|
|
|
|
for (i = 0; i < (pPackageDetail->cSources); i++)
|
|
CoTaskMemFree(pPackageDetail->pszSourceList[i]);
|
|
|
|
CoTaskMemFree(pPackageDetail->pszSourceList);
|
|
CoTaskMemFree(pPackageDetail->rpCategory);
|
|
}
|
|
return S_OK;
|
|
}
|