46#define MREC_REPARSE 26
49#define MREC_DELETED 29
59#define FA_HIDDEN 0x0002u
60#define FA_SYSTEM 0x0004u
61#define FA_ARCHIVE 0x0020u
62#define FA_DIR 0x10000000u
63#define FA_VIEW 0x20000000u
67#define COLL_ULONGS 0x13
72#define HOLE_LCN (~0ULL)
77#define WR16(p, o, v) (*(PUSHORT)((PBYTE)(p) + (o)) = (USHORT)(v))
78#define WR32(p, o, v) (*(PULONG)((PBYTE)(p) + (o)) = (ULONG)(v))
79#define WR64(p, o, v) (*(PULONGLONG)((PBYTE)(p) + (o)) = (ULONGLONG)(v))
80#define RD16(p, o) (*(PUSHORT)((PBYTE)(p) + (o)))
81#define RD32(p, o) (*(PULONG)((PBYTE)(p) + (o)))
83#define ALIGN8(x) (((x) + 7u) & ~7u)
131 while (!((
V == 0) && (((
Value >> (
Bytes * 8 - 1)) & 1) == 0)) &&
132 !((
V == -1) && (((
Value >> (
Bytes * 8 - 1)) & 1) == 1)));
160 if ((
Len >> (LenBytes * 8 - 1)) & 1)
177 Out[
Pos++] = (
BYTE)((OffBytes << 4) | (LenBytes & 0x0F));
178 for (
B = 0;
B < LenBytes;
B++)
180 for (
B = 0;
B < OffBytes;
B++)
205 WR16(Buf, 0x04, 0x30);
206 WR16(Buf, 0x06, UsaCount);
210 WR16(Buf, 0x14, 0x38);
215 WR32(Buf, 0x2C, RecordNumber);
239 PBYTE A = Rec->Buf + Rec->Offset;
245 WR32(
A, 0x04, AttrLen);
250 WR16(
A, 0x0E, Rec->NextAttrId++);
251 WR32(
A, 0x10, ValueLen);
252 WR16(
A, 0x14, ValueOff);
253 A[0x16] = ResidentFlags;
256 for (
I = 0;
I < NameChars;
I++)
261 Rec->Offset += AttrLen;
279 PBYTE A = Rec->Buf + Rec->Offset;
293 DataBase = (
USHORT)(HasCompSize ? 0x48 : 0x40);
296 AttrLen =
ALIGN8(MapOff + MapLen);
299 WR32(
A, 0x04, AttrLen);
302 WR16(
A, 0x0A, DataBase);
304 WR16(
A, 0x0E, Rec->NextAttrId++);
306 WR64(
A, 0x18, HighVcn);
307 WR16(
A, 0x20, MapOff);
310 WR64(
A, 0x28, AllocSize);
311 WR64(
A, 0x30, RealSize);
312 WR64(
A, 0x38, InitSize);
316 for (
I = 0;
I < NameChars;
I++)
320 Rec->Offset += AttrLen;
329 PBYTE Buf = Rec->Buf;
336 WR32(Buf, Rec->Offset + 4, 0);
337 Used = Rec->Offset + 8;
339 WR32(Buf, 0x18, Used);
340 WR16(Buf, 0x28, Rec->NextAttrId);
342 UsaOff =
RD16(Buf, 0x04);
343 UsaCount =
RD16(Buf, 0x06);
345 for (Sector = 0; Sector + 1 < UsaCount; Sector++)
349 WR16(Buf, UsaOff + (Sector + 1) * 2,
RD16(Tail, 0));
403 while (
Name[NameLen] !=
L'\0')
416 Out[0x41] = Namespace;
417 for (
I = 0;
I < NameLen;
I++)
420 return 0x42 + (
ULONG)NameLen * 2;
553 WR32(
Out, 0x04, CollationRule);
573 WR32(
Out, 0x04, CollationRule);
602 WR32(
Out, 0x04, CollationRule);
645 for (
I = 0;
I + 4 <=
Len;
I += 4)
663 for (Sector = 0; Sector + 1 < UsaCount; Sector++)
667 WR16(Blk, 0x28 + (Sector + 1) * 2,
RD16(Tail, 0));
685 WR16(Blk, 0x04, 0x28);
686 WR16(Blk, 0x06, UsaCount);
688 WR32(Blk, 0x18, 0x28);
699 WR16(Blk,
P + 0x00, DataOff);
701 WR16(Blk,
P + 0x08, EntryLen);
703 WR16(Blk,
P + 0x0C, 0);
713 WR16(Blk,
P + 0x08, 0x10);
716 WR32(Blk, 0x1C,
P - 0x18);
736 WR16(Blk, 0x04, 0x28);
737 WR16(Blk, 0x06, UsaCount);
740 WR32(Blk, 0x18, 0x28);
753 WR16(Blk,
P + 0x08, EntryLen);
754 WR16(Blk,
P + 0x0A, FnLen);
755 WR16(Blk,
P + 0x0C, 0);
756 WR16(Blk,
P + 0x0E, 0);
761 WR16(Blk,
P + 0x08, 0x10);
764 WR32(Blk, 0x1C,
P - 0x18);
800 if (ClustersCount == 0)
804 if (ChunkClusters == 0)
806 if (ChunkClusters > ClustersCount)
807 ChunkClusters = ClustersCount;
817 Remaining = ClustersCount;
818 while (Remaining > 0)
820 ULONG ThisClusters = (Remaining < ChunkClusters) ? Remaining : ChunkClusters;
827 Remaining -= ThisClusters;
859 if (Content && ContentLen)
909 DPRINT1(
"ERROR: Unable to allocate MFT build buffer!\n");
917 DPRINT1(
"ERROR: Unable to allocate attribute scratch buffer!\n");
927 #define REC_BUF(n) (Mft + (ULONG_PTR)(n) * MFT_RECORD_SIZE)
993 VLen =
LABEL->Length;
1027 ULONGLONG BitmapBytes = (((ClusterCount + 7) / 8) + 7) & ~7ULL;
1068 ClusterCount *
C, ClusterCount *
C, 0);
1082 WR32(SdsHdr[
i], 0x00, SdHash[
i]);
1084 WR64(SdsHdr[
i], 0x08, SdSdsOff[
i]);
1087 WR32(SdhKeys[
i], 0, SdHash[
i]);
1152 WR64(Qce, 0x18, 0xFFFFFFFFFFFFFFFFULL);
1153 WR64(Qce, 0x20, 0xFFFFFFFFFFFFFFFFULL);
1158 WR32(QKey256, 0, 0x100);
1159 WR32(OData, 0, 0x100);
1205 for (
i = 12;
i <= 15;
i++)
1226 MkAddNonResident(&Rec,
AttributeData,
NULL, 0, 0,
NULL, 0, (
ULONGLONG)-1, 0, 0, 0);
1347 static const ULONG ExtendOrder[] =
1421 PBYTE E = Buf + SdSdsOff[
i];
1422 WR32(E, 0x00, SdHash[
i]);
1423 WR32(E, 0x04, 0x100 +
i);
1424 WR64(E, 0x08, SdSdsOff[
i]);
1425 WR32(E, 0x10, EntryLen);
1446 WR32(SdsHdr[
i], 0x00, SdHash[
i]);
1448 WR64(SdsHdr[
i], 0x08, SdSdsOff[
i]);
1450 WR32(SdhKeys[
i], 0, SdHash[
i]);
1455 BYTE J = SdhOrder[
i];
1474 Buf[0] = 0xFF; Buf[1] = 0xFF;
1475 Buf[3] = 0xFF; Buf[4] = 0x0F;
1485 ULONGLONG BitmapBytes = (((ClusterCount + 7) / 8) + 7) & ~7ULL;
1491 for (
c = 0;
c <
LAYOUT.FirstFreeLcn;
c++)
1492 Buf[
c / 8] |= (1 << (
c % 8));
1493 for (
c = ClusterCount;
c < BitmapBits;
c++)
1494 Buf[
c / 8] |= (1 << (
c % 8));
1503 static const ULONG RootOrder[] =
#define ALIGN_UP_BY(size, align)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
char * Pad(char *Str, char PadChar, ULONG Length)
const BYTE UPCASE_TABLE[]
const ATTR_DEF ATTRIBUTES_TABLE[]
_In_ PIO_STATUS_BLOCK IoStatusBlock
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
static int Hash(const char *)
#define COLLATION_FILE_NAME
#define COLLATION_NTOFS_ULONG
@ AttributeStandardInformation
@ AttributeVolumeInformation
@ AttributeSecurityDescriptor
@ AttributeIndexAllocation
@ AttributeLoggedUtilityStream
#define COLLATION_NTOFS_SECURITY_HASH
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE _In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG FileAttributes
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
BOOLEAN(* Fn)(ULONG Argc, PCHAR Argv[])
#define BYTES_PER_CLUSTER
#define NTFS_MINOR_VERSION
#define FILE_NAME_WIN32_AND_DOS
#define MFT_REFERENCE(rec)
#define NTFS_MAJOR_VERSION
#define RECORD_SEQUENCE(rec)
@ MFT_RECORD_IS_DIRECTORY
#define INDEX_RECORD_SIZE
static const ENTRY Entries[]
NTSYSAPI NTSTATUS NTAPI NtWriteFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID WriteBuffer, IN ULONG WriteBufferLength, IN PLARGE_INTEGER FileOffset OPTIONAL, IN PULONG LockOperationKey OPTIONAL)
_In_ ULONG _In_ ULONG Offset
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define RtlFillMemory(Dest, Length, Fill)
static const BYTE TopsData[100]
static const BYTE TxfDataValue[56]
#define NTFS_DEFAULT_SD_COUNT
static const BYTE UpCaseInfo[32]
static const BYTE RepairCfg[8]
static const BYTE SidAdmins[16]
static const BYTE DefaultSds[716]
static const USHORT DefaultSdLen[NTFS_DEFAULT_SD_COUNT]
static const BYTE RootSdValue[228]
static const BYTE TxfInfo[56]
static VOID MkIndxFixup(IN OUT PBYTE Blk, IN ULONG BlkSize)
static VOID MkStdInfoShort(OUT PBYTE Out, IN ULONG FileAttributes, IN ULONGLONG Now)
NTSTATUS WriteMetafiles(VOID)
static ULONG MkViewRootN(OUT PBYTE Out, IN ULONG CollationRule, IN const MK_VIEW_ENTRY *Entries, IN ULONG Count)
static VOID MkRootIndxBlock(OUT PBYTE Blk, IN const BYTE *Mft, IN const ULONG *Order, IN ULONG Count)
static NTSTATUS WritePatternToClusters(IN ULONGLONG Address, IN ULONG ClustersCount, IN BYTE Pattern)
static VOID MkStdInfo(OUT PBYTE Out, IN ULONG FileAttributes, IN ULONGLONG Now, IN ULONG SecurityId)
static USHORT MkExtractFileName(IN const BYTE *RecBuf, OUT PBYTE Out)
static ULONG MkEncodeRuns(IN const MK_RUN *Runs, IN ULONG RunCount, OUT PBYTE Out)
static ULONG MkI30RootWithEntries(OUT PBYTE Out, IN const BYTE *Mft, IN const ULONG *Order, IN ULONG Count)
static ULONG MkSecHash(IN const BYTE *Sd, IN ULONG Len)
static NTSTATUS WriteAt(IN ULONGLONG Lcn, IN PVOID Buffer, IN ULONG Length)
static ULONG MkLargeI30Root(OUT PBYTE Out)
static VOID MkSetHardLinks(IN MK_REC *Rec, IN USHORT Count)
static ULONG MkLargeViewRoot(OUT PBYTE Out, IN ULONG CollationRule)
static ULONG MkSignBytes(IN LONGLONG Value)
static ULONG MkEmptyViewRoot(OUT PBYTE Out, IN ULONG CollationRule)
static ULONG MkEmptyI30Root(OUT PBYTE Out)
static VOID MkAddResident(IN OUT MK_REC *Rec, IN ULONG Type, IN LPCWSTR Name, IN BYTE NameChars, IN BYTE ResidentFlags, IN const VOID *Value, IN ULONG ValueLen)
static NTSTATUS WriteZerosToClusters(IN ULONGLONG Address, IN ULONG ClustersCount)
static VOID MkFinalize(IN MK_REC *Rec)
static VOID MkInit(OUT MK_REC *Rec, IN PBYTE Buf, IN ULONG RecordNumber, IN USHORT Flags)
static VOID MkViewIndxBlock(OUT PBYTE Blk, IN const MK_VIEW_ENTRY *Entries, IN ULONG Count)
static ULONG MkFileName(OUT PBYTE Out, IN ULONGLONG ParentRef, IN ULONG FileAttributes, IN ULONGLONG AllocSize, IN ULONGLONG RealSize, IN ULONGLONG Now, IN LPCWSTR Name, IN BYTE Namespace)
static NTSTATUS WriteRegion(IN ULONGLONG Lcn, IN ULONG Clusters, IN const VOID *Content, IN ULONG ContentLen)
static VOID MkAddNonResident(IN OUT MK_REC *Rec, IN ULONG Type, IN LPCWSTR Name, IN BYTE NameChars, IN USHORT Flags, IN const MK_RUN *Runs, IN ULONG RunCount, IN ULONGLONG HighVcn, IN ULONGLONG AllocSize, IN ULONGLONG RealSize, IN ULONGLONG InitSize)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value