Update contrib.
1 // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of the License "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // e32test\usb\t_usb_win\src\eject.cpp
26 extern void PrintOut(BOOL screenFlag, BOOL logFlag, BOOL timeFlag, const char *format, ...);
28 HANDLE OpenVolume(char driveLetter)
32 TCHAR szVolumeName[8];
34 TCHAR cDriveLetter = driveLetter;
36 if (driveLetter == ' ')
38 return INVALID_HANDLE_VALUE;
41 wsprintf(szRootName, "%c:\\", cDriveLetter);
43 uDriveType = GetDriveType(szRootName);
44 if (uDriveType != DRIVE_REMOVABLE)
46 return INVALID_HANDLE_VALUE;
49 wsprintf(szVolumeName, "\\\\.\\%c:", cDriveLetter);
51 hVolume = CreateFile( szVolumeName,
52 GENERIC_READ | GENERIC_WRITE,
53 FILE_SHARE_READ | FILE_SHARE_WRITE,
62 #define LOCK_RETRY_DELAY 500 // half a second
63 #define LOCK_RETRY_MAX 20
65 BOOL LockAndDismout(HANDLE hVolume)
67 DWORD dwBytesReturned;
69 // Retry a number of times
70 for (int i = 0; i < LOCK_RETRY_MAX; i++)
72 if (DeviceIoControl(hVolume, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dwBytesReturned, NULL))
74 return DeviceIoControl( hVolume, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
76 Sleep (LOCK_RETRY_MAX);
82 BOOL AllowRemovalAndEject (HANDLE hVolume)
84 DWORD dwBytesReturned;
85 PREVENT_MEDIA_REMOVAL PMRBuffer;
87 PMRBuffer.PreventMediaRemoval = FALSE;
89 if (DeviceIoControl( hVolume, IOCTL_STORAGE_MEDIA_REMOVAL, &PMRBuffer, sizeof(PREVENT_MEDIA_REMOVAL),
90 NULL, 0, &dwBytesReturned, NULL))
91 return DeviceIoControl( hVolume, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
97 BOOL EjectVolume(char driveLetter)
99 HANDLE hVolume = INVALID_HANDLE_VALUE;
102 hVolume = OpenVolume(driveLetter);
104 if (hVolume == INVALID_HANDLE_VALUE)
107 // Lock and dismount the volume.
108 if (LockAndDismout(hVolume))
110 // Set prevent removal to false and eject the volume.
111 AllowRemovalAndEject(hVolume);
114 // Close the volume so other processes can use the drive.
115 if (!CloseHandle(hVolume))
121 #define WAIT_RETRIES 500
122 #define WAIT_TIME 250
123 #define WAIT_DELAY 1500
125 BOOL WaitDriveReady (char driveLetter)
127 UINT uDriveType = DRIVE_UNKNOWN ;
131 wsprintf(szRootName, "%c:\\", driveLetter);
133 for (int i = 0; i < WAIT_RETRIES && (uDriveType != DRIVE_REMOVABLE); i++)
135 uDriveType = GetDriveType(szRootName);
136 if (uDriveType != DRIVE_REMOVABLE)
139 waitTime += WAIT_TIME;
144 waitTime += WAIT_DELAY;
149 PRINT_ALWAYS "Drive %c ready after %d milliseconds.\n",driveLetter,waitTime);
150 return uDriveType == DRIVE_REMOVABLE;