Пример #1
0
 public extern static int DeviceIoControl(
     SafeFileHandle hDevice,
     uint dwIoControlCode,
     [In] ref PREVENT_MEDIA_REMOVAL lpInBuffer,
     uint nInBufferSize,
     IntPtr lpOutBuffer,
     uint nOutBufferSize,
     ref uint lpBytesReturned,
     IntPtr lpOverlapped);
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="aVolume"></param>
        /// <param name="aPreventRemoval"></param>
        /// <returns></returns>
        static private bool PreventRemovalOfVolume(SafeFileHandle aVolume, bool aPreventRemoval)
        {
            //Hope that's doing what I think it does
            IntPtr dwBytesReturned = new IntPtr();
            //Should not be needed but I'm not sure how to pass NULL in there.
            OVERLAPPED overlapped = new OVERLAPPED();
            //
            PREVENT_MEDIA_REMOVAL preventMediaRemoval = new PREVENT_MEDIA_REMOVAL();

            preventMediaRemoval.PreventMediaRemoval = Convert.ToByte(aPreventRemoval);
            IntPtr preventMediaRemovalParam = MarshalToPointer(preventMediaRemoval);

            bool result = Function.DeviceIoControl(aVolume, Const.IOCTL_STORAGE_MEDIA_REMOVAL, preventMediaRemovalParam, Convert.ToUInt32(Marshal.SizeOf(preventMediaRemoval)), IntPtr.Zero, 0, dwBytesReturned, ref overlapped);

            CheckLastError("Media removal: ");
            Marshal.FreeHGlobal(preventMediaRemovalParam);

            return(result);
        }
Пример #3
0
 public extern static int DeviceIoControl(IntPtr hDevice, uint IoControlCode,
                                          [In] PREVENT_MEDIA_REMOVAL InMediaRemoval, uint InBufferSize,
                                          IntPtr OutBuffer, uint OutBufferSize,
                                          ref uint BytesReturned,
                                          IntPtr Overlapped);
Пример #4
0
 public static void Eject(string driveLetter)
 {
     if (driveLetterRe.IsMatch(driveLetter))
     {
         uint returnedBytes = 0;
         SafeFileHandle fileHandle = null;
         try
         {
             string driveFileName = createFileNamePrefix + driveLetter.TrimEnd(driveLetterTrimChars);
             fileHandle = CreateFile(driveFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
             if (fileHandle.IsInvalid)
             {
                 throw new Win32Exception();
             }
             // LOCK VOLUME
             bool locked = false;
             for (int i = 0; i < 20; ++i)
             {
                 if (DeviceIoControl(fileHandle, FSCTL_LOCK_VOLUME, IntPtr.Zero, 0, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero))
                 {
                     locked = true;
                     break;
                 }
                 else
                 {
                     Thread.Sleep(500);
                 }
             }
             if (false == locked)
             {
                 throw new Win32Exception();
             }
             // DISMOUNT VOLUME
             if (false == DeviceIoControl(fileHandle, FSCTL_DISMOUNT_VOLUME, IntPtr.Zero, 0, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero))
             {
                 throw new Win32Exception();
             }
             // ENABLE REMOVAL
             var pmr = new PREVENT_MEDIA_REMOVAL { PreventMediaRemoval = false };
             int pmrSz = Marshal.SizeOf(pmr);
             if (false == DeviceIoControl(fileHandle, IOCTL_STORAGE_MEDIA_REMOVAL, ref pmr, pmrSz, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero))
             {
                 throw new Win32Exception();
             }
             // AUTO EJECT
             if (false == DeviceIoControl(fileHandle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero))
             {
                 throw new Win32Exception();
             }
         }
         finally
         {
             if (null != fileHandle)
             {
                 fileHandle.Close();
             }
         }
     }
     else
     {
         throw new ArgumentException("Invalid drive letter!", "driveLetter");
     }
 }
Пример #5
0
 static extern bool DeviceIoControl(SafeFileHandle hDevice, uint dwIoControlCode,
     ref PREVENT_MEDIA_REMOVAL lpInBuffer, int nInBufferSize,
     IntPtr lpOutBuffer, uint nOutBufferSize, out uint lpBytesReturned, IntPtr lpOverlapped);
Пример #6
0
 public static void Eject(string driveLetter)
 {
     if (driveLetterRe.IsMatch(driveLetter))
     {
         uint           returnedBytes = 0;
         SafeFileHandle fileHandle    = null;
         try
         {
             string driveFileName = createFileNamePrefix + driveLetter.TrimEnd(driveLetterTrimChars);
             fileHandle = CreateFile(driveFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
             if (fileHandle.IsInvalid)
             {
                 throw new Win32Exception();
             }
             // LOCK VOLUME
             bool locked = false;
             for (int i = 0; i < 20; ++i)
             {
                 if (DeviceIoControl(fileHandle, FSCTL_LOCK_VOLUME, IntPtr.Zero, 0, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero))
                 {
                     locked = true;
                     break;
                 }
                 else
                 {
                     Thread.Sleep(500);
                 }
             }
             if (false == locked)
             {
                 throw new Win32Exception();
             }
             // DISMOUNT VOLUME
             if (false == DeviceIoControl(fileHandle, FSCTL_DISMOUNT_VOLUME, IntPtr.Zero, 0, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero))
             {
                 throw new Win32Exception();
             }
             // ENABLE REMOVAL
             var pmr = new PREVENT_MEDIA_REMOVAL {
                 PreventMediaRemoval = false
             };
             int pmrSz = Marshal.SizeOf(pmr);
             if (false == DeviceIoControl(fileHandle, IOCTL_STORAGE_MEDIA_REMOVAL, ref pmr, pmrSz, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero))
             {
                 throw new Win32Exception();
             }
             // AUTO EJECT
             if (false == DeviceIoControl(fileHandle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, out returnedBytes, IntPtr.Zero))
             {
                 throw new Win32Exception();
             }
         }
         finally
         {
             if (null != fileHandle)
             {
                 fileHandle.Close();
             }
         }
     }
     else
     {
         throw new ArgumentException("Invalid drive letter!", "driveLetter");
     }
 }