- Don't attempt to moon walk path name for reserved MFT entries.
- Don't attempt to dereference file name if it doesn't exist

svn path=/trunk/; revision=67918
This commit is contained in:
Pierre Schweitzer 2015-05-26 07:10:45 +00:00
parent d91adcaebf
commit 488b5f9d64

View file

@ -98,8 +98,6 @@ NtfsMoonWalkID(PDEVICE_EXTENSION DeviceExt,
DPRINT1("NtfsMoonWalkID(%p, %I64x, %p)\n", DeviceExt, Id, OutPath); DPRINT1("NtfsMoonWalkID(%p, %I64x, %p)\n", DeviceExt, Id, OutPath);
Id = Id & NTFS_MFT_MASK;
RtlZeroMemory(FullPath, sizeof(FullPath)); RtlZeroMemory(FullPath, sizeof(FullPath));
MftRecord = ExAllocatePoolWithTag(NonPagedPool, MftRecord = ExAllocatePoolWithTag(NonPagedPool,
DeviceExt->NtfsInfo.BytesPerFileRecord, DeviceExt->NtfsInfo.BytesPerFileRecord,
@ -123,6 +121,13 @@ NtfsMoonWalkID(PDEVICE_EXTENSION DeviceExt,
} }
FileName = GetBestFileNameFromRecord(MftRecord); FileName = GetBestFileNameFromRecord(MftRecord);
if (FileName == NULL)
{
DPRINT1("$FILE_NAME attribute not found for %I64x\n", Id);
Status = STATUS_OBJECT_PATH_NOT_FOUND;
break;
}
WritePosition -= FileName->NameLength; WritePosition -= FileName->NameLength;
ASSERT(WritePosition < MAX_PATH); ASSERT(WritePosition < MAX_PATH);
RtlCopyMemory(FullPath + WritePosition, FileName->Name, FileName->NameLength * sizeof(WCHAR)); RtlCopyMemory(FullPath + WritePosition, FileName->Name, FileName->NameLength * sizeof(WCHAR));
@ -276,10 +281,19 @@ NtfsCreateFile(PDEVICE_OBJECT DeviceObject,
if ((RequestedOptions & FILE_OPEN_BY_FILE_ID) == FILE_OPEN_BY_FILE_ID) if ((RequestedOptions & FILE_OPEN_BY_FILE_ID) == FILE_OPEN_BY_FILE_ID)
{ {
ULONGLONG MFTId;
if (FileObject->FileName.Length != sizeof(ULONGLONG)) if (FileObject->FileName.Length != sizeof(ULONGLONG))
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
Status = NtfsMoonWalkID(DeviceExt, (*(PULONGLONG)FileObject->FileName.Buffer), &FullPath); MFTId = (*(PULONGLONG)FileObject->FileName.Buffer) & NTFS_MFT_MASK;
if (MFTId < 0xf)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
Status = NtfsMoonWalkID(DeviceExt, MFTId, &FullPath);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
return Status; return Status;