Documents & code‎ > ‎

Win32_Volume_Management. Монтируем раздел на папку

Win32_Volume_Management. Монтируем раздел на папку.   
post id5 
post length4139 
post datetime12/9/2009 6:08:30 PM 
post ip77.51.3.219 

 

Win32_Volume_Management. Монтируем раздел на папку. 
Дата подачи: 06.12.2008 


Win32_Volume_Management. 
linked disk to the folder on an NTFS volume. 

[Kernel32.] 

 Монтируем раздел на папку. 
(только NTFS…) 


Example [Visual Basic]: 



<CLSCompliant(False)> _ 
Public Class Win32_VolumeManagement 

      <DllImport("kernel32")> _ 
      Public Shared Function SetVolumeMountPoint( _ 
       ByVal lpszVolumeMountPoint As String, _ 
       ByVal lpszVolumeName As String _ 
       ) As Boolean 
      End Function 

      <DllImport("kernel32")> _ 
      Public Shared Function DeleteVolumeMountPoint( _ 
       ByVal lpszVolumeMountPoint As String _ 
       ) As Boolean 
      End Function 

      <DllImport("kernel32")> _ 
      Public Shared Function GetVolumeNameForVolumeMountPoint( _ 
       ByVal lpszVolumeMountPoint As String, _ 
       ByVal lpszVolumeName As IntPtr, _ 
       ByVal cchBufferLength As Integer _ 
       ) As Boolean 
      End Function 

End Class 



-------------------- 

Для монтироавания раздела указываем: 
1. – куда монтируем. (только NTFS) 
(может быть и корневым каталогом…) 
2. – откуда берём. (любой формат) 
Значение этого параметра передается в формате [Guid`а], а потому его нужно сначала получить через GetVolumeNameForVolumeMountPoint(). Передавая буффер, его размер будет равен \\?\Volume + [Guid] в расчёте байт/ на символ, но взять больше чтобы не ошибиться – правильное решение ;) 

-------------------- 



Example [Visual Basic]: 

<StructLayout(LayoutKind.Sequential)> _ 
Structure lpszVolumeName 
      <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=254)> Public lpszVolumeMountPoint As String 
End Structure 


Sub Mount(ByVal lpszVolumeMountPoint As String) 

      Try 

       Dim Buf As New lpszVolumeName 

       Dim BufSize As Integer = Runtime.InteropServices.Marshal.SizeOf(Buf) 

       Dim ptr As IntPtr = Runtime.InteropServices.Marshal.AllocHGlobal(BufSize) 

       If Emicrox.Win32_VolumeManagement.GetVolumeNameForVolumeMountPoint( _ 
             "d:\", _ 
             ptr, _ 
             BufSize) = True Then 

            Buf = Runtime.InteropServices.Marshal.PtrToStructure(ptr, GetType(lpszVolumeName)) 

            With Buf 

             Dim VolumeName As String = .lpszVolumeMountPoint 

             If Emicrox.Win32_VolumeManagement.SetVolumeMountPoint( _ 
                   lpszVolumeMountPoint, VolumeName) = True Then 

                  Console.WriteLine(String.Concat("Mounting disk D:\ onto " _ 
                   , lpszVolumeMountPoint, " = Ok.")) 

                  Console.WriteLine(String.Concat( _ 
                   "Unique name volume [GUID]: " _ 
                   , VolumeName _ 
                   )) 

                  Console.WriteLine(String.Concat( _ 
                   " Press any key For un`mounting..." _ 
                   )) 

             Else 
                  Console.WriteLine(String.Concat("Except: ", _ 
                  Emicrox.Win32_Exception.GetException(), "!" _ 
                  )) 
             End If 

            End With 

       Else 
            Console.WriteLine(String.Concat("Except: ", _ 
            Emicrox.Win32_Exception.GetException(), "!" _ 
            )) 
       End If 

       Runtime.InteropServices.Marshal.FreeHGlobal(ptr) 

      Catch ex As Exception 
       Console.WriteLine(String.Concat( _ 
       "Exception: ", ex.Message _ 
       )) 
      End Try 

End Sub 


Sub UnMount(ByVal lpszVolumeMountPoint As String) 

      If Emicrox.Win32_VolumeManagement.DeleteVolumeMountPoint( _ 
            lpszVolumeMountPoint) = True Then 

       Console.WriteLine(String.Concat("disk D:\ un`mounting!" _ 
       )) 

      Else 
       Console.WriteLine(String.Concat("Except: ", _ 
       Emicrox.Win32_Exception.GetException(), "!" _ 
       )) 
      End If 

End Sub 


<STAThread()Sub Main() 

      Mount("c:\mnt\fdrive\") 

      Console.ReadLine() 

      UnMount("c:\mnt\fdrive\") 

      Console.ReadLine() 

End Sub 



THE END. 
Comments