Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


KAB
По-моему,я нашёл,что тебе надо.А именно:
Цитата "Техника защиты компакт-дисков от копирования" Криса Касперски:
Взаимодействие с прикладными приложениями обычно осуществляется посредством специальных кодов 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);
}
...ох уж этот Си...

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Последний раз редактировалось DillerInc, 03-09-2005 в 17:30. Причина: Исправил пару опечаток


Отправлено: 16:36, 31-08-2005 | #8