[Win32]IOCTL_STORAGE_MEDIA_REMOVALが正しく動作しない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Egg

[Win32]IOCTL_STORAGE_MEDIA_REMOVALが正しく動作しない

#1

投稿記事 by Egg » 8年前

いつもお世話になっております。
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;
	}
}
VB6アプリ側

コード:

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
よろしくお願い致します。

だんごさん
記事: 273
登録日時: 13年前

Re: [Win32]IOCTL_STORAGE_MEDIA_REMOVALが正しく動作しない

#2

投稿記事 by だんごさん » 8年前

Win10、C言語で試してみました。
同じように、SwitchEjectMechanicsでロックし、カウントダウンと同時にイジェクトボタンを離しつつDVD内に対してPathIsDirectoryとfopenをやってみました。
ですが、何回やっても両方とも成功しました。

コード:

int main(void)
{
	int count = 0;

	SwitchEjectMechanics("F", true);

	// カウントダウン
	while (count < 5)
	{
		Sleep(1000);
		printf("%d\t", 5 - count);
		count++;
	}

	// フォルダ、ファイルのアクセス開始
	if (!PathIsDirectory("F:\\bin"))
		MessageBox(NULL, "みつからない", "Error", MB_OK);

	FILE *fp;
	errno_t err;
	err = fopen_s(&fp, "F:\\FileList.txt", "r");
	printf("\n\nエラー番号:%d\n", err);
	fclose(fp);

	SwitchEjectMechanics("F", false);

	return 0;
}
とりあえず参考までに…。
 Dango San

Egg

Re: [Win32]IOCTL_STORAGE_MEDIA_REMOVALが正しく動作しない

#3

投稿記事 by Egg » 8年前

ありがとうございます。
やはり再現しませんか…。

閉鎖

“C言語何でも質問掲示板” へ戻る