Windows驱动开发之文件操作

转载请注明来源:
enjoy5512的博客 : http://blog.csdn.net/enjoy5512
GitHub : https://github.com/whu-enjoy


1. 在驱动中使用文件

  在Windows执行体中,通过文件对象来代表文件,该文件对象是一种由对象管理器管理的执行体对象。例如:目录也是由文件对象代表的。
内核组件通过对象名来引用文件,即在文件的全路径前面加\DosDevices。(在Windows 2000及后续操作系统中,\??等同于\DosDevices)。例如,文件C:\WINDOWS\example.txt的对象名为\DosDevices\C:\WINDOWS\example.txt。你需要用对象名来打开文件以获取句柄。

使用文件步骤:
 1. 打开文件返回文件句柄。
 2. 调用合适的ZwXxxFile 函数以完成对文件的操作。
 3. 调用ZwClose函数关闭打开的文件句柄。
 
  当打开一个指向文件的文件句柄时,Windows执行体就创建了一个文件对象来代表该文件,同时返回一个代表该对象的文件句柄。因此,对于单个文件来说,会存在多个文件对象的情况。同样,由于用户模式的应用程序可能会复制文件句柄,因此,对于同一个文件对象,也会存在多个文件句柄。只有当所有指向一个文件对象的文件句柄都关闭后,Windows执行体才会删除该文件对象。


1.1 打开文件句柄

  1. 定义一个OBJECT_ATTRIBUTES结构体变量,然后调用InitializeObjectAttributes函数初始化该变量。关键是设置改变量的ObjectName字段为文件对象名。
InitializeObjectAttributes宏,初始化一个OBJECT_ATTRIBUTES结构体,它指定对象句柄的属性,供打开句柄的例程使用。

VOID InitializeObjectAttributes(
[out] POBJECT_ATTRIBUTES InitializedAttributes,
[in] PUNICODE_STRING ObjectName,
[in] ULONG Attributes,
[in] HANDLE RootDirectory,
[in, optional] PSECURITY_DESCRIPTOR SecurityDescriptor
);

参数:
InitializedAttributes [out]
指定要初始化的OBJECT_ATTRIBUTES结构体指针。

ObjectName [in]
一个指向UNICODE字符串对象的指针,它包含将要打开句柄的对象名称。
它必须是一个完整的对象名称或者是相对于RootDirectory参数指定目录的相对路径。

Attributes [in]
指定一个或多个以下列标志:
OBJ_INHERIT
这个句柄可以被当前进程的子进程继承。
OBJ_PERMANENT
此标志仅应用于对象管理器命名的对象。
默认情况下,这样的对象会在关闭所有它们打开的句柄时删除。
如果指定了此标志,对象不会在所有打开的句柄关闭时删除,
驱动可以使用ZwMakeTemporaryObject删除固定的对象。
OBJ_EXCLUSIVE
这个对象只可以有一个打开的句柄。意味着仅有一个进程可以访问此对象。
OBJ_CASE_INSENSITIVE
如果指定了此标志,在对ObjectName参数与已存在的对象名称进行匹配时,会不区分大小写。
OBJ_OPENIF
如果在创建对象的例程中指定此标志,当对象已经存在时,例程将会打开些对象。否则,创建对象的例程会返回值为STATUS_OBJECT_NAME_COLLISION的NTSTATUS代码。
OBJ_KERNEL_HANDLE
指定句柄仅能在内核模式访问。
OBJ_FORCE_ACCESS_CHECK
打开句柄的例程,应执行所有的访问检查,即使是在内核模式下也如此。

RootDirectory [in]
root目录对象句柄,用于ObjectName参数指定的相对路径时。
如果ObjectName参数是一个完整的对象名,RootDirectory是NULL。
使用ZwCreateDirectoryObject获取对象目录的句柄。

SecurityDescriptor [in, optional]
指定对象创建时应用的一个安全描述符。此参数是可选的。对象如果接受默认的安全设置,驱动程序可以指定NULL。更多信息,参见下面的备注节。

返回值:
无

备注:
InitializeObjectAttributes初始化一个OBJECT_ATTRIBUTES结构体,它设置将被打开的对象句柄的属性。调用者可以传递一个此结构的指针到实际打开句柄的例程。驱动程序运行进程上下文中,若要运行在系统进程,需要设置OBJ_KERNEL_HANDLE标志到Attributes参数。这个标志限制,使用此打开的句柄的进程仅能运行在内核模式。否则句柄可以在驱动运行的进程上下文中访问。注意,InitializeObjectAttributes始终设置OBJCECT_ATTRIBUTES的SecurityQualityOfService成员为NULL。如果驱动程序需要一个非空的值,可以直接设置SecurityQualityOfService成员。

2 调用IoCreateFile, ZwCreateFile, 或者 ZwOpenFile,传递上面定义的结构体变量,成功就会返回执行该文件的句柄。

注:驱动一般用ZwCreateFile和ZwOpenFile,IoCreateFile很少使用,当调用ZwCreateFile,ZwOpenFile或IoCreateFile时,Windows执行体创建一个代表该文件的新的文件对象,并返回一个指向该对象的句柄。文件对象一直存在,知道你关闭了所有指向它的文件句柄。
原型:
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER AllocationSize OPTIONAL,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions,
IN PVOID EaBuffer OPTIONAL,
IN ULONG EaLength
);

参数理解:
OUT-FileHandle--------这是一个指向一个变量的指针,用来最后存放file object handleIN-DesiredAccess----这个参数指定一个访问权限,大概有以下的权限:
FILE_ANY_ACCESS 0x0000 // any type
FILE_READ_ACCESS 0x0001 // file & pipe
FILE_READ_DATA 0x0001 // file & pipe
FILE_LIST_DIRECTORY 0x0001 // directory
FILE_WRITE_ACCESS 0x0002 // file & pipe
FILE_WRITE_DATA 0x0002 // file & pipe
FI

你可能感兴趣的:(Windows驱动开发,驱动开发,文件操作,字符串操作,动态内存申请)