2

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

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

更好的绩效政策

4

2 回答 2

3

您需要使用 . 发送 IOCTL_DISK_SET_CACHE_INFORMATION 控制代码DeviceIoControl


我建议您使用Dskcache.exe 工具来配置“Power Protected”写入缓存选项。

在 W2K SP3 中,除了“写入缓存”选项之外,MS 还引入了“电源保护”写入缓存选项。基本上,要让 FS 驱动程序发出 Flush/Write-Through 命令,您需要将“Write Caching”选项设置为 Enabled,并将“Power Protected”选项设置为 Disabled(请参阅此处的更多信息:http: //support.microsoft。 com/?kbid=332023 )。1

.

1 个 来源

于 2011-09-13T11:28:50.687 回答
2

Alex K. 提供的此链接是我接受的答案:它涉及IOCTL_DISK_SET_CACHE_INFORMATION DeviceIoControl()

http://blogs.msdn.com/b/dhawan/archive/2009/10/05/enable-or-disable-enable-write-caching-on-disk-behavior-on-disk.aspx

#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);
}

旧信息
Windows 2K 确实包含“电源保护”写入缓存选项,但它从未被带到 Windows XP。这对使用Dskcache.exe无效发表评论。是否曾经将“电源保护模式”重新放入例如 Windows Vista 中?我不知道。

于 2011-09-13T16:41:38.307 回答