CD-ROM(リムーバブルドライブ)のイジェクトボタンを無効にする

ドライブのイジェクトボタンが押されたことをWindowsが処理するよりも早く検出する事を目標にいろいろと調べて見ましたが、挫折しました。。。
(実は、ハードウェアが排出してから、Windowsが気づく様な気もするし)
というわけで、ソフトウェアの動作中は、CDドライブをロックして、イジェクトボタンを効かなくしてしまう、略して『ドラロック作戦』を発動することにしました。

#include
#pragma comment(lib, "kernel32.lib")
BOOL LockMediaRemoval(char drive, BOOL lock)
{
    // Make media name
    char media[8];
    sprintf(media, "\\\\.\\%c:", drive);

    // Open the media handle
    HANDLE hMedia = ::CreateFile(media, GENERIC_READ
                                , FILE_SHARE_READ | FILE_SHARE_WRITE
                                , NULL, OPEN_EXISTING, 0, NULL);
    if(hMedia == INVALID_HANDLE_VALUE)
        return FALSE;

    // Lock or unlock the media
    PREVENT_MEDIA_REMOVAL removal = { lock };
    DWORD dummy = 0;
    BOOL result = ::DeviceIoControl(hMedia, IOCTL_STORAGE_MEDIA_REMOVAL
                                , &removal, sizeof(IOCTL_STORAGE_MEDIA_REMOVAL)
                                , NULL, 0, &dummy, NULL);
    
    // Release the media handle
    ::CloseHandle(hMedia);
    return result;
}


例えば、ロックするには、次のようにして使います。
if(!LockMediaRemoval('D', TRUE))
{
    // エラー処理
    DWORD e = GetLastError(); // エラーはOSからレポートされる
    // ...
}


ここで問題。
Visual C フォーラム でレポートされていたのですが、『メディア(CD)がアンロックされない?』というような事が起こるようです。
しばらく様子を見てみようと思います。
[PR]
by isoq | 2005-03-09 18:49 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< 上腕三頭筋が... CD-ROM(リムーバブルドラ... >>