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

tooflat老大,救救我吧,请教你的代码的问题啊

楼主#
更多 发布于:2007-07-13 04:10
我在sfcreate中得倒文件全路径后直接调用你的例程中的SfEncryptDecryptFileByFileObject函数(在下面贴出来了),可是总是进入if(inforation == 0)语句中,看了ifs help doc,发现 information == 0 标识read失败。

是不是下面的代码有错误???
还是调用的方法不对????如果不对,需要怎么调用??
救救我吧,尝试了好几天了。。。。
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;
    
    ASSERT((MajorFunction == IRP_MJ_READ) || (MajorFunction == IRP_MJ_WRITE));
    
    KeInitializeEvent(&Event, NotificationEvent, FALSE);
    
    Irp = IoBuildSynchronousFsdRequest(
        MajorFunction,
        DeviceObject,
        Buffer,
        Length,
        ByteOffset,
        &Event,
        IoStatus
        );
    if (!Irp)
        return STATUS_INSUFFICIENT_RESOURCES;
    
    Irp->Flags |= IrpFlags ;
    Irp->Flags |= IRP_NOCACHE;//IRP_PAGING_IO+IRP_NOCACHE+IRP_SYNCHRONOUS_PAGING_IO(0x43);
    Irp->Flags |= IRP_READ_OPERATION;//IRP_PAGING_IO+IRP_NOCACHE+IRP_SYNCHRONOUS_PAGING_IO(0x43);
    //Irp->Tail.Overlay.Thread = pIrp->Tail.Overlay.Thread;
    Irp->RequestorMode = KernelMode;
    
    IrpSp = IoGetNextIrpStackLocation(Irp);
    IrpSp->FileObject = FileObject;
    IrpSp->DeviceObject = DeviceObject;    
    Status = IoCallDriver(DeviceObject, Irp);
    if (STATUS_PENDING == Status)
    {
        KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
    }
    
    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;
    
    ByteOffset.QuadPart = 2;
    
    while(TRUE) {
        IoStatus.Status = STATUS_SUCCESS;
        IoStatus.Information = 0;
        Buffer = ExAllocatePool( NonPagedPool, 10 );
        RtlZeroMemory(Buffer, MARKLEN * sizeof(CHAR));
        Status = SfIssueReadWriteIrpSynchronously(
            DeviceObject,
            FileObject,
            IRP_MJ_READ,
            &IoStatus,    
            Buffer,
            MARKLEN * sizeof(CHAR),
            &ByteOffset,
            0
            );
        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;
    }
    if (Buffer != NULL)
    {
        ExFreePool( Buffer );
    }

    return Status;
}
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-13 04:14
还是不行啊,是不是irp、irpsp中的元素设置问题???
还有问题2:SfEncryptDecryptFileByFileObject调用后,是不是要到sfread中得倒数据,SfEncryptDecryptFileByFileObject中的Buffer变量会有数据吗??
游客

返回顶部