Skip to content

期中作業

Uriel58 edited this page Jun 16, 2022 · 16 revisions

檔案系統

  • 使用檔案和樹形目錄的抽象邏輯概念代替了硬碟和光碟等物理裝置使用資料塊的概念
  • 檔案系統是一種用於向使用者提供底層資料存取的機制
  • 檔案系統通用階層式
主題 描述
檔案系統功能比較 列出四個主要Windows檔案系統、NTFS、exFAT、UDF 和 FAT32 之功能與功能的資料表支援比較。
檔案和叢集 檔案是檔案系統中的資料單位,使用者可以存取和管理。
建立、刪除和維護檔案 用來建立、刪除和維護檔案的函式。
取得和設定檔案資訊 用來取得和設定檔案資訊的函式。
讀取和寫入檔案 應用程式會使用ReadFile、ReadFileEx、WriteFile和WriteFileEx函式來讀取和寫入檔案。
檔案和目錄連結 NTFS 檔案系統支援兩種類型的連結: 硬式連結和連接點。
區塊複製 區塊複製作業會指示檔案系統代表應用程式複製檔案位元組範圍。
檔案壓縮和解壓縮 NTFS 檔案系統會使用Lempel-Ziv壓縮,這是無損失的壓縮演算法。
檔案加密 加密檔案系統 (EFS) 會使用公開金鑰系統,為 NTFS 檔案系統磁片區上的個別檔案提供密碼編譯保護。
檔案安全性和存取權限 因為檔案是安全性實體物件,所以存取它們受到存取控制模型所規範,該模型會控管對Windows中所有其他安全性實體物件的存取。
輸入和輸出 (I/O) Windows可讓您在位於本機和遠端電腦的儲存體元件上執行輸入和輸出 (I/O) 作業。
疏鬆檔案 檔案壓縮包含大部分零的檔案會有效率地使用磁碟空間。
符號連結 符號連結是指向另一個檔案系統物件的檔案系統物件。 所指向的物件稱為目標。

檔名

  • 在檔案系統中,檔名是用於定位儲存位置
  • 檔案在其目錄中必須有唯一的名稱。
  • 大多數的檔案系統對檔名的長度有限制
  • 有些是大小寫不敏感,有些則大小寫敏感
  • 大多的檔案系統允許檔名包含非常多的[Unicode]字元集的字元
  • 一般不建議在檔名中包含特殊字元
主題 描述
檔案資料流程 在 NTFS 檔案系統中,資料流程包含寫入檔案的資料,並提供檔案的詳細資訊,而不是屬性。
檔案物件 檔案物件 可作為核心和使用者模式進程與位於實體磁片上的檔案資料之間的邏輯介面。
檔案控制代碼 使用 CreateFile 函式開啟檔案時,檔案 控制碼 會與其相關聯,直到進程終止或使用 CloseHandle 函式關閉控制碼為止。
檔案指標 檔案指標是 64 位位位移值,指定要讀取的下一個位元組,或指定要接收下一個寫入位元組的位置。
叢集和範圍 叢集可以從兩個不同的觀點參考:在檔案內和磁片區上。

建立、刪除和維護檔案

主題 描述
命名檔案、路徑和命名空間 檔案和目錄名稱的規則、慣例和限制,包括命名慣例、簡短檔案名與長檔名、完整路徑與相對路徑、最大路徑長度限制、8.3 檔案名和命名空間。
建立和開啟檔案 使用 CreateFile函式建立或開啟檔案的考慮。
移動和取代檔案 使用 CopyFileEx、CreateFile、Replacefile 和 MoveFileEx 函式移動和取代檔案的考慮。
關閉和刪除檔案 若要有效率地使用作業系統資源,應用程式應該在使用 CloseHandle函式不再需要檔案時關閉檔案。 如果應用程式終止時開啟檔案,系統會自動關閉它。
重組檔案 重組 是在磁片上移動檔案部分以重組檔案的程式,也就是移動磁片上的檔案叢集以使其連續的程式。

取得和設定檔案資訊

主題 描述
擷取檔案類型資訊 GetFileType函式會擷取檔案的類型:磁片、字元 (,例如主控台) 、管道或未知。
判斷檔案的大小 GetFileSize函式會擷取檔案的大小。
搜尋一或多個檔案 應用程式可以使用 FindFirstFile、 FindFirstFileEx、 FindNextFile和 FindClose 函式,搜尋目前目錄以尋找符合指定模式的所有檔案名。
設定和取得檔案的時間戳記 應用程式可以使用 GetFileTime 和 SetFileTime 函式來擷取和設定檔案建立、上次修改或上次存取的日期和時間。
判斷目前的字元集字碼頁 AreFileApisANSI函式會決定檔案 I/O 函式是否使用 ANSI 或 OEM 字元集字碼頁。

讀取和寫入檔案

