Windows 如何启用";“更好的性能”;在C/C++;

Windows 如何启用";“更好的性能”;在C/C++;,windows,deviceiocontrol,Windows,Deviceiocontrol,如何以C/C++编程方式在外部USB HD上启用“更好的性能” 具体来说,我指的是Microsoft Windows控制面板中的“设备属性”窗格。它启用了一种操作系统级写缓存 您需要发送 我建议您使用配置“电源保护”写缓存选项 使用W2K SP3 MS时,除了“写缓存”选项外,还引入了“电源保护”写缓存选项。 基本上,要让FS驱动程序发出Flush/Write-Through命令,需要将“Write-Caching”选项设置为Enabled和 禁用“电源保护”选项(请参阅此处的更多信息:)。1

如何以C/C++编程方式在外部USB HD上启用“更好的性能”

具体来说,我指的是Microsoft Windows控制面板中的“设备属性”窗格。它启用了一种操作系统级写缓存

您需要发送


我建议您使用配置“电源保护”写缓存选项

使用W2K SP3 MS时,除了“写缓存”选项外,还引入了“电源保护”写缓存选项。 基本上,要让FS驱动程序发出Flush/Write-Through命令,需要将“Write-Caching”选项设置为Enabled和 禁用“电源保护”选项(请参阅此处的更多信息:)。1

.
1

Alex K提供的这个链接是我公认的答案:它涉及
IOCTL\u DISK\u SET\u CACHE\u INFORMATION device control()

#定义_WIN32_WINNT 0x0503
#包括
磁盘缓存信息;
磁盘缓存信息rinfo;
真空总管(真空)
{
德沃德rr;
处理设备;
德沃德·厄尔;
德沃德回来了;
hDevice=CreateFile(“\\.\\C:”,//要打开的驱动器
一般的读,一般的写,
文件共享写入文件共享读取,
//共享模式
NULL,//默认安全属性
打开\u现有,//处置
文件属性系统,//文件属性
NULL);//不复制文件属性
if(hDevice==无效的句柄值)
{
返回;
}
rr=设备控制(hDevice,IOCTL\u DISK\u GET\u CACHE\u INFORMATION,NULL,
0,(LPVOID)和info,(DWORD)sizeof(info),(LPDWORD)和returned,(LPOVERLAPPED)NULL);
如果(!rr)
{
err=GetLastError();
返回;
}
info.writeccachenabled=true;
info.ReadCacheEnabled=false;
info.DisablePrefetchTransferLength=1;
rr=设备控制(hDevice、IOCTL\u DISK\u SET\u CACHE\u INFORMATION,(LPVOID)和info,(DWORD)sizeof(info),
NULL,0,(LPDWORD)并返回(LPOVERLAPPED)NULL);
如果(!rr)
{
err=GetLastError();
返回;
}
rr=设备控制(hDevice,IOCTL\u DISK\u GET\u CACHE\u INFORMATION,NULL,0,
(LPVOID)&rinfo,(DWORD)sizeof(rinfo),(LPDWORD)&returned,(LPOVERLAPPED)NULL);
如果(!rr)
{
err=GetLastError();
返回;
}
闭合手柄(hDevice);
}

旧信息

Windows2K确实包含一个“受电源保护”的写缓存选项,但它从未被带入WindowsXP。这使得有关使用
Dskcache.exe
的注释无效。是否曾将“电源保护模式”重新设置到例如Windows Vista中?我不知道。

看一看@(评论中有一条关于vista+的警告)@Alex K。我打赌windows服务可以很好地解决这些问题。作为记录:该链接包含一段很好的代码片段,展示了如何应用IOCTL。荣誉(@unixman83:a服务不是魔术;是您将服务配置为运行的帐户造成了差异)我意识到这一点,但由于大多数服务默认以管理员身份运行,我怀疑这是一个问题。另外,我的应用程序需要
sebackupprivlege
,这样它就可以工作了。我知道WinXP中从未实现过“电源保护”功能,那么vista和更高版本呢?所以,当这样的答案在一个小时内无法获得有帮助的投票时,它将停止工作。Boo.unixman83,我知道我提供的一些信息已经过时/不适用。然而,我认为我会提供在查找IOCTL时偶然发现的信息。PS接受你自己的答案没关系**(IIRC)-1这不是对原始问题的正确答案
IOCTL\u DISK\u SET\u CACHE\u信息
将设置磁盘缓存属性,而不是Windows驱动器缓存属性。它不会在您的问题的屏幕截图中设置设置,而是在原始文章的屏幕截图中设置设置。我找到的最好的一篇文章非常详尽,但也缺少一个查询/设置文件系统写缓存状态的选项。我还没有找到任何关于FS缓存的API文档。
#define _WIN32_WINNT 0x0503

#include <windows.h>

DISK_CACHE_INFORMATION info;
DISK_CACHE_INFORMATION rinfo;


void main(void)
{
    DWORD rr;
    HANDLE hDevice;
    DWORD err;
    DWORD returned;

    hDevice = CreateFile("\\\\.\\C:", // drive to open
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_WRITE | FILE_SHARE_READ, 
                // share mode
                NULL, // default security attributes
                OPEN_EXISTING, // disposition
                FILE_ATTRIBUTE_SYSTEM, // file attributes
                NULL); // do not copy file attributes
    if(hDevice==INVALID_HANDLE_VALUE)
    {
        return;
    }

    rr = DeviceIoControl(hDevice,IOCTL_DISK_GET_CACHE_INFORMATION,NULL,
                        0,(LPVOID)&info,(DWORD)sizeof(info),(LPDWORD)&returned,    (LPOVERLAPPED)NULL);
    if (!rr)
    {
        err = GetLastError();
        return;
    }

    info.WriteCacheEnabled = true;
    info.ReadCacheEnabled = false;
    info.DisablePrefetchTransferLength = 1;

    rr = DeviceIoControl(hDevice,IOCTL_DISK_SET_CACHE_INFORMATION,(LPVOID)&info,(DWORD)sizeof(info),
                        NULL,0,(LPDWORD)&returned,(LPOVERLAPPED)NULL);
    if (!rr)
    {
        err = GetLastError();
        return;
    }

    rr = DeviceIoControl(hDevice,IOCTL_DISK_GET_CACHE_INFORMATION,NULL,0,
                        (LPVOID)&rinfo,(DWORD)sizeof(rinfo),(LPDWORD)&returned,(LPOVERLAPPED)NULL);
    if (!rr)
    {
        err = GetLastError();
        return;
    }

    CloseHandle(hDevice);
}