RunDll32.exe shell32.dll,Control_RunDLL hotplug.dll
EjectDeviceByDriveLetter()
Private Declare Function GetVersion Lib "kernel32" () 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 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Const INVALID_HANDLE_VALUE = -1 Private Const OPEN_EXISTING = 3 Private Const FILE_FLAG_DELETE_ON_CLOSE = 67108864 Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Const IOCTL_STORAGE_EJECT_MEDIA = 2967560 Private Const VWIN32_DIOC_DOS_IOCTL = 1 Private Type DIOC_REGISTERS reg_EBX As Long reg_EDX As Long reg_ECX As Long reg_EAX As Long reg_EDI As Long reg_ESI As Long reg_Flags As Long End Type Private Sub EjectDeviceByDriveLetter(EjectDrive as String) Dim hDrive As Long, DummyReturnedBytes As Long Dim EjectDrive As String, DriveLetterAndColon As String Dim RawStuff As DIOC_REGISTERS DriveLetterAndColon = UCase$(Left$(EjectDrive, 1) & ":") '-- Handle Windows NT/2000 -------------------------------------------------------------------- If GetVersion >= 0 Then hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or GENERIC_WRITE, 0, ByVal _ 0, OPEN_EXISTING, 0, 0) If hDrive <> INVALID_HANDLE_VALUE Then ' Eject media Call DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, DummyReturnedBytes, ByVal 0) ' Clean Up Call CloseHandle(hDrive) End If '-- Handle Win9x/ME --------------------------------------------------------------------------- Else hDrive = CreateFile("\\.\VWIN32", 0, 0, ByVal 0, 0, FILE_FLAG_DELETE_ON_CLOSE, 0) If hDrive <> INVALID_HANDLE_VALUE Then '-- Setup raw registers --------------------------------------------------------------- 'to use Interrupt 21h Function 440Dh Minor Code 49h 'The function to use RawStuff.reg_EAX = &H440D 'The drive to do it on RawStuff.reg_EBX = Asc(DriveLetterAndColon) - Asc("A") + 1 'The minor code of the function in the low byte of the low word and the device 'category of 8 in the high byte of the low word RawStuff.reg_ECX = &H49 Or &H800 '-- Eject media and Clean Up ---------------------------------------------------------- Call DeviceIoControl(hDrive, VWIN32_DIOC_DOS_IOCTL, RawStuff, LenB(RawStuff), _ RawStuff, LenB(RawStuff), DummyReturnedBytes, ByVal 0) Call CloseHandle(hDrive) 'Clean up after ourselves End If End If End Sub
ScrewTurn Wiki version 3.0.1.400. Some of the icons created by FamFamFam. Except where noted, all contents Copyright © 1999-2024, Patrick Jasinski.