mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 11:08:02 -06:00
Windows Driver: Reduce memory usage of IOCTL_DISK_VERIFY handler. Now we reader disk by chunks of at most 64 KiB. Fix https://github.com/veracrypt/VeraCrypt/issues/562.
This commit is contained in:
@@ -1384,7 +1384,8 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
IO_STATUS_BLOCK ioStatus;
|
IO_STATUS_BLOCK ioStatus;
|
||||||
PVOID buffer = TCalloc (max (pVerifyInformation->Length, PAGE_SIZE));
|
DWORD dwBuffersize = min (pVerifyInformation->Length, 16 * PAGE_SIZE);
|
||||||
|
PVOID buffer = TCalloc (dwBuffersize);
|
||||||
|
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
{
|
{
|
||||||
@@ -1392,14 +1393,29 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LARGE_INTEGER offset = pVerifyInformation->StartingOffset;
|
LARGE_INTEGER offset;
|
||||||
|
DWORD dwRemainingBytes = pVerifyInformation->Length, dwReadCount;
|
||||||
offset.QuadPart = ullNewOffset;
|
offset.QuadPart = ullNewOffset;
|
||||||
|
|
||||||
Irp->IoStatus.Status = ZwReadFile (Extension->hDeviceFile, NULL, NULL, NULL, &ioStatus, buffer, pVerifyInformation->Length, &offset, NULL);
|
while (dwRemainingBytes)
|
||||||
TCfree (buffer);
|
{
|
||||||
|
dwReadCount = min (dwBuffersize, dwRemainingBytes);
|
||||||
|
Irp->IoStatus.Status = ZwReadFile (Extension->hDeviceFile, NULL, NULL, NULL, &ioStatus, buffer, dwReadCount, &offset, NULL);
|
||||||
|
|
||||||
if (NT_SUCCESS (Irp->IoStatus.Status) && ioStatus.Information != pVerifyInformation->Length)
|
if (NT_SUCCESS (Irp->IoStatus.Status) && ioStatus.Information != dwReadCount)
|
||||||
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
{
|
||||||
|
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (!NT_SUCCESS (Irp->IoStatus.Status))
|
||||||
|
break;
|
||||||
|
|
||||||
|
dwRemainingBytes -= dwReadCount;
|
||||||
|
offset.QuadPart += (ULONGLONG) dwReadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
burn (buffer, dwBuffersize);
|
||||||
|
TCfree (buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user