読者です 読者をやめる 読者になる 読者になる

 アンチウィルスベンダーによるIOfficeAntiVirusインターフェースの実装状況

どうなんだろーと思ったので、ちょっと調べたのですが、分からなくて。この情報少なすぎ。他の方法が用意されているのかな。
でも、もしかしたら、こういうこと?

  • Windows XP SP2以降に導入されたWindowsセキュリティーセンターはアンチウィルスソフトがインストールされていないことをユーザーに警告する
  • アンチウィルスベンダーは自社製品がアンチウィルスソフトであることをWindowsOSに知らせる必要がある
  • WindowsセキュリティーセンターはIOfficeAntiVirusをチェックしてアンチウィルスソフトがインストールされていることを確認している
  • → 全てのアンチウィルスソフトにIOfficeAntiVirusインターフェースが実装される

憶測なのですが、こういうことなら、Windows様っぽいなーとか思いました。
どうなんだろ。Mozilla FireFoxが採用するくらいなので、かなり使えるはずだと思っています。

IOfficeAntiVirusインターフェースが使えるかは、次のようなコードで確認できます。(VC++6 + PSDK で確認)

#define INITGUID
#include <windows.h>
#define AVVENDOR
#include <msoav.h>
#include <comcat.h>

static BOOL _HasVirusScanFunction();

BOOL HasVirusScanFunction()
{
    HRESULT hIntializeResult = CoInitialize(NULL);
    BOOL bSearchResult = _HasVirusScanFunction();

    if (SUCCEEDED(hIntializeResult)) {
        CoUninitialize();
    }

    return bSearchResult;
}

static BOOL _HasVirusScanFunction()
{
    HRESULT hResult;
    ULONG nReceived;
    ICatInformation *pCatInfo; 
    IEnumCLSID *pEnumerator;
    CLSID clsid;
    GUID guids[1];
    
    guids[0] = CATID_MSOfficeAntiVirus;
    
    hResult = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC,
                                             IID_ICatInformation, (LPVOID *)&pCatInfo);
    if (FAILED(hResult)) {
        // Could not create category information class
        return FALSE;
    }
    hResult = pCatInfo->EnumClassesOfCategories(1, guids, 0, NULL, &pEnumerator);
    if (FAILED(hResult)) {
        // Could not get class enumerator for category
        return FALSE;
    }
    pEnumerator->Next(1, &clsid, &nReceived);
    if (nReceived == 0) {
        // No installed Anti Virus program
        return FALSE;
    }
    
    /*
        // VirusScan
    {
        IOfficeAntiVirus *pAntiVirus;
        MSOAVINFO stAvInfo;

        ZeroMemory(&stAvInfo, sizeof(stAvInfo));
        stAvInfo.cbsize = sizeof(MSOAVINFO);
        stAvInfo.fPath = TRUE;
        stAvInfo.fInstalled = FALSE;
        stAvInfo.fReadOnlyRequest = TRUE;
        stAvInfo.fHttpDownload = FALSE;
        stAvInfo.hwnd = NULL;
        stAvInfo.pwzHostName = NULL;
        stAvInfo.pwzOrigURL = NULL;
        stAvInfo.u.pwzFullPath = L"c:\\tmp\\virus.zip";

        hResult = CoCreateInstance(clsid, NULL, CLSCTX_ALL,
                                   IID_IOfficeAntiVirus, (LPVOID *)&pAntiVirus);
        if (FAILED(hResult)) {
            // Could not get class enumerator for category
            return FALSE;
        }
        HRESULT hScanResult = pAntiVirus->Scan(&stAvInfo);
    }
    */
    
    return TRUE;
}