CreateFile 函数详细解析

前言:
    在Windows编程中CreateFile函数是用得非常多的,由于它的参数比较多比较复杂,在使用的时候容易出现问题,在学习了MSDN的官方文档后打算将其原文翻译出来,以供参考,如有错误,欢迎指正:lcb0281@163点com

CreateFile 
    创建或打开文件或I/O设备。常用的I/O设备有:文件,文件流,目录,物理磁盘,卷,控制台缓冲区,磁带驱动器,通信资源,邮筒和管道。该函数返回一个句柄,该句柄可用于根据文件或设备以及指定的标志和属性访问文件或设备以获取各种类型的I/O。
    要将此操作作为事务操作执行,这会导致可用于事务I / O的句柄,请使用CreateFileTransacted函数。

句法:
HANDLE WINAPI CreateFile(
  _In_     LPCTSTR               lpFileName,
  _In_     DWORD                 dwDesiredAccess,
  _In_     DWORD                 dwShareMode,
  _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_     DWORD                 dwCreationDisposition,
  _In_     DWORD                 dwFlagsAndAttributes,
  _In_opt_ HANDLE                hTemplateFile
);
参数:

lpFileName [in]

    要创建或打开的文件或设备的名称。 可以在这个名字中使用正斜杠(/)或反斜杠(\)【注意/是转义符号】。在该函数的ANSI版本中,该名称仅限于MAX_PATH字符。要将此限制扩展为32,767个宽字符,请调用该函数的Unicode版本并将“\\?\”添加到路径中。更多内容请查看: Naming Files, Paths, and Namespaces.
    有关特殊设备名称的信息,请参阅: Defining an MS-DOS Device Name.
    要创建文件流,请指定文件的名称,冒号,然后指定流的名称。 有关更多信息,请参阅File Streams.
    提示:从Windows 10版本1607开始,针对此函数的unicode版本(CreateFileW),您可以选择删除MAX_PATH限制而不预先添加“\\?\” 有关详细信息,请参阅命名文件,路径和命名空间的“Naming Files, Paths, and Namespaces ”部分。
dwDesiredAccess [in]
    所请求的文件或设备访问权限,这可以被概括为读,写,两者或非)。最常用的值是 GENERIC_READGENERIC_WRITE或两者 (GENERIC_READ | GENERIC_WRITE)。更多内容查看; Generic Access Rights, File Security and Access Rights, File Access Rights Constants, and ACCESS_MASK.
    如果此参数为零,则应用程序可以查询某些元数据(如文件,目录或设备属性),而不访问该文件或设备,即使GENERIC_READ访问已被拒绝。
    您无法请求与已打开句柄的打开请求中的dwShareMode参数指定的共享模式冲突的访问模式。
    有关更多信息,请参阅本主题的“备注”部分和 Creating and Opening Files.
dwShareMode [in]
    文件或设备的请求共享模式,可以读取,写入,删除,全部或全部删除。对属性或扩展属性的访问请求不受此标志的影响。
    如果此参数为零且CreateFile成功,则文件或设备无法共享,并且无法再次打开,直到文件或设备的句柄关闭。
    你无法请求与在具有打开句柄的现有请求中指定的访问模式冲突的共享模式。 CreateFile将失败,GetLastError函数将返回ERROR_SHARING_VIOLATION。
    要启用进程在另一进程打开文件或设备时共享文件或设备,请使用以下一个或多个值的兼容组合。有关此参数与dwDesiredAccess参数的有效组合的更多信息,请查看 Creating and Opening Files.
提示:每个打开的句柄的共享选项在该句柄关闭之前保持有效,而与流程上下文无关。
Value Meaning
0x00000000  防止其他进程在请求删除,读取或写入访问时打开文件或设备。

FILE_SHARE_DELETE                               

0x00000004

启用文件或设备共享删除访问,否则,如果其他进程请求删除访问,则无法打开该文件或设备。如果未指定此标志,但文件或设备已被打开以进行删除访问,则该功能失败。

注意:除访问权限允许删除和重命名操作

FILE_SHARE_READ

0x00000001

启用文件或设备共享读访问,否则,如果其他进程请求读取访问权限,则无法打开文件或设备。如果未指定此标志,但文件或设备已被打开以进行读取访问,则该功能失败。

FILE_SHARE_WRITE

0x00000002

