Añadida a la sección Descargas la aplicación AjpdSoft Quitar dispositivos USB de forma segura: muestra las unidades extraíbles 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 (Universal Serial Bus).
- Características más importantes de AjpdSoft Quitar dispositivos USB de forma segura.
- AjpdSoft Quitar dispositivos USB de forma segura en funcionamiento.
- Instalación y configuración de AjpdSoft Quitar dispositivos USB de forma segura.
- Datos técnicos de AjpdSoft Quitar dispositivos USB de forma segura.
- A quién va dirigida AjpdSoft Quitar dispositivos USB de forma segura.
- Anexo.
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, nos detectará los posibles dispositivos USB de almacenamiento conectados al equipo:
Conectaremos un dispositivo USB de almacenamiento (lápiz de memoria o pendrive) al equipo:
Detectará el nuevo dispositivo USB conectado, mostrará la letra de unidad que le haya asignado el sistema operativo:
El dispositivo conectado creará una letra de unidad en Windows, que podremos ver abriendo el Explorador de Windows:
Para desconectarlo o extraerlo de forma segura marcaremos el dispositivo y pulsaremos en «Retirar USB»:
Si se ha podido retirar correctamente nos mostrará el siguiente mensaje:
Con el texto: «El dispositivo J ya se puede retirar con seguridad».
Si no se puede retirar mostrará un mensaje de error como este:
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á:
Con el texto: «Esperando ser extraído físicamente».
Una vez que extraigamos el dispositivo USB físicamente del equipo:
La aplicación detectará el cambio y lo quitará de la lista automáticamente:
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, que se incluye en la descarga.
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 Delphi 6:
Ha sido testada y funciona correctamente en equipos con sistemas operativos: Windows XP, Windows Vista y Windows 7 (Seven), Windows 8, Windows 10, Windows 2000 Server, Windows Server 2003, Windows Server 2008, Windows Server 2012, Windows Server 2019.
Para usuarios desarrolladores de software
La aplicación utiliza los siguientes componentes (para Delphi 6):
- Windows XP Theme Manager 1.10.1: adaptar la aplicación al tema visual de Windows (gratuito – freeware).
A quién va dirigida 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
Unidad «UnidadMenuPrincipal.pas»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
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('https://www.proyectoa.com'), Nil, Nil, SW_SHOWNORMAL); end; procedure TformMenuPrincipal.btSalirClick(Sender: TObject); begin close; end; end. |