msluobj.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 4k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "mslocusr.h"
  2. #include "msluglob.h"
  3. STDMETHODIMP CLUClassFactory::QueryInterface(
  4. /* [in] */ REFIID riid,
  5. /* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
  6. {
  7. *ppvObject = NULL;
  8. if (IsEqualIID(riid, IID_IUnknown) ||
  9. IsEqualIID(riid, IID_IClassFactory)) {
  10. *ppvObject = (LPVOID)this;
  11. AddRef();
  12. return NOERROR;
  13. }
  14. return ResultFromScode(E_NOINTERFACE);
  15. }
  16. STDMETHODIMP_(ULONG) CLUClassFactory::AddRef(void)
  17. {
  18. RefThisDLL(TRUE);
  19. return 1;
  20. }
  21. STDMETHODIMP_(ULONG) CLUClassFactory::Release(void)
  22. {
  23. RefThisDLL(FALSE);
  24. return 1;
  25. }
  26. HRESULT CreateUserDatabase(REFIID riid, void **ppOut)
  27. {
  28. CLUDatabase *pObj = new CLUDatabase;
  29. if (NULL == pObj)
  30. return ResultFromScode(E_OUTOFMEMORY);
  31. HRESULT hr = pObj->QueryInterface(riid, ppOut);
  32. if (FAILED(hr)) {
  33. delete pObj;
  34. }
  35. else {
  36. pObj->AddRef();
  37. }
  38. return NOERROR;
  39. }
  40. STDMETHODIMP CLUClassFactory::CreateInstance(
  41. /* [unique][in] */ IUnknown __RPC_FAR *pUnkOuter,
  42. /* [in] */ REFIID riid,
  43. /* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
  44. {
  45. if (NULL != pUnkOuter)
  46. return ResultFromScode(CLASS_E_NOAGGREGATION);
  47. return CreateUserDatabase(riid, ppvObject);
  48. }
  49.         
  50. STDMETHODIMP CLUClassFactory::LockServer( 
  51. /* [in] */ BOOL fLock)
  52. {
  53. LockThisDLL(fLock);
  54. return NOERROR;
  55. }
  56. /* This function signals our stub NP DLL in MPREXE's context to load or
  57.  * unload MSLOCUSR as a net provider DLL.  This way, when we uninstall,
  58.  * DllUnregisterServer can get MSLOCUSR unloaded from MPREXE's process
  59.  * space, so it can be deleted and upgraded.  Then, DllRegisterServer
  60.  * will tell the stub NP to reload MSLOCUSR again.
  61.  */
  62. void SignalStubNP(BOOL fLoad)
  63. {
  64.     HWND hwnd = FindWindow("WndClass_NPSTUBMonitor", NULL);
  65.     if (hwnd != NULL) {
  66.         SendMessage(hwnd, fLoad ? WM_USER : (WM_USER+1), 0, 0);
  67.     }
  68. }
  69. extern "C" {
  70. STDAPI DllRegisterServer(void)
  71. {
  72. HKEY hkeyCLSID;
  73. HKEY hkeyOurs;
  74. HKEY hkeyInproc;
  75. LONG err;
  76. err = ::RegOpenKey(HKEY_CLASSES_ROOT, ::szCLSID, &hkeyCLSID);
  77. if (err == ERROR_SUCCESS) {
  78. err = ::RegCreateKey(hkeyCLSID, ::szOurCLSID, &hkeyOurs);
  79. if (err == ERROR_SUCCESS) {
  80. err = ::RegCreateKey(hkeyOurs, ::szINPROCSERVER32, &hkeyInproc);
  81. if (err == ERROR_SUCCESS) {
  82. err = ::RegSetValueEx(hkeyInproc, NULL, 0, REG_SZ,
  83.   (LPBYTE)::szDLLNAME, ::strlenf(::szDLLNAME));
  84. if (err == ERROR_SUCCESS) {
  85. err = ::RegSetValueEx(hkeyInproc, ::szTHREADINGMODEL, 0,
  86.   REG_SZ, (LPBYTE)::szAPARTMENT,
  87.   ::strlenf(::szAPARTMENT));
  88. }
  89. ::RegCloseKey(hkeyInproc);
  90. }
  91. ::RegCloseKey(hkeyOurs);
  92. }
  93. ::RegCloseKey(hkeyCLSID);
  94. }
  95. if (err == ERROR_SUCCESS)
  96. return S_OK;
  97. else
  98. return HRESULT_FROM_WIN32(err);
  99. }
  100. STDAPI DllUnregisterServer(void)
  101. {
  102. HKEY hkeyCLSID;
  103. HKEY hkeyOurs;
  104. LONG err;
  105. err = ::RegOpenKey(HKEY_CLASSES_ROOT, ::szCLSID, &hkeyCLSID);
  106. if (err == ERROR_SUCCESS) {
  107. err = ::RegOpenKey(hkeyCLSID, ::szOurCLSID, &hkeyOurs);
  108. if (err == ERROR_SUCCESS) {
  109. err = ::RegDeleteKey(hkeyOurs, ::szINPROCSERVER32);
  110. ::RegCloseKey(hkeyOurs);
  111. if (err == ERROR_SUCCESS)
  112. err = ::RegDeleteKey(hkeyCLSID, ::szOurCLSID);
  113. }
  114. ::RegCloseKey(hkeyCLSID);
  115. }
  116.     DeinstallLogonDialog();
  117. if (err == ERROR_SUCCESS)
  118. return S_OK;
  119. else
  120. return HRESULT_FROM_WIN32(err);
  121. }
  122. STDAPI DllInstall(BOOL fInstall, LPCSTR psz)
  123. {
  124.     SignalStubNP(fInstall);
  125.     return S_OK;
  126. }
  127. STDAPI DllCanUnloadNow(void)
  128. {
  129. SCODE sc;
  130. sc = (0 == g_cRefThisDll && 0 == g_cLocks) ? S_OK : S_FALSE;
  131. return ResultFromScode(sc);
  132. }
  133. STDAPI DllGetClassObject(
  134. REFCLSID rclsid,
  135. REFIID riid,
  136. LPVOID FAR *ppv)
  137. {
  138. if (!IsEqualCLSID(rclsid, CLSID_LocalUsers)) {
  139. return ResultFromScode(E_FAIL);
  140. }
  141. if (!IsEqualIID(riid, IID_IUnknown) &&
  142. !IsEqualIID(riid, IID_IClassFactory)) {
  143. return ResultFromScode(E_NOINTERFACE);
  144. }
  145. static CLUClassFactory cf;
  146. *ppv = (LPVOID)&cf;
  147. cf.AddRef();
  148. return NOERROR;
  149. }
  150. }; /* extern "C" */