ReadFile 和 补充CreateFile

续写CreatFile函数:

CreateFile的涵义是创建File这个内核对象,而不是创建物理磁盘上的“文件”。在Win32 API中有一系列操作内核对象的函数,创建内核对象的函数大多命名为CreateXxxx

lpFileName String要打开的文件的名或设备名。这个字符串的最大长度在ANSI版本中为MAX_PATH,在unicode版本中为32767。

dwDesiredAccess指定类型的访问对象。如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息 。

另外,还可以指定下面的控制标志:

标准控制权限(16-23位掩码):

DELETE 删除对象的权限。

READ_CONTROL 从对象的安全描述符中读取信息的权限,但不包括SACL(系统访问控制列表)中的信息。

WRITE_DAC 修改对象安全描述符中的DACL(随机访问控制列表)的权限

WRITE_OWNER 修改对象安全描述符中的属主的权限

SYNCHRONIZE 同步化使用对象的权限,即可以创建一个线程等待信号量释放(但有些对象不支持这个权限)。

STANDARD_RIGHTS_REQUIRED 等价于前面四种权限的总合(通常这四种是必须具有的权限)。

STANDARD_RIGHTS_READ 一般等价于READ_CONTROL

STANDARD_RIGHTS_WRITE 一般等价于READ_CONTROL

STANDARD_RIGHTS_EXECUTE 一般等价于READ_CONTROL

STANDARD_RIGHTS_ALL 等价于前面五种权限的总合。

特殊控制权限(0-15位掩码):

SPECIFIC_RIGHTS_ALL

ACCESS_SYSTEM_SECURITY

MAXIMUM_ALLOWED

GENERIC_READ

GENERIC_WRITE

GENERIC_EXECUTE

GENERIC_ALL

注:实质上是通过ACCESS_MASK结构体的一个双字值来设置标准权限、特殊权限和一般权限的。

dwShareModeLong, 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示随后打开操作对象会成功,但只有删除访问请求的权限;如果是FILE_SHARE_READ随后打开操作对象会成功只有请求读访问的权限;如果是FILE_SHARE_WRITE随后打开操作对象会成功,但只有请求写访问的权限。

lpSecurityAttributesSECURITY_ATTRIBUTES, 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)

dwCreationDispositionLong下述常数之一:

CREATE_NEW创建文件;如文件存在则会出错

CREATE_ALWAYS创建文件,会改写前一个文件

OPEN_EXISTING文件必须已经存在。由设备提出要求

OPEN_ALWAYS如文件不存在则创建它

TRUNCATE_EXISTING将现有文件缩短为零长度

dwFlagsAndAttributesLong一个或多个下述常数

FILE_ATTRIBUTE_ARCHIVE标记归档属性

FILE_ATTRIBUTE_COMPRESSED将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式

FILE_ATTRIBUTE_NORMAL默认属性

FILE_ATTRIBUTE_HIDDEN隐藏文件或目录

FILE_ATTRIBUTE_READONLY文件为只读

FILE_ATTRIBUTE_SYSTEM文件为系统文件

FILE_FLAG_WRITE_THROUGH操作系统不得推迟对文件的写操作

FILE_FLAG_OVERLAPPED允许对文件进行重叠操作

FILE_FLAG_NO_BUFFERING禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块

FILE_FLAG_RANDOM_ACCESS针对随机访问对文件缓冲进行优化

FILE_FLAG_SEQUENTIAL_SCAN针对连续访问对文件缓冲进行优化

FILE_FLAG_DELETE_ON_CLOSE关闭了上一次打开的句柄后,将文件删除。特别适合临时文件

也可在Windows NT下组合使用下述常数标记:

SECURITY_ANONYMOUSSECURITY_IDENTIFICATIONSECURITY_IMPERSONATIONSECURITY_DELEGATIONSECURITY_CONTEXT_TRACKINGSECURITY_EFFECTIVE_ONLY

hTemplateFilehTemplateFile为一个文件或设备句柄,表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到lpFileName指定的路径,然后再打开)。它将指定该文件的属性扩展到新创建的文件上面,这个参数可用于将某个新文件的属性设置成与现有文件一样,并且这样会忽略dwAttrsAndFlags。通常这个参数设置为NULL,为空表示不使用模板,一般为空。

ReadFile函数

HANDLE hFile, 需要读入数据的文件指针,这个指针指向的文件必须是GENERIC_READ 访问属性的文件。

LPVOID lpBuffer,接收数据的缓冲区。

DWORD nNumberOfBytesToRead,指定要读取的字节数。

LPDWORD lpNumberOfBytesRead,指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。

LPOVERLAPPED lpOverlapped OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL。

FILE_FLAG_OVERLAPPED允许对文件进行重叠操作

调用成功,返回非0

调用不成功,返回为0

#include
#include
#define BUF_SIZE 256

using namespace std;

int main() {
     
	HANDLE	hFileRead;
	DWORD	nIn;
	char buffer[BUF_SIZE];

	hFileRead = CreateFile(L"test.txt",
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if (hFileRead == INVALID_HANDLE_VALUE) {
     
		printf("Cannot open file. Error : %x/n", GetLastError());
		return -1;
	}

	while (ReadFile(hFileRead, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0)
	{
     
		printf("%s/n", buffer);
	}
	CloseHandle(hFileRead);

}

实现截图:

ReadFile 和 补充CreateFile_第1张图片
备注:
2021年坚持学写博客第二天(学习两个windows API) 寻梦SS

明日目标:
windows核心编程API函数

你可能感兴趣的:(windows核心编程)