windows-nt/Source/XPSP1/NT/shell/ext/ratings/mslocusr/msluobj.cpp
2020-09-26 16:20:57 +08:00

201 lines
3.8 KiB
C++

#include "mslocusr.h"
#include "msluglob.h"
STDMETHODIMP CLUClassFactory::QueryInterface(
/* [in] */ REFIID riid,
/* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{
*ppvObject = NULL;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_IClassFactory)) {
*ppvObject = (LPVOID)this;
AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CLUClassFactory::AddRef(void)
{
RefThisDLL(TRUE);
return 1;
}
STDMETHODIMP_(ULONG) CLUClassFactory::Release(void)
{
RefThisDLL(FALSE);
return 1;
}
HRESULT CreateUserDatabase(REFIID riid, void **ppOut)
{
CLUDatabase *pObj = new CLUDatabase;
if (NULL == pObj)
return ResultFromScode(E_OUTOFMEMORY);
HRESULT hr = pObj->QueryInterface(riid, ppOut);
if (FAILED(hr)) {
delete pObj;
}
else {
pObj->AddRef();
}
return NOERROR;
}
STDMETHODIMP CLUClassFactory::CreateInstance(
/* [unique][in] */ IUnknown __RPC_FAR *pUnkOuter,
/* [in] */ REFIID riid,
/* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{
if (NULL != pUnkOuter)
return ResultFromScode(CLASS_E_NOAGGREGATION);
return CreateUserDatabase(riid, ppvObject);
}
STDMETHODIMP CLUClassFactory::LockServer(
/* [in] */ BOOL fLock)
{
LockThisDLL(fLock);
return NOERROR;
}
/* This function signals our stub NP DLL in MPREXE's context to load or
* unload MSLOCUSR as a net provider DLL. This way, when we uninstall,
* DllUnregisterServer can get MSLOCUSR unloaded from MPREXE's process
* space, so it can be deleted and upgraded. Then, DllRegisterServer
* will tell the stub NP to reload MSLOCUSR again.
*/
void SignalStubNP(BOOL fLoad)
{
HWND hwnd = FindWindow("WndClass_NPSTUBMonitor", NULL);
if (hwnd != NULL) {
SendMessage(hwnd, fLoad ? WM_USER : (WM_USER+1), 0, 0);
}
}
extern "C" {
STDAPI DllRegisterServer(void)
{
HKEY hkeyCLSID;
HKEY hkeyOurs;
HKEY hkeyInproc;
LONG err;
err = ::RegOpenKey(HKEY_CLASSES_ROOT, ::szCLSID, &hkeyCLSID);
if (err == ERROR_SUCCESS) {
err = ::RegCreateKey(hkeyCLSID, ::szOurCLSID, &hkeyOurs);
if (err == ERROR_SUCCESS) {
err = ::RegCreateKey(hkeyOurs, ::szINPROCSERVER32, &hkeyInproc);
if (err == ERROR_SUCCESS) {
err = ::RegSetValueEx(hkeyInproc, NULL, 0, REG_EXPAND_SZ,
(LPBYTE)::szDLLNAME, ::strlenf(::szDLLNAME));
if (err == ERROR_SUCCESS) {
err = ::RegSetValueEx(hkeyInproc, ::szTHREADINGMODEL, 0,
REG_SZ, (LPBYTE)::szAPARTMENT,
::strlenf(::szAPARTMENT));
}
::RegCloseKey(hkeyInproc);
}
::RegCloseKey(hkeyOurs);
}
::RegCloseKey(hkeyCLSID);
}
if (err == ERROR_SUCCESS)
return S_OK;
else
return HRESULT_FROM_WIN32(err);
}
STDAPI DllUnregisterServer(void)
{
HKEY hkeyCLSID;
HKEY hkeyOurs;
LONG err;
err = ::RegOpenKey(HKEY_CLASSES_ROOT, ::szCLSID, &hkeyCLSID);
if (err == ERROR_SUCCESS) {
err = ::RegOpenKey(hkeyCLSID, ::szOurCLSID, &hkeyOurs);
if (err == ERROR_SUCCESS) {
err = ::RegDeleteKey(hkeyOurs, ::szINPROCSERVER32);
::RegCloseKey(hkeyOurs);
if (err == ERROR_SUCCESS)
err = ::RegDeleteKey(hkeyCLSID, ::szOurCLSID);
}
::RegCloseKey(hkeyCLSID);
}
DeinstallLogonDialog();
if (err == ERROR_SUCCESS)
return S_OK;
else
return HRESULT_FROM_WIN32(err);
}
STDAPI DllInstall(BOOL fInstall, LPCSTR psz)
{
SignalStubNP(fInstall);
return S_OK;
}
STDAPI DllCanUnloadNow(void)
{
SCODE sc;
sc = (0 == g_cRefThisDll && 0 == g_cLocks) ? S_OK : S_FALSE;
return ResultFromScode(sc);
}
STDAPI DllGetClassObject(
REFCLSID rclsid,
REFIID riid,
LPVOID FAR *ppv)
{
if (!IsEqualCLSID(rclsid, CLSID_LocalUsers)) {
return ResultFromScode(E_FAIL);
}
if (!IsEqualIID(riid, IID_IUnknown) &&
!IsEqualIID(riid, IID_IClassFactory)) {
return ResultFromScode(E_NOINTERFACE);
}
static CLUClassFactory cf;
*ppv = (LPVOID)&cf;
cf.AddRef();
return NOERROR;
}
}; /* extern "C" */