【问题标题】:What is the purpose of the win32 CreateFile2 api call?win32 CreateFile2 api调用的目的是什么?
【发布时间】:2012-11-08 11:45:21
【问题描述】:

他们在 Windows 8 中添加了一个名为 CreateFile2 的新 API 调用,据我所知,它与现有的 CreateFile 函数完全相同,只是它的参数打包方式有所不同。

添加了什么是必要的,因为我在文档中看不到任何内容。

【问题讨论】:

  • CreateFile2 可以被 store/metro 应用使用,而CreateFile 仅适用于桌面应用,所以大概有一些额外的安全审核在前者中进行
  • 嗯,我是这么想的,但后来我认为他们不需要一个新函数,它可能会返回一个失败,因为在 winrt 上运行时不允许的事情。
  • @J99 “需要”在这里并不重要。也许他们可以按照你的方式来做。但也许使用新功能更容易、更简洁。

标签: winapi windows-8


【解决方案1】:

CreateFile 实际上可以做的不仅仅是打开一个文件。 CreateFile2 的创建是为了将函数的“表面积”限制为仅允许 UWP 应用程序使用的功能,并且因为 WACK 工具无法真正区分导入的“好”使用和“坏”使用功能,只是它正在被使用。

我在 C++ 库中使用的典型模式如下。我使用RAII pattern 作为文件句柄以支持在使用 C++ 异常处理时(除了很好的modern C++ coding practice):

#include <assert.h>
#include <memory>

struct handle_closer
    { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) CloseHandle(h); } };

using ScopedHandle = std::unique_ptr<void, handle_closer>;

inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; }

我有safe_handle 的原因是因为CreateFileCreateFile2 被定义为返回INVALID_HANDLE_VALUE (-1) 而不是返回0 失败。大多数其他返回句柄的 Win32 函数在失败时返回 0,我已经确认没有任何情况下“0”是有效的 Win32 句柄。

为了阅读我使用:

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
ScopedHandle hFile(safe_handle(
    CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr)));
#else
ScopedHandle hFile(safe_handle(
    CreateFileW(szFile, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING,
    FILE_FLAG_SEQUENTIAL_SCAN, nullptr)));
#endif
if (!hFile)
   // Error

使用FILE_SHARE_READ 代替0 来读取dwShareMode 参数很重要。 UWP 应用对现有文件没有独占读取权限,因此如果您使用“独占”共享模式(即 0),调用将失败。

对于写入文件:

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
ScopedHandle hFile(safe_handle(
    CreateFile2(szFile, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr)));
#else
ScopedHandle hFile(safe_handle(
    CreateFileW(szFile, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr)));
#endif
if (!hFile)
    // Error!

对于写作,我请求DELETE 权限,因为如果文件输出过程失败,我使用SetFileInformationByHandleFILE_DISPOSITION_INFO 进行清理。见scoped.h

请参阅Dual-use Coding Techniques for Games 了解更多信息。

【讨论】:

  • “对于 UWP 应用程序使用 FILE_SHARE_READ 而不是 0 很重要”是信息的瑰宝。
【解决方案2】:

由于文件创建标志、文件属性标志和 安全 QoS 标志到单个 DWORD (dwFlagsAndAttributes) 参数中 CreateFile,无法向 CreateFile 添加更多标志。额外的 创建操作的标志只能添加到 CreateFile2。例如 FILE_FLAG_OPEN_REQUIRING_OPLOCK 标志。此标志记录在 FltCreateFile - kernel mode

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2012-08-27
    • 2016-08-23
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多