Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

Delphi: AjpdSoft Quitar dispositivos USB de forma segura
AjpdSoft


Añadida a la sección Descargas la aplicación AjpdSoft Quitar dispositivos USB de forma segura: muestra las unidades extraibles correspondientes a los dispositivos USB conectados al equipo y permite desconectarlos con seguridad (quitar hardware de forma segura). Liberamos el código fuente - source code en Borland Delphi 6 100% Open Source.



Definición de USB

USB (Universal Serial Bus ó Bus Universal en Serie ó Conductor Universal en Serie) es un puerto que sirve para conectar periféricos a una computadora. Fue creado en 1996 por: IBM, Intel, Northern Telecom, Compaq, Microsoft, Digital Equipment Corporation y NEC.

Los dispositivos USB se clasifican en cuatro tipos según su velocidad de transferencia de datos:

  • Baja velocidad (1.0): tasa de transferencia de hasta 1,5 Mbps (192 KB/s). Utilizado en su mayor parte por dispositivos de interfaz humana (Human interface device) como los teclados, los ratones, las cámaras web, etc.
  • Velocidad completa (1.1): tasa de transferencia de hasta 12 Mbps (1,5 MB/s). Estos dispositivos dividen el ancho de banda de la conexión USB entre ellos, basados en un algoritmo de impedancias LIFO.
  • Alta velocidad (2.0): tasa de transferencia de hasta 480 Mbps (60 MB/s) pero por lo general de hasta 125Mbps (16MB/s). Está presente casi en el 99% de los ordenadores actuales. El cable USB 2.0 dispone de cuatro líneas, un par para datos, una de corriente y una de toma de tierra.
  • Super alta velocidad (3.0): actualmente se encuentra en fase experimental y tiene una tasa de transferencia de hasta 4.8 Gbps (600 MB/s). Esta especificación será diez veces más veloz que la anterior 2.0. USB 3.0 ya está desarrollado, aunque todavía no está muy extendido su uso debido a que los fabricantes de dispositivos aún no lo implementan al 100% en sus productos.

El estándar USB especifica tolerancias para impedancia y la pedancia de especificaciones mecánicas relativamente bajas para sus conectores, intentando minimizar la compatibilidad entre los conectores fabricados por la compañía.

Las especificaciones USB 1.0, 1.1 y 2.0 definen dos tipos de conectores para conectar dispositivos al servidor: A y B. Sin embargo, la capa mecánica ha cambiado en algunos conectores.

USB implementa conexiones a dispositivos de almacenamiento usando un grupo de estándares llamado USB mass storage device class ("MSC" o "UMS"). Éste se diseñó inicialmente para memorias ópticas y magnéticas, pero ahora sirve también para soportar una amplia variedad de dispositivos, particularmente memorias USB.

Wireless USB (W-USB o WUSB) es un protocolo de comunicación inalámbrica por radio con gran ancho de banda que combina la sencillez de uso de USB con la versatilidad de las redes inalámbricas. Utiliza como base de radio la plataforma Ultra-WideBand, que puede lograr tasas de transmisión de hasta 480 Mbps (igual que USB 2.0) en rangos de tres metros y 110 en rangos de diez metros y opera en los rangos de frecuencia de 3,1 a 10,6 GHz.

Características más importantes de AjpdSoft Quitar dispositivos USB de forma segura

  • Aplicación de muy sencillo manejo, muy fácil e intuitiva, todas las opciones están en una misma ventana.
  • La aplicación ha sido desarrollada en el lenguaje de programación Borland Delphi 6.
  • No necesita instalación, es suficiente con ejecutar el fichero quitarUSB.exe.
  • Detecta automáticamente los dispositivos USB conectados al equipo.
  • Incluso aunque esté abierta, la aplicación detectará cualquier cambio en los dispositivos USB que se conecten o desconecten.

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

AjpdSoft Quitar dispositivos USB de forma segura detecta cualquier dispositivo USB de almacenamiento conectado al equipo, muestra la unidad que crea en el equipo y permite desconectarlos de forma segura.

Abriremos la aplicación AjpdSoft Quitar dispositivos USB de forma segura, nos detectará los posibles dispositivos USB de almacenamiento conectados al equipo:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

