Detectar Unidades (HDD o FlashDrives)

Iniciado por k0ws, Febrero 20, 2014, 10:43:37 AM

Tema anterior - Siguiente tema

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

Me aburria he hice este pequeño code para detectar ciertos tipos de unidades y listarlas:

Código: python

#############################################
# 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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Se que se puede optimizar, pero paso  ::)

-Saludos-

Muy buen codigo bro!
Muy bueno verte por los lados de python!


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" -> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos bro
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

Muchas gracias Sanko, lo hare para la proxima  ;)

interesante! hace poco estaba pensando en como detectar cuando se conecta un pendrive....

HOLA!!!

No imports = Better Code

GRACIAS POR LEER!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scouts Team*                                                No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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
if (file.GetDriveType(listdrives[i])) == 2:


puedes poner:

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


Y te evitas el contador.

Saludos!

Código: python







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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

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

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
if drive_bitmask & 1:


-Saludos-

Febrero 20, 2014, 03:07:13 PM #9 Ultima modificación: Febrero 20, 2014, 03:10:06 PM por Sanko
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
if drive_bitmask & 1:


-Saludos-

Tomatelo como
Código: python
if drive_bitmask == 1:
o lo que vendría siendo lo mismo que
Código: python
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
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

& 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

drive_bitmask >>= 1


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

Código: python

    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.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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

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

drive_bitmask >>= 1


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

Código: python

    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.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

Febrero 20, 2014, 04:31:18 PM #12 Ultima modificación: Febrero 20, 2014, 04:41:02 PM por overxfl0w13
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

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
if drive_bitmask & 1:


-Saludos-

En java también existe esa forma de iterar:
Código: java
    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

Febrero 20, 2014, 04:50:39 PM #13 Ultima modificación: Febrero 20, 2014, 06:07:35 PM por deni_celine
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