查看: 739|回复: 8

[原创] Windows API — CreateFile

[复制链接]

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5370
人气
208
分享
36

最佳新人活跃会员

发表于 2022-5-5 17:50:01 | 显示全部楼层 |阅读模式
本帖最后由 YFSafe 于 2022-5-5 22:01 编辑

此函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:
控制台对象、通信资源对象、目录对象(只能打开)、磁盘设备对象、文件对象、邮槽对象、管道对象。

函数原型:
HANDLE CreateFile(
         LPCTSTR lpFileName,                         // 文件名
         DWORD dwDesiredAccess,                      // 访问模式
         DWORD dwShareMode,                          // 共享模式
         LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性
         DWORD dwCreationDisposition,                // how to create
         DWORD dwFlagsAndAttributes,                 // 文件属性
         HANDLE hTemplateFile                        // 模板文件句柄
         );
参数
1、lpFileName
    一个指向无终结符的字符串的指针,来指明要创建或打开的对象的名字。
    在Windows NT/2000/XP平台上:如果用ANSI版本的函数,字符串长度应限制在MAX_PATH;如果用Unicode版本的函数,这个限制可以扩充到32000个Unicode字符。
    在Windows95/98/Me平台上:只能用ANSI版本的函数,字符串长度限制在MAX_PATH。

2、dwDesiredAccess
    指明对象的控制模式。一个应用程序可以包含读控制、写控制、读/写控制、设备查询控制。
这个参数的取值可以是下面这些的组合:
    0                                     指定设备查询控制:程序可以不访问设备就查询到设备属性。
    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结构体的一个双字值来设置标准权限、特殊权限和一般权限的。

3、dwShareMode
    指定对象的共享模式。如果dwShareMode==0,表示是互斥使用的。如果CreateFile打开成功,则别的程序只能等到当前程序关闭对象句柄CloseHandle后才能在打开或使用。
    使用下面这些值的组合来表示对象的共享模式:
    FILE_SHARE_DELETE       Windows NT/2000/XP:打开操作只有在删除请求发生时才能返回成功。
    FILE_SHARE_READ                 打开操作只有在读控制请求发生时才能返回成功。
    FILE_SHARE_WRITE                打开操作只有在写控制请求发生时才能返回成功。

4、lpSecurityAttributes
    一个指向SECURITY_ATTRIBUTES结构对象的指针,决定返回的句柄是否被子进程所继承。如果lpSecurityAttributes参数为NULL,句柄就不能被子进程继承。
    在Windows NT/2000/XP平台下:lpSecurityDescriptor这个成员指明了这个对象的安全描述符。如果lpSecurityAttributes参数为NULL,对象将获得一个默认的安全描述符。目标文件系统必须为这个参数的在文件上的有效操作保证安全性。

