2008年(46)
分类: WINDOWS
2008-06-23 20:01:34
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_READ、FILE_SHARE_WRITE、FILE_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 与文件读函数相同