PNTFS_FCB NtfsMakeRootFCB(PNTFS_VCB Vcb) { PNTFS_FCB Fcb; PFILE_RECORD_HEADER MftRecord; PFILENAME_ATTRIBUTE FileName; MftRecord = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS); if (MftRecord == NULL) { return NULL; } if (!NT_SUCCESS(ReadFileRecord(Vcb, NTFS_FILE_ROOT, MftRecord))) { ExFreePoolWithTag(MftRecord, TAG_NTFS); return NULL; } FileName = GetFileNameFromRecord(Vcb, MftRecord, NTFS_FILE_NAME_WIN32); if (!FileName) { ExFreePoolWithTag(MftRecord, TAG_NTFS); return NULL; } Fcb = NtfsCreateFCB(L"\\", NULL, Vcb); if (!Fcb) { ExFreePoolWithTag(MftRecord, TAG_NTFS); return NULL; } memcpy(&Fcb->Entry, FileName, FIELD_OFFSET(FILENAME_ATTRIBUTE, NameLength)); Fcb->Entry.NameType = FileName->NameType; Fcb->Entry.NameLength = 0; Fcb->Entry.Name[0] = UNICODE_NULL; Fcb->RefCount = 1; Fcb->DirIndex = 0; Fcb->RFCB.FileSize.QuadPart = FileName->DataSize; Fcb->RFCB.ValidDataLength.QuadPart = FileName->DataSize; Fcb->RFCB.AllocationSize.QuadPart = FileName->AllocatedSize; Fcb->MFTIndex = NTFS_FILE_ROOT; Fcb->LinkCount = MftRecord->LinkCount; NtfsFCBInitializeCache(Vcb, Fcb); NtfsAddFCBToTable(Vcb, Fcb); NtfsGrabFCB(Vcb, Fcb); ExFreePoolWithTag(MftRecord, TAG_NTFS); return Fcb; }
PNTFS_FCB NtfsMakeRootFCB(PNTFS_VCB Vcb) { PNTFS_FCB Fcb; Fcb = NtfsCreateFCB(L"\\", Vcb); // memset(Fcb->entry.Filename, ' ', 11); // Fcb->Entry.DataLengthL = Vcb->CdInfo.RootSize; // Fcb->Entry.ExtentLocationL = Vcb->CdInfo.RootStart; // Fcb->Entry.FileFlags = 0x02; // FILE_ATTRIBUTE_DIRECTORY; Fcb->RefCount = 1; Fcb->DirIndex = 0; Fcb->RFCB.FileSize.QuadPart = PAGE_SIZE;//Vcb->CdInfo.RootSize; Fcb->RFCB.ValidDataLength.QuadPart = PAGE_SIZE;//Vcb->CdInfo.RootSize; Fcb->RFCB.AllocationSize.QuadPart = PAGE_SIZE;//Vcb->CdInfo.RootSize; NtfsFCBInitializeCache(Vcb, Fcb); NtfsAddFCBToTable(Vcb, Fcb); NtfsGrabFCB(Vcb, Fcb); return Fcb; }