启用文件或设备共享写访问,否则,如果其他进程请求写访问权限,则无法打开该文件或设备。如果未指定此标志,但文件或设备已打开以进行写入访问或具有写入访问的文件映射,则该功能将失败。
lpSecurityAttributes [in, optional]
    指向SECURITY_ATTRIBUTES结构的指针,该结构包含两个独立但相关的数据成员:一个可选的安全描述符以及一个布尔值,该值确定返回的句柄是否可以被子进程继承。
    该参数可以是NULL。
    如果此参数为NULL,则由CreateFile返回的句柄不能由应用程序可能创建的任何子进程继承,并且与返回句柄关联的文件或设备将获得默认安全描述符。
    该结构的lpSecurityDescriptor成员为文件或设备指定SECURITY_DESCRIPTOR。如果此成员为NULL,则与返回句柄关联的文件或设备将被分配一个默认安全描述符。
    CreateFile在打开现有文件或设备时会忽略lpSecurityDescriptor成员,但会继续使用bInheritHandle成员。
    该结构的bInheritHandle成员指定是否可以继承返回的句柄。
dwCreationDisposition [in]
    采取存在或不存在的文件或设备的操作。
    对于文件以外的设备,此参数通常设置为OPEN_EXISTING。

    该参数必须是以下值之一,不能组合:

扫描二维码关注公众号,回复: 1868691 查看本文章
Value Meaning

CREATE_ALWAYS

2

始终创建一个新文件。

如果指定的文件存在并且是可写的,则该函数覆盖文件,函数成功,并且最后的错误代码被设置为ERROR_ALREADY_EXISTS(183)。

如果指定的文件不存在并且是有效的路径,则会创建一个新文件,该函数成功,并且最后一个错误代码被设置为零。

CREATE_NEW
1
只有在不存在的情况下才创建一个新文件。
如果指定的文件存在,则该函数失败,并且最后的错误代码被设置为ERROR_FILE_EXISTS(80)。
如果指定的文件不存在并且是可写位置的有效路径,则会创建一个新文件。
OPEN_ALWAYS
4
总是打开一个文件。
如果指定的文件存在,则函数成功并且最后的错误代码被设置为ERROR_ALREADY_EXISTS(183)。
如果指定的文件不存在并且是可写位置的有效路径,则该函数将创建一个文件,并将最后一个错误代码设置为零。
OPEN_EXISTING
3
只有存在文件或设备时才打开。
如果指定的文件或设备不存在,则该函数将失败,并且最后一个错误代码将设置为ERROR_FILE_NOT_FOUND(2)。
TRUNCATE_EXISTING           
5
打开一个文件并截断它,以便它的大小为零字节,只要它存在。
如果指定的文件不存在,则该函数失败,并且最后的错误代码被设置为ERROR_FILE_NOT_FOUND(2)。
调用进程必须打开GENERIC_WRITE位设置为dwDesiredAccess参数的一部分的文件。
dwFlagsAndAttributes [in]
    文件或设备属性和标志FILE_ATTRIBUTE_NORMAL是文件最常用的默认值。
   此参数可以包含可用文件属性的任意组合(FILE_ATTRIBUTE_ *)。 所有其他文件属性都会覆盖FILE_ATTRIBUTE_NORMAL。
    此参数还可以包含用于控制文件或设备缓存行为,访问模式和其他特殊用途标志的标志组合(FILE_FLAG_ *)。 这些与任何FILE_ATTRIBUTE_ *值结合使用。
    此参数还可以通过指定SECURITY_SQOS_PRESENT标志来包含安全服务质量(SQOS)信息。
    当CreateFile打开现有文件时,它通常将文件标志与现有文件的文件属性组合在一起,并忽略作为dwFlagsAndAttributes的一部分提供的任何文件属性。
    官方文档中还有列出很多文件和设备属性和标志的表格,内容太多不再列出,建议参考原文。
hTemplateFile [in, optional]
    具有GENERIC_READ访问权限的模板文件的有效句柄。模板文件为正在创建的文件提供文件属性和扩展属性。
    该参数可以是NULL。
    打开现有文件时,CreateFile将忽略此参数。

    打开新的加密文件时,该文件从其父目录继承自主访问控制列表。


返回值:
    如果函数成功,则返回值是指定文件,设备,命名管道或邮件插槽的打开句柄。

    如果该函数失败,则返回值为INVALID_HANDLE_VALUE。 要获得扩展的错误信息,请调用GetLastError。

备注:

    CreateFile最初是专门为文件交互而开发的,但后来被扩展和增强,以包括Windows开发人员可用的大多数其他类型的I / O设备和机制。本节试图涵盖开发人员在不同上下文和不同I / O类型中使用CreateFile时可能遇到的各种问题

......未完,还有


猜你喜欢

转载自blog.csdn.net/li_wen01/article/details/80142931
今日推荐