CreateFile因ERROR_ACCESS_DENIED而失败

时间:2012-03-04 23:04:33

标签: c winapi

我需要检索目录的句柄才能在其上调用 ReadDirectoryChangesW 。实际上我需要更多的东西,但让我们先轻松一点。我把问题缩小到了这个范围:

m_directoryHandle = CreateFileA(
    "C:\\Users\\victor\\Documents\\Projets\\libxnotify\\unittests", // __in      LPCTSTR lpFileName,
    FILE_LIST_DIRECTORY,    // __in      DWORD dwDesiredAccess,
    0,                      // __in      DWORD dwShareMode,
    0,                      // __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    OPEN_EXISTING,          // __in      DWORD dwCreationDisposition,
    0,                      // __in      DWORD dwFlagsAndAttributes,
    0                       // __in_opt  HANDLE hTemplateFile
);

返回INVALID_HANDLE_VALUE,错误代码为ERROR_ACCESS_DENIED。毋庸置疑,我已经尝试了不同参数的大量,没有一个在它们上面工作。我运行我的程序作为胜利者,为了确保我真的拥有该unittests目录中的权限,我打开了一个命令shell并输入:

C:\Users\victor>echo bla >> "C:\Users\victor\Documents\Projets\libxnotify\unittests\test"

并且有效。

1 个答案:

答案 0 :(得分:3)

ReadDirectoryChangesW的文档中有一条注明:

  

要获取目录句柄,请使用带有 FILE_FLAG_BACKUP_SEMANTICS 标记的CreateFile函数。

CreateFile的文档还有一个更详细的说明:

  

<强>目录

     

应用程序无法使用CreateFile创建目录,因此只有 OPEN_EXISTING 值对此用例的dwCreationDisposition有效。要创建目录,应用程序必须调用CreateDirectoryCreateDirectoryEx

     

要使用CreateFile打开目录,请将 FILE_FLAG_BACKUP_SEMANTICS 标记指定为dwFlagsAndAttributes的一部分。如果在没有 SE_BACKUP_NAME SE_RESTORE_NAME 权限的情况下使用此标记,则仍然适用相应的安全检查。

您错过了FILE_FLAG_BACKUP_SEMANTICS的重要dwFlagsAndAttributes标记。