873{
880
881
886
887
889
893
895 {
901 }
904
905
907 if (!Mft)
908 {
909 DPRINT1(
"ERROR: Unable to allocate MFT build buffer!\n");
911 }
913
915 if (!Val)
916 {
917 DPRINT1(
"ERROR: Unable to allocate attribute scratch buffer!\n");
920 }
921
922 {
926
927 #define REC_BUF(n) (Mft + (ULONG_PTR)(n) * MFT_RECORD_SIZE)
928
929
943
944 {
949 }
951
952
966
967
980
981
988 {
992 {
993 VLen =
LABEL->Length;
994 if (VLen > 128)
995 VLen = 128;
997 }
999 }
1000
1007
1008
1022
1023
1024
1025
1026 {
1027 ULONGLONG BitmapBytes = (((ClusterCount + 7) / 8) + 7) & ~7ULL;
1039 }
1040
1041
1055
1056
1064
1065
1068 ClusterCount *
C, ClusterCount *
C, 0);
1070
1071
1072 {
1078
1080 {
1082 WR32(SdsHdr[
i], 0x00, SdHash[
i]);
1084 WR64(SdsHdr[
i], 0x08, SdSdsOff[
i]);
1087 WR32(SdhKeys[
i], 0, SdHash[
i]);
1091 }
1092
1099
1105
1115 Val[0] = 0x01;
1118 }
1119
1120
1133
1134
1135
1136
1137 {
1146
1152 WR64(Qce, 0x18, 0xFFFFFFFFFFFFFFFFULL);
1153 WR64(Qce, 0x20, 0xFFFFFFFFFFFFFFFFULL);
1156
1158 WR32(QKey256, 0, 0x100);
1159 WR32(OData, 0, 0x100);
1160
1164
1177 }
1178
1179
1190
1191
1202
1203
1204
1205 for (
i = 12;
i <= 15;
i++)
1206 {
1215 }
1216
1217
1218
1219
1226 MkAddNonResident(&Rec,
AttributeData,
NULL, 0, 0,
NULL, 0, (
ULONGLONG)-1, 0, 0, 0);
1229
1230
1246
1247
1258
1259
1272
1273
1285
1286
1299
1312
1313
1314 {
1316
1326 }
1327
1328
1329 {
1331
1341 }
1342
1343
1344
1345
1346 {
1347 static const ULONG ExtendOrder[] =
1349
1359 }
1360
1361
1376 Val[0] = 0x01;
1381
1382 #undef REC_BUF
1383 }
1384
1385
1386
1387
1388
1391
1394
1395
1398
1399
1402
1403
1406
1407
1410
1411
1412
1413 {
1419 {
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);
1427
1428
1430 }
1434 }
1435
1436
1437 {
1442
1444 {
1446 WR32(SdsHdr[
i], 0x00, SdHash[
i]);
1448 WR64(SdsHdr[
i], 0x08, SdSdsOff[
i]);
1450 WR32(SdhKeys[
i], 0, SdHash[
i]);
1452 }
1454 {
1455 BYTE J = SdhOrder[
i];
1458 }
1459
1466 }
1467
1468
1469 {
1474 Buf[0] = 0xFF; Buf[1] = 0xFF;
1475 Buf[3] = 0xFF; Buf[4] = 0x0F;
1479 }
1480
1481
1482
1483 {
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));
1498 }
1499
1500
1501
1502 {
1503 static const ULONG RootOrder[] =
1504 {
1508 };
1515 }
1516
1517
1524
1525done:
1529}
#define ALIGN_UP_BY(size, align)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
const BYTE UPCASE_TABLE[]
const ATTR_DEF ATTRIBUTES_TABLE[]
#define NT_SUCCESS(StatCode)
#define COLLATION_NTOFS_ULONG
@ AttributeStandardInformation
@ AttributeVolumeInformation
@ AttributeSecurityDescriptor
@ AttributeIndexAllocation
@ AttributeLoggedUtilityStream
#define COLLATION_NTOFS_SECURITY_HASH
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 NTFS_MINOR_VERSION
#define FILE_NAME_WIN32_AND_DOS
#define NTFS_MAJOR_VERSION
@ MFT_RECORD_IS_DIRECTORY
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 MkStdInfoShort(OUT PBYTE Out, IN ULONG FileAttributes, IN ULONGLONG Now)
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 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 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 STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size