Conectaremos un dispositivo USB de almacenamiento (lápiz de memoria o pendrive) al equipo:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

AjpdSoft Quitar dispositivos USB de forma segura detectará el nuevo dispositivo USB conectado, mostrará la letra de unidad que le haya asignado el sistema operativo:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

El dispositivo conectado creará una letra de unidad en Windows, que podremos ver abriendo el Explorador de Windows:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

Para desconectarlo o extraerlo de forma segura marcaremos el dispositivo y pulsaremos en "Retirar USB":

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

Si se ha podido retirar correctamente nos mostrará el siguiente mensaje:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

Con el texto: "El dispositivo J ya se puede retirar con seguridad".

Si no se puede retirar mostrará un mensaje de error como este:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

Con el texto:

---------------------------
Aviso
---------------------------
El dispositivo J no puede ser retirado.

Posible causa:
- El dispositivo J está siendo utilizado.
- El dispositivo J ya no existe.
- El dispositivo J tiene algún problema.
---------------------------
Aceptar
---------------------------

Si se ha podido quitar el dispositivo USB de forma segura mostrará:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

Con el texto: "Esperando ser extraído físicamente".

Una vez que extraigamos el dispositivo USB físicamente del equipo:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

La aplicación detectará el cambio y lo quitará de la lista automáticamente:

AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento

Instalación y configuración de AjpdSoft Quitar dispositivos USB de forma segura

AjpdSoft Quitar dispositivos USB de forma segura no necesita instalación, se puede ejecutar directamente el fichero quitarUSB.exe.

Datos técnicos de AjpdSoft Quitar dispositivos USB de forma segura

Esta aplicación ha sido desarrollada en el lenguaje de programación Borland Delphi 6. La aplicación utiliza interrupciones y funciones del API de Windows.

Si eres desarrollador de software y te has registrado en nuestra web (si aún no te has registrado puedes hacerlo desde aquí gratuitamente) puedes descargar el código fuente 100% Open Source (completo y totalmente gratuito) en Borland (ahora Codegear) Delphi 6:

AjpdSoft Quitar dispositivos USB de forma segura (Código fuente Open Source en Borland Delphi 6)

AjpdSoft Quitar dispositivos USB de forma segura ha sido testeada y funciona correctamente en equipos con sistemas operativos:Windows XP, Windows 2000 Server, Windows Server 2003, Windows Vista y Windows 7 (Seven).

Para usuarios desarrolladores de software

La aplicación utiliza los siguientes componentes (para Delphi 6):

A quién va dirigida AjpdSoft Quitar dispositivos USB de forma segura

La aplicación AjpdSoft Quitar dispositivos USB de forma segura va dirigida a administradores de sistemas y usuarios que quieran desconectar varios dispositivos USB del equipo sin tener que utilizar la utilidad de Quitar hardware de forma segura del propio Windows. Esta aplicación utiliza el mismo procedimiento.

También puede ser útil para estudiantes que tengan que realizar algún proyecto de ejemplo de desarrollo de aplicación que detecte la conexión de dispositivos USB de almacenamiento y permita desconectarlos de forma segura.

Anexo

  • Código fuente (source code) de la aplicación completa:

Unidad "UnidadMenuPrincipal.pas":

unit UnidadMenuPrincipal;

{$R WinXP.res}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Forms,
  Dialogs, StdCtrls, ShlObj, Controls, CheckLst, ExtCtrls, Buttons,
  shellapi, ThemeMgr;

type
  TformMenuPrincipal = class(TForm)
    lsListaDispositivos: TCheckListBox;
    Label1: TLabel;
    LWEB: TLabel;
    ThemeManager1: TThemeManager;
    btRetirarUSB: TBitBtn;
    btSalir: TBitBtn;
    procedure FormActivate(Sender: TObject);
    procedure btRetirarUSBClick(Sender: TObject);
    procedure LWEBClick(Sender: TObject);
    procedure btSalirClick(Sender: TObject);
  private
    Procedure estadoConexionDispositivo (var Msg: TMessage); Message $0219;
  public
  end;

