2010-08-02 16 views
5

के बीच अंतर करना मैं Win32 API का उपयोग कर एक यूएसबी फ्लैश ड्राइव और यूएसबी हार्ड ड्राइव के बीच अंतर करने की कोशिश कर रहा हूं।यूएसबी फ्लैश ड्राइव और यूएसबी हार्ड ड्राइव के बीच विंडोज

GetDriveType() फ़ंक्शन हटाने योग्य होने पर DRIVE_REMOVABLE लौटाएगा, और यूएसबी फ्लैश ड्राइव निश्चित रूप से हटाने योग्य हैं। लेकिन मैं सोच रहा हूं कि विंडोज शायद यूएसबी हार्ड ड्राइव को हटाने योग्य मानता है (दुर्भाग्यवश मेरे पास इसका परीक्षण करने के लिए यूएसबी हार्ड ड्राइव तक पहुंच नहीं है)।

अग्रिम धन्यवाद।

+0

जिज्ञासा से बाहर, आप ऐसा क्यों करना चाहते हैं? क्या आप किस प्रकार की ड्राइव के आधार पर कुछ अलग करने जा रहे हैं? जैसा कि अन्य ने कहा है, ड्राइवटाइप बहुत संगत नहीं है (हालांकि यह शायद "काफी अच्छा" है)। – Luke

उत्तर

0

वास्तव में विंडोज़ नहीं करता है, GetDriveType मेरे यूएसबी हार्ड ड्राइव दोनों के लिए 3 (DRIVE_FIXED) देता है।

+0

कोई मजाक नहीं, धन्यवाद। और आपके यूएसबी हार्ड ड्राइव रन-ऑफ-द-मिल हैं, और कोई विशेष ड्राइवर सेटिंग्स या ऐसा कुछ भी नहीं है जो Windows को DRIVE_REMOVABLE के बजाय DRIVE_FIXED पर विचार कर सकता है? – user408962

+0

वे सिर्फ मानक पश्चिमी डिजिटल ड्राइव हैं और मेरी विंडोज़ स्थापना बहुत ताजा है इसलिए ड्राइवर सेटिंग पर कुछ भी डिफ़ॉल्ट सेटिंग्स से बदल गया है। – monoceres

0

ड्राइव प्रकार अंततः ड्राइवरों द्वारा निर्धारित किया जाता है; आप जिस दृढ़ संकल्प की तलाश कर रहे हैं उसे बनाने के लिए कोई असफल तरीका सुरक्षित नहीं है।

मैं, फिर भी है कि मैं एक USB फ्लैश छड़ी वापसी DRIVE_FIXED देखा है, जबकि कह सकते हैं,, मैं कभी नहीं एक सामान्य हार्ड ड्राइव वापसी DRIVE_REMOVEABLE देखा है। यह कहना नहीं है कि ऐसा होने के लिए यह पूरी तरह असंभव है, लेकिन मैंने इसे कभी नहीं देखा है।

मैं कहूंगा कि उन दो मूल्यों पर भरोसा करना शायद सबसे निकटतम है जिसे आप प्राप्त करने जा रहे हैं।

+0

दिलचस्प है कि आप कहते हैं कि आपने एक फ्लैश स्टिक रिटर्न DRIVE_FIXED देखा है, क्योंकि मुझे आपकी टिप्पणी पढ़ने से कुछ मिनट पहले मिले: http://social.msdn.microsoft।com/forums/en-US/embeddedwindowscomponents/thread/cfffc7b6-5679-46fc-a1c9-4c08228b7b47/ – user408962

+0

यह अंततः ड्राइवरों द्वारा निर्धारित नहीं किया जाता है, क्योंकि ड्राइवर इसे डिवाइस की रिपोर्ट के आधार पर निर्धारित करते हैं, जो हमेशा सुसंगत नहीं होता है । –

1

विंडोज बाहरी यूएसबी हार्ड ड्राइव के लिए DRIVE_FIXED लौटाता है और आमतौर पर यूएसबी फ्लैश स्टिक के लिए DRIVE_REMOVABLE देता है। इस कारण से यदि आप फ्लैश मेमोरी पर एकाधिक विभाजनों को एक्सेस करना चाहते हैं तो आपको विंडोज़ को बताने के लिए एक फ़िल्टर ड्राइवर स्थापित करना होगा, यह एक DRIVE_REMOVABLE नहीं है बल्कि इसके बजाय एक DRIVE_FIXED है। विंडोज़ केवल फ्लैश स्टिक पर पहला विभाजन देखता है जिससे ईएसएक्सआई बूट यूएसबी स्टिक उपयोगकर्ताओं के लिए बहुत सी परेशानी होती है ;-)

0

http://en.wikipedia.org/wiki/SCSI_Pass_Through_Interface आपको डिवाइस पर कच्चे एससीएसआई आदेश भेजने देगा - आप या तो पूछताछ या मोड भेजना चाहते हैं आप जो खोज रहे हैं उसे ढूंढने के लिए सेंस। हालांकि, एक बेहतर विकल्प वैकल्पिक वीडीएस एपीआई हो सकता है, अगर यह आपको सही जानकारी प्रदान करेगा (मुझे यकीन नहीं है कि यह इस मामले में होगा)

1

यदि आप यह निर्धारित करना चाहते हैं कि कोई डिवाइस यूएसबी डिवाइस है, तो आप कर सकते हैं अपने हैंडल को खोलें और डिवाइस प्रकार से कनेक्ट होने के लिए DeviceIoControl() का उपयोग करके IOCTL क्वेरी भेजें।

EnumUsbDrivesLetters - पोस्ट रूसी में है लेकिन इसमें सी ++ स्रोत कोड है, इसलिए मामला आसानी से समझा जा सकता है।

चीयर्स, एंड्री

+0

कृपया अपने ब्लॉगस्पॉट से जुड़े कई प्रश्नों पर उत्तर कॉपी न करें। इसे स्पैमिंग माना जाएगा। –

1

मैं सोचता कुंजी ड्राइव गुण, जैसे सिलेंडर गिनती है। आप ऐसी जानकारी निर्धारित करने के लिए डब्लूएमआई इंटरफ़ेस का उपयोग कर सकते हैं। यहां एक उदाहरण है http://www.computerperformance.co.uk/vbscript/wmi_disks_physical.htm

1
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// Method  OpenVolume 
// Purpose: Open volume for removal. Change to ::CreateFile(volumeName, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0); 
//    if you just want to inquire if it's removable. 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

HANDLE OpenVolume(const char& driveLetter) 
{ 
    char volumeName[8] = ""; 
    char* volumeFormat = "\\\\.\\%c:"; 
    sprintf(volumeName, volumeFormat, driveLetter); 

    HANDLE volume = ::CreateFile(volumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 
    if (volume == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE; 

    DWORD bytesReturned = 0; 
    STORAGE_HOTPLUG_INFO Info = {0}; 
    if (::DeviceIoControl(volume, IOCTL_STORAGE_GET_HOTPLUG_INFO, 0, 0, &Info, sizeof(Info), &bytesReturned, NULL)) 
    { 
     if (!(Info.MediaRemovable || Info.DeviceHotplug)) 
     { 
      ::CloseHandle(volume); 
      ::SetLastError(ERROR_INVALID_PARAMETER); 
      return INVALID_HANDLE_VALUE; 
     } 
    } 

    return volume; 
} 
संबंधित मुद्दे