Aracılığıyla paylaş


Cihazın takılı olup olmadığını belirleme

Otomatik Çalıştır tarafından çağrılan cihaz yükleme uygulamasının davranışının, kullanıcının önce donanımı takıp takmadığına veya önce dağıtım ortamını eklemesine bağlı olması gerektiğini unutmayın. Bağımsız donanım satıcıları (IHV' ler) genellikle bir dağıtım diski sağladığından ve diskte yalnızca bir Otomatik Çalıştır çağrılan uygulama olabileceğinden, Otomatik Çalıştır tarafından çağrılan cihaz yükleme uygulamanız cihazınızın takılı olup olmadığını belirlemelidir.

Bir cihazın takılı olup olmadığını belirlemek için uygulama, cihazın donanım kimliğini geçirerek UpdateDriverForPlugAndPlayDevices işlevini çağırabilir. Aşağıdakilerden biri doğruysa cihaz prize takılıdır:

  • İşlev TRUEdöndürür. (Bu, cihazın sürücüsünü de yükler.)

  • İşlev FALSE döndürür ve Win32 GetLastErrorişlevi ERROR_NO_MORE_ITEMS döndürür. (Yükleme gerçekleşmez.)

İşlev FALSE döndürüyorsa ve GetLastError NO_SUCH_DEVINST döndürüyorsa cihaz prize takılı değildir. (Yükleme gerçekleşmez.)

Bağlantısı Kesilmiş Cihazı Yeniden Yükleme

Daha önce takılı olan bir cihazın fişi artık çıkarıldığında, cihazın devnode hem devre dışı hem de gizli olmasına rağmen sistemde kalır. Böyle bir cihazı yeniden yükleyebilmeniz için önce bu "hayalet" devnode'u bulmanız ve yeniden yükleme gerekiyor olarak işaretlemeniz gerekir. Ardından, cihaz yeniden takıldığında Tak ve Kullan cihazı yeniden numaralandırır, yeni sürücüyü bulur ve cihazın sürücüsünü yükler.

Takılı olmayan bir cihazı yeniden yüklemek için:

  1. SetupCopyOEMInf işlevini çağırın.

    SetupCopyOEMInf işlevi, %SystemRoot%\inf dizininde doğru INF dosyasının bulunmasını sağlar.

  2. Takılı olmayan cihazları bulun.

    SetupDiGetClassDevs işlevini çağırın. Bu işlev çağrısında, Bayraklar parametresindeki DIGCF_PRESENT bayrağını temizleyin. Tüm cihazlarını bulmanız gerekir, sadece mevcut olanları değil. ClassGuid parametresinde belirli bir cihaz sınıfını belirterek aramanızın sonuçlarını daraltabilirsiniz.

  3. Takılı olmayan cihazların donanım kimliklerini ve uyumlu kimliklerini bulun.

    SetupDiGetClassDevs, cihaz sınıfında (ilk adımda bir cihaz sınıfı belirttiğiniz varsayılarak) takılı olsun veya olmasın tüm yüklü cihazları içeren cihaz bilgileri kümesine bir tanıtıcı döndürür. SetupDiEnumDeviceInfo işlevine ardışık çağrılar yaparak, cihaz bilgileri kümesindeki tüm cihazları listelemek için bu tanıtıcıyı kullanabilirsiniz. Her çağrı size cihaz için SP_DEVINFO_DATA bir yapı sağlar. Donanım kimliklerinin listesini almak için, SetupDiGetDeviceRegistryProperty işlevini, Özelliği parametresi SPDRP_HARDWAREID olarak ayarlanmış şekilde çağırın. Uyumlu kimliklerin listesini almak için aynı işlevi çağırın, ancak Özelliği parametresi SPDRP_COMPATIBLEIDS olarak ayarlanmıştır. Her iki liste de MULTI-SZ stringleridir.

  4. Cihazınızın kimliği ile önceki adımın donanım kimlikleri (veya uyumlu kimlikler) arasında bir eşleşme bulun.

    Donanım kimliği/uyumlu kimlik ile cihazınızın kimliği arasında tam dize karşılaştırmaları yaptığınızdan emin olun. Kısmi karşılaştırma yanlış eşleşmelere yol açabilir.

    Eşleşme bulduğunuzda, SP_DRVINFO_DATA'yı geçirerek CM_Get_DevNode_Status işlevini çağırın. dnDevInst parametresindeki DevInst. Bu işlev CR_NO_SUCH_DEVINST döndürürse, bu, cihazın bağlı olmadığını doğrular (yani, hayalet bir devnode'a sahip olduğu).

  5. Cihazı işaretleyin.

    SetupDiGetDeviceRegistryProperty işlevini, Özelliği parametresi SPDRP_CONFIGFLAGS olarak ayarlanmış olarak çağırın. Bu işlev döndürdüğünde, PropertyBuffer parametresi cihazın kayıt defterinden ConfigFlags değerini gösterir. Bu değere CONFIGFLAG_REINSTALL (Regstr.h) ile bit düzeyinde OR işlemi yapın. Bunu yaptıktan sonra, Özelliği parametresi SPDRP_CONFIGFLAGS olarak ayarlanmış ve PropertyBuffer parametresi cihazın değiştirilmiş ConfigFlags değerine ayarlanmış SetupDiSetDeviceRegistryProperty işlevini çağırın. Bu eylem, kayıt defterinin ConfigFlags değerini CONFIGFLAG_REINSTALL bayrağını içerecek şekilde değiştirir. Bu, cihazın bir sonraki yeniden numaralandırıldığında yeniden yüklenmesine neden olur.

  6. Cihazı takın.

    Tak ve Kullan, cihazı yeniden numaralandırır, yeni sürücüyü bulur ve bu sürücüyü yükler.