var
  vRetirarDispositivo : TformMenuPrincipal;
  letraVolumen, volumen : string;

implementation

{$R *.dfm}

Procedure TformMenuPrincipal.estadoConexionDispositivo (var Msg: TMessage);
//Dbt.h
Type
  DEV_BROADCAST_HDR     = ^PDEV_BROADCAST_HDR;
    PDEV_BROADCAST_HDR  = packed record
      dbch_size         : DWORD;
      dbch_devicetype   : DWORD;
      dbch_reserved     : DWORD;
  end;

  DEV_BROADCAST_VOLUME    = ^PDEV_BROADCAST_VOLUME;
    PDEV_BROADCAST_VOLUME = packed record
      dbcv_size           : DWORD;
      dbcv_devicetype     : DWORD;
      dbcv_reserved       : DWORD;
      dbcv_unitmask       : DWORD;
      dbcv_flags          : WORD;
  end;
var
  C : Integer;
begin
  //desconexión física
  if Msg.wParam = $8004 then
  begin
    if DEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype = 2 then
    begin
      if DEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_flags = 0 then
      begin
        Str(Ln(DEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_unitmask) / Ln(2) +
            Ord('A'):2:0, letraVolumen);
        letraVolumen := Char(StrToInt(letraVolumen));
        for c := 0 to lsListaDispositivos.Count - 1 do
        begin
          //quitar dispositivo de la lista
          volumen := lsListaDispositivos.Items.Strings[c];
          if volumen[1] = letraVolumen then
          begin
            lsListaDispositivos.Items.Delete(c);
            Break;
          end;
        end;
      end;
    end;
  end;

  //conexión física
  if Msg.wParam = $8000 then
  begin
    if DEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype = 2 then
    begin
      if DEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_flags = 0 then
      begin
        //añadir nuevo volumen a la lista
        Str(Ln(DEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_unitmask) / Ln(2) +
            Ord('A'):2:0, letraVolumen);
        letraVolumen := Char(StrToInt(letraVolumen));
        lsListaDispositivos.Items.Add(letraVolumen + ': -> Conectado');
      end;
    end;
  end;
end;

function extraerDispositivoUSB (letraDispositivo : String;
    intervaloTiempo : Integer = 0; numeroIntentos : Integer = 1) : Boolean;
const
  //parámetros de WinIoCtl.h
  FSCTL_LOCK_VOLUME           = ($00000009 shl 16) or ($0000 shl 14) or (00006 shl 2) or 0;
  FSCTL_DISMOUNT_VOLUME       = ($00000009 shl 16) or ($0000 shl 14) or (00008 shl 2) or 0;
  IOCTL_STORAGE_MEDIA_REMOVAL = ($0000002d shl 16) or ($0001 shl 14) or ($0201 shl 2) or 0;
  IOCTL_STORAGE_EJECT_MEDIA   = ($0000002d shl 16) or ($0001 shl 14) or ($0202 shl 2) or 0;
  FSCTL_UNLOCK_VOLUME         = ($00000009 shl 16) or ($0000 shl 14) or (00007 shl 2) or 0;
Type
  TPREVENT_MEDIA_REMOVAL  = record
  PreventMediaRemoval : ByteBool;
end;
var
  HandleVolume : THandle;
  formatoLetraDispositivo : string;
  lpBytesReturned : DWORD;
  PreventRemoval : TPREVENT_MEDIA_REMOVAL;
  T : Integer;
