Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

Как залочить автозапуск CD
в Windows XP

  Макс Петров апрель 2017

      Если мы пишем программу, которая должна читать CD или DVD, возникает вопрос, что же делать с выпрыгивающим окошком, в котором Windows XP раз за разом спрашивает, что она должна сделать с диском.

      Windows позволяет нам, с помощью предоставляемых ею API, перевести управление CD-дисководом полностью на нашу программу. Тогда выпрыгивающего окошка не будет. Это хорошо. С другой стороны, если мы заберем управление, мы уже не сможем работать с файловой системой на диске, используя операторы языка программирования. Единственный доступ к диску будет возможен также только через API. Это плохо, потому что неудобно.

      Поскольку появление окошка автозапуска является ответом Windows именно на закрывание лотка CD-дисковода, решение задачи очевидно: блокировать CD-дисковод на протяжении всего времени, когда лоток открыт; снимать блокировку после того, как наша программа - посредством API - получает сигнал, что лоток закрыт. Далее, поскольку блокировки уже нет, доступ к файлам на диске будет возможен при помощи операторов языка программирования (в нашем случае - Visual Basic 6).

      Ниже – программная реализация на VB6.

Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _ (ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _ ByVal lpSecurityAttributes As Long, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long) As Long Dim hfile As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _ (ByVal lpstrCommand As String, _ ByVal lpstrReturnString As String, _ ByVal uReturnLength As Long, _ ByVal hwndCallback As Long) As Long Dim lRet As Long Dim ReturnString As String Private Declare Function DeviceIoControl Lib "kernel32" ( _ ByVal hDevice As Long, _ ByVal dwIoControlCode As Long, _ lpInBuffer As Any, _ ByVal nInBufferSize As Long, _ lpOutBuffer As Any, _ ByVal nOutBufferSize As Long, _ lpBytesReturned As Long, _ lpOverlapped As Overlapped) As Long Private Type Overlapped 'It is for DeviceIoControl pleasure Internal As Long InternalHigh As Long offset As Long OffsetHigh As Long hEvent As Long End Type Dim BytesReturned As Long Dim structOVERLAPPED As Overlapped Private Const GENERIC_READ As Long = &H80000000 Private Const FILE_SHARE_READ As Long = 1 Private Const FILE_SHARE_WRITE As Long = 2 Private Const OPEN_EXISTING As Long = 3 Private Const FSCTL_LOCK_VOLUME As Long = &H90018 Private Const IOCTL_STORAGE_EJECT_MEDIA As Long = 2967560 Private Const IOCTL_STORAGE_CHECK_VERIFY As Long = &H2D4800 Private Sub mFileOpen_Click() ' StartPath is a path which user selected DriveType = GetDriveType(StartPath) If DriveType = 5 Then 'If DriveType = 5 this is CD-drive hfile = CreateFile("\\.\" & StartPath, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0) 'We get the handle lRet = DeviceIoControl(hfile, FSCTL_LOCK_VOLUME, Null, 0, Null, 0, BytesReturned, structOVERLAPPED) 'We lock the CD-drive lRet = DeviceIoControl(hfile, IOCTL_STORAGE_EJECT_MEDIA, Null, 0, Null, 0, BytesReturned, structOVERLAPPED) 'We open the CD-drive door TimerCheckkDisk.Enabled = True 'We will wait for CD-drive door clothing in that timer Else If hfile <> -1 Then CloseHandle (hfile) 'If a handle is opened we close the handle (and unlock the CD-drive by means this action) lRet = mciSendString("set cdaudio door closed", ReturnString, 255, Me.hWnd) 'We close the CD-drive door TimerCheckkDisk.Enabled = False ' THIS IS THE POINT WHERE WE CAN START WORK WITH HARD DRIVE End If End Sub Private Sub TimerCheckkDisk_Timer() lRet = DeviceIoControl(hfile, IOCTL_STORAGE_CHECK_VERIFY, Null, 0, Null, 0, BytesReturned, structOVERLAPPED) 'We check status of the cd-drive door If lRet <> 0 Then CloseHandle (hfile) 'We close the handle (and unlock the CD-drive by means this action) TimerCheckkDisk.Enabled = False TimerCheckDir.Enabled = True End If End Sub Private Sub TimerCheckDir_Timer() On Error GoTo ExitSub VolumeName = Dir(StartPath + "\", vbVolume) TimerCheckDir.Enabled = False ' THIS IS THE POINT WHERE WE CAN START WORK WITH INSERTED CD-DVD-DISK ExitSub: End Sub


Sadda.ru: все статьи

      АlReader (скриншоты)
      API-функция CharToOem и строки ассемблера
      API-функция ReadConsoleInput
      API-функция PeekConsoleInput
      CoolReader (скриншоты)
      FBReader (скриншоты)
      Kingsoft Office (скриншоты)
      Lucid Puppy 5.2.5: испытание фаерфоксов
      VKDEBUG
      Быстрая сортировка
      Быстрый ремонт офисного стула при провале газлифта
      Внеклавиатурные символы HTML
      Воспоминание об Альгамбре на системном динамике
      Выбираем Линукс. Описания
      Выбираем Линукс. Таблица
      Выбор шрифта для таблицы Шульте
      Вычисление площадей фигур на компьютерных рисунках - это просто
      Деление (DIV, IDIV)
      Загрузчик Grab в Lucid Puppy 5.2.5
      Зачем тупому форуму поиск?
      Защита визуального html-редактора (фильтрация HTML на стороне сервера)
      Идеальная капча
      Инкремент и декремент
      Как бороться с воровством контента в Интернете
      Как залочить автозапуск CD в Windows XP
      Как заставить Firefox обновить favicon
      Как поставить CDlinux на винчестер
      Как я победил магические кавычки
      Коммандная строка
      Макросы ассемблера
      Консоль ввода-вывода
      Отзыв о бесплатных читалках .txt для Андроида
      Отрицательные числа
      Переменные и типы данных ассемблера
      Повторная установка Lucid Puppy 5.2.5 после падения
      Поисковая система и плагиат
      Прогресс-бар на PHP
      Простейшая программа на ассемблере (beeper)
      Пузырьковая сортировка. Эстафета шариков
      Разработка форумного движка
      Регистры процессора IA32
      Русская раскладка клавиатуры в Lucid Puppy 5.2.5
      Системы счисления, тэги ассемблера, перевод чисел
      Скорость движка форума: файлы или база данных
      Скрипт, выдающий самодельные капчи
      События консоли (таблица)
      Сортировка расческой
      Ставим Linux Lucid Puppy 5.2.5 на жесткий диск
      Статическая защита форм
      Таблицы Шульте (Shultzstables.exe)
      Фактор AdSense
      Форум «Железный Бураттин» (название и концепция)
      Форум на файлах «Ironetcart» (скачать)
      Хранимые XSS-атаки и защита от них (удаляем javascript из html в браузере)
      Uvoc: программа для запоминания английских слов

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна