201 lines
3.8 KiB
C++
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" */
|