阅读:1296回复:3
ndis 和应用程序共享文件的问题
我想在驱动中写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。 是不是在驱动层打开文件后,上层应用就不可能打开文件?各位高手给个答案。 |
|
沙发#
发布于: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方式,则和驱动的操作冲突。 |
|
板凳#
发布于: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方式,则和驱动层的操作冲突。 |
|
地板#
发布于: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方式。 |
|