wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
阅读:1282回复:0

帮我看看我的这段代码。。。

楼主#
更多 发布于:2007-07-16 13:28
实现功能: 在sfcreate中发送自己的irp(read)并得到数据


1. 在sfcreate中的得到全路径后调用(发送自建的irp)

运行调试的过程:
1. irp经过sfread、sfreadcomplete、SfIssueReadWriteIrpSynchronously、irpCompletion
2. 在sfread、sfreadcomplete、SfIssueReadWriteIrpSynchronously、irpCompletion中都能看到Buffer的长度,但是Buffer为空
3. 程序运行的过程,先后顺序 sfread->sfreadcomplete->SfIssueReadWriteIrpSynchronously>irpCompletion
4. Buffer为空,为什么??问题所在
5. ntfs下可以调试,fat下黑屏,我正在调试。。。
static NTSTATUS irpCompletion(
                              PDEVICE_OBJECT  DeviceObject,
                              PIRP            Irp,
                              PVOID           Context
                              )
{
    UNREFERENCED_PARAMETER( DeviceObject );
    UNREFERENCED_PARAMETER( Context );
    KeSetEvent(Irp->UserEvent, 0, FALSE);   // Signal event
    *Irp->UserIosb = Irp->IoStatus;         // Copy status information to
    // the user
    KdPrint(("sfilter!irpCompletion[%s]\n", Irp->UserBuffer));
    if (Irp->MdlAddress)
    {
        MmUnmapLockedPages(
            MmGetSystemAddressForMdl(Irp->MdlAddress),
            Irp->MdlAddress);
        MmUnlockPages(Irp->MdlAddress);
        IoFreeMdl(Irp->MdlAddress);
    }
                
    IoFreeIrp(Irp);                         // Free IRP
    
    return STATUS_MORE_PROCESSING_REQUIRED; // Tell the I/O manager to stop
}

NTSTATUS
SfIssueReadWriteIrpSynchronously(
                                 IN PDEVICE_OBJECT DeviceObject,
                                 IN PFILE_OBJECT FileObject,
                                 IN ULONG MajorFunction,
                                 IN PIO_STATUS_BLOCK IoStatus,
                                 IN PVOID Buffer,
                                 IN ULONG Length,
                                 IN PLARGE_INTEGER ByteOffset,
                                 IN ULONG IrpFlags
                                 )
{
    PIRP Irp = NULL;
    PIO_STACK_LOCATION IrpSp = NULL;
    KEVENT Event;
    NTSTATUS Status;
    
    UNREFERENCED_PARAMETER( IrpFlags );
    ASSERT((MajorFunction == IRP_MJ_READ) || (MajorFunction == IRP_MJ_WRITE));
    
    KeInitializeEvent(&Event, NotificationEvent, FALSE);
    
    Irp = IoBuildAsynchronousFsdRequest(
        MajorFunction,
        DeviceObject,
        Buffer,
        Length,
        ByteOffset,
        //&Event,
        IoStatus
        );
    if (!Irp)
        return STATUS_INSUFFICIENT_RESOURCES;

    Irp->Flags = IRP_NOCACHE ;//IRP_READ_OPERATION | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO;//IRP_PAGING_IO+IRP_NOCACHE+IRP_SYNCHRONOUS_PAGING_IO(0x43);
    Irp->RequestorMode = KernelMode;
    Irp->UserEvent = &Event;
    
    IrpSp = IoGetNextIrpStackLocation(Irp);
    IrpSp->FileObject = FileObject;
    IrpSp->DeviceObject = DeviceObject;    
    KdPrint(("sfilter!SfIssueReadWriteIrpSynchronously: Length = [%d]\n", IrpSp->Parameters.Read.Length));
    KdPrint(("sfilter!SfIssueReadWriteIrpSynchronously: ByteOffset = [%d]\n", IrpSp->Parameters.Read.ByteOffset));
    IoSetCompletionRoutine(Irp, &irpCompletion, 0, TRUE, TRUE, TRUE);
    Status = IoCallDriver(DeviceObject, Irp);
    //Irp = NULL;
    if (STATUS_PENDING == Status)
    {
        KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
    }
    KdPrint(("sfilter!SfIssueReadWriteIrpSynchronously[%s]\n",Buffer));
    KdPrint(("sfilter!SfIssueReadWriteIrpSynchronously[%ws]\n",Buffer));
    
    return IoStatus->Status;
}

NTSTATUS
SfEncryptDecryptFileByFileObject(
                                 IN PDEVICE_OBJECT DeviceObject,
                                 IN PFILE_OBJECT FileObject
                                 )
{
    IO_STATUS_BLOCK IoStatus = {0};
    NTSTATUS Status;
    PVOID Buffer = NULL;
    LARGE_INTEGER    ByteOffset;
    ULONG            Length = MARKLEN;
    LARGE_INTEGER    OrigByteOffset;
    
    ByteOffset = FileObject->CurrentByteOffset;
    
    while(TRUE) {
        IoStatus.Status = STATUS_SUCCESS;
        IoStatus.Information = 0;
        Buffer = ExAllocatePool( NonPagedPool, Length );
        if(Buffer == NULL)
            break;
        RtlZeroMemory(Buffer, MARKLEN );
        RtlFillMemory(Buffer, MARKLEN-1, 'H');
        *((PCHAR)(Buffer) + MARKLEN-1) = 0;
        
        OrigByteOffset = FileObject->CurrentByteOffset;
        
        Status = SfIssueReadWriteIrpSynchronously(
            DeviceObject,
            FileObject,
            IRP_MJ_READ,
            &IoStatus,    
            Buffer,
            Length,
            &ByteOffset,
            0
            );
        
        // Restore the original byte offset
        FileObject->CurrentByteOffset = OrigByteOffset;
        if (!NT_SUCCESS(Status))
        {
            if (STATUS_END_OF_FILE == Status) {
                Status = STATUS_SUCCESS;
                KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: Status == STATUS_END_OF_FILE\n"));
            }
            break;
        }
        
        if (0 == IoStatus.Information)
        {
            KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: IoStatus.Information == 0 and %d\n", strlen(Buffer)));
            break;
        }
        break;
    }
    KdPrint(("sfilter!SfEncryptDecryptFileByFileObject: buffer: [%d][%s]\n", strlen(Buffer), Buffer));
    if (Buffer != NULL)
    {
        ExFreePool( Buffer );
    }

    return Status;
}

游客

返回顶部