주어진 볼륨이있는 디스크가 이동식인지 (CM_DEVCAP_REMOVABLE) 알고 싶습니다. win32에서 포인터를 찾으십시오.주어진 볼륨 (예 : Z :)에서 해당 볼륨이 "제거 가능"한 장치에 있는지 확인하는 방법은 무엇입니까?
설명 : 실제로 볼륨의 상주하는 디스크가 컴퓨터 외부의 포트 (예 : USB)에 연결되어 있는지 여부를 알아 내려고합니다. GetDriveType는 12 자이기 때문에
주어진 볼륨이있는 디스크가 이동식인지 (CM_DEVCAP_REMOVABLE) 알고 싶습니다. win32에서 포인터를 찾으십시오.주어진 볼륨 (예 : Z :)에서 해당 볼륨이 "제거 가능"한 장치에 있는지 확인하는 방법은 무엇입니까?
설명 : 실제로 볼륨의 상주하는 디스크가 컴퓨터 외부의 포트 (예 : USB)에 연결되어 있는지 여부를 알아 내려고합니다. GetDriveType는 12 자이기 때문에
GetDriveType
스택 오버플로는 GetDriveType을 거부합니다. 그러나 스택 오버플로는 GetDriveType과 함께 스택 오버플로에 대한 불만을 수용합니다.
볼륨을 열고 IOCTL_STORAGE_QUERY_PROPERTY를 실행할 수 있습니다. 이것은 RemovableMedia 속성을 가진 STORAGE_DEVICE_DESCRIPTOR를 반환합니다. CM_DEVCAP_REMOVABLE (100 % 확신 할 수 없음)과 동일하다고 생각합니다. 적어도 "고정"USB 플래시 드라이브를 이동식 드라이브로보고합니다.
HANDLE hFile = CreateFile("\\\\.\\Z:", FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
STORAGE_PROPERTY_QUERY StoragePropertyQuery;
StoragePropertyQuery.PropertyId = StorageDeviceProperty;
StoragePropertyQuery.QueryType = PropertyStandardQuery;
BYTE Buffer[1024];
if(DeviceIoControl(hFile, IOCTL_STORAGE_QUERY_PROPERTY, &SotragePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY), Buffer, 1024, &BytesReturned, NULL))
{
PSTORAGE_DEVICE_DESCRIPTOR StorageDeviceDescriptor = (PSTORAGE_DEVICE_DESCRIPTOR)Buffer;
if(StorageDeviceDescriptor->RemovableMedia)
{
printf("Z: IS removable\n");
}
else
{
printf("Z: is NOT removable\n");
}
}
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
흥미 롭습니다. MSDN은 RemovableMedia는 이동식 미디어가 아닌 이동식 미디어를 의미하므로 GetDriveType처럼 질문자가 필요로하는 것을 제공하지 못합니다. 좋습니다, 그게 내가 너무 많이 읽는 것입니다. –
이 컨텍스트에서는 볼륨이 미디어라고 생각합니다. 볼륨이 상주하는 물리 디스크 또는 드라이브가 장치입니다. 나는 볼륨이 이동식이면 그 장치가 제거 가능해야합니다 같아요. 나는이 모든 것이 어떻게 작동 할 지 모르겠다. 그러나 이것은 나의 관찰이었다. – Luke
플로피 디스크는 플로피 드라이브가 없어도 분리 가능합니다. 이전에는 Jazz와 같은 무언가라는 superfloppies가있었습니다. 크기는 몇 기가 바이트의 이동식 미디어가있는 고정식 드라이브였습니다. 어쩌면이 맥락에서 RemovableMedia는 이동식 장치를 의미하며, 장치가 이동식이면 해당 장치도 이동식이어야합니다. 이를 위해서는 MSDN을 자주 읽어야합니다. –
감사합니다. GetDriveType에 의해 반환 된 DRIVE_REMOVABLE은 (는) 외부 포트에 연결된 장치와 다른 이동식 미디어를 의미합니다. SetupDiGetDeviceRegistryProperty()가 내 드라이브에 대해 CM_DEVCAP_REMOVABLE을 반환하는지 확인하려고합니다. 그러나 드라이브 문자와 SetupDiGetDeviceRegistryProperty()가 예상하는 입력 사이를 연결할 수 없습니다. – user15071
또한 GetDriveType을 사용하지만 일부 USB 스틱/드라이브가 드라이브를 고정 드라이브로보고 할 수 있음을주의하십시오. Freecom HDD USB 전원을 사용하는 하드 드라이브 (IPod와 비슷한 크기)는 고정 드라이브로보고됩니다. (아마 모든 USB 드라이버에 따라 다릅니다). – Patrick
Win32는 드라이버에 따라 다릅니다. 드라이버는 장치 하드웨어 및 장치 펌웨어에 따라 다를 수 있습니다 (일부 장치는 드라이버를 제공하고 나중에 실제 인터페이스 만 제공하기 위해 CD 드라이브로 가장합니다). 드라이버는 BIOS에 의존 할 수 있으며, BIOS는 진실을 말하고 있거나 그렇지 않을 수도 있습니다. 어쨌든, SetupDiGetDeviceRegistryProperty()가 반환 할 것으로 예상 할 필요가 있다면 아마도 SetupDiGetDeviceRegistryProperty()를 호출하여 찾아야 할 것입니다. –