TNB Library
クラス | 公開型 | 公開メンバ関数 | 全メンバ一覧
CDriveCommander クラス

ドライブコマンダークラス [詳解]

#include <TnbDriveCommander.h>

+ CDriveCommander の継承関係図

クラス

struct  TSenseData
 SCSI センスデータ型 [詳解]
 

公開型

enum  ESeekMode { TOP = FILE_BEGIN , CURRENT = FILE_CURRENT , END = FILE_END }
 シークのオフセット指定モード [詳解]
 

公開メンバ関数

virtual void AddRaw (size_t size, LPCVOID P)
 [追加] 追加. [詳解]
 
virtual bool CanRead (void) const
 [確認] 読み込み可能か? [詳解]
 
virtual bool CanWrite (void) const
 [確認] 書込み可能か? [詳解]
 
 CDriveCommander (void)
 コンストラクタ [詳解]
 
virtual void Close (void)
 [操作] クローズ [詳解]
 
bool DismountVolume ()
 [設定] Dismount Volume. [詳解]
 
bool GetGeometry (DISK_GEOMETRY &_g) const
 [取得] GEOMETRY 取得. [詳解]
 
LONGLONG GetLeftoverSize (void) const
 [取得] 残りサイズ取得. [詳解]
 
virtual LPCTSTR GetOpenName (void) const
 [取得] オープン名取得. [詳解]
 
virtual void GetRaw (size_t size, LPVOID _P) const
 [取得] 取得. [詳解]
 
HANDLE GetSafeHandle (void) const
 [取得] ハンドル取得. [詳解]
 
const TSenseDataGetSense (void) const
 [取得] センスデータ取得 [詳解]
 
virtual LONGLONG GetSize (void) const
 [取得] サイズ取得. [詳解]
 
bool GetVendorId (CStr &_id, bool withRevision=false) const
 [取得] ベンダID 取得. [詳解]
 
bool IsOpened (void) const
 [確認] オープン済み? [詳解]
 
bool LockVolume (void)
 [設定] Lock Volume. [詳解]
 
bool OpenDrive (DWORD driveNo)
 [操作] オープン. [詳解]
 
bool OpenLetter (TCHAR driveLetter)
 [操作] オープン. [詳解]
 
template<typename T >
ISerializeroperator<< (const T &t)
 [追加] 追加. [詳解]
 
template<typename T >
const IDeserializeroperator>> (T &_t) const
 [取得] 取得. [詳解]
 
virtual size_t Read (size_t size, LPVOID _P) const
 [取得] 読み込み [詳解]
 
void ReadExactly (size_t size, LPVOID _P) const
 [取得] 読み込み. [詳解]
 
CByteVector ReadExactly (size_t size=0) const
 [取得] 読み込み [詳解]
 
size_t ReadInto (ICollectionT< BYTE > &_out, size_t size=0, size_t oneBlockSize=4096) const
 [取得] 読み込み. [詳解]
 
CByteVector ReadInto (size_t size=0) const
 [取得] 読み込み [詳解]
 
virtual LONGLONG Seek (LONGLONG llOffset, ESeekMode seek=TOP) const
 [操作] シーク. [詳解]
 
int Send_Inquiry (ICollectionT< BYTE > &_d)
 [送信] INQUIRY CDB送信. [詳解]
 
int Send_ModeSense (ICollectionT< BYTE > &_d, BYTE pc, bool isWithBd=false)
 [送信] MODESENSE CDB送信. [詳解]
 
int Send_ReadCapacity (DWORD &_blockAddress, DWORD &_blockLength)
 [送信] Read Capacity CDB送信. [詳解]
 
int Send_StartStop (BYTE b=2)
 [送信] STARTSTOP CDB送信. [詳解]
 
int Send_TestUnit (void)
 [送信] TEST UNIT CDB送信. [詳解]
 
int Send_Write10 (DWORD ba, const ISequenceCollectionT< BYTE > &d, DWORD div=512)
 [送信] Write(10) CDB送信. [詳解]
 
int SendCommand (const ISequenceCollectionT< BYTE > &cdb)
 [送信] CDB送信. [詳解]
 
