|
|
測(cè)試的過程中需要用到自動(dòng)從系統(tǒng)中卸載 USB 設(shè)備,就從網(wǎng)上找來資料,查看 USB 設(shè)備的卸載過程。一般情況下,先查找總線類型,如果是 USB 設(shè)備,則可以考慮卸載。另外,需要檢查這個(gè)設(shè)備是屬于哪一種類型。用GetDriveType來獲取存儲(chǔ)設(shè)備的類型,必須是2(可移動(dòng)設(shè)備)或5(CDROM)類型。因?yàn)檫@兩種設(shè)備都涉及到了是否存在介質(zhì)的問題,如果只是簡(jiǎn)單的采用Dir列舉目錄的方法,可能都會(huì)出錯(cuò)。甚至對(duì)于要列舉的目錄下沒有文件存在時(shí),采用列舉目錄方法來判斷一個(gè)驅(qū)動(dòng)器是否正常,都會(huì)出現(xiàn)誤判。在判斷完驅(qū)動(dòng)器類型后,還可以通過GetVolumeInformation 來獲取文件卷的信息,如磁盤序列號(hào),文件系統(tǒng)類型等內(nèi)容,進(jìn)而通過GetDiskFreeSpaceEx這個(gè)函數(shù),取得磁盤容量的大小及剩余容量的大小。至此,對(duì)于一個(gè)文件卷的基本信息都可以取得了。
下面要做的事情是檢查該文件是否有被系統(tǒng)的其他進(jìn)程占用。這個(gè)操作比較繁雜。首先取得當(dāng)前進(jìn)程的ProcessID,由此查找到系統(tǒng)的進(jìn)程列表,并且采用循環(huán)的方法,從系統(tǒng)的進(jìn)程列表中找出的所有使用該設(shè)備的進(jìn)程。如果沒有其他進(jìn)程使用,則可以關(guān)閉該設(shè)備。否則失敗。
當(dāng)沒有其他進(jìn)程使用時(shí),查找該設(shè)備的連接關(guān)系,即從磁盤接口類中找到該設(shè)備的物理設(shè)備名稱,如...\\Device\Harddisk1\(lp2)VID_0x1023....類似的設(shè)備名稱,通過查找其詳細(xì)接口信息,找到其上層連接關(guān)系(CM_Get_Parent),即屬于哪一個(gè)USB Storage接口,最后通過給該端口發(fā)送CM_Request_Device_Eject請(qǐng)求,完成卸載過程。
需要注意的是,當(dāng)一個(gè)USB 端口安裝有多個(gè)設(shè)備時(shí),其中的一個(gè)設(shè)備卸載,會(huì)導(dǎo)致全部連接到該端口的設(shè)備都卸載掉,而不是單一的指定的設(shè)備。當(dāng)然,如果其中有的設(shè)備在工作中,被系統(tǒng)的其他進(jìn)程占用,都會(huì)導(dǎo)致卸載的失敗。
|
|