本文將告訴您所做的檔案系統,並儲存堆疊來限制直接磁碟存取與直接的磁碟區存取 Windows Server 2008 中以及在 Windows Vista 中的變更。
背景
當程式開啟了獨佔檔案控制代碼時,程式會假設檔案的內容不能修改任何更多。不過,下列情況成立時,可以修改檔案的內容:
- 另一個程式開啟檔案控制碼基礎的磁碟區,或其下的磁碟。
- 程式檔案所在的位置會變更。
當程式將直接寫入沒有磁碟區的第一個取得獨佔存取的檔案系統已裝載的磁碟區時,可能就會發生損毀或系統不穩定。這是因為寫入磁碟區可能擦撞檔案系統寫入。這類衝突發生,則磁碟區的內容,可能會遺留在不一致的狀態中。
若要減少此問題的效果,變更檔案系統,並儲存堆疊限制直接存取磁碟或磁碟區。
變更檔案系統,並儲存堆疊的詳細資料
- 如果下列情況成立,檔案系統可以寫入磁碟區的控制代碼:
- 條件 1: 正在寫入的磁扇區均開機磁扇區。
附註這種情況存在支援如防毒程式、 安裝程式及其他程式必須更新系統磁碟區的啟始程式碼的程式。系統磁碟區無法被鎖定。 - 條件 2: 正在寫入位於檔案系統空間之外的磁區。
附註結尾的檔案系統空間和磁碟區空間的結尾之間區域不是在檔案系統的控制下。因此,就沒有理由需要,將它寫入鎖定磁碟區。 - 條件 3: 磁碟區已被隱含地鎖定要求獨佔的寫入權限。
- 條件 4: 磁碟區已經被要求鎖定要求或 unmount 要求明確地鎖定。
- 條件 5: 寫入要求具有 SL_FORCE_DIRECT_WRITE 旗標,指出 [條件二] 必須被略過。
附註沒有寫入至磁碟區的可用空間區域,而第一個鎖定磁碟區的檔案系統篩選器。如果要執行這項操作,有檔案系統篩選器,檔案系統篩選器可以寫入要求,它告知讓發生寫入檔案系統上設定旗標。這個旗標只能從核心模式內設定。
- 如果未裝載磁碟區或磁碟區有沒有檔案系統,並不會套用變更檔案系統,並儲存堆疊。
- UDFS 檔案系統和 FASTFAT 檔案系統限制檔案系統,並儲存堆疊所做的變更。這些變更受限於磁碟類型的媒體。
附註大部分的 CD 掌握程式寫入直接到磁碟而不致鎖定磁碟區。某些 CD 掌握程式甚至會略過檔案系統層。在這些情況下這類程式直接寫入儲存體圖層。因為分頁檔只能裝載磁碟機上,就沒有理由套用光學磁碟機檔案系統,並儲存堆疊進行的變更。 - 如果下列情況成立,存放裝置驅動程式可以寫入磁碟的控制代碼:
- 條件 1: 正在寫入不做落磁碟區的磁區。
附註程式會使用來儲存中繼資料磁碟區外的磁區。 磁碟分割表格也位於已超出磁碟區的磁區。因為這些磁區並不是所控制的任何檔案系統,就沒有理由?封鎖該磁扇區的存取。 - 條件 2: 正在寫入落在明確地鎖定的掛上磁碟區的磁區。
- 條件 3: 正在寫入落在未裝載的磁碟區的磁區或落在磁碟區中的有沒有檔案系統。
- 變更檔案系統,並儲存堆疊將也會套用到磁碟區的同位檢查區塊中。
- 變更檔案系統,並儲存堆疊會將套用至 32 位元系統中,並 64 位元的系統。
除了各種的 WriteFile API 中,有可能用來發出寫入的裝置 IO 控制要求的磁碟區或磁碟。變更檔案系統,並儲存堆疊將也會套用至裝置 IO 控制請求。裝置 IO 控制要求包括下列命令:
- IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
- IOCTL_SCSI_PASS_THROUGH
- IOCTL_SCSI_PASS_THROUGH_DIRECT
- scsiop_write6
- SCSIOP_WRITE
- SCSIOP_WRITE_VERIFY
- SCSIOP_WRITE_SAME
- SCSIOP_WRITE_LONG
- SCSIOP_XDWRITE
- SCSIOP_XPWRITE
- SCSIOP_XDWRITE_READ
- scsiop_write12
- scsiop_write_verify12
- scsiop_write16
- scsiop_write_verify16
- scsiop_write_same16
- scsiop_write_long16
- scsiop_write_xdwrite_extended16
- SCSIOP_WRITE_COPY
- SCSIOP_WRITE_COPY_COMPARE
下列群組的命令失敗,因為它們是過時:
- IOCTL_ATA_PASS_THROUGH
- IOCTL_ATA_PASS_THROUGH_DIRECT
- IDE_COMMAND_WRITE
- IDE_COMMAND_WRITE_DMA
- IDE_COMMAND_WRITE_DMA_QUEUED
- IDE_COMMAND_WRITE_MULTIPLE
- IDE_COMMAND_WRITE_EXT
- IDE_COMMAND_WRITE_DMA_EXT
- IDE_COMMAND_WRITE_DMA_FUA_EXT
- IDE_COMMAND_WRITE_DMA_QUEUED_EXT
- IDE_COMMAND_WRITE_DMA_QUEUED_FUA_EXT
- IDE_COMMAND_WRITE_MULTIPLE_EXT
- IDE_COMMAND_WRITE_MULTIPLE_FUA_EXT
SCSI] 命令的 32 位元組寫入指令不會篩選因為 CDB 中有 16 個位元組。延伸的 xdwrite]、 [副本] 和 [副本比較命令會失敗。
ATA] 命令的 LBA 元查詢以判斷是否位移指定簡體中文的格式或 LBA 格式。因為系統無法取得真實幾何,以簡體中文格式傳送的所有要求會都失敗。這應該不是問題,因為所有現代磁碟預期位移是 LBA 格式。
程式相容性考量和緩和措施
變更檔案系統,並儲存堆疊可能會造成某些程式失敗。這類程式失敗,因為它們使用磁碟或磁碟區的直接存取。
程式相容性會影響會最小原因如下:
- 它們寫入磁碟區之前,備份程式必須卸載磁碟區。否則,程式寫入將擦撞檔案系統寫入。這種衝突會導致損毀或系統不穩定。
- 分割程式目標常駐在磁碟區區域外的磁扇區的磁碟分割表格。檔案系統不能控制這類的磁區。因為啟用這些磁區的存取資料分割的程式不會受到影響。
- 修復程式將最有可能在檔案系統無法裝載的磁碟區上執行。因為啟用 RAW 磁碟區的存取這類修復程式不會受到影響。
- 區塊層級加密程式通常會有下的磁碟分割管理員驅動程式是在磁碟堆疊都位於一個篩選器驅動程式。篩選器驅動程式會篩選輸入輸出 (IO) 的磁碟分割管理員驅動程式問題。因此,變更檔案系統,並儲存堆疊並不會影響區塊層級加密程式。 如果篩選器驅動程式存放在磁碟區堆疊,篩選器驅動程式將會是下方的檔案系統。 因此,變更檔案系統,並儲存堆疊並不會影響區塊層級加密程式。
- 因為 UDFS 檔案系統和 FAT32 檔案系統並不會執行檢查檔案系統已裝載光學磁碟機上時,CD 掌握程式不會受到影響。 不過,CD 掌握程式可能會受到影響,在下列案例:
- 程式鎖定它的檔案。
- 程式查詢檔的範圍。
- 程式會使用磁碟區的控制代碼來直接寫入檔案的範圍。
不過,我們做不鼓勵這種情況下因為這種情況會造成檔案中繼資料,以進行同步。當檔案中繼資料同步時可能會發生檔案損毀。