亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

一種掃描文件的方法和裝置的制作方法

文檔序號(hào):6356592閱讀:764來(lái)源:國(guó)知局
專利名稱:一種掃描文件的方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及殺毒軟件技術(shù)領(lǐng)域,尤其涉及一種掃描文件的方法和裝置。
背景技術(shù)
目前,很多殺毒軟件都是在監(jiān)控到文件操作時(shí),將文件名傳遞到掃描引擎,掃描引擎通過(guò)文件名打開(kāi)文件后進(jìn)行文件的掃描。這種方式需要掃描引擎通過(guò)文件名再次打開(kāi)文件,效率低;并且,掃描引擎再次打開(kāi)文件可能會(huì)造成在多個(gè)殺毒軟件共存的情況下,多個(gè)殺毒軟件互相攔截的情況。

發(fā)明內(nèi)容
本發(fā)明提供了一種掃描文件的方法,能夠避免掃描引擎第二次打開(kāi)文件。本發(fā)明還提供了一種掃描文件的裝置,能夠避免掃描引擎第二次打開(kāi)文件。本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的一種掃描文件的方法,應(yīng)用于殺毒軟件中掃描引擎對(duì)文件的掃描,該方法包括監(jiān)測(cè)到文件的操作時(shí),獲取所述文件的文件對(duì)象;切換到掃描引擎的進(jìn)程空間,為所述文件對(duì)象創(chuàng)建內(nèi)存映射,將所述文件對(duì)象的內(nèi)存映射句柄傳遞到所述掃描引擎的進(jìn)程空間;掃描引擎利用所述文件對(duì)象的內(nèi)存映射句柄掃描所述文件。上述方法中,獲取文件的文件對(duì)象的方式為通過(guò)微過(guò)濾驅(qū)動(dòng)(Minifilter)提供的數(shù)據(jù)結(jié)構(gòu)指針獲取所述文件的文件對(duì)象。切換到掃描引擎的進(jìn)程空間的方式為通過(guò)KeStackAttachProcess應(yīng)用程序編程接口(API)實(shí)現(xiàn)切換到掃描引擎的進(jìn)程空間。為文件對(duì)象創(chuàng)建內(nèi)存映射的方式為使用FsRtlCreateSectionForDataScan創(chuàng)建內(nèi)存映射。為文件對(duì)象創(chuàng)建內(nèi)存映射的方式為當(dāng)文件對(duì)象指向的內(nèi)存映射區(qū)對(duì)象指針不為空、并且當(dāng)前I/O請(qǐng)求不在系統(tǒng)其他內(nèi)核組件的路徑時(shí),進(jìn)入臨界區(qū)獲取所述文件對(duì)象的互斥鎖,并設(shè)置禁止系統(tǒng)其他內(nèi)核組件進(jìn)入當(dāng)前I/o請(qǐng)求所在路徑的標(biāo)記;獲取所述文件的大小,當(dāng)所述文件的大小不為零時(shí),為文件對(duì)象創(chuàng)建內(nèi)存映射區(qū),將內(nèi)存映射區(qū)對(duì)象插入到對(duì)象管理器中;釋放所述互斥鎖,退出所述臨界區(qū)。將文件對(duì)象的內(nèi)存映射句柄傳遞到掃描引擎的進(jìn)程空間的方式為通過(guò)Minifilter 提供的 FltSendMessage 進(jìn)行傳遞。一種掃描文件的裝置,包括文件對(duì)象獲取模塊,用于監(jiān)測(cè)到文件的操作時(shí),獲取所述文件的文件對(duì)象;映射模塊,用于按照所述文件對(duì)象獲取模塊的指示切換到掃描引擎的進(jìn)程空間,為所述文件對(duì)象創(chuàng)建內(nèi)存映射,將所述文件對(duì)象的內(nèi)存映射句柄傳遞到所述掃描引擎的進(jìn)程空間;掃描引擎模塊,用于利用所述文件對(duì)象的內(nèi)存映射句柄掃描所述文件。上述裝置中,映射模塊包括初始設(shè)置子模塊,用于當(dāng)文件對(duì)象指向的內(nèi)存映射區(qū)對(duì)象指針不為空、并且當(dāng)前I/O請(qǐng)求不在系統(tǒng)其他內(nèi)核組件的路徑時(shí),進(jìn)入臨界區(qū)獲取所述文件對(duì)象的互斥鎖,并設(shè)置禁止系統(tǒng)其他內(nèi)核組件進(jìn)入當(dāng)前I/o請(qǐng)求所在路徑的標(biāo)記,指示映射執(zhí)行子模塊為文件對(duì)象創(chuàng)建內(nèi)存映射;映射執(zhí)行子模塊,用于在接收到初始設(shè)置子模塊的指示時(shí),獲取所述文件的大小,當(dāng)所述文件的大小不為零時(shí),為文件對(duì)象創(chuàng)建內(nèi)存映射區(qū),將內(nèi)存映射區(qū)對(duì)象插入到對(duì)象管理器中,指示完成設(shè)置子模塊退出初始設(shè)置; 完成設(shè)置子模塊,用于在接收到映射執(zhí)行子模塊的指示時(shí),釋放所述互斥鎖,并退出所述臨界區(qū)。可見(jiàn),本發(fā)明提出的掃描文件的方法和裝置,通過(guò)掃描引擎在掃描時(shí)直接利用已打開(kāi)的文件對(duì)象的內(nèi)存映射句柄來(lái)對(duì)文件進(jìn)行掃描,避免了掃描引擎第二次打開(kāi)文件,從而提高效率,避免多個(gè)殺毒軟件互相攔截。


