42 RunList->Runs = RunList->StackRuns;
45 RunList->TotalLength = 0;
86 if (RunList->Count != 0)
88 LastRun = &RunList->Runs[RunList->Count - 1];
101 if (RunList->Count == RunList->Capacity)
103 NewCapacity = RunList->Capacity * 2;
112 DPRINT1(
"Not enough memory to grow the I/O run list!\n");
118 if (RunList->Runs != RunList->StackRuns)
123 RunList->Runs = NewRuns;
124 RunList->Capacity = NewCapacity;
127 LastRun = &RunList->Runs[RunList->Count];
142 if (RunList->Runs != RunList->StackRuns && RunList->Runs !=
NULL)
147 RunList->Runs =
NULL;
149 RunList->Capacity = 0;
150 RunList->TotalLength = 0;
173 (
LONG)
Irp->IoStatus.Information);
179 Irp->IoStatus.Status,
219 DPRINT1(
"IoAllocateIrp failed!\n");
225 Mdl = IoContext->MasterMdl;
238 DPRINT1(
"IoAllocateMdl failed!\n");
254 Stack->Parameters.Read.Length =
Run->ByteCount;
255 Stack->Parameters.Read.ByteOffset.QuadPart =
Run->Lbo;
287 ULONG DiskRunCount = 0;
289 ULONG BuiltCount = 0;
311 DPRINT1(
"FIXME: Writing to sparse files is not supported yet!\n");
319 if (DiskRunCount == 0)
324 if (BorrowedMdl !=
NULL)
336 DPRINT1(
"IoAllocateMdl failed!\n");
354 DPRINT1(
"MmProbeAndLockPages failed (Status %lx)\n",
Status);
375 RunList->TotalLength,
393 if (
Run->SavedIrp->MdlAddress !=
NULL &&
500 ULONG Transferred = 0;
507 if (RunList->Count == 0 || RunList->TotalLength == 0)
512 Length = RunList->TotalLength;
513 FirstRun = &RunList->Runs[0];
514 LastRun = &RunList->Runs[RunList->Count - 1];
529 if (FrontPad == 0 && BackPad == 0)
545 BounceLength = FrontPad +
Length + BackPad;
548 if (BounceBuffer ==
NULL)
550 DPRINT1(
"Not enough memory for an unaligned transfer!\n");
558 RunList->Runs[
Index].BufferOffset += FrontPad;
564 FirstRun->
Lbo -= FrontPad;
567 RunList->TotalLength = BounceLength;
623 Transferred = (Transferred > FrontPad) ? Transferred - FrontPad : 0;
650 IoContext->
Status =
Irp->IoStatus.Status;
673 DPRINT(
"Forwarding IRP %p for a single run at %I64x, %lu bytes\n",
682 Stack->MinorFunction = 0;
684 Stack->Parameters.Read.Length =
Run->ByteCount;
685 Stack->Parameters.Read.ByteOffset.QuadPart =
Run->Lbo;
760 BorrowedMdl =
Irp->MdlAddress;
763 if (RunList->Count == 1 &&
766 (RunList->Runs[0].ByteCount %
SectorSize) == 0)
847 DPRINT(
"NtfsReadDisk(%p, %I64x, %lu, %lu, %p, %d)\n",
871 DPRINT1(
"Short read: asked for %lu bytes, got %lu\n",
Length, Transferred);
917 DPRINT(
"NtfsWriteDisk(%p, %I64x, %lu, %lu, %p)\n",
941 DPRINT1(
"Short write: asked for %lu bytes, wrote %lu\n",
Length, Transferred);
974 DPRINT1(
"IoAllocateIrp failed!\n");
1005 DPRINT(
"NtfsFlushDevice() done (Status %lx)\n",
Status);
1048 DPRINT(
"Building device I/O control request ...\n");
1060 DPRINT(
"IoBuildDeviceIoControlRequest() failed\n");
1070 DPRINT(
"Calling IO Driver... with irp %p\n",
Irp);
#define InterlockedDecrement
_In_ PFCB _In_ LONGLONG StartingOffset
D3D12_VIDEO_MOTION_ESTIMATOR_SEARCH_BLOCK_SIZE BlockSize
#define STATUS_NOT_IMPLEMENTED
#define STATUS_NOT_SUPPORTED
_In_ ULONG InputBufferSize
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
_In_ ULONG _In_ ULONG OutputBufferSize
#define NT_SUCCESS(StatCode)
struct _NTFS_IO_CONTEXT * PNTFS_IO_CONTEXT
#define NTFS_MAX_IO_RUNS_ON_STACK
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define ROUND_UP(n, align)
IN PFCB IN VBO OUT PLBO Lbo
#define EXCEPTION_EXECUTE_HANDLER
#define InterlockedExchangeAdd
#define InterlockedCompareExchange
VOID NTAPI IoBuildPartialMdl(IN PMDL SourceMdl, IN PMDL TargetMdl, IN PVOID VirtualAddress, IN ULONG Length)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
#define ExFreePoolWithTag(_P, _T)
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG Offset
_In_ ULONG _In_ ULONG _In_ ULONG Length
static NTSTATUS NTAPI NtfsIoRunCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
NTSTATUS NtfsPerformIoRuns(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MajorFunction, IN ULONG SectorSize, IN OUT PUCHAR Buffer, IN PNTFS_IO_RUN_LIST RunList, IN BOOLEAN Override, OUT PULONG BytesTransferred OPTIONAL)
static NTSTATUS NtfsPerformIoRunsInternal(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MajorFunction, IN ULONG SectorSize, IN OUT PUCHAR Buffer, IN PMDL BorrowedMdl OPTIONAL, IN PNTFS_IO_RUN_LIST RunList, IN BOOLEAN Override, OUT PULONG BytesTransferred OPTIONAL)
NTSTATUS NtfsFlushDevice(IN PDEVICE_OBJECT DeviceObject)
static NTSTATUS NTAPI NtfsForwardedIrpCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
VOID NtfsFreeIoRunList(IN OUT PNTFS_IO_RUN_LIST RunList)
static NTSTATUS NtfsBuildIoRunIrp(IN PDEVICE_OBJECT DeviceObject, IN PNTFS_IO_CONTEXT IoContext, IN UCHAR MajorFunction, IN PUCHAR Buffer, IN ULONG BufferLength, IN OUT PNTFS_IO_RUN Run, IN BOOLEAN Override)
NTSTATUS NtfsWriteDisk(IN PDEVICE_OBJECT DeviceObject, IN LONGLONG StartingOffset, IN ULONG Length, IN ULONG SectorSize, IN const PUCHAR Buffer)
NTSTATUS NtfsAddIoRun(IN OUT PNTFS_IO_RUN_LIST RunList, IN LONGLONG Lbo, IN ULONG ByteCount)
NTSTATUS NtfsReadSectors(IN PDEVICE_OBJECT DeviceObject, IN ULONG DiskSector, IN ULONG SectorCount, IN ULONG SectorSize, IN OUT PUCHAR Buffer, IN BOOLEAN Override)
NTSTATUS NtfsDeviceIoControl(IN PDEVICE_OBJECT DeviceObject, IN ULONG ControlCode, IN PVOID InputBuffer, IN ULONG InputBufferSize, IN OUT PVOID OutputBuffer, IN OUT PULONG OutputBufferSize, IN BOOLEAN Override)
VOID NtfsInitIoRunList(OUT PNTFS_IO_RUN_LIST RunList)
NTSTATUS NtfsPerformIrpIoRuns(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MajorFunction, IN ULONG SectorSize, IN PIRP Irp, IN OUT PUCHAR Buffer, IN PNTFS_IO_RUN_LIST RunList, IN BOOLEAN Override, OUT PULONG BytesTransferred)
static NTSTATUS NtfsIssueIoRuns(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MajorFunction, IN OUT PUCHAR Buffer, IN PMDL BorrowedMdl OPTIONAL, IN PNTFS_IO_RUN_LIST RunList, IN BOOLEAN Override, OUT PULONG BytesTransferred)
NTSTATUS NtfsReadDisk(IN PDEVICE_OBJECT DeviceObject, IN LONGLONG StartingOffset, IN ULONG Length, IN ULONG SectorSize, IN OUT PUCHAR Buffer, IN BOOLEAN Override)
static NTSTATUS NtfsForwardIrpToRun(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MajorFunction, IN PIRP Irp, IN PNTFS_IO_RUN Run, IN BOOLEAN Override, OUT PULONG BytesTransferred)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
VOID NTAPI IoFreeIrp(IN PIRP Irp)
#define STATUS_UNEXPECTED_IO_ERROR
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define STATUS_MORE_PROCESSING_REQUIRED
PULONG MinorVersion OPTIONAL
volatile LONG BytesTransferred
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _In_ PWDF_USB_CONTROL_SETUP_PACKET _In_opt_ PWDF_MEMORY_DESCRIPTOR _Out_opt_ PULONG BytesTransferred
_IRQL_requires_same_ typedef _In_ ULONG ControlCode
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define SL_OVERRIDE_VERIFY_VOLUME
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _In_ LARGE_INTEGER ByteCount
#define IRP_MJ_FLUSH_BUFFERS
#define MmGetMdlByteCount(_Mdl)
#define MmGetMdlVirtualAddress(_Mdl)
FORCEINLINE PVOID RtlSecureZeroMemory(_Out_writes_bytes_all_(Size) PVOID Pointer, _In_ SIZE_T Size)