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

tooflat老大,快来啊,create中读标识的问题

楼主#
更多 发布于:2007-07-12 13:45
tooflat的代码, 我应用了,可是,我读出来的是“??????”乱码,为什么???
我在我的sfread中有异或加解密,本来怀疑是它的问题,可是,我去掉了后,还是一样,啊。。。。。。??????????


下面的代码在sfcreate中得倒文件全路径后调用的。

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);
    
    IrpSp = IoGetNextIrpStackLocation(Irp);
    IrpSp->FileObject = FileObject;
    
    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;
    UCHAR Buffer[512] = {'\0'};
    LARGE_INTEGER ByteOffset;
    ULONG Offset = 0;
    BOOLEAN EndOfFile = FALSE;
    
    ByteOffset.QuadPart = 0;

    RtlZeroMemory(Buffer, 512 * sizeof(CHAR));
    
    while (TRUE)
    {
        IoStatus.Status = STATUS_SUCCESS;
        IoStatus.Information = 0;
        
        Status = SfIssueReadWriteIrpSynchronously(
            DeviceObject,
            FileObject,
            IRP_MJ_READ,
            &IoStatus,    
            Buffer,
            sizeof(Buffer),
            &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)
        {
            ULONG j =0;
            KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: IoStatus.Information == 0 and %d\n", sizeof(Buffer)));
            
            KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: [%d][%s]\n", strlen(Buffer), Buffer));
             break;
        }
        
        if (IoStatus.Information < sizeof(Buffer))
            EndOfFile = TRUE;
        KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: in %s\n",Buffer));
       }
        
//        Status = SfIssueReadWriteIrpSynchronously(
//            DeviceObject,
//            FileObject,
//            IRP_MJ_WRITE,
//            &IoStatus,    
//            Buffer,
//            IoStatus.Information,
//            &ByteOffset,
//            0
//            );
//        if (!NT_SUCCESS(Status))
//        {
//            if (STATUS_END_OF_FILE == Status)
//                Status = STATUS_SUCCESS;
//            
//            break;
//        }
//        
//        if (EndOfFile)
//            break;
        
        ByteOffset.QuadPart += sizeof(Buffer);

        // by wengzuhong test start
        break;
        // by wengzuhong test end
    }
    
    return Status;
}
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-12 15:21
为什么总是进入if (0 == IoStatus.Information)中啊
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-13 13:11
file size == 0 ??
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-13 13:29
文件中有数据啊 (测试的文件:12094byte)
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-13 13:32
我打印了一下Buffer的大小,结果发现,strlen(Buffer) = 0;
这是怎么回事??那我先前读出来的“???”又算什么?

在前面我都有RtlZeroMemory的动作的。
难道Buffer被清掉了?
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-07-13 13:36
确认一下:
是: 在sfcreate中得倒文件全路径后调用的SfEncryptDecryptFileByFileObject函数吗??
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-13 13:41
对了,我只对tt111.txt文件测试。

在sfread中也做了判断是否为tt111.txt文件。

我在sfcreate中调用SfEncryptDecryptFileByFileObject之前也做了判断是否为tt111.txt文件,那SfEncryptDecryptFileByFileObject的读动作会不会进入sfread中???会出什么问题?
oyclkelly
驱动牛犊
驱动牛犊
  • 注册日期2006-06-07
  • 最后登录2009-07-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-07-27 18:08
支持顶一下,请toolflat老大解答下
游客

返回顶部