Newsgroup: it.comp.lang.delphi
Titolo: [usb][d5] forzare rimozione sicura usbkey

ciao a tutti, si puň forzare la disconnessione sicura hardware usb da 
delphi?
Simone 


Ciao Simone
la domanda che dovresti porti č: si puň forzare la disconnessione ecc.. da
windows ?
perchč non č Delphi che la disconnette ma una API di Windows.
Dovresti spulciare l'help MS
GP

ma in delphi5 esistevano le api per l'usb??
Simo

http://support.microsoft.com/kb/q165721/

 ha scritto nel messaggio
news:NY7Rd.557164$b5.25...@news3.tin.it...
: 
http://support.microsoft.com/kb/q165721/
:
Prova a vedere questo ...
[CODE}
function ScaricaCache: boolean;
var
    cache: SYSTEM_CACHE_INFORMATION;
    NtSetSystemInformation:   function( aType: Cardinal; source: pointer;
size: Ulong ): boolean; stdcall;
    lib{, hToken}: THandle;
begin
Result := False;
if ( GetVersion < $80000000 ) then
   begin
    lib := GetModuleHandle( 'ntdll.dll' );
    if ( lib <> 0 ) then
        begin
        @NtSetSystemInformation   := GetProcAddress( lib,
'NtSetSystemInformation'   );
        if Assigned( NtSetSystemInformation ) then
            begin
            FillChar( cache, sizeof( cache ), 0 );
            cache.MinimumWorkingSet := Ulong( -1 );
            cache.MaximumWorkingSet := Ulong( -1 );
            Result := NtSetSystemInformation( SYSTEMCACHEINFORMATION,
@cache, sizeof( cache ) );
            end;
         FreeLibrary( lib );
        end;
    end;
end;
[\CODE]

PS
Nell'implementazione in Delphi dell'esempio di papą Bill, io ho avuto
problemi con il LockVolume nel caso di FlashMemory
Andrea

:

io ho trovato il modo di fare RIMUOVI, ho notato che il drive (F:) viene 
comunque visualizzato ma viene come esplusa e se clicco su f: mi dice 
inserire un disco, in questa maniera l'utente puņ togliere la chiave ed 
essere sicuro di averla rimossa
unit EjecteDisque;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, FileCtrl;
type
  TForm1 = class(TForm)
    Button1: TButton;
    DriveComboBox1: TDriveComboBox;
    procedure Button1Click(Sender: TObject);
    procedure DriveComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
const
  VWIN32_DIOC_DOS_IOCTL = 1;  // Fonctions DOS 4400h-4411h
  IOCTL_STORAGE_EJECT_MEDIA = 2967560;  // Fonction NT correspondante
type
  Dioc_Registers = record
    EBX : Dword;
    EDX : Dword;
    ECX : Dword;
    EAX : Dword;
    EDI : Dword;
    ESI : Dword;
    Flags : Dword;
  end;
var
  Lecteur : Char;
procedure TForm1.Button1Click(Sender: TObject);
var
  hDevice : THandle;
  Nb : DWORD;
  Reg : Dioc_Registers;
  VersionInfo : TOSVersionInfo;
