DVDRAMに書き込むディスクドライブに対して、DeviceIoControlのIOCTL_STORAGE_MEDIA_REMOVALでイジェクト機能を無効化しようとしています。
ディスクトレイのロックそのものは掛かるのですが、以下の操作でディスク内のフォルダを見失います。
1.IOCTL_STORAGE_MEDIA_REMOVALでイジェクトを無効化する
2.DirでDVDRAM内のフォルダにアクセスするコマンドボタンを押下する
3.PC本体のイジェクトボタンを押下する
4.押下したボタンを同時に離す
エラー内容
ファイル名または番号が正しくありません。(52)
エラーが出た後は、ディスクトレイは開きません。
環境はWindows7 Pro SP1でDVDRAMのファイルフォーマットはFAT32です。
また、以下のパッチを当てても結果は変わりませんでした。
https://support.microsoft.com/ja-jp/kb/2998530
仕事の都合上、クライアントから調査依頼されたコードそのものを載せることは難しいので、該当の一部分だけ記載します。
C++DLL側(VS2013のMFCDLLテンプレートから作られてあるが、クラスは利用していない)
LONG APIENTRY SwitchEjectMechanics(LPCTSTR driveLetter, BOOL isDisabled)
{
DWORD dwBytesReturned;
CString driveName;
driveName.Format(_T("\\\\.\\%s:"), driveLetter);
HANDLE hDevice = CreateFile(driveName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);
PREVENT_MEDIA_REMOVAL pmr;
pmr.PreventMediaRemoval = isDisabled;
if (0 == DeviceIoControl(hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL))
{
CloseHandle(hDevice);
return -1;
}
else
{
CloseHandle(hDevice);
return 0;
}
}
Public Class Form1
Private Declare Function SwitchEjectMechanics Lib "DvdDllSample.dll" () As Long
' 無効化
Private Sub CommandButton1_Click()
Call SwitchEjectMechanics("E", True)
End Sub
' 有効化
Private Sub CommandButton2_Click()
Call SwitchEjectMechanics("E", False)
End Sub
' アクセス
Private Sub CommandButton3_Click()
On Error Goto Lbl_Error
Call Dir("E:\Test")
Lbl_Error:
Call MsgBox(Err.Description & "(" & Err.Number & ")"
End Sub
End Class