liangyufei
驱动小牛
驱动小牛
  • 注册日期2006-01-16
  • 最后登录2021-10-12
  • 粉丝0
  • 关注0
  • 积分1019分
  • 威望588点
  • 贡献值2点
  • 好评度95点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2520回复:1

求助:ZwWriteFile导致系统死机

楼主#
更多 发布于:2009-10-23 09:03
我写了一个NDIS的驱动,在里面建了一个线程用来把从网络上得到的数据写到文件中去。程序开始运行正常,但运行一段时间后总会死机,我加了调试输出,发现死在ZwWriteFile上,请教各位大虾,是何原因导致。创建和写代码如下:
          HANDLE g_hCacheFile = NULL
    NTSTATUS status;
    OBJECT_ATTRIBUTES oa;
    UNICODE_STRING usname;
    IO_STATUS_BLOCK iostatus;

    WCHAR            wcFileName[MAX_PATH];
    memset(wcFileName,0,sizeof(wcFileName));
    swprintf(wcFileName,L"\\??\\d:\\test.cth");
    RtlInitUnicodeString(&usname, wcFileName);    
    InitializeObjectAttributes(&oa, &usname, OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE , NULL, NULL);
    status = ZwCreateFile(&g_hCacheFile,
        GENERIC_READ|GENERIC_WRITE,
        &oa,
        &iostatus,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        0,
        FILE_OVERWRITE_IF,
        FILE_SYNCHRONOUS_IO_NONALERT|FILE_NO_INTERMEDIATE_BUFFERING,
        NULL,
        0);


    IO_STATUS_BLOCK    IOSB;
    LARGE_INTEGER    liOffset;
    NTSTATUS state;
    
    liOffset.QuadPart = nOffset;
    
    state = ZwWriteFile(
        g_hCacheFile,
        NULL,
        NULL,
        NULL,
        &IOSB,
        buffer,
        nLength,
        &liOffset,
        NULL
        );
其中写长度nLength是512的倍数。
clinton81
驱动牛犊
驱动牛犊
  • 注册日期2007-02-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分73分
  • 威望176点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-01-23 14:57
我也遇到这个问题。我做的过滤驱动,拦截用户写入动作时,将写入内容备份到指定文件。
用 ZwWriteFile 备份。结果死锁。死在 ZwWriteFile 写入大量数据时。我看了一下可能锁在 Lazy Write 里。
目标文件已经是 NO BUFFERING 打开的,仍然死锁。
不知道有没有哪位专家解决过这类问题。
游客

返回顶部