Windows学习(003)--CreateFile

来源:互联网 发布:公司seo是什么职位 编辑:程序博客网 时间:2024/06/05 23:03

CreateFile

原型:

HANDLE  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    );

CreateFile的参数
更具体参考MSDN

lpFileName

指定要打开、创建的文件或设备的名字。

dwDesiredAccess

  1. 指定以何种权限打开文件或设备,可以归纳为:读访问权、写访问权、读写访问权、非读非写访问权。
  2. 最常使用的值为 GENERIC_READ, GENERIC_WRITE, 或者二者都用(GENERIC_READ | GENERIC_WRITE)。获取更多信息,参见 Generic Access Rights, File Security and
    Access Rights, File Access Rights Constants 和 ACCESS_MASK
  3. 如果参数值为 0,那么程序可以在不访问文件或设备情况下,询问某些元数据,如文件、目录或者设备属性。此外,即使 GENERIC_READ 请求,也会被拒绝。
  4. 你无法请求一个与共享模式冲突的访问权限。共享模式是在参数 dwShareMode 中设置的。

dwShareMode

  1. 设置文件或者设备的共享模式,包括读、写、读写、删除、全部权限或者以上什么权限都没有(参考下面的表格)。此参数不影响对属性和扩展属性的访问请求。
  2. 如果此参数为 0 且 CreateFile 函数执行成功,那么此文件或设备无法被共享,且在其句柄被关闭前,无法被再次打开。更多信息,参见本文备注。
  3. 你无法设置一个与访问模式相冲突的共享模式。此时如果 CreateFile 函数执行失败,那么 GetLastError 函数会返回 ERROR_SHARING_VIOLATION。
  4. 为了允许进程去共享一个已经在另一个进程中打开的文件或句柄,那么可对以下一个或多个取值进行组合,且各取值间需要可互相兼容。更多有关此参数与
    dwDesiredAccess 参数的合法取值组合的信息,参见 Creating and Opening Files。
  5. 注意:在句柄被关闭之前,每个句柄的共享选项都会一直生效,且与进程的运行上下文(process context)无关。

lpSecurityAttributes

  1. 指向 SECURITY_ATTRIBUTES 结构体的指针。此结构体拥有两个分开但是相关的数据成员:一个是可选的安全描述符,另一个是决定返回的句柄是否可以被子进程继承的 Boolean 值。
  2. 此参数可以设置为 NULL。
  3. 如果参数为 NULL,那么 CreateFile 函数返回的句柄无法被任意此进程的子进程所继承,且与返回的句柄所对应的文件或句柄拥有一个默认的安全描述符
  4. 该结构体的 lpSecurityDescriptor 成员为文件或设备指定一个安全描述符(SECURITY_DESCRIPTOR)。如果此成员取值为 NULL,那么与返回的句柄所对应的文件或句柄拥有一个默认的安全描述符
  5. 当打开一个已经存在的文件或设备时,CreateFile 函数忽略 lpSecurityDescriptor 成员,但是 bInheritHandle 成员仍然可以使用
  6. 结构体的 bInheritHandle 成员用于设置返回的句柄是否可以被继承

dwCreationDisposition

  1. 用于设置当文件存在或不存在时,要对文件或设备执行何种操作
  2. 对于设备来说,此参数通常设置为 OPEN_EXISTING

dwFlagsAndAttributes

  1. 文件或设备的属性值和标记位,对于文件来说,FILE_ATTRIBUTE_NORMAL 是最常用的默认值
  2. 此参数可以是任意文件属性值(FILE_ATTRIBUTE_*)的组合。所有其他的文件属性值会覆盖 FILE_ATTRIBUTE_NORMAL
  3. 此参数也可以包含任意标记位(FILE_FLAG_*)的组合以控制文件或设备的行为、权限设置和其他目的。此外,还可以与任意 FILE_ATTRIBUTE_* 进行组合
  4. 这个参数还可以通过指定 SECURITY_SQOS_PRESENT 标记来包含 Security Quality of Service (SQOS) 信息。与SQOS相关的标记位信息见属性与标记位表格下面的表格中
  5. 注意:当CreateFile 打开一个已存在的文件时,它通常将文件属性和文件标记位组合在一起,并且忽略在 dwFlagsAndAttributes 中定义的属性值。详细例子见 Creating and Opening Files
  6. 以下的属性和标记位可能只适用于文件的打开,而并非支持所有其他 CreateFile 函数可以打开的设备。想了解更多信息,参见本文备注部分和 Creating and Opening Files。想进一步了解文件属性相关信息,参见 SetFileAttributes 函数。你还可以在 File Attribute Constants 中看到完整的介绍所有文件属性的值和对应描述信息

hTemplateFile

  1. 指向一个拥有 GENERIC_READ 访问权限的的模板文件的合法句柄
  2. 此模板文件为即将创建的文件提供属性和扩展属性
  3. 参数值可以为 NULL
  4. 如果打开一个已存在的文件,则 CreateFile 函数忽略这个参数
  5. 如果打开一个新的被加密文件,此函数从其父目录中继承自由存取控制列表。更多信息,见 File Encryption

返回值

  1. 如果函数调用成功,返回指向指定文件的句柄、设备、命名管道或者邮槽;
  2. 如果函数调用失败,返回值为 INVALID_HANDLE_VALUE。
  3. 想获取具体错误信息,调用 GetLastError 函数。
1 0
原创粉丝点击