Как заблокировать/разблокировать CDRom?
Способ первый
procedure CD_Lock( DriveLetter: string; Locked: Boolean );
const
IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804;
var
hDrive: THandle;
Returned: DWORD;
begin
hDrive := CreateFile( PChar( '\\.\' + DriveLetter ), GENERIC_READ,
FILE_SHARE_READ, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0 );
if GetLastError <> 0 then
MessageDlg( 'Ошибка: ' + IntToStr( GetLastError ), mtError, [mbOK], 0 );
try
if not DeviceIoControl( hDrive,
IOCTL_STORAGE_MEDIA_REMOVAL, // PREVENT_MEDIA_REMOVAL,
@Locked, SizeOf( Locked ),
nil, 0, Returned, nil ) then
MessageDlg( 'Ошибка: ' + IntToStr( GetLastError ), mtError, [mbOK], 0 );
finally
CloseHandle( hDrive );
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Заблокировать
CD_Lock( 'f:', true );
// Разблокировать
CD_Lock( 'f:', false ); end;
|
Способ второй
function LockMedia(ADriveLetter: Char; ALock: Boolean): Boolean;
var
LWStatus: Hwnd;
LTemp: Cardinal;
LPMR32: Boolean;
const
IOCTL_STORAGE_MEDIA_REMOVAL = $2D4804;
begin
LwStatus := CreateFile( PChar( '\\.\' + ADriveLetter + ':' ), GENERIC_READ or
GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0 );
LPMR32 := ALock;
if LwStatus <> INVALID_HANDLE_VALUE then
begin
Result := DeviceIoControl( LwStatus, IOCTL_STORAGE_MEDIA_REMOVAL, @LPMR32, sizeof( LPMR32 ), nil, 0, LTemp, nil );
CloseHandle( LwStatus );
end
else
Result := false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Заблокировать
LockMedia( 'm', true );
// Разблокировать
LockMedia( 'm', false );
end;
|