阅读:3763回复:11
请问asmsys老大,如何在NDIS中创建一个文件。我在PtReceivePacket()中想创建一个名为test.txt的文件。用下面的代码,蓝屏了,请大侠帮忙看看到底那里错了。 如果能够给出一个正确的代码,感激的流鼻涕。 IO_STATUS_BLOCK ioStatus; NTSTATUS ntStatus; HANDLE ntFileHandle; OBJECT_ATTRIBUTES objectAttributes; UNICODE_STRING fileNameUnicodeString; WCHAR filename[] = L"\\DosDevices\\C:\\test.txt"; RtlInitUnicodeString( &fileNameUnicodeString, filename ); InitializeObjectAttributes(&objectAttributes, &fileNameUnicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntStatus = ZwCreateFile( &ntFileHandle, //output file handle SYNCHRONIZE|FILE_ANY_ACCESS, &objectAttributes, &ioStatus, //output status of result NULL, //pallocate size 0, //file attributes FILE_SHARE_READ|FILE_SHARE_WRITE, //share access FILE_OPEN, //create disposition FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, //create options NULL, //EA buffer 0 ); |
|
沙发#
发布于:2004-06-07 15:27
别的先不看至少L"\DosDevices\C:\test.txt";
应该为L"\\DosDevices\\C:\\test.txt"; 至于为什么,找本C语言基础的书看看。 |
|
板凳#
发布于:2004-06-07 16:08
我已经将一个“\\”改为两个“\\”
还是蓝屏,帮忙给看看吧 [编辑 - 6/7/04 by yiedu] [编辑 - 6/7/04 by yiedu] [编辑 - 6/7/04 by yiedu] [编辑 - 6/7/04 by yiedu] |
|
地板#
发布于:2004-06-07 16:25
1: 将L"DosDevicesC:test.txt";改成
L"\\DosDevices\\C:\\test.txt"; 2: 调用这个KeGetCurrentIrql()看当前IRQL。 要是大于PASSIVE_LEVEL 绝对蓝屏! 3:大于PASSIVE_LEVEL 解决方法 将你这个函数插入到系统工作中! :) [编辑 - 6/7/04 by yangmin26] |
|
|
地下室#
发布于:2004-06-07 16:28
//***********************************************************
//核心态文件读写代码片段 NDIS_STRING fileName; char TempBuf[16]; NDIS_STATUS status; HANDLE FileHandle; IO_STATUS_BLOCK IoStatus; OBJECT_ATTRIBUTES objectAttributes; //get a handle to the log file object NdisInitUnicodeString(&fileName, (PWSTR)L"\\\??\\\C:\\\packet.log"); InitializeObjectAttributes (&objectAttributes, (PUNICODE_STRING)&fileName, OBJ_CASE_INSENSITIVE, NULL, NULL ); status = ZwCreateFile(&FileHandle, FILE_APPEND_DATA, &objectAttributes, &IoStatus, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); if(NT_SUCCESS(status)) { sprintf(TempBuf,"rn***DEBUG***nr"); ZwWriteFile(FileHandle, NULL, NULL, NULL, &IoStatus, TempBuf, sizeof(TempBuf), NULL, NULL ); ZwWriteFile(FileHandle, NULL, NULL, NULL, &IoStatus, Buffer, uSize, NULL, NULL ); ZwClose(FileHandle); } [编辑 - 6/7/04 by asmsys] |
|
5楼#
发布于:2004-06-07 16:31
怎么那个反斜杠老是一个,系统问题。
|
|
6楼#
发布于:2004-06-07 16:38
只要一调用ZwCreateFile就蓝屏,
还有(PWSTR)L"??C:packet.log");中的“??“ 是什么意思啊? 刚开始学驱动,比较粗:)见笑了。 [编辑 - 6/7/04 by yiedu] |
|
7楼#
发布于:2004-06-07 16:38
只要一调用ZwCreateFile就蓝屏,
还有(PWSTR)L"\??\C:\packet.log");中的“??“ 是什么意思啊? 刚开始学驱动,比较粗:)见笑了。 |
|
8楼#
发布于:2004-06-07 16:46
那个L"\\DosDevices\\C:\\test.txt";中的"DosDevices"是写死的东西,还是自己定义的?
|
|
9楼#
发布于:2004-06-07 17:06
ZwCreateFile能在NDIS中间层中用吗?
是不是级别不够啊 |
|
10楼#
发布于:2004-06-08 14:02
我的帖子说得很详细了。 ZwCreateFile遇到蓝平第一个可是是IRQL高; 路径不对可以返回错误码。。
你还不懂。 猪就是你 |
|
|
11楼#
发布于:2004-06-09 16:45
ZwCreateFile 只能在IRQL为PASSIVE_LEVEL调用,而且ZwReadFile,ZwWriteFileye也必须在相同的线程环境下,而PtReceive则运行在IRQL DISPATCH_LEVEL,因此会蓝屏。
解决办法是在DriverEntry 建立一系统工作者线程,在该线程里面 完成ZwXxxFile的调用 示例代码如下: 1,建立一系统工作者线程status = PsCreateSystemThread( &ThreadHandle,THREAD_ALL_ACCESS ,0, 0,0, LogToFile,0); 2,系统工作者线程 VOID LogToFile(PVOID para) { RtlInitUnicodeString(&File,L"\\??\\D:\\test2.log"); InitializeObjectAttributes(&ObjectAttributes,&File,OBJ_CASE_INSENSITIVE,NULL,NULL); Status=ZwCreateFile(&hFile,GENERIC_WRITE| SYNCHRONIZE,&ObjectAttributes,&IOStatus,0,\ FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0); ZwQueryInformationFile(hFile,&IOStatus,&FileStdInfo,sizeof(FileStdInfo),FileStandardInformation); FilePos.CurrentByteOffset =FileStdInfo.EndOfFile; ZwSetInformationFile(hFile,&IOStatus,&FilePos,sizeof(FilePos),FilePositionInformation); Status=ZwWriteFile(hFile,0,NULL,NULL,&IOStatus,"\n6548485868598659695965965\n\n",28,0,NULL); Status=ZwClose(hFile); } |
|