satanli1982
驱动牛犊
驱动牛犊
  • 注册日期2004-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1785回复:3

一个关于处理IRP_MJ_WRITE和IRP_MJ_WRITE的问题?

楼主#
更多 发布于:2004-05-18 17:38
我的在程序中修改了filespy的函数SpyLogIrp来截获IO的数据,函数SpyLogIrp会在irp产生和完成时两次被调用,由if (LoggingFlags & LOG_ORIGINATING_IRP)来区分,代码如下:

    PIO_STACK_LOCATION pIrpStack;
    PRECORD_IRP        pRecordIrp;
    PDEVICE_EXTENSION  deviceExtension;
    PUNICODE_STRING    volumeName;
    ULONG              lookupFlags;

ULONG ReadLength = Irp->IoStatus.Information;
PVOID pbuf;

    pRecordIrp = &RecordList->LogRecord.Record.RecordIrp;

    pIrpStack = IoGetCurrentIrpStackLocation(Irp);

//deal with the originating irp
    if (LoggingFlags & LOG_ORIGINATING_IRP) {

        pRecordIrp->IrpMajor        = pIrpStack->MajorFunction;
        pRecordIrp->IrpMinor        = pIrpStack->MinorFunction;
        pRecordIrp->IrpFlags        = Irp->Flags;
        pRecordIrp->FileObject      = (FILE_ID)pIrpStack->FileObject;
        pRecordIrp->ProcessId       = (FILE_ID)PsGetCurrentProcessId();
        pRecordIrp->ThreadId        = (FILE_ID)PsGetCurrentThreadId();
FEGetProcess( pRecordIrp->ProcessName );

//Deal with the write operation
if(pRecordIrp->IrpMajor == IRP_MJ_WRITE)
{
if((Irp->Flags & IRP_NOCACHE)&&(Irp->MdlAddress != NULL))
{
pbuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority );

if(ReadLength>=65535)ReadLength = 65534;

pRecordIrp->pIOContent[0] = (CHAR)1;
RtlCopyMemory((PVOID)(pRecordIrp->pIOContent+1), pbuf, ReadLength);
pRecordIrp->pIOContent[ReadLength+1] = \'\\0\';
}
else
{
pRecordIrp->pIOContent[0] = (CHAR)0;
}
}
else
{
pRecordIrp->pIOContent[0] = (CHAR)0;
}
        .........................
    }

//deal with the completion irp
    if (LoggingFlags & LOG_COMPLETION_IRP) {

        pRecordIrp->ReturnStatus   = Irp->IoStatus.Status;
        pRecordIrp->ReturnInformation = Irp->IoStatus.Information;

if(pRecordIrp->IrpMajor == IRP_MJ_READ)
{
if((Irp->Flags & IRP_NOCACHE)&&(Irp->MdlAddress != NULL))
{
pbuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority );

if(ReadLength>=65535)ReadLength = 65534;

pRecordIrp->pIOContent[0] = (CHAR)1;
RtlCopyMemory((PVOID)(pRecordIrp->pIOContent+1), pbuf, ReadLength);
pRecordIrp->pIOContent[ReadLength+1] = \'\\0\';
}
else
{
pRecordIrp->pIOContent[0] = (CHAR)0;
}
}
else
{
pRecordIrp->pIOContent[0] = (CHAR)0;
}
    }

    }

    //deal with the complete irp
    if (LoggingFlags & LOG_COMPLETION_IRP) {

        pRecordIrp->ReturnStatus   = Irp->IoStatus.Status;
        pRecordIrp->ReturnInformation = Irp->IoStatus.Information;
        
        if(pRecordIrp->IrpMajor == IRP_MJ_READ)
        {
if((Irp->Flags & IRP_NOCACHE)&&(Irp->MdlAddress != NULL))
{
 pbuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority );
if(ReadLength>=65535)ReadLength = 65534;
pRecordIrp->pIOContent[0] = (CHAR)1;
RtlCopyMemory((PVOID)(pRecordIrp->pIOContent+1), pbuf, ReadLength);
RecordIrp->pIOContent[ReadLength+1] = \'\\0\';
}
else
{
  pRecordIrp->pIOContent[0] = (CHAR)0;
}
}
else
{
pRecordIrp->pIOContent[0] = (CHAR)0;
}
    }
}

但是出现如下问题:
    当我把if(pRecordIrp->IrpMajor == IRP_MJ_WRITE)一段放入irp产生时调用的那段代码中时程序截获不了写入硬盘的数据,但是当我放入IoCompleteRoutine时调用的那段代码中时就可以,请问为生么?

   还有就是我截获的数据不完全是我想要的运用程序写入硬盘的数据还有一些类似FILE*和FILE0我不关心的数据,请问怎样区分写入硬盘的数据是否是运用程序写入硬盘的数据?

先谢了!!!~_~

最新喜欢:

znsoftznsoft
satanli1982
驱动牛犊
驱动牛犊
  • 注册日期2004-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-19 15:52
兄弟们随便嗯一声呀~_~
小弟万分感激!!!!!!!!!1
tzhcsoft
驱动牛犊
驱动牛犊
  • 注册日期2003-10-31
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-28 20:54
写入硬盘的操作是没有程序和系统的分别的,所以在文件层做HOOK是不实用的

[编辑 -  5/30/04 by  tzhcsoft]
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-07 23:00
写入硬盘的操作是没有程序和系统的分别的,所以在文件层做HOOK是不实用的

[编辑 -  5/30/04 by  tzhcsoft]

还有什么更好的方法吗?(是Hook service吗???)如果有不妨公布一下
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部