2010-08-30 55 views
4

我目前使用FindFirstFile,FindNextFile API遞歸迭代通過目錄搜索基於給定條件的文件。我注意到「dir/s」命令比我的程序有更好的性能。我嘗試檢查進程監視器中的事件,它看起來像cmd.exe/dir命令直接查詢磁盤設備驅動程序。有沒有什麼辦法可以實現與DeviceIOControl()類似的功能?我對設備驅動程序很陌生,但對編程並不陌生。附加將procmon輸出以供參考:有沒有辦法直接查詢文件系統設備驅動程序以列出目錄中的文件?

alt text

問候,

+0

有一些緩存在DIR/S – 2010-08-30 19:19:45

+0

回事這可能是真實的(是你能基礎上,推斷它屏幕截圖?),因爲我搜索了幾次相同的「* .mp3」。但即使是第一次,速度也很快。也只是爲了確保我嘗試了幾次隨機搜索的文件,我還沒有訪問過一段時間。似乎很少關注。 – ivymike 2010-08-30 19:28:22

+0

此外,是否有任何隱藏的API稱爲QueryDirectory(),不通過標準庫公開?我知道ReadFile()是標準的,但無法在任何地方找到QueryDirectory()。 – ivymike 2010-08-30 19:31:42

回答

1

您可以直接撥打ZwQueryDirectoryFile。進一步深入到驅動程序級別需要發送一堆IRP,並可能是一個矯枉過正的問題。

+1

它是用戶模式下的NtQueryDirectoryFile,而且你真的不應該使用這些低級別的nt-api函數......) – Christopher 2010-08-30 20:18:32

+0

:))這是相同的(在不同的名字下)。 來自MSDN: NtQueryDirectoryFile和ZwQueryDirectoryFile是相同Windows本機系統服務例程的兩個版本。有關此例程的更多信息,請參閱ZwQueryDirectoryFile。 因此,從我提供的鏈接開始閱讀文檔是有意義的。點擊一下,你知道...... – 2010-08-30 20:39:40

+0

Mayevski'EldoS:是否可以從用戶模式程序調用內核模式API?我的意思是不是Zwxxx應該只用於驅動程序?(我對驅動程序編程非常陌生)。 – ivymike 2010-08-30 20:57:26

3

使用FindFirstFileFindNextFile。這是API,直接使用DeviceIOControl要麼是一團糟,要麼不可能(不完全知道)。

您是否試過FindFirstFileEx以及它的FIND_FIRST_EX_LARGE_FETCH標誌和FindExInfoBasic信息等級?

+0

我確實嘗試過。但沒有太多明顯的改進:(。 – ivymike 2010-08-30 20:49:52

2

「dir/s」正在使用FindFirst/Next。它沒有任何特殊的魔法來枚舉文件。

QueryDirectory似乎是Procmon公開FindFirst/Next如何從文件系統獲取其數據的方式。

1

描述你的應用程序,你的瓶頸很可能會在其他地方。一些選項都喜歡拿出獵槍射擊一隻蒼蠅......

斯科特

相關問題