Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A "run from Driver Store"-t használó INF azt jelenti, hogy az INF a DIRID 13 használatával adja meg a telepítéskor használt illesztőprogram-csomagfájlok helyét.
Az INF által tartalmazott "run from Driver Store" fájl esetében az INF fájl SourceDisksFiles bejegyzésében szereplő aldirectory meg kell egyeznie az INF fájl DestinationDirs bejegyzésében felsorolt aldirectory-vel.
Emellett a CopyFiles-direktíva nem használható az Illesztőprogram-tárolóból futtatott fájlok átnevezésére. Ezekre a korlátozásokra azért van szükség, hogy az INF telepítése egy eszközön ne eredményezhesse új fájlok létrehozását az Illesztőprogramtár könyvtárban.
Mivel a SourceDisksFiles-bejegyzések nem tartalmazhatnak több, azonos fájlnévvel rendelkező bejegyzést, és a CopyFiles nem használható fájl átnevezésére, minden olyan "Driver Store-ból futtatott" fájlnak, amelynek egyedi fájlnévvel kell rendelkeznie az INF-hivatkozásokhoz.
Az illesztőprogram-csomagok a Windows 10 1709-től kezdődően általánosan támogatják a "Driver Store-ból való futtatás" használatát. Egyes eszközveremek azonban további korlátozásokat is alkalmazhatnak a beépülő modulnak a verembe való csatlakoztatásához szükséges fájlokra. Néhány példa ezekre az eszközveremekre, amelyek nem támogatták az Illesztőprogram-áruházból való futtatásokat a Windows 10 1803-ig:
UMDF-illesztőprogramok bináris fájljai: További információ: Az UMDF-illesztőprogramok betöltési helyének korlátozása
UEFI belső vezérlőprogram frissítése: További információ: Frissítésillesztő-csomag létrehozása
Ha olyan bináris fájlt ad meg, amely egy adott eszközveremhez csatlakozik, tekintse meg a csatlakoztatni kívánt eszközverem dokumentációját, és ellenőrizze, hogy támogatja-e a bináris teljes fájlelérési út megadását, és hogy van-e korlátozás a teljes fájlelérési útvonalra vonatkozóan. Ha támogatja a bináris fájl teljes elérési útjának megadását az elérési út korlátozása nélkül, akkor támogatnia kell a "Driver Store-ból futtatott" fájlt.
Fájlok dinamikus keresése és betöltése az illesztőprogram-tárolóból
Néha szükség van arra, hogy egy összetevő betöltsön egy olyan fájlt, amely egy illesztőprogram-csomag része, amely az "Illesztőprogram-tárolóból való futtatás" parancsot használja. Ezeknek az illesztőprogram-csomagfájloknak az elérési útjai nem lehetnek szigorúan kódolva, mivel eltérhetnek az illesztőprogram-csomag különböző verzióitól, a különböző operációsrendszer-verzióktól, a különböző operációsrendszer-kiadásoktól stb. Amikor ilyen szükség van az illesztőprogram-csomagfájlok betöltésére, ezeket az illesztőprogram-csomagfájlokat dinamikusan kell felderíteni és betölteni az alábbiakban ismertetett paradigmák valamelyikével.
Fájlok keresése és betöltése ugyanabban az illesztőprogram-csomagban
Ha egy illesztőprogram-csomagban lévő fájlnak egy másik fájlt kell betöltenie ugyanabból az illesztőprogram-csomagból, a fájl dinamikus felderítésének egyik lehetséges lehetősége annak a könyvtárnak a meghatározása, amelyből a fájl fut, és a másik fájl betöltése az adott könyvtárhoz képest.
A Windows 10 1803-as és újabb verziójában az illesztőprogram-áruházból futó WDM- vagy KMDF-illesztőprogramnak az illesztőprogram-csomagból más fájlokhoz kell hozzáférnie, az IoGetDriverDirectory és a DriverDirectoryImage könyvtártípust kell meghívnia, hogy lekérje az illesztőprogram által betöltött könyvtár elérési útját. A Windows 10 1803-at megelőző operációsrendszer-verziót támogató illesztőprogramok esetén az IoQueryFullDriverPath használatával keresse meg az illesztőprogram elérési útját, szerezze be a betöltött könyvtár elérési útját, és keresse meg az elérési úthoz kapcsolódó fájlokat. Ha a kernel módú illesztőprogram KMDF-illesztőprogram, a WdfDriverWdmGetDriverObject használatával lekérheti a WDM-illesztő objektumot az IoQueryFullDriverPath-nak való továbbításhoz.
A felhasználói módú bináris fájlok a GetModuleHandleExW és a GetModuleFileNameW használatával megállapíthatják, hogy a bináris fájl honnan lett betöltve. Egy UMDF-illesztőprogram bináris fájlja például az alábbihoz hasonlót hajthat végre:
bRet = GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
(PCWSTR)&DriverEntry,
&handleModule);
if (bRet) {
charsWritten = GetModuleFileNameW(handleModule,
path,
pathLength);
…
Fájlok keresése és betöltése bármely illesztőprogram-csomagban
Bizonyos esetekben egy illesztőprogram-csomag tartalmazhat egy fájlt, amelyet egy másik illesztőprogram-csomagban lévő bináris fájl vagy egy felhasználói módban futó összetevő tölt be. Ez a módszer használható ugyanabból az illesztőprogram-csomagból származó fájlokhoz is, ha ezt előnyben részesítik az ugyanazon illesztőprogram-csomagból származó fájlok betöltéséhez fent leírt módszerrel szemben.
Íme néhány példa azokra a forgatókönyvekre, amelyek a fájlok illesztőprogram-csomagból való betöltését is magukban foglalhatják:
Az illesztőprogram-csomag felhasználói módú DLL-je interfészt biztosít az illesztőprogram-csomagban lévő illesztőprogrammal való kommunikációhoz.
A bővítményillesztő-csomag egy konfigurációs fájlt tartalmaz, amelyet az illesztőprogram tölt be az alapillesztőcsomagba.
Ilyen esetekben az illesztőprogram-csomagnak valamilyen állapotot kell beállítania egy eszköz- vagy eszközfelületen, amely jelzi a várhatóan betöltendő fájl elérési útját.
Az illesztőprogram-csomagok általában egy HKR AddReg használatával állítják be ezt az állapotot. Ebben a példában azt kell feltételezni, hogy az ExampleFile.dllillesztőprogram-csomaghoz tartozik egy SourceDisksFiles bejegyzés , amelynek nincs aldirje. Ez azt eredményezi, hogy a fájl az illesztőprogram-csomag könyvtárának gyökerénél van. Azt is feltételezni kell, hogy a CopyFiles-irányelvDestinationDirs paramétere a 13. diridot határozza meg.
Íme egy INF-példa az eszközállapot beállítására:
[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg
[Example_DDInstall.AddReg]
HKR,,ExampleValue,,%13%\ExampleFile.dll
A következő INF-példa az eszközfelület állapotának beállítására:
[ExampleDDInstall.Interfaces]
AddInterface = {<fill in an interface class GUID for an interface exposed by the device>},,Example_Add_Interface_Section
[Example_Add_Interface_Section]
AddReg = Example_Add_Interface_Section.AddReg
[Example_Add_Interface_Section.AddReg]
HKR,,ExampleValue,,%13%\ExampleFile.dll
Az előző példák üres jelzőértéket használnak, amely egy REG_SZ beállításjegyzék-értéket eredményez. Ez azt eredményezi, hogy a %13% teljesen minősített felhasználói módú fájl elérési úttá alakul. Sok esetben előnyösebb, ha az elérési út egy környezeti változóhoz viszonyítva van. Ha 0x20000 jelzőértéket használ, a beállításjegyzék értéke REG_EXPAND_SZ típusú, és a %13% a megfelelő környezeti változókat tartalmazó elérési úttá konvertálódik, hogy az elérési út helyét absztrahálja. A beállításjegyzék-érték lekérésekor hívja meg az ExpandEnvironmentStrings parancsot az elérési út környezeti változóinak feloldásához.
Ha az értéket kernel módú összetevőnek kell beolvasnia, az értéknek REG_SZ értéknek kell lennie. Amikor a kernel mód összetevő beolvassa ezt az értéket, elő kell függenie \??\ , mielőtt átadja azt az API-knak, például a ZwOpenFile-nak.
Ahhoz, hogy ez a beállítás az eszköz állapotának része legyen, először az alkalmazásnak meg kell találnia az eszköz identitását. A felhasználói mód kódja CM_Get_Device_ID_List_Size és CM_Get_Device_ID_List használatával lekérheti az eszközök listáját, szükség szerint szűrve. Az eszközök listája több eszközt is tartalmazhat, ezért az eszköz állapotának olvasása előtt keressen rá a megfelelő eszközre. Meghívhatja például CM_Get_DevNode_Property , hogy lekérje az eszközön lévő tulajdonságokat, amikor egy adott feltételnek megfelelő eszközt keres.
Miután megtalálta a megfelelő eszközt, használja a CM_Open_DevNode_Key funkciót, hogy lekérje a leírót arra a beállításjegyzék-helyre, ahol az eszköz állapotát tárolták.
A kernel módban futó kódnak le kell kérnie egy PDO-t (fizikai eszközobjektumot) az eszköz számára, és meg kell hívnia az IoOpenDeviceRegistryKey parancsot. A kernel módú kód egyik lehetséges módja az eszköz PDO-jának lekérése az, ha felderít egy az eszköz által közzétett és engedélyezett felületet, majd az IoGetDeviceObjectPointer használatával lekéri az eszköz objektumát.
Ha ezt a beállítást az eszköz felületének állapotakor szeretné elérni, a felhasználói mód kódja meghívhatja CM_Get_Device_Interface_List_Size és CM_Get_Device_Interface_List.
Emellett CM_Register_Notification is használható az eszközillesztők felületének érkezéséről és eltávolításáról történő értesítésre, így a kód értesítést kap, amikor a felület engedélyezve van, majd lekérheti az állapotot. A fenti API-kban használt eszközillesztő osztályban több eszközillesztő is lehet. Vizsgálja meg ezeket az interfészeket, és állapítsa meg, hogy melyik a megfelelő felület az olvasandó beállításhoz.
Miután megtalálta a megfelelő eszközfelületet, hívja CM_Open_Device_Interface_Key.
A kernel módkód képes lekérni annak az eszközfelületnek a szimbolikus hivatkozásnevét, amelyből az állapotot lekérheti. Ehhez hívja meg az IoRegisterPlugPlayNotification parancsot , hogy regisztráljon az eszközillesztő-értesítésekre a megfelelő eszközfelület-osztályban. Másik lehetőségként hívja meg az IoGetDeviceInterfacest , hogy lekérje a rendszer aktuális eszközillesztőinek listáját. A fenti API-kban használt eszközillesztő osztályban több eszközillesztő is lehet. Vizsgálja meg ezeket az interfészeket, és állapítsa meg, hogy melyik a megfelelő felület, amelynek be kell olvasnia a beállítást.
Miután megtalálta a megfelelő szimbolikus hivatkozásnevet, hívja meg az IoOpenDeviceInterfaceRegistryKey parancsot, hogy lekérjen egy leírót arra a beállításjegyzék-helyre, ahol az eszköz felületének állapotát tárolták.
Megjegyzés:
Használja a CM_GETIDLIST_FILTER_PRESENT jelölőt CM_Get_Device_ID_List_Size és CM_Get_Device_ID_List , illetve a CM_GET_DEVICE_INTERFACE_LIST_PRESENT jelölőt CM_Get_Device_Interface_List_Size és CM_Get_Device_Interface_List. Ez biztosítja, hogy a fájl elérési útját tartalmazó állapothoz kapcsolódó hardver jelen legyen, és készen álljon a kommunikációra.
Illesztőprogram-csomag eltávolítása
Alapértelmezés szerint az illesztőprogram-csomag nem távolítható el a rendszerből, ha még telepítve van bármilyen eszközön. Az illesztőprogram-csomag rendszerből való eltávolításának bizonyos lehetőségei azonban lehetővé teszik, hogy a rendszer megpróbálja "kényszerítetten" eltávolítani. Ez akkor is megpróbálja eltávolítani az illesztőprogram-csomagot, ha az illesztőprogram-csomag még telepítve van a rendszeren lévő egyes eszközökön. A kényszerített eltávolítások nem engedélyezettek olyan illesztőprogram-csomagok esetében, amelyekben a "Driver Store-ból futtatott" fájlok találhatók. Ha eltávolít egy illesztőprogram-csomagot a rendszerből, a rendszer eltávolítja az illesztőprogram-tároló tartalmát. Ha vannak olyan eszközök, amelyek továbbra is telepítve vannak az illesztőprogram-csomaggal, az illesztőprogram-csomagban lévő "illesztőprogram-tárolóból történő futtatás" fájlok eltűnnek, és a hiányzó fájlok az eszköz meghibásodását okozhatják. Az eszköz ilyen rossz állapotba helyezésének megakadályozása érdekében az illesztőprogram-tárolóból futtatott fájlokat tartalmazó illesztőprogram-csomagok nem távolíthatók el. Csak akkor távolíthatók el, ha már nincsenek telepítve semmilyen eszközön. Az ilyen illesztőprogram-csomagok eltávolításának támogatásához a DiUninstallDriver vagy a pnputil /delete-driver <oem#.inf> /uninstall használható. Ezek az eltávolítási módszerek először frissítik az eltávolítandó illesztőprogram-csomagot használó eszközöket, hogy ne legyenek többé telepítve az illesztőprogram-csomaggal, mielőtt megpróbálják eltávolítani az illesztőprogram-csomagot.
Illesztőprogram-csomag fejlesztése
Privát bináris fájlok tesztelése
Az illesztőprogram-csomag fejlesztésekor, ha az illesztőprogram-csomagból egy adott végrehajtható fájlt kell lecserélni egy privát verzióra ahelyett, hogy az illesztőprogram-csomagot teljesen újraépítenék és lecserélik a rendszeren, akkor javasoljuk, hogy a .kdfiles paranccsal együtt használjon kernel-hibakeresőt. Mivel az illesztőprogram-tárolóban lévő fájl teljes elérési útját nem szabad hardcode-nal megadni, javasoljuk, hogy a .kdfiles leképezésben az OldDriver-fájlnév csak a fájl közvetlen neve, amely nem tartalmaz korábbi elérésiút-információkat. Ennek (és más forgatókönyveknek) megkönnyítése érdekében az illesztőprogram-csomagokban lévő fájlok nevének a lehető legegyedinek kell lennie, hogy ne egyezzen meg a rendszer nem kapcsolódó illesztőprogram-csomagjából származó fájl nevével.
INF portolása az Illesztőprogram-tárolóból való futtatáshoz
Ha rendelkezik egy olyan INF-fájllal rendelkező meglévő illesztőprogram-csomaggal, amely nem a Driver Store-ból fut, és át akarja vinni a Driver Store-ból történő futtatásra, az alábbi példák bemutatják az INF-fájlok gyakori használatát, valamint mintákat adnak arra, hogyan lehet azokat a fájlokat frissíteni, hogy a Driver Store-ból fussanak.
Rövid útmutató a célkönyvtár-frissítésekhez
Az alábbi táblázat gyors áttekintést nyújt a megfelelő útmutatás megtalálásához az aktuális célkönyvtár DIRID-jének alapján, amelyet egy inf illesztőprogram-csomag határoz meg egy fájlhoz.
| DIRID | Alkönyvtár | Részletek |
|---|---|---|
| 13 | A fájl már használja a "Futtatás az Illesztőprogram-tárolóból" lehetőséget. Nincs szükség további munkára. | |
| 1 | A DIRID 1 nem használható. Nem garantálható, hogy a forráskönyvtár elérhető lesz, ha fel kell oldani a fájlra mutató hivatkozást. Ehelyett, ha az illesztőprogram-csomag összetevői adott fájloktól függnek, vegye fel ezeket a fájlokat az illesztőprogram-csomagba, és futtassa őket az Illesztőprogram-tárolóból. | |
| 10 | Készülékszoftver | A DIRID 13 belső vezérlőprogram-frissítési illesztőprogram-csomaggal való használatáról, hogy azt "a Driver Store-ból való futtatás" céljából alkalmazza, lásd a Frissítő illesztőprogram csomag szerkesztése című fejezetet. |
| 10 | Lásd : Egyéb fájlok. | |
| 11 | Lásd : Egyéb fájlok. | |
| 12 | UMDF | Lásd UMDF-illesztő bináris. |
| 12 | A DIRID 12 célhelyet tartalmazó fájlok többsége az illesztőprogram-szolgáltatás bináris fájljait jelöli. Lásd: Szolgáltatás bináris. | |
| 16422, 16426, 16427, 16428 | Az ilyen DIRID-ket tartalmazó fájlok többsége egy alkalmazás telepítését jelenti. Ehelyett adjon meg egy univerzális Windows-platform (UWP) alkalmazást, és telepítse azt egy AddSoftware-irányelvvel az INF illesztőprogram-csomag DDInstall.Software szakaszából . További részletekért lásd : Illesztőprogram párosítása univerzális Windows-platform (UWP) alkalmazással. |
Szolgáltatás bináris
Ha az INF hozzáad egy szolgáltatást, és a bináris fájl nem a Driver Store-ból fut, akkor az INF a következőképpen nézhet ki:
[DestinationDirs]
; Copy the file to %windir%\system32\drivers
Example_CopyFiles = 12
[ExampleDDInstall]
CopyFiles = Example_CopyFiles
[Example_CopyFiles]
ExampleBinary.sys
[ExampleDDInstall.Services]
AddService = ExampleService,0x2,Example_Service_Inst
[Example_Service_Inst]
DisplayName = %SvcDesc%
ServiceType = %SERVICE_KERNEL_DRIVER%
StartType = %SERVICE_DEMAND_START%
ErrorControl = %SERVICE_ERROR_NORMAL%
; Point at the file in %windir%\system32\drivers
ServiceBinary = %12%\ExampleBinary.sys
A fájl illesztőprogram-tárolóból való futtatásához frissítenie kell a DestinationDirs bejegyzést arra a helyre, ahová a fájlt átmásolja, és frissítenie kell a ServiceBinary-irányelvet, amely a fájl helyére hivatkozik.
[DestinationDirs]
; Update the destination to DIRID 13
Example_CopyFiles = 13
[ExampleDDInstall]
CopyFiles = Example_CopyFiles
[Example_CopyFiles]
ExampleBinary.sys
[ExampleDDInstall.Services]
AddService = ExampleService,0x2,Example_Service_Inst
[Example_Service_Inst]
DisplayName = %SvcDesc%
ServiceType = %SERVICE_KERNEL_DRIVER%
StartType = %SERVICE_DEMAND_START%
ErrorControl = %SERVICE_ERROR_NORMAL%
; Point at the run from Driver Store file using DIRID 13
ServiceBinary = %13%\ExampleBinary.sys
UMDF-illesztőprogram bináris
Ha az INF hozzáad egy UMDF-illesztőprogramot, és a bináris fájl nem az Illesztőprogram-tárolóból fut, akkor az INF a következőképpen nézhet ki:
[DestinationDirs]
; Copy the file to %windir%\system32\drivers\UMDF
Example_CopyFiles = 12, UMDF
[ExampleDDInstall]
CopyFiles = Example_CopyFiles
[Example_CopyFiles]
ExampleUmdfDriver.dll
[ExampleDDInstall.Wdf]
UmdfService = ExampleUmdfDriver,Example_UMDF_Inst
...
[Example_UMDF_Inst]
; Point at the file in %windir%\system32\drivers\UMDF
ServiceBinary = %12%\UMDF\ExampleUmdfDriver.dll
...
A fájl illesztőprogram-tárolóból való futtatásához frissítenie kell a DestinationDirs bejegyzést arra a helyre, ahová a fájlt átmásolja, és frissítenie kell a ServiceBinary-irányelvet, amely a fájl helyére hivatkozik.
[DestinationDirs]
; Update the destination to DIRID 13
Example_CopyFiles = 13
[ExampleDDInstall]
CopyFiles = Example_CopyFiles
[Example_CopyFiles]
ExampleUmdfDriver.dll
[ExampleDDInstall.Wdf]
UmdfService = ExampleUmdfDriver,Example_UMDF_Inst
...
[Example_UMDF_Inst]
; Point at the run from Driver Store file using DIRID 13
ServiceBinary = %13%\ExampleUmdfDriver.dll
...
Egyéb fájlok
Ha az INF egy olyan fájlt ad hozzá, amelyet más összetevők betölthetnek, és amely nem a Driver Store-ból fut, akkor az INF a következőképpen nézhet ki. Ebben a példában a rendszer csak a fájl nevét írja az eszköz beállításjegyzék-állapotára. Azok az összetevők, amelyek elolvassák ezt a beállításjegyzék-értéket, és meghatározzák, hogy milyen fájlt kell betölteni, attól függ, hogy a fájl szerepel-e a fájlban %windir%\system32 , vagy attól függ, hogy a LoadLibrary keresési sorrendje képes-e megtalálni a fájlt.
[DestinationDirs]
; Copy the file to %windir%\system32
Example_CopyFiles = 11
[ExampleDDInstall]
CopyFiles=Example_CopyFiles
AddReg=Example_AddReg
[Example_CopyFiles]
ExampleFile.dll
[Example_AddReg]
HKR,,FileLocation,,"ExampleFile.dll"
A fájl illesztőprogram-tárolóból való futtatásához frissítenie kell a DestinationDirs bejegyzést arra a helyre, ahová a fájl át lesz másolva, és frissítenie kell az eszköz állapotában mentett helyet. Ehhez azokat az összetevőket kell használni, amelyek beolvasják a beállításjegyzék-értéket, hogy a beállításjegyzék-érték a fájl teljes elérési útja legyen a fájlhoz %windir%\system32képest.
[DestinationDirs]
Example_CopyFiles = 13 ; update the destination to DIRID 13
[ExampleDDInstall]
CopyFiles=Example_CopyFiles
AddReg=Example_AddReg
[Example_CopyFiles]
ExampleFile.dll
[Example_AddReg]
; Point at the run from Driver Store file using DIRID 13
HKR,,FileLocation,,"%13%\ExampleFile.dll"