*Решено* | Программное отключение CDRom-а
-
KAB
*Решено* | Программное отключение CDRom-а
Всем доброго времени суток!
У меня есть такая проблема: нужно программно отключить кнопку загрузки/выгрузки лотка CDRom-а.
Знаю программа CDSlow такое умеет, но мне она не подходит.
Если кто знает как это сделать помогите пожалуйста.
Заранее спасибо.
У меня есть такая проблема: нужно программно отключить кнопку загрузки/выгрузки лотка CDRom-а.
Знаю программа CDSlow такое умеет, но мне она не подходит.
Если кто знает как это сделать помогите пожалуйста.
Заранее спасибо.
-
DillerInc
Re: *Решено* | Программное отключение CDRom-а
KAB
Я могу ошибаться,но мне кажется,тут надо смотреть в сторону функции
К примеру,имеется следующий код на Delphi,заставляющий каждые пять секунд открывать/закрывать лоток CD-ROM'а:
Код:
...взято из книжки Михаила Фленова.
Возможно навеит какие-нибудь мысли...
Я могу ошибаться,но мне кажется,тут надо смотреть в сторону функции
mciSendCommand
, объявленной в модуле MMSystem.К примеру,имеется следующий код на Delphi,заставляющий каждые пять секунд открывать/закрывать лоток CD-ROM'а:
Код:
Код: Выделить всё
var
OpenParm : TMCI_Open_Parms;
GetParm : TMCI_Generic_Parms;
SetParm : TMCI_Set_Parms;
DI : Cardinal;
OK : Boolean;
begin
OK := False;
OpenParm.lpstrDeviceType := 'CDAudio'; // Указываем на необходимость работы с CD-ROM'ом
repeat
mciSendCommand(0, mci_Open, mci_Open_Type, LongInt(@OpenParm));
DI := OpenParm.wDeviceID;
mciSendCommand(DI, mci_Set, mci_Set_Door_Open, LongInt(@SetParm));
mciSendCommand(DI, mci_Set, mci_Set_Door_Closed, LongInt(@SetParm));
mciSendCommand(DI, mci_Close, mci_Notify, LongInt(@GetParm));
Sleep(5000);
until OK;
end;...взято из книжки Михаила Фленова.
Возможно навеит какие-нибудь мысли...
-
KAB
Re: *Решено* | Программное отключение CDRom-а
Форумчане проверте плз. код который показал DillerInc.
-
pva
Re: *Решено* | Программное отключение CDRom-а
Это называется блокировка трея. Я видел, как это делает linux. Как windows - не знаю.
Т.о. заблокировать (железо) можно, но как в винде - не знаю.
Т.о. заблокировать (железо) можно, но как в винде - не знаю.
-
Envel
Re: *Решено* | Программное отключение CDRom-а
Envel
Мне показалось или там написано:
Цитата ComputerHope.com:
AVAILABILITY
The lock command is an internal command that is available in the below Microsoft Operating Systems.
Windows 95
Windows 98
Мне показалось или там написано:
Цитата ComputerHope.com:
AVAILABILITY
The lock command is an internal command that is available in the below Microsoft Operating Systems.
Windows 95
Windows 98
-
KAB
Re: *Решено* | Программное отключение CDRom-а
Как я понял с сайта
http://www.computerhope.com/lockhlp.htm
поддержка только Windows 9х, а мне нужно Windows XP-2003-
KAB
Re: *Решено* | Программное отключение CDRom-а
KAB
По-моему,я нашёл,что тебе надо.А именно:
Цитата "Техника защиты компакт-дисков от копирования" Криса Касперски:
Взаимодействие с прикладными приложениями обычно осуществляется посредством специальных кодов IOCTL, передаваемых драйверу функцией DeviceIoControl.
...можно воспользоваться IOCTL-командой блокировки лотка - IOCTL_CDROM_MEDIA_REMOVAL (а вот её непосредственное значение: 0х24804)...Вплоть до момента разблокировки лотка извлечь диск можно разве что булавкой или перезагрузив операционную систему.
Дело в том,что система не требует,чтобы разблокирование выполнялось в контексте того процесса,который выполнил блокирование.Она просто ведёт счёт блокировок, и если тот равен нулю, - лоток свободен.Соответственно, если счёт блокировок равен,например,шести - мы должны шесть раз вызывать команду разблокирования, прежде чем лазерный диск удасться извлечь на свет божий.
Код:
...ох уж этот Си...
По-моему,я нашёл,что тебе надо.А именно:
Цитата "Техника защиты компакт-дисков от копирования" Криса Касперски:
Взаимодействие с прикладными приложениями обычно осуществляется посредством специальных кодов IOCTL, передаваемых драйверу функцией DeviceIoControl.
...можно воспользоваться IOCTL-командой блокировки лотка - IOCTL_CDROM_MEDIA_REMOVAL (а вот её непосредственное значение: 0х24804)...Вплоть до момента разблокировки лотка извлечь диск можно разве что булавкой или перезагрузив операционную систему.
Дело в том,что система не требует,чтобы разблокирование выполнялось в контексте того процесса,который выполнил блокирование.Она просто ведёт счёт блокировок, и если тот равен нулю, - лоток свободен.Соответственно, если счёт блокировок равен,например,шести - мы должны шесть раз вызывать команду разблокирования, прежде чем лазерный диск удасться извлечь на свет божий.
Код:
Код: Выделить всё
// Утилита позволяет манипулировать счётчиком блокировок диска.
// Аргумент командной строки "+" увеличивает значение счётчика на единицу,
// ...а "-" - уменьшает.
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#define IOCTL_CDROM_MEDIA_REMOVAL 0x24804
main(int argc, char **argv)
{
BOOL act;
DWORD xxxx;
HANDLE hCD;
PREVENT_MEDIA_REMOVAL pmrLockCDROM;
// Проверка аргументов
if (argc<3) {printf("USAGE: CD.lock.exe \\\\.\\X: {+, -}\n"); return -1; }
if (argv[2] [0] == '+') act = TRUE; // УВЕЛИЧИТЬ СЧЁТЧИК БЛОКИРОВОК
else if (argv[2] [0] == '-') act = FALSE; // УМЕНЬШИТЬ СЧЁТЧИК БЛОКИРОВОК
else {printf(stderr, "-ERR: in arg %c\n" , argv[2] [0]); return -1; }
// Получить дескриптор устройства
hCD = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if (hCD == INVALID_HANDLE_VALUE) {printf(" -ERR: get CD-ROM\n"); return -1; }
// Заблокировать/разблокировать лоток CD-ROM'a
pmrLockCDROM.PreventMediaRemoval = act;
DeviceIoControl(hCD, IOCTL_CDROM_MEDIA_REMOVAL,
&pmrLockCDROM, SizeOf(pmrLockCDROM), NULL, 0, &xxxx, NULL);
}
...ох уж этот Си...-
KAB
Re: *Решено* | Программное отключение CDRom-а
DillerInc при компиляции этого кода Borland С++ 5.02 выдал такие ошибки:
Error: noname00.cpp(15,42):Undefined symbol 'PREVENT_MEIDA_REMOVAL'
Error: noname00.cpp(15,42):Statement missing ;
Error: noname00.cpp(22,59):Cannot convert 'FILE *' to 'const char *'
Error: noname00.cpp(22,59):Type mismatch in parameter '__format' in call to 'printf(const char *,...)'
Error: noname00.cpp(29,14):Undefined symbol 'prmLockCDROM'
Error: noname00.cpp(31,43):Undefined symbol 'pmrLockCDROM'
Error: noname00.cpp(31,51):Call to undefined function 'SizeOf'
Warn : noname00.cpp(32,2):'act' is assigned a value that is never used
Может я что делаю не так
Error: noname00.cpp(15,42):Undefined symbol 'PREVENT_MEIDA_REMOVAL'
Error: noname00.cpp(15,42):Statement missing ;
Error: noname00.cpp(22,59):Cannot convert 'FILE *' to 'const char *'
Error: noname00.cpp(22,59):Type mismatch in parameter '__format' in call to 'printf(const char *,...)'
Error: noname00.cpp(29,14):Undefined symbol 'prmLockCDROM'
Error: noname00.cpp(31,43):Undefined symbol 'pmrLockCDROM'
Error: noname00.cpp(31,51):Call to undefined function 'SizeOf'
Warn : noname00.cpp(32,2):'act' is assigned a value that is never used
Может я что делаю не так