Underc0de

Programación Scripting => Python => Mensaje iniciado por: k0ws en Febrero 20, 2014, 10:43:37 AM

Título: Detectar Unidades (HDD o FlashDrives)
Publicado por: k0ws en Febrero 20, 2014, 10:43:37 AM
Me aburria he hice este pequeño code para detectar ciertos tipos de unidades y listarlas:

Código (python) [Seleccionar]

#############################################
# Author: k0ws                              #
# Usage: cUnidades()                        #
# Webs: Indetectables ~ UdTools ~ Underc0de #
#############################################

import win32file as file
import win32api as api
def cUnidades():
listdrives = api.GetLogicalDriveStrings().split("\x00")
i = 0
print "Lista de FlashDrives o HDD: "
for drive in listdrives:
  if len(listdrives) == (i + 1):
   break
  if (file.GetDriveType(listdrives[i])) == 2:
   try:
    api.GetDiskFreeSpace(listdrives[i].replace('\\',''))
    print listdrives[i] + " - Conectado"
   except:
    print listdrives[i] + " - Desconectado"
  if (file.GetDriveType(listdrives[i])) == 3:
   try:
    api.GetDiskFreeSpace(listdrives[i].replace('\\',''))
    print listdrives[i] + " - Conectado"
   except:
    print listdrives[i] + " - Desconectado"
  i = i + 1

cUnidades()


Info sobre los tipos de unidades: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx)
Se que se puede optimizar, pero paso  ::)

-Saludos-
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: ANTRAX en Febrero 20, 2014, 10:50:45 AM
Muy buen codigo bro!
Muy bueno verte por los lados de python!
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: Sanko en Febrero 20, 2014, 11:20:57 AM
Muy bueno verte por python bro.
Para la próxima deberias contemplar usar librerias ntativas antes de hacer uso de las externas, habrá menos problemas con las dependencias y se reducirá el peso de la aplicación.

Ctypes es una buena solución, puedes importar las DLL's de windows y usar sus funciones, en este caso, GetLogicalDrives es de kernel32 y puedes usarla con ctypes:
"ctypes.windll.kernel32.GetLogicalDrives" -> http://www.nullege.com/codes/search/ctypes.windll.kernel32.GetLogicalDrives (http://www.nullege.com/codes/search/ctypes.windll.kernel32.GetLogicalDrives)

Saludos bro
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: k0ws en Febrero 20, 2014, 11:36:00 AM
Muchas gracias Sanko, lo hare para la proxima  ;)
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: deni_celine en Febrero 20, 2014, 11:49:00 AM
interesante! hace poco estaba pensando en como detectar cuando se conecta un pendrive....
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: 79137913 en Febrero 20, 2014, 11:57:27 AM
HOLA!!!

No imports = Better Code

GRACIAS POR LEER!!!
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: Once en Febrero 20, 2014, 12:01:46 PM
Muy bueno el código brothe, aparte de lo que te acaba de decir Sanko, te hago una observación más.

Cuando usas el for, no tienes que usar un contador entero (como sí se hace en los while) porque el for ya lleva la cuenta. Y si lo que haces es recorrer una lista como en tu caso, no es necesario que hagas esto: listdrives ya que la variable drive que definiste para el for tiene esa misma información; por lo que puedes cambiar el listdrives por drive

en lugar de:

Código (python) [Seleccionar]
if (file.GetDriveType(listdrives[i])) == 2:

puedes poner:

Código (python) [Seleccionar]
if (file.GetDriveType(drive)) == 2:

Y te evitas el contador.

Saludos!

Código (python) [Seleccionar]
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: deni_celine en Febrero 20, 2014, 01:08:10 PM
Basandome en tu code y en lo comentado por Sanko se me ocurre algo asi para detectar cuando algn conecta un pendrive

Código (python) [Seleccionar]

import ctypes
import time
print "is running.."
while(1):
    drive_bitmask = ctypes.windll.kernel32.GetLogicalDrives()
    for letter in range(65,91):
        if drive_bitmask & 1:
            unidad = chr(letter)+ u":\\"
            if (ctypes.windll.kernel32.GetDriveTypeW(unidad)==2) :
                print "se ha insertado",unidad
                #hace algo
                time.sleep(3600) #duerme un ratito
        drive_bitmask >>= 1
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: k0ws en Febrero 20, 2014, 01:50:31 PM
Gracias 11Sep, eso del contador me ha pasado por que antes programa java y lo usaba mucho jajaja, ni me fije. Thx Bro.
@deni_celine: He mirado tu code por encima y no entiendo esta parte:
Código (python) [Seleccionar]
if drive_bitmask & 1:

-Saludos-
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: Sanko en Febrero 20, 2014, 03:07:13 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Gracias 11Sep, eso del contador me ha pasado por que antes programa java y lo usaba mucho jajaja, ni me fije. Thx Bro.
@deni_celine: He mirado tu code por encima y no entiendo esta parte:
Código (python) [Seleccionar]
if drive_bitmask & 1:

-Saludos-

