Winapi win32 CreateFile2 api调用的目的是什么?

Winapi win32 CreateFile2 api调用的目的是什么?,winapi,windows-8,Winapi,Windows 8,他们在windows 8中添加了一个名为CreateFile2的新API调用,据我所知,该调用与现有的CreateFile函数完全相同,只是它的参数打包方式有所不同 由于文件创建标志、文件属性标志和属性标志的多路复用,我在文档中看不到任何内容,因此添加了哪些内容使之成为必要 将安全QoS标志转换为单个DWORD(dwFlagsAndAttributes)参数,用于 CreateFile,无法向CreateFile添加更多标志。附加的 必须仅将创建操作的标志添加到CreateFile2。例如,文件

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


由于文件创建标志、文件属性标志和属性标志的多路复用,我在文档中看不到任何内容,因此添加了哪些内容使之成为必要 将安全QoS标志转换为单个DWORD(dwFlagsAndAttributes)参数,用于 CreateFile,无法向CreateFile添加更多标志。附加的
必须仅将创建操作的标志添加到CreateFile2。例如,文件\u标志\u打开\u需要\u OPLOCK标志。这个标志被记录在案

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

<>我在C++库中使用的典型模式如下。当使用C++异常处理(除了好)时,我使用文件句柄来支持:

对于用于读取的
dwShareMode
参数,必须使用
FILE\u SHARE\u READ
而不是0。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
权限,因为如果文件输出过程失败,我使用
SetFileInformationByHandle
FILE\u DISPOSITION\u INFO
进行清理。看


有关更多信息,请参阅。

CreateFile2
可由store/metro应用程序使用,而
CreateFile
仅用于桌面应用程序,因此可能会有一些额外的安全审计。我想,但后来我想,他们不需要新功能,对于在winrt上运行时不允许的事情,它可能会返回一个失败。@J99“需要”在这里并不重要。也许他们可以用你的方式来做。但也许使用一个新函数更容易、更干净。“对于UWP应用程序,使用文件共享而不是0是很重要的”,这是一个信息宝库。
#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
#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!