Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 1 Febrero 2013, 23:44 PM

Título: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: Eleкtro en 1 Febrero 2013, 23:44 PM
Bueno, llevo tiempo intentando hacer una aplicación para monitorizar pendrives (en modo oculto) y copiar todos los datos A OTRO PENDRIVE

Sólo tengo hecha un poco la interfaz y cuatro tonterías más.

PD: Es un WPF, por si tiene importancia.

(http://img689.imageshack.us/img689/4785/captura4fl.png)

Para avanzar en la aplicación, necesito información sobre:

Título: Re: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: Keyen Night en 5 Febrero 2013, 01:06 AM
Para la detección de medios extraibles, puedes interceptar los mensajes de Windows, que indican cambio de hardware, tengo código hecho pero no te lo voy a dar, para ver si te empezamos a acostumbrar a investigar.

Te dejo algunas pistas:

Código (vb.net) [Seleccionar]
       Protected Overrides Sub WndProc(ByRef [Message] As Message)
       End Sub
     
       Public Enum ConstWindowsDrivers As Integer
           Change = &H219
           Arrival = &H8000
           QueryRemove = &H8001
           QueryRemoveFailed = &H8002
           RemovePending = &H8003
           RemoveComplete = &H8004
           TypeVolume = &H2
       End Enum

     

Es aun más fácil de lo que piensas :silbar: ;)
Título: Re: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: Eleкtro en 5 Febrero 2013, 01:14 AM
Keyen, muchas gracias por la info, a pesar de que ahora pienses que soy un vago quizás por culpa de lo que siempre anda comentando spiritdead... a mi cualquier información que me den me sirve para empezar, y no te preocupes que buscaré.

Me dejas bastante perdido porque yo siempre he usado la API de windows para realizar funciones y cambios, sin necesidad de hacer gran cosa, pero no para recibir/interceptar/monitorizar datos, y no sé si será tán fácil como almacenarlo en una variable cada cierto tiempo para comprobar el valor del resultado y ya está, pero bueno, ya lo busco.

Saludos
Título: Re: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: Eleкtro en 6 Febrero 2013, 03:35 AM
Muchas gracias al moderador invisible por reabrir el post :)




