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

发送自己的irp(read、write)

楼主#
更多 发布于:2007-07-09 17:15
NTSTATUS
SpyBuildMyRWIrp(
                IN PDEVICE_OBJECT olddev,
                IN PIRP oldirp
                )
{
    PFILESPY_DEVICE_EXTENSION DevExt = (PFILESPY_DEVICE_EXTENSION) olddev->DeviceExtension;
    PIO_STACK_LOCATION oldIrpSp = IoGetCurrentIrpStackLocation(oldirp);

    PIO_STACK_LOCATION irpSp;
    PFILE_OBJECT FileObject = oldIrpSp->FileObject;
    PVOID Buffer = NULL;
    ULONG Length = MARKLEN;
    CHAR  RWFlag = 1;
    Buffer = ExAllocatePoolWithTag(NonPagedPool, oldIrpSp->Parameters.Write.Length, FILESPY_POOL_TAG);
    if(Buffer == NULL)
    {
        return 0;
    }
    RtlCopyMemory( Buffer, MARKSTRING, MARKLEN);

    if(RWFlag)
        irp = IoBuildAsynchronousFsdRequest(
        IRP_MJ_READ,dev,Buffer,*length,offset,NULL);
    else
        irp = IoBuildAsynchronousFsdRequest(
        IRP_MJ_WRITE,dev,Buffer,*length,offset,NULL);
    if(irp == NULL)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    irp->Flags = 0x43;    //
    KeInitializeEvent(&event,NotificationEvent,FALSE);
    my_context.event = &event;        
    IoSetCompletionRoutine(irp,MyIrpComplete,&my_context,TRUE,TRUE,TRUE);
    //Buffer是缓冲。在Irp中被用做UserBuffer接收数据。offset是 这次读的偏移量。以上代码构造一个读irp.请注意,此时您还没有设置FileObject.实际上我是这样发出请求的:
        
    irpsp = IoGetNextIrpStackLocation(irp);
    // 关键:  FileObject是否只需要设置此元素???如果我的加密标识放在文件尾部,我怎么得倒尾部的offset呢???
    FileObject->CurrentByteOffset = 10;
    irpsp->FileObject = FileObject;
    status = IoCallDriver(dev,irp);
    irp = NULL;
    if(status == STATUS_PENDING)
        KeWaitForSingleObject(&event,Executive,KernelMode,FALSE,NULL);
    {
        UNICODE_STRING    tempstr;
        RtlInitUnicodeString( &tempstr, L"\\tt111.txt" );
        
        //KdPrint(("sfilter!SpyRead: tempstr: in 00 [%ws]--[%ws]\n", IrpSp->FileObject->FileName.Buffer, tempstr.Buffer));
        if(!RtlEqualUnicodeString(Buffer , &tempstr, TRUE))
        {
            KdPrint(("spy! SpyBuildMyRWIrp: %ws", Buffer))
        }
    }
        
    return STATUS_SUCCESS;

}

// 再看看MyIrpComplete如何收场:
// 一个通用的irp完成函数:
static NTSTATUS MyIrpComplete (
                               PDEVICE_OBJECT dev,
                               PIRP irp,
                               PVOID context)
{
    PMY_READ_CONTEXT my_context = (PMY_READ_CONTEXT)context;
    KeSetEvent(my_context->event,IO_NO_INCREMENT,FALSE);
    my_context->information = irp->IoStatus.Information;
    my_context->status = irp->IoStatus.Status;
    // 释放irp,过程非常复杂
    if (irp->MdlAddress)
    {
        MmUnmapLockedPages(
            MmGetSystemAddressForMdl(irp->MdlAddress),
            irp->MdlAddress);
        MmUnlockPages(irp->MdlAddress);
        IoFreeMdl(irp->MdlAddress);
    }
    IoFreeIrp(irp);    
    // 返回处理未结束.???
    return STATUS_MORE_PROCESSING_REQUIRED;
}
                            

问题::    
   1.  FileObject是否只需要设置此元素???如果我的加密标识放在文件尾部,我怎么得倒尾部的offset呢???
   2.  // 返回处理未结束.??? 什么“未结果”,以后需要怎么处理???


楚老大的书给人一种感觉:没看郁闷,看完了更郁闷!!!

最新喜欢:

rhpengrhpeng
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-09 17:16
问题::    
  1.  FileObject是否只需要设置此元素???如果我的加密标识放在文件尾部,我怎么得倒尾部的offset呢???
  2.  // 返回处理未结束.??? 什么“未结果”,以后需要怎么处理???


楚老大的书给人一种感觉:没看郁闷,看完了更郁闷!!!
jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-09 20:31
这个问题不好办
向前,向前,向前....
游客

返回顶部