TNB Library
TnbDriveInformation.h
[詳解]
1#pragma once
11#include "TnbDriveCommander.h"
12#include "TnbDump.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
32{
33public:
34
36 CDriveInformation(void) : m_cLetter(0)
37 {
38 }
39
44 void Detatch(void)
45 {
46 m_cLetter = 0;
47 }
48
56 bool Atatch(TCHAR cLetter)
57 {
58 Detatch();
59 if ( ExistDrive(cLetter) )
60 {
61 m_cLetter = cLetter;
62 return true;
63 }
64 return false;
65 }
66
73 bool IsValid(void) const
74 {
75 return m_cLetter != 0;
76 }
77
89 DWORD GetType(void) const
90 {
91 TCHAR a[] = { m_cLetter, ':', '\\', 0 };
92 return ::GetDriveType(a);
93 }
94
103 {
104 TCHAR a[] = { m_cLetter, ':', '\\', 0 };
105 return GetPhysicalDriveNumber(_pdn, a);
106 }
107
114 bool IsRemoval(void) const
115 {
116 switch ( GetType() )
117 {
118 case DRIVE_REMOVABLE: // このディスクは、ドライブから取り出せます。
119 case DRIVE_CDROM: // このドライブは、CD-ROM ドライブです。
120 return true;
121 }
122 return false;
123 }
124
132 bool GetVendorId(CStr& _id, bool withRevision = false) const
133 {
134 CDriveCommander scsi;
135 if ( scsi.OpenLetter(m_cLetter) )
136 {
137 return scsi.GetVendorId(_id, withRevision);
138 }
139 return false;
140 }
141
148 {
149 CDriveCommander scsi;
150 scsi.OpenLetter(m_cLetter);
151 return scsi;
152 }
153
160 bool IsReady(void) const
161 {
162 if ( GetType() == DRIVE_FIXED )
163 {
164 return true;
165 }
166 CDriveCommander scsi;
167 if ( scsi.OpenLetter(m_cLetter) )
168 {
169 scsi.Send_TestUnit();
170 return scsi.Send_TestUnit() == 0;
171 }
172 return false;
173 }
174
181 bool CanWrite(void) const
182 {
183 if ( GetType() == DRIVE_FIXED )
184 {
185 return true;
186 }
187 CDriveCommander scsi;
188 if ( scsi.OpenLetter(m_cLetter) )
189 {
190 return scsi.CanWrite(); //ライトプロテクト
191 }
192 return false; // 書き込めない
193 }
194
206 DWORD FormatDlg(HWND hWnd, bool hasCheckDlg = false) const
207 {
208 DWORD r = 0xFFFFFFFEL;
209 if ( IsValid() )
210 {
211 HMODULE hInst = ::LoadLibraryA("shell32.dll");
212 if ( hInst != NULL )
213 {
214 DWORD (WINAPI *pShFormatDrive)(HWND hWnd, UINT drive, UINT fmdID, UINT options);
215 TNB::ForceSet(pShFormatDrive, ::GetProcAddress(hInst, "SHFormatDrive"));
216 if ( pShFormatDrive != NULL )
217 {
218 UINT nowMode = ::SetErrorMode(0);
219 if ( hasCheckDlg )
220 {
221 ::SetErrorMode(nowMode | SEM_FAILCRITICALERRORS);
222 }
223 else
224 {
225 ::SetErrorMode(nowMode & ~SEM_FAILCRITICALERRORS);
226 }
227 int d = (m_cLetter | 0x20) - 'a';
228 r = (pShFormatDrive)(hWnd, d, 0xFFFF, 0x0);
229 ::SetErrorMode(nowMode);
230 }
231 ::FreeLibrary(hInst);
232 }
233 }
234 return r;
235 }
236
244 static bool ExistDrive(TCHAR cLetter)
245 {
246 int r = (cLetter | 0x20) - 'a';
247 if ( r >= 0 && r <= 25 )
248 {
249 DWORD d = ::GetLogicalDrives();
250 return (d & _BIT(r)) != 0;
251 }
252 return false;
253 }
254
260 {
262 DWORD d = ::GetLogicalDrives();
263 loop ( i, 26 )
264 {
265 if ( (d & _BIT(i)) != 0 )
266 {
267 r.Add(static_cast<TCHAR>(_T('A') + i));
268 }
269 }
270 return r;
271 }
272
281 static bool GetPhysicalDriveNumber(CVectorT<int>& _pdn, LPCTSTR lpszPath)
282 {
283 _pdn.RemoveAll();
284 CStr s1;
285 if ( ! ::GetVolumePathName(lpszPath, s1.GetBuffer(1024), 1024) )
286 {
287 return false;
288 }
289 s1.ReleaseBuffer();
290 CStr vol;
291 if ( ! ::GetVolumeNameForVolumeMountPoint(s1, vol.GetBuffer(1024), 1024) )
292 {
293 return false;
294 }
295 vol.ReleaseBuffer();
296 vol.TrimRight('\\');
297 HANDLE h = ::CreateFile(vol, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
298 VOLUME_DISK_EXTENTS buf;
299 DWORD returnedSize = 0;
300 BOOL r = ::DeviceIoControl(
301 h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &buf, sizeof(buf), &returnedSize, NULL);
302 DWORD le = _GetLastError("DeviceIoControl");
303 if ( r && buf.NumberOfDiskExtents == 1 )
304 {
305 _pdn.Add(buf.Extents[0].DiskNumber);
306 ::CloseHandle(h);
307 return true;
308 }
309 if ( le != ERROR_MORE_DATA )
310 {
311 ::CloseHandle(h);
312 return false;
313 }
314 size_t bs = sizeof(buf.NumberOfDiskExtents) + sizeof(buf.Extents) * buf.NumberOfDiskExtents;
315 CWorkMem w(bs);
316 VOLUME_DISK_EXTENTS* p = reinterpret_cast<VOLUME_DISK_EXTENTS *>(w.Ref());
317 r = ::DeviceIoControl(
318 h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, p, bs, &returnedSize, NULL);
319 le = _GetLastError("DeviceIoControl");
320 if ( r )
321 {
322 loop ( i, p->NumberOfDiskExtents )
323 {
324 _pdn.Add(p->Extents[i].DiskNumber);
325 }
326 }
327 ::CloseHandle(h);
328 return !! r;
329 }
330
331private:
332 TCHAR m_cLetter;
333};
334
335
336
337}; // TNB
#define _BIT(X)
BIT演算
Definition: TnbDef.h:307
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ドライブコマンダー関係のヘッダ
開発用に、メモリの状態を文字列にする関数があります。
ドライブコマンダークラス
bool GetVendorId(CStr &_id, bool withRevision=false) const
[取得] ベンダID 取得.
int Send_TestUnit(void)
[送信] TEST UNIT CDB送信.
bool OpenLetter(TCHAR driveLetter)
[操作] オープン.
virtual bool CanWrite(void) const
[確認] 書込み可能か?
ドライブ情報クラス
static bool GetPhysicalDriveNumber(CVectorT< int > &_pdn, LPCTSTR lpszPath)
[確認] 物理ドライブ番号取得.
bool GetVendorId(CStr &_id, bool withRevision=false) const
[取得] ベンダID 取得.
static bool ExistDrive(TCHAR cLetter)
[確認] ドライブ存在確認.
DWORD FormatDlg(HWND hWnd, bool hasCheckDlg=false) const
[処理] フォーマットダイアログ表示
bool GetPhysicalDriveNumber(CVectorT< int > &_pdn) const
[確認] 物理ドライブ番号取得.
bool IsValid(void) const
[確認] 有効か?.
DWORD GetType(void) const
[確認] 種類確認.
bool IsReady(void) const
[確認] アクセス可能か?.
bool IsRemoval(void) const
[確認] 取り外し可能か?.
CDriveCommander CreateCommander(void)
[作成] SCSIコマンダー作成.
CDriveInformation(void)
コンストラクタ
bool Atatch(TCHAR cLetter)
[設定] アタッチ.
bool CanWrite(void) const
[確認] 書込み可能か?.
static CVectorT< TCHAR > EnumDrive(void)
[取得] ドライブレター一覧.
void Detatch(void)
[設定] デタッチ.
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
CStrT & TrimRight(TYP t=' ')
[処理] 末尾から文字をトリム.
Definition: TnbStr.h:990
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
配列型情報管理テンプレート
Definition: TnbVector.h:75
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
const TYP * Ref(void) const
[取得] ポインタ取得
Definition: TnbDef.h:712
TNB Library
Definition: TnbDoxyTitle.txt:2