OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
Data.c
Go to the documentation of this file.
1
9#include "NTFS.h"
10#include "Helper.h"
11
12UINT64 mUnitSize;
13
14STATIC
15UINT64
17 IN OUT RUNLIST *Runlist,
18 IN UINT64 Vcn
19 )
20{
21 EFI_STATUS Status;
22 UINT64 Delta;
23
24 ASSERT (Runlist != NULL);
25
26 if (Vcn >= Runlist->NextVcn) {
27 Status = ReadRunListElement (Runlist);
28 if (EFI_ERROR (Status)) {
29 return (UINT64)(-1);
30 }
31
32 return Runlist->CurrentLcn;
33 }
34
35 Delta = Vcn - Runlist->CurrentVcn;
36
37 return Runlist->IsSparse ? 0 : (Runlist->CurrentLcn + Delta);
38}
39
40STATIC
41EFI_STATUS
43 IN RUNLIST *Runlist,
44 IN UINT64 Offset,
45 IN UINTN Length,
46 OUT UINT8 *Dest
47 )
48{
49 EFI_STATUS Status;
50 UINT64 Index;
51 UINT64 ClustersTotal;
52 UINT64 Cluster;
53 UINT64 OffsetInsideCluster;
54 UINTN Size;
55 UINTN ClusterSize;
56
57 ASSERT (Runlist != NULL);
58 ASSERT (Dest != NULL);
59
60 ClusterSize = Runlist->Unit.FileSystem->ClusterSize;
61 OffsetInsideCluster = Offset & (ClusterSize - 1U);
62 Size = ClusterSize;
63 ClustersTotal = DivU64x64Remainder (Length + Offset + ClusterSize - 1U, ClusterSize, NULL);
64
65 for (Index = Runlist->TargetVcn; Index < ClustersTotal; ++Index) {
66 Cluster = GetLcn (Runlist, Index);
67 if (Cluster == (UINT64)(-1)) {
68 return EFI_DEVICE_ERROR;
69 }
70
71 Cluster *= ClusterSize;
72
73 if (Index == (ClustersTotal - 1U)) {
74 Size = (UINTN)((Length + Offset) & (ClusterSize - 1U));
75
76 if (Size == 0) {
77 Size = ClusterSize;
78 }
79
80 if (Index != Runlist->TargetVcn) {
81 OffsetInsideCluster = 0;
82 }
83 }
84
85 if (Index == Runlist->TargetVcn) {
86 Size -= (UINTN)OffsetInsideCluster;
87 }
88
89 if ((Index != Runlist->TargetVcn) && (Index != (ClustersTotal - 1U))) {
90 Size = ClusterSize;
91 OffsetInsideCluster = 0;
92 }
93
94 if (Cluster != 0) {
95 Status = DiskRead (
96 Runlist->Unit.FileSystem,
97 Cluster + OffsetInsideCluster,
98 Size,
99 Dest
100 );
101 if (EFI_ERROR (Status)) {
102 return Status;
103 }
104 } else {
105 SetMem (Dest, Size, 0);
106 }
107
108 Dest += Size;
109 }
110
111 return EFI_SUCCESS;
112}
113
114EFI_STATUS
115EFIAPI
117 IN EFI_FS *FileSystem,
118 IN UINT64 Offset,
119 IN UINTN Size,
120 IN OUT VOID *Buffer
121 )
122{
123 EFI_STATUS Status;
124 EFI_BLOCK_IO_MEDIA *Media;
125
126 ASSERT (FileSystem != NULL);
127 ASSERT (FileSystem->DiskIo != NULL);
128 ASSERT (FileSystem->BlockIo != NULL);
129
130 Media = FileSystem->BlockIo->Media;
131
132 Status = FileSystem->DiskIo->ReadDisk (
133 FileSystem->DiskIo,
134 Media->MediaId,
135 Offset,
136 Size,
137 Buffer
138 );
139 if (EFI_ERROR (Status)) {
140 DEBUG ((DEBUG_INFO, "NTFS: Could not read disk at address %Lx\n", Offset));
141 }
142
143 return Status;
144}
145
146EFI_STATUS
147EFIAPI
149 IN EFI_NTFS_FILE *File,
150 OUT UINT8 *Buffer,
151 IN UINT64 RecordNumber
152 )
153{
154 EFI_STATUS Status;
155 UINTN FileRecordSize;
156
157 ASSERT (File != NULL);
158 ASSERT (Buffer != NULL);
159
160 FileRecordSize = File->FileSystem->FileRecordSize;
161
162 Status = ReadAttr (
163 &File->MftFile.Attr,
164 Buffer,
165 RecordNumber * FileRecordSize,
166 FileRecordSize
167 );
168 if (EFI_ERROR (Status)) {
169 DEBUG ((DEBUG_INFO, "NTFS: Could not read MFT Record 0x%Lx\n", RecordNumber));
170 FreeAttr (&File->MftFile.Attr);
171 return Status;
172 }
173
174 return Fixup (
175 Buffer,
176 FileRecordSize,
177 SIGNATURE_32 ('F', 'I', 'L', 'E'),
178 File->FileSystem->SectorSize
179 );
180}
181
182EFI_STATUS
183EFIAPI
185 IN NTFS_ATTR *Attr,
186 OUT UINT8 *Dest,
187 IN UINT64 Offset,
188 IN UINTN Length
189 )
190{
191 EFI_STATUS Status;
192 UINT8 *Current;
193 UINT32 Type;
194 UINT8 *AttrStart;
195 UINT64 Vcn;
196 ATTR_LIST_RECORD *Record;
197 ATTR_HEADER_RES *Res;
198 UINTN ClusterSize;
199
200 ASSERT (Attr != NULL);
201 ASSERT (Dest != NULL);
202
203 Current = Attr->Current;
204 Attr->Next = Attr->Current;
205 ClusterSize = Attr->BaseMftRecord->File->FileSystem->ClusterSize;
206
207 if ((Attr->Flags & NTFS_AF_ALST) != 0) {
208 if (Attr->Last < (Attr->Next + sizeof (ATTR_LIST_RECORD))) {
209 DEBUG ((DEBUG_INFO, "NTFS: $ATTRIBUTE_LIST does not contain even a single record.\n"));
210 return EFI_VOLUME_CORRUPTED;
211 }
212
213 Record = (ATTR_LIST_RECORD *)Attr->Next;
214 Type = Record->Type;
215
216 Vcn = DivU64x64Remainder (Offset, ClusterSize, NULL);
217 if (COMPRESSION_BLOCK >= ClusterSize) {
218 Vcn &= ~0xFULL;
219 }
220
221 Record = (ATTR_LIST_RECORD *)((UINT8 *)Record + Record->RecordLength);
222 while (((UINT8 *)Record + sizeof (ATTR_LIST_RECORD)) <= Attr->Last) {
223 if (Record->Type != Type) {
224 break;
225 }
226
227 if (Record->StartingVCN > Vcn) {
228 break;
229 }
230
231 if (Record->RecordLength == 0) {
232 return EFI_VOLUME_CORRUPTED;
233 }
234
235 Attr->Next = (UINT8 *)Record;
236 Record = (ATTR_LIST_RECORD *)((UINT8 *)Record + Record->RecordLength);
237 }
238 } else {
239 Res = (ATTR_HEADER_RES *)Attr->Next;
240 Type = Res->Type;
241 }
242
243 AttrStart = FindAttr (Attr, Type);
244 if (AttrStart != NULL) {
245 Status = ReadData (Attr, AttrStart, Dest, Offset, Length);
246 } else {
247 DEBUG ((DEBUG_INFO, "NTFS: Attribute not found\n"));
248 Status = EFI_VOLUME_CORRUPTED;
249 }
250
251 Attr->Current = Current;
252
253 return Status;
254}
255
256EFI_STATUS
257EFIAPI
259 IN NTFS_ATTR *Attr,
260 IN UINT8 *AttrStart,
261 OUT UINT8 *Dest,
262 IN UINT64 Offset,
263 IN UINTN Length
264 )
265{
266 EFI_STATUS Status;
267 RUNLIST *Runlist;
268 ATTR_HEADER_NONRES *NonRes;
269 ATTR_HEADER_RES *Res;
270 UINT64 Sector0;
271 UINT64 Sector1;
272 UINT64 OffsetInsideCluster;
273 UINT64 BufferSize;
274 UINTN FileRecordSize;
275 UINTN SectorSize;
276 UINTN ClusterSize;
277
278 if (Length == 0) {
279 return EFI_SUCCESS;
280 }
281
282 FileRecordSize = Attr->BaseMftRecord->File->FileSystem->FileRecordSize;
283 SectorSize = Attr->BaseMftRecord->File->FileSystem->SectorSize;
284 ClusterSize = Attr->BaseMftRecord->File->FileSystem->ClusterSize;
285 BufferSize = FileRecordSize - (Attr->Current - Attr->BaseMftRecord->FileRecord);
286 //
287 // Resident Attribute
288 //
289 if (BufferSize < sizeof (ATTR_HEADER_RES)) {
290 DEBUG ((DEBUG_INFO, "NTFS: (ReadData #1) Attribute is corrupted.\n"));
291 return EFI_VOLUME_CORRUPTED;
292 }
293
294 Res = (ATTR_HEADER_RES *)AttrStart;
295
296 if (Res->NonResFlag == 0) {
297 if ((Offset + Length) > Res->InfoLength) {
298 DEBUG ((DEBUG_INFO, "NTFS: Read out of range\n"));
299 return EFI_VOLUME_CORRUPTED;
300 }
301
302 if (BufferSize < (Res->InfoOffset + Offset + Length)) {
303 DEBUG ((DEBUG_INFO, "NTFS: Read out of buffer.\n"));
304 return EFI_VOLUME_CORRUPTED;
305 }
306
307 CopyMem (Dest, (UINT8 *)Res + Res->InfoOffset + Offset, Length);
308
309 return EFI_SUCCESS;
310 }
311
312 //
313 // Non-Resident Attribute
314 //
315 if (BufferSize < sizeof (ATTR_HEADER_NONRES)) {
316 DEBUG ((DEBUG_INFO, "NTFS: (ReadData #2) Attribute is corrupted.\n"));
317 return EFI_VOLUME_CORRUPTED;
318 }
319
320 NonRes = (ATTR_HEADER_NONRES *)AttrStart;
321
322 Runlist = (RUNLIST *)AllocateZeroPool (sizeof (RUNLIST));
323 if (Runlist == NULL) {
324 return EFI_OUT_OF_RESOURCES;
325 }
326
327 Runlist->Attr = Attr;
328 Runlist->Unit.FileSystem = Attr->BaseMftRecord->File->FileSystem;
329
330 if ( (NonRes->DataRunsOffset > BufferSize)
331 || (NonRes->DataRunsOffset > NonRes->RealSize)
332 || (NonRes->RealSize > NonRes->AllocatedSize))
333 {
334 DEBUG ((DEBUG_INFO, "NTFS: Non-Resident Attribute is corrupted.\n"));
335 FreePool (Runlist);
336 return EFI_VOLUME_CORRUPTED;
337 }
338
339 Runlist->NextDataRun = (UINT8 *)NonRes + NonRes->DataRunsOffset;
340 Runlist->NextVcn = NonRes->StartingVCN;
341 Runlist->CurrentLcn = 0;
342
343 Runlist->TargetVcn = NonRes->StartingVCN + DivU64x64Remainder (Offset, ClusterSize, NULL);
344 if (Runlist->TargetVcn < NonRes->StartingVCN) {
345 DEBUG ((DEBUG_INFO, "NTFS: Overflow: StartingVCN is too large.\n"));
346 FreePool (Runlist);
347 return EFI_VOLUME_CORRUPTED;
348 }
349
350 if ((Offset + Length) > NonRes->RealSize) {
351 DEBUG ((DEBUG_INFO, "NTFS: Read out of range\n"));
352 FreePool (Runlist);
353 return EFI_VOLUME_CORRUPTED;
354 }
355
356 if ( ((NonRes->Flags & FLAG_COMPRESSED) != 0)
357 && ((Attr->Flags & NTFS_AF_GPOS) == 0)
358 && (NonRes->Type == AT_DATA))
359 {
360 if (NonRes->CompressionUnitSize != 4U) {
361 DEBUG ((DEBUG_INFO, "NTFS: Invalid copmression unit size.\n"));
362 FreePool (Runlist);
363 return EFI_VOLUME_CORRUPTED;
364 }
365
366 mUnitSize = LShiftU64 (1ULL, NonRes->CompressionUnitSize);
367
368 Status = Decompress (Runlist, Offset, Length, Dest);
369
370 FreePool (Runlist);
371 return Status;
372 }
373
374 while (Runlist->NextVcn <= Runlist->TargetVcn) {
375 Status = ReadRunListElement (Runlist);
376 if (EFI_ERROR (Status)) {
377 FreePool (Runlist);
378 return EFI_VOLUME_CORRUPTED;
379 }
380 }
381
382 if (Attr->Flags & NTFS_AF_GPOS) {
383 OffsetInsideCluster = Offset & (ClusterSize - 1U);
384
385 Sector0 = DivU64x64Remainder (
386 (Runlist->TargetVcn - Runlist->CurrentVcn + Runlist->CurrentLcn) * ClusterSize + OffsetInsideCluster,
387 SectorSize,
388 NULL
389 );
390
391 Sector1 = Sector0 + 1U;
392 if (Sector1 == DivU64x64Remainder (
393 (Runlist->NextVcn - Runlist->CurrentVcn + Runlist->CurrentLcn) * ClusterSize,
394 SectorSize,
395 NULL
396 ))
397 {
398 Status = ReadRunListElement (Runlist);
399 if (EFI_ERROR (Status)) {
400 FreePool (Runlist);
401 return EFI_VOLUME_CORRUPTED;
402 }
403
404 Sector1 = DivU64x64Remainder (
405 Runlist->CurrentLcn * ClusterSize,
406 SectorSize,
407 NULL
408 );
409 }
410
411 WriteUnaligned32 ((UINT32 *)Dest, (UINT32)Sector0);
412 WriteUnaligned32 ((UINT32 *)(Dest + 4U), (UINT32)Sector1);
413
414 FreePool (Runlist);
415 return EFI_SUCCESS;
416 }
417
418 Status = ReadClusters (
419 Runlist,
420 Offset,
421 Length,
422 Dest
423 );
424
425 FreePool (Runlist);
426 return Status;
427}
428
429STATIC
430UINT64
432 IN CONST UINT8 *Run,
433 IN UINT8 FieldSize,
434 IN BOOLEAN Signed
435 )
436{
437 UINT64 Value;
438
439 ASSERT (Run != NULL);
440
441 Value = 0;
442 //
443 // Offset to the starting LCN of the previous element is a signed value.
444 // So we must check the most significant bit.
445 //
446 if (Signed && (FieldSize != 0) && ((Run[FieldSize - 1U] & 0x80U) != 0)) {
447 Value = (UINT64)(-1);
448 }
449
450 CopyMem (&Value, Run, FieldSize);
451
452 return Value;
453}
454
466EFI_STATUS
467EFIAPI
469 IN OUT RUNLIST *Runlist
470 )
471{
472 UINT8 LengthSize;
473 UINT8 OffsetSize;
474 UINT64 OffsetLcn;
475 UINT8 *Run;
476 ATTR_HEADER_NONRES *Attr;
477 UINT64 BufferSize;
478 UINTN FileRecordSize;
479
480 ASSERT (Runlist != NULL);
481
482 Run = Runlist->NextDataRun;
483 FileRecordSize = Runlist->Attr->BaseMftRecord->File->FileSystem->FileRecordSize;
484 BufferSize = FileRecordSize - (Run - Runlist->Attr->BaseMftRecord->FileRecord);
485
486retry:
487 if (BufferSize == 0) {
488 DEBUG ((DEBUG_INFO, "NTFS: (ReadRunListElement #1) Runlist is corrupted.\n"));
489 return EFI_VOLUME_CORRUPTED;
490 }
491
492 LengthSize = *Run & 0xFU;
493 OffsetSize = (*Run >> 4U) & 0xFU;
494 ++Run;
495 --BufferSize;
496
497 if ( (LengthSize > 8U)
498 || (OffsetSize > 8U)
499 || ((LengthSize == 0) && (OffsetSize != 0)))
500 {
501 DEBUG ((DEBUG_INFO, "NTFS: (ReadRunListElement #2) Runlist is corrupted.\n"));
502 return EFI_VOLUME_CORRUPTED;
503 }
504
505 //
506 // End of Runlist: LengthSize == 0, OffsetSize == 0
507 //
508 if ((LengthSize == 0) && (OffsetSize == 0)) {
509 if ( (Runlist->Attr != NULL)
510 && ((Runlist->Attr->Flags & NTFS_AF_ALST) != 0))
511 {
512 Attr = (ATTR_HEADER_NONRES *)Runlist->Attr->Current;
513 Attr = (ATTR_HEADER_NONRES *)FindAttr (Runlist->Attr, Attr->Type);
514 if (Attr != NULL) {
515 if (Attr->NonResFlag == 0) {
516 DEBUG ((DEBUG_INFO, "NTFS: $DATA should be non-resident\n"));
517 return EFI_VOLUME_CORRUPTED;
518 }
519
520 Run = (UINT8 *)Attr + Attr->DataRunsOffset;
521 Runlist->CurrentLcn = 0;
522 BufferSize = FileRecordSize - Attr->DataRunsOffset;
523 goto retry;
524 }
525 }
526
527 DEBUG ((DEBUG_INFO, "NTFS: Run list overflown\n"));
528 return EFI_VOLUME_CORRUPTED;
529 }
530
531 Runlist->CurrentVcn = Runlist->NextVcn;
532
533 if (BufferSize < LengthSize) {
534 DEBUG ((DEBUG_INFO, "NTFS: (ReadRunListElement #3) Runlist is corrupted.\n"));
535 return EFI_VOLUME_CORRUPTED;
536 }
537
538 Runlist->NextVcn += ReadField (Run, LengthSize, FALSE);
539 if (Runlist->NextVcn <= Runlist->CurrentVcn) {
540 DEBUG ((DEBUG_INFO, "NTFS: (ReadRunListElement #3.1) Runlist is corrupted.\n"));
541 return EFI_VOLUME_CORRUPTED;
542 }
543
544 Run += LengthSize;
545 BufferSize -= LengthSize;
546
547 if (BufferSize < OffsetSize) {
548 DEBUG ((DEBUG_INFO, "NTFS: (ReadRunListElement #4) Runlist is corrupted.\n"));
549 return EFI_VOLUME_CORRUPTED;
550 }
551
552 OffsetLcn = ReadField (Run, OffsetSize, TRUE);
553 Runlist->CurrentLcn += OffsetLcn;
554
555 Run += OffsetSize;
556 BufferSize -= OffsetSize;
557 Runlist->NextDataRun = Run;
558
559 Runlist->IsSparse = (OffsetLcn == 0);
560
561 return EFI_SUCCESS;
562}
563
564CHAR16 *
566 IN NTFS_FILE *File
567 )
568{
569 EFI_STATUS Status;
570 SYMLINK Symlink;
571 CHAR16 *Substitute;
572 CHAR16 *Letter;
573 UINT64 Offset;
574
575 ASSERT (File != NULL);
576
577 File->FileRecord = AllocateZeroPool (File->File->FileSystem->FileRecordSize);
578 if (File->FileRecord == NULL) {
579 return NULL;
580 }
581
582 Status = ReadMftRecord (File->File, File->FileRecord, File->Inode);
583 if (EFI_ERROR (Status)) {
584 return NULL;
585 }
586
587 if (LocateAttr (&File->Attr, File, AT_SYMLINK) == NULL) {
588 DEBUG ((DEBUG_INFO, "NTFS: no $SYMLINK in MFT 0x%Lx\n", File->Inode));
589 return NULL;
590 }
591
592 Status = ReadAttr (&File->Attr, (UINT8 *)&Symlink, 0, sizeof (Symlink));
593 if (EFI_ERROR (Status)) {
594 FreeAttr (&File->Attr);
595 return NULL;
596 }
597
598 switch (Symlink.Type) {
600 Offset = sizeof (Symlink) + 4U + (UINT64)Symlink.SubstituteOffset;
601 break;
603 Offset = sizeof (Symlink) + (UINT64)Symlink.SubstituteOffset;
604 break;
605 default:
606 DEBUG ((DEBUG_INFO, "NTFS: Symlink type invalid (%x)\n", Symlink.Type));
607 return NULL;
608 }
609
610 Substitute = AllocateZeroPool (Symlink.SubstituteLength + sizeof (CHAR16));
611 if (Substitute == NULL) {
612 return NULL;
613 }
614
615 Status = ReadAttr (&File->Attr, (UINT8 *)Substitute, Offset, Symlink.SubstituteLength);
616 if (EFI_ERROR (Status)) {
617 FreeAttr (&File->Attr);
618 FreePool (Substitute);
619 return NULL;
620 }
621
622 for (Letter = Substitute; *Letter != L'\0'; ++Letter) {
623 if (*Letter == L'\\') {
624 *Letter = L'/';
625 }
626 }
627
628 return Substitute;
629}
UINT64 Length
EFI_STATUS Decompress(IN RUNLIST *Runlist, IN UINT64 Offset, IN UINTN Length, OUT UINT8 *Dest)
STATIC UINT64 GetLcn(IN OUT RUNLIST *Runlist, IN UINT64 Vcn)
Definition Data.c:16
EFI_STATUS EFIAPI ReadAttr(IN NTFS_ATTR *Attr, OUT UINT8 *Dest, IN UINT64 Offset, IN UINTN Length)
Definition Data.c:184
EFI_STATUS EFIAPI ReadData(IN NTFS_ATTR *Attr, IN UINT8 *AttrStart, OUT UINT8 *Dest, IN UINT64 Offset, IN UINTN Length)
Definition Data.c:258
EFI_STATUS EFIAPI DiskRead(IN EFI_FS *FileSystem, IN UINT64 Offset, IN UINTN Size, IN OUT VOID *Buffer)
Definition Data.c:116
EFI_STATUS EFIAPI ReadMftRecord(IN EFI_NTFS_FILE *File, OUT UINT8 *Buffer, IN UINT64 RecordNumber)
Definition Data.c:148
STATIC UINT64 ReadField(IN CONST UINT8 *Run, IN UINT8 FieldSize, IN BOOLEAN Signed)
Definition Data.c:431
CHAR16 * ReadSymlink(IN NTFS_FILE *File)
Definition Data.c:565
UINT64 mUnitSize
Definition Data.c:12
STATIC EFI_STATUS ReadClusters(IN RUNLIST *Runlist, IN UINT64 Offset, IN UINTN Length, OUT UINT8 *Dest)
Definition Data.c:42
EFI_STATUS EFIAPI ReadRunListElement(IN OUT RUNLIST *Runlist)
Definition Data.c:468
UINT8 * LocateAttr(IN NTFS_ATTR *Attr, IN NTFS_FILE *Mft, IN UINT32 Type)
Definition Disc.c:347
VOID FreeAttr(IN NTFS_ATTR *Attr)
Definition Disc.c:792
UINT8 * FindAttr(IN NTFS_ATTR *Attr, IN UINT32 Type)
Definition Disc.c:400
EFI_STATUS EFIAPI Fixup(IN UINT8 *Buffer, IN UINT64 Length, IN UINT32 Magic, IN UINTN SectorSize)
Definition Disc.c:242
#define S_SYMLINK
Definition Driver.h:22
@ NTFS_AF_ALST
Definition Driver.h:170
@ NTFS_AF_GPOS
Definition Driver.h:172
@ AT_SYMLINK
Definition Driver.h:125
@ AT_DATA
Definition Driver.h:121
#define S_FILENAME
Definition Driver.h:21
@ IS_MICROSOFT
Definition Driver.h:216
@ IS_ALIAS
Definition Driver.h:214
#define COMPRESSION_BLOCK
Definition Driver.h:14
@ FLAG_COMPRESSED
Definition Driver.h:179
DMG_SIZE_DEVICE_PATH Size
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI SetMem(OUT VOID *Buffer, IN UINTN Length, IN UINT8 Value)
UINT32 EFIAPI WriteUnaligned32(OUT UINT32 *Buffer, IN UINT32 Value)
UINT64 EFIAPI DivU64x64Remainder(IN UINT64 Dividend, IN UINT64 Divisor, OUT UINT64 *Remainder OPTIONAL)
Definition UserMath.c:59
UINT64 EFIAPI LShiftU64(IN UINT64 Operand, IN UINTN Count)
Definition UserMath.c:76
#define ASSERT(x)
Definition coder.h:55
UINT16 DataRunsOffset
Definition Driver.h:332
UINT64 AllocatedSize
Definition Driver.h:335
UINT16 CompressionUnitSize
Definition Driver.h:333
UINT64 StartingVCN
Definition Driver.h:330
UINT16 InfoOffset
Definition Driver.h:293
UINT32 InfoLength
Definition Driver.h:292
UINT32 Type
Definition Driver.h:285
UINT8 NonResFlag
Definition Driver.h:287
UINT16 RecordLength
Definition Driver.h:358
UINT64 StartingVCN
Definition Driver.h:361
EFI_FS * FileSystem
Definition Driver.h:660
UINT64 CurrentVcn
Definition Driver.h:674
UINT64 CurrentLcn
Definition Driver.h:675
COMPRESSED Unit
Definition Driver.h:679
NTFS_ATTR * Attr
Definition Driver.h:678
UINT64 TargetVcn
Definition Driver.h:673
UINT64 NextVcn
Definition Driver.h:676
UINT8 * NextDataRun
Definition Driver.h:677
UINT16 SubstituteOffset
Definition Driver.h:593
UINT16 SubstituteLength
Definition Driver.h:594
UINT32 Type
Definition Driver.h:590