如何在 C/C++ 中以编程方式在外部 USB HD 上启用“更好的性能”。
具体来说,我说的是 Microsoft Windows 控制面板中的设备属性窗格。这启用了一种操作系统级别的写入缓存。
如何在 C/C++ 中以编程方式在外部 USB HD 上启用“更好的性能”。
具体来说,我说的是 Microsoft Windows 控制面板中的设备属性窗格。这启用了一种操作系统级别的写入缓存。
您需要使用 . 发送 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 个 来源
Alex K. 提供的此链接是我接受的答案:它涉及IOCTL_DISK_SET_CACHE_INFORMATION DeviceIoControl()
#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 中?我不知道。