jtlsq
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2009-11-01
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望17点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1297回复:3

ndis 和应用程序共享文件的问题

楼主#
更多 发布于:2007-03-20 17:38
  我想在驱动中写log文件,在上层应用程序中读取。
以下是驱动创建文件的方式,驱动中始终不关闭文件。
WCHAR    pwszLogFileName[] = L"c:\\winnt\\Log.dat";
OBJECT_ATTRIBUTES    stuObjectAttr;
NTSTATUS            ntStatus;
IO_STATUS_BLOCK        stuIoStatusBlock;

RtlInitUnicodeString(&stuLogFileName, pwszLogFileName);
InitializeObjectAttributes(&stuObjectAttr, &stuLogFileName, OBJ_CASE_INSENSITIVE, NULL, NULL);

ntStatus = ZwCreateFile(&g_hLogFile,  
                            FILE_WRITE_DATA,
                            &stuObjectAttr,
                            &stuIoStatusBlock,
    0,
                            FILE_ATTRIBUTE_NORMAL,
                            FILE_SHARE_READ | FILE_SHARE_WRITE,
                            FILE_OPEN_IF,
    0,
    NULL,
    0);
    if(!NT_SUCCESS(ntStatus))
    {
        DBGPRINT(("OpenLog: ZwCreateFile: 0x%x\n", ntStatus));
        return ntStatus;
    }


以下是应用程序创建文件的方式
CHAR    szFileName[] = "c:\\winnt\\Log.dat";

// Use CreateFile to Open the Handle
    
hDevice = CreateFile(szFileName,
          FILE_READ_DATA,
          FILE_SHARE_READ,
          NULL,
          OPEN_EXISTING,
          FILE_ATTRIBUTE_NORMAL,
          NULL);


DWORD  dwErrCode = GetLastError();
if(INVALID_HANDLE_VALUE == hDevice)
{
  return 0;
}

在应用程序中打不开文件,返回文件被占用的错误码32。
是不是在驱动层打开文件后,上层应用就不可能打开文件?各位高手给个答案。
jtlsq
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2009-11-01
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望17点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-21 08:34
知道是怎么回事了。
在应用程序层应该用以下的方式打开文件
hDevice = CreateFile(szFileName,
        FILE_READ_DATA,
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
原因是驱动需要写文件,上层应用如果不采用FILE_SHARE_READ|FILE_SHARE_WRITE方式,则和驱动的操作冲突。
jtlsq
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2009-11-01
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望17点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-21 08:38
知道是怎么回事了。在应用层应该采用下面的方式打开文件
hDevice = CreateFile(szFileName,
        FILE_READ_DATA,
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

原因是在驱动层是以写的方式打开的文件,如果应用层使用FILE_SHARE_READ方式,则和驱动层的操作冲突。
jtlsq
驱动牛犊
驱动牛犊
  • 注册日期2006-07-13
  • 最后登录2009-11-01
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望17点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-21 08:48
知道是怎么回事了,应用层打开文件的方式有问题。
hDevice = CreateFile(szFileName,
        FILE_READ_DATA,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

在驱动层是采用写的方式打开文件,然而应用层不共享写的方式,这个驱动冲突。在应用层应该采用
 FILE_SHARE_READ| FILE_SHARE_WRITE方式。
游客

返回顶部