[NTDLL] Enumerar dispositivos (p.e Unidades Extraibles...) - ProcessDeviceMap

Iniciado por Karcrack, 11 Febrero 2010, 16:18 PM

0 Miembros y 1 Visitante están viendo este tema.

Karcrack

Código (vb) [Seleccionar]
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:
Código (vb) [Seleccionar]
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! ::)

Dessa

Hola karcrack, no llegué a entender, tambien con GetLogicalDrive algunos PenDrive no son reconocidos como extraibles ?

S2
Adrian Desanti

Karcrack

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_FIXED
Es por eso que se ha de sacar el BusType, que es como realmente se sabe si es USB o no ;)

Dessa

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 !!!













Adrian Desanti

Karcrack

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

Dessa

Gracias por el dato, no me habia pasado nunca usando  GetLogicalDrive - GetDriveType, voy a tenerlo en cuenta entonces, Saludos  ;)















Adrian Desanti