Блокировка и разблокировка CD-ROM |
||||
---|---|---|---|---|
Я сам долго искал, как блокировать/разблокировать CD-ROM на Delphi. Поэтому не претендую на авторство этой статьи. Просто собрал все, так сказать, в кучу. Проверено на D7 и C. Delphi procedure TMainForm.CD_Lock(Locked: Boolean, DriveLetter: string); const IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804; var hDrive: THandle; Returned: DWORD; DisableEject: boolean; begin hDrive := CreateFile(PChar('\\.\' + DriveLetter), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if GetLastError <> 0 then MessageDlg('Error:' + IntToStr(GetLastError), mtError, [mbOK], 0); try DisableEject := Locked; if not DeviceIoControl(hDrive, IOCTL_STORAGE_MEDIA_REMOVAL, // PREVENT_MEDIA_REMOVAL, @DisableEject, SizeOf(DisableEject), nil, 0, Returned, nil) then MessageDlg('Ошибка:' + IntToStr(GetLastError), mtError, [mbOK], 0) finally CloseHandle(hDrive) end; end; CD_Lock(True) - блокирует CD-ROM Для полного веселья можно заблокировать все CD-ROMы в системе через это: procedure TMainForm.LockCDROMs; var w: dword; Root: string; i: byte; begin w := GetLogicalDrives; Root := '#:\'; for i := 0 to 25 do begin Root[1] := Char(Ord('A') + i); if (W and (1 shl i)) > 0 then if GetDriveType(PChar(Root)) = DRIVE_CDROM then begin DriveLetter := Copy(Root, 1, Length(Root) - 1); CD_Lock(True, DriveLetter) end end; end; C //заблокировать void CMFcDlg::OnBnClickedButton1() { HANDLE hDevice = CreateFile ("\\\\.\\E:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); DWORD dwBytesReturned = 0; PREVENT_MEDIA_REMOVAL pmr = {TRUE}; if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be locked"); CloseHandle (hDevice); } //разблокировать void CMFcDlg::OnBnClickedButton2() { HANDLE hDevice = CreateFile ("\\\\.\\E:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); DWORD dwBytesReturned = 0; PREVENT_MEDIA_REMOVAL pmr = {FALSE}; if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be unlocked"); CloseHandle (hDevice); } |