Ya he encontrado como monitorizar la inserción-extracción de los dispositivos con los WindowsMessages usando la API, pero primero me he puesto a hacer otra función que necesito,
he sacado la idea de aquí: [APORTE] Interceptar Archivos/Directorios USB (http://foro.elhacker.net/net/aporte_interceptar_archivosdirectorios_usb-t358902.0.html)
(Gracias Kubox)

En la función necesito hacer demasiadas comprobaciones, muchos "IF", ¿Tienen alguna idea para reducir/mejorar este código?:

PD: El problema que tengo es que tengo que hacer las mismas comprobaciones para "ALL", y las mismas comprobaciones para el resto de la enumeración, no sé como hacerlo más simple.

Código (vbnet) [Seleccionar]
 Private Enum DriveType
       ALL
       CDRom = IO.DriveType.CDRom
       Fixed = IO.DriveType.Fixed
       Network = IO.DriveType.Network
       Ram = IO.DriveType.Ram
       Removable = IO.DriveType.Removable
       Unknown = IO.DriveType.Unknown
   End Enum

   Private Function Get_Drives_Info( _
      ByVal DriveType As DriveType, _
      ByVal Name As Boolean, _
      Optional ByVal Label As Boolean = False, _
      Optional ByVal Type As Boolean = False, _
      Optional ByVal Format As Boolean = False, _
      Optional ByVal Size As Boolean = False, _
      Optional ByVal FreeSpace As Boolean = False) As List(Of String)

       Dim Drive_Info_List As New List(Of String)
       Dim Drive_Info As String = Nothing

       For Each Drive In Microsoft.VisualBasic.FileIO.FileSystem.Drives
           If DriveType = DriveType.ALL Then
               If Drive.IsReady = True Then
                   If Name Then Drive_Info += Drive.Name & ";"
                   If Label Then Drive_Info += Drive.VolumeLabel & ";"
                   If Type Then Drive_Info += Drive.DriveType.ToString & ";"
                   If Format Then Drive_Info += Drive.DriveFormat & ";"
                   If Size Then Drive_Info += Drive.TotalSize.ToString & ";"
                   If FreeSpace Then Drive_Info += Drive.TotalFreeSpace & ";"
               End If
           Else
               If Drive.IsReady = True And Drive.DriveType = DriveType Then
                   If Drive.IsReady = True Then
                       If Name Then Drive_Info += Drive.Name & ";"
                       If Label Then Drive_Info += Drive.VolumeLabel & ";"
                       If Type Then Drive_Info += Drive.DriveType.ToString & ";"
                       If Format Then Drive_Info += Drive.DriveFormat & ";"
                       If Size Then Drive_Info += Drive.TotalSize.ToString & ";"
                       If FreeSpace Then Drive_Info += Drive.TotalFreeSpace & ";"
                   End If
               End If
           End If
           If Drive_Info IsNot Nothing Then Drive_Info_List.Add(Drive_Info) : Drive_Info = Nothing
       Next

       Return Drive_Info_List
   End Function


saludos
Título: Re: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: _katze_ en 6 Febrero 2013, 07:26 AM
select case
Título: Re: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: Eleкtro en 6 Febrero 2013, 08:57 AM
Cita de: _katze_ en  6 Febrero 2013, 07:26 AM
select case

Gracias, pero no creo que un select case me vaya a solucionar el problema:

select case blablabla
case DriveType.ALL
   if name then...
   if label then...
   if size then...
   if type then...
   if freespace then...
   if format then...
case else
   if name then...
   if label then...
   if size then...
   if type then...
   if freespace then...
   if format then...
end case


Lo que quiero es NO tener que repetir las comprobaciones para los dos casos, me gustaría simplificarlo de alguna manera, y para eso necesito ejemplos please!.

saludos
Título: Re: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: HdM en 6 Febrero 2013, 12:58 PM
Hola.

Igual estoy interpretando mal lo que quieres hacer, pero creo que podrías simplificarlo así:

Código (vbnet) [Seleccionar]

If (DriveType = DriveType.ALL Or Drive.DriveType = DriveType) And (Drive.IsReady) Then

  If Name Then Drive_Info += Drive.Name & ";"
  If Label Then Drive_Info += Drive.VolumeLabel & ";"
  If Type Then Drive_Info += Drive.DriveType.ToString & ";"
  If Format Then Drive_Info += Drive.DriveFormat & ";"
  If Size Then Drive_Info += Drive.TotalSize.ToString & ";"
  If FreeSpace Then Drive_Info += Drive.TotalFreeSpace & ";"

End If


Saludos.
Título: Re: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: Eleкtro en 9 Febrero 2013, 02:05 AM
@hdm

Muchas gracias, ese IF era lo que necesitaba!
Título: Re: ¿Como monitorizar unidades de dispositivos PENDRIVE?
Publicado por: HdM en 9 Febrero 2013, 20:26 PM
Ferpecto Elektro  ;D

También podrías sustituir:

Código (vbnet) [Seleccionar]

If Name Then Drive_Info += Drive.Name & ";"
If Label Then Drive_Info += Drive.VolumeLabel & ";"
If Type Then Drive_Info += Drive.DriveType.ToString & ";"
If Format Then Drive_Info += Drive.DriveFormat & ";"
If Size Then Drive_Info += Drive.TotalSize.ToString & ";"
If FreeSpace Then Drive_Info += Drive.TotalFreeSpace & ";"


Por una única línea:

Código (vbnet) [Seleccionar]
Drive_Info = IIf(Name, Drive.Name & ";", "") + IIf(Label, Drive.VolumeLabel & ";", "") + IIf(Type, Drive.DriveType.ToString & ";", "") + IIf(Format, Drive.DriveFormat & ";", "") + IIf(Size, Drive.TotalSize.ToString & ";", "") + IIf(FreeSpace, Drive.TotalFreeSpace & ";", "")

Teniendo en cuenta que:

Si Option Strict tiene el valor On, debe utilizar la palabra clave CStr para convertir explícitamente el resultado de Object en String.
(http://msdn.microsoft.com/es-es/library/microsoft.visualbasic.interaction.iif.aspx)

Saludos.