2012-01-24 3 views
2

나는 DriveLetter x DevicePath/Volume/Device ID /에 대한 거의 모든 링크를 지난 주 이후로 검색하고 있습니다.드라이브 문자 대 DevicePath

좀 sotorage 장치 및 이들의 GUID의 GUID_DEVINTERFACE_USB_DEVICE "A5DCBF10-6530-11D2-901F-00C04FB951ED"로 SetupApi 기능을 사용하여도 HDI/WPD 장치를 나열하는 응용 프로그램, GUID_DEVINTERFACE_VOLUME "53F5630D-B6BF-11D0-94F2-을 개발하고 있어요 00A0C91EFB8B ".

그래서 ... 이미 드라이브 문자로 장치를 매핑 할 수 있습니다. 방법? SetupApi 결과에서 DevicePath를 사용하여 DeviceNumber 및 PartitionNumber를 DeviceIOControl로 가져옵니다. 그리고 그것은 괜찮습니다! 사실 모든 것이 아닙니다. 실제로 CDROM 드라이브에 연결할 수 없습니다.

여기 내 코드가 있습니다. 내가 가진 모든 CD-ROM 드라이브에 대한

int bytesReturned = 0; 
IOCTL.DiskExtents de1 = new IOCTL.DiskExtents(); 
int numDiskExtents = 0; 
IntPtr ptrDe1 = Marshal.AllocHGlobal(Marshal.SizeOf(de1)); 
bool result = IOCTL.DeviceIoControl(FileHandle, IOCTL.IOControlCodes.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, IntPtr.Zero, 0, ptrDe1, Marshal.SizeOf(de1), bytesReturned, null); 
if ((!result)) { 
    Marshal.FreeHGlobal(ptrDe1); 
    //libera a memória alocada. 
    throw new System.ComponentModel.Win32Exception(); //is thrown here 
} else { 
    de1 = Marshal.PtrToStructure(ptrDe1, typeof(IOCTL.DiskExtents)); 
    Marshal.FreeHGlobal(ptrDe1); 
    return de1.first.DiskNumber; 
} 

는 IncorrectFunction가 발생합니다.

FileHandle을 얻으려면 드라이브 문자 (예 : "\. \ D :")와 장치 경로를 모두 사용하십시오. 그리고 둘 다 실패합니다.

내가 뭔가 잘못하고 있는지 모르겠다. USB 대용량 저장 장치 및 하드 디스크에서이 작업을 수행하게된다.

감사합니다.

+0

내가 해냈어! 여기 있습니다. 이제 DiskNumber 및 PartitionNumber 대신 DevicePath에서 VolumeName을 사용하고 있습니다. "\\. \ C :"및 DevicePath에서 VolumeName을 가져옵니다. 그레이트 !!! 살아있는 주간을 보내십시오 !!! – lcssanches

+0

질문에 대한 답변은 괜찮습니다. 현재이 방법이 효과적이기 때문에 메모로만 대답하는 대신 답변을 수정 한 방법을 메모 해 두는 것이 좋습니다. – Yuck

+0

미안하지만 내 질문에 대답 할 수 없습니다. 내 평판이 너무 낮기 때문에. 내가 시도한 첫 번째 것이 었습니다. – lcssanches

답변

1

이제 DiskNumber 및 PartitionNumber 대신 DevicePath에서 VolumeName을 사용하고 있습니다. "\. \ C :"및 DevicePath에서 VolumeName을 가져옵니다.

관련 문제