Assign the same Drive Letter Every Time to USB Drive with USBDLM - usb-drive

I try to use USBDLM to connect separately a USB sticks and a USB drive to appear always as drive T.
On every USB stich/drive I put a USBDLM.ini with:
[DriveLetters]
Letters=%drive%\usbdlm.ini
and for every drive its own configuration as:
[DriveLetters10]
; Aldistick
DeviceID1=USB 2.0 Flash Disk USB Device
Letter1=T
; many other options are documented in the Help files
[DriveLetters20]
VolumeSerial=16ED-33C5
Letter=T
But I find out that this is not working unless I put the same usbdlm.ini file for every stick/drive into the folder where USBDLM.exe is placed.
Do I something wrong?
Thanks.

On the drive you need an USBDLM.INI which contains a simple [DriveLetters] section with the desired letters:
[DriveLetters]
Letters=T
In the main USBDLM.INI you let is read the letter from the INI on the drive:
[DriveLetters]
Letters=%drive%\usbdlm.ini
Maybe it is more handy to let USBDLM extract the desired drive letter from the volume label, e.g. label it "Drive T" and write in the main USBDLM.INI:
[DriveLetters]
Letters=%LetterFromLabel%
http://www.uwe-sieber.de/usbdlm_help_e.html#by_label
Uwe Sieber

Related

How to map a network drive inside a batch

My users are use to map network drives.
I developed a tools, which use a network drive i:.
Problem : I may overlap a user-defined drive.
How can I open a dos batch file which will define a new network drive for its own usage but that will not change the network drives visible by the user?
you can use
pushd \\server\share
it will map a drive on the first available letter
the drive will be disconnect when running popd
Current directory may be obtained through the environement variabble %cd%.
You can use a for loop to find an available drive letter.
for %%d in (z y x w v u t s r q p o n m l k j i h g) do if not exist %%d:\* set drive=%%d
Then use %drive%: in place of I: throughout your bat file.
e.g. net use %drive%: \\server...
The drive letter system is nowadays quite outdated, you may want to substitue yourself in the path.
s/^i:\/\\SomeServer\SomeShare\
Cordially

determine if drive is removable (flash or HDD) knowing only the drive letter

I am trying to determine if a file is on a local drive. I found GetDriveType() WINAPI which retrieves the drive type. However reading the description of the return values it seems, and thats how I understand it, that it retrieves a flash drive as FIXED which is not what I want.
Its working fine on local drives:
bool IsDriveRemovableOrRemote(CString driveRoot)
{
UINT driveType = GetDriveType(driveRoot);
return (DRIVE_REMOVABLE == driveType || DRIVE_CDROM == driveType || DRIVE_NO_ROOT_DIR == driveType || DRIVE_REMOTE == driveType);
}
I don't have a flash/external drive to test ATM but I would like if someone can tell me if my interpretation is correct? and if so, what better alternative should I use?
Please bear in mind that I only have the path of the file.
You should read the doco more closely. While a Flash drive is considered a fixed device, there's a note in that linked page:
To determine whether a drive is a USB-type drive, call SetupDiGetDeviceRegistryProperty and specify the SPDRP_REMOVAL_POLICY property.
The process seems a little messy if all you start with is the path but you can start reading the doco here. It looks like you may need to enumerate the devices until you find one matching your drive.
To avoid doing this to all your requests, I would do a two-stage check. If your current method says it's not fixed, treat it as non-local.
If it says it is fixed, then you can enumerate the devices using my suggested method to be certain.
Alternatively, you can enumerate all fixed non-USB drives the first time you need to, and then just cache the information. I'm pretty certain that the list of these drives won't change while the system is running - drives that get added and deleted are, by definition, removable.
You can try using DeviceIoControl and query for the BusType = BusTypeUsb by passing IOCTL_STORAGE_QUERY_PROPERTY as its second parameter. Read Determining USB by Thomas Lee at the bottom of page.

DefineDosDevice GetVolumeNameForVolumeMountPoint

