Este codigo lo pase a VB pero el original es un batch lo que hace es ver cuales son las unidades removibles en el registro , y si existen es por que estan conectadas.
Private Declare Function GetDriveType Lib "kernel32.dll" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
'GetUSBDevices4
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByRef lpData As Any, ByRef lpcbData As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, ByRef lpcbValueName As Long, ByVal lpReserved As Long, ByRef lpType As Long, ByRef lpData As Byte, ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Const HKEY_LOCAL_MACHINE As Long = &H80000002
Private Const READ_CONTROL As Long = &H20000
Private Const STANDARD_RIGHTS_READ As Long = (READ_CONTROL)
Private Const KEY_QUERY_VALUE As Long = &H1
Private Const KEY_ENUMERATE_SUB_KEYS As Long = &H8
Private Const KEY_NOTIFY As Long = &H10
Private Const SYNCHRONIZE As Long = &H100000
Private Const KEY_READ As Long = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Private Const REG_DWORD As Long = 4
Private Const REG_BINARY As Long = 3
Private Const ERROR_SUCCESS As Long = 0&
Public Function GetUSBDevices4() As String()
Dim lResult As Long
Dim lIndex As Long
Dim sData As String
Dim lData As Long
Dim lHandle As Long
Dim sTmp() As String
Dim dCount As Double
Const DRIVE_NO_ROOT_DIR As Long = 1
'abrimos la clave del registro
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\MountedDevices", 0&, KEY_READ, lHandle)
Do
'Redimensionamos el buffer
sData = String$(2000, Chr$(0))
'Asignamos el tamaño
lData = Len(sData)
'Leemos el valor
lResult = RegEnumValue(lHandle, lIndex, ByVal sData, lData, 0&, REG_DWORD, ByVal 0&, 0&)
'Sumamos uno a la posicion...
lIndex = lIndex + 1
'Si todo fue correcto
If lResult = ERROR_SUCCESS Then
'Recortamos la informacion
sData = Left$(sData, lData)
'Si se encuentra: '\??\STORA' (separado por VbNullChar)...
If InStr(RegQueryStringValue(lHandle, sData), "530054004F00520041") Then
'Si es una unidad...
If GetDriveType(Right$(sData, 2) & "\") <> DRIVE_NO_ROOT_DIR Then
'Redimensionamos el Array
ReDim Preserve sTmp(0 To dCount)
'Almacenamos la unidad
sTmp(dCount) = Right$(sData, 2) & "\"
'Añadimos uno mas a la cuenta
dCount = dCount + 1
End If
End If
End If
'Siempre que no haya habido error...
Loop While lResult = ERROR_SUCCESS
'Cerramos el Handle
RegCloseKey (lHandle)
'Devolvemos la lista
GetUSBDevices4 = sTmp
End Function
Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String
Dim lResult As Long
Dim lValueType As Long
Dim strBuf As String
Dim lDataBufSize As Long
Dim strTemp As String
Dim i As Integer
'Cargamos la Clave
lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize)
'Redimensionamos el Buffer
strBuf = String$(lDataBufSize, Chr$(0))
'Obtenemos el contenido
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)
'Si no ha habido errores y la clave es binaria...
If lResult = ERROR_SUCCESS And lValueType = REG_BINARY Then
'Por cada caracter del resultado..
For i = 1 To lDataBufSize
'Obtenemos el valor Hexadecimal del Ascii del caracter
strTemp = Hex$(Asc(Mid$(strBuf, i, 1)))
'Agregamos un 0 si solo hay un numero
If Len(strTemp) = 1 Then strTemp = "0" & strTemp
'Lo agregamos...
RegQueryStringValue = RegQueryStringValue + strTemp
Next i
End If
End Function