Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95267
  • 博文数量: 46
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 505
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-22 19:56
文章分类
文章存档

2008年(46)

我的朋友

分类: WINDOWS

2008-06-23 20:01:34

编写驱动程序时不能像应用程序一样使用windowapi(例如 readfile,writefile等)进行硬盘上文件的访问,而必须使用特定的一些函数。
1.

VOID InitializeObjectAttributes(

        OUT POBJECT_ATTRIBUTES InitializedAttributes,

        IN PUNICODE_STRING ObjectName,//文件的路径

        IN ULONG Attributes,//为定植OBJ_CASE_INSENSITIVE| OBJ_KERNEL_HANDLE

        IN HANDLE RootDirectory,//null

        IN PSECURITY_DESCRIPTOR SecurityDescriptor);//null

这个函数是一定先调用的,使用它来初始化object_attributes 这个结构体

2. 打开文件

NTSTATUS ZwCreateFile(

        OUT PHANDLE FileHandle,//返回的文件句柄,                     

        IN ACCESS_MASK DesiredAccess,//使用宏表明操作权限                 

        IN POBJECT_ATTRIBUTES ObjectAttribute, 

        OUT PIO_STATUS_BLOCK IoStatusBlock,//结构体,主要看里面的information 可取下列值:

 

*       FILE_CREATED:文件被成功的新建了。

*       FILE_OPENED    文件被打开了。

*       FILE_OVERWRITTEN:文件被覆盖了。

*       FILE_SUPERSEDED    文件被替代了。

*       FILE_EXISTS:文件已存在。(因而打开失败了)。

*       FILE_DOES_NOT_EXIST:文件不存在。(因而打开失败了)。

 

        IN PLARGE_INTEGER AllocationSize //null

        IN ULONG FileAttributes,//FILE_ATTRIBUTE_NORMAL

        IN ULONG ShareAccess,//为下列3个宏,表示允不允许其他进程或者线程读,写,删除。FILE_SHARE_READFILE_SHARE_WRITEFILE_SHARE_DELETE

        IN ULONG CreateDisposition,//为下列宏

 

*       FILE_CREATE:新建文件。如果文件已经存在,则这个请求失败。

*       FILE_OPEN:打开文件。如果文件不存在,则请求失败。

*       FILE_OPEN_IF:打开或新建。如果文件存在,则打开。如果不存在,则失败。

*       FILE_OVERWRITE:覆盖。如果文件存在,则打开并覆盖其内容。如果文件不存在,这个请求返回失败。

*       FILE_OVERWRITE_IF:新建或覆盖。如果要打开的文件已存在,则打开它,并覆盖其内存。如果不存在,则简单的新建新文件。

FILE_SUPERSEDE:新建或取代。如果要打开的文件已存在。则生成一个新文件替代之。如果不存在,则简单的生成新文件

        IN ULONG createOptions,//FILE_NON_DIRECTORY_FILE| FILE_SYNCHRONOUS_IO_NONALERT

        IN PVOID EaBuffer OPTIONAL,

        IN ULONG EaLength);

由于该参数比较复杂,所以下面列举一个示例:

// 要返回的文件句柄

    HANDLE file_handle = NULL;

    // 返回值

    NTSTATUS status;

    // 首先初始化含有文件路径的OBJECT_ATTRIBUTES

IO_STATUS_BLOCK io_status;

    OBJECT_ATTRIBUTES object_attributes;

    UNICODE_STRING ufile_name = RTL_CONST_STRING(L”\\??\\C:\\a.dat”);

    InitializeObjectAttributes(

        &object_attributes,

        &ufile_name,

        OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,

        NULL,

        NULL);

    // OPEN_IF方式打开文件。

    status = ZwCreateFile(

        &file_handle,

        GENERIC_READ | GENERIC_WRITE,

        &object_attributes,

        &io_status,

        NULL,

        FILE_ATTRIBUTE_NORMAL,

        FILE_SHARE_READ,

        FILE_OPEN_IF,

        FILE_NON_DIRECTORY_FILE |

        FILE_RANDOM_ACCESS |

        FILE_SYNCHRONOUS_IO_NONALERT,

        NULL,

        0);

文件的读:

NTSTATUS

    ZwReadFile(

        IN HANDLE  FileHandle,

        IN HANDLE  Event  OPTIONAL,//null

        IN PIO_APC_ROUTINE  ApcRoutine  OPTIONAL,//null

        IN PVOID  ApcContext  OPTIONAL,

        OUT PIO_STATUS_BLOCK  IoStatusBlock,

        OUT PVOID  Buffer,//获得文件内容的缓冲区

        IN ULONG  Length,//要读取多少字节的文件

        IN PLARGE_INTEGER  ByteOffset  OPTIONAL,

        IN PULONG  Key  OPTIONAL);

 

文件的写

zwwritefile 与文件读函数相同

 

 

 

 

阅读(1307) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~