int SendCommandWithReadPhase (ICollectionT< BYTE > &_d, const ISequenceCollectionT< BYTE > &cdb, int readSize)
 [送信] CDB送信(読込みフェーズ付). [詳解]
 
int SendCommandWithWritePhase (const ISequenceCollectionT< BYTE > &cdb, const ISequenceCollectionT< BYTE > &data)
 [送信] CDB送信(書込みフェーズ付). [詳解]
 
virtual void SetEnd (void)
 [設定] EOFを指定. [詳解]
 
bool UnlockVolume (void)
 [設定] Unlock Volume. [詳解]
 
bool Update ()
 [設定] アップデート. [詳解]
 
virtual void Write (size_t size, LPCVOID P)
 [保存] 書き込み [詳解]
 
void WriteFrom (const IConstCollectionT< BYTE > &c)
 [保存] 書き込み. [詳解]
 
void WriteFrom (const IReader &reader, size_t size=0, size_t oneBlockSize=4096)
 [保存] 書き込み. [詳解]
 

詳解

ドライブコマンダークラス

IWriter インターフェースを持っています。また、 SCSIコマンドにてデバイスを操作することができます。
覚え書き
指定したメモリを直接使わず、一度内部で確保したメモリを使用しています。 そのため、指定するメモリに制限はありませんが、オーバーヘッドがあります。
Windows NT系の SPTI (SCSI PASS THROUGH INTERFACE) を使用しています。そのため、 Win9x系 OSでは動きません。
CDB の LUN、タグは無視されます。
必要ファイル
TnbDriveCommander.h
日付
07/02/15 新規作成
15/01/21 物理ドライブ番号によるオープン追加。
15/01/28 クラス名変更。 IWriter 実装。
15/06/03 IsOpened() の判定バグ修正。

TnbDriveCommander.h52 行目に定義があります。

列挙型メンバ詳解

◆ ESeekMode

enum ESeekMode
inherited

シークのオフセット指定モード

列挙値
TOP 

頭からのオフセット指定

CURRENT 

現在位置からのオフセット指定

END 

末からのオフセット指定

TnbReader.h38 行目に定義があります。

構築子と解体子

◆ CDriveCommander()

CDriveCommander ( void  )

コンストラクタ

TnbDriveCommander.h76 行目に定義があります。

関数詳解

◆ AddRaw()

virtual void AddRaw ( size_t  size,
LPCVOID  P 
)
virtualinherited

[追加] 追加.

指定データを追加します。

引数
size追加するデータサイズ(単位BYTE)
P追加するデータ
例外
CTnbException失敗時は、任意のスローの可能性があります。

ISerializerを実装しています。

TnbWriter.h115 行目に定義があります。

◆ CanRead()

virtual bool CanRead ( void  ) const
virtual

[確認] 読み込み可能か?

覚え書き
TESTUNIT で状態を確認しています。
戻り値
true可能
false不可能

IReaderを実装しています。

TnbDriveCommander.h430 行目に定義があります。

◆ CanWrite()

virtual bool CanWrite ( void  ) const
virtual

[確認] 書込み可能か?

覚え書き
MODESENSE で WP のビットを確認しています。
戻り値
true可能
false不可能

IWriterを実装しています。

TnbDriveCommander.h442 行目に定義があります。

◆ Close()

virtual void Close ( void  )
virtual

[操作] クローズ

IReaderを実装しています。

TnbDriveCommander.h92 行目に定義があります。

◆ DismountVolume()

bool DismountVolume ( )

[設定] Dismount Volume.

戻り値
true成功
false

TnbDriveCommander.h161 行目に定義があります。

◆ GetGeometry()

bool GetGeometry ( DISK_GEOMETRY &  _g) const

[取得] GEOMETRY 取得.

覚え書き
IOCTL_DISK_GET_DRIVE_GEOMETRY_EX を使い、サイズを得ています。
戻り値
true成功
false失敗

TnbDriveCommander.h482 行目に定義があります。

◆ GetLeftoverSize()

LONGLONG GetLeftoverSize ( void  ) const
inherited

