iniwf

风是温柔的,雨是伤心的,云是快乐的,月是多情的,爱是迷失的,恋是醉人的,情是难忘的,天是长久的,地是永恒的

构造IRP 直接读写磁盘扇区内容

DDK示例中的代码。

NTSTATUS
FltReadSectors(
    IN PDEVICE_OBJECT DeviceObject,
    OUT PVOID Buffer,
    IN ULONG Length,
    IN LONGLONG ByteOffset,
    IN BOOLEAN Wait
    )
/*++

Routine Description:

    This routine tries to read the data from the disk.

Arguments:

    DeviceObject - the lower device in the stack
    Buffer      - the buffer which hold the data
    Length      - the data length want to read
    ByteOffset - the data offset on the disk
       
Return Value:

    NT Status is returned.

--
*/

{
    PIRP                irp;
    IO_STATUS_BLOCK        iosb;
    KEVENT                
event;
    NTSTATUS            status;

    irp 
= IoBuildAsynchronousFsdRequest(IRP_MJ_READ, DeviceObject,
        Buffer, Length, (PLARGE_INTEGER) 
&ByteOffset, &iosb);
    
if (!irp) {
        
return STATUS_INSUFFICIENT_RESOURCES;
    }


    
if (Wait) {
        KeInitializeEvent(
&event, NotificationEvent, FALSE);
        IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
            
&event, TRUE, TRUE, TRUE);

        status 
= IoCallDriver(DeviceObject, irp);
        
if (STATUS_PENDING == status) {
            KeWaitForSingleObject(
&event, Executive, KernelMode, FALSE, NULL);
            status 
= iosb.Status;
        }

    }
 else {
        IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
            NULL, TRUE, TRUE, TRUE);
        irp
->UserIosb = NULL;
        status 
= IoCallDriver(DeviceObject, irp);
    }


    
return status;
}


NTSTATUS
FltWriteSectors(
    IN PDEVICE_OBJECT DeviceObject,
    IN PVOID Buffer,
    IN ULONG Length,
    IN LONGLONG ByteOffset,
    IN BOOLEAN Wait
    )
/*++

Routine Description:

    This routine tries to write the data to the disk.

Arguments:

    DeviceObject - the lower device in the stack
    Buffer      - the buffer which hold the data
    Length      - the data length want to read
    ByteOffset - the data offset on the disk
       
Return Value:

    NT Status is returned.

--
*/

{
    PIRP                irp;
    IO_STATUS_BLOCK        iosb;
    KEVENT                
event;
    NTSTATUS            status;

    irp 
= IoBuildAsynchronousFsdRequest(IRP_MJ_WRITE, DeviceObject,
        Buffer, Length, (PLARGE_INTEGER) 
&ByteOffset, &iosb);
    
if (!irp) {
        
return STATUS_INSUFFICIENT_RESOURCES;
    }


    
if (Wait) {
        KeInitializeEvent(
&event, NotificationEvent, FALSE);
        IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
            
&event, TRUE, TRUE, TRUE);

        status 
= IoCallDriver(DeviceObject, irp);
        
if (STATUS_PENDING == status) {
            KeWaitForSingleObject(
&event, Executive, KernelMode, FALSE, NULL);
            status 
= iosb.Status;
        }

    }
 else {
        IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
            NULL, TRUE, TRUE, TRUE);
        irp
->UserIosb = NULL;
        status 
= IoCallDriver(DeviceObject, irp);
    }


    
return status;
}


NTSTATUS
FltReadWriteSectorsCompletion(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
/*++
Routine Description:
    A completion routine for use when calling the lower device objects to
    which our filter deviceobject is attached.

Arguments:

    DeviceObject - Pointer to deviceobject
    Irp         - Pointer to a PnP Irp.
    Context     - NULL or PKEVENT
Return Value:

    NT Status is returned.

--
*/

{
    PMDL     mdl;
   
    UNREFERENCED_PARAMETER(DeviceObject);

    
//
    
// Free resources
    
//

    
if (Irp->AssociatedIrp.SystemBuffer && (Irp->Flags & IRP_DEALLOCATE_BUFFER)) {
        ExFreePool(Irp
->AssociatedIrp.SystemBuffer);
    }


    
while (Irp->MdlAddress) {
        mdl 
= Irp->MdlAddress;
        Irp
->MdlAddress = mdl->Next;
        MmUnlockPages(mdl);
        IoFreeMdl(mdl);
    }


    
if (Irp->PendingReturned && (Context != NULL)) {
        
*Irp->UserIosb = Irp->IoStatus;
        KeSetEvent((PKEVENT) Context, IO_DISK_INCREMENT, FALSE);
    }


    IoFreeIrp(Irp);

    
//
    
// Don't touch irp any more
    
//
    return STATUS_MORE_PROCESSING_REQUIRED;
}

转自http://hi.baidu.com/combojiang/blog/item/ccc9d6f419ae95e87609d712.html

posted on 2009-03-23 22:18 iniwf 阅读(981) 评论(0)  编辑 收藏 引用 所属分类: 驱动


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

收藏夹

IT技术

积分与排名

最新评论

阅读排行榜

评论排行榜