Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: USB Drive Letter Assignment in Win32

by shonorio (Hermit)
on Jun 06, 2004 at 23:13 UTC ( [id://361824]=note: print w/replies, xml ) Need Help??


in reply to USB Drive Letter Assignment in Win32

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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://361824]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (3)
As of 2024-04-25 09:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found