chongchong
驱动牛犊
驱动牛犊
  • 注册日期2006-09-21
  • 最后登录2007-09-08
  • 粉丝0
  • 关注0
  • 积分280分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
阅读:1374回复:5

文件映射的疑问

楼主#
更多 发布于:2007-03-29 16:21
  如果一个文件已经被映射到内存了
我还能在我的程序中用ZWCreateFile打开进行读写操作吗
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-29 16:24
可以!
创造美好的未来生活!!!
boliyu
驱动牛犊
驱动牛犊
  • 注册日期2006-09-20
  • 最后登录2007-07-24
  • 粉丝0
  • 关注0
  • 积分190分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-29 16:57
在hookcreatesection里面
用IOworkqueue的方式调用了一下这个函数
会出现KERNEL_STACK_INPAGE_ERROR的错误,是为什么呢?
void GetCheckSum(PGETCHECKSUMDATA Data)
{
    HANDLE hFileHandle = NULL;
    NTSTATUS ntStatus;
    IO_STATUS_BLOCK IoStatus;
    PCHAR pbData=NULL;
    DWORD nFileLen=0;
    DWORD ntemLen =0;
    DWORD ReadFileLen = 4*1024;
    FILE_STANDARD_INFORMATION StandardFileInfo;
    DWORD i = 0;
    LARGE_INTEGER  Byteoffset;

    ntStatus = ObOpenObjectByPointer(Data->pFileObject,
                                   OBJ_KERNEL_HANDLE,
                                   NULL,
                                   SYNCHRONIZE|GENERIC_READ,
                                   *IoFileObjectType,
                                   KernelMode,
                                   &hFileHandle);
    if(!NT_SUCCESS(ntStatus))
    {
        KdPrint(("ProcessCheckSum: ObOpenObjectByPointer Failed! Error Code: %x\n", ntStatus));        
        Data->CheckSum = 0;
        KeSetEvent(&(Data->event), IO_NO_INCREMENT, FALSE);
        return;
    }

    pbData=(PCHAR)ExAllocatePool(NonPagedPool, ReadFileLen);
    
    if (pbData==NULL)
    {
        //zz KdPrint(("ProcessCheckSum: ExAllocatePool failed!\n"));
        ZwClose(hFileHandle);
        Data->CheckSum = 0;
        KeSetEvent(&(Data->event), IO_NO_INCREMENT, FALSE);
        return;
    }
    RtlZeroMemory(pbData,ReadFileLen);

    do
    {
        ntStatus=ZwReadFile(hFileHandle,
            NULL,
            NULL,
            NULL,
            &IoStatus,
            (PVOID)pbData,
            ReadFileLen,
            NULL,
            NULL);
        if(ntStatus != STATUS_SUCCESS)
        {
            //zz KdPrint(("ProcessCheckSum: ZwReadFile %s Failed\n", pFile));
            ZwClose(hFileHandle);
            ExFreePool(pbData);
            Data->CheckSum = 0;
            KeSetEvent(&(Data->event), IO_NO_INCREMENT, FALSE);
            return;
        }
        CheckSum(&(Data->CheckSum),pbData,ReadFileLen);
        //
    }while (IoStatus.Information != STATUS_END_OF_FILE);
    
    
    ZwClose(hFileHandle);
    ExFreePool(pbData);
    KeSetEvent(&(Data->event), IO_NO_INCREMENT, FALSE);
    return;
}
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-29 17:01
忘记了.好像.可以.
创造美好的未来生活!!!
yaolixing
驱动小牛
驱动小牛
  • 注册日期2006-06-27
  • 最后登录2010-07-15
  • 粉丝1
  • 关注0
  • 积分991分
  • 威望135点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-10 16:47
可能是文件读写属性设置不一致
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
5楼#
发布于:2007-04-11 08:01
既然有了FILE_OBJECT就直接IRP操作吧,再转换成HANDLE就存在权限问题
人总在矛盾中徘徊。。。
游客

返回顶部