直接读写磁盘扇区
2014-06-05 17:50
381 查看
DDK示例中的代码。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
NTSTATUS
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
FltReadSectors(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PDEVICE_OBJECT DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
OUT PVOID Buffer,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN ULONG Length,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN LONGLONG ByteOffset,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN BOOLEAN Wait
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/*++
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Routine Description:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
This routine tries to read the data from the disk.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Arguments:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
DeviceObject - the lower device in the stack
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Buffer - the buffer which hold the data
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Length - the data length want to read
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ByteOffset - the data offset on the disk
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Return Value:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NT Status is returned.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
--*/
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
PIRP irp;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IO_STATUS_BLOCK iosb;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KEVENT event;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NTSTATUS status;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
irp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ, DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Buffer, Length, (PLARGE_INTEGER) &ByteOffset, &iosb);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (!irp) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return STATUS_INSUFFICIENT_RESOURCES;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (Wait) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeInitializeEvent(&event, NotificationEvent, FALSE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
&event, TRUE, TRUE, TRUE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = IoCallDriver(DeviceObject, irp);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (STATUS_PENDING == status) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = iosb.Status;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NULL, TRUE, TRUE, TRUE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
irp->UserIosb = NULL;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = IoCallDriver(DeviceObject, irp);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return status;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
NTSTATUS
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
FltWriteSectors(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PDEVICE_OBJECT DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PVOID Buffer,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN ULONG Length,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN LONGLONG ByteOffset,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN BOOLEAN Wait
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/*++
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Routine Description:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
This routine tries to write the data to the disk.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Arguments:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
DeviceObject - the lower device in the stack
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Buffer - the buffer which hold the data
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Length - the data length want to read
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ByteOffset - the data offset on the disk
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Return Value:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NT Status is returned.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
--*/
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
PIRP irp;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IO_STATUS_BLOCK iosb;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KEVENT event;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NTSTATUS status;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
irp = IoBuildAsynchronousFsdRequest(IRP_MJ_WRITE, DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Buffer, Length, (PLARGE_INTEGER) &ByteOffset, &iosb);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (!irp) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return STATUS_INSUFFICIENT_RESOURCES;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (Wait) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeInitializeEvent(&event, NotificationEvent, FALSE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
&event, TRUE, TRUE, TRUE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = IoCallDriver(DeviceObject, irp);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (STATUS_PENDING == status) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = iosb.Status;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NULL, TRUE, TRUE, TRUE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
irp->UserIosb = NULL;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = IoCallDriver(DeviceObject, irp);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return status;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
NTSTATUS
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
FltReadWriteSectorsCompletion(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PDEVICE_OBJECT DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PIRP Irp,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PVOID Context
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/*++
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Routine Description:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
A completion routine for use when calling the lower device objects to
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
which our filter deviceobject is attached.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Arguments:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
DeviceObject - Pointer to deviceobject
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Irp - Pointer to a PnP Irp.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Context - NULL or PKEVENT
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Return Value:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NT Status is returned.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
--*/
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
PMDL mdl;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
UNREFERENCED_PARAMETER(DeviceObject);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// Free resources
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (Irp->AssociatedIrp.SystemBuffer && (Irp->Flags & IRP_DEALLOCATE_BUFFER)) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ExFreePool(Irp->AssociatedIrp.SystemBuffer);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while (Irp->MdlAddress) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
mdl = Irp->MdlAddress;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Irp->MdlAddress = mdl->Next;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MmUnlockPages(mdl);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoFreeMdl(mdl);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (Irp->PendingReturned && (Context != NULL)) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
*Irp->UserIosb = Irp->IoStatus;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeSetEvent((PKEVENT) Context, IO_DISK_INCREMENT, FALSE);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoFreeIrp(Irp);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// Don't touch irp any more
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return STATUS_MORE_PROCESSING_REQUIRED;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
NTSTATUS
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
FltReadSectors(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PDEVICE_OBJECT DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
OUT PVOID Buffer,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN ULONG Length,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN LONGLONG ByteOffset,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN BOOLEAN Wait
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/*++
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Routine Description:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
This routine tries to read the data from the disk.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Arguments:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
DeviceObject - the lower device in the stack
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Buffer - the buffer which hold the data
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Length - the data length want to read
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ByteOffset - the data offset on the disk
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Return Value:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NT Status is returned.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
--*/
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
PIRP irp;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IO_STATUS_BLOCK iosb;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KEVENT event;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NTSTATUS status;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
irp = IoBuildAsynchronousFsdRequest(IRP_MJ_READ, DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Buffer, Length, (PLARGE_INTEGER) &ByteOffset, &iosb);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (!irp) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return STATUS_INSUFFICIENT_RESOURCES;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (Wait) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeInitializeEvent(&event, NotificationEvent, FALSE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
&event, TRUE, TRUE, TRUE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = IoCallDriver(DeviceObject, irp);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (STATUS_PENDING == status) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = iosb.Status;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NULL, TRUE, TRUE, TRUE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
irp->UserIosb = NULL;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = IoCallDriver(DeviceObject, irp);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return status;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
NTSTATUS
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
FltWriteSectors(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PDEVICE_OBJECT DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PVOID Buffer,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN ULONG Length,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN LONGLONG ByteOffset,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN BOOLEAN Wait
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/*++
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Routine Description:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
This routine tries to write the data to the disk.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Arguments:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
DeviceObject - the lower device in the stack
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Buffer - the buffer which hold the data
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Length - the data length want to read
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ByteOffset - the data offset on the disk
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Return Value:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NT Status is returned.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
--*/
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
PIRP irp;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IO_STATUS_BLOCK iosb;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KEVENT event;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NTSTATUS status;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
irp = IoBuildAsynchronousFsdRequest(IRP_MJ_WRITE, DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Buffer, Length, (PLARGE_INTEGER) &ByteOffset, &iosb);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (!irp) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return STATUS_INSUFFICIENT_RESOURCES;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (Wait) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeInitializeEvent(&event, NotificationEvent, FALSE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
&event, TRUE, TRUE, TRUE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = IoCallDriver(DeviceObject, irp);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (STATUS_PENDING == status) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = iosb.Status;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} else {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NULL, TRUE, TRUE, TRUE);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
irp->UserIosb = NULL;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
status = IoCallDriver(DeviceObject, irp);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return status;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
NTSTATUS
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
FltReadWriteSectorsCompletion(
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PDEVICE_OBJECT DeviceObject,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PIRP Irp,
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
IN PVOID Context
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/*++
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Routine Description:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
A completion routine for use when calling the lower device objects to
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
which our filter deviceobject is attached.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Arguments:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
DeviceObject - Pointer to deviceobject
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Irp - Pointer to a PnP Irp.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Context - NULL or PKEVENT
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Return Value:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
NT Status is returned.
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
--*/
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
PMDL mdl;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
UNREFERENCED_PARAMETER(DeviceObject);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// Free resources
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (Irp->AssociatedIrp.SystemBuffer && (Irp->Flags & IRP_DEALLOCATE_BUFFER)) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ExFreePool(Irp->AssociatedIrp.SystemBuffer);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while (Irp->MdlAddress) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
mdl = Irp->MdlAddress;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Irp->MdlAddress = mdl->Next;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MmUnlockPages(mdl);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoFreeMdl(mdl);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (Irp->PendingReturned && (Context != NULL)) {
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
*Irp->UserIosb = Irp->IoStatus;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
KeSetEvent((PKEVENT) Context, IO_DISK_INCREMENT, FALSE);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
IoFreeIrp(Irp);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// Don't touch irp any more
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return STATUS_MORE_PROCESSING_REQUIRED;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
相关文章推荐
- Windows 2000下对磁盘扇区数据的直接读写访问方法
- 构造IRP 直接读写磁盘扇区内容
- VC++实现Win200直接读写磁盘扇区
- VC++实现Win2000下直接读写磁盘扇区
- Win2000下直接读写磁盘扇区
- WinCE系统下应用程序直接读写存储设备(U盘)磁盘扇区
- [Win32] 直接读写磁盘扇区(磁盘绝对读写)
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
- VC++怎么实现Win2000下直接读写磁盘扇区
- WinNT平台下直接读写磁盘扇区
- VC++实现Win2000下直接读写磁盘扇区
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写 分类: 磁盘的扇区读写 2015-04-29 10:48 341人阅读 评论(0) 收藏
- [Win32] 直接读写磁盘扇区(磁盘绝对读写)
- Win2000下直接读写磁盘扇区
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
- VC++实现Win2000下直接读写磁盘扇区
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
- VC++实现Win2000下直接读写磁盘扇区
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写