Menentukan Apakah Perangkat Dicolokkan
Ketahuilah bahwa perilaku aplikasi penginstalan perangkat yang dipanggil AutoRun harus bergantung pada apakah pengguna menyambungkan perangkat keras terlebih dahulu atau menyisipkan media distribusi terlebih dahulu. Karena vendor perangkat keras independen (IHV) biasanya menyediakan satu disk distribusi, dan disk hanya dapat memiliki satu aplikasi yang dipanggil AutoRun, aplikasi penginstalan perangkat yang dipanggil AutoRun Anda harus menentukan apakah perangkat Anda dicolokkan.
Untuk menentukan apakah perangkat dicolokkan, aplikasi dapat memanggil fungsi UpdateDriverForPlugAndPlayDevices , meneruskan ID perangkat keras perangkat. Perangkat dicolokkan jika salah satu hal berikut ini benar:
Fungsi mengembalikan TRUE. (Ini juga menginstal driver untuk perangkat.)
Fungsi mengembalikan FALSE dan fungsi Win32 GetLastErrormengembalikan ERROR_NO_MORE_ITEMS. (Tidak ada penginstalan yang terjadi.)
Perangkat tidak dicolokkan jika fungsi mengembalikan FALSE dan GetLastError mengembalikan NO_SUCH_DEVINST. (Tidak ada penginstalan yang terjadi.)
Ketika perangkat yang sebelumnya terpasang sekarang dilepas, devnode perangkat tetap berada dalam sistem, meskipun tidak aktif dan tersembunyi. Sebelum Anda dapat menginstal ulang perangkat seperti itu, Anda harus terlebih dahulu menemukan devnode "phantom" ini, dan menandainya sebagai membutuhkan penginstalan ulang. Kemudian, ketika perangkat dicolokkan kembali, Plug and Play akan menghitung ulang perangkat, menemukan driver baru untuk itu, dan menginstal driver untuk perangkat.
Untuk menginstal ulang perangkat yang dicabut:
Panggil fungsi SetupCopyOEMInf .
Fungsi SetupCopyOEMInf memastikan bahwa file INF yang benar ada di direktori %SystemRoot%\inf .
Temukan perangkat yang dilepas.
Panggil fungsi SetupDiGetClassDevs . Dalam panggilan ke fungsi ini, kosongkan bendera DIGCF_PRESENT di parameter Bendera . Anda harus menemukan semua perangkat, bukan hanya perangkat yang ada. Anda dapat mempersempit hasil pencarian dengan menentukan kelas perangkat tertentu di parameter ClassGuid .
Temukan ID perangkat keras dan ID perangkat yang kompatibel dari perangkat yang dilepas.
SetupDiGetClassDevs mengembalikan handel ke kumpulan informasi perangkat yang berisi semua perangkat yang diinstal, baik dicolokkan atau tidak, di kelas perangkat (dengan asumsi Anda menentukan kelas perangkat pada langkah pertama). Dengan melakukan panggilan berturut-turut ke fungsi SetupDiEnumDeviceInfo , Anda dapat menggunakan handel ini untuk menghitung semua perangkat dalam kumpulan informasi perangkat. Setiap panggilan memberi Anda struktur SP_DEVINFO_DATA untuk perangkat. Untuk mendapatkan daftar ID perangkat keras, panggil fungsi SetupDiGetDeviceRegistryProperty dengan parameter Properti diatur ke SPDRP_HARDWAREID. Untuk mendapatkan daftar ID yang kompatibel, panggil fungsi yang sama, tetapi dengan parameter Properti diatur ke SPDRP_COMPATIBLEIDS. Kedua daftar tersebut adalah string MULTI-SZ.
Cari kecocokan antara ID perangkat Anda dan ID perangkat keras (atau ID yang kompatibel) dari langkah sebelumnya.
Pastikan Anda melakukan perbandingan string penuh antara ID perangkat keras/ID yang kompatibel dan ID untuk perangkat Anda. Perbandingan parsial dapat menyebabkan kecocokan yang salah.
Saat Anda menemukan kecocokan, panggil fungsi CM_Get_DevNode_Status , melewati SP_DRVINFO_DATA. DevInst dalam parameter dnDevInst . Jika fungsi ini mengembalikan CR_NO_SUCH_DEVINST, yang mengonfirmasi bahwa perangkat tidak terpasang (yaitu, memiliki devnode phantom).
Tandai perangkat.
Panggil fungsi SetupDiGetDeviceRegistryProperty dengan parameter Properti diatur ke SPDRP_CONFIGFLAGS. Ketika fungsi ini kembali, parameter PropertyBuffer menunjuk ke nilai ConfigFlags perangkat dari registri . Lakukan bitwise ATAU dari nilai ini dengan CONFIGFLAG_REINSTALL (didefinisikan dalam Regstr.h). Setelah melakukan ini, panggil fungsi SetupDiSetDeviceRegistryProperty , dengan parameter Properti diatur ke SPDRP_CONFIGFLAGS, dan parameter PropertyBuffer diatur ke alamat nilai ConfigFlags yang dimodifikasi perangkat Tindakan ini memodifikasi nilai ConfigFlags registri untuk menggabungkan bendera CONFIGFLAG_REINSTALL. Hal ini menyebabkan perangkat diinstal ulang saat berikutnya perangkat dinilai ulang.
Colokkan perangkat.
Plug and Play akan menghitung ulang perangkat, menemukan driver baru untuk perangkat tersebut, dan menginstal driver tersebut.