物理ドライブが書き込み可能かどうか調べる。CD-ROMドライブは常に書き込み不可、SDカードなどはライトプロテクト状態によって結果がする。情報取得にはIOCTL_DISK_IS_WRITABLEを利用する。
依存環境:ATL#include "atlstr.h"
#include "winioctl.h"
//
// ディスクに書き込めるかを調べる
//
//nDriveNoは0~の数値で指定
//
//IOCTL_DISK_GET_CACHE_INFORMATIONによりディスク情報を取得する
//
//対応OS:Windows 2000以降
//
bool GetDiskWriteProtectStatus(int nDriveNo,bool* pbWriteProtected)
{
DWORD dwWritten;
BOOL ret;
HANDLE hDevice;
TCHAR pszDevice[256];
if(pbWriteProtected == NULL)
return 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;
ret = ::DeviceIoControl(hDevice,IOCTL_DISK_IS_WRITABLE,NULL,0,NULL,0,&dwWritten,NULL);
::CloseHandle(hDevice);
if(ret == FALSE && GetLastError () != ERROR_WRITE_PROTECT)
return false;
*pbWriteProtected = (ret) ? false : true;
return true;
}
void Test(void)
{
bool ret;
bool bWriteProtected;
ret = GetDiskWriteProtectStatus(0,&bWriteProtected);
if(ret)
{
CAtlString strMessage;
if(bWriteProtected)
strMessage += _T("ディスクに書き込みません。\n");
else
strMessage += _T("ディスクに書き込めます。\n");
::MessageBox(NULL,strMessage,_T(""),MB_OK);
}
else
::MessageBox(NULL,_T("取得に失敗しました"),_T(""),MB_OK);
}
