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

Windows Kernel

Development Platform:

Visual C++

  1. // vsscan.cpp : Implementation of WinMain
  2. // Note: Proxy/Stub Information
  3. // To build a separate proxy/stub DLL, 
  4. // run nmake -f vsscanps.mk in the project directory.
  5. #include "stdafx.h"
  6. #include "resource.h"
  7. #include "initguid.h"
  8. #include "vsscan.h"
  9. #include "..\..\..\..\..\public\sdk\inc\vrsscan.h"
  10. #include "..\..\..\..\..\private\iedev\uuid\vrsscan_i.c"
  11. LONG CExeModule::Unlock()
  12. {
  13. LONG l = CComModule::Unlock();
  14. if (l == 0)
  15. {
  16. #if _WIN32_WINNT >= 0x0400
  17. if (CoSuspendClassObjects() == S_OK)
  18. PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  19. #else
  20. PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
  21. #endif
  22. }
  23. return l;
  24. }
  25. CExeModule _Module;
  26. BEGIN_OBJECT_MAP(ObjectMap)
  27. END_OBJECT_MAP()
  28. LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
  29. {
  30. while (*p1 != NULL)
  31. {
  32. LPCTSTR p = p2;
  33. while (*p != NULL)
  34. {
  35. if (*p1 == *p++)
  36. return p1+1;
  37. }
  38. p1++;
  39. }
  40. return NULL;
  41. }
  42. LPWSTR MakeWideStrFromAnsi(LPSTR psz)
  43. {
  44.     LPWSTR pwsz;
  45.     int i;
  46.     // arg checking.
  47.     //
  48.     if (!psz) return NULL;
  49.     // compute the length of the required BSTR
  50.     //
  51.     if ((i = MultiByteToWideChar(CP_ACP, 0, psz, -1, NULL, 0)) <= 0)
  52.         return NULL;
  53.     // allocate the widestr, +1 for terminating null
  54.     //
  55.     pwsz = (LPWSTR) CoTaskMemAlloc(i * sizeof(WCHAR));
  56.     
  57.     if (!pwsz) return NULL;
  58.     MultiByteToWideChar(CP_ACP, 0, psz, -1, pwsz, i);
  59.     pwsz[i - 1] = 0;
  60.     return pwsz;
  61. }
  62. /////////////////////////////////////////////////////////////////////////////
  63. //
  64. extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, 
  65. HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
  66. {
  67.     char szTmp[2048];
  68.     LPWSTR wszDesc;
  69.     TCHAR szSep[] = _T(" ");
  70.     DWORD dwFlags = 0;
  71.     lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
  72. HRESULT hRes = CoInitialize(NULL);
  73. //  If you are running on NT 4.0 or higher you can use the following call
  74. // instead to make the EXE free threaded.
  75. //  This means that calls come in on a random RPC thread
  76. // HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  77. _ASSERTE(SUCCEEDED(hRes));
  78. _Module.Init(ObjectMap, hInstance);
  79. _Module.dwThreadID = GetCurrentThreadId();
  80. TCHAR szTokens[] = _T("-/");
  81. int nRet = 0;
  82. BOOL bRun = TRUE;
  83. LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
  84. while (lpszToken != NULL)
  85. {
  86.         if (lstrcmpi(lpszToken, _T("UI")) == 0) dwFlags |= SFV_DOUI;
  87.         if (lstrcmpi(lpszToken, _T("NOUI")) == 0) dwFlags |= SFV_DONTDOUI;
  88.         if (lstrcmpi(lpszToken, _T("DEL")) == 0) dwFlags |= SFV_DELETE;
  89.         if (lstrcmpi(lpszToken, _T("ICON")) == 0) dwFlags |= SFV_WANTVENDORICON;
  90.         if (lstrcmpi(lpszToken, _T("?")) == 0) {
  91.             MessageBox(NULL,"vsscan [/UI] [/NOUI] [/DEL] [/ICON] [file1] [file2] ...",NULL,MB_OK);
  92.         }
  93. if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
  94. {
  95. _Module.UpdateRegistryFromResource(IDR_Vsscan, FALSE);
  96. nRet = _Module.UnregisterServer();
  97. bRun = FALSE;
  98. break;
  99. }
  100. if (lstrcmpi(lpszToken, _T("RegServer"))==0)
  101. {
  102. _Module.UpdateRegistryFromResource(IDR_Vsscan, TRUE);
  103. nRet = _Module.RegisterServer(TRUE);
  104. bRun = FALSE;
  105. break;
  106. }
  107. lpszToken = FindOneOf(lpszToken, szTokens);
  108. }
  109. /*
  110. if (bRun)
  111. {
  112. hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
  113. REGCLS_MULTIPLEUSE);
  114. _ASSERTE(SUCCEEDED(hRes));
  115. MSG msg;
  116. while (GetMessage(&msg, 0, 0, 0))
  117. DispatchMessage(&msg);
  118. _Module.RevokeClassObjects();
  119. }
  120. */
  121.     // Activate virus scan.
  122.     IUnknown *pUnk = NULL;
  123.     IVirusScanner *pvs = NULL;
  124.     if (FAILED(CoCreateInstance(CLSID_VirusScan, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnk))) {
  125.         MessageBox(NULL,"Failed CoCreateInstance of VirusScan object.nnEnsure VIRUSCHK.DLL is registered.",NULL,MB_OK);
  126.         goto Exit;
  127.     }
  128.     if (FAILED(pUnk->QueryInterface(IID_IVirusScanner, (void **)&pvs))) {
  129.         MessageBox(NULL,"Failed QueryInterface for IID_IVirusScanner.",NULL,MB_OK);
  130.         goto Exit;
  131.     }
  132.     lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
  133. lpszToken = lpCmdLine;
  134.     
  135. while (lpszToken != NULL)
  136. {
  137.         LPTSTR lpszNextToken = (LPTSTR)(LPCTSTR)FindOneOf(lpszToken, szSep);
  138.         if (*lpszToken != '\' && *lpszToken != '/') {
  139.         
  140.             STGMEDIUM stg;
  141.             HWND hw = GetActiveWindow();
  142.             VIRUSINFO vi;
  143.             LPSTR szResp = "<Unknown>";
  144.             if (lpszNextToken != NULL) {
  145.                 lpszNextToken--;
  146.                 *lpszNextToken = '';
  147.                 lpszNextToken++;
  148.             }
  149.             wsprintf(szTmp,"Performing Virus Scan on: "%s".", lpszToken);
  150.             MessageBox(NULL,szTmp,NULL,MB_OK);
  151.             // filename
  152.             wszDesc = MakeWideStrFromAnsi((char *)lpszToken);
  153.             stg.tymed = TYMED_FILE;
  154.             stg.lpszFileName = wszDesc;
  155.             vi.cbSize = sizeof(VIRUSINFO);
  156.             HRESULT hr = pvs->ScanForVirus(hw, &stg, wszDesc, dwFlags | SFV_ENGINE_DOUI, &vi);
  157.             switch(hr) {
  158.             case VSCAN_E_NOPROVIDERS: szResp = "No virus scanning providers found."; break;
  159.             case VSCAN_E_CHECKPARTIAL: szResp = "Virus found - but not by all providers."; break;
  160.             case VSCAN_E_CHECKFAIL: szResp = "Virus found - scan failed."; break;
  161.             case VSCAN_E_DELETEFAIL: szResp = "Virus found - tried deleting file but failed."; break;
  162.             case S_FALSE: szResp = "Virus found. & VIRUSINFO returned."; break;
  163.             case S_OK: szResp = "No viruses found."; break;
  164.             default: szResp = "<Unknown Response>";
  165.             }
  166.             wsprintf(szTmp,"Result: hr = %08X - %s",hr, szResp);
  167.             MessageBox(NULL,szTmp,NULL,MB_OK);
  168.         }
  169.         lpszToken = lpszNextToken;
  170.     }
  171. Exit:
  172.     if (pUnk != NULL) pUnk->Release();
  173.     if (pvs != NULL) pvs->Release();
  174. CoUninitialize();
  175. return nRet;
  176. }