Функция DeviceIoControl

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 Any) As Long

DeviceIoControl выполняет заданную операцию с устройством, используя его драйвер напрямую.

hDevice
Описатель устройства. Для получения описатель используйте CreateFile
dwIoControlCode
Код операции. Полный список ищите в документации. Например, код IOCTL_STORAGE_EJECT_MEDIA служит для выдвижения лотка CD-ROM
lpInBuffer
Зависит от dwIoControlCode
nInBufferSize
Размер буфера lpInBuffer в байтах
lpOutBuffer
Зависит от dwIoControlCode
nOutBufferSize
Размер буфера lpOutBuffer в байтах
lpBytesReturned
Количество байт, реально записанных в буфер
lpOverlapped
Структура OVERLAPPED. Для синхронных операций можно использовать ByVal as Long и присвоить ему 0

Пример

' выдвигаем лоток DVD-ROM (только под Win 2000/XP)

Dim hDrive As Long, DummyReturnedBytes As Long
Dim EjectDrive As String, DriveLetterAndColon As String

EjectDrive = InputBox("Введите букву вашего DVD-ROM для извлечения лотка")
  If Len(EjectDrive) Then
    DriveLetterAndColon = UCase(Left$(EjectDrive & ":", 2)) 
    hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, 0, 0)
      If hDrive <> INVALID_HANDLE_VALUE Then
        ' выдвигаем лоток
        Call DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, DummyReturnedBytes, ByVal 0)
        Call CloseHandle(hDrive)
      End If
  End If

Категория

Устройства