foxhhj
驱动牛犊
驱动牛犊
  • 注册日期2007-06-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:3436回复:8

请教关于用ZwCreateFile和ZwWriteFile写文件的问题。

楼主#
更多 发布于:2007-06-29 11:28
最近在写对服务器指定文件的监控程序!
不过在写日志的时候发生了一个问题,虽然看了一些帮助文档,不过还是没有能解决,
现在只能请教一下大伙了!

下面是写日志文件部分代码

NTSTATUS
WriteToLogfile(IN CHAR buff[] ){
    UNICODE_STRING     uniName;
    OBJECT_ATTRIBUTES  objAttr;

HANDLE   handle;
    NTSTATUS ntstatus;
    IO_STATUS_BLOCK    ioStatusBlock;

    size_t   cb;
    LARGE_INTEGER      byteOffset;
    ULONG length;

    RtlInitUnicodeString(&uniName, L"\\DosDevices\\C:\\MyLog.xls");
    InitializeObjectAttributes(&objAttr, &uniName,
                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                               NULL, NULL);

    if(KeGetCurrentIrql() != PASSIVE_LEVEL)
        return STATUS_INVALID_DEVICE_STATE;

    ntstatus = ZwCreateFile(&handle,
                            FILE_APPEND_DATA,
                            &objAttr, &ioStatusBlock, NULL,
                            FILE_ATTRIBUTE_NORMAL,
                            0,
                            FILE_OVERWRITE_IF,
                            FILE_SYNCHRONOUS_IO_NONALERT,
                            NULL, 0);

    if(NT_SUCCESS(ntstatus)) {
     //   ntstatus = RtlStringCbPrintfA(buff, sizeof(buff), "This is %d test\r\n", 0x0);
        //if(NT_SUCCESS(ntstatus)) {
     //         ntstatus = RtlStringCbLengthA(buff, sizeof(buff), &cb);
     //          if(NT_SUCCESS(ntstatus)) {
     //           ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,
        //                     buff, cb, NULL, NULL);
     //          }
        //}
        //byteOffset.HighPart = -1;
        //byteOffset.LowPart  = FILE_WRITE_TO_END_OF_FILE;

        length = strlen(buff);
        if(buff[length-1]=='\n')
        {
            buff[length-1]='\r';
            strcat(buff,"\n");
            length++;
        }
        else
        {
            strcat(buff,"\r\n");
            length+=2;
        }

        ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,
                             buff, length, NULL, NULL);
        ZwClose(handle);
    }
    return ntstatus;
}

下面是遇到的问题:
文件创建成功,写文件也行,
但写文件不能追加内容,每次都是覆盖了原来文件的内容,结果一直只有一条最新的一条!
大家帮帮忙,看我的程序有什么问题?
先谢谢了!

最新喜欢:

LeopardLeopar...
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-06-29 12:52
貌似FILE_OVERWRITE_IF这个参数用的不对
foxhhj
驱动牛犊
驱动牛犊
  • 注册日期2007-06-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-29 13:28
谢谢LS的回答!
我之前用
FILE_OVERWRITE
FILE_OVERWRITE_IF
都试过了,结果都是一样的!
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-29 13:40
用FILE_OPEN_IF试试,这个应该对应CreateFile(....)中OPEN_ALWAYS,文件不存在的时候创建新文件,文件存在的时候,直接打开
foxhhj
驱动牛犊
驱动牛犊
  • 注册日期2007-06-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-29 13:56
OK,谢谢LS,问题已经解决!
reborn
驱动小牛
驱动小牛
  • 注册日期2006-07-21
  • 最后登录2007-10-13
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望144点
  • 贡献值0点
  • 好评度143点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-07-02 09:50
LS 怎么解决的啊,我也遇到了和你一样的问题,可是我换成了FILE_OPEN_IF依然不行啊?请指教!
Braveheart3
驱动牛犊
驱动牛犊
  • 注册日期2005-12-11
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分260分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-12 09:04
对,既然解决了,就和大家分享一下得你的经验阿
longfei369
驱动牛犊
驱动牛犊
  • 注册日期2010-03-30
  • 最后登录2010-10-20
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-08-12 15:51
ntstatus = ZwCreateFile(&handle,
                            SYNCHRONIZE |FILE_APPEND_DATA
                            &objAttr,
                            &ioStatusBlock, NULL,
                            FILE_ATTRIBUTE_NORMAL,
                            0,
                            FILE_OPEN_IF,
                            FILE_SYNCHRONOUS_IO_NONALERT,
                            NULL, 0);
ander5115
驱动牛犊
驱动牛犊
  • 注册日期2009-12-23
  • 最后登录2012-08-17
  • 粉丝6
  • 关注3
  • 积分76分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2010-08-18 11:50
我觉得ZwWriteFile的时候是不是应该指定一下偏移量?
游客

返回顶部