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

Windows Kernel

Development Platform:

Visual C++

  1. #include "priv.h"
  2. #include "privcpp.h"
  3. #include "ids.h"
  4. #include <advpub.h>
  5. #define INITGUID
  6. #include <initguid.h>
  7. #include "packguid.h"
  8. UINT g_cRefThisDll = 0;
  9. HINSTANCE g_hinst = NULL;
  10. STDAPI_(BOOL) DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
  11. {
  12.     switch(dwReason) {
  13.     case DLL_PROCESS_ATTACH:
  14.         g_hinst = hDll;
  15. #ifdef DEBUG
  16.         CcshellGetDebugFlags();
  17. #endif // DEBUG
  18.      break;
  19.     default:
  20.      break;
  21.     }
  22.     return TRUE;
  23. }
  24. void *  __cdecl operator new(unsigned int nSize)
  25. {
  26. return((LPVOID)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, nSize));
  27. }
  28. void  __cdecl operator delete(void *pv)
  29. {
  30. LocalFree((HLOCAL)pv);
  31. }
  32. extern "C" int __cdecl _purecall()
  33. {
  34. return(0);
  35. }
  36. class CMyClassFactory : public IClassFactory
  37. {
  38. public:
  39.     CMyClassFactory(REFCLSID rclsid);
  40.     ~CMyClassFactory() { g_cRefThisDll--; }
  41.     // IUnKnown
  42.     STDMETHODIMP         QueryInterface(REFIID,void **);
  43.     STDMETHODIMP_(ULONG) AddRef(void);
  44.     STDMETHODIMP_(ULONG) Release(void);
  45.     // IClassFactory
  46.     STDMETHODIMP CreateInstance(IUnknown* pUnkOuter, REFIID riid, void **ppvObject);
  47.     STDMETHODIMP LockServer(BOOL fLock);
  48. protected:
  49.     UINT   _cRef;
  50.     CLSID  _clsid;
  51. };
  52. CMyClassFactory::CMyClassFactory(REFCLSID rclsid) : _cRef(1), _clsid(rclsid)
  53. {
  54.     g_cRefThisDll++;
  55. }
  56. HRESULT CMyClassFactory::QueryInterface(REFIID riid, void **ppvObject)
  57. {
  58.     HRESULT hres;
  59.     if (IsEqualGUID(riid, IID_IClassFactory) || IsEqualGUID(riid, IID_IUnknown)) 
  60.     {
  61.         DebugMsg(DM_TRACE, "pack cf - QueryInterface called");
  62. _cRef++;
  63.      *ppvObject = (IClassFactory *)this;
  64. hres = NOERROR;
  65.     }
  66.     else
  67.     {
  68. *ppvObject = NULL;
  69. hres = E_NOINTERFACE;
  70.     }
  71.     return hres;
  72. }
  73. ULONG CMyClassFactory::AddRef(void)
  74. {
  75.     DebugMsg(DM_TRACE, "pack cf - AddRef called");
  76.     return ++_cRef;
  77. }
  78. ULONG CMyClassFactory::Release(void)
  79. {
  80.     DebugMsg(DM_TRACE, "pack cf - Release called");
  81.     if (--_cRef>0) {
  82.      return _cRef;
  83.     }
  84.     delete this;
  85.     return 0;
  86. }
  87. HRESULT CMyClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void **ppvObject)
  88. {
  89.     DebugMsg(DM_TRACE, "CMyClassFactory::CreateInstance called");
  90.     if (pUnkOuter)
  91. return CLASS_E_NOAGGREGATION;
  92.     IUnknown* punk;
  93.     HRESULT hres;
  94.     if (IsEqualGUID(_clsid, CLSID_CPackage))
  95.     {
  96. hres = CPackage_CreateInstnace(&punk);
  97.     }
  98.     else
  99.     {
  100. return E_UNEXPECTED;
  101.     }
  102.     if (SUCCEEDED(hres))
  103.     {
  104. hres = punk->QueryInterface(riid, ppvObject);
  105. punk->Release();
  106.     }
  107.     return hres;
  108. }
  109. HRESULT CMyClassFactory::LockServer(BOOL fLock)
  110. {
  111.     DebugMsg(DM_TRACE, "pack cf - LockServer called");
  112.     return S_OK;
  113. }
  114. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR* ppvOut)
  115. {
  116.     DebugMsg(DM_TRACE, "pack - DllGetClassObject called");
  117.     if (IsEqualGUID(rclsid,CLSID_CPackage))
  118.     {
  119.      CMyClassFactory *pmycls = new CMyClassFactory(rclsid);
  120. if (pmycls)
  121. {
  122.     HRESULT hres = pmycls->QueryInterface(riid, ppvOut);
  123.     pmycls->Release();
  124.     return hres;
  125. }
  126. return E_OUTOFMEMORY;
  127.     }
  128.     return CLASS_E_CLASSNOTAVAILABLE;
  129. }
  130. STDAPI DllCanUnloadNow(void)
  131. {
  132.     DebugMsg(DM_TRACE, "pack - DllCanUnloadNow called");
  133.     if (g_cRefThisDll)
  134.     {
  135. return S_FALSE;
  136.     }
  137.     DebugMsg(DM_TRACE, "pack - DllCanUnloadNow returning S_OK (bye, bye...)");
  138.     return S_OK;
  139. }
  140. // Call ADVPACK for the given section of our resource based INF>
  141. //   hInstance = resource instance to get REGINST section from
  142. //   szSection = section name to invoke
  143. HRESULT CallRegInstall(HINSTANCE hInstance, LPCSTR szSection)
  144. {
  145.     HRESULT hr = E_FAIL;
  146.     HINSTANCE hinstAdvPack = LoadLibrary(TEXT("ADVPACK.DLL"));
  147.     if (hinstAdvPack)
  148.     {
  149.         REGINSTALL pfnri = (REGINSTALL)GetProcAddress(hinstAdvPack, "RegInstall");
  150.         if ( pfnri )
  151.         {
  152. #ifdef WINNT
  153.             STRENTRY seReg[] =
  154.             {
  155.                 // These two NT-specific entries must be at the end
  156.                 { "25", "%SystemRoot%" },
  157.                 { "11", "%SystemRoot%\system32" },
  158.             };
  159.             STRTABLE stReg = { ARRAYSIZE(seReg), seReg };
  160.             hr = pfnri(hInstance, szSection, &stReg);
  161. #else
  162.             hr = pfnri(hInstance, szSection, NULL);
  163. #endif
  164.         }
  165.         FreeLibrary(hinstAdvPack);
  166.     }
  167.     return hr;
  168. }
  169. STDAPI DllRegisterServer(void)
  170. {
  171.     CallRegInstall(g_hinst, "RegDll");
  172.     return S_OK;
  173. }
  174. STDAPI DllUnregisterServer(void)
  175. {
  176.     CallRegInstall(g_hinst, "UnregDll");
  177.     return S_OK;
  178. }