2011-07-06 63 views
2

我正在實現自定義Windows磁盤驅動程序,並且需要FAT32 Windows驅動程序重新加載它位於數據扇區下方的FAT表1和2。 這可以怎麼做?如何強制windows的FAT32驅動重新加載FAT表?

我需要更快的方法,而無需卸載驅動器。爲什麼我這樣做是因爲磁盤是內存虛擬磁盤,並且在訪問扇區的過程中從網絡中獲取數據。我正在編寫目錄數據,它可以工作,但不能用於文件 - 因爲在驅動程序獲取FAT時 - 羣集是免費的,因此文件不起作用。我解僱了fastfat.sys並發現了一些問題......至少我發現了設備ioctl代碼,可能會重新加載胖表,如果我成功了,我會在這裏發帖。

+0

是否反彙編顯示未包含在源代碼中的信息? (我沒有嘗試編譯WDK中包含的任何版本,所以我不知道這個答案。) –

+0

FAT沒有官方源代碼,但是linux的源代碼可用。目前爲止,我只對ioctl代碼感興趣,因爲沒有其他可能的方式向驅動程序發送信號。 – Sergey

+0

以下是官方源代碼中發佈的聲明,儘管它不是ioctl:#define FatAcquireExclusiveVolume(IRPCONTEXT,VCB){\ PFCB Fcb = NULL; \ ASSERT(FlagOn((IRPCONTEXT) - > Flags,IRP_CONTEXT_FLAG_WAIT)); (VOID)FatAcquireExclusiveVcb((IRPCONTEXT),(VCB)); ((Fcb = FatGetNextFcbBottomUp((IRPCONTEXT),Fcb,(VCB) - > RootDcb))!= NULL){((VOID)FatAcquireExclusiveFcb((IRPCONTEXT),Fcb)。 \ } \ } –

回答

2

強制卸載卷並重新裝載它,或假裝置刪除。

另外,你爲什麼要這樣做?如果您試圖在與操作系統同時寫入文件系統時,這幾乎肯定不是安全的。

+0

是的,我知道關於安裝/拆卸,這將工作,但我需要更快的方法,無需卸載驅動器。爲什麼我這樣做是因爲磁盤是內存虛擬磁盤,並且在訪問扇區的過程中從網絡中獲取數據。我正在編寫目錄數據,它可以工作,但不能用於文件 - 因爲在驅動程序獲取FAT時 - 羣集是免費的,因此文件不起作用。我解僱了fastfat.sys並發現了一些觀點......至少我發現了設備ioctl代碼,可能*會重新加載胖表,如果我成功了,我會在這裏發帖。 – Sergey

+0

這是一個嚴重可怕的想法。請不要將此方法實際運送給任何人。如果在下一個服務包中,該設備的IOCTL從「重新加載FAT表」更改爲「清除扇區」或導致BSOD?我認爲你需要提高一個抽象層次 - 大多數人創建一個遠程文件系統來完成你正在做的事情(比如SMB或WebDAV) –

+0

這在以後是不可能的,所有的ioctl代碼都像標準功能是向後兼容的。這是我正在做的網絡文件系統,但存儲源不是公共服務。 – Sergey

2

你應該(當然,必須,真的)卸載驅動之前作出的FAT任何直接更改,然後再安裝到加載這些變化。否則,您可能會冒險將操作系統覆蓋使用它的(舊)內存副本進行的離線更改,這可能會損壞文件系統而無法修復。

+0

即使你可以說服上層「重新加載自己」,也沒有理由這樣做,因爲磁盤高速緩存可能在內存中有一個陳舊的扇區,恰好有一個FAT表,並且它沒有辦法告訴你改變了背後的東西。 –

+0

@tylerl,我知道安裝/拆卸,這將工作,但我需要更快的方法,而無需卸下驅動器。爲什麼我這樣做是因爲磁盤是內存虛擬磁盤,並且在訪問扇區的過程中從網絡中獲取數據。我正在編寫目錄數據,它可以工作,但不能用於文件 - 因爲在驅動程序獲取FAT時 - 羣集是免費的,因此文件不起作用。我解僱了fastfat.sys並發現了一些觀點......至少我發現了設備ioctl代碼,可能*會重新加載胖表,如果我成功了,我會在這裏發帖。 – Sergey

0

您可以從參數FSCTL_LOCK_VOLUME調用DeviceIoControl開始。如果它失敗了,那麼你可以確定你最好不要自己修改FAT,因爲其他句柄在分區上的某個地方打開。

下一個問題是當FSCTL_LOCK_VOLUME成功時應該怎麼做。兩個人說要卸載音量,但這還不夠。您必須使卷脫機,IOCTL_VOLUME_OFFLINE。但是當我嘗試時,它仍然不夠。 Windows仍然有東西緩衝。

+0

我解僱了fastfat.sys並發現了一些問題......至少我發現了設備ioctl代碼,可能*會重新加載胖表,如果我成功了,我會在這裏發帖。 – Sergey