[取得] 残りサイズ取得.

現在の位置から最後までのサイズを返します。

戻り値
0以上サイズ
マイナス取得失敗

TnbReader.h95 行目に定義があります。

◆ GetOpenName()

virtual LPCTSTR GetOpenName ( void  ) const
virtual

[取得] オープン名取得.

ベンダIDが返されます。

戻り値
ベンダID

IReaderを実装しています。

TnbDriveCommander.h417 行目に定義があります。

◆ GetRaw()

virtual void GetRaw ( size_t  size,
LPVOID  _P 
) const
virtualinherited

[取得] 取得.

指定データを取得します。

引数
[in]size取得するデータサイズ(単位BYTE)
[out]_P取得するデータ
例外
CTnbException失敗時は、任意のスローの可能性があります。

IDeserializerを実装しています。

TnbReader.h211 行目に定義があります。

◆ GetSafeHandle()

HANDLE GetSafeHandle ( void  ) const

[取得] ハンドル取得.

戻り値
ハンドル

TnbDriveCommander.h377 行目に定義があります。

◆ GetSense()

const TSenseData & GetSense ( void  ) const

[取得] センスデータ取得

覚え書き
このメソッドは、 Send〜()で 戻り値が2(CheckCodition)の時、使用します。
戻り値
センスデータ。

TnbDriveCommander.h140 行目に定義があります。

◆ GetSize()

virtual LONGLONG GetSize ( void  ) const
virtual

[取得] サイズ取得.

覚え書き
IOCTL_DISK_GET_DRIVE_GEOMETRY_EX を使い、サイズを得ています。
戻り値
0以上サイズ
マイナス取得失敗

IReaderを実装しています。

TnbDriveCommander.h462 行目に定義があります。

◆ GetVendorId()

bool GetVendorId ( CStr _id,
bool  withRevision = false 
) const

[取得] ベンダID 取得.

引数
[out]_id取得したベンダIDが格納されます。
[in]withRevisiontrue なら版数も含むIDを返します。
戻り値
true成功
false失敗

TnbDriveCommander.h389 行目に定義があります。

◆ IsOpened()

bool IsOpened ( void  ) const

[確認] オープン済み?

戻り値
trueオープン済み
false

TnbDriveCommander.h86 行目に定義があります。

◆ LockVolume()

bool LockVolume ( void  )

[設定] Lock Volume.

戻り値
true成功
false

TnbDriveCommander.h172 行目に定義があります。

◆ OpenDrive()

bool OpenDrive ( DWORD  driveNo)

[操作] オープン.

覚え書き
本インスタンスで使用したいドライブを指定します。
引数
driveNoドライブ番号
戻り値
true成功。
false失敗。

TnbDriveCommander.h104 行目に定義があります。

◆ OpenLetter()

bool OpenLetter ( TCHAR  driveLetter)

[操作] オープン.

覚え書き
本インスタンスで使用したいドライブを指定します。
引数
driveLetterドライブレター。
戻り値
true成功。
false失敗。

TnbDriveCommander.h123 行目に定義があります。

◆ operator<<()

ISerializer & operator<< ( const T &  t)
inherited

[追加] 追加.

指定データをシリアライズして追加します。

引数
tデータ
戻り値
自分の参照
例外
CNotSupportExceptionシリアライズをサポートしていない型が指定されると、スローされます。
CTnbException失敗時は、任意のスローの可能性があります。

TnbSerializer.h161 行目に定義があります。

◆ operator>>()

const IDeserializer & operator>> ( T &  _t) const
inherited

[取得] 取得.

指定データをデシリアライズして取得します。

引数
[out]_tデータ
戻り値
自分の参照
例外
CNotSupportExceptionデシリアライズをサポートしていない型が指定されると、スローされます。
CTnbException失敗時は、任意のスローの可能性があります。

TnbSerializer.h277 行目に定義があります。

◆ Read()

virtual size_t Read ( size_t  size,
LPVOID  _P 
) const
virtual

[取得] 読み込み

