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

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

post id: 5

post length: 4139

post datetime: 12/9/2009 6:08:30 PM

post ip: 77.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.