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:
Conectaremos un dispositivo USB de almacenamiento (lápiz de memoria o pendrive) al equipo:
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:
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.
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