在驱动中如何写文件?

duyeqiang1215   2010-6-29 10:40 楼主
我用驱动创建了一个文件, 想在文件中写入数据, 代码如下:

  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 各位大哥我什么地方写错了?

回复评论 (6)

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);
点赞  2010-6-29 11:21
引用: 引用 1 楼 huntercao 的回复:

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

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

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

我把它改成 fileName.Length 也不行,   很多书上都用这种方法写文件的 为什么到我这里就不行了 ?/
点赞  2010-6-29 12:08
参考:
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.


点赞  2010-6-29 12:18
文件路径没问题, 该函数会在c盘下生成test.txt, 就是写入时出错
我是在虚拟机里面测试的, 会不会是虚拟机的问题? 我用Virtual PC 2007
点赞  2010-6-29 12:58
哈哈  写错了  
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);


谢谢楼上的!
点赞  2010-6-29 14:21
是:
status=::ZwWriteFile(
                hFile,
                NULL,
                NULL,
                NULL,
                &ioStu,
                (PVOID)fileName.Buffer,
                fileName.Length,
                NULL,
                NULL);
点赞  2010-6-29 14:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复