動作環境WinXP/Win7,VB2008
USBメモリを自動で取り外すコードを作成しています。
WinXPではうまく行きましたが、Win7ではうまく行きません。
解決策をどなたかご教授お願いします。
取り外すUSBはセキュアUSBメモリです。
処理手順は以下の通りです。
1.SetupDiGetClassDevs()を使って、デバイスを列挙。
2.GetDeviceIDを使ってDeviceIDを取得。
※Win7の場合DeviceIDが正しく取得できていないようです。
3.DeviceIDがターゲットUSBメモリのDeviceIDと一致したら
CM_Request_Device_EjectWを投げて、USBメモリを外す。
コードは以下の通り
Dim GUID_DEVINTERFACE_VOLUME As Guid =
New Guid(&H53F5630D, &HB6BF, &H11D0, &H94, &HF2, &H0, &HA0, &HC9, &H1E, &HFB, &H8B)
Dim hDevInfo As Integer = SetupDiGetClassDevs(GUID_DEVINTERFACE_VOLUME, IntPtr.Zero, 0, DIGCF_PRESENT + DIGCF_DEVICEINTERFACE)
If hDevInfo <> INVALID_HANDLE_VALUE Then
Dim MemberIndex As Integer = 0
Dim did As New SP_DEVINFO_DATA
did.cbSize = Marshal.SizeOf(did)
Dim didPtr As IntPtr = Marshal.AllocHGlobal(did.cbSize)
Marshal.StructureToPtr(did, didPtr, True)
While SetupDiEnumDeviceInfo(hDevInfo, MemberIndex, didPtr) <> 0
Marshal.PtrToStructure(didPtr, did)
Dim pDevInst As Integer
Dim BusDeviceID As String = ""
CM_Get_Parent(pDevInst, did.DevInst, 0)
CM_Get_Parent(pDevInst, pDevInst, 0)
BusDeviceID = GetDeviceID(pDevInst)
※このときBusDeviceIDの取得値がWinXPとWin7で
違っている
WinXP:列挙した中にUSBメモリのID
USB\VID_0411&PID_013D\0700078B0CAC1001
が出てくる。
Win7:列挙したIDは全てHTREE\ROOT\0となっている。
If BusDeviceID = "USB\VID_" & VID & "&PID_" & PID & _
"\" & SN Then
If CM_Request_Device_EjectW(pDevInst, IntPtr.Zero, _
IntPtr.Zero, 0, 0) = 0 Then
Res = 0
Exit While
Else
Res = 1
Exit While
End If
End If
・
・
・
掲示板を間違えました。
VB.NET掲示板(.NET専用)
に引っ越します。
ツイート | ![]() |