39#define NTFS_DUMP_DATA_RUNS 0
82 ULONG AttributeLength;
94 DPRINT1(
"FIXME: Can only add $BITMAP attribute to the end of a file record.\n");
98 NameOffset = ResidentHeaderLength;
108 BytesAvailable =
Vcb->NtfsInfo.BytesPerFileRecord - FileRecord->
BytesInUse;
109 if (BytesAvailable < AttributeLength)
111 DPRINT1(
"FIXME: Not enough room in file record for index allocation attribute!\n");
119 AttributeAddress->
Length = AttributeLength;
125 AttributeAddress->
Resident.ValueOffset = ValueOffset;
172 DPRINT1(
"FIXME: Can only add $DATA attribute to the end of a file record.\n");
177 AttributeAddress->
Length = ResidentHeaderLength;
179 AttributeAddress->
Resident.ValueLength = 0;
180 AttributeAddress->
Resident.ValueOffset = ResidentHeaderLength;
183 AttributeAddress->
NameOffset = ResidentHeaderLength;
252 DPRINT1(
"FIXME: Can only add $FILE_NAME attribute to the end of a file record.\n");
279 while (Remaining.
Length != 0)
281 DPRINT(
"Current: %wZ\n", &Current);
293 DPRINT1(
"Path component '%wZ' of '%wZ' not found (Status %lx)\n",
302 FilenameNoPath = Current;
304 DPRINT(
"MFT Index of parent: %I64u\n", CurrentMFTIndex);
308 *ParentMftIndex = CurrentMFTIndex;
332 AttributeAddress->
Length = ResidentHeaderLength +
337 AttributeAddress->
Resident.ValueOffset = ResidentHeaderLength;
390 ULONG BytesAvailable;
394 DPRINT1(
"FIXME: Can only add $INDEX_ALLOCATION attribute to the end of a file record.\n");
402 DataRunOffset = (
sizeof(
WCHAR) * NameLength) + NameOffset;
407 RecordLength = DataRunOffset + 1;
413 FileRecordEnd = AttributeAddress->
Length;
416 BytesAvailable =
Vcb->NtfsInfo.BytesPerFileRecord - FileRecord->
BytesInUse;
417 if (BytesAvailable < RecordLength)
419 DPRINT1(
"FIXME: Not enough room in file record for index allocation attribute!\n");
427 AttributeAddress->
Length = RecordLength;
433 AttributeAddress->
NonResident.MappingPairsOffset = DataRunOffset;
495 ULONG AttributeLength;
502 ULONG BytesAvailable;
506 DPRINT1(
"FIXME: Can only add $DATA attribute to the end of a file record.\n");
510 NameOffset = ResidentHeaderLength;
516 AttributeLength = ValueOffset + RootLength;
520 BytesAvailable =
Vcb->NtfsInfo.BytesPerFileRecord - FileRecord->
BytesInUse;
521 if (BytesAvailable < AttributeLength)
523 DPRINT1(
"FIXME: Not enough room in file record for index allocation attribute!\n");
531 AttributeAddress->
Length = AttributeLength;
536 AttributeAddress->
Resident.ValueLength = RootLength;
537 AttributeAddress->
Resident.ValueOffset = ValueOffset;
599 int DataRunMaxLength;
601 ULONG NextAttributeOffset = AttrOffset + AttrContext->pRecord->Length;
608 if (!AttrContext->pRecord->IsNonResident)
611 if (AttrContext->pRecord->NonResident.AllocatedSize != 0)
612 NextVBN = AttrContext->pRecord->NonResident.HighestVCN + 1;
615 HighestVcn = NextVBN + RunLength - 1;
630 DPRINT1(
"Failed to add LargeMcb Entry!\n");
638 DPRINT1(
"ERROR: Couldn't allocate memory for data runs!\n");
647 DPRINT1(
"Data runs too large for one file record - $ATTRIBUTE_LIST needed (not implemented)\n");
653 DPRINT1(
"ERROR: Failed to convert data runs! (Status %lx)\n",
Status);
659 DataRunMaxLength = AttrContext->pRecord->Length - AttrContext->pRecord->NonResident.MappingPairsOffset;
662 if (DataRunMaxLength < RunBufferSize)
668 DataRunMaxLength +=
Vcb->NtfsInfo.BytesPerFileRecord - FileRecord->
BytesInUse;
671 if (DataRunMaxLength < RunBufferSize)
673 DPRINT1(
"FIXME: Need to create attribute list! Max Data Run Length available: %d, RunBufferSize: %d\n", DataRunMaxLength, RunBufferSize);
684 ULONG_PTR MoveTo = (
ULONG_PTR)DestinationAttribute + AttrContext->pRecord->NonResident.MappingPairsOffset + RunBufferSize;
687 DPRINT(
"Moving attribute(s) after this one starting with type 0x%lx\n", NextAttribute->
Type);
690 FinalAttribute =
MoveAttributes(
Vcb, NextAttribute, NextAttributeOffset, MoveTo);
697 NextAttributeOffset = AttrOffset + AttrContext->pRecord->NonResident.MappingPairsOffset + RunBufferSize;
701 DestinationAttribute->
Length = NextAttributeOffset - AttrOffset;
705 RtlCopyMemory(NewRecord, AttrContext->pRecord, AttrContext->pRecord->Length);
712 AttrContext->pRecord = NewRecord;
725 AttrContext->pRecord->NonResident.HighestVCN = HighestVcn;
730 AttrContext->pRecord->NonResident.CompressedSize += (
ULONGLONG)RunLength *
Vcb->NtfsInfo.BytesPerCluster;
731 DestinationAttribute->
NonResident.CompressedSize = AttrContext->pRecord->NonResident.CompressedSize;
749#if NTFS_DUMP_DATA_RUNS
793 DPRINT1(
"FIXME: Can only add $STANDARD_INFORMATION attribute to the end of a file record.\n");
801 AttributeAddress->
Resident.ValueOffset = ResidentHeaderLength;
858 while (*DataRun != 0)
860 DataRun =
DecodeRun(DataRun, &DataRunOffset, &DataRunLength);
862 if (DataRunOffset != -1)
865 DataRunStartLCN = LastLCN + DataRunOffset;
866 LastLCN = DataRunStartLCN;
883 *pNextVBN += DataRunLength;
924 ULONG RunBufferOffset = 0;
933 DPRINT(
"\t[Vbn, Lbn, Count]\n");
938 UCHAR DataRunOffsetSize = 0;
939 UCHAR DataRunLengthSize = 0;
940 UCHAR ControlByte = 0;
944 if (NextVcn >= VcnCount)
950 Count = VcnCount - NextVcn;
958 DPRINT(
"Determining how many bytes needed to represent %I64x\n",
Count);
960 DPRINT(
"%d bytes needed.\n", DataRunLengthSize);
965 DataRunOffset =
Lbn - LastLCN;
969 DPRINT(
"Determining how many bytes needed to represent %I64x\n", DataRunOffset);
971 DPRINT(
"%d bytes needed.\n", DataRunOffsetSize);
975 if (RunBufferOffset + 2 + DataRunLengthSize + DataRunOffsetSize > MaxBufferSize)
978 DPRINT1(
"FIXME: Ran out of room in buffer for data runs!\n");
983 ControlByte = (DataRunOffsetSize << 4) + DataRunLengthSize;
984 RunBuffer[RunBufferOffset++] = ControlByte;
988 RunBufferOffset += DataRunLengthSize;
991 RtlCopyMemory(RunBuffer + RunBufferOffset, &DataRunOffset, DataRunOffsetSize);
992 RunBufferOffset += DataRunOffsetSize;
1001 RunBuffer[RunBufferOffset++] = 0;
1003 *UsedBufferSize = RunBufferOffset;
1004 DPRINT(
"New Size of DataRuns: %ld\n", *UsedBufferSize);
1014 UCHAR DataRunOffsetSize;
1015 UCHAR DataRunLengthSize;
1018 DataRunOffsetSize = (*DataRun >> 4) & 0xF;
1019 DataRunLengthSize = *DataRun & 0xF;
1023 for (
i = 0;
i < DataRunLengthSize;
i++)
1025 *DataRunLength += ((
ULONG64)*DataRun) << (
i * 8);
1030 if (DataRunOffsetSize == 0)
1032 *DataRunOffset = -1;
1036 for (
i = 0;
i < DataRunOffsetSize - 1;
i++)
1038 *DataRunOffset += ((
ULONG64)*DataRun) << (
i * 8);
1042 *DataRunOffset = ((
LONG64)(
CHAR)(*(DataRun++)) << (
i * 8)) + *DataRunOffset;
1045 DPRINT(
"DataRunOffsetSize: %x\n", DataRunOffsetSize);
1046 DPRINT(
"DataRunLengthSize: %x\n", DataRunLengthSize);
1047 DPRINT(
"DataRunOffset: %x\n", *DataRunOffset);
1048 DPRINT(
"DataRunLength: %x\n", *DataRunLength);
1105 ULONG ClustersToFree)
1108 ULONG ClustersLeftToFree = ClustersToFree;
1111 ULONG NextAttributeOffset = AttrOffset + AttrContext->pRecord->Length;
1115 ULONG RunBufferSize = 0;
1118 ULONG HighestFreed = 0;
1121 if (!AttrContext->pRecord->IsNonResident)
1131 while (ClustersLeftToFree > 0)
1133 ULONGLONG LastVcn = AttrContext->pRecord->NonResident.HighestVCN;
1140 DPRINT1(
"DRIVER ERROR: FreeClusters called to free %lu clusters, which is %lu more clusters than are assigned to attribute!",
1142 ClustersLeftToFree);
1159 AttrContext->pRecord->NonResident.HighestVCN = LastVcn - 1;
1160 ClustersLeftToFree--;
1164 AttrContext->pRecord->NonResident.CompressedSize -= (
ULONGLONG)Freed *
Vcb->NtfsInfo.BytesPerCluster;
1170 Vcb->FreeClusterCount += Freed;
1190 DPRINT1(
"ERROR: Couldn't allocate memory for data runs!\n");
1197 AttrContext->pRecord->NonResident.HighestVCN + 1,
1199 Vcb->NtfsInfo.BytesPerFileRecord,
1203 DestinationAttribute->
NonResident.HighestVCN = AttrContext->pRecord->NonResident.HighestVCN;
1207 DestinationAttribute->
NonResident.CompressedSize = AttrContext->pRecord->NonResident.CompressedSize;
1218 DestinationAttribute->
Length =
ALIGN_UP_BY(AttrContext->pRecord->NonResident.MappingPairsOffset + RunBufferSize,
1221 ASSERT(DestinationAttribute->
Length <= AttrContext->pRecord->Length);
1223 AttrContext->pRecord->Length = DestinationAttribute->
Length;
1235#if NTFS_DUMP_DATA_RUNS
1252 Attribute =
Context->CurrAttr;
1269 if (ListSize > 0xFFFFFFFF)
1312 if (
Context->NonResidentCur->Length == 0)
1314 DPRINT1(
"Broken length list entry length !");
1326 if (NextItem < Context->NonResidentStart ||
NextItem >
Context->NonResidentEnd)
1376 if (
Context->CurrAttr->Length == 0)
1385 if (NextAttribute >
Context->LastAttr || NextAttribute < Context->FirstAttr)
1393 Context->CurrAttr = NextAttribute;
1421 DPRINT(
"FindFistAttribute(%p, %p, %p, %p, %u, %p)\n",
Context,
Vcb, FileRecord, OnlyResident, Attribute);
1424 Context->OnlyResident = OnlyResident;
1446 if (*Attribute ==
NULL)
1453 *Attribute =
Context->CurrAttr;
1469 if (*Attribute ==
NULL)
1486 if (*Attribute ==
NULL)
1528 DbgPrint(
" $STANDARD_INFORMATION ");
1563 DbgPrint(
" NTFS Version %u.%u Flags 0x%04hx ",
1566 VolInfoAttr->
Flags);
1575 ULONG CurrentOffset;
1595 DbgPrint(
" Offset to first index: 0x%lx\n Total size of index entries: 0x%lx\n Allocated size of node: 0x%lx\n",
1602 while (CurrentOffset < IndexRootAttr->
Header.TotalSizeOfEntries)
1605 DbgPrint(
" Index Node Entry %lu", CurrentNode++);
1615 DbgPrint(
" Index Entry Length: 0x%x\n", currentIndexExtry->
Length);
1635 DbgPrint(
" VCN of sub-node: 0x%llx\n", *SubNodeVCN);
1638 CurrentOffset += currentIndexExtry->
Length;
1655 switch (Attribute->
Type)
1670 DbgPrint(
" $SECURITY_DESCRIPTOR ");
1715 DbgPrint(
" $LOGGED_UTILITY_STREAM ");
1740 FindRun(Attribute,0,&lcn, &runcount);
1742 DbgPrint(
" AllocatedSize %I64u DataSize %I64u InitilizedSize %I64u\n",
1744 DbgPrint(
" logical clusters: %I64u - %I64u\n",
1745 lcn, lcn + runcount - 1);
1755 UCHAR DataRunOffsetSize;
1756 UCHAR DataRunLengthSize;
1764 DataRunOffsetSize = (*DataRun >> 4) & 0xF;
1765 DataRunLengthSize = *DataRun & 0xF;
1768 for (
i = 0;
i < DataRunLengthSize;
i++)
1774 for (
i = 0;
i < DataRunOffsetSize;
i++)
1788 PUCHAR DataRun = StartOfRun;
1792 if (CurrentLCN == 0)
1794 DPRINT(
"Dumping data runs.\n\tData:\n\t\t");
1796 DbgPrint(
"\n\tRuns:\n\t\tOff\t\tLCN\t\tLength\n");
1799 DataRun =
DecodeRun(DataRun, &DataRunOffset, &DataRunLength);
1801 if (DataRunOffset != -1)
1802 CurrentLCN += DataRunOffset;
1804 DbgPrint(
"\t\t%I64d\t", DataRunOffset);
1805 if (DataRunOffset < 99999)
1808 if (CurrentLCN < 99999)
1810 DbgPrint(
"%I64u\n", DataRunLength);
1881 if (NumberToPack >= 0x0100000000000000)
1883 if (NumberToPack >= 0x0001000000000000)
1885 if (NumberToPack >= 0x0000010000000000)
1887 if (NumberToPack >= 0x0000000100000000)
1889 if (NumberToPack >= 0x0000000001000000)
1891 if (NumberToPack >= 0x0000000000010000)
1893 if (NumberToPack >= 0x0000000000000100)
1898 if (NumberToPack > 0)
1901 if (NumberToPack >= 0x0080000000000000)
1903 if (NumberToPack >= 0x0000800000000000)
1905 if (NumberToPack >= 0x0000008000000000)
1907 if (NumberToPack >= 0x0000000080000000)
1909 if (NumberToPack >= 0x0000000000800000)
1911 if (NumberToPack >= 0x0000000000008000)
1913 if (NumberToPack >= 0x0000000000000080)
1919 if (NumberToPack <= 0xff80000000000000)
1921 if (NumberToPack <= 0xffff800000000000)
1923 if (NumberToPack <= 0xffffff8000000000)
1925 if (NumberToPack <= 0xffffffff80000000)
1927 if (NumberToPack <= 0xffffffffff800000)
1929 if (NumberToPack <= 0xffffffffffff8000)
1931 if (NumberToPack <= 0xffffffffffffff80)
1952 DataRun =
DecodeRun(DataRun, &DataRunOffset, &DataRunLength);
1954 if (DataRunOffset != -1)
1957 DataRunStartLCN = LastLCN + DataRunOffset;
1958 LastLCN = DataRunStartLCN;
1959 *LastCluster = LastLCN + DataRunLength - 1;
#define ALIGN_UP_BY(size, align)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 NameType
struct NTFS_ATTR_RECORD * PNTFS_ATTR_RECORD
#define NTFS_FILE_NAME_DOS
#define NTFS_INDEX_ENTRY_NODE
#define NTFS_FILE_NAME_WIN32
#define NTFS_INDEX_ENTRY_END
#define NTFS_FILE_NAME_POSIX
#define NTFS_FILE_NAME_WIN32_AND_DOS
static BOOLEAN NtfsFindMftRecord(_In_ PNTFS_VOLUME_INFO Volume, _In_ ULONGLONG MFTIndex, _In_ PCSTR FileName, _Out_ PULONGLONG OutMFTIndex, _Out_ PULONG FileAttributes)
#define STATUS_NOT_IMPLEMENTED
#define NT_SUCCESS(StatCode)
static LPDATABLOCK_HEADER NextItem(LPDBLIST lpList)
NTSTATUS AddRun(PNTFS_VCB Vcb, PNTFS_ATTR_CONTEXT AttrContext, ULONG AttrOffset, PFILE_RECORD_HEADER FileRecord, ULONGLONG NextAssignedCluster, ULONG RunLength)
PSTANDARD_INFORMATION GetStandardInformationFromRecord(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord)
static NTSTATUS InternalReadNonResidentAttributes(PFIND_ATTR_CONTXT Context)
static PNTFS_ATTRIBUTE_LIST_ITEM InternalGetNextAttributeListItem(PFIND_ATTR_CONTXT Context)
NTSTATUS ConvertLargeMCBToDataRuns(PLARGE_MCB DataRunsMCB, ULONGLONG VcnCount, PUCHAR RunBuffer, ULONG MaxBufferSize, PULONG UsedBufferSize)
PUCHAR DecodeRun(PUCHAR DataRun, LONGLONG *DataRunOffset, ULONGLONG *DataRunLength)
NTSTATUS GetLastClusterInDataRun(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_RECORD Attribute, PULONGLONG LastCluster)
NTSTATUS AddIndexRoot(PNTFS_VCB Vcb, PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress, PINDEX_ROOT_ATTRIBUTE NewIndexRoot, ULONG RootLength, PCWSTR Name, USHORT NameLength)
NTSTATUS ConvertDataRunsToLargeMCB(PUCHAR DataRun, PLARGE_MCB DataRunsMCB, PULONGLONG pNextVBN)
VOID NtfsDumpDataRuns(PVOID StartOfRun, ULONGLONG CurrentLCN)
ULONG GetFileNameAttributeLength(PFILENAME_ATTRIBUTE FileNameAttribute)
NTSTATUS FindFirstAttribute(PFIND_ATTR_CONTXT Context, PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord, BOOLEAN OnlyResident, PNTFS_ATTR_RECORD *Attribute)
static VOID NtfsDumpVolumeInformationAttribute(PNTFS_ATTR_RECORD Attribute)
NTSTATUS FindFirstAttributeListItem(PFIND_ATTR_CONTXT Context, PNTFS_ATTRIBUTE_LIST_ITEM *Item)
NTSTATUS FreeClusters(PNTFS_VCB Vcb, PNTFS_ATTR_CONTEXT AttrContext, ULONG AttrOffset, PFILE_RECORD_HEADER FileRecord, ULONG ClustersToFree)
NTSTATUS AddFileName(PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress, PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, BOOLEAN CaseSensitive, PULONGLONG ParentMftIndex)
VOID FindCloseAttribute(PFIND_ATTR_CONTXT Context)
static VOID NtfsDumpFileNameAttribute(PNTFS_ATTR_RECORD Attribute)
NTSTATUS AddBitmap(PNTFS_VCB Vcb, PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress, PCWSTR Name, USHORT NameLength)
PFILENAME_ATTRIBUTE GetFileNameFromRecord(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord, UCHAR NameType)
NTSTATUS AddIndexAllocation(PNTFS_VCB Vcb, PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress, PCWSTR Name, USHORT NameLength)
VOID NtfsDumpDataRunData(PUCHAR DataRun)
VOID NtfsDumpFileAttributes(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord)
NTSTATUS AddData(PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress)
static VOID NtfsDumpAttribute(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_RECORD Attribute)
static VOID NtfsDumpStandardInformationAttribute(PNTFS_ATTR_RECORD Attribute)
NTSTATUS FindNextAttribute(PFIND_ATTR_CONTXT Context, PNTFS_ATTR_RECORD *Attribute)
NTSTATUS FindNextAttributeListItem(PFIND_ATTR_CONTXT Context, PNTFS_ATTRIBUTE_LIST_ITEM *Item)
UCHAR GetPackedByteCount(LONGLONG NumberToPack, BOOLEAN IsSigned)
static PNTFS_ATTR_RECORD InternalGetNextAttribute(PFIND_ATTR_CONTXT Context)
PFILENAME_ATTRIBUTE GetBestFileNameFromRecord(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord)
NTSTATUS AddStandardInformation(PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress)
BOOLEAN FindRun(PNTFS_ATTR_RECORD NresAttr, ULONGLONG vcn, PULONGLONG lcn, PULONGLONG count)
static VOID NtfsDumpVolumeNameAttribute(PNTFS_ATTR_RECORD Attribute)
static VOID NtfsDumpIndexRootAttribute(PNTFS_ATTR_RECORD Attribute)
struct FILENAME_ATTRIBUTE * PFILENAME_ATTRIBUTE
#define VALUE_OFFSET_ALIGNMENT
#define DATA_RUN_ALIGNMENT
struct INDEX_ENTRY_ATTRIBUTE * PINDEX_ENTRY_ATTRIBUTE
NTSTATUS NtfsWriteVolumeBitmap(_In_ PDEVICE_EXTENSION DeviceExt, _In_ ULONG FirstCluster, _In_ ULONG ClusterCount)
#define COLLATION_FILE_NAME
struct STANDARD_INFORMATION * PSTANDARD_INFORMATION
#define NTFS_FILE_TYPE_DIRECTORY
struct VOLINFO_ATTRIBUTE * PVOLINFO_ATTRIBUTE
struct INDEX_ROOT_ATTRIBUTE * PINDEX_ROOT_ATTRIBUTE
struct NTFS_ATTRIBUTE_LIST_ITEM * PNTFS_ATTRIBUTE_LIST_ITEM
@ AttributeStandardInformation
@ AttributeVolumeInformation
@ AttributeSecurityDescriptor
@ AttributeIndexAllocation
@ AttributeLoggedUtilityStream
#define ATTR_RECORD_ALIGNMENT
#define NTFS_FILE_TYPE_ARCHIVE
#define NTFS_ATTR_COMPRESSION_MASK
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeQuerySystemTime(t)
#define ExAcquireResourceExclusiveLite(res, wait)
#define BooleanFlagOn(F, SF)
struct _FileName FileName
_Must_inspect_result_ _Inout_opt_ PUNICODE_STRING VolumeName
_Must_inspect_result_ _In_ LONGLONG _In_ LONGLONG Lbn
_Out_ PLONGLONG _Out_ PLONGLONG LargeLbn
GLuint GLuint GLsizei count
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define EXCEPTION_EXECUTE_HANDLER
#define KeLeaveCriticalRegion()
#define KeEnterCriticalRegion()
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
VOID NTAPI FsRtlTruncateLargeMcb(IN PLARGE_MCB Mcb, IN LONGLONG Vbn)
BOOLEAN NTAPI FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, IN LONGLONG Lbn, IN LONGLONG SectorCount)
VOID NTAPI FsRtlUninitializeLargeMcb(IN PLARGE_MCB Mcb)
VOID NTAPI FsRtlInitializeLargeMcb(IN PLARGE_MCB Mcb, IN POOL_TYPE PoolType)
BOOLEAN NTAPI FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, OUT PLONGLONG Lbn OPTIONAL, OUT PLONGLONG SectorCountFromLbn OPTIONAL, OUT PLONGLONG StartingLbn OPTIONAL, OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, OUT PULONG Index OPTIONAL)
BOOLEAN NTAPI FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb, IN ULONG RunIndex, OUT PLONGLONG Vbn, OUT PLONGLONG Lbn, OUT PLONGLONG SectorCount)
NTSTATUS UpdateFileRecord(PDEVICE_EXTENSION Vcb, ULONGLONG MftIndex, PFILE_RECORD_HEADER FileRecord)
VOID ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context)
PNTFS_ATTR_CONTEXT PrepareAttributeContext(PNTFS_ATTR_RECORD AttrRecord)
ULONGLONG AttributeDataLength(PNTFS_ATTR_RECORD AttrRecord)
ULONG ReadAttribute(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT Context, ULONGLONG Offset, PCHAR Buffer, ULONG Length)
VOID SetFileRecordEnd(PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttrEnd, ULONG EndMarker)
PNTFS_ATTR_RECORD MoveAttributes(PDEVICE_EXTENSION DeviceExt, PNTFS_ATTR_RECORD FirstAttributeToMove, ULONG FirstAttributeOffset, ULONG_PTR MoveTo)
#define ExFreePoolWithTag(_P, _T)
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
__GNU_EXTENSION typedef __int64 * PLONGLONG
_In_ ULONG _In_ ULONG _In_ ULONG Length
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
VOID NTAPI FsRtlDissectName(IN UNICODE_STRING Name, OUT PUNICODE_STRING FirstPart, OUT PUNICODE_STRING RemainingPart)
BOOLEAN NTAPI RtlIsNameLegalDOS8Dot3(_In_ PUNICODE_STRING Name, _Inout_opt_ POEM_STRING OemName, _Inout_opt_ PBOOLEAN NameContainsSpaces)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
#define STATUS_END_OF_FILE
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
ULONGLONG DirectoryFileReferenceNumber
union INDEX_ENTRY_ATTRIBUTE::@970 Data
struct INDEX_ENTRY_ATTRIBUTE::@970::@971 Directory
FILENAME_ATTRIBUTE FileName
INDEX_HEADER_ATTRIBUTE Header
UCHAR ClustersPerIndexRecord
struct NTFS_ATTR_RECORD::@170::@172 Resident
struct NTFS_ATTR_RECORD::@170::@173 NonResident
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_FILE_CORRUPT_ERROR
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength