Option Explicit
'---------------------------------------------------------------------------------------
' Module    : mNativeEnumDrives
' Author    : Karcrack
' Date      : 11/02/2010
' Purpose   : Enumerate Drives, allow filtering by device type
'---------------------------------------------------------------------------------------
'NTDLL
Private Declare Function NtQueryInformationProcess Lib "NTDLL" (ByVal hProcess As Long, ByVal ProcessInformationClass As Long, ProcessInformation As Any, ByVal ProcessInformationLength As Long, ReturnLength As Long) As Long
Private Type PROCESS_DEVICEMAP_INFORMATION
    DriveMap                As Long
    DriveType(1 To 32)      As Byte
End Type
Public Enum DeviceType
    DRIVE_NOFILTER = -1
    DRIVE_UNKNOWN
    DRIVE_NO_ROOT_DIR
    DRIVE_REMOVABLE
    DRIVE_FIXED
    DRIVE_REMOTE
    DRIVE_CDROM
    DRIVE_RAMDISK
End Enum
Private Const ProcessDeviceMap = 23
Public Function NtGetDrives(Optional ByVal lFilterType As DeviceType = DRIVE_NOFILTER) As Collection
    Dim tPDC                As PROCESS_DEVICEMAP_INFORMATION
    Dim i                   As Long
    
    Set NtGetDrives = New Collection
    
    If NtQueryInformationProcess(-1, ProcessDeviceMap, tPDC, Len(tPDC), ByVal 0&) = 0 Then
        For i = 0 To 25
            If tPDC.DriveMap And 2 ^ i Then
                If (lFilterType = -1) Or (tPDC.DriveType(i + 1) = lFilterType) Then
                    NtGetDrives.Add Chr$(65 + i) & ":\"
                End If
            End If
        Next i
    End If
End Function
Simplemente es una modificación de este código:
http://www.advancevb.com.ar/?p=335
Ejemplo de uso:
Private Sub Form_Load()
    Dim vItem               As Variant
    
    For Each vItem In NtGetDrives(DRIVE_REMOVABLE)
        MsgBox vItem
    Next vItem
End Sub
Mostrará las unidades extraibles!
Hay que tener en cuenta que no todos los PenDrives USB son detectados como unidades extraibles, para mas precision mirar este codigo que saca el BusType:
http://www.advancevb.com.ar/?p=345
Cualquier duda preguntar! :)
Saludos! ::)
			
			
			
				Hola karcrack, no llegué a entender, tambien con GetLogicalDrive algunos PenDrive no son reconocidos como extraibles ?
S2
			
			
			
				Cita de: Dessa en 12 Febrero 2010, 11:24 AM
Hola karcrack, no llegué a entender, tambien con GetLogicalDrive algunos PenDrive no son reconocidos como extraibles ?
S2
Con 
GetDriveType() puede que algunos Pendrives removibles se detecten como 
DRIVE_FIXEDEs por eso que se ha de sacar el BusType, que es como realmente se sabe si es USB o no ;)
			
 
			
			
				Ahora sí, no serán los discos externos USB los DRIVE_FIXED o propiamente algunos Pendrive ?
Gracias por contestar  ;)
PD: Todos estos "Buenos nativos de Karcrak" deberían estar en un solo post !!!
			
			
			
				Cita de: Dessa en 12 Febrero 2010, 12:06 PM
Ahora sí, no serán los discos externos USB los DRIVE_FIXED o propiamente algunos Pendrive ?
Ambos pueden dar esta falsa informacion usando 
GetDriveType
			 
			
			
				Gracias por el dato, no me habia pasado nunca usando  GetLogicalDrive - GetDriveType, voy a tenerlo en cuenta entonces, Saludos  ;)