MSDN has a nice example of changing drive letters at:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364014(v=vs.85).aspx
Only problem is that it doesn't work on my Windows 7 system.
Am invoking the EXE from a DOS window with admin privileges.
I start with a thumb drive on E:
I can use the MSDN example to remove E:
But when I then use the MSDN example to assign F: to the same thumb drive, the initial DefineDosDevice for F: succeeds, but the subsequent GetVolumeNameForVolumeMountPoint fails thus SetVolumeMountPoint fails.
I understand that the function of the initial DefineDosDevice is to create the drive letter so there's something for GetVolumeNameForVolumeMountPoint to connect to and thus return the volume name, but GetVolumeNameForVolumeMountPoint is behaving as if the intial DefineDosDevice has failed.
Whassup?
The problem was the second argument to ChangeLetter.exe when defining a new drive. You must include the partition number. Assume USB drive is set for E: and you want to move it to F:. You must do the following:
ChangeLetter -r E:
ChangeLetter F: \device\harddisk1\partition1
Harddisk counts from zero. Partition counts from one.

Is there a way to list drive letters in dired?

On windows, how could I open a dired buffer showing all drive letters. When you do C-x d you should always provide a directory, but I want to start at the drive letters level instead of a root directory of a particular drive.
If no standard solution exists, do you have one (an extension to dired ?) ? or links to articles on the subject ?
In dired you can only view directories, and since no directory exists which contains your drive letters, you can't see a list of them.
To do this you'd have to write an emacs-lisp extension for dired.
AFAIK there's no existing extension, however, a call to wmic can give you a listing of drive letters and volume names, which would be a good starting point.
The wmic command:
wmic logicaldisk get caption,drivetype,providername,volumename
Calling it from emacs-lisp and getting the result as a string.
(let (sh-output volumes)
(setq sh-output (shell-command-to-string "wmic LogicalDisk get Caption,DriveType,ProviderName,VolumeName"))
)
Will give you a list of the volumes (DriveType : 3 = HDD, 4 = Network Mapping, 5 = Optical.)
However, you can't get dired to recognize a buffer with this output, so you'd need to create a major mode for browsing windows volumes, which would show this listing and bind RET to find the drive letter on the current line and do a dired at it's root.
If you just want the drive letters listed...
(let (sh-output volumes)
(setq sh-output (shell-command-to-string "wmic LogicalDisk get Caption"))
)
Will do that.
Dired+ has what you want.
Command diredp-w32-drives opens a list/menu of the Windows drives. Use RET or mouse-2 to open Dired on one of the drives. The local drives come from option diredp-w32-local-drives, which you can customize.
If you hit ^ in Dired when visiting one of your drives (e.g. C:\), then you get to the same list/menu of all drives.

Maximum number of drives in windows?

I'm trying to figure out the available disk space programmatically in windows. For this, I need to first get a list of the available drives, then check which of those are local drives and then query the available bytes on each local drive.
I'm a bit stuck on the first part, where the API presents two functions:
GetLogicalDrives (http://msdn.microsoft.com/en-us/library/aa364972(VS.85).aspx) which gives you a DWORD with the bits set (bit 0 if drive A is present, bit 1 if drive B etc)
GetLogicalDriveStrings (http://msdn.microsoft.com/en-us/library/aa364975(VS.85).aspx) which gives you the actual strings.
Now, although I'll be using strings later on, I'd prefer using the first option for querying. However, on my system a DWORD is typedef-ed to "unsigned long", which is 4 bytes, whereas drive letters only range A-Z (26 - i think - characters). Obviously, one can define more than 26 drives on their system (however unlikely they are to do so) - so I was wondering if there was any convention for those drives. Can someone point me to a resource on this?
Thanks.
DWORD is always 4 bytes, regardless of the system (it's a Win32 type).
The maximum for drive letters in Windows is 26. Because English alphabet has only 26 letters :). However, Windows allows two ways to mount a volume:
to a drive letter
to a directory (on an NTFS volume).
You can mount one volume to multiple locations (but no more than one drive letter, IIRC). A GUI for this task is presented by Control Panel -> Administrative Tools -> Computer Management -> Disk Management.
If you want to have more than 26 drives with the additional drives being redirects to already active drives and are okay with them not working properly in most programs, then you can assign more with the following method (be warned they won't even show up in the file explorer):
subst ♪: C:\Temp\
cd /D ♪:\
and to delete them (also they aren't preserved through restarts):
subst /D ♪:
You can enumerate all volumes and their mount points as described in this article.
You could use WMI. The following WMI query should list all drives:
SELECT * FROM Win32_DiskDrive
It it not sufficient to enumerate MS-DOS drives (there can be at most 26 of them, by the way, although each can be bound twice, once globally and once locally in your session), a volume can, for example, be mounted to a directory. What you want is probably to enumerate all volumes in the system, using FindFirstVolume et al. Take a look at the associated MSDN example.

Resources