主題 描述
放置檔案指標 Windows會使用檔案指標來追蹤讀取或寫入的位元組。
使用Scatter-Gather配置讀取或寫入檔案 描述一項作業中讀取或寫入非連續資料區塊的散佈收集配置。
將 I/O 資料排清至磁片System-Buffered Windows會將資料儲存在系統維護的資料緩衝區中,以將檔案讀取和寫入作業儲存,以將磁片效能優化。
截斷或擴充檔案 應用程式可以藉由呼叫 SetEndOfFile來截斷或擴充檔案。

檔案和目錄連結

主題 描述
硬式連結和接點 描述硬式連結和接點。
分散式連結追蹤和物件識別碼 分散式連結追蹤服務可讓用戶端應用程式追蹤已移動的連結來源。

區塊複製

  • 來源和目的地區域必須從叢集界限開始和結束。
  • 複製的區域長度必須小於 4GB。
  • 目的地區域不得超過檔案結尾。 如果應用程式想要使用複製的資料擴充目的地,必須先呼叫 SetEndOfFile
  • 若來源與目的地區域位於相同檔案,其不得重疊。 (應用程式可以繼續將區塊複製作業分割成不再重迭的多個區塊複製。)
  • 來源與目的檔案必須位於相同的 ReFS 磁碟區。
  • 來源和目的地檔案必須有相同的 完整性資料流程 設定 ,也就是必須在這兩個檔案中啟用完整性資料流程,或在兩個檔案中停用
  • 若來源檔案為疏鬆,目的檔案也必須為疏鬆。
  • 區塊複製作業會中斷共用的 Opportunistic 鎖定也稱為層級 2 Opportunistic Locks
  • ReFS 磁片區必須已格式化為 Windows Server 2016,而且如果Windows容錯移轉叢集正在使用中,則叢集功能等級必須在格式時間Windows Server 2016或更新版本。

檔案壓縮和解壓縮

一般而言,應用程式會呼叫 Lz32.dll 中的函式,以解壓縮使用 Compress.exe 壓縮的資料。 函式也可以處理檔案,而不嘗試解壓縮它們。

您可以使用 Lz32.dll 中的函式來解壓縮單一或多個檔案。 您也可以使用它們一次解壓縮壓縮檔案。

下列主題會識別 Lz32.dll 中函式所提供的檔案解壓縮:

  • 解壓縮單一檔
  • 解壓縮多個檔案
  • 從壓縮檔讀取
主題 描述
Compression 屬性 在 NTFS 檔案系統磁片區上,每個檔案和目錄都有 壓縮屬性。
壓縮狀態 磁片區上支援壓縮個別檔案和目錄的每個檔案和目錄都有 壓縮狀態。
取得壓縮檔案的大小 若要取得檔案的壓縮大小,請使用 GetCompressedFileSize 函式。
解壓縮單一檔案 應用程式可以使用 LZOpenFile、LZCopy 和 LZClose 函式來解壓縮單一壓縮檔案。
解壓縮多個檔案 應用程式可以使用 LZOpenFile、LZCopy 和 LZClose 函式來解壓縮多個檔案。
從壓縮檔讀取 應用程式可以使用 LZSeek 和 LZRead 函式,一次解壓縮一部分壓縮檔案。

檔案加密

主題 描述
處理加密的檔案和目錄 標示為加密的檔案會使用目前的加密驅動程式,由 NTFS 檔案系統加密。
加密的檔案和使用者金鑰 列出用來建立新金鑰、將金鑰新增至加密檔案、查詢加密檔案的金鑰,以及從加密檔案中移除金鑰的函式。
加密檔案的備份和還原 原始加密函式會啟用加密檔案的備

檔案安全性和存取權限

存取權限 Description
FILE_GENERIC_EXECUTE FILE_EXECUTE FILE_READ_ATTRIBUTES STANDARD_RIGHTS_EXECUTE 同步
FILE_GENERIC_READ FILE_READ_ATTRIBUTES FILE_READ_DATA FILE_READ_EA STANDARD_RIGHTS_READ 同步
FILE_GENERIC_WRITE FILE_APPEND_DATA FILE_WRITE_ATTRIBUTES FILE_WRITE_DATA FILE_WRITE_EA STANDARD_RIGHTS_WRITE 同步
HANDLE hFile = CreateFile( fileName,                   // lpFileName  
                           WRITE_OWNER | WRITE_DAC,    // dwDesiredAccess  
                           0,                          // dwShareMode  
                           NULL,                       // lpSecurityAttributes  
                           CREATE_ALWAYS,              // dwCreationDisposition  
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes  
                           NULL );                     // hTemplateFile  
HANDLE hFile = CreateFile( fileName,                   // lpFileName  
                           WRITE_OWNER | WRITE_DAC,    // dwDesiredAccess  
                           0,                          // dwShareMode  
                           NULL,                       // lpSecurityAttributes  
                           CREATE_ALWAYS,              // dwCreationDisposition  
                           FILE_FLAG_BACKUP_SEMANTICS, // dwFlagsAndAttributes  
                           NULL );                     // hTemplateFile  

輸入和輸出 (I/O)

主題 描述
I/O 概念 描述基本 I/O 概念。
網路 I/O 概念 當基礎網路通訊協定和重新導向器支援 I/O 作業時,您可以使用檔案 API 來執行網路 I/O。

疏鬆檔案

主題 描述
疏鬆檔案作業 呼叫 GetVolumeInformation 函式,判斷檔案系統是否支援疏鬆檔案。
取得疏鬆檔案的大小 使用 GetCompressedFileSize 或 GetFileSize 函式,取得檔案的配置大小或總大小。
疏鬆檔案和磁片配額 疏鬆檔案會依檔案的名義大小影響使用者配額,而不是實際配置的磁碟空間數量。

符號連結

主題 描述
檔案系統函式上的符號連結效果 符號連結如何影響使用路徑名稱指定一或多個檔案的標準檔案函式。
程式設計考量 使用符號連結的程式設計考慮。
建立符號連結 使用 CreateSymbolicLink 函式建立使用絕對或相對路徑的符號連結。

分類

  1. 磁碟
    • 一種設計用來利用資料儲存裝置來儲存電腦檔案的檔案系統,最常用的資料儲存裝置是磁碟機,可以直接或者間接地連接到電腦上
  2. 資料庫
    • 檔案按照特徵進行區分
      • 如檔案類型、專題、作者
  3. 快閃記憶體
    • 是一種為了在快閃記憶體裝置上儲存資料而設計的檔案系統
  4. 網路
    • 是一種將遠端主機上的分割區(目錄)經網路掛載到本地系統的一種機制
  • Linux支援的檔案系統

  • UNIX及BSD作業系統下的檔案系統

  • macOS(Mac OS X)的檔案系統

  • Bell實驗室的PLAN9檔案系統

  • OpenVMS的檔案系統

  • IBM大型電腦MVS的檔案系統

檔案系統範例程式碼
  • 需要 (字串區段)
[Strings]  
Msft               = "Microsoft Corporation"  
MinispyServiceDesc = "Minispy mini-filter driver"  
MinispyServiceName = "Minispy"  
RegInstancesSubkeyName = "Instances"  
RegDefaultInstanceValueName  = "DefaultInstance"  
RegAltitudeValueName    = "Altitude"  
RegFlagsValueName  = "Flags"  

DefaultInstance    = "Minispy - Top Instance"  
Instance1.Name     = "Minispy - Middle Instance"   
Instance1.Altitude = "370000"  
Instance1.Flags    = 0x1 ; Suppress automatic attachments  
Instance2.Name     = "Minispy - Bottom Instance"  
Instance2.Altitude = "365000"  
Instance2.Flags    = 0x1 ; Suppress automatic attachments  
Instance3.Name     = "Minispy - Top Instance"  
Instance3.Altitude = "385000"  
Instance3.Flags    = 0x1 ; Suppress automatic attachments  

比較

  • 功能
特徵 NTFS exFAT UDF FAT32
建立時間戳記
上次存取時間戳記 否 (請參閱下方的附註) 是 (日期)
上次變更時間戳記
上次封存時間戳記
區分大小寫 是 (選項)
保留大小寫
硬式連結
軟式連結
疏鬆檔案
已命名的資料流
Oplock
擴充屬性 是 (僅限磁片)
替代資料流
掛接點
* 限制
特徵 NTFS exFAT UDF FAT32
檔案名稱長度上限 255 個 Unicode 字元 255 個 Unicode 字元 127 個 Unicode 或 254 個 ASCII 字元 255 個 Unicode 字元
路徑名稱長度上限 每個路徑元件不超過 255 個字元的 32,760 個 Unicode 字元 每個路徑元件不超過 255 個字元的 32,760 個 Unicode 字元 每個路徑元件不超過 255 個字元的 32,760 個 Unicode 字元 每個路徑元件不超過 255 個字元的 32,760 個 Unicode 字元
檔案大小上限 2^64 1 個位元組 2^64 1 個位元組 2^64 1 個位元組 4 GiB
磁碟區大小上限 16 TB (4 KB 叢集大小) 或 256TB (64 KB 叢集大小) 2^32 1 個叢集 (叢集大小上限 = 2^25 1) 2^32 個區塊 2^32 個區塊
* 日誌和變更記錄
特徵 NTFS exFAT UDF FAT32
僅限中繼資料的日誌
檔案變更記錄檔