注意
512 bytes 単位でのアクセスをするようにしてください。
引数
[in]size読み込みサイズ。
[out]_P読み込みアドレス。 size 分書き込める領域である必要が有ります。
戻り値
読み込めたサイズ。
例外
CReadFailureException読み込みに失敗すると、スローされます。

IReaderを実装しています。

TnbDriveCommander.h531 行目に定義があります。

◆ ReadExactly() [1/2]

void ReadExactly ( size_t  size,
LPVOID  _P 
) const
inherited

[取得] 読み込み.

覚え書き
指定サイズ読めないとエラーになります。
引数
[in]size読み込みサイズ。
[out]_P読み込みアドレス。 size 分書き込める領域である必要が有ります。
例外
CReadFailureException読み込みに失敗すると、スローされます。
CShortOfDataException指定サイズ読込めないと、スローされます。

TnbReader.h114 行目に定義があります。

◆ ReadExactly() [2/2]

CByteVector ReadExactly ( size_t  size = 0) const
inherited

[取得] 読み込み

覚え書き
指定サイズ読めないとエラーになります。
引数
size読み込みサイズ。0ならファイル最後まで読み込む。
戻り値
ByteVector ファイル内容(サイズは読み込めたサイズ)。
例外
CReadFailureException読み込みに失敗すると、スローされます。
CShortOfDataException指定サイズ読込めないと、スローされます。

TnbReader.h134 行目に定義があります。

◆ ReadInto() [1/2]

size_t ReadInto ( ICollectionT< BYTE > &  _out,
size_t  size = 0,
size_t  oneBlockSize = 4096 
) const
inherited

[取得] 読み込み.

引数
[out]_out読込先。クリアせず、後ろに追加します。
size読み込みサイズ。省略か0ならファイル最後まで読み込む。
oneBlockSize一度に読み込むサイズ。省略なら4K。
戻り値
読み込めたサイズ。
例外
CReadFailureException読み込みに失敗すると、スローされます。

TnbReader.h178 行目に定義があります。

◆ ReadInto() [2/2]

CByteVector ReadInto ( size_t  size = 0) const
inherited

[取得] 読み込み

引数
size読み込みサイズ。0ならファイル最後まで読み込む。
戻り値
ByteVector ファイル内容(サイズは読み込めたサイズ)。
例外
CReadFailureException読み込みに失敗すると、スローされます。

TnbReader.h150 行目に定義があります。

◆ Seek()

virtual LONGLONG Seek ( LONGLONG  llOffset,
ESeekMode  seek = TOP 
) const
virtual

[操作] シーク.

アクセスポインタを移動します。

注意
512 bytes 単位での移動をするようにしてください。
引数
llOffsetアクセスポインタの移動数。
seek移動開始アクセスポインタ位置。省略すると TOP になります。
戻り値
0以上シーク成功。数値は、現在のファイルポインタ
マイナスシーク失敗

IReaderを実装しています。

TnbDriveCommander.h503 行目に定義があります。

◆ Send_Inquiry()

int Send_Inquiry ( ICollectionT< BYTE > &  _d)

[送信] INQUIRY CDB送信.

引数
[out]_d読み込みデータ。
戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h291 行目に定義があります。

◆ Send_ModeSense()

int Send_ModeSense ( ICollectionT< BYTE > &  _d,
BYTE  pc,
bool  isWithBd = false 
)

[送信] MODESENSE CDB送信.

覚え書き
Mode Parameter Header の 2byte目が Media ID、3Byte目の最上位Bitが WriteProtect 状態です(1なら WP)。
引数
[out]_d読み込みデータ。
[in]pcページコード、および、ページコントロール値。
[in]isWithBdtrue なら Block Descriptor も読み込みます。 省略か false なら 読み込みません。
戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h271 行目に定義があります。

◆ Send_ReadCapacity()

int Send_ReadCapacity ( DWORD &  _blockAddress,
DWORD &  _blockLength 
)

[送信] Read Capacity CDB送信.

引数
[out]_blockAddress成功時、最後のブロックアドレスが格納されます。
[out]_blockLength成功時、ブロック長が格納されます。
戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h336 行目に定義があります。

