-
-
想做个硬盘克隆软件,ZwWriteFile写硬盘速度慢,折腾了我2个多星期了,大侠帮帮忙啊!
-
发表于:
2011-8-24 17:26
10297
-
想做个硬盘克隆软件,ZwWriteFile写硬盘速度慢,折腾了我2个多星期了,大侠帮帮忙啊!
在创建的内核线程里,最简单的循环调用ZwWriteFile写二进制数据到\\??\\PhysicalDrive1,速度大概只有硬盘速度的40%。

ZwCreateFile参数调整过N多次了,异步同步方式都用了,还是慢啊!
如果将ZwWriteFile换成ZwReadFile,测试读取硬盘数据的速度,速度能达到硬盘速度的100%。
大侠帮帮忙,有什么更快的写入方式啊?

此情况是在单一线程,仅做写数据测试得出的速度。
网上听一朋友说,ZwWriteFile在写入数据到硬盘后,会再将数据读出来进行效验,所以慢,是这样的吗?
如果是这样,有什么方法可以不效验,仅写入吗?
VOID XThreadDiskCloneWrite(PVOID Context)
{
XDiskCloneInformation *DiskClone = (XDiskCloneInformation *)Context;
XCopyBuffer *CopyBuffer = DiskClone->CopyBuffer;
if (KeGetCurrentIrql() != PASSIVE_LEVEL)
{
DiskClone->Status = STATUS_UNSUCCESSFUL;
PsTerminateSystemThread(STATUS_UNSUCCESSFUL);
}
UNICODE_STRING DiskName;
RtlInitUnicodeString(&DiskName, DiskClone->DestinationDiskName);
OBJECT_ATTRIBUTES ObjectAttributes;
InitializeObjectAttributes(&ObjectAttributes, &DiskName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, NULL);
HANDLE DiskHandle;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS status = ZwCreateFile(&DiskHandle, SYNCHRONIZE | FILE_WRITE_DATA, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_WRITE_THROUGH | FILE_NO_INTERMEDIATE_BUFFERING/* | FILE_RANDOM_ACCESS*/, NULL, 0);
if (!NT_SUCCESS(status))
{
xlogError2("Failed to ZwCreateFile()", status);
DiskClone->Status = status;
PsTerminateSystemThread(status);
}
int Index = 0;
LARGE_INTEGER TotalWriteSize = {0, 0};
int CopyBufferNumber = sizeof(DiskClone->CopyBuffer)/sizeof(XCopyBuffer);
xlogInfo("磁盘克隆写开始");
ULONG TickCount = XGetTickCount();
while (TRUE)
{
XCopyBuffer *CopyBuffer = (XCopyBuffer*)&DiskClone->CopyBuffer[Index];
status = ZwWriteFile(DiskHandle, NULL, NULL, Context, &IoStatusBlock, CopyBuffer->Buffer, CopyBuffer->Length, &TotalWriteSize, NULL);
if (!NT_SUCCESS(status))
{
ZwClose(DiskHandle);
DiskClone->Status = status;
PsTerminateSystemThread(status);
}
TotalWriteSize.QuadPart += CopyBuffer->Length;
if (TotalWriteSize.QuadPart >= DiskClone->SourceDiskTotalSize.QuadPart)
{
xlog("磁盘克隆写完成, index: [%d], write size: [%I64u], spare time: [%d]ms\n", Index, TotalWriteSize, XGetTickCount()-TickCount);
ZwClose(DiskHandle);
DiskClone->Status = STATUS_SUCCESS;
PsTerminateSystemThread(STATUS_SUCCESS);
}
++Index;
}
}
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!