Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 逻辑扩展文件失败_C++_Windows_File Io - Fatal编程技术网

C++ 逻辑扩展文件失败

C++ 逻辑扩展文件失败,c++,windows,file-io,C++,Windows,File Io,尝试使用逻辑扩展我的Windows 8.1文件时,以下代码失败 返回的Windows错误代码和消息为: 错误\u权限\u未被保留 1314(0x522)客户端未持有所需的权限 我以管理员的身份运行代码,并使用OpenProcessToken()和GetTokenInformation()断言该进程确实具有SE\u MANAGE\u VOLUME\u NAME权限 需要先启用特权,然后才能使用它们。下面是我的一个项目中的一些代码,它启用了SE\u INCREASE\u QUOTE\u NAME和S

尝试使用逻辑扩展我的Windows 8.1文件时,以下代码失败

返回的Windows错误代码和消息为:

错误\u权限\u未被保留 1314(0x522)客户端未持有所需的权限

我以管理员的身份运行代码,并使用
OpenProcessToken()
GetTokenInformation()
断言该进程确实具有
SE\u MANAGE\u VOLUME\u NAME
权限


需要先启用特权,然后才能使用它们。下面是我的一个项目中的一些代码,它启用了
SE\u INCREASE\u QUOTE\u NAME
SE\u ASSIGNPRIMARYTOKEN\u NAME
,可以轻松修改它以启用其他特权

BOOL enable_privs(void)
{
    HANDLE token;

    struct {
        DWORD count;
        LUID_AND_ATTRIBUTES privilege[2];
    } token_privileges;

    token_privileges.count = 2;
    token_privileges.privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
    token_privileges.privilege[1].Attributes = SE_PRIVILEGE_ENABLED;

    if (!LookupPrivilegeValue(0, SE_INCREASE_QUOTA_NAME, &token_privileges.privilege[0].Luid)) return FALSE;
    if (!LookupPrivilegeValue(0, SE_ASSIGNPRIMARYTOKEN_NAME, &token_privileges.privilege[1].Luid)) return FALSE;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) return FALSE;
    if (!AdjustTokenPrivileges(token, 0, (PTOKEN_PRIVILEGES)&token_privileges, 0, 0, 0)) return FALSE;
    if (GetLastError() != ERROR_SUCCESS) return FALSE;

    return TRUE;
}

因此,您肯定不是真正以管理员权限运行的。你从没提过要照顾UACmanifest@HansPassant我是肯定的,我已经更新了帖子并添加了我的
ProcessHasSeManageVolumePrivilege()
方法,该方法断言正在运行的进程具有
SE\u MANAGE\u VOLUME\u名称(\'SeManageVolumePrivilege\”)
权限。当提到“UAC清单”时,我不知道你的意思;我还需要处理一些UAC问题吗?@HansPassant我刚想起我的Windows 8.1是加固的,这可能与我的困惑有关。。。但是什么?你真的需要这么做吗?您需要此操作的特权(内容未初始化,因此您可能会看到过时的机密数据)是有原因的,并且存在实现此操作的其他方法。如果
SetEndOfFile
由于可能会阻塞一段时间而不可接受,请创建一个超出文件大小的内存映射。始终对我来说工作可靠,并且需要“零时间”,不确切地知道它是如何工作的,大概Windows会将文件的某些部分标记为“零”,并在映射时提供零池中的页面?不管怎样,它确实有效,而且没有特权:-)@Damon问得好。假设在数据库系统(如我们的系统)中,当数据库文件在增长时进行逻辑扩展而不是物理扩展文件时,会有显著的性能提升,而物理扩展文件需要额外的I/O操作,如零填充。我还没有测试这些说法,但听起来很合理。我们不使用稀疏文件,所以我认为它们必须是零填充的,以避免可能显示“旧”数据的安全漏洞。这样做是因为
SetFileValidData()
失败,出现错误#87“参数不正确”。现在开始工作了。错误#87是因为在
SetFileValidData()
之前没有调用
SetFilePointerEx()
SetEndOfFile()
C:\dev\SetFileValidData_test\Debug> SetFileValidData_test.exe
Asserting process has the "SeManageVolumePrivilege" privilege:
        SeIncreaseQuotaPrivilege ... no
        SeSecurityPrivilege ... no
        SeTakeOwnershipPrivilege ... no
        SeLoadDriverPrivilege ... no
        SeSystemProfilePrivilege ... no
        SeSystemtimePrivilege ... no
        SeProfileSingleProcessPrivilege ... no
        SeIncreaseBasePriorityPrivilege ... no
        SeCreatePagefilePrivilege ... no
        SeBackupPrivilege ... no
        SeRestorePrivilege ... no
        SeShutdownPrivilege ... no
        SeDebugPrivilege ... no
        SeSystemEnvironmentPrivilege ... no
        SeChangeNotifyPrivilege ... no
        SeRemoteShutdownPrivilege ... no
        SeUndockPrivilege ... no
        SeManageVolumePrivilege ... YES! Found it!
SetFileValidData() failed with error #1314.

C:\dev\SetFileValidData_test\Debug>
BOOL enable_privs(void)
{
    HANDLE token;

    struct {
        DWORD count;
        LUID_AND_ATTRIBUTES privilege[2];
    } token_privileges;

    token_privileges.count = 2;
    token_privileges.privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
    token_privileges.privilege[1].Attributes = SE_PRIVILEGE_ENABLED;

    if (!LookupPrivilegeValue(0, SE_INCREASE_QUOTA_NAME, &token_privileges.privilege[0].Luid)) return FALSE;
    if (!LookupPrivilegeValue(0, SE_ASSIGNPRIMARYTOKEN_NAME, &token_privileges.privilege[1].Luid)) return FALSE;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) return FALSE;
    if (!AdjustTokenPrivileges(token, 0, (PTOKEN_PRIVILEGES)&token_privileges, 0, 0, 0)) return FALSE;
    if (GetLastError() != ERROR_SUCCESS) return FALSE;

    return TRUE;
}