begin
  letraDispositivo := Uppercase(letraDispositivo);
  formatoLetraDispositivo := Format('%s:', [letraDispositivo]);
  Result := False;
  case GetDriveType(PChar(formatoLetraDispositivo)) of
    DRIVE_REMOVABLE:
    begin
      //configurar el formato deseado
      formatoLetraDispositivo := Format('\.\%s:', [letraDispositivo]);
      PreventRemoval.PreventMediaRemoval := False;
      //creación del volumen
      HandleVolume := CreateFile(PChar(formatoLetraDispositivo),
          GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,
          nil, OPEN_EXISTING, 0, 0);
      //cierre del volumen
      for T := 0 to numeroIntentos do
      begin
        if DeviceIoControl(HandleVolume, FSCTL_LOCK_VOLUME,
            nil, 0, nil, 0, lpBytesReturned, nil) then
        begin
          //desmontar volumen
          DeviceIoControl(HandleVolume, FSCTL_DISMOUNT_VOLUME,
              nil, 0, nil, 0, lpBytesReturned, nil);
          //control del volumen
          DeviceIoControl(HandleVolume, IOCTL_STORAGE_MEDIA_REMOVAL,
              @PreventRemoval, SizeOf(TPREVENT_MEDIA_REMOVAL),
              nil, 0, lpBytesReturned, nil);
          //retirar volumen
          DeviceIoControl(HandleVolume, IOCTL_STORAGE_EJECT_MEDIA, nil,
              0, nil, 0, lpBytesReturned, nil);
          //liberar el volumen
          Result := DeviceIoControl(HandleVolume, FSCTL_UNLOCK_VOLUME, nil,
              0, nil, 0, lpBytesReturned, nil);
          formatoLetraDispositivo := Format('%s:',[letraDispositivo]);
          //enviar al sistema aviso de que desmonte el dispositivo
          ShChangeNotify(SHCNE_MEDIAREMOVED, SHCNF_PATH,
              PChar(formatoLetraDispositivo), Nil);
          Break;
        end
        else
        begin
          Result := False;
          Sleep(intervaloTiempo);
        end;
      end;
      //liberar volumen
      CloseHandle(HandleVolume);
    end
    else
      Result := False;
  end;
end;

Procedure listaDispositivos (dispositivos : TStrings; tipos : Integer);
var
  i   : integer;
  bits  : set of 0..25;
  disco : String;
begin
  //obtener nombre de los discos lógicos
  integer(bits):= GetLogicalDrives;

  //obtener letras si el dispositivo es removible DRIVE_REMOVABLE
  for i := 0 to 25 do
  begin
    if i in bits then
    begin
      disco := Char(i + Ord('A')) + ':';
      if tipos = GetDriveType(PChar(disco)) then
        dispositivos.Append(Char(i + Ord('A')) + ': -> Conectado');
    end;
  end;
end;

procedure TformMenuPrincipal.FormActivate(Sender: TObject);
begin
  lsListaDispositivos.Clear;
  listaDispositivos(lsListaDispositivos.Items, DRIVE_REMOVABLE);
end;

procedure TformMenuPrincipal.btRetirarUSBClick(Sender: TObject);
var
  i : Integer;
begin
  volumen := '';
  for i := 0 to lsListaDispositivos.Count - 1 do
  begin
    if lsListaDispositivos.Checked[i] then
    begin
      volumen := lsListaDispositivos.Items.Strings[i];
      //retirar volúmenes seleccionados, con tres intentos
      //con un intervalo de de 2000 ms cada uno
      if extraerDispositivoUSB (volumen[1], 2000, 3) then
      begin
        MessageDlg('El dispositivo ' + volumen[1] +
            ' ya se puede retirar con seguridad.', mtInformation, [mbOk], 0);
        lsListaDispositivos.Items.Strings[i] := volumen[1] +
            ': -> esperando ser extraído físicamente ';
      end
      else
        MessageDlg('El dispositivo ' + volumen[1] + ' no puede ser retirado.' +
                    chr(13) + chr(13) + 'Posible causa:' + chr(13) +
                   '- El dispositivo ' + volumen[1] + ' está siendo utilizado.' +
                    chr(13) +
                   '- El dispositivo ' + volumen[1] + ' ya no existe.' + chr(13) +
                   '- El dispositivo ' + volumen[1] + ' tiene algún problema.',
                   mtWarning, [mbOk], 0);
    end;
  end;
end;

procedure TformMenuPrincipal.LWEBClick(Sender: TObject);
begin
  ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com'),
      Nil, Nil, SW_SHOWNORMAL);
end;

procedure TformMenuPrincipal.btSalirClick(Sender: TObject);
begin
  close;
end;

end.

Artículos relacionados

Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del proyecto AjpdSoft.


Anuncios


Enviado el Lunes, 24 mayo a las 23:14:22 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A