

Option Explicit

Private Const DRIVE_REMOVABLE = 2
Private Const DRIVE_CDROM = 5
Private Const INVALID_HANDLE_VALUE As Long = -1&
Private Const GENERIC_READ As Long = &H80000000
Private Const FILE_SHARE_READ As Long = &H1
Private Const FILE_SHARE_WRITE As Long = &H2
Private Const FILE_ANY_ACCESS As Long = &H0
Private Const FILE_READ_ACCESS  As Long = &H1
Private Const FILE_WRITE_ACCESS As Long = &H2
Private Const OPEN_EXISTING As Long = 3
Private Const IOCTL_STORAGE_MEDIA_REMOVAL As Long = &H2D4804

Private Const IOCTL_STORAGE_EJECT_MEDIA As Long = &H2D4808 


Private Type PREVENT_MEDIA_REMOVAL
    PreventMediaRemoval As Byte
End Type 


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 Any) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
    (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal _
    dwShareMode As Long, lpSecurityAttributes As Any, ByVal _
    dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As _
    Long) As Long


Public Function DeviceLock(sDrive As String, fLock As Boolean) As Long
    Dim hDevice As Long
    Dim PMR As PREVENT_MEDIA_REMOVAL
    Dim bytesReturned As Long
    Dim success As Long

    hDevice = CreateFile("\\.\" & sDrive, GENERIC_READ, _
        FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, _
        0&, 0&)
    If hDevice <> INVALID_HANDLE_VALUE Then
        PMR.PreventMediaRemoval = CByte(Abs(fLock))
        success = DeviceIoControl(hDevice, IOCTL_STORAGE_MEDIA_REMOVAL _
           , PMR, Len(PMR), ByVal 0&, 0&, bytesReturned, ByVal 0&)
        If success = 0 Then
            success = Err.LastDllError
        Else
            success = 0
        End If
    Else
        success = Err.LastDllError
    End If

    Call CloseHandle(hDevice)
    DeviceLock = success
End Function 


Public Function Eject(sDrive As String) As Long
    Dim hDevice As Long
    Dim bytesReturned As Long
    Dim success As Long

    hDevice = CreateFile("\\.\" & sDrive, GENERIC_READ, _
        FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, 0&, 0&)
    If hDevice <> INVALID_HANDLE_VALUE Then
        success = DeviceIoControl(hDevice, IOCTL_STORAGE_EJECT_MEDIA, _
            0, 0, 0, 0, 0, 0)
        If success = 0 Then
            success = Err.LastDllError
        Else
            success = 0
        End If
    Else
        success = Err.LastDllError
    End If

    Call CloseHandle(hDevice)
    Eject = success
End Function 
