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

Windows Kernel

Development Platform:

Visual C++

  1. // vsengine.cpp : Implementation of DLL Exports.
  2. // Note: Proxy/Stub Information
  3. // To build a separate proxy/stub DLL, 
  4. // run nmake -f vsengineps.mk in the project directory.
  5. #include "stdafx.h"
  6. #include "resource.h"
  7. #include "initguid.h"
  8. #include "vsengine.h"
  9. #include "vsengine_i.c"
  10. #include "c:ntpublicsdkincvrsscan.h"
  11. #include "Provider.h"
  12. #define szVSEngine      "Microsoft VSEngine Test Driver"
  13. #define wszVSEngine     L"Microsoft VSEngine Test Driver"
  14. #define szCLSIDProvider "68E721E0-CD58-11D0-BD3D-00AA00B92AF1"
  15. #define szCookie        "Cookie"
  16. #define szVendorContactInfo         "VendorContactInfo"
  17. #define szVendorContactInfoValue    "Microsoft Corp., Redmond, WA"
  18. #define szVendorDescription         "VendorDescription"
  19. #define szVendorDescriptionValue    "Microsoft VSEngine Test Driver"
  20. #define szVendorFlags               "VendorFlags"
  21. #define szVendorFlagsValue          15
  22. #define szVendorIcon                "VendorIcon"
  23. #define szVendorIconValue           "vsengine.ico"
  24. #define WriteToRegistryStr(szKey,szValue)  
  25. if (RegSetValueEx(hkReg, (const char *)szKey, 0, REG_SZ, (BYTE *)szValue, lstrlen((const char *)szValue)+1) != ERROR_SUCCESS) {     
  26.         MessageBox(NULL,"Unable to write to registry (String).",szVSEngine,MB_OK); goto Exit; }
  27. #define WriteToRegistryDword(szKey,dwValue)  
  28. dwLocalValue = dwValue;  
  29. if (RegSetValueEx(hkReg, (const char *)szKey, 0, REG_DWORD, (BYTE *)&dwLocalValue, sizeof(DWORD)) != ERROR_SUCCESS) {     
  30.         MessageBox(NULL,"Unable to write to registry (Dword).",szVSEngine,MB_OK); goto Exit; }
  31. CComModule _Module;
  32. BEGIN_OBJECT_MAP(ObjectMap)
  33. OBJECT_ENTRY(CLSID_Provider, Provider)
  34. END_OBJECT_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // DLL Entry Point
  37. extern "C"
  38. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
  39. {
  40. if (dwReason == DLL_PROCESS_ATTACH)
  41. {
  42. _Module.Init(ObjectMap, hInstance);
  43. DisableThreadLibraryCalls(hInstance);
  44. }
  45. else if (dwReason == DLL_PROCESS_DETACH)
  46. _Module.Term();
  47. return TRUE;    // ok
  48. }
  49. /////////////////////////////////////////////////////////////////////////////
  50. // Used to determine whether the DLL can be unloaded by OLE
  51. STDAPI DllCanUnloadNow(void)
  52. {
  53. return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
  54. }
  55. /////////////////////////////////////////////////////////////////////////////
  56. // Returns a class factory to create an object of the requested type
  57. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
  58. {
  59. return _Module.GetClassObject(rclsid, riid, ppv);
  60. }
  61. /////////////////////////////////////////////////////////////////////////////
  62. // DllRegisterServer - Adds entries to the system registry
  63. STDAPI DllRegisterServer(void)
  64. {
  65. // registers object, typelib and all interfaces in typelib
  66. HRESULT hr, hr2 = _Module.RegisterServer(TRUE);
  67.     HKEY hkReg = NULL;
  68.     char RegName[2048];
  69.     DWORD dwLocalValue;
  70.     IUnknown *pUnk = NULL;
  71.     IRegisterVirusScanEngine *prvs = NULL;
  72.     if (hr2 != S_OK) {
  73.         char tmp[2048];
  74.         wsprintf(tmp,"Unable to register server (%08X)",hr2);
  75.         MessageBox(NULL,tmp,szVSEngine,MB_OK);
  76.         goto Exit;
  77.     }
  78.   
  79.     wsprintf(RegName,"CLSID\{%s}\VirusScanner",szCLSIDProvider);
  80.     if (RegOpenKeyEx(HKEY_CLASSES_ROOT,RegName,0,KEY_ALL_ACCESS,&hkReg) != ERROR_SUCCESS) {
  81.         DWORD dwDisp = 0;
  82.         if (RegCreateKeyEx(HKEY_CLASSES_ROOT, RegName, 0, NULL, REG_OPTION_NON_VOLATILE, 
  83.             KEY_ALL_ACCESS, NULL, &hkReg, &dwDisp) != ERROR_SUCCESS) {
  84.             MessageBox(NULL,"Unable open registry key 'VirusScanner'.",szVSEngine,MB_OK);
  85.             goto Exit;
  86.         }
  87.     }
  88.     WriteToRegistryStr(szVendorDescription, szVendorDescriptionValue);
  89.     WriteToRegistryStr(szVendorContactInfo, szVendorContactInfoValue);
  90.     WriteToRegistryDword(szVendorFlags, szVendorFlagsValue);
  91.     WriteToRegistryStr(szVendorIcon, szVendorIconValue);
  92.     hr = CoCreateInstance(CLSID_VirusScan, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnk);
  93.     if (FAILED(hr)) {
  94.         MessageBox(NULL,"Unable to register with CLSID_VirusScan",szVSEngine,MB_OK);
  95.         DllUnregisterServer();
  96.         return E_UNEXPECTED;
  97.     }
  98.     hr = pUnk->QueryInterface(IID_IRegisterVirusScanEngine, (void **)&prvs);
  99.     pUnk->Release();
  100.     
  101.     if (FAILED(hr)) {
  102.         MessageBox(NULL,"Unable to acquire IID_IRegisterVirusScanner",szVSEngine,MB_OK);
  103.         DllUnregisterServer();
  104.         return E_UNEXPECTED;
  105.     }
  106.     DWORD dwCookie;
  107.     hr = prvs->RegisterScanEngine(CLSID_Provider,wszVSEngine,15,0,&dwCookie);
  108.     
  109.     // Release virus scan object
  110.     prvs->Release();
  111.     if (FAILED(hr)) {
  112.         MessageBox(NULL,"CLSID_VirusScan failed to register CLSID_Provider",szVSEngine,MB_OK);
  113.         DllUnregisterServer();
  114.         return E_UNEXPECTED;
  115.     }
  116.     // Add cookie to registry
  117.     WriteToRegistryDword(szCookie,dwCookie);
  118. Exit:
  119.     if (hkReg != NULL)
  120.         RegCloseKey(hkReg);
  121.     return hr2;
  122. }
  123. /////////////////////////////////////////////////////////////////////////////
  124. // DllUnregisterServer - Removes entries from the system registry
  125. STDAPI DllUnregisterServer(void)
  126. {
  127. _Module.UnregisterServer();
  128.     // Don't bother cleaning up registry entries.
  129.     return S_OK;
  130. }