Win7でUSBが外せない

解決


クラ  2012-09-13 21:18:37  No: 103360  IP: [192.*.*.*]

動作環境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
            ・
            ・
            ・

編集 削除
クラ  2012-09-13 22:00:38  No: 103361  IP: [192.*.*.*]

掲示板を間違えました。
VB.NET掲示板(.NET専用)
に引っ越します。

編集 削除