Страница: 1 | 2 |
Вопрос: Извлечение флешки
Добавлено: 27.01.08 12:43
Автор вопроса: BlDm
Ответы
Всего ответов: 27
Номер ответа: 16
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #16
Добавлено: 31.01.08 08:34
А нахрен ему писать программу?)) Кстати а есть ли смысл вообще использовать безопасное извлечение? тем более что все несколько раз когда я пробовал его использовать винда писала, что сейчас извлечь устройство не возможно. Тогда я говорил: "Ага. Уверена?" ну и собссно тупо вытаскивал флеху)
Номер ответа: 17
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #17
Добавлено: 31.01.08 19:26
зачот )
Незнаю как на счет безопасного отключения, но при "опасном" я себе флеху все-таки сломал (после 70-100 извлечений)
Но вот я непойму, зачем в проге может понадобиться функция безопасного отключения флехи...
Номер ответа: 18
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #18
Добавлено: 31.01.08 20:10
Например программа выполняет резервное копирование базы и по завершении нужно "безопасно извлечь флешку"
По сути вопроса, думаю нужно поснифить какие АПИ вызываются при безопасном извлечении.
Номер ответа: 19
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #19
Добавлено: 31.01.08 21:37
О, вопрос а как можно поснифить? без инструкций. Пока только теорию) в общих чертах)
Номер ответа: 20
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #20
Добавлено: 31.01.08 21:40
ахаха) как вам такое решение?))
Shell "RUNDLL32.EXE shell32.dll,Control_RunDLL hotplug.dll"
SendKeys "{DEL}", True
SendKeys "{TAB 2}", True
SendKeys "{DOWN 3}", True
SendKeys "{ENTER}", True
End Sub
В инете нашел. Вот тут:
http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_21193721.html
Номер ответа: 21
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #21
Добавлено: 31.01.08 21:49
Видимо нам нужен: HotPlugEjectDevice
Хотя на той страничке есть код, который работает как кнопка "Извлечь" в контекстном меню. Самый прикол, что значок Безопасное отключение у меня вообще сейчас не появляется!
Номер ответа: 22
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #22
Добавлено: 31.01.08 22:10
ну это боянчик известный
Номер ответа: 23
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #23
Добавлено: 31.01.08 22:30
давайте ещё разрабатывать документацию "API для решения сложнейших вопросов программирования"
Номер ответа: 24
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #24
Добавлено: 31.01.08 22:53
omg, как говорят американские тинейджерки
что бояном является из освещенного в двадцати_одном посте?
Зачем документация? есть гугл и форум
Номер ответа: 25
Автор ответа:
BUMM ®
Вопросов: 8
Ответов: 482
Профиль | | #25
Добавлено: 01.02.08 00:24
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Threading
Public Class DriveController
Private Const LOCK_TIMEOUT As Integer = 10000 ' 10 Seconds
Private Const LOCK_RETRIES As Integer = 20
Private Const GENERIC_READ As Integer = &H80000000
Private Const GENERIC_WRITE As Integer = &H40000000
Private Const OPEN_EXISTING As Integer = 3
Private Const FILE_SHARE_READ As Integer = 1
Private Const FILE_SHARE_WRITE As Integer = 2
Private Const INVALID_HANDLE_VALUE As Integer = -1
Private Const FSCTL_LOCK_VOLUME As Integer = &H90018
Private Const FSCTL_DISMOUNT_VOLUME As Integer = &H90020
Private Const IOCTL_STORAGE_MEDIA_REMOVAL As Integer = &H2D4804
Private Const IOCTL_STORAGE_EJECT_MEDIA As Integer = &H2D4808
Private Const IOCTL_STORAGE_LOAD_MEDIA As Integer = &H2D480C
Private Structure PREVENT_MEDIA_REMOVAL
Dim PreventMediaRemoval As Boolean
End Structure
Private Declare Auto Function DeviceIoControl Lib "kernel32" ( _
ByVal hDevice As IntPtr, _
ByVal dwIoControlCode As Integer, _
ByVal lpInBuffer As IntPtr, _
ByVal nInBufferSize As Integer, _
ByVal lpOutBuffer As IntPtr, _
ByVal nOutBufferSize As Integer, _
ByRef lpBytesReturned As Integer, _
ByVal lpOverlapped As IntPtr _
  As Boolean
Private Declare Unicode Function CreateFile Lib "kernel32" Alias "CreateFileW" ( _
ByVal lpFileName As String, _
ByVal dwDesiredAccess As Integer, _
ByVal dwShareMode As Integer, _
ByVal lpSecurityAttributes As IntPtr, _
ByVal dwCreationDisposition As Integer, _
ByVal dwFlagsAndAttributes As Integer, _
ByVal hTemplateFile As IntPtr _
  As IntPtr
Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As IntPtr _
  As Boolean
Private Function OpenVolume(ByVal drive As DriveInfo) As IntPtr
Dim hVolume As IntPtr
Dim driveLetter As String = CChar(drive.Name) ' this will take only the first character
Dim dwAccessFlags As Integer
Select Case drive.DriveType
Case DriveType.Removable
dwAccessFlags = GENERIC_READ Or GENERIC_WRITE
Case DriveType.CDRom
dwAccessFlags = GENERIC_READ
Case Else
Throw New ArgumentException(String.Format("Cannot eject--'{0}' is not a removable drive.", drive.Name))
End Select
hVolume = CreateFile(String.Format("\\.\{0}:", driveLetter), _
dwAccessFlags, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, _
Nothing, _
OPEN_EXISTING, _
0, _
Nothing)
If hVolume = INVALID_HANDLE_VALUE Then
Throw New IOException("Unable to open volume"
End If
Return hVolume
End Function
Private Function LockVolume(ByVal hVolume As IntPtr) As Boolean
Dim dwBytesReturned As UInteger
Dim dwSleepAmount As UInteger
dwSleepAmount = LOCK_TIMEOUT / LOCK_RETRIES
For nTryCount As Integer = 1 To LOCK_RETRIES
If (DeviceIoControl(hVolume, _
FSCTL_LOCK_VOLUME, _
Nothing, 0, _
Nothing, 0, _
dwBytesReturned, _
Nothing)) Then
Return True
End If
Thread.Sleep(dwSleepAmount)
Next
Return False
End Function
Private Function DismountVolume(ByVal hVolume As IntPtr) As Boolean
Dim dwBytesReturned As UInteger
Return DeviceIoControl(hVolume, _
FSCTL_DISMOUNT_VOLUME, _
Nothing, 0, _
Nothing, 0, _
dwBytesReturned, _
Nothing)
End Function
Private Function PreventRemovalOfVolume(ByVal hVolume As IntPtr, ByVal fPreventRemoval As Boolean) As Boolean
Dim dwBytesReturned As UInteger
Dim PMR As PREVENT_MEDIA_REMOVAL
Dim bufferSize As Integer = Marshal.SizeOf(GetType(PREVENT_MEDIA_REMOVAL))
Dim succeeded As Boolean = False
Dim lpInBuffer As IntPtr = IntPtr.Zero
Try
lpInBuffer = Marshal.AllocCoTaskMem(bufferSize)
PMR.PreventMediaRemoval = fPreventRemoval
Marshal.StructureToPtr(PMR, lpInBuffer, False)
succeeded = DeviceIoControl(hVolume, _
IOCTL_STORAGE_MEDIA_REMOVAL, _
lpInBuffer, bufferSize, _
Nothing, 0, _
dwBytesReturned, _
Nothing)
Finally
If lpInBuffer <> IntPtr.Zero Then
Marshal.FreeCoTaskMem(lpInBuffer)
End If
End Try
Return succeeded
End Function
Private Function EjectMedia(ByVal hVolume As IntPtr) As Boolean
Dim dwBytesReturned As UInteger
Return DeviceIoControl(hVolume, _
IOCTL_STORAGE_EJECT_MEDIA, _
Nothing, 0, _
Nothing, 0, _
dwBytesReturned, _
Nothing)
End Function
Private Function LoadMedia(ByVal hVolume As IntPtr) As Boolean
Dim dwBytesReturned As UInteger
Return DeviceIoControl(hVolume, _
IOCTL_STORAGE_LOAD_MEDIA, _
Nothing, 0, _
Nothing, 0, _
dwBytesReturned, _
Nothing)
End Function
Public Function Eject(ByVal driveName As String) As Boolean
Dim drive As New DriveInfo(driveName)
Dim hVolume As IntPtr
Dim dismountSucceeded As Boolean = False
Dim ejectSucceeded As Boolean = False
' Open the volume.
hVolume = OpenVolume(drive)
' Lock and dismount the volume.
If (LockVolume(hVolume) AndAlso DismountVolume(hVolume)) Then
' Set prevent removal to false and eject the media.
If (PreventRemovalOfVolume(hVolume, False) AndAlso EjectMedia(hVolume)) Then
ejectSucceeded = True
End If
End If
' Close the volume so other processes can use the drive.
If Not CloseHandle(hVolume) Then
ejectSucceeded = False
End If
Return ejectSucceeded
End Function
Public Function Load(ByVal driveName As String) As Boolean
Dim drive As New DriveInfo(driveName)
Dim hVolume As IntPtr
Dim loadSucceeded As Boolean = False
' Open the volume.
hVolume = OpenVolume(drive)
' Load the media.
If LoadMedia(hVolume) Then
loadSucceeded = True
End If
' Close the volume so other processes can use the drive.
If Not CloseHandle(hVolume) Then
loadSucceeded = False
End If
Return loadSucceeded
End Function
End Class
Номер ответа: 26
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #26
Добавлено: 01.02.08 01:41
Я что-то не пойму, а что вообще делает
hDevice = CreateFile("\\.\" & sDrive, _
GENERIC_READ, _
FILE_SHARE_READ Or FILE_SHARE_WRITE, _
ByVal 0&, _
OPEN_EXISTING, _
0&, 0&
Номер ответа: 27
Автор ответа:
BUMM ®
Вопросов: 8
Ответов: 482
Профиль | | #27
Добавлено: 01.02.08 22:06
Имя в формате UNC.
Например:
Диск g:
UNC name: \\.\g:
Диск x:
UNC name: \\.\x:
и т. д