Tomatelo como
Código (python) [Seleccionar]
if drive_bitmask == 1: o lo que vendría siendo lo mismo que
Código (python) [Seleccionar]
if drive_bitmask:#True a nivel de bits es lo mismo, pero mejor validado. Tal vez este metiendo la pata vaya, que nos explique el sino
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: deni_celine en Febrero 20, 2014, 03:21:22 PM
& es un AND a nivel de bits y va preguntando bit by bit si es verdadero , la siguiente instrucción es para moverse al siguiente bit
Código (python) [Seleccionar]

drive_bitmask >>= 1


y Si como dice Sanko se obtendría el mismo resultado con

Código (python) [Seleccionar]

    if drive_bitmask:#True


pero mejor validado xd

Y se hace esto debido a que en el resultado de la función GetLogicalDrives el primer bit corresponde a la unidad A, el siguiente B, el tercero a C y asi sucesivamente.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364972%28v=vs.85%29.aspx

Bueno eso es lo que entendí  yo .... que solo estoy aprendiendo xd
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: Sanko en Febrero 20, 2014, 03:26:32 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
& es un AND a nivel de bits y va preguntando bit by bit si es verdadero , la siguiente instrucción es para moverse al siguiente bit
Código (python) [Seleccionar]

drive_bitmask >>= 1


y Si como dice Sanko se obtendría el mismo resultado con

Código (python) [Seleccionar]

    if drive_bitmask:#True


pero mejor validado xd

Y se hace esto debido a que en el resultado de la función GetLogicalDrives el primer bit corresponde a la unidad A, el siguiente B, el tercero a C y asi sucesivamente.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364972%28v=vs.85%29.aspx

Bueno eso es lo que entendí  yo .... que solo estoy aprendiendo xd

si eso decia la doc que retornaba, me habian dejado con la duda ya xd
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: overxfl0w13 en Febrero 20, 2014, 04:31:18 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
& es un AND a nivel de bits y va preguntando bit by bit si es verdadero , la siguiente instrucción es para moverse al siguiente bit
Código (python) [Seleccionar]

drive_bitmask >>= 1


¿Moverse al siguiente bit? rara explicación para la operación de desplazamiento.

Lo que conseguimos con ese operador es desplazar los bits de la variable a izquierdas o a derechas dependiendo del sentido indicado. Python ya distingue si tiene que realizar desplazamiento lógico o aritmético distinguiendo si el valor es con signo o sin signo.

Para lo que se suelen utilizar es para realizar multiplicaciones eficientes a nivel del procesador ya que es menos costoso realizar un par de sumas y desplazamientos con un CSA y un Barrel shifter por ejemplo con coste log(n) + C que calcular una multiplicación usando el algoritmo de recodificación por parejas que suele dar buenos resultados con un coste de n/2.

Si te fijas al desplazar n veces un bit a izquierdas estamos multiplicando por 2^n mientras que al desplazar n bits a derechas dividimos por 2^n, esto lo aplican los compiladores en los casos en los que sea más eficiente separar una multiplicación de esta forma que utilizar el operador de multiplicación de la ALU.

Ej:   3 * 36 ( operamos con 7 bits ) -> 36 = 2^5 + 2^2 -> 3*36 = 3*2^5 + 3*2^2
       0000011 * 0100100
       Desplazamos los bits del 3 5 veces a izquierdas -> 1100000
       Desplazamos los bits del 3 2 veces a izquierdas -> 0001100
       Sumamos los resultados -> 1101100 = 108 = 3*36

Con pocos bits como este caso la ganancia es mínima, la multiplicación serían (con el algoritmo de recodificación por parejas, si no, serían 8 ciclos) 4 ciclos (3.5 redondeado al alza) + 1 de inicialización, en total 5 ciclos mientras que con el otro método hemos sacado el resultado con 3 ciclos.

Creo que me he ido del tema pero necesitaba explicarlo xD.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Gracias 11Sep, eso del contador me ha pasado por que antes programa java y lo usaba mucho jajaja, ni me fije. Thx Bro.
@deni_celine: He mirado tu code por encima y no entiendo esta parte:
Código (python) [Seleccionar]
if drive_bitmask & 1:

-Saludos-

En java también existe esa forma de iterar:
Código (java) [Seleccionar]
    public static <E> void testit(E[] vec){
        for(E i : vec){
            System.out.println(i.toString());
        }
    }
   
    public static void main(String args[])
    {
        Integer nVect[] = new Integer[5];
        for(int i=0;i<5;i++) nVect[i] = new Integer(i);
        testit(nVect);
    }


Un saludo :D
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: deni_celine en Febrero 20, 2014, 04:50:39 PM
los resultados que obtiene la función son, en mi caso...

59322604 = 11100010010011000011101100
29661302 = 1110001001001100001110110
14830651 = 111000100100110000111011
7415325   = 1110001001001100001110

por eso digo que se va moviendo un bit, a la izquierda .... es una explicación un tanto rara, pero con el ejemplo se entiende.... como dije estoy aprendiendo y aún entiendo menos de la mitad de lo que dijiste xd , de todas formas es interesante
Título: Re:Detectar Unidades (HDD o FlashDrives)
Publicado por: k0ws en Febrero 20, 2014, 04:52:23 PM
Todo correcto  ;D