3485|6

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在驱动中如何写文件? [复制链接]

我用驱动创建了一个文件, 想在文件中写入数据, 代码如下:

  1. // 写文件函数
  2. NTSTATUS Writer()
  3. {
  4.         ::DbgPrint("写文件...\n");

  5.         NTSTATUS status=STATUS_SUCCESS;

  6.         // 创建或打开文件
  7.         HANDLE hFile=NULL;
  8.         OBJECT_ATTRIBUTES objAttrib={0};
  9.         IO_STATUS_BLOCK ioStu={0};
  10.         UNICODE_STRING fileName = RTL_CONSTANT_STRING(L"\\??\\C:\\test.txt");
  11.         InitializeObjectAttributes(
  12.                 &objAttrib,
  13.                 &fileName,
  14.                 OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
  15.                 NULL,
  16.                 NULL);
  17.         // 打开
  18.         status=::ZwCreateFile(
  19.                 &hFile,
  20.                 GENERIC_ALL,
  21.                 &objAttrib,
  22.                 &ioStu,
  23.                 NULL,
  24.                 FILE_ATTRIBUTE_NORMAL,
  25.                 0,
  26.                 FILE_OPEN_IF,
  27.                 FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT,
  28.                 NULL,
  29.                 0);
  30.         if(!NT_SUCCESS(status))
  31.         {
  32.                 // 打开文件失败, 返回错误码
  33.                 ::DbgPrint("打开文件失败:x0%x\n", status);
  34.                 return status;
  35.         }
  36.         ::DbgPrint("打开成功\n");
  37.         LARGE_INTEGER byteOffset={0};
  38.         //byteOffset.
  39.         // 写文件 内容为文件名
  40.         status=::ZwWriteFile(
  41.                 &hFile,
  42.                 NULL,
  43.                 NULL,
  44.                 NULL,
  45.                 &ioStu,
  46.                 (PVOID)fileName.Buffer,
  47.                 50,
  48.                 &byteOffset,
  49.                 NULL);
  50.         if(NT_SUCCESS(status))
  51.         {
  52.                 ::DbgPrint("写入文件成功, 共写入%d字节\n", ioStu.Information);
  53.         }
  54.         else
  55.         {
  56.                 ::DbgPrint("写入文件失败:x0%x\n", status);
  57.         }
  58.         // 关闭文件
  59.         ::ZwClose(hFile);
  60.         ::DbgPrint("关闭文件\n");
  61.         // 返回执行状态
  62.         return status;
  63. }
复制代码

现在文件创建成功, 可是写入时出错 status值为0xc0000008 各位大哥我什么地方写错了?

最新回复

是: status=::ZwWriteFile(                 hFile,                 NULL,                 NULL,                 NULL,                 &ioStu,                 (PVOID)fileName.Buffer,                 fileName.Length,                 NULL,                 NULL);  详情 回复 发表于 2010-6-29 14:24
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
DDK例子很多,参考一下例子是怎么创建文件并写文件的。

BTW: 倒数第三个参数设置成50是不是会带来一些问题,你的fileName.Buffer不一定有那么大,会访问越界的。

  1. status=::ZwWriteFile(
  2.         &hFile,
  3.         NULL,
  4.         NULL,
  5.         NULL,
  6.         &ioStu,
  7.         (PVOID)fileName.Buffer,
  8.         50,
  9.         &byteOffset,
  10.         NULL);
复制代码
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 huntercao 的回复:

DDK例子很多,参考一下例子是怎么创建文件并写文件的。

BTW: 倒数第三个参数设置成50是不是会带来一些问题,你的fileName.Buffer不一定有那么大,会访问越界的。
C/C++ code

status=::ZwWriteFile(
        &hFile,
        NULL,
        NULL,
        NULL,
        &……

我把它改成 fileName.Length 也不行,   很多书上都用这种方法写文件的 为什么到我这里就不行了 ?/
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
参考:
http://support.microsoft.com/kb/891805
可能是你的文件路径有问题。

DDK的例子基本上都是在 \SystemRoot namespace下操作文件的。可以试试。

  1. The only part of the file system that is guaranteed to be available is the \SystemRoot namespace. The \SystemRoot namespace is mapped to the folder where the operation system is installed. For example, this folder may be C:\Windows or D:\Winnt.
复制代码


 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

5
 
文件路径没问题, 该函数会在c盘下生成test.txt, 就是写入时出错
我是在虚拟机里面测试的, 会不会是虚拟机的问题? 我用Virtual PC 2007
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

6
 
哈哈  写错了  
ZwCreateFile:

  1. status=::ZwCreateFile(
  2.         hFile, // 之前用的是 &hFile ^_^
  3.         GENERIC_ALL,
  4.         &objAttrib,
  5.         &ioStu,
  6.         NULL,
  7.         FILE_ATTRIBUTE_NORMAL,
  8.         0,
  9.         FILE_OPEN_IF,
  10.         FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT,
  11.         NULL,
  12.         0);
复制代码


谢谢楼上的!
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

7
 
閺屻儳婀呴張顒€绗橀崗銊╁劥鐠併劏顔戦敍宀冾嚞閻ц缍�閹存牞鈧拷濞夈劌鍞�
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表