圖I為本發(fā)明提出的掃描文件的方法流程圖;圖2為本發(fā)明實(shí)施例二中步驟三的實(shí)現(xiàn)流程圖;圖3為本發(fā)明提出的掃描文件的裝置結(jié)構(gòu)示意圖。
具體實(shí)施例方式本發(fā)明提出一種掃描文件的方法,應(yīng)用于殺毒軟件中掃描引擎對(duì)文件的掃描。如圖I為本發(fā)明提出的掃描文件的方法流程圖,包括以下步驟步驟101 :監(jiān)測(cè)到文件的操作時(shí),獲取所述文件的文件對(duì)象;步驟102 :切換到掃描引擎的進(jìn)程空間,為所述文件對(duì)象創(chuàng)建內(nèi)存映射,將所述文件對(duì)象的內(nèi)存映射句柄傳遞到所述掃描引擎的進(jìn)程空間;步驟103 :掃描引擎利用所述文件對(duì)象的內(nèi)存映射句柄掃描所述文件。以下舉具體的實(shí)施例詳細(xì)介紹。實(shí)施例一本實(shí)施例主要包括以下四個(gè)步驟步驟一、獲取文件對(duì)象,可以通過(guò)Minifilter提供的數(shù)據(jù)結(jié)構(gòu)指針獲取文件對(duì)
象,具體實(shí)現(xiàn)代碼可以為FLT—POSTOP—CALLBACK—STATUS FilterPostCreate (
—inout PFLT—CALLBACK—DATA Data,
—in PCFLT—RELATED—OBJECTS FltObjects,
—in—opt PVOID CompletionContext,
—in FLT—POST—OPERATION—FLAGS Flags)
/* FltObjects是Minifilter提供的對(duì)象,通過(guò)該對(duì)象可以得到文件對(duì)象*/
{
FileObject = FltObj ects->F ileObj ect;
/*通過(guò)Minifilter提供的數(shù)據(jù)結(jié)構(gòu)指針獲取文件對(duì)象*/步驟二、切換到掃描引擎進(jìn)程空間,可以通過(guò)KeStackAttachProcess API實(shí)現(xiàn),具體實(shí)現(xiàn)代碼可以為KeStackAttachProcess(FilterData. UserProcess, & kAcpState);/*調(diào)用KeStackAttachProcess切換到掃描引擎的進(jìn)程空間(掃描引擎的進(jìn)程空間由UserProcess變量指定),并保存當(dāng)前的進(jìn)程空間到kAcpState*/
步驟三、為文件對(duì)象創(chuàng)建內(nèi)存映射,在windows xp sp3以上內(nèi)核(包括windows xpsp3 內(nèi)核)中,可以使用 FsRtlCreateSectionForDataScan,在windowsxp sp3 以下內(nèi)核(不包括windows xp sp3內(nèi)核)中,采用本發(fā)明提出的方法實(shí)現(xiàn)此應(yīng)用程序編程接口(API)。以下首先詳細(xì)介紹在windows xp sp3以上內(nèi)核中使用FsRtlCreateSectionForDataScan的具體實(shí)現(xiàn)方式,windows xp sp3以下內(nèi)核中的實(shí)現(xiàn)方式將在實(shí)施例二中進(jìn)行介紹。GlobalVar.gQfDynamicFunctions.FsRtlCreateSectionForDataScan(&hSection,
&secObject,
&lsize,
FileObject, /*指明為該文件對(duì)象創(chuàng)建內(nèi)存映射區(qū)*/
SECTION—MAP—READ | SECTION—QUERY, /*此為微軟文檔中說(shuō)明必須提供的*/
NULL, NULL,
PAGE—READONLY, /*表明此內(nèi)存映射區(qū)為只讀*/
SEC—COMMIT,
0);
/*調(diào)用FsRtlCreateSectionForDataScan為文件對(duì)象創(chuàng)建內(nèi)存映射,創(chuàng)建后的內(nèi)存映射句柄保存在hSection變量*/
KeUnstackDetachProcess(&kAcpState); /*切換進(jìn)程空間回到之前的進(jìn)程*/pNotifyContent->hSection = hSection; /*保存創(chuàng)建的內(nèi)存映射句柄*/步驟四、將內(nèi)存映射句柄傳遞到掃描引擎進(jìn)程,可以通過(guò)Minifilter提供的FltSendMessage傳遞,具體實(shí)現(xiàn)代碼可以為
status =
FltSendMessage(FilterData.Filter,&FilterData.ClientPort,pNotifyContent,sizeof(NOTIF Y_CONTENT),ReplyContent,&replyLength,&waitTimeOut);
/*調(diào)用FltSendMessage將內(nèi)存映射句柄發(fā)送到掃描引擎的進(jìn)程,掃描引擎進(jìn)程的端口由ClientPort變量指定;其中,F(xiàn)ilterData.Filter為過(guò)濾驅(qū)動(dòng)實(shí)例對(duì)象指針,F(xiàn)ilterData.ClientPort為掃描引擎的通信連接端口,pNotifyContent為要發(fā)送的消息緩沖區(qū),waitTimeOut為等掃描引擎回答的時(shí)間。*/實(shí)施例二 本實(shí)施例主要包括四個(gè)步驟步驟一,獲取文件對(duì)象;步驟二,切換到掃描引擎進(jìn)程空間;步驟三,為文件對(duì)象創(chuàng)建內(nèi)存映射;步驟四,將內(nèi)存映射句柄傳遞到掃描引擎進(jìn)程。其中,步驟一、二和四的具體實(shí)現(xiàn)過(guò)程與實(shí)施例一相同,在此不贅;以下主要介紹本實(shí)施例的步驟三,即在windows xp sp3以下內(nèi)核中創(chuàng)建內(nèi)存映射的方法,如圖2為本發(fā)明實(shí)施例二中步驟三的實(shí)現(xiàn)流程圖,包括
步驟201 :判斷文件對(duì)象的SectionObjectPointer是否為空,如果為空,表示系統(tǒng)未為該文件對(duì)象建立緩存,則釋放資源,返回錯(cuò)誤碼,并退出;如果不為空,則繼續(xù)執(zhí)行步驟202。步驟202 :判斷當(dāng)前線程的TopLevelIrp是否不為空,如果不為空,表示當(dāng)前I/O請(qǐng)求在系統(tǒng)其他內(nèi)核組件的代碼路徑中,有可能死鎖,故釋放資源,返回錯(cuò)誤碼,并退出;如果為空,則繼續(xù)執(zhí)行步驟203。步驟203 :進(jìn)入臨界區(qū)并獲取文件互斥鎖。步驟204 :設(shè)置 TolLevelIrp 為 FSRTL_FSP_TOP_LEVEL_IRP,表明此次 I/O 請(qǐng)求在為文件對(duì)象創(chuàng)建內(nèi)存映射的代碼路徑里,以避免其他內(nèi)核組件重入。步驟205 :獲取文件大小,判斷文件大小是否為0,如果為0,則無(wú)法創(chuàng)建映射,故退出臨界區(qū),恢復(fù)TopLevellrp為空,釋放資源,返回錯(cuò)誤碼,并退出;如果不為0,則執(zhí)行步驟 206。步驟206 :調(diào)用MmCreateSection創(chuàng)建內(nèi)存映射區(qū)。步驟207 :增加區(qū)對(duì)象引用技術(shù),并將內(nèi)存映射區(qū)對(duì)象插入到對(duì)象管理器中。步驟208 :退出臨界區(qū),恢復(fù)TopLevelIrp為空,返回成功,退出。上述過(guò)程可以具體采用以下代碼實(shí)現(xiàn)NT STATUS NTAPI
MyF sRtlCreateSectionF orDataScan(
—out PHANDLE SectionHandle, /*返回的內(nèi)存映射區(qū)句柄保存在該變量里
*/
—deref—out PVOID *SectionObject, /*返回的內(nèi)存映射區(qū)對(duì)象保存在該變
量里*/
—out—opt PLARGE—INTEGER SectionFileSize,
—in PFILE—OBJECT FileObject, /*要?jiǎng)?chuàng)建內(nèi)存映射區(qū)的文件對(duì)象*/
—in ACCESS—MASK DesiredAccess,
一in opt POBJECT ATTRIBUTES ObjectAttributes,
—in—opt PLARGE—INTEGER MaximumSize,
—in ULONG SectionPageProtection,
—in ULONG AllocationAttributes,
—in ULONG Flags )
{
NTSTATUS status;
LARGE—INTEGER IFileSize;
PVOTD pSectionObject;
HANDLE hSectionHandle=0;
LARGE—INTEGER IWaitTime;
if(!F ileObj ect->SectionObj ectPointer){
status = STATUS—INVALID—FILE—FOR—SECTION; goto —Cleanup;
}
/*如果文件對(duì)象指向的內(nèi)存映射區(qū)對(duì)象指針為空,表示系統(tǒng)未為該文件對(duì)象建立緩存,所以返回失敗*/if(IoGetTopLevel!rp()) {
return STATUS—FLT—CONTEXT—ALREADY—DEFINED;
}
/*如果當(dāng)前I/O請(qǐng)求在系統(tǒng)其他內(nèi)核組件的代碼路徑里,則有可能死鎖,故返回*/
KeEnterCriticalRegion();
/*進(jìn)入臨界區(qū)獲取文件對(duì)象的互斥鎖,以便獨(dú)占訪問(wèn)文件對(duì)象*/
FsRtlAcquireFileExclusive(FileObj ect);
IoSetTopLevelIrp((PIRP)FSRTL—FSP—TOP—LEVEL—IRP);
/*設(shè)置標(biāo)記,表示此次I/O請(qǐng)求在為文件對(duì)象創(chuàng)建內(nèi)存映射的代碼路徑里,以避免其他內(nèi)核組件重入*/
status=FsRtlGetFileSize(FileObject,&lFileSize); /* 獲耳又文件大小 */if(! NT—SUCCES S(status))
{
F sRtlReleaseF ile(FileObject);
KeLeaveCriti calRegion();
IoSetTopLevelIrp(NULL);goto —Cleanup;
} /*以上操作失敗,返回*/
if(lFi1eSize.QuadPart==O) /*如果文件大小為零,則無(wú)法創(chuàng)建映射 {
F sRtlReleaseF ile(FileObject);

KeLeaveCriticalRegion(); /*釋放領(lǐng),退出臨界區(qū) */
Io S etTopLevelIrp(NULL); status=STATUS_END_OF_FILE; goto —Cleanup;
}
tatus=MmCreateSection(&pSectionObject,DesiredAccess,ObjectAttributes,&lFileSize,SectionPageProtection,AllocationAttributes,O5FileObject);
/*調(diào)用MmCreateSection為文件對(duì)象創(chuàng)建內(nèi)存映射區(qū),創(chuàng)建后的內(nèi)存映射區(qū)對(duì)象保存在pSectionObject變量里;MmCreateSecdtion根據(jù)傳 入的文件對(duì)象,為該文件對(duì)象創(chuàng)建內(nèi)存映射區(qū),DisiredAccess表明創(chuàng)建的映射區(qū)的訪問(wèn)權(quán)限,OjbectAttributes指明創(chuàng)建的內(nèi)存映射區(qū)的名稱空間等,F(xiàn)ileObject是傳入的文件對(duì)象*/
while(status==STATUS_FILE_LOCK_CONFLICT)
{
IWaitTime.HighPart=-1;lWaitTime.LowPart=0xFFB3B4C0;
KeDelayExecutionThread(KemelMode,FALSE,&lWaitTime); /*CPU 空閑等待WaitTime指定的時(shí)間*/
status=MmCreateSection(&pSectionObject,DesiredAccess,ObjectAttributes,&1FileSize,SectionPageProtection,AllocationAttributes,O5FileObject);
}
/*如果MmCreateSection返回上領(lǐng)沖哭,則不斷等待,直到其他系統(tǒng)執(zhí)行路徑釋放該鎖*/
if(!NT_SUCCESS(status))
{
FsRtlReleaseFile(FileObj ect);
KeLeaveCriticalRegionQ;
Io S etTopLe VelIrp(MJLL); goto —Cleanup;

} /*以上操作失敗,返回*/
ObReferenceObj ect(p SectionObj ect); /*增加內(nèi)存映射區(qū)對(duì)象引用計(jì)數(shù)*/status=ObInsertObject(pSectionObject,NULL,DesiredAccess5O,NULL,&hSectionHandle);
/*將內(nèi)存映射區(qū)對(duì)象插入系統(tǒng)句柄表,返回的句柄保存在hSectionHandle哭量里*/
if(! NT—SUCCES S(status))
{
ObDereferenceObj ect(pSectionObj ect); KeLeaveCriticalRegion();
Io S etTopLevelIrp(NULL); goto —Cleanup;
} /*以上操作失敗,返回 F sRtlReleaseFile(FileObj ect);
KeLeaveCriticalRegion();
IoSetTopLevellrp(NULL);
*SectionHandle^hSectionHandle;
*SectionObject=pSectionObject;
/*釋放互斥鎖,退出臨界區(qū)*/ if(MaximumSize)
{
MaximumSize->LowPart=lFileSize.LowPart;
Maximum Size->HighPart=lFile Size.Hi ghPart;
}
—Cleanup:return status;
} /*返回創(chuàng)建的內(nèi)存映射區(qū)對(duì)象和句柄本發(fā)明還提出一種掃描文件的裝置,如圖3為本發(fā)明提出的掃描文件的裝置結(jié)構(gòu)示意圖,該裝置包括文件對(duì)象獲取模塊310,用于監(jiān)測(cè)到文件的操作時(shí),獲取所述文件的文件對(duì)象;
映射模塊320,用于按照文件對(duì)象獲取模塊310的指示切換到掃描引擎的進(jìn)程空間,為所述文件對(duì)象創(chuàng)建內(nèi)存映射,將所述文件對(duì)象的內(nèi)存映射句柄傳遞到所述掃描引擎的進(jìn)程空間;掃描引擎模塊330,用于利用所述文件對(duì)象的內(nèi)存映射句柄掃描所述文件。上述映射模塊320可以包括初始設(shè)置子模塊321,用于當(dāng)文件對(duì)象指向的內(nèi)存映射區(qū)對(duì)象指針不為空、并且當(dāng)前I/O請(qǐng)求不在系統(tǒng)其他內(nèi)核組件的路徑時(shí),進(jìn)入臨界區(qū)獲取所述文件對(duì)象的互斥鎖,并設(shè)置禁止系統(tǒng)其他內(nèi)核組件進(jìn)入當(dāng)前I/o請(qǐng)求所在路徑的標(biāo)記,指示映射執(zhí)行子模塊322為文件對(duì)象創(chuàng)建內(nèi)存映射;
映射執(zhí)行子模塊322,用于在接收到初始設(shè)置子模塊321的指示時(shí),獲取所述文件的大小,當(dāng)所述文件的大小不為零時(shí),為文件對(duì)象創(chuàng)建內(nèi)存映射區(qū),將內(nèi)存映射區(qū)對(duì)象插入到對(duì)象管理器中,指示完成設(shè)置子模塊323退出初始設(shè)置;完成設(shè)置子模塊323,用于在接收到映射執(zhí)行子模塊322的指示時(shí),釋放所述互斥鎖,并退出所述臨界區(qū)。綜上可見(jiàn),本發(fā)明提出的一種掃描文件的方法和裝置,當(dāng)監(jiān)控到文件操作并傳遞給掃描引擎時(shí),可以復(fù)用打開(kāi)的文件對(duì)象,通過(guò)此文件對(duì)象在掃描引擎的進(jìn)程中創(chuàng)建內(nèi)存映射,則掃描引擎在掃描時(shí)可以直接利用已打開(kāi)的文件句柄來(lái)對(duì)文件進(jìn)行掃描,從而避免了掃描引擎對(duì)第二次打開(kāi)文件,提高了效率,同時(shí)避免多個(gè)殺毒軟件互相攔截的情況。以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
權(quán)利要求
1.一種掃描文件的方法,應(yīng)用于殺毒軟件中掃描引擎對(duì)文件的掃描,其特征在于,所述方法包括 監(jiān)測(cè)到文件的操作時(shí),獲取所述文件的文件對(duì)象; 切換到掃描引擎的進(jìn)程空間,為所述文件對(duì)象創(chuàng)建內(nèi)存映射,將所述文件對(duì)象的內(nèi)存映射句柄傳遞到所述掃描引擎的進(jìn)程空間; 掃描引擎利用所述文件對(duì)象的內(nèi)存映射句柄掃描所述文件。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述獲取文件的文件對(duì)象的方式為通過(guò)微過(guò)濾驅(qū)動(dòng)Minifilter提供的數(shù)據(jù)結(jié)構(gòu)指針獲取所述文件的文件對(duì)象。
3.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述切換到掃描引擎的進(jìn)程空間的方式為通過(guò)KeStackAttachProcess應(yīng)用程序編程接ロ API實(shí)現(xiàn)切換到掃描引擎的進(jìn)程空間。
4.根據(jù)權(quán)利要求I、2或3所述的方法,其特征在于,所述為文件對(duì)象創(chuàng)建內(nèi)存映射的方式為使用 FsRtlCreateSectionForDataScan 創(chuàng)建內(nèi)存映射。
5.根據(jù)權(quán)利要求1、2或3所述的方法,其特征在于,所述為文件對(duì)象創(chuàng)建內(nèi)存映射的方式為 當(dāng)文件對(duì)象指向的內(nèi)存映射區(qū)對(duì)象指針不為空、并且當(dāng)前I/O請(qǐng)求不在系統(tǒng)其他內(nèi)核組件的路徑時(shí),進(jìn)入臨界區(qū)獲取所述文件對(duì)象的互斥鎖,并設(shè)置禁止系統(tǒng)其他內(nèi)核組件進(jìn)入當(dāng)前I/o請(qǐng)求所在路徑的標(biāo)記; 獲取所述文件的大小,當(dāng)所述文件的大小不為零時(shí),為文件對(duì)象創(chuàng)建內(nèi)存映射區(qū),將內(nèi)存映射區(qū)對(duì)象插入到對(duì)象管理器中; 釋放所述互斥鎖,退出所述臨界區(qū)。
6.根據(jù)權(quán)利要求1、2或3所述的方法,其特征在于,所述將文件對(duì)象的內(nèi)存映射句柄傳遞到掃描引擎的進(jìn)程空間的方式為通過(guò)Minifilter提供的FltSendMessage進(jìn)行傳遞。
7.一種掃描文件的裝置,其特征在于,所述裝置包括 文件對(duì)象獲取模塊,用于監(jiān)測(cè)到文件的操作時(shí),獲取所述文件的文件對(duì)象,并指示映射模塊映射所述文件對(duì)象; 映射模塊,用于按照所述文件對(duì)象獲取模塊的指示切換到掃描引擎的進(jìn)程空間,為所述文件對(duì)象創(chuàng)建內(nèi)存映射,將所述文件對(duì)象的內(nèi)存映射句柄傳遞到所述掃描引擎的進(jìn)程空間; 掃描引擎模塊,用于利用所述文件對(duì)象的內(nèi)存映射句柄掃描所述文件。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述映射模塊包括 初始設(shè)置子模塊,用于當(dāng)文件對(duì)象指向的內(nèi)存映射區(qū)對(duì)象指針不為空、并且當(dāng)前I/O請(qǐng)求不在系統(tǒng)其他內(nèi)核組件的路徑時(shí),進(jìn)入臨界區(qū)獲取所述文件對(duì)象的互斥鎖,并設(shè)置禁止系統(tǒng)其他內(nèi)核組件進(jìn)入當(dāng)前I/O請(qǐng)求所在路徑的標(biāo)記,指示映射執(zhí)行子模塊為文件對(duì)象創(chuàng)建內(nèi)存映射; 映射執(zhí)行子模塊,用于在接收到初始設(shè)置子模塊的指示時(shí),獲取所述文件的大小,當(dāng)所述文件的大小不為零時(shí),為文件對(duì)象創(chuàng)建內(nèi)存映射區(qū),將內(nèi)存映射區(qū)對(duì)象插入到對(duì)象管理器中,指示完成設(shè)置子模塊退出初始設(shè)置; 完成設(shè)置子模塊,用于在接收到映射執(zhí)行子模塊的指示時(shí),釋放所述互斥鎖,并退出所述臨界區(qū)。
全文摘要
本發(fā)明提出一種掃描文件的方法和裝置,其中方法包括監(jiān)測(cè)到文件的操作時(shí),獲取所述文件的文件對(duì)象;切換到掃描引擎的進(jìn)程空間,為所述文件對(duì)象創(chuàng)建內(nèi)存映射,將所述文件對(duì)象的內(nèi)存映射句柄傳遞到所述掃描引擎的進(jìn)程空間;掃描引擎利用所述文件對(duì)象的內(nèi)存映射句柄掃描所述文件。本發(fā)明能夠避免掃描引擎第二次打開(kāi)文件,從而提高效率,避免多個(gè)殺毒軟件互相攔截。
文檔編號(hào)G06F21/24GK102693397SQ20111007016
公開(kāi)日2012年9月26日 申請(qǐng)日期2011年3月23日 優(yōu)先權(quán)日2011年3月23日
發(fā)明者謝飛, 高小明 申請(qǐng)人:騰訊科技(深圳)有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1