NtfsReadDisk(IN PDEVICE_OBJECT DeviceObject,
IN LONGLONG StartingOffset,
IN ULONG Length,
+ IN ULONG SectorSize,
IN OUT PUCHAR Buffer,
IN BOOLEAN Override)
{
KEVENT Event;
PIRP Irp;
NTSTATUS Status;
+ ULONGLONG RealReadOffset;
+ ULONG RealLength;
+ BOOLEAN AllocatedBuffer = FALSE;
+ PUCHAR ReadBuffer = Buffer;
- DPRINT("NtfsReadDisk(%p, %I64x, %u, %p, %d)\n", DeviceObject, StartingOffset, Length, Buffer, Override);
+ DPRINT("NtfsReadDisk(%p, %I64x, %u, %u, %p, %d)\n", DeviceObject, StartingOffset, Length, SectorSize, Buffer, Override);
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
- Offset.QuadPart = StartingOffset;
+ RealReadOffset = (ULONGLONG)StartingOffset;
+ RealLength = Length;
+
+ if ((RealReadOffset % SectorSize) != 0 || (RealLength % SectorSize) != 0)
+ {
+ RealReadOffset = ROUND_DOWN(StartingOffset, SectorSize);
+ RealLength = ROUND_UP(Length, SectorSize);
+
+ ReadBuffer = ExAllocatePoolWithTag(NonPagedPool, RealLength + SectorSize, TAG_NTFS);
+ if (ReadBuffer == NULL)
+ {
+ DPRINT1("Not enough memory!\n");
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ AllocatedBuffer = TRUE;
+ }
+
+ Offset.QuadPart = RealReadOffset;
DPRINT("Building synchronous FSD Request...\n");
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
DeviceObject,
- Buffer,
- Length,
+ ReadBuffer,
+ RealLength,
&Offset,
&Event,
&IoStatus);
Status = IoStatus.Status;
}
+ if (NT_SUCCESS(Status) && AllocatedBuffer)
+ {
+ RtlCopyMemory(Buffer, ReadBuffer + (StartingOffset - RealReadOffset), Length);
+ ExFreePoolWithTag(ReadBuffer, TAG_NTFS);
+ }
+
DPRINT("NtfsReadDisk() done (Status %x)\n", Status);
return Status;
Offset = (LONGLONG)DiskSector * (LONGLONG)SectorSize;
BlockSize = SectorCount * SectorSize;
- return NtfsReadDisk(DeviceObject, Offset, BlockSize, Buffer, Override);
+ return NtfsReadDisk(DeviceObject, Offset, BlockSize, SectorSize, Buffer, Override);
}
PNTFS_ATTR_RECORD ListAttrRecordEnd;
// Do not handle non-resident yet
- ASSERT(!(AttrRecord->IsNonResident & 1));
-
- ListContext = PrepareAttributeContext(AttrRecord);
-
- ListSize = AttributeDataLength(&ListContext->Record);
- if(ListSize <= 0xFFFFFFFF)
- ListBuffer = ExAllocatePoolWithTag(NonPagedPool, (ULONG)ListSize, TAG_NTFS);
- else
- ListBuffer = NULL;
-
- if(!ListBuffer)
+ if (AttrRecord->IsNonResident)
{
- DPRINT("Failed to allocate memory: %x\n", (ULONG)ListSize);
+ UNIMPLEMENTED;
continue;
}
+ else
+ {
+ ListContext = PrepareAttributeContext(AttrRecord);
- ListAttrRecord = (PNTFS_ATTR_RECORD)ListBuffer;
- ListAttrRecordEnd = (PNTFS_ATTR_RECORD)((PCHAR)ListBuffer + ListSize);
+ ListSize = AttributeDataLength(&ListContext->Record);
+ if(ListSize <= 0xFFFFFFFF)
+ ListBuffer = ExAllocatePoolWithTag(NonPagedPool, (ULONG)ListSize, TAG_NTFS);
+ else
+ ListBuffer = NULL;
- if (ReadAttribute(Vcb, ListContext, 0, ListBuffer, (ULONG)ListSize) == ListSize)
- {
- Context = FindAttributeHelper(Vcb, ListAttrRecord, ListAttrRecordEnd,
- Type, Name, NameLength);
+ if(!ListBuffer)
+ {
+ DPRINT("Failed to allocate memory: %x\n", (ULONG)ListSize);
+ continue;
+ }
- ReleaseAttributeContext(ListContext);
- ExFreePoolWithTag(ListBuffer, TAG_NTFS);
+ ListAttrRecord = (PNTFS_ATTR_RECORD)ListBuffer;
+ ListAttrRecordEnd = (PNTFS_ATTR_RECORD)((PCHAR)ListBuffer + ListSize);
- if (Context != NULL)
+ if (ReadAttribute(Vcb, ListContext, 0, ListBuffer, (ULONG)ListSize) == ListSize)
{
- DPRINT("Found context = %p\n", Context);
- return Context;
+ Context = FindAttributeHelper(Vcb, ListAttrRecord, ListAttrRecordEnd,
+ Type, Name, NameLength);
+
+ ReleaseAttributeContext(ListContext);
+ ExFreePoolWithTag(ListBuffer, TAG_NTFS);
+
+ if (Context != NULL)
+ {
+ DPRINT("Found context = %p\n", Context);
+ return Context;
+ }
}
}
}
Status = NtfsReadDisk(Vcb->StorageDevice,
DataRunStartLCN * Vcb->NtfsInfo.BytesPerCluster + Offset - CurrentOffset,
ReadLength,
+ Vcb->NtfsInfo.BytesPerSector,
(PVOID)Buffer,
FALSE);
if (NT_SUCCESS(Status))
Status = NtfsReadDisk(Vcb->StorageDevice,
DataRunStartLCN * Vcb->NtfsInfo.BytesPerCluster,
ReadLength,
+ Vcb->NtfsInfo.BytesPerSector,
(PVOID)Buffer,
FALSE);
if (!NT_SUCCESS(Status))
#define TAG_NTFS 'SFTN'
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
+#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
#define DEVICE_NAME L"\\Ntfs"
NtfsReadDisk(IN PDEVICE_OBJECT DeviceObject,
IN LONGLONG StartingOffset,
IN ULONG Length,
+ IN ULONG SectorSize,
IN OUT PUCHAR Buffer,
IN BOOLEAN Override);
#define NDEBUG
#include <debug.h>
-/* GLOBALS *******************************************************************/
-
-#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
-#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
-
/* FUNCTIONS ****************************************************************/
/*