yiedu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-30
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3764回复:11

请问asmsys老大,如何在NDIS中创建一个文件。

楼主#
更多 发布于:2004-06-07 15:07

我在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
);
longwenjiu
驱动牛犊
驱动牛犊
  • 注册日期2003-12-04
  • 最后登录2008-09-04
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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);
}
yangmin26
驱动小牛
驱动小牛
  • 注册日期2003-02-22
  • 最后登录2012-11-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-08 14:02
我的帖子说得很详细了。  ZwCreateFile遇到蓝平第一个可是是IRQL高;  路径不对可以返回错误码。。


你还不懂。  猪就是你
YM KILL YOU
yiedu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-30
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-07 17:06
ZwCreateFile能在NDIS中间层中用吗?
是不是级别不够啊
yiedu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-30
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-07 16:46
那个L"\\DosDevices\\C:\\test.txt";中的"DosDevices"是写死的东西,还是自己定义的?
yiedu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-30
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-07 16:38
只要一调用ZwCreateFile就蓝屏,
还有(PWSTR)L"\??\C:\packet.log");中的“??“
是什么意思啊?
刚开始学驱动,比较粗:)见笑了。
yiedu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-30
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-07 16:38
只要一调用ZwCreateFile就蓝屏,
还有(PWSTR)L"??C:packet.log");中的“??“
是什么意思啊?
刚开始学驱动,比较粗:)见笑了。

[编辑 -  6/7/04 by  yiedu]
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-07 16:31
怎么那个反斜杠老是一个,系统问题。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于: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]
yangmin26
驱动小牛
驱动小牛
  • 注册日期2003-02-22
  • 最后登录2012-11-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于: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]
YM KILL YOU
yiedu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-30
  • 最后登录2008-03-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于: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]
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-06-07 15:27
别的先不看至少L"\DosDevices\C:\test.txt";
应该为L"\\DosDevices\\C:\\test.txt";
至于为什么,找本C语言基础的书看看。
游客

返回顶部