typedef struct _SECURITY_ATTRIBUTES {
       DWORD nLength; //结构体的大小(字节为单位),即siziof(SECURITY_ATTRIBUTES)
       LPVOID lpSecurityDescriptor; //指向对象的安全描述符的指针,控制对象的共享属性。在Windows 95/98/Me平台                                                     //上这个成员被忽略。
       BOOL   bInheritHandle; //指明当一个新的子进程创建时,是否继承当前返回的句柄
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
5、dwCreationDisposition
    指明当打开的对象存在或不存在的时候各需怎样处理。这个参数必须是一下值的其中之一:
    CREATE_NEW            创建新文件/对象(当对象已经存在是将返回失败)。
    CREATE_ALWAYS         总是创建(如果对象存在就覆盖它,清除当前属性,把文件属性和dwFlagsAndAttributes指定的标志相结合)。
    OPEN_EXISTING         打开文件(如果不存在就返回失败)。
    OPEN_ALWAYS      存在就打开;若不存在,假如dwCreationDisposition==CREATE_NEW就创建一个新文件。
    TRUNCATE_EXISTING     存在就打开,且清空文件内容(至少要有GENERIC_WRITE权限);若文件不存在就返回失败。

6、dwFlagsAndAttributes
    指定文件属性和标志。可以是以下值的任意组合(只有FILE_ATTRIBUTE_NORMAL必须单独使用,唯一例外):
Attribute:
    FILE_ATTRIBUTE_ARCHIVE                 文件存档(备份或移动时会对文件做标记)。
    FILE_ATTRIBUTE_ENCRYPTED               加密(对文件来说是内容加密,对目录来说是对将来新建的文件默认为加密属性),与此同时,如果还设置了FILE_ATTRIBUTE_SYSTEM属性,当前这个属性将无效。
    FILE_ATTRIBUTE_HIDDEN                  隐藏属性。
    FILE_ATTRIBUTE_NORMAL                  文件没有其他属性设置,此属性只能单独使用才合法。
    FILE_ATTRIBUTE_NOT_CONTENT_INDEXED     不建立内容索引。
    FILE_ATTRIBUTE_OFFLINE                 脱机属性。文件内容暂时不可用。此属性被Remote Storage软件所用,不能任意更改。
    FILE_ATTRIBUTE_READONLY                只读文件属性。应用程序不能写或删除。
    FILE_ATTRIBUTE_SYSTEM                  文件是系统文件或被操作系统互斥地使用。
    FILE_ATTRIBUTE_TEMPORARY               临时文件,使用过程中尽量留在内存以保证存取速度。
Flag:
    FILE_FLAG_WRITE_THROUGH            指示系统立即写磁盘。这个写操作允许被cache缓存,但不能被搁置。
    FILE_FLAG_OVERLAPPED                   指示系统初始化对象,如果操作需要大量时间执行就先返回一 个 ERROR_IO_PENDING,当操作 完成后再通过事件使能信号量。指定这个标志就必须在read和write函数里初始化OVERLAPPED 结构体,应用程序必须执行重复的读写操作。此时,操作系统不维护文件指针,当前的位置   需要通过OVERLAPPED的指针传递给读写函数。这个标志还允许多个操作的并行(并行读写)。
    FILE_FLAG_NO_BUFFERING                 指示系统不要缓冲,它如果和FILE_FLAG_OVERLAPPED联合使用,将呈现最好的异步性能,因为I/O操作并不依赖于内存管理器的同步性。但是有时I/O操作会慢些,因为没用cache。有时程序需要做调整,比如文件大小必须是扇区大小的整数倍,Buffer地址的按扇区地址对齐等。按扇区地址对齐内存边界可以使用VirtualAlloc来分配内存,GerDiskFreeSpace函数可以得到磁盘一个扇区的大小。
    FILE_FLAG_RANDOM_ACCESS                指示文件进行随即存取,系统可据此对cache的分配进行优化。
    FILE_FLAG_SEQUENTIAL_SCAN              指示顺序存取,系统也可据此对cache的分配进行优化。即使有随即存取的操作,也不会出错,不过cache的优化就取消了。在连续读取大文件时性能非常好。
    FILE_FLAG_DELETE_ON_CLOSE              指示系统在句柄关闭时将响应的文件立即删除,对当前句柄以外的其他句柄也有效。而且随后的打开请求也会失败,直到你使用了FILE_SHARE_DELETE属性。
    FILE_FLAG_BACKUP_SEMANTICS             在Windows NT/2000/XP平台上:指示文件作为备份或恢复文件打开,这是如果调用进程拥有特殊权限(SE_BACKUP_NAME 或 SE_RESTORE_NAME),就可以不进行安全检查。也可以在获得一个目录的句柄时设置这个flag,目录句柄可以代替文件句柄传递给一些函数。
    FILE_FLAG_POSIX_SEMANTICS              指明按照操作系统接口规范进行文件存取,这包括允许多文件名的使用。请谨慎使用,因为MS_DOS或16位Windows系统可能不支持。
    FILE_FLAG_OPEN_REPARSE_POINT           这个标志指明禁止文件系统的重解析点的动作。文件打开时就返回文件的句柄,而不在乎控制重解析点的过滤器是否可运行。不能和CREATE_ALWAYS同时使用。
    FILE_FLAG_OPEN_NO_RECALL               表明文件数据被请求,但仍然驻留在远程存储体中,而不会被传回本地存储体。这个标志 由远程存储系统或分层存储管理系统使用。
    如果CreateFile函数打开一个命名管道的客户端,dwFlagsAndAttributes 参数也会包含服务信息的安全性。当调用程序指定了
SECURITY_PRESENT标志时,dwFlagsAndAttributes 参数可以取以下一个或多个值:
    SECURITY_ANONYMOUS                  指定将客户端模拟在匿名级别(the Anonymous impersonation level)
    SECURITY_IDENTIFICATION             指定将客户端模拟在身份认证级别(the Identification impersonation level)
    SECURITY_IMPERSONATION              指定将客户端模拟在伪装级别(the Impersonation impersonation level)
    SECURITY_DELEGATION                 指定将客户端模拟在授权级别(the Delegation impersonation level)
    SECURITY_CONTEXT_TRACKING           指定安全跟踪模式是动态的,否则(不指定此标志)是静态的
    SECURITY_EFFECTIVE_ONLY             指定客户端的安全内容中的有效内容才可以被服务端使用,否则所有内容都可被使用。 这个标志允许客户端限制服务端在模拟客户端时所具有的权限。

7、hTemplateFile
    把具有GENERIC_READ权限的句柄指定为一个模板文件。这个模板文件提供了文件属性和扩展属性,用于创建文件。在Windows 95/98/Me平台上:这个参数必须为空,否则如果你提供一个句柄,函数调用将会失败,用GerLastError函数获得的出错信息为ERROR_NOT_SUPPORTED。

返回值
    调用如果成功,返回一个文件的句柄。
    如果调用之前文件已存在,且dwCreationDisposetion 为CREATE_ALWAYS或OPEN_ALWAYS,用GetLastError返回ERROR_ALREADY_EXISTS。
(即使调用成功也会返回这个值)。如果调用之前不存在,GetLastError返回0。
    调用如果失败,返回值是INVALID_HANDLE_VALUE。要进一步了解出错原因,调用GetLastError。


示例:
以下示例展示了用CreateFile函数打开文件并用ReadFile读取文件
[C++] 纯文本查看 复制代码
#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
        HANDLE hFile = CreateFile("C:\\test.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        DWORD fSize = GetFileSize(hFile,NULL);
        char buffer[1024];
        ReadFile(hFile,buffer,fSize,&fSize,NULL);
        cout << buffer << endl;
        CloseHandle(hFile);  
        system("pause");
}


感谢观看,这一期用了很久才写出来,下一期写ReadFile。


END



评分

参与人数 3经验 +50 人气 +4 分享 +4 收起 理由
xiaomeng + 30
hackerbob + 20 + 2 + 2 赞一个!
skystars + 2 + 2 辛苦了

查看全部评分

YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

2

技术

6

魅力

2

原创

病毒研究组

Rank: 8Rank: 8

积分
1721
人气
179
分享
17

最佳新人活跃会员

发表于 2022-5-5 18:38:40 | 显示全部楼层
哈哈。good good

2

技术

6

魅力

2

原创

病毒研究组

Rank: 8Rank: 8

积分
1721
人气
179
分享
17

最佳新人活跃会员

发表于 2022-5-5 19:49:22 | 显示全部楼层
这个不错,希望你能一直更新下去,我们都学习学习
不过,今天论坛好像没什么人了,几个版主都没上线。。。。

1

技术

25

魅力

7

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
11343
人气
297
分享
42

论坛元老优秀版主活跃会员最佳新人灌水之王

发表于 2022-5-5 20:58:38 | 显示全部楼层
hackerbob 发表于 2022-5-5 19:49
这个不错,希望你能一直更新下去,我们都学习学习
不过,今天论坛好像没什么人了,几个版主都没上线。。。 ...

毕竟五一假期结束了
Just do it.

1

技术

25

魅力

7

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
11343
人气
297
分享
42

论坛元老优秀版主活跃会员最佳新人灌水之王

发表于 2022-5-5 21:02:33 | 显示全部楼层
我觉得分享API很好

支持楼主更新

对了,用完之后是不是应该加个CloseHandle更好点
Just do it.

2

技术

6

魅力

2

原创

病毒研究组

Rank: 8Rank: 8

积分
1721
人气
179
分享
17

最佳新人活跃会员

发表于 2022-5-5 21:26:22 | 显示全部楼层
skystars 发表于 2022-5-5 20:58
毕竟五一假期结束了

是的,我们又开始上网课了。。。。

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5370
人气
208
分享
36

最佳新人活跃会员

 楼主| 发表于 2022-5-5 22:00:02 | 显示全部楼层
skystars 发表于 2022-5-5 21:02
我觉得分享API很好

支持楼主更新

现在就改
YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

1

技术

25

魅力

7

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
11343
人气
297
分享
42

论坛元老优秀版主活跃会员最佳新人灌水之王

发表于 2022-5-6 13:01:06 | 显示全部楼层
突然想起之前写过一个用CreateFile保护MBR的程序,代码分享给大家:


[C++] 纯文本查看 复制代码
#include <iostream>
#include <cstdio>
#include <windows.h>
using namespace std;
int main()
{
	HANDLE hFile;
	hFile = CreateFileA(R"(\\.\PhysicalDrive0)", GENERIC_ALL, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if ((int)hFile == -1) {
		printf("出现错误,无法保护MBR!\n");
		system("pause");
		return 0;
	}
	printf("成功保护MBR!\n");

	system("pause");
	system("pause");
	CloseHandle(hFile);
	return 0;
}

Just do it.

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5370
人气
208
分享
36

最佳新人活跃会员

 楼主| 发表于 2022-5-6 13:02:06 | 显示全部楼层
skystars 发表于 2022-5-6 13:01
突然想起之前写过一个用CreateFile保护MBR的程序,代码分享给大家:

霍,好狠,直接开互斥
YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表