◆ Send_StartStop()

int Send_StartStop ( BYTE  b = 2)

[送信] STARTSTOP CDB送信.

引数
bフラグ。 2 なら Eject、0 なら Load します。
戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h322 行目に定義があります。

◆ Send_TestUnit()

int Send_TestUnit ( void  )

[送信] TEST UNIT CDB送信.

戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h309 行目に定義があります。

◆ Send_Write10()

int Send_Write10 ( DWORD  ba,
const ISequenceCollectionT< BYTE > &  d,
DWORD  div = 512 
)

[送信] Write(10) CDB送信.

引数
baブロックアドレス
dデータ。長さは div の倍数である必要があります。
divブロック長。通常 512 です。
戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h359 行目に定義があります。

◆ SendCommand()

int SendCommand ( const ISequenceCollectionT< BYTE > &  cdb)

[送信] CDB送信.

引数
cdbCDB。 LUN エリアは無視されます。
戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h196 行目に定義があります。

◆ SendCommandWithReadPhase()

int SendCommandWithReadPhase ( ICollectionT< BYTE > &  _d,
const ISequenceCollectionT< BYTE > &  cdb,
int  readSize 
)

[送信] CDB送信(読込みフェーズ付).

引数
[out]_d読み込みデータ。
[in]cdbCDB。 LUN エリアは無視されます。
[in]readSize読み込みデータ長(CDBに正しく読み込みデータサイズを指定しておくこと)。
戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h243 行目に定義があります。

◆ SendCommandWithWritePhase()

int SendCommandWithWritePhase ( const ISequenceCollectionT< BYTE > &  cdb,
const ISequenceCollectionT< BYTE > &  data 
)

[送信] CDB送信(書込みフェーズ付).

引数
cdbCDB。 LUN エリアは無視されます。
data書込みデータ(CDBに正しくデータサイズ分を指定しておくこと)。
戻り値
0成功
1以上SCSIステータス。 2ならCheck Condition( GetSense() でセンス情報が得られます)。8ならBusy。
-1失敗。 ::GetLastError() でエラー内容を確認できます。

TnbDriveCommander.h216 行目に定義があります。

◆ SetEnd()

virtual void SetEnd ( void  )
virtual

[設定] EOFを指定.

必ず失敗します。。

例外
CNotSupportException失敗

IWriterを実装しています。

TnbDriveCommander.h569 行目に定義があります。

◆ UnlockVolume()

bool UnlockVolume ( void  )

[設定] Unlock Volume.

戻り値
true成功
false

TnbDriveCommander.h183 行目に定義があります。

◆ Update()

bool Update ( )

[設定] アップデート.

戻り値
true成功
false

TnbDriveCommander.h150 行目に定義があります。

◆ Write()

virtual void Write ( size_t  size,
LPCVOID  P 
)
virtual

[保存] 書き込み

注意
512 bytes 単位でのアクセスをするようにしてください。
引数
size書き込みサイズ。
P書き込みデータ。
例外
CWriteFailureException書込みに失敗すると、スローされます。

IWriterを実装しています。

TnbDriveCommander.h549 行目に定義があります。

◆ WriteFrom() [1/2]

void WriteFrom ( const IConstCollectionT< BYTE > &  c)
inherited

[保存] 書き込み.

覚え書き
内部で一度 CVectorT<BYTE> に変換しています。
引数
c書き込みデータ。
例外
CWriteFailureException書込みに失敗すると、スローされます。

TnbWriter.h65 行目に定義があります。

◆ WriteFrom() [2/2]

void WriteFrom ( const IReader reader,
size_t  size = 0,
size_t  oneBlockSize = 4096 
)
inherited

[保存] 書き込み.

覚え書き
reader の現在の位置から読み出し、書き込みます。
引数
reader書き込みデータ 。
size読み込みサイズ。省略か0ならファイル最後まで読み込む。
oneBlockSize一度に読み込むサイズ。省略なら4K。
例外
CReadFailureException読み込みに失敗すると、スローされます。
CWriteFailureException書込みに失敗すると、スローされます。

TnbWriter.h85 行目に定義があります。