ドライブの書き込みキャッシュが有効かどうか調べる

物理ドライブの書き込みキャッシュや読み込みキャッシュが有効になっているかどうかを取得する。この情報は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);
}

プロジェクトファイルをダウンロード


カテゴリー「システム情報」 のエントリー