2 using System.Reflection;
\r
3 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Runtime.InteropServices.ComTypes;
\r
6 using NaGet.InteropServices;
\r
10 public class DownloadScanner : IDisposable
\r
14 private enum MSOAVINFOFLAG : uint {
\r
16 fReadOnlyRequest = 2,
\r
21 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
\r
22 private struct MSOAVINFO {
\r
25 [MarshalAs(UnmanagedType.U4)]
\r
26 public MSOAVINFOFLAG uFlags;
\r
30 [MarshalAs(UnmanagedType.LPWStr)]
\r
31 public string pwzFullPath;
\r
32 [MarshalAs(UnmanagedType.LPWStr)]
\r
33 public string pwzHostName;
\r
34 [MarshalAs(UnmanagedType.LPWStr)]
\r
35 public string pwzOrigURL;
\r
39 [Guid("56FFCC30-D398-11D0-B2AE-00A0C908FA49")]
\r
40 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
\r
41 private interface IOfficeAntiVirus {
\r
42 void Scan(ref MSOAVINFO pmsoavinfo);
\r
47 /// ウイルススキャナーに渡すプログラム・ホスト名。
\r
49 public string HostName {
\r
52 return Assembly.GetExecutingAssembly().GetName().FullName;
\r
56 private List<IOfficeAntiVirus> scanners;
\r
58 public DownloadScanner()
\r
60 ComDirectAccess.CoInitialize(IntPtr.Zero);
\r
63 public void Dispose()
\r
65 if ((scanners != null) && (scanners.Count > 0)) {
\r
66 foreach (IOfficeAntiVirus i in scanners) {
\r
67 Marshal.ReleaseComObject(i);
\r
72 ComDirectAccess.CoUninitialize();
\r
75 public bool HasScanner {
\r
76 get { return scanners.Count > 0; }
\r
81 scanners = new List<IOfficeAntiVirus>();
\r
83 Guid IID_MSOfficeAntiVirus = new Guid(((GuidAttribute) Attribute.GetCustomAttribute(typeof(IOfficeAntiVirus), typeof(GuidAttribute))).Value);
\r
85 using (GuidEnumeratorForCategories guids = new GuidEnumeratorForCategories(IID_MSOfficeAntiVirus)) {
\r
86 foreach (Guid guid in guids) {
\r
87 IOfficeAntiVirus oav = ComDirectAccess.CreateInstance<IOfficeAntiVirus>(guid, ComDirectAccess.CLSCTX.CLSCTX_INPROC_SERVER);
\r
94 public bool Scan(string path, string origin)
\r
96 if (scanners.Count <= 0) {
\r
100 MSOAVINFO info = new MSOAVINFO();
\r
101 info.cbsize = Marshal.SizeOf(info);
\r
102 info.uFlags = MSOAVINFOFLAG.fPath | MSOAVINFOFLAG.fHttpDownload;
\r
103 info.hwnd = IntPtr.Zero;
\r
104 info.pwzFullPath = path;
\r
105 info.pwzHostName = HostName;
\r
106 info.pwzOrigURL = origin;
\r
108 foreach (IOfficeAntiVirus i in scanners) {
\r