2015-02-05 36 views
0

我正在開發一個微過濾器。我檢查一個新的文件創建(通過拖動&下拉)在硬盤上(即D :)。我做如下:Minifilter檢查新文件在硬盤上創建?

isNewFile = FALSE; 
if (Data 
    && Data->Iopb 
    && (Data->Iopb->MajorFunction == IRP_MJ_CREATE)) 
{ 
    // Get create disposition 
    createDisposition = (Data->Iopb->Parameters.Create.Options >> 24) & 0x000000FF; 

    // Check if new file is creating or not 
    isNewFile = ((FILE_SUPERSEDE == createDisposition) 
       || (FILE_CREATE == createDisposition) 
       || (FILE_OPEN_IF == createDisposition) 
       || (FILE_OVERWRITE == createDisposition) 
       || (FILE_OVERWRITE_IF == createDisposition)); 

    // Write log 
    PT_DBG_PRINT(PTDBG_TEST_STATUS, 
        ("isNewFile %d--createDisposition: <%08x>\n", 
            isNewFile, 
            createDisposition)); 
} 

的創造權的價值

// 
// Define the create disposition values at wdm.h 
// 
#define FILE_SUPERSEDE     0x00000000 
#define FILE_OPEN      0x00000001 
#define FILE_CREATE      0x00000002 
#define FILE_OPEN_IF     0x00000003 
#define FILE_OVERWRITE     0x00000004 
#define FILE_OVERWRITE_IF    0x00000005 
#define FILE_MAXIMUM_DISPOSITION  0x00000005 
  1. 當我拖動從桌面&拖放文件(S),isNewFile標誌爲TRUE

    • isNewFile 1 - createDisposition:< 0x00000002>
  2. 當我從Windows資源管理器拖放&拖放文件時,isNewFile始終爲FALSE。

    • isNewFile 0 - createDisposition會:< 00000001>

這有什麼錯?

謝謝大家。

+0

這是文件唯一的IRP_MJ_CREATE嗎?或者,Windows資源管理器正在嘗試打開它來檢查它是否存在,或出於其他原因?你可能需要看看像進程管理器這樣的東西,試圖理解Explorer正在做什麼以及爲什麼它以不同的方式打開/創建文件。 – lordjeb

+0

我測試了很多次,但我不知道當我使用全部**時,爲什麼isNewFile標誌是錯誤的原因**列出所有請求來過濾**。現在,我只使用IRP_MJ_CREATE請求,它工作正常。 – GSP

回答

0

關於拖放,如果發生在相同的卷內,它將作爲重命名通過FltSetInformationFile。但是如果音量不同,那麼它會創建新的文件@目標文件內容。您可以使用procmon等工具檢查此行爲。

+0

感謝您的有用工具! – GSP

相關問題