begin
  VersionInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(VersionInfo);
  if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
    hDevice := CreateFile(PChar('\\.\' + Lecteur + ':'), GENERIC_READ,
                          FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0)
  else
    hDevice := CreateFile('\\.\VWIN32', 0, 0, nil, 0,
                          FILE_FLAG_DELETE_ON_CLOSE, 0);
  if hDevice = INVALID_HANDLE_VALUE then
    RaiseLastWin32Error;
  if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
    if not DeviceIoControl(hDevice, IOCTL_STORAGE_EJECT_MEDIA,
                    nil, 0, nil, 0, Nb, nil) then
      RaiseLastWin32Error;
  end else begin
    with Reg do begin
      EAX := $440D;       {fc 44h de l'interr. 21h, sous-fonction 0Dh}
      EBX := Byte(Lecteur) - $40;           {A=1, B=2, C=3, D=4...}
      ECX := $0849;       {commande: Eject Removable Media}
    end;
    DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL,
                    @Reg, SizeOf(Reg), @Reg, SizeOf(Reg), Nb, nil);
    if Reg.Flags and 1 = 1 then case Reg.EAX of
      $01 : ShowMessage('The function is not supported.');
      $B1 : ShowMessage('The volume is locked in the drive.');
      $B2 : ShowMessage('The volume is not removable.');
      $B5 : ShowMessage('The valid eject request has failed.');
    end;
  end;
  CloseHandle(hDevice);
end;
procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
  Lecteur := UpCase(DriveComboBox1.Drive);
end;
end.

[...]
Ottimo, direi che questo codice (opportunamente tradotto dal francese) puo'
essere aggiunto alle FAQ, che ne dite?
Ciao
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

ue... il tempo era poco e visto che non prendevo sonno ieri notte sono 
riuscito a trovare solo questo... la traduzione ora direi che non è 
indispensabile :P:P:P:P:P
cmq, sarebbe ancora meglio se si riuscisse a far togliere anche la lettera 
da dentro risorse del computer... altrimenti è brutto vedere F: e poi quando 
ci clicchi ti dice inserire disco!!!!
Simo 

Fino al punto sopra c'ero arrivato (a suo tempo... ), se riesci a togliermi
anche la letterina dalle risorse .... ti offro una pizza (dalle parti di
Verona, s'intende...)
Ciao
Andrea

 ha scritto nel messaggio
news:q%mRd.38925$lB4.1...@twister1.libero.it...


 ha scritto nel messaggio
news:42160559$0$6319$5fc...@news.tiscali.it...
: Uhmm.. sono del parere che il vostro ottimo lavoro non e' concluso se


 ha scritto nel messaggio 
news:42160559$0$6319$5fc...@news.tiscali.it...


ops... ho inserito un usbkey della sata-MIA con crittografia a 256bit... ho 
provato a lanciare il codice però la lettera associata rimane ed è 
funzionante, infatti anche da windows non viene rimossa... come mai??
Simone 

funzionante
..addio faq.. !


questo genere di usbkey però è composta da 2 chip... una parte contiene il
codice per crittografare e l'altra i dati, quindi credo che il sistema su
usbkey standard possa funzionare... l'ho provato su kingstone e su altra
marca scadente
Simo

 ha scritto nel messaggio
news:37u2r6F...@individual.net...
: we alla fine posso fidarmi del codice che ho postato?? dalle prove che ho
: fatto mi funziona, perņ aspetto suggerimenti...
:
:
: Simo
:
:

 ha scritto nel messaggio
news:37mkc7F...@individual.net...
: ops... ho inserito un usbkey della sata-MIA con crittografia a 256bit...
ho
: provato a lanciare il codice perņ la lettera associata rimane ed č
: funzionante, infatti anche da windows non viene rimossa... come mai??
:
: Simone
:
:



e qui dentro?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk5/html/wce50grfusbhostclientdriverfunctions.asp

 ha scritto nel messaggio
news:gesSd.574283$b5.26...@news3.tin.it...
: e qui dentro?
:
:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk5/html/wce50grfusbhostclientdriverfunctions.asp
:
:

sto impazzendo ma non trovo soluzione... se trovate qualcosa pure voi fatemi 
sapere
Simo 

sapere
Chi trova per primo alla prossima cena di ICLD sicuramente mangera'
gratissssss! :D


Non so se hai visto qui
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/install/hh/install/cfgmgrfn_2c8cc2aa-56fe-4ab3-8063-0db0dcbc3098.xml.asp
Giulio 

lapsus... la funzione sembra quella giusta... ora come faccio a dichiararla
dentro delphi????
Sarà il post-palestra che mi rincoglionisce!!!!

ho trovato questo:
http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.nativeapi/2003-10/0756.html
type
  _PNP_VETO_TYPE = (
    PNP_VetoTypeUnknown,
    PNP_VetoLegacyDevice,
    PNP_VetoPendingClose,
    PNP_VetoWindowsApp,
    PNP_VetoWindowsService,
    PNP_VetoOutstandingOpen,
    PNP_VetoDevice,
    PNP_VetoDriver,
    PNP_VetoIllegalDeviceRequest,
    PNP_VetoInsufficientPower,
    PNP_VetoNonDisableable,
    PNP_VetoLegacyDriver);
  PNP_VETO_TYPE = _PNP_VETO_TYPE;
  PPNP_VETO_TYPE = ^_PNP_VETO_TYPE;
  TPnpVetoType = _PNP_VETO_TYPE;
  PPnpVetoType = PPNP_VETO_TYPE;
type
  DEVINST = DWORD;
  TDevInst = DEVINST;
function CM_Request_Device_EjectA(
  dnDevInst: TDevInst;
  out pVetoType: TPnpVetoType;
  pszVetoName: PAnsiChar;
  ulNameLength: ULONG;
  ulFlags: ULONG):
function CM_Request_Device_EjectW(
  dnDevInst: TDevInst;
  out pVetoType: TPnpVetoType;
  pszVetoName: PWideChar;
  ulNameLength: ULONG;
  ulFlags: ULONG):
function CM_Request_Device_Eject(
  dnDevInst: TDevInst;
  out pVetoType: TPnpVetoType;
  pszVetoName: PChar;
  ulNameLength: ULONG;
  ulFlags: ULONG):

http://www.delphipraxis.net/search.php?search_id=196878307&start=0

//
// this sample demostrates how to safely remove a hardware using
// CM_Request_Device_Eject API.
//
// You need install Windows DDK to build this sample.
//
//   
http://www.microsoft.com/whdc/ddk/
//
// Specifically the following two header files are needed:
//
//   \WINDDK\inc\ddk\wxp\cfg.h
//   \WINDDK\inc\ddk\wxp\cfgmgr32.h
//
// Copy the two files to the currently directory and then
//
//   cl remove.cpp /I. /link setupapi.lib
//
#include <windows.h>
#include <stdio.h>
#include <setupapi.h>
#include <cfgmgr32.h>
void EjectDevice(DEVINST devinst)
{
    CM_Request_Device_Eject(devinst, NULL, NULL, 0, 0);
}
void main()
{
    HDEVINFO hdevinfo;
    hdevinfo = SetupDiGetClassDevs(NULL, NULL, NULL,
        DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_PROFILE);
    SP_DEVINFO_DATA devinfo_data;
    devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA);
    for(int i = 0; SetupDiEnumDeviceInfo(hdevinfo, i, &devinfo_data); i++)
    {
        DWORD Capabilities;
        SetupDiGetDeviceRegistryProperty(hdevinfo, &devinfo_data,
            SPDRP_CAPABILITIES,
            NULL, (PBYTE)&Capabilities, sizeof(Capabilities), NULL);
        if( !(Capabilities & CM_DEVCAP_REMOVABLE) ||
            (Capabilities & CM_DEVCAP_SURPRISEREMOVALOK) )
        {
            continue;
        }
        DEVINST devinst = devinfo_data.DevInst;
        const int size = 300;
        BYTE buffer[size];
        DWORD requiredSize;
        SetupDiGetDeviceRegistryProperty(hdevinfo, &devinfo_data,
            SPDRP_DEVICEDESC,
            NULL, buffer, size, NULL);
        printf("%8d %s\n", devinst, buffer);
        // Add code to display UI for user to select a device to remove,
and then:
        //
        // EjectDevice(devinst);
    } SetupDiDestroyDeviceInfoList(hdevinfo);
}

hi, do you know how run the safe remove for usb sticks under delphi??
Please download all Zips from 
http://www.sf.net/projects/jedi-apilib
The Setup API Zip contains an example for safe removal.
-- 
Robert Marquardt (Team JEDI)  
http://delphi-jedi.org

The Setup API Zip contains an example for safe removal.
BINGO!
Converrebbe aggiungerla alle faq, penso sia interessante averlo sempre a
disposizione ;)
Ciao!


