51 DPRINT1(
"Index Allocation is empty.\n");
69 DPRINT1(
"ERROR: Fixing fixup failed!\n");
76 CurrentOffset += NodeSize;
119 ULONG IndexBufferSize,
121 ULONG IndexAllocationOffset,
126 ULONGLONG IndexAllocationLength, BitmapLength;
136 DPRINT1(
"AllocateIndexNode(%p, %p, %lu, %p, %lu, %p) called.\n", DeviceExt,
140 IndexAllocationOffset,
156 DPRINT1(
"FIXME: Need to add bitmap attribute!\n");
163 NextNodeNumber = IndexAllocationLength / DeviceExt->NtfsInfo.BytesPerIndexRecord;
170 BytesNeeded = NextNodeNumber / 8;
181 DPRINT1(
"Error: failed to allocate bitmap!");
197 if (BytesNeeded > BitmapLength)
202 if (BitmapCtx->pRecord->IsNonResident)
220 DPRINT1(
"ERROR: Failed to set length of bitmap attribute!\n");
227 DataSize.QuadPart = IndexAllocationLength + IndexBufferSize;
230 IndexAllocationOffset,
235 DPRINT1(
"ERROR: Failed to set length of index allocation!\n");
244 DPRINT1(
"ERROR: Failed to update file record!\n");
262 DPRINT1(
"ERROR: Unable to write to $I30 bitmap attribute!\n");
266 *NewVCN = NextNodeNumber * (IndexBufferSize / DeviceExt->NtfsInfo.BytesPerCluster);
268 DPRINT(
"New VCN: %I64u\n", *NewVCN);
302 DPRINT1(
"Couldn't allocate memory for dummy key index entry!\n");
324 DPRINT1(
"Unable to allocate dummy key!\n");
354 DPRINT1(
"CreateEmptyBTree(%p) called\n", NewTree);
358 DPRINT1(
"Couldn't allocate enough memory for B-Tree!\n");
370 DPRINT1(
"ERROR: Failed to create dummy key!\n");
489 while (Current !=
NULL)
507 ULONG CurrentEntryOffset = 0;
509 ULONG IndexBufferSize =
Vcb->NtfsInfo.BytesPerIndexRecord;
516 if (IndexAllocationAttributeCtx ==
NULL)
518 DPRINT1(
"ERROR: Couldn't find index allocation attribute even though there should be one!\n");
529 DPRINT1(
"ERROR: Couldn't allocate memory for new filename node.\n");
538 DPRINT1(
"ERROR: Failed to allocate memory for key!\n");
549 DPRINT1(
"ERROR: Couldn't allocate memory for node buffer!\n");
562 IndexAllocationAttributeCtx,
575 DPRINT1(
"ERROR: Couldn't apply fixup array to index node buffer!\n");
585 CurrentNodeEntry = FirstNodeEntry;
586 while (CurrentEntryOffset < NodeBuffer->
Header.TotalSizeOfEntries)
592 DPRINT1(
"ERROR: Couldn't allocate memory for next key!\n");
607 DPRINT1(
"ERROR: Couldn't allocate memory for next key!\n");
625 IndexAllocationAttributeCtx,
629 CurrentKey = NextKey;
642 IndexAllocationAttributeCtx,
650 CurrentEntryOffset += CurrentNodeEntry->
Length;
697 DPRINT(
"CreateBTreeFromIndex(%p, %p)\n", IndexRoot, NewTree);
701 DPRINT1(
"Couldn't allocate enough memory for B-Tree!\n");
721 &IndexAllocationContext,
724 IndexAllocationContext =
NULL;
733 DPRINT1(
"Filesystem corruption detected!\n");
745 while (CurrentOffset < IndexRoot->
Header.TotalSizeOfEntries)
751 DPRINT1(
"ERROR: Couldn't allocate memory for next key!\n");
766 DPRINT1(
"ERROR: Couldn't allocate memory for next key!\n");
786 IndexAllocationContext,
790 DPRINT1(
"ERROR: Couldn't create child node!\n");
798 CurrentOffset += CurrentNodeEntry->
Length;
800 CurrentKey = NextKey;
814 IndexAllocationContext,
818 DPRINT1(
"ERROR: Couldn't create child node!\n");
833 if (IndexAllocationContext)
863 for (
i = 0;
i <
Node->KeyCount;
i++)
869 CurrentKey = CurrentKey->
NextKey;
920 DeviceExt->NtfsInfo.BytesPerFileRecord,
923 DPRINT(
"CreateIndexRootFromBTree(%p, %p, 0x%lx, %p, %p)\n", DeviceExt,
Tree, MaxIndexSize, IndexRoot,
Length);
931 DPRINT1(
"Failed to allocate memory for Index Root!\n");
936 RtlZeroMemory(NewIndexRoot, DeviceExt->NtfsInfo.BytesPerFileRecord);
940 NewIndexRoot->
SizeOfEntry = DeviceExt->NtfsInfo.BytesPerIndexRecord;
942 if (NewIndexRoot->
SizeOfEntry < DeviceExt->NtfsInfo.BytesPerCluster)
955 CurrentKey =
Tree->RootNode->FirstKey;
959 for (
i = 0;
i <
Tree->RootNode->KeyCount;
i++)
963 if (IndexSize > MaxIndexSize)
965 DPRINT1(
"TODO: Adding file would require creating an attribute list!\n");
975 DPRINT1(
"Index Node Entry Stream Length: %u\nIndex Node Entry Length: %u\n",
977 CurrentNodeEntry->
Length);
989 CurrentKey = CurrentKey->
NextKey;
994 *IndexRoot = NewIndexRoot;
1030 CurrentKey =
Node->FirstKey;
1033 for (
i = 0;
i <
Node->KeyCount;
i++)
1038 + CurrentNodeEntry->
Length;
1041 DPRINT1(
"TODO: Adding file would require creating a new node!\n");
1050 DPRINT(
"Index Node Entry Stream Length: %u\nIndex Node Entry Length: %u\n",
1052 CurrentNodeEntry->
Length);
1063 CurrentKey = CurrentKey->
NextKey;
1094 DPRINT(
"Collapsing Index Root into sub-node.\n");
1104 DPRINT1(
"ERROR: Couldn't allocate memory for new sub-node.\n");
1118 DPRINT1(
"ERROR: Couldn't allocate memory for new root node.\n");
1130 DPRINT1(
"ERROR: Couldn't allocate memory for new index root.\n");
1145 Tree->RootNode = NewIndexRoot;
1184 ULONG IndexBufferSize,
1193 ULONG IndexAllocationOffset;
1195 DPRINT(
"UpdateIndexAllocation() called.\n");
1200 HasIndexAllocation =
TRUE;
1204 IndexAllocationContext,
1209 CurrentKey =
Tree->RootNode->FirstKey;
1210 for (
i = 0;
i <
Tree->RootNode->KeyCount;
i++)
1214 if (!HasIndexAllocation)
1218 DPRINT1(
"Adding index allocation...\n");
1228 DPRINT1(
"ERROR: Failed to add index allocation!\n");
1236 DPRINT1(
"ERROR: Couldn't find newly-created index allocation!\n");
1251 DPRINT1(
"ERROR: Failed to add index bitmap!\n");
1256 HasIndexAllocation =
TRUE;
1268 DPRINT1(
"ERROR: Unable to allocate memory for new index entry!\n");
1269 if (HasIndexAllocation)
1290 DPRINT1(
"ERROR: Failed to update index node!\n");
1298 CurrentKey = CurrentKey->
NextKey;
1305 if (HasIndexAllocation)
1309 IndexAllocationContext,
1322 ULONG IndexBufferSize,
1324 ULONG IndexAllocationOffset)
1332 DPRINT(
"UpdateIndexNode(%p, %p, %p, %lu, %p, %lu) called for index node with VCN %I64u\n",
1337 IndexAllocationContext,
1338 IndexAllocationOffset,
1342 for (
i = 0;
i <
Node->KeyCount;
i++)
1355 DPRINT1(
"ERROR: Failed to update child node!\n");
1368 DPRINT1(
"ERROR: Unable to allocate memory for new index entry!\n");
1389 CurrentKey = CurrentKey->
NextKey;
1394 if (
Node->DiskNeedsUpdating)
1397 ULONG LengthWritten;
1401 if (!
Node->HasValidVCN)
1407 IndexAllocationContext,
1408 IndexAllocationOffset,
1412 DPRINT1(
"ERROR: Failed to allocate index record in index allocation!\n");
1423 DPRINT1(
"ERROR: Failed to allocate %lu bytes for index buffer!\n", IndexBufferSize);
1431 DPRINT1(
"ERROR: Failed to create index buffer from node!\n");
1440 Status =
WriteAttribute(DeviceExt, IndexAllocationContext, NodeOffset, (
const PUCHAR)IndexBuffer, IndexBufferSize, &LengthWritten, FileRecord);
1443 DPRINT1(
"ERROR: Failed to update index allocation!\n");
1471 DPRINT1(
"ERROR: Failed to allocate memory for Index Entry!\n");
1488 DPRINT1(
"ERROR: Failed to allocate memory for new key!\n");
1501 if (
Key->IndexEntry)
1504 if (
Key->LesserChild)
1516 for (
i = 0;
i <
Node->KeyCount;
i++)
1519 NextKey = CurrentKey->
NextKey;
1521 CurrentKey = NextKey;
1572 if (
Key->LesserChild)
1577 DPRINT1(
"DRIVER ERROR: No Key->LesserChild despite Key->IndexEntry->Flags indicating this is a node!\n");
1594 if (
Node->HasValidVCN)
1599 DbgPrint(
" NOT ASSIGNED VCN YET\n");
1601 CurrentKey =
Node->FirstKey;
1602 for (
i = 0;
i <
Node->KeyCount;
i++)
1605 CurrentKey = CurrentKey->
NextKey;
1631 ULONG IndexBufferSize,
1634 if (IndexBufferSize < DeviceExt->NtfsInfo.BytesPerCluster)
1635 return Vcn * DeviceExt->NtfsInfo.BytesPerSector;
1637 return Vcn * DeviceExt->NtfsInfo.BytesPerCluster;
1696 ULONG MaxIndexRootSize,
1697 ULONG IndexRecordSize,
1704 ULONG AllocatedNodeSize;
1705 ULONG MaxNodeSizeWithoutHeader;
1709 *NewRightHandSibling =
NULL;
1711 DPRINT(
"NtfsInsertKey(%p, 0x%I64x, %p, %p, %s, %lu, %lu, %p, %p)\n",
1716 CaseSensitive ?
"TRUE" :
"FALSE",
1720 NewRightHandSibling);
1728 CurrentKey =
Node->FirstKey;
1730 for (
i = 0;
i <
Node->KeyCount;
i++)
1735 if (Comparison == 0)
1763 DPRINT1(
"ERROR: Failed to insert key.\n");
1774 NewLeftKey->
NextKey = CurrentKey;
1778 Node->FirstKey = NewLeftKey;
1780 PreviousKey->
NextKey = NewLeftKey;
1803 if (CurrentKey ==
Node->FirstKey)
1804 Node->FirstKey = NewKey;
1806 PreviousKey->
NextKey = NewKey;
1811 PreviousKey = CurrentKey;
1812 CurrentKey = CurrentKey->
NextKey;
1825 MaxNodeSizeWithoutHeader = AllocatedNodeSize - 0x28;
1828 if (NodeSize > MaxNodeSizeWithoutHeader)
1835 DPRINT1(
"ERROR: Failed to split B-Tree node!\n");
1889 ULONG MedianKeyIndex;
1890 PB_TREE_KEY LastKeyBeforeMedian, FirstKeyAfterMedian;
1896 DPRINT(
"SplitBTreeNode(%p, %p, %p, %p, %s) called\n",
1900 NewRightHandSibling,
1901 CaseSensitive ?
"TRUE" :
"FALSE");
1909 if (*NewRightHandSibling ==
NULL)
1911 DPRINT1(
"Error: Failed to allocate memory for right hand sibling!\n");
1915 (*NewRightHandSibling)->DiskNeedsUpdating =
TRUE;
1936 LastKeyBeforeMedian =
Node->FirstKey;
1940 for (
i = 0;
i <
Node->KeyCount;
i++)
1944 if (SizeSum > HalfSize)
1948 LastKeyBeforeMedian = LastKeyBeforeMedian->
NextKey;
1952 *MedianKey = LastKeyBeforeMedian->
NextKey;
1953 FirstKeyAfterMedian = (*MedianKey)->
NextKey;
1955 DPRINT1(
"%lu keys, %lu median\n",
Node->KeyCount, MedianKeyIndex);
1956 DPRINT1(
"\t\tMedian: %.*S\n", (*MedianKey)->IndexEntry->FileName.NameLength, (*MedianKey)->IndexEntry->FileName.Name);
1964 DPRINT1(
"Error: Couldn't allocate dummy key!\n");
1965 LastKeyBeforeMedian->
NextKey = *MedianKey;
1974 LastKeyBeforeMedian->
NextKey->LesserChild = (*MedianKey)->LesserChild;
1983 (*MedianKey)->IndexEntry->Length +
sizeof(
ULONGLONG),
1987 DPRINT1(
"Unable to allocate memory for new index entry!\n");
1988 LastKeyBeforeMedian->
NextKey = *MedianKey;
1998 (*MedianKey)->IndexEntry = NewIndexEntry;
2008 (*MedianKey)->LesserChild =
Node;
2012 Node->KeyCount = MedianKeyIndex + 2;
2018 (*NewRightHandSibling)->FirstKey = FirstKeyAfterMedian;
2019 (*NewRightHandSibling)->KeyCount =
CountBTreeKeys(FirstKeyAfterMedian);
2022 DPRINT1(
"Left-hand node after split:\n");
2025 DPRINT1(
"Right-hand sibling node after split:\n");
#define ALIGN_UP_BY(size, align)
struct NTFS_ATTR_RECORD * PNTFS_ATTR_RECORD
#define NTFS_INDEX_ENTRY_NODE
#define NTFS_INDEX_ENTRY_END
VOID DumpBTreeNode(PB_TREE Tree, PB_TREE_FILENAME_NODE Node, ULONG Number, ULONG Depth)
PB_TREE_FILENAME_NODE CreateBTreeNodeFromIndexNode(PDEVICE_EXTENSION Vcb, PINDEX_ROOT_ATTRIBUTE IndexRoot, PNTFS_ATTR_CONTEXT IndexAllocationAttributeCtx, PINDEX_ENTRY_ATTRIBUTE NodeEntry)
ULONG CountBTreeKeys(PB_TREE_KEY FirstKey)
VOID DestroyBTreeNode(PB_TREE_FILENAME_NODE Node)
NTSTATUS CreateBTreeFromIndex(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecordWithIndex, PNTFS_ATTR_CONTEXT IndexRootContext, PINDEX_ROOT_ATTRIBUTE IndexRoot, PB_TREE *NewTree)
LONG CompareTreeKeys(PB_TREE_KEY Key1, PB_TREE_KEY Key2, BOOLEAN CaseSensitive)
NTSTATUS SplitBTreeNode(PB_TREE Tree, PB_TREE_FILENAME_NODE Node, PB_TREE_KEY *MedianKey, PB_TREE_FILENAME_NODE *NewRightHandSibling, BOOLEAN CaseSensitive)
VOID DestroyBTreeKey(PB_TREE_KEY Key)
NTSTATUS AllocateIndexNode(PDEVICE_EXTENSION DeviceExt, PFILE_RECORD_HEADER FileRecord, ULONG IndexBufferSize, PNTFS_ATTR_CONTEXT IndexAllocationCtx, ULONG IndexAllocationOffset, PULONGLONG NewVCN)
ULONGLONG GetIndexEntryVCN(PINDEX_ENTRY_ATTRIBUTE IndexEntry)
NTSTATUS NtfsInsertKey(PB_TREE Tree, ULONGLONG FileReference, PFILENAME_ATTRIBUTE FileNameAttribute, PB_TREE_FILENAME_NODE Node, BOOLEAN CaseSensitive, ULONG MaxIndexRootSize, ULONG IndexRecordSize, PB_TREE_KEY *MedianKey, PB_TREE_FILENAME_NODE *NewRightHandSibling)
ULONGLONG GetAllocationOffsetFromVCN(PDEVICE_EXTENSION DeviceExt, ULONG IndexBufferSize, ULONGLONG Vcn)
NTSTATUS UpdateIndexAllocation(PDEVICE_EXTENSION DeviceExt, PB_TREE Tree, ULONG IndexBufferSize, PFILE_RECORD_HEADER FileRecord)
VOID DestroyBTree(PB_TREE Tree)
VOID PrintAllVCNs(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT IndexAllocationContext, ULONG NodeSize)
NTSTATUS CreateIndexBufferFromBTreeNode(PDEVICE_EXTENSION DeviceExt, PB_TREE_FILENAME_NODE Node, ULONG BufferSize, BOOLEAN HasChildren, PINDEX_BUFFER IndexBuffer)
NTSTATUS DemoteBTreeRoot(PB_TREE Tree)
ULONG GetSizeOfIndexEntries(PB_TREE_FILENAME_NODE Node)
PB_TREE_KEY CreateDummyKey(BOOLEAN HasChildNode)
VOID DumpBTree(PB_TREE Tree)
NTSTATUS CreateEmptyBTree(PB_TREE *NewTree)
NTSTATUS CreateIndexRootFromBTree(PDEVICE_EXTENSION DeviceExt, PB_TREE Tree, ULONG MaxIndexSize, PINDEX_ROOT_ATTRIBUTE *IndexRoot, ULONG *Length)
VOID SetIndexEntryVCN(PINDEX_ENTRY_ATTRIBUTE IndexEntry, ULONGLONG VCN)
PB_TREE_KEY CreateBTreeKeyFromFilename(ULONGLONG FileReference, PFILENAME_ATTRIBUTE FileNameAttribute)
NTSTATUS UpdateIndexNode(PDEVICE_EXTENSION DeviceExt, PFILE_RECORD_HEADER FileRecord, PB_TREE_FILENAME_NODE Node, ULONG IndexBufferSize, PNTFS_ATTR_CONTEXT IndexAllocationContext, ULONG IndexAllocationOffset)
VOID DumpBTreeKey(PB_TREE Tree, PB_TREE_KEY Key, ULONG Number, ULONG Depth)
#define RtlInitializeBitMap
#define NT_SUCCESS(StatCode)
static const WCHAR Cleanup[]
ULONG GetFileNameAttributeLength(PFILENAME_ATTRIBUTE FileNameAttribute)
NTSTATUS AddBitmap(PNTFS_VCB Vcb, PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress, PCWSTR Name, USHORT NameLength)
NTSTATUS AddIndexAllocation(PNTFS_VCB Vcb, PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress, PCWSTR Name, USHORT NameLength)
struct INDEX_BUFFER * PINDEX_BUFFER
struct INDEX_ENTRY_ATTRIBUTE * PINDEX_ENTRY_ATTRIBUTE
#define COLLATION_FILE_NAME
@ AttributeIndexAllocation
#define ATTR_RECORD_ALIGNMENT
#define ExAllocatePoolWithTag(hernya, size, tag)
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
#define BooleanFlagOn(F, SF)
struct _FileName FileName
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
PCONFIGURATION_COMPONENT_DATA RootNode
NTSTATUS UpdateFileRecord(PDEVICE_EXTENSION Vcb, ULONGLONG MftIndex, PFILE_RECORD_HEADER FileRecord)
VOID ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context)
ULONGLONG AttributeDataLength(PNTFS_ATTR_RECORD AttrRecord)
NTSTATUS FindAttribute(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER MftRecord, ULONG Type, PCWSTR Name, ULONG NameLength, PNTFS_ATTR_CONTEXT *AttrCtx, PULONG Offset)
ULONG ReadAttribute(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT Context, ULONGLONG Offset, PCHAR Buffer, ULONG Length)
NTSTATUS WriteAttribute(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT Context, ULONGLONG Offset, const PUCHAR Buffer, ULONG Length, PULONG RealLengthWritten, PFILE_RECORD_HEADER FileRecord)
NTSTATUS AddFixupArray(PDEVICE_EXTENSION Vcb, PNTFS_RECORD_HEADER Record)
NTSTATUS SetNonResidentAttributeDataLength(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT AttrContext, ULONG AttrOffset, PFILE_RECORD_HEADER FileRecord, PLARGE_INTEGER DataSize)
NTSTATUS SetResidentAttributeDataLength(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT AttrContext, ULONG AttrOffset, PFILE_RECORD_HEADER FileRecord, PLARGE_INTEGER DataSize)
NTSTATUS FixupUpdateSequenceArray(PDEVICE_EXTENSION Vcb, PNTFS_RECORD_HEADER Record)
#define ExFreePoolWithTag(_P, _T)
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
_In_ ULONG _In_ ULONG _In_ ULONG Length
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
#define STATUS_NOT_IMPLEMENTED
#define STATUS_END_OF_FILE
INDEX_HEADER_ATTRIBUTE Header
struct INDEX_ENTRY_ATTRIBUTE::@772::@773 Directory
union INDEX_ENTRY_ATTRIBUTE::@772 Data
FILENAME_ATTRIBUTE FileName
INDEX_HEADER_ATTRIBUTE Header
UCHAR ClustersPerIndexRecord
BOOLEAN DiskNeedsUpdating
struct _B_TREE_KEY * NextKey
B_TREE_FILENAME_NODE * LesserChild
PINDEX_ENTRY_ATTRIBUTE IndexEntry
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_FILE_CORRUPT_ERROR
#define STATUS_INSUFFICIENT_RESOURCES
#define ALIGN_UP(size, type)
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesWritten
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
_In_opt_ PALLOCATE_FUNCTION _In_opt_ PFREE_FUNCTION _In_ ULONG _In_ SIZE_T _In_ ULONG _In_ USHORT Depth