* 區塊配置功能
特徵 NTFS exFAT UDF FAT32
尾封裝 是, (小型檔案會放在 MFT 資料流程描述元)
Extents
可變區塊大小 磁片區) 未設定 (
* 安全性
功能 NTFS exFAT UDF FAT32
追蹤檔案擁有者
POSIX 檔案許可權 POSIX 子系統功能中沒有可用的 (功能)
存取控制清單
檔案系統層級加密
總和檢查碼/ECC 中繼資料 中繼資料
* 壓縮
特徵 NTFS exFAT UDF FAT32
內建壓縮

* 配額
特徵 NTFS exFAT UDF FAT32
使用者層級磁碟空間
目錄層級磁碟空間 否 (請參閱下方的附註)
  • 注意NTFS 上的目錄層級磁碟空間配額功能可透過檔案伺服器Resource Manager取得。


[Linux] NTFS、 FAT32、exFAT檔案系統比較

檔案系統 FAT32 NTFS extFAT
作業系統 Win, Linux, Mac Win Linux, Mac: Read-only Win, Linux, Mac
單檔大小 4GB 16TB 64ZB
速度 Slowest Fastest Middle
穩定性 Good Best Worst

檔案系統篩選器驅動程式

  • 防病毒篩選器
  • 備份代理程式
  • 加密產品

iofCallDriver 函式 (wdm.h)

NTSTATUS IofCallDriver(  
  PDEVICE_OBJECT        DeviceObject,  
  __drv_aliasesMem PIRP Irp  
);  
參數
  1. DeviceObject
  • 裝置物件的指標,代表所要求 I/O 作業的目標裝置。

2.Irp

  • IRP的指標。
傳回值
  • 傳回適當的 NTSTATUS 值
規格需求
最低支援的用戶端 從 Windows 2000 開始提供。
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 合規性規則 CompleteRequestStatusCheck、CompletionRoutineRegistered、DeleteDevice、ForwardedAtBadIrql、ForwardedAtBadIrqlAllocate、ForwardedAtBadIrqlFsdAsync、ForwardedAtBadIrqlFsdSync、 HwStorPortProhibitedDDIs (storport) 、IoAllocateForward、IoAllocateIrpSignalEventInCompletionTimeout、IoBuildDeviceControlWait、IoBuildDeviceControlWaitTimeout、IoBuildFsdForward、IoBuildSynchronousFsdRequestWait、IoBuildSynchronousFsdRequestWaitTimeout、IoSetCompletionRoutineExCheck、IrpProcessingComplete、LowerDriverReturn、 MarkDevicePower、MarkQueuedIrps、MarkIrpPending、MarkIrpPending2、 MarkPower (wdm) 、 MarkPowerDown (wdm) 、 MarkQueryRelations (wdm ) 、 MarkStartDevice (wdm) 、PendedCompletedRequest、PendedCompletedRequest2、 PendedCompletedRequest3、PendedCompletedRequestEx、PnpIrpCompletion、PowerDownFail、PowerUpFail、RemoveLockForward、RemoveLockForward2、 RemoveLockForwardDeviceControl、RemoveLockForwardDeviceControl2、 RemoveLockForwardDeviceControlInternal、RemoveLockForwardDeviceControlInternal2、RemoveLockForwardRead、RemoveLockForwardRead2、RemoveLockForwardWrite、RemoveLockForwardWrite2、RemoveLockMnRemove2、RemoveLockMnSurpriseRemove、RemoveLockQueryMnRemove、TargetRelationNeedsRef、WmiForward

核心

  • 您的驅動程式必須實作標準驅動程式常式。
  • 所有驅動程式都需要下列常式:
  1. DriverEntry
  2. AddDevice
  3. DispatchXxx (常式開頭為 「Dispatch」,例如 DispatchCreate)
  4. DriverUnload

驅動程式支援常式

  • 是Windows作業系統為要使用的核心模式驅動程式所提供的常式。

  • 下列核心模式管理員提供驅動程式的支援:

    • 物件管理員常式

    • 記憶體管理員常式

    • 進程和執行緒管理員常式

    • I/O 管理員常式

    • Power Manager 常式

    • Configuration Manager常式

    • 核心交易管理員常式

    • 安全性參考監視器常式

  • 下列核心模式程式庫提供驅動程式的支援:

    • 核心核心程式庫支援常式

    • Executive Library 支援常式

    • Run-Time程式庫 (RTL) 常式

    • 保管庫字串程式庫常式

    • 保管庫整數程式庫常式

    • 直接記憶體存取 (DMA) 程式庫常式

    • 硬體抽象層 (HAL) 程式庫常式

    • 一般記錄檔案系統 (CLFS) 常式

    • Windows Management Instrumentation (WMI) 程式庫支援常式

    • ZwXxx 常式

    • 輔助Kernel-Mode程式庫常式和結構

    • 處理器群組相容性程式庫

Windows核心的公用標頭

若要開發Windows核心,您需要下列標頭:

  • aux_klib.h
  • hwnclx.h
  • ioaccess.h
  • iointex.h
  • miniport.h
  • ntddk.h
  • ntddsfio.h
  • ntddsysenv.h
  • ntintsafe.h
  • ntpoapi.h
  • ntstrsafe.h
  • pcivirt.h
  • pep_x.h
  • pepfx.h
  • procgrp.h
  • pwmutil.h
  • vpi.h
  • wdm.h
  • wdmsec.h
  • wmidata.h
  • wmilib.h
  • wmistr.h

CD-ROM 檔案系統和 UDF 檔案系統

  • CD-ROM 檔案系統 (CDRFS) 是唯讀的本端檔案系統實作,它可以儲存在 CD-ROM 媒體、CD-RW 媒體(如果是防寫保護的話)及 DVD-ROM 媒體上。不論使用的媒體為何,CDRFS 檔案大小上限都是 2 GB。

  • 「通用磁碟格式 (UDF)」檔案系統是可寫入的本端檔案系統實作,它能以唯讀的形式儲存在 DVD-ROM 媒體上,或以讀寫的形式儲存在 DVD-RAM 媒體中。

類型 說明
ISO 9660:1988(E) 標準 CDRFS 支援 ISO 9660 層次 3 交換及層次 1 施行。
High Sierra Group 規格 在 ISO 9660 之前,並提供與先前 CD-ROM 之間的向後相容性。
Rock Ridge Group Protocol 指定 ISO 9660 的擴充,這些擴充完全符合 ISO 9660 標準,並根據 System Use Sharing Protocol (SUSP) 及 Rock Ridge Interchange Protocol (RRIP) 提供完整的 POSIX 檔案系統語意,讓您可以裝載/存取 CD-ROM,如同在其他 UNIX 檔案系統中使用一樣。
CD-ROM eXtended Architecture 檔案格式(僅有 Mode 2 Form 1 磁區格式) 「CD-ROM eXtended Architecture (XA)」檔案格式會指定用於 CD-ROM 型多媒體應用程式(例如,照片 CD)的 ISO 9660 擴充。

所有磁區及檔案結構格式適用下列限制:

  • 僅單一磁區的磁區集
  • 僅非交錯的檔案

##FAT、HPFS 及 NTFS 檔案系統的概述

FAT

  • FAT 是指 Windows NT 所支援的最簡單檔案系統
  • FAT 檔案系統的特徵是檔案配置資料表 (FAT)
  • FAT 資料表和根目錄必須儲存在固定位置,這樣系統的啟動檔才能正確存放
  • 若要保護磁片區,則會保留 FAT 的兩個複本,以防一個遭到損毀
優點
  • 檔案位於 FAT 磁碟分割上,且在 MS-DOS 下重新開機系統,則可以取消刪除該檔案。
  • FAT 檔案系統最適合磁片磁碟機和/或磁碟分割大約 200 MB,因為 FAT 會從極少的開銷開始。
缺點
  • 使用超過 200 MB 的磁片磁碟機或磁碟分割時,隨著量值的增加,FAT 的效能會快速降低。
  • 不能設定 FAT 磁碟分割的許可權。

HPFS

  • 允許更大的硬碟存取

  • 會維護 FAT 的目錄組織

  • 會根據檔案名新增目錄的自動排序。

  • 將檔案名擴充為最多254雙位元組字元。

  • 允許以「資料」和特殊屬性組成檔案,以在支援其他命名慣例與安全性方面增加彈性。

  • 分攤單位會從聚簇變更為實體磁區 (512 位元組) ,這會減少磁碟空間的遺失。

  • 嘗試在連續的磁區中盡可能地指派檔案。 這樣做是為了提升檔的連續處理速度

  • 會將磁片磁碟機組織成一系列 8 MB 的區段,每個區段間都是2K 分配點陣圖,可追蹤帶區中的哪些磁區,但尚未加以分配

  • 波段可提高效能,因為磁片磁碟機頭不必回到邏輯上 (,通常是磁片的柱面 0) ,但是最接近的帶區分配點陣圖,以判斷存放檔案的位置。

超級區塊
  • 位於邏輯磁區16內,且包含根目錄的 FNODE 的指標。 使用 HPFS 的最大危險之一,就是如果超級區塊因損毀的磁區而遺失或損毀,即使磁片的其餘部分正常,也是磁碟分割的內容
備用區塊
  • 備件區塊位於邏輯磁區17,且包含 "熱修復程式" 和備用目錄區塊的表格。 在 HPFS 底下,偵測到損毀的磁區時,會使用「熱修正」專案邏輯指向現有的良好磁區,取代壞的磁區。 處理寫入錯誤的這項技術稱為熱修復
    • 熱修復是一種技術,當錯誤因損毀的磁區而發生時,檔案系統會將資訊移至不同的磁區,並將原來的磁區標記為壞。
    • Windows NT 隨附的 HPFS 版本不支援熱修復。

優點

  • HPFS 最適合用磁片磁碟機

缺點

  • 由於 HPFS 所包含的額外負荷,因此在大約 200 MB 的情況下,其容量不是非常有效率。
  • 磁片容量大於大約 400 MB,將會降低效能。
  • 您無法在 [Windows NT] 底下設定 HPFS 的安全性。

命名慣例

  • 名稱開頭必須是字母或數位,而且可以包含下列以外的任何字元: . " / \ [ ] : ; | = ,

如果使用這些字元中的任何一個,則可能會發生意外的結果。 名稱不能包含任何空格。

下列名稱是保留的:

CON,AUX,COM1,COM2,COM3,COM4,LPT1,LPT2,LPT3,PRN,NUL

所有字元都會轉換成大寫。

NTFS

  • 從使用者的觀點來看,NTFS 會繼續將檔案組織成目錄
  • 與 FAT 或 HPFS 不同的是,磁片上沒有「特殊」物件,而且不會對基準硬體
  • 不會對基準硬體(例如,512個位元組的磁區)進行依賴性
  • 磁片上沒有特殊位置
    • 例如 FAT 資料表或 HPFS 超級區塊。
  • NTFS 的目標是提供下列專案:
    • 可靠性,對高端系統和檔案伺服器尤其必要
      • 三個主要區域已解決:可復原性、移除嚴重單一磁區失敗及修復。
      • 當在 FAT 或 HPFS 上執行 CHKDSK 時,會檢查目錄、分配及檔資料表內的指標一致性。
      • 在 NTFS 下,會維護針對這些元件的交易記錄,使 CHKDSK 只需要將交易移回最後一個認可點,才能復原檔案系統內的一致性。
    • 新增功能的平臺
    • 支援 POSIX 需求
    • 移除 FAT 和 HPFS 檔案系統的限制
新增功能
  • NTFS 可提供豐富且靈活的平臺,供其他檔案系統使用。
  • NTFS 完全支援 Windows NT 的安全性模型,並支援多個資料流程。
  • 在 NTFS 下,使用者可以將自己的使用者定義屬性新增至檔案。

POSIX 支援

NTFS 是支援的檔案系統最高的相容性,因為它支援下列 POSIX。

  1. 區分大小寫的命名:

    • 在 [POSIX] 底下,README.TXT、Readme.txt 及 readme.txt 都是不同的檔案。
  2. 其他時間戳記:

    • 額外的時間戳記會提供上次存取檔的時間。
  3. 硬連結:

    • Hard 連結是兩個不同的檔案名(可以位於不同的目錄中)指向相同的資料

移除限制

  • 首先,NTFS 已大幅增加檔和磁片區的大小,所以現在最多可以有 2 ^ 64 個位元組 (16 eb 或 18446744073709551616 bytes) 。
  • NTFS 也會傳回大簇的 FAT 概念,以避免發生不固定磁區大小的 HPFS 問題。
    • Windows NT 是一種可擕式作業系統,而且在某些時候可能會遇到不同的磁片技術
  • 所有的檔案名都是以 Unicode 為基礎,而檔案名會與長檔名一起保留
  • 這是透過允許將簇定義為硬體的自然配置大小的倍數來完成

優點

  • NTFS 最適合用於大約 400 MB 以上的磁片。 這是因為在 NTFS 下的效能不會降低,因為在 FAT 底下會有較大的磁片區大小。
  • NTFS 中所設計的可復原性是讓使用者絕對不必在 NTFS 磁碟分割上執行任何類型的磁片修復公用程式

缺點

  • 由於 NTFS 所含的空間負荷量,所以不建議在大約 400 MB 的磁片區上使用 NTFS。通常在100-MB 磁碟分割上使用至少 4 MB 的磁片磁碟機空間。
  • 目前 NTFS 內沒有內建的檔案加密。 因此,某人可以在 MS-DOS 或另一個作業系統下啟動,然後使用低層級磁片編輯實用程式來查看儲存在 NTFS 磁片區上的資料
  • 不能使用 NTFS 檔案系統格式化軟碟,Windows NT 會將所有軟碟格式化為 FAT 檔案系統,因為 NTFS 所含的開銷將無法放入軟碟。

NTFS 命名慣例

  • 檔案及目錄名稱最多可以有255個字元,包括任何副檔名。

  • 名稱保留大小寫,但不區分大小寫。 NTFS 不會根據大小寫來區分檔案名。 名稱可以包含下列以外的任何字元:

​ ? " / \ < > * | :

  • 目前,從命令列,您只可以建立最多253個字元的檔案名。

基礎硬體限制可能會在任何檔案系統中強加額外的磁碟分割大小限制。 尤其是,啟動分割區的大小只能是 7.8 GB,而分割區資料表中有 2 tb 的限制。

IRP_MJ_CREATE (IFS)

傳送時

  • 當建立新的檔案或目錄,或開啟現有的檔案、裝置、目錄或磁片區時,i/o 管理員會傳送 IRP_MJ_CREATE 要求。
  • 通常會代表使用者模式應用程式傳送此 IRP,此應用程式已呼叫 Microsoft Win32 函數(例如 CreateFile ),或代表已呼叫函式(例如 IoCreateFileIoCreateFileSpecifyDeviceObjectHint、 [ZwCreateFileZwOpenFile的核心模式元件。

操作:檔案系統驅動程式

  • 如果目標裝置物件是檔案系統的控制裝置物件,則在將 irp > IoStatus*>* 之後,檔案系統驅動程式的分派常式必須完成 irp 並傳回適當的 NTSTATUS 值。
  • 否則,檔案系統驅動程式應該處理建立要求。

操作:檔案系統篩選器驅動程式

  • 如果目標裝置物件是篩選器驅動程式的控制裝置物件,則在將 irp > IoStatus> 之後,篩選器驅動程式的分派常式必須完成 irp 並傳回適當的 NTSTATUS 值。

  • 否則,篩選器驅動程式應該執行任何必要的處理,並根據篩選準則的本質,完成 IRP 或將它傳遞到堆疊上下一個較低的驅動程式

  • 一般而言,篩選器驅動程式不應傳回 STATUS_PENDING 以回應 IRP_MJ_CREATE。 但是,如果較低層級的驅動程式傳回 STATUS_PENDING,則篩選器驅動程式應該將此狀態值傳遞給驅動程式鏈。

  • 當舊版篩選器驅動程式在建立後回呼中重新發出 create 時,它們必須釋放並設定與其重新分析點關聯的緩衝區, (輔助緩衝區) 為 Null。 如果舊版篩選器驅動程式未釋放這個緩衝區,並將它設定為 Null,驅動程式將會流失記憶體。 微篩選器驅動程式不需要這麼做,因為篩選管理員對這些驅動程式執行此動作。

參數

  • 檔案系統或篩選器驅動程式會使用指定的 IRP 來呼叫 IoGetCurrentIrpStackLocation,以取得其在 IRP 中本身堆疊位置的指標

  • DeviceObject:目標裝置物件的指標。

  • Irp- >AssociatedIrp:如果 file 物件代表具有擴充屬性的檔案,則為 FILE_FULL_EA_INFORMATION結構化緩衝區的指標。 否則,此成員會設定為Null。

  • Irp- >旗標:已針對此要求設定下列旗標:

    • IRP_CREATE_OPERATION
    • IRP_DEFER_IO_COMPLETION
    • IRP_SYNCHRONOUS_API
  • Irp- >RequestorMode:表示要求作業之進程的執行模式,可能是 KernelModeUserMode。 請注意,如果設定了 SL_FORCE_ACCESS_CHECK 旗標,則必須執行存取檢查,即使 > RequestorModeKernelMode

  • Irp- >IoStatus:接收最終完成狀態的 IO_STATUS_BLOCK結構指標,以及所要求作業的相關資訊。 檔案系統會將此結構的資訊成員設定為下列其中一個值:

    • FILE_CREATED
    • FILE_DOES_NOT_EXIST
    • FILE_EXISTS
    • FILE_OPENED
    • FILE_OVERWRITTEN
    • FILE_SUPERSEDED
  • Irp- >AllocationSize:檔案的初始配置大小(以位元組為單位)。 非零值除非正在建立、覆寫或取代檔案,否則不會有任何作用。

  • FltCancelFileOpen 和 IoCancelFileOpen會在檔案物件的 [ 旗標 ] 欄位中設定FO_FILE_OPEN_CANCELLED 旗標。

    • 設定此旗標表示已取消 IRP_MJ_CREATE 要求,並會針對此檔案物件發出 IRP_MJ_CLOSE要求。
    • 一旦取消建立要求,就無法重新發出。
  • IrpSp- >MajorFunction:指定 IRP_MJ_CREATE。

  • IrpSp- >EaLength: *AssociatedIrp. SystemBuffer 的緩衝區 >*大小(以位元組為單位)。 如果 Irp- > AssociatedIrp. SystemBuffer 的值為 Null,則此成員必須為零。

  • IrpSp- >FileAttributes:建立或開啟檔案時要套用之屬性旗標的位元遮罩。 明確指定的屬性僅適用于建立、取代或覆寫檔案的情況。

    • 根據預設,此值為 FILE_ATTRIBUTE_NORMAL,可由任何其他旗標或相容旗標的 Or 運算組合覆寫。
  • IrpSp- >參數。選項:旗標的位元遮罩,指定要在建立或開啟檔案時套用的選項,以及檔案已經存在時要採取的動作。

    • 此參數的高8位會對應至要IoCreateFileSpecifyDeviceObjectHint的處置參數。

    • 此成員的低24位會對應至IoCreateFileSpecifyDeviceObjectHint的CreateOptions參數。

    • 執行檔案掃描 (的檔案系統篩選器和微篩選器驅動程式(例如防毒程式) 應該特別注意FILE_COMPLETE_IF_OPLOCKED 旗標。

    • 如果設定此旗標,則篩選準則不得封鎖或延遲 IRP_MJ_CREATE 操作。

  1. 如果 FILE_COMPLETE_IF_OPLOCKED 旗標是在預先建立 (建立分派) 路徑中設定,則篩選準則不能起始下列任何一種類型的作業,因為它們可能會導致 oplock 中斷:
  • IRP_MJ_CLEANUP
  • IRP_MJ_CREATE
  • IRP_MJ_FILE_SYSTEM_CONTROL
  • IRP_MJ_FLUSH_BUFFERS
  • IRP_MJ_LOCK_CONTROL
  • IRP_MJ_READ
  • IRP_MJ_SET_INFORMATION
  • IRP_MJ_WRITE
  1. 如果篩選或微篩選無法接受 FILE_COMPLETE_IF_OPLOCKED 旗標,則必須使用STATUS_SHARING_VIOLATION 完成 IRP_MJ_CREATE 要求。

  2. 如果 FILE_COMPLETE_IF_OPLOCKED 旗標是在完成後 (建立) 路徑中設定,則篩選器應該檢查檔案系統是否已將 IoStatus 的狀態設定為 STATUS_OPLOCK_BREAK_IN_PROGRESS 狀態值。

  3. 如果未設定此狀態值,篩選器就可以安全地起始檔案的上述其中一項作業

  4. 如果設定此狀態值,則 oplock 尚未中斷,且篩選準則不能起始可能造成 oplock 中斷的任何作業。

  • 因此,在下列其中一個條件成立之前,篩選準則必須延後所有上述的作業:

    • Oplock 的擁有者會將 FSCTL_OPLOCK_BREAK_ACKNOWLEDGE 要求傳送至檔案系統。
    • 篩選或微篩選器以外的系統元件會將必須等候 oplock 中斷的 i/o 要求傳送給檔案系統, (例如 IRP_MJ_READ 或 IRP_MJ_WRITE) 。 篩選或微篩選可以從其分派 (或 preoperation 回呼) 常式起始此新作業的上述其中一項作業,因為分派或 preoperation 回呼常式會進入等候狀態,直到 oplock 中斷完成為止。
  • IrpSp- >SecurityCoNtext- > AccessState:指向ACCESS_STATE結構的指標,其中包含物件的主體內容、授與存取類型和剩餘的所需存取類型。

  • IrpSp- >SecurityCoNtext- > DesiredAccess: ACCESS_MASK 結構,指定對檔案要求的存取權限。 如需詳細資訊,請參閱要IoCreateFileSpecifyDeviceObjectHint之DesiredAccess參數的描述。

  • IrpSp- >ShareAccess:為檔案要求的共用存取權限位元遮罩。 如果這個成員為零,則會要求獨佔存取權。 如需詳細資訊,請參閱要IoCreateFileSpecifyDeviceObjectHint之ShareAccess參數的描述。

  • IrpSp- >FileObject: I/o 管理員所建立的檔案物件指標,代表要建立或開啟的檔案。

    • 當檔案系統處理 IRP_MJ_CREATE 要求時,會將這個檔案物件中的 FsCoNtext 和可能 FsCoNtext2 欄位設定為檔案系統特定的值。 因此,必須等到檔案系統處理建立要求之後, FsCoNtextFsCoNtext2 欄位的值才會被視為有效。

    • 參數包含RelatedFileObject欄位的指標,也就是 FILE_OBJECT 結構。

    • FILE_OBJECT 結構的 RelatedFileObject 欄位是用來表示已開啟相對於已開啟之檔案物件的指定檔案。

    • 這通常表示相對檔案是目錄,但以資料流程為基礎的檔案可能會相對於已經存在的檔案資料流程開啟。

    • FILE_OBJECT 結構的 RelatedFileObject 欄位只在處理 IRP_MJ_CREATE 時有效。

  • IrpSp- >旗標:下列一或多個值:

旗標 意義
SL_FORCE_ACCESS_CHECK 0x01 如果設定此旗標,即使 IRP > RequestorMode 的值為 KernelMode,也必須執行存取檢查。
SL_OPEN_PAGING_FILE 0x02 如果設定此旗標,檔案就是分頁檔案。
SL_OPEN_TARGET_DIRECTORY 0x04 如果設定此旗標,則應該開啟檔案的上層目錄。
SL_STOP_ON_SYMLINK 0x08 如果設定此旗標,則會隱藏 i/o 管理員自動進行接合和符號連結的動作,導致開啟接合和符號連結以傳回 STATUS_REPARSE。
SL_IGNORE_READONLY_ATTRIBUTE 0x40 如果設定此旗標,則會允許建立唯讀檔案搭配 FILE_DELETE_ON_CLOSE 選項,這會導致在控制碼關閉時刪除檔案。
SL_CASE_SENSITIVE 0x80 如果設定,檔案名比較應該區分大小寫。
參考資料

維基百科結果
檔案系統範例程式碼
檔案系統功能比較
[Linux] NTFS、 FAT32、exFAT檔案系統比較
檔案系統驅動程式設計指南
IRP_MJ_CREATE (IFS)
iofCallDriver 函式 (wdm.h)
核心
CD-ROM 檔案系統和 UDF 檔案系統
通用光碟格式
FAT、HPFS 及 NTFS 檔案系統的概述
檔案系統-IBM
檔案系統通用階層式
關於檔案管理