ragazzi io sono appena rientrato da Cremona!!! qualcuno l'ha provato???? chi 
vince il pranzo ??? hihihi
Simo 

vince il pranzo ??? hihihi
ehehehe... si direbbe che il premio spetti a te, pero' devo ancora provarlo
con le chiavi in mio possesso (3 marche comuni), qualcun'altro ha gia'
testato?
:-D



Vinco io che gli ho suggerito la funzione , no ?  :-D
Giulio 

dai passo il premio.... permaloso!!! :P:P

 dai passo il premio.... permaloso!!! :P:P
Deve decidere Phora che ha messo in palio la cena :
a me antipasto e a te il resto ok ?
( il conto a Phora , ovvio ..)    :-)
Giulio
Ps
ma funziona ? non ho avuto il tempo di provare .... 

ok... guarda che č piu' facile pagarmi un vestito che pagarmi da mangiare 
:P:PP:P:PP
Simo 


E  che cosa ci sei venuto di bello a fare in questa landa desolata ?
Ciao
MaoSw 

ue son venuto a trovare una parrucchiera....
Simo

ue ragazzi... solo ora ho trovato un attimo per provare la libreria... ma
purtroppo appena cerco di compilare mi dice che cerca JwaWinType
qualcuno sa dirmi cos'č???
Simo

non avevo guardato bene... nel sito ci sono 2 download (la libreria per usb
e le api win32)
Simo

 ha scritto nel messaggio 
news:uF8Td.948013$35.35...@news4.tin.it...


Raga, una domanda ...
L'applicativo che deve fare la rimozione sicura ... dove si trova ? Sul
cancherino oppure sul HD ??
Nel primo caso, pensate che il SO permetta la rimozione sicura di un
dispositivo mentre sullo stesso sta girando un applicativo ?
Andrea