Changeset 69861 in vbox for trunk/include/iprt/formats
- Timestamp:
- Nov 28, 2017 7:01:35 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 119307
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/formats/ntfs.h
r69849 r69861 40 40 41 41 42 /** @} */ 43 42 /** @name NTFS_MFT_IDX_XXX - Predefined MFT indexes. 43 * @{ */ 44 #define NTFS_MFT_IDX_MFT 0 /**< The MFT itself. */ 45 #define NTFS_MFT_IDX_MFT_MIRROR 1 /**< Mirror MFT (partial?). */ 46 #define NTFS_MFT_IDX_LOG_FILE 2 /**< Journalling log. */ 47 #define NTFS_MFT_IDX_VOLUME 3 /**< Volume attributes. */ 48 #define NTFS_MFT_IDX_ATTRIB_DEF 4 /**< Attribute definitions. */ 49 #define NTFS_MFT_IDX_ROOT 5 /**< The root directory. */ 50 #define NTFS_MFT_IDX_BITMAP 6 /**< Allocation bitmap. */ 51 #define NTFS_MFT_IDX_BOOT 7 /**< The boot sector. */ 52 #define NTFS_MFT_IDX_BAD_CLUSTER 8 /**< Bad cluster table. */ 53 #define NTFS_MFT_IDX_SECURITY 9 /**< Shared security descriptors (w2k and later). */ 54 #define NTFS_MFT_IDX_UP_CASE 10 /**< Unicode upper case table. */ 55 #define NTFS_MFT_IDX_EXTEND 11 /**< Directory containing further system files. */ 56 #define NTFS_MFT_IDX_FIRST_USER 16 /**< The first user file. */ 57 /** @} */ 58 59 /** 60 * NTFS MFT record reference. 61 */ 62 typedef union NTFSMFTREF 63 { 64 /** unsigned 64-bit view. */ 65 uint64_t u64; 66 /** unsigned 32-bit view. */ 67 uint32_t au32[2]; 68 /** unsigned 16-bit view. */ 69 uint16_t au16[4]; 70 71 /** Structured view. */ 72 struct 73 { 74 /** Index of the master file table record. */ 75 uint64_t idxMft : 48; 76 /** MFT record reuse sequence number (for catching dangling references). */ 77 uint64_t uRecReuseSeqNo : 16; 78 } RT_UNION_NM(s); 79 } NTFSMFTREF; 80 AssertCompileSize(NTFSMFTREF, 8); 81 /** Pointer to a NTFS MFT record reference. */ 82 typedef NTFSMFTREF *PNTFSMFTREF; 83 /** Pointer to a const NTFS MFT record reference. */ 84 typedef NTFSMFTREF const *PCNTFSMFTREF; 85 86 /** @name NTFSMFTREF_GET_IDX 87 * Gets the MFT index number from a MFT reference. */ 88 /** @name NTFSMFTREF_GET_SEQ 89 * Gets the MFT reuse sequence number from a MFT reference. */ 90 /** @name NTFSMFTREF_SET_IDX 91 * Sets the MFT index number of a MFT reference. */ 92 /** @name NTFSMFTREF_SET_SEQ 93 * Sets the MFT reuse sequence number of a MFT reference. */ 94 /** @name NTFSMFTREF_SET 95 * Sets the values of a MFT reference. */ 96 #ifdef RT_LITTLE_ENDIAN 97 # define NTFSMFTREF_GET_IDX(a_pMftRef) ((a_pMftRef)->RT_UNION_NM(s.)idxMft) 98 # define NTFSMFTREF_GET_SEQ(a_pMftRef) ((a_pMftRef)->RT_UNION_NM(s.)uRecReuseSeqNo) 99 # define NTFSMFTREF_SET_SEQ(a_pMftRef, a_uValue) do { (a_pMftRef)->RT_UNION_NM(s.)uRecReuseSeqNo = (a_uValue); } while (0) 100 # define NTFSMFTREF_SET_IDX(a_pMftRef, a_uValue) do { (a_pMftRef)->RT_UNION_NM(s.)idxMft = (a_uValue); } while (0) 101 # define NTFSMFTREF_SET(a_pMftRef, a_idx, a_uSeq) \ 102 do { \ 103 (a_pMftRef)->RT_UNION_NM(s.)idxMft = (a_idx); \ 104 (a_pMftRef)->RT_UNION_NM(s.)uRecReuseSeqNo = (a_uSeq); \ 105 } while (0) 106 #else 107 # define NTFSMFTREF_GET_IDX(a_pMftRef) (RT_LE2H_U64((a_pMftRef)->u64) & UINT64_C(0x0000ffffffffffff)) 108 # define NTFSMFTREF_GET_SEQ(a_pMftRef) RT_LE2H_U16((uint16_t)(a_pMftRef)->u64) 109 # define NTFSMFTREF_SET_SEQ(a_pMftRef, a_uValue) do { (a_pMftRef)->au16[3] = RT_H2LE_U16(a_uValue); } while (0) 110 # define NTFSMFTREF_SET_IDX(a_pMftRef, a_uValue) \ 111 do { \ 112 (a_pMftRef)->au32[0] = RT_H2LE_U32((uint32_t)(a_uValue)); \ 113 (a_pMftRef)->au16[2] = RT_H2LE_U16((uint16_t)((a_uValue) >> 32)); \ 114 } while (0) 115 # define NTFSMFTREF_SET(a_pMftRef, a_idx, a_uSeq) \ 116 do { \ 117 (a_pMftRef)->au32[0] = RT_H2LE_U32((uint32_t)(a_idx)); \ 118 (a_pMftRef)->au16[2] = RT_H2LE_U16((uint16_t)((a_idx) >> 32)); \ 119 (a_pMftRef)->au16[3] = RT_H2LE_U16((uint16_t)(a_uSeq)); \ 120 } while (0) 44 121 #endif 45 122 46 123 124 /** 125 * NTFS record header. 126 */ 127 typedef struct NTFSRECHDR 128 { 129 /** Magic number (usually ASCII). */ 130 uint32_t uMagic; 131 /** Offset of the update sequence array from the start of the record. */ 132 uint16_t offUpdateSeqArray; 133 /** Number of entries in the update sequence array. (uint16_t sized entries) */ 134 uint16_t cUpdateSeqEntries; 135 } NTFSRECHDR; 136 AssertCompileSize(NTFSRECHDR, 8); 137 /** Pointer to a NTFS record header. */ 138 typedef NTFSRECHDR *PNTFSRECHDR; 139 /** Pointer to a const NTFS record header. */ 140 typedef NTFSRECHDR const *PCNTFSRECHDR; 141 142 143 /** 144 * NTFS file record (in the MFT). 145 */ 146 typedef struct NTFSRECFILE 147 { 148 /** 0x00: Header with NTFSREC_MAGIC_FILE. */ 149 NTFSRECHDR Hdr; 150 /** 0x08: Log file sequence number. */ 151 uint64_t uLsn; 152 /** 0x10: MFT record reuse sequence number (for dangling MFT references). */ 153 uint16_t uRecReuseSeqNo; 154 /** 0x12: Number of hard links. */ 155 uint16_t cLinks; 156 /** 0x14: Offset of the first attribute (relative to start of record). */ 157 uint16_t offFirstAttrib; 158 /** 0x16: Record flags (NTFSRECFILE_F_XXX). */ 159 uint16_t fFlags; 160 /** 0x18: Number of byte in use in this MFT record. */ 161 uint32_t cbRecUsed; 162 /** 0x1c: The MFT record size. */ 163 uint32_t cbRecSize; 164 /** 0x20: Reference to the base MFT record. */ 165 NTFSMFTREF BaseMftRec; 166 /** 0x28: Next attribute instance number. */ 167 uint16_t idNextAttrib; 168 /** 0x2a: Padding if NTFS 3.1+, update sequence array if older. */ 169 uint16_t uPaddingOrUsa; 170 /** 0x2c: MFT index of this record. */ 171 uint32_t idxMftSelf; 172 } NTFSRECFILE; 173 AssertCompileSize(NTFSRECFILE, 0x30); 174 /** Pointer to a NTFS file record. */ 175 typedef NTFSRECFILE *PNTFSRECFILE; 176 /** Pointer to a const NTFS file record. */ 177 typedef NTFSRECFILE const *PCNTFSRECFILE; 178 179 180 /** NTFS 'FILE' record magic value. */ 181 #define NTFSREC_MAGIC_FILE RT_H2LE_U32_C(UINT32_C(0x454c4946)) 182 183 /** @name NTFSRECFILE_F_XXX - NTFSRECFILE::fFlags. 184 * @{ */ 185 /** MFT record is in use. */ 186 #define NTFSRECFILE_F_IN_USE RT_H2LE_U16_C(UINT16_C(0x0001)) 187 /** Directory record. */ 188 #define NTFSRECFILE_F_DIRECTORY RT_H2LE_U16_C(UINT16_C(0x0002)) 189 /** @} */ 190 191 192 /** @name NTFS_AT_XXX - Attribute types 193 * @{ */ 194 #define NTFS_AT_UNUSED RT_H2LE_U32_C(UINT32_C(0x00000000)) 195 /** NTFSATSTDINFO */ 196 #define NTFS_AT_STANDARD_INFORMATION RT_H2LE_U32_C(UINT32_C(0x00000010)) 197 #define NTFS_AT_ATTRIBUTE_LIST RT_H2LE_U32_C(UINT32_C(0x00000020)) 198 /** PCNTFSATFILENAME */ 199 #define NTFS_AT_FILENAME RT_H2LE_U32_C(UINT32_C(0x00000030)) 200 #define NTFS_AT_OBJECT_ID RT_H2LE_U32_C(UINT32_C(0x00000040)) 201 #define NTFS_AT_SECURITY_DESCRIPTOR RT_H2LE_U32_C(UINT32_C(0x00000050)) 202 #define NTFS_AT_VOLUME_NAME RT_H2LE_U32_C(UINT32_C(0x00000060)) 203 #define NTFS_AT_VOLUME_INFORMATION RT_H2LE_U32_C(UINT32_C(0x00000070)) 204 #define NTFS_AT_DATA RT_H2LE_U32_C(UINT32_C(0x00000080)) 205 #define NTFS_AT_INDEX_ROOT RT_H2LE_U32_C(UINT32_C(0x00000090)) 206 #define NTFS_AT_INDEX_ALLOCATION RT_H2LE_U32_C(UINT32_C(0x000000a0)) 207 #define NTFS_AT_BITMAP RT_H2LE_U32_C(UINT32_C(0x000000b0)) 208 #define NTFS_AT_REPARSE_POINT RT_H2LE_U32_C(UINT32_C(0x000000c0)) 209 #define NTFS_AT_EA_INFORMATION RT_H2LE_U32_C(UINT32_C(0x000000d0)) 210 #define NTFS_AT_EA RT_H2LE_U32_C(UINT32_C(0x000000e0)) 211 #define NTFS_AT_PROPERTY_SET RT_H2LE_U32_C(UINT32_C(0x000000f0)) 212 #define NTFS_AT_LOGGED_UTILITY_STREAM RT_H2LE_U32_C(UINT32_C(0x00000100)) 213 #define NTFS_AT_FIRST_USER_DEFINED RT_H2LE_U32_C(UINT32_C(0x00001000)) 214 #define NTFS_AT_END RT_H2LE_U32_C(UINT32_C(0xffffffff)) 215 /** @} */ 216 217 /** @name NTFS_AF_XXX - Attribute flags. 218 * @{ */ 219 #define NTFS_AF_COMPR_FMT_NONE UINT16_C(0x0000) 220 #define NTFS_AF_COMPR_FMT_LZNT1 UINT16_C(0x0001) /**< See RtlCompressBuffer / COMPRESSION_FORMAT_LZNT1. */ 221 #define NTFS_AF_COMPR_FMT_XPRESS UINT16_C(0x0002) /**< See RtlCompressBuffer / COMPRESSION_FORMAT_XPRESS_HUFF. */ 222 #define NTFS_AF_COMPR_FMT_XPRESS_HUFF UINT16_C(0x0003) /**< See RtlCompressBuffer / COMPRESSION_FORMAT_XPRESS_HUFF. */ 223 #define NTFS_AF_COMPR_FMT_MASK UINT16_C(0x00ff) 224 #define NTFS_AF_ENCRYPTED UINT16_C(0x4000) 225 #define NTFS_AF_SPARSE UINT16_C(0x8000) 226 /** @} */ 227 228 /** 229 * NTFS attribute header. 230 * 231 * This has three forms: 232 * - Resident 233 * - Non-resident, no compression 234 * - Non-resident, compressed. 235 * 236 * Each form translates to a different header size. 237 */ 238 typedef struct NTFSATTRIBHDR 239 { 240 /** 0x00: Attribute type (NTFS_AT_XXX). */ 241 uint32_t uAttrType; 242 /** 0x04: Length of this attribute (resident part). */ 243 uint32_t cbAttrib; 244 /** 0x08: Set (1) if non-resident attribute, 0 if resident. */ 245 uint8_t fNonResident; 246 /** 0x09: Attribute name length (can be zero). */ 247 uint8_t cwcName; 248 /** 0x0a: Offset of the name string (relative to the start of this header). */ 249 uint16_t offName; 250 /** 0x0c: NTFS_AF_XXX. */ 251 uint16_t fFlags; 252 /** 0x0e: Attribute instance number. Unique within the MFT record. */ 253 uint16_t idAttrib; 254 /** 0x10: Data depending on the fNonResident member value. */ 255 union 256 { 257 /** Resident attributes. */ 258 struct 259 { 260 /** 0x10: Attribute value length. */ 261 uint32_t cbValue; 262 /** 0x14: Offset of the value (relative to the start of this header). */ 263 uint16_t offValue; 264 /** 0x16: NTFS_RES_AF_XXX. */ 265 uint8_t fFlags; 266 /** 0x17: Reserved. */ 267 uint8_t bReserved; 268 } Res; 269 270 /** Non-resident attributes. */ 271 struct 272 { 273 /** 0x10: The first virtual cluster containing data. */ 274 int64_t iVcnFirst; 275 /** 0x18: The last virtual cluster containing data (inclusive). */ 276 int64_t iVcnLast; 277 /** 0x20: Offset of the mapping pair program. This program gives us a mapping 278 * between VNC and LCN for the attribute value. */ 279 uint16_t offMappingPairs; 280 /** 0x22: Power of two compression unit size in clusters (cbCluster << uCompessionUnit). 281 * Zero means uncompressed. */ 282 uint8_t uCompressionUnit; 283 /** 0x23: Reserved */ 284 uint8_t abReserved[5]; 285 /** 0x28: Allocated size. */ 286 int64_t cbAllocated; 287 /** 0x30: Initialized size. */ 288 int64_t cbInitialized; 289 /** 0x38: Compressed size if compressed, otherwise absent. */ 290 int64_t cbCompressed; 291 } NonRes; 292 } RT_UNION_NM(u); 293 } NTFSATTRIBHDR; 294 AssertCompileSize(NTFSATTRIBHDR, 0x40); 295 AssertCompileMemberOffset(NTFSATTRIBHDR, RT_UNION_NM(u.) Res, 0x10); 296 AssertCompileMemberOffset(NTFSATTRIBHDR, RT_UNION_NM(u.) Res.bReserved, 0x17); 297 AssertCompileMemberOffset(NTFSATTRIBHDR, RT_UNION_NM(u.) NonRes, 0x10); 298 AssertCompileMemberOffset(NTFSATTRIBHDR, RT_UNION_NM(u.) NonRes.cbCompressed, 0x38); 299 /** Pointer to a NTFS attribute header. */ 300 typedef NTFSATTRIBHDR *PNTFSATTRIBHDR; 301 /** Pointer to a const NTFS attribute header. */ 302 typedef NTFSATTRIBHDR const *PCNTFSATTRIBHDR; 303 304 /** @name NTFSATTRIBHDR_SIZE_XXX - Attribute header sizes. 305 * @{ */ 306 /** Attribute header size for resident values. */ 307 #define NTFSATTRIBHDR_SIZE_RESIDENT (0x18) 308 /** Attribute header size for uncompressed non-resident values. */ 309 #define NTFSATTRIBHDR_SIZE_NONRES_UNCOMPRESSED (0x38) 310 /** Attribute header size for compressed non-resident values. */ 311 #define NTFSATTRIBHDR_SIZE_NONRES_COMPRESSED (0x40) 312 /** @} */ 313 314 /** 315 * NTFS standard file info attribute (NTFS_AT_STANDARD_INFORMATION). 316 */ 317 typedef struct NTFSATSTDINFO 318 { 319 /** 0x00: Creation timestamp. */ 320 int64_t iCreationTime; 321 /** 0x08: Last data modification timestamp. */ 322 int64_t iLastDataModTime; 323 /** 0x10: Last MFT record modification timestamp. */ 324 int64_t iLastMftModTime; 325 /** 0x18: Last access timestamp. */ 326 int64_t iLastAccessTime; 327 /** 0x20: File attributes. */ 328 uint32_t fFileAttribs; 329 /** 0x24: Maximum number of file versions allowed. 330 * @note NTFS 3.x, padding in 1.2 */ 331 uint32_t cMaxFileVersions; 332 /** 0x28: Current file version number. 333 * @note NTFS 3.x, padding in 1.2 */ 334 uint32_t uFileVersion; 335 /** 0x2c: Class ID (whatever that is). 336 * @note NTFS 3.x, padding in 1.2 */ 337 uint32_t idClass; 338 /** 0x30: Owner ID. 339 * Translated via $Q index in NTFS_MFT_IDX_EXTENDED/$Quota. 340 * @note NTFS 3.x, not present in 1.2 */ 341 uint32_t idOwner; 342 /** 0x34: Security ID. Translated via $SII index and $SDS data stream in 343 * NTFS_MFT_IDX_SECURITY. 344 * @note NTFS 3.x, not present in 1.2 */ 345 uint32_t idSecurity; 346 /** 0x38: Total quota charged for this file. 347 * @note NTFS 3.x, not present in 1.2 */ 348 uint64_t cbQuotaChared; 349 /** 0x40: Last update sequence number, index into $UsnJrnl. 350 * @note NTFS 3.x, not present in 1.2 */ 351 uint64_t idxUpdateSequence; 352 } NTFSATSTDINFO; 353 AssertCompileSize(NTFSATSTDINFO, 0x48); 354 /** Pointer to NTFS standard file info. */ 355 typedef NTFSATSTDINFO *PNTFSATSTDINFO; 356 /** Pointer to const NTFS standard file info. */ 357 typedef NTFSATSTDINFO const *PCNTFSATSTDINFO; 358 359 /** The size of NTFSATSTDINFO in NTFS v1.2 and earlier. */ 360 #define NTFSATSTDINFO_SIZE_NTFS_V12 (0x30) 361 362 /** @name NTFS_FA_XXX - NTFS file attributes. 363 * @{ */ 364 #define NTFS_FA_READONLY UINT32_C(0x00000001) 365 #define NTFS_FA_HIDDEN UINT32_C(0x00000002) 366 #define NTFS_FA_SYSTEM UINT32_C(0x00000004) 367 #define NTFS_FA_DIRECTORY UINT32_C(0x00000010) 368 #define NTFS_FA_ARCHIVE UINT32_C(0x00000020) 369 #define NTFS_FA_DEVICE UINT32_C(0x00000040) 370 #define NTFS_FA_NORMAL UINT32_C(0x00000080) 371 #define NTFS_FA_TEMPORARY UINT32_C(0x00000100) 372 #define NTFS_FA_SPARSE_FILE UINT32_C(0x00000200) 373 #define NTFS_FA_REPARSE_POINT UINT32_C(0x00000400) 374 #define NTFS_FA_COMPRESSED UINT32_C(0x00000800) 375 #define NTFS_FA_OFFLINE UINT32_C(0x00001000) 376 #define NTFS_FA_NOT_CONTENT_INDEXED UINT32_C(0x00002000) 377 #define NTFS_FA_ENCRYPTED UINT32_C(0x00004000) 378 #define NTFS_FA_VALID_FLAGS UINT32_C(0x00007fb7) 379 #define NTFS_FA_VALID_SET_FLAGS UINT32_C(0x000031a7) 380 #define NTFS_FA_DUP_FILE_NAME_INDEX_PRESENT UINT32_C(0x10000000) /**< ?? */ 381 #define NTFS_FA_DUP_VIEW_INDEX_PRESENT UINT32_C(0x20000000) /**< ?? */ 382 /** @} */ 383 384 385 386 /** 387 * NTFS filename attribute (NTFS_AT_FILENAME). 388 */ 389 typedef struct NTFSATFILENAME 390 { 391 /** 0x00: The parent directory MFT record. */ 392 NTFSMFTREF ParentDirMftRec; 393 /** 0x08: Creation timestamp. */ 394 int64_t iCreationTime; 395 /** 0x10: Last data modification timestamp. */ 396 int64_t iLastDataModTime; 397 /** 0x18: Last MFT record modification timestamp. */ 398 int64_t iLastMftModTime; 399 /** 0x20: Last access timestamp. */ 400 int64_t iLastAccessTime; 401 /** 0x28: Allocated disk space for the unnamed data attribute. */ 402 int64_t cbAllocated; 403 /** 0x30: Actual size of unnamed data attribute. */ 404 int64_t cbData; 405 /** 0x38: File attributes. */ 406 uint32_t fFileAttribs; 407 union 408 { 409 /** 0x3c: Packed EA length. */ 410 uint16_t cbPackedEas; 411 /** 0x3c: Reparse tag, if no EAs. */ 412 uint32_t uReparseTag; 413 }; 414 /** 0x40: Filename length in unicode chars. */ 415 uint8_t cwcFilename; 416 /** 0x41: Filename type (NTFS_FILENAME_T_XXX). */ 417 uint8_t fFilenameType; 418 /** 0x42: The filename. */ 419 RTUTF16 wszFilename[RT_FLEXIBLE_ARRAY]; 420 } NTFSATFILENAME; 421 AssertCompileMemberOffset(NTFSATFILENAME, cbData, 0x30); 422 AssertCompileMemberOffset(NTFSATFILENAME, cbPackedEas, 0x3c); 423 AssertCompileMemberOffset(NTFSATFILENAME, uReparseTag, 0x3c); 424 AssertCompileMemberOffset(NTFSATFILENAME, wszFilename, 0x42); 425 /** Pointer to a NTFS filename attribute. */ 426 typedef NTFSATFILENAME *PNTFSATFILENAME; 427 /** Pointer to a const NTFS filename attribute. */ 428 typedef NTFSATFILENAME const *PCNTFSATFILENAME; 429 430 /** @name NTFS_FILENAME_T_XXX - filename types 431 * @{ */ 432 #define NTFS_FILENAME_T_POSIX 0 433 #define NTFS_FILENAME_T_WINDOWS 1 434 #define NTFS_FILENAME_T_DOS 2 435 #define NTFS_FILENAME_T_WINDOWS_AND_DSO 3 436 /** @} */ 437 438 /** @} */ 439 440 #endif 441
Note:
See TracChangeset
for help on using the changeset viewer.