Как программно включить «Лучшую производительность» на внешнем USB HD в C / C ++ - PullRequest
2 голосов
/ 13 сентября 2011

Как программно включить «Лучшую производительность» на внешнем USB HD в C / C ++.

В частности, я говорю о панели свойств устройства в панели управления в Microsoft Windows. Это позволяет использовать форму кэширования записи на уровне ОС.

Better Performance Policy

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Вам необходимо отправить код управления IOCTL_DISK_SET_CACHE_INFORMATION, используя DeviceIoControl.


Я предлагаю вам использовать инструмент Dskcache.exe для настройки параметра записи в кэш с защитой питания.

С W2K SP3 MS представила опцию «Power Protected» для записи в кэш в дополнение к опции «Write Caching». В основном, чтобы драйвер FS выдавал команды Flush / Write-Through, вам нужно установить опцию «Write Caching» в значение Enabled и опция «Power Protected» для Disabled (см. дополнительную информацию здесь: http://support.microsoft.com/?kbid=332023).1

.

1 источник

2 голосов
/ 13 сентября 2011

Эта ссылка, предоставленная Алексом К., является моим принятым ответом: она имеет дело с 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 действительно содержала опцию кэширования записи Power Protected, но она никогда не переносилась на Windows XP. Что делает комментарий об использовании Dskcache.exe недействительным. Был ли когда-нибудь возвращен «защищенный режим питания», например Виндоус виста? Я не знаю.

...