物理ドライブの書き込みキャッシュや読み込みキャッシュが有効になっているかどうかを取得する。この情報はIOCTL_DISK_GET_CACHE_INFORMATIONにより取得できる。ただし対応OSはWindows 2000以降。
#include "atlstr.h"
#include "winioctl.h"
//
// ライト/リードキャッシュ設定状態の取得
//
//nDriveNoは0~の数値で指定
//
//IOCTL_DISK_GET_CACHE_INFORMATIONによりディスク情報を取得する
//
//対応OS:Windows 2000以降
//
bool GetDiskCacheInformation(int nDriveNo,bool* pbWriteChachEnable,bool* pbReadChachEnable)
{
DWORD dwWritten;
BOOL ret;
HANDLE hDevice;
TCHAR pszDevice[256];
if(pbWriteChachEnable)
*pbWriteChachEnable = false;
if(pbReadChachEnable)
*pbReadChachEnable = false;
::_stprintf_s (pszDevice,256,_T("\\\\.\\PHYSICALDRIVE%d"),nDriveNo);
hDevice = ::CreateFile(pszDevice,GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL);
if(hDevice == INVALID_HANDLE_VALUE)
return false;
DISK_CACHE_INFORMATION sInfo;
::ZeroMemory(&sInfo,sizeof(DISK_CACHE_INFORMATION));
ret = ::DeviceIoControl(hDevice,IOCTL_DISK_GET_CACHE_INFORMATION,NULL,0,&sInfo,sizeof(DISK_CACHE_INFORMATION),&dwWritten,NULL);
::CloseHandle(hDevice);
if(ret == FALSE || dwWritten != sizeof(DISK_CACHE_INFORMATION))
return false;
if(pbWriteChachEnable)
*pbWriteChachEnable = (sInfo.WriteCacheEnabled) ? true : false;
if(pbReadChachEnable)
*pbReadChachEnable = (sInfo.ReadCacheEnabled) ? true : false;
return true;
}
void Test(void)
{
bool ret;
bool bWriteChachEnable;
bool bReadChachEnable;
ret = GetDiskCacheInformation(0,&bWriteChachEnable,&bReadChachEnable);
if(ret)
{
CAtlString strMessage;
if(bWriteChachEnable)
strMessage += _T("ライトキャッシュが有効です。\n");
else
strMessage += _T("ライトキャッシュが無効です。\n");
if(bReadChachEnable)
strMessage += _T("リードキャッシュが有効です。\n");
else
strMessage += _T("リードキャッシュが無効です。\n");
::MessageBox(NULL,strMessage,_T(""),MB_OK);
}
else
::MessageBox(NULL,_T("取得に失敗しました"),_T(""),MB_OK);
}
