Hi traveler

Maybe you could use one code as like I'm sending, of course you must adapt somethings (like remove die), but they will running as like services (you must install as services first, take a look on Win32::Daemon POD) and could change the letter of you USB driver.

I'm not sure how Windows will show the driver after you plug in on computer, because this I wrote the GetLogicalDisk to verify anything about this driver and change letter if necessary.

use Win32; use strict; use Win32::OLE qw( in ); use Win32::Daemon; use Win32::API::Prototype; # Declare api ApiLink( 'kernel32.dll', 'BOOL DeleteVolumeMountPoint( LPCTSTR lpszVol +umeMountPoint )' ) || die; ApiLink( 'kernel32.dll', 'BOOL SetVolumeMountPoint( LPCTSTR lpszVolume +MountPoint, LPCTSTR lpszVolumeName ) ' ) || die; ApiLink( 'kernel32.dll', 'BOOL GetVolumeNameForVolumeMountPoint( LPCT +STR lpszVolumeMountPoint, LPTSTR lpszVolumeName, DWORD cchBufferLen +gth )' ) || die; my ($State); my $SERVICE_SLEEP_TIME = 20; # 20 milliseconds my $PrevState = SERVICE_START_PENDING; # Start one loop to manage the services while( SERVICE_STOPPED != ( $State = Win32::Daemon::State() ) ) { if( SERVICE_START_PENDING == $State ) { # Initialization code Win32::Daemon::State( SERVICE_RUNNING ); $PrevState = SERVICE_RUNNING; } elsif( SERVICE_STOP_PENDING == $State ) { Win32::Daemon::State( SERVICE_STOPPED ); } elsif( SERVICE_PAUSE_PENDING == $State ) { # "Pausing..."; Win32::Daemon::State( SERVICE_PAUSED ); $PrevState = SERVICE_PAUSED; next; } elsif( SERVICE_CONTINUE_PENDING == $State ) { # "Resuming..."; Win32::Daemon::State( SERVICE_RUNNING ); $PrevState = SERVICE_RUNNING; next; } elsif( SERVICE_STOP_PENDING == $State ) { # "Stopping..."; Win32::Daemon::State( SERVICE_STOPPED ); $PrevState = SERVICE_STOPPED; next; } elsif( SERVICE_RUNNING == $State ) { my $VolumeMountPoint = GetLogicalDisk(); # if the drive is not U:, change if ( $VolumeMountPoint ne "U:" ) { my $VolumeName = NewString( 256 ); if (! GetVolumeNameForVolumeMountPoint ("$VolumeMountPoint +\\", $VolumeName, 256) ) { print Win32::GetLastError(); } else { $VolumeName =~ /(\x00)/; $VolumeName = $`; # Remove n +ull } if (! DeleteVolumeMountPoint("$VolumeMountPoint\\") ) { print Win32::GetLastError(); } if (! SetVolumeMountPoint ("U:\\", $VolumeName )) { print Win32::GetLastError(); } } } else { # Got an unhandled control message. Set the state to # whatever the previous state was. Win32::Daemon::State( $PrevState ); } # Check for any outstanding commands. Pass in a non zero +value # and it resets the Last Message to SERVICE_CONTROL_NONE. if( SERVICE_CONTROL_NONE != ( my $Message = Win32::Daemon::Que +ryLastMessage( 1 ) ) ) { if( SERVICE_CONTROL_INTERROGATE == $Message ) { # Got here if the Service Control Manager is requesting # the current state of the service. This can happen for # a variety of reasons. Report the last state we set. Win32::Daemon::State( $PrevState ); } elsif( SERVICE_CONTROL_SHUTDOWN == $Message ) { # Yikes! The system is shutting down. We had better clean up # and stop. # Tell the SCM that we are preparing to shutdown and that we + expect # it to take 25 seconds (so don't terminate us for at least +25 seconds)... Win32::Daemon::State( SERVICE_STOP_PENDING, 25000 ); } } # Snooze for awhile so we don't suck up cpu time... Win32::Sleep( $SERVICE_SLEEP_TIME ); } # We are done so close down... Win32::Daemon::StopService(); sub GetLogicalDisk { # Here, you could do a query to verify if the USB driver in on Windows +, # look at http://msdn.microsoft.com/library/default.asp?url=/library/e +n-us/wmisdk/wmi/win32_logicaldisk.asp # site to verify wich value you could use, like serialnumber or volume + name my $WMIServices = Win32::OLE->GetObject ( "winmgmts:{impersonation +Level=impersonate, (security)}//./root/cimv2" ) || die; my $DriveCollection = $WMIServices->ExecQuery ( 'select * from Win +32_LogicalDisk where VolumeSerialNumber = "2CBE1114"' ) || die "Query + Failed"; foreach my $Drive ( in( $DriveCollection ) ) { return $Drive->{'Name'}; } }
Solli Moreira Honorio
Sao Paulo - Brazil

In reply to Re: USB Drive Letter Assignment in Win32 by shonorio
in thread USB Drive Letter Assignment in Win32 by traveler

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.