• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            coinstaller--DDK文檔翻譯zz

            編寫協(xié)同安裝程序
            協(xié)同安裝程序是微軟公司開發(fā)的win32的DLL,它是用來幫助在Windows 2000系統(tǒng)上進(jìn)行設(shè)備安裝。它被Setup API調(diào)用作為類安裝程序的“助手”。例如,供應(yīng)商可以提供協(xié)同安裝程序?qū)⑻囟ㄔO(shè)備信息寫入INF文件無法處理的注冊表中。

            本章內(nèi)容:
            l 4.1 協(xié)同安裝程序總覽
            l 4.2 協(xié)同安裝程序界面
            l 4.3 協(xié)同安裝程序操作
            l 4.4 注冊協(xié)同安裝程序
            1.1 協(xié)同安裝程序總覽
            由Setup API調(diào)用的協(xié)同安裝程序如圖4-1所示。
            圖4-1 協(xié)同安裝程序在設(shè)備安裝中的分工
            帶有陰影的方框表示可由IHV和OEM提供的組件,其他組件則由OS提供。參見第1章“設(shè)備安裝總覽”可以了解更多的有關(guān)安裝組件的信息。
            協(xié)同安裝程序可以是設(shè)備專用或類專用的。Setup API只在安裝協(xié)同安裝程序?yàn)槠渥缘脑O(shè)備時(shí)才調(diào)用一個(gè)設(shè)備專用的協(xié)同安裝程序。操作系統(tǒng)(OS)及供應(yīng)商可以為一個(gè)設(shè)備注冊零個(gè)或多個(gè)設(shè)備專用的協(xié)同安裝程序。在為協(xié)同安裝程序注冊安裝設(shè)備設(shè)置類的任何設(shè)備時(shí),Setup API調(diào)用類協(xié)同安裝程序。操作系統(tǒng)及供應(yīng)商可以為一個(gè)設(shè)備設(shè)置類注冊一個(gè)或多個(gè)類協(xié)同安裝程序。除此之外,類協(xié)同安裝程序還可以為一個(gè)或多個(gè)設(shè)置類注冊。

            GUI模式設(shè)置、新設(shè)備DLL以及定制設(shè)置應(yīng)用程序通過調(diào)用帶有設(shè)備安裝函數(shù)代碼(DIF代碼)的SetupDiCallClassInstaller來安裝設(shè)備。對于每一個(gè)DIF請求,SetupDiCallClassInstaller調(diào)用為設(shè)備設(shè)置類注冊的任何類協(xié)同安裝程序,調(diào)用為特定設(shè)備注冊的任何設(shè)備協(xié)同安裝程序,以及由系統(tǒng)提供用于設(shè)備設(shè)置類的類安裝程序(如果有的話)。

            定制設(shè)置應(yīng)用程序須調(diào)用SetupDiCallClassInstaller而不是直接調(diào)用協(xié)同安裝程序或類安裝程序。這個(gè)函數(shù)可以保證所有注冊的協(xié)同安裝程序都能被正確調(diào)用。

            類協(xié)同安裝程序一般都在設(shè)備安裝之前注冊,而設(shè)備專用的協(xié)同安裝程序則是作為設(shè)備安裝的一部分被注冊的。因此類協(xié)同安裝程序總是在第一次構(gòu)建時(shí)就被添加到協(xié)同安裝程序列表之中,并在設(shè)備安裝時(shí)被所有DIF請求調(diào)用。特定設(shè)備協(xié)同安裝程序則是在為該設(shè)備完成DIF_REGISTER_COINSTALLERS請求之后被添加到重安裝列表之中的(或是在調(diào)用了SetupDiRegisterCoDeviceInstallers之后)。特定設(shè)備協(xié)同安裝程序并不參與以下DIF請求:DIF_ALLOWINSTALL、DIF_INSTALLDEVICEFILES及DIF_SELECTBESTCOMPATDRV。

            如果協(xié)同安裝程序需要響應(yīng)以下任何一個(gè)DIF請求,它就必須是一個(gè)類協(xié)同安裝程序(而不是設(shè)備專用協(xié)同安裝程序):
            l DIF_FIRSTTIMESETUP,DIF_DETECT*
            l DIF_NEWDEVICEWIZARD_PRESELECT
            l DIF_NEWDEVICEWIZARD_SELECT
            l DIF_NEWDEVICEWIZARD_PREANALYZE
            l DIF_NEWDEVICEWIZARD_POSTANALYZE

            設(shè)備協(xié)同安裝程序并不適用于這樣的上下文,這是因?yàn)椴]有標(biāo)識(shí)出某個(gè)特定的設(shè)備,或是因?yàn)樵诎惭b的這個(gè)初始階段還沒有注冊過設(shè)備安裝程序。
            圖4-2顯示了在注冊了任意一個(gè)特定設(shè)備的協(xié)同安裝程序之后,SetupDiCallClassInstaller調(diào)用協(xié)同安裝程序及類安裝程序的順序。

            圖4-2 為DIF請求調(diào)用協(xié)同安裝程序的處理及后處理示例
            在圖4-2所演示的示例中,為該設(shè)備的設(shè)置類注冊了兩個(gè)類協(xié)同安裝程序以及一個(gè)特定設(shè)備協(xié)同安裝程序。以下步驟對應(yīng)于圖4-2中的帶圓圈的數(shù)字標(biāo)號(hào):

            1. SetupDiCallClassInstaller調(diào)用第一個(gè)類協(xié)同安裝程序,同時(shí)指定一個(gè)表示安裝請求正在處理中的DIF代碼(在本例中是DIF_INSTALLDEVICE)。協(xié)同安裝程序在安裝請求中有參與的選擇權(quán)。本例中,第一個(gè)注冊的類協(xié)同安裝程序返回NO_ERROR。
            2. 接下來,SetupDiCallClassInstaller調(diào)用任意額外注冊的類協(xié)同安裝程序。在本例中,第二個(gè)類安裝程序返回了ERROR_DI_POSTPROCESSING_REQUIRED,它要求在后處理之后再調(diào)用協(xié)同安裝程序。
            3. SetupDiCallClassInstaller調(diào)用任意注冊的設(shè)備專用協(xié)同安裝程序。
            4. 在調(diào)用了所有的注冊過的協(xié)同安裝程序后,如果設(shè)備的設(shè)置類有一個(gè)系統(tǒng)提供的類安裝程序,SetupDiCallClassInstaller就調(diào)用它。在本例中,類安裝程序返回ERROR_DI_DO_DEFAULT,這是類安裝程序的一個(gè)典型返回值。
            5. 如果有一個(gè)缺省的設(shè)備處理驅(qū)動(dòng)程序,SetupDiCallClassInstaller就為安裝請求調(diào)用它。DIF_INSTALLDEVICE有一個(gè)缺省的設(shè)備處理驅(qū)動(dòng)程序SetupDiInstallDevice,它是Setup API的一部分。
            6. SetupDiCallClassInstaller調(diào)用任何要求后處理的協(xié)同安裝程序。在本例中,第二個(gè)類協(xié)同安裝程序要求了后處理。
            除了協(xié)同安裝程序在它的單個(gè)入口點(diǎn)被再一次調(diào)用外,協(xié)同安裝程序的后處理與驅(qū)動(dòng)程序的IoCompletion例程相似。當(dāng)SetupDiCallClassInstaller為后處理調(diào)用協(xié)同安裝程序時(shí),它將PostProcessing設(shè)為TRUE,并將InstallResult設(shè)為Context參數(shù)中的恰當(dāng)值。在本例中,Context.InstallResult是NO_ERROR,這是因?yàn)槌晒Φ貓?zhí)行了缺省的設(shè)備處理驅(qū)動(dòng)程序。
            在后處理中,SetupDicallClassInstaller反向調(diào)用了協(xié)同安裝程序。如果圖4-2中的所有協(xié)同安裝程序都已返回了ERROR_DI_POSTPROCESSING_REQUIRED,那么SetupDiCallClassInstaller就會(huì)為后處理先調(diào)用Device_Coinstaller_l,之后再是Class_Coinstaller_2,和Class_Coinstaller_1。類安裝程序并不要求后處理,只有協(xié)同安裝程序才要求。
            即使先前的協(xié)同安裝程序在安裝請求中失敗,要求后處理的協(xié)同安裝程序也會(huì)被調(diào)用。
            1.2 安裝程序界面
            協(xié)同安裝程序具有以下原型:
            typedef
            DWORD
            ( CALLBACK* COINSTALLER_PROC) (
            IN DI_FUNCTION InstallFunction,
            IN HDEVINFO DeviceInfoSet,
            IN PSP_DEVINFO_DADA DeviceInfoData OPTIONAL,
            IN OUT PCOINSTALLER_CONTEXT_DATA Context
            );
            InstallFunction指定了正被處理的設(shè)備安裝請求,在其中協(xié)同安裝程序具有參與的選擇權(quán)。例如,DIF_INSTALLDEVICE。參見《Windows 2000 Driver Development Reference》一書的第一卷第3部分的第5章“安裝功能代碼”有關(guān)“在DIF代碼上的文檔處理”內(nèi)容。
            DeviceInfoSet提供了一個(gè)設(shè)備信息集的標(biāo)識(shí)值。
            DeviceInfoData有選擇性地標(biāo)識(shí)作為設(shè)備安裝請求的目標(biāo)設(shè)備。如果這個(gè)參數(shù)是非NULL的,它就在設(shè)備信息集中標(biāo)識(shí)一個(gè)元素。當(dāng)SetupDiCallClassInstaller調(diào)用一個(gè)特定設(shè)備協(xié)同安裝程序時(shí),DeviceInfoData為非NULL。特定類協(xié)同安裝程序可以同一個(gè)具有NULL DeviceInfoData的DIF請求(如DIF_DETECT或DIF_FIRSTTIMESETUP)一起被調(diào)用。
            Context指向該安裝請求的特定協(xié)同安裝程序上下文結(jié)構(gòu)。這個(gè)上下文信息的格式如下:
            Typedef struct
            _COINSTALLER_CONTEXT_DATA {
            BOOLEAN PostProcessing;
            DWORD InstallResult;
            PVOID PrivateData;
            } COINSTALLER_CONTEXT_DATA, *PCOINSTALLER_CONTEXT_DATA;

            當(dāng)在恰當(dāng)?shù)念惏惭b程序(如有的話)處理了InstallFunction之后再調(diào)用協(xié)同安裝程序時(shí),PostProcessing為TRUE。PostProcessing對協(xié)同安裝程序是只讀的。
            如果PostProcessing為FALSE,則InstallResult不相關(guān)。如果PostProcessing為TRUE,InstallResult就是安裝請求的當(dāng)前狀態(tài)。該值為NO_ERROR或是一個(gè)由為該安裝請求調(diào)用的先前部分返回的錯(cuò)誤狀態(tài)。協(xié)同安裝程序可以為它的函數(shù)返回通過返回該值傳送狀態(tài),或者可以返回其他狀態(tài)。InstallResult對協(xié)同安裝程序是只讀的。
            PrivateData指向一個(gè)被分配的協(xié)同安裝程序緩沖。如果協(xié)同安裝程序設(shè)置該指針并要求后處理,那么當(dāng)SetupDiCallClassInstaller為后處理調(diào)用協(xié)同安裝程序時(shí),將該指針傳給這個(gè)協(xié)同安裝程序。
            設(shè)備協(xié)同安裝程序返回以下一個(gè)值:
            l NO_ERROR
            協(xié)同安裝程序?qū)μ囟ǖ腎nstallFunction執(zhí)行恰當(dāng)?shù)膭?dòng)作,或協(xié)同安裝程序決定它無需為該請求執(zhí)行任何操作。
            l ERROR_DI_POSTPROCESSING_REQUIRED
            協(xié)同安裝程序?qū)μ囟ǖ腎nstallFunction執(zhí)行任何恰當(dāng)?shù)牟僮鳎瑫r(shí)在類安裝已處理了該請求之后并要求被再次調(diào)用。
            l A Win32 error
            協(xié)同安裝程序遇到一個(gè)錯(cuò)誤。
            協(xié)同安裝程序不會(huì)設(shè)置ERROR_DI_DO_DEFAULT的返回狀態(tài)。這個(gè)狀態(tài)只能由類安裝程序使用。如果一個(gè)協(xié)同安裝程序返回了這樣的狀態(tài),那么SetupDiCallClassInstaller將不能正確地處理DIF_Xxx請求。協(xié)同安裝程序也可能在后處理傳送中傳輸ERROR_DE_DO_DEFAULT的一個(gè)返回狀態(tài),但是它永遠(yuǎn)不會(huì)設(shè)置這個(gè)值。
            1.3 協(xié)同安裝程序操作
            協(xié)同安裝程序是用戶模式的Win32 DLL,它為注冊編寫額外的配置信息或執(zhí)行要求動(dòng)態(tài)信息的其他安裝任務(wù),而該動(dòng)態(tài)信息無法通過編寫INF來得到。
            協(xié)同安裝程序可以完成以下一些或所有的任務(wù):
            l 打開InstallFunction來處理僅一個(gè)或少量的DIF_Xxx請求。
            l 根據(jù)它是否被后處理調(diào)用來執(zhí)行不同的操作(也就是Contex->PostProcessing是否為TRUE?)
            l 當(dāng)為后處理調(diào)用時(shí),檢查Context->InstallResult。如果它不是NO_ERROR,就進(jìn)行任何必需的清除并返回InstallResult。
            協(xié)同安裝程序必須不能給最終用戶顯示任何的UI。協(xié)同安裝程序應(yīng)該為設(shè)備提供恰當(dāng)?shù)娜笔≈怠H绻鼪]有缺省值并要求用戶輸入,那么其他的設(shè)備支持組件就應(yīng)提示用戶稍后的所需輸入。例如,若調(diào)制解調(diào)器沒有正確的撥號(hào)屬性設(shè)置,則需在用戶使用調(diào)制解調(diào)器而不是在設(shè)備設(shè)置時(shí)提示他們。
            1.3.1 處理DIF代碼
            每個(gè)DIF代碼的參考頁都繼續(xù)了以下一些或全部的部分:
            何時(shí)發(fā)送
            描述Setup應(yīng)用程序發(fā)送該DIF請求的典型時(shí)間及原因。
            由誰處理
            指出允許哪些安裝程序處理該請求。該安裝程序包括了類安裝程序、類協(xié)同安裝程序(設(shè)置-類范圍的協(xié)同安裝程序),以及設(shè)備協(xié)同安裝程序(特定設(shè)備協(xié)同安裝程序)。
            輸入
            SetupDiCallClassInstaller通過在它的主入口點(diǎn)調(diào)用安裝程序給一個(gè)安裝程序發(fā)送一個(gè)DIF請求。除了DIF代碼之外,這個(gè)功能提供與某請求相關(guān)的額外信息。參見每個(gè)DIF代碼的參考頁可得到與每個(gè)請求一起提供的信息細(xì)節(jié)。以下列表包括了額外輸入的一般描述,還列出了用于處理參數(shù)的SetupDiXxx函數(shù):
            l DeviceInfoSet
            為設(shè)備信息集提供一個(gè)標(biāo)識(shí)值。
            該標(biāo)識(shí)值是不透明的。利用這個(gè)標(biāo)識(shí)值,例如,在調(diào)用中將設(shè)備信息集標(biāo)識(shí)到SetupDiXxx函數(shù)。
            DeviceInfoSet可能具有相聯(lián)的設(shè)備設(shè)置類。如果是這樣的,則調(diào)用SetupDiGetDeviceInfoListClass以得到類GUID。
            l DeviceInfoData
            有選擇性地給一個(gè)SP_DEVINFO_DATA結(jié)構(gòu)提供一個(gè)指針,該結(jié)構(gòu)在設(shè)備信息集中標(biāo)識(shí)了一個(gè)設(shè)備。
            l Device Installation Parameters
            這些非直接的參數(shù)為SP_DEVINSTALL_PARAMS結(jié)構(gòu)中的設(shè)備安裝提供了信息。如果DeviceInfoData是非NULL,就有與DeviceInfoData相關(guān)的設(shè)備安裝參數(shù)。如果DeviceInfoData為NULL,則設(shè)備安裝參數(shù)就與DeviceInfoSet相關(guān)的設(shè)備安裝參數(shù)。
            調(diào)用SetupDiGetDeviceInstallParams以得到設(shè)備安裝參數(shù)。
            l Class Installation Parameters
            將可選的非直接參數(shù)指定給某個(gè)DIF請求。它們尤其是“DIF請求參數(shù)”。例如,一個(gè)DIF_REMOVE安裝請求的類安裝參數(shù)被包含在一個(gè)SP_REMOVEDEVICE_PARAMS結(jié)構(gòu)中。
            每個(gè)SP_XXX_PARAMS結(jié)構(gòu)開始于一個(gè)固定大小的SP_CLASSINSTALL-HEADER。
            調(diào)用SetupDiGetClassInstallParams以得到類安裝參數(shù)。
            如果DIF請求具有類安裝參數(shù),就有與DeviceInfoSet相關(guān)的參數(shù)集,及與DeviceInfoData相關(guān)的另一個(gè)參數(shù)集(如果DIF請求指定了DeviceInfoData)。SetupDiGetClassInstallParams返回了可得到的最特定參數(shù)。
            l 上下文 (Context)
            協(xié)同安裝程序具有一個(gè)可選的上下文參數(shù)。
            l 輸出 (Output)
            描述這個(gè)DIF代碼所需的輸出。
            如果安裝程序修改了設(shè)備安裝參數(shù),那么在返回之前安裝程序必須調(diào)用SetupDiSetDeviceInstallParams來應(yīng)用改變。類似地,如果安裝程序修改DIF代碼的類安裝參數(shù),安裝程序必須調(diào)用SetupDiSetClassInstallParams。
            l 返回值 (Return Value)
            指定DIF代碼的恰當(dāng)返回值。參見圖4-3中有關(guān)返回值的更多信息。
            l 缺省處理程序 (Default Handler)
            指定SetupDi函數(shù),它執(zhí)行DIF代碼的系統(tǒng)定義操作。并非所有的DIF代碼都具有缺省處理程序。除非協(xié)同安裝程序或類安裝程序采取步驟阻礙調(diào)用缺省處理程序,SetupDiCallClassInstaller才會(huì)在它調(diào)用類安裝程序之后再調(diào)用DIF代碼的缺省處理程序(但卻是在它調(diào)用任何為后處理注冊的協(xié)同安裝程序之前)。
            操作 (Operation)
            描述安裝程序可能用來處理DIF請求的典型任務(wù)。
            其他 (See Also)
            相關(guān)信息源的列表。
            圖4-3中是SetupDiCallClassInstaller中處理DIF代碼的事件序列。
            操作系統(tǒng)執(zhí)行每個(gè)DIF代碼的一些操作。由供應(yīng)商提供的協(xié)同安裝程序及類安裝程序可以參與安裝行為。請注意即使DIF代碼失敗了,SetupDiCallClassInstaller也調(diào)用了為后處理注冊的協(xié)同安裝程序。
            1.4 注冊協(xié)同安裝程序
            協(xié)同安裝程序可以為某個(gè)設(shè)置類的單個(gè)或全部設(shè)備注冊。當(dāng)特定設(shè)備中的一個(gè)已被安裝時(shí),這些設(shè)備的協(xié)同安裝程序就通過INF文件動(dòng)態(tài)注冊。類協(xié)同安裝程序被手工注冊或由定制的設(shè)置應(yīng)用程序及一個(gè)INF注冊。
            如要了解更多的信息,可參見《Registering a Device-Specific Coinstaller》及《Registering a Class Coinstaller》。
            如要更新協(xié)同安裝程序,DLL的每個(gè)新版本都需有一個(gè)新的文件名,這是因?yàn)楫?dāng)用戶在設(shè)備屬性頁上點(diǎn)擊Update Driver按紐時(shí),尤其要用到DLL。
            圖4-3 在SetupDiCallClassInstaller中的DIF代碼處理流程圖
            1.4.1 注冊設(shè)備專用的協(xié)同安裝程序
            為了注冊設(shè)備專用的協(xié)同安裝程序,將以下部分添加到設(shè)備的INF文件中:
            ; :
            ; :
            [DestinationDirs]
            XxxCopyFilesSection = 11 \\DIRID_SYSTEM
            \\ Xxx = driver or dev . prefix
            ; :
            ; :
            [XxxInstall . OS-platporm.CoInstallers] \\ OS-platform is optional
            CopyFiles = XxxCopyFilesSection
            AddReg = Xxx.OS-platform. CoInstallers_AddReg
            [XxxCopyFilesSection]
            XxxCoInstall.dll
            {Xxx. OS-platform.CoInstallers_AddReg}
            HKR,,CoInstallers32.0x00010000.”XxxCoInstall.dll. \
            XxxCoInstallEntryPoint”
            DestinationDirs部分中的項(xiàng)說明XxxCopyFiles部分中列出的文件將被復(fù)制到系統(tǒng)目錄下。Xxx前綴標(biāo)識(shí)出驅(qū)動(dòng)程序、設(shè)備或設(shè)備組(如cdrom_CopyFilesSection)。Xxx前綴應(yīng)是唯一的。
            協(xié)同安裝程序安裝節(jié)的名稱可以用可選的操作系統(tǒng)/架構(gòu)擴(kuò)展(如cdrom_install.NTx86.CoInstallers)來修飾。
            Xxx_AddReg部分中的項(xiàng)在設(shè)備驅(qū)動(dòng)程序密鑰中建立一個(gè)CoInstallers32值項(xiàng)。該項(xiàng)包含了協(xié)同安裝程序DLL,而且可選地還可有一個(gè)特定入口點(diǎn)。如果忽略這個(gè)輸入點(diǎn),則缺省為CoDeviceInstall。十六進(jìn)制標(biāo)志參數(shù)(0x00010000)指明這是REG_MULTI_SZ值項(xiàng)。
            為了給設(shè)備注冊多于一個(gè)的特定設(shè)備協(xié)同安裝程序,復(fù)制每個(gè)協(xié)同安裝程序的文件并在注冊項(xiàng)中包含至少一個(gè)信息串。例如,為了注冊兩個(gè)協(xié)同安裝程序,建立如下部分:
            ; :
            ; :
            [DestinationDirs]
            XxxCopyFilesSection = 11 \\DIRID_SYSTEM
            \\ Xxx = driver or dev . prefix
            ; :
            ; :
            [XxxInstall . OS-platporm.CoInstallers] \\ OS-platform is optional
            CopyFiles = XxxCopyFilesSection
            AddReg = Xxx.OS-platform. CoInstallers_AddReg
            [XxxCopyFilesSection]
            XxxCoInstall.dll \\ copy 1st coinst. file
            YyyCoinstall.dll \\ copy 2nd coinst. file
            [Xxx. OS-platform.CoInstallers_AddReg]
            HKR..CoInstallers32.0x00010000. \
            “XxxCoInstall.dll. XxxCoInstallEntryPoint”. \
            “YyyCoInstall.dll. YyyCoInstallEntryPoint”
            \\ add both to registry
            當(dāng)執(zhí)行設(shè)備專用的協(xié)同安裝程序INF部分時(shí),該協(xié)同安裝程序是在安裝一個(gè)設(shè)備的過程中被注冊的。接著Setup API在安裝過程中的每個(gè)隨后步驟上調(diào)用協(xié)同安裝程序。如果為一個(gè)設(shè)備注冊多個(gè)協(xié)同安裝程序,那么Setup API按其在注冊中所列順序調(diào)用它們。
            1.4.2 注冊類協(xié)同安裝程序
            如要為某個(gè)設(shè)置類的每個(gè)設(shè)備都注冊一個(gè)協(xié)同安裝程序,可按以下所列建立一個(gè)注冊表項(xiàng)
            HKLM\System\CurrentControlSet\Control\CoDeviceInstallers subkey:
            {setup-class-GUID}: REG_MULTI_SZ : “XyzCoInstall.dll. XyzCoInstallEntryPoint\0\0”
            該系統(tǒng)建立了CoDeviceInstallers密鑰。Setup-class-GUID為設(shè)備設(shè)置類指定GUID。如果協(xié)同安裝程序提供設(shè)備的多個(gè)類,它就建立每個(gè)設(shè)置類的單個(gè)值項(xiàng)。
            我們不能覆蓋先前寫給setup-class-GUID密鑰的其他協(xié)同安裝程序。讀取這個(gè)密鑰,將自己的協(xié)同安裝程序信息串附加到REG_MULTI_SZ列表中,并將該密鑰寫回到注冊表中。
            如果忽略CoInstallEntryPoint,則缺省為CoDeviceInstall。
            協(xié)同安裝程序DLL必須也被復(fù)制到系統(tǒng)目錄下。
            一旦復(fù)制了文件且做出了注冊表項(xiàng),類協(xié)同安裝程序就可被用來調(diào)用相關(guān)設(shè)備和服務(wù)。
            不用手工建立注冊項(xiàng)來注冊一個(gè)類協(xié)同安裝程序,就可以利用INF文件注冊它,如下所示。
            [version]
            signature = “$Windows NT$”
            [DestinationDirs]
            DefaultDestDir = 11 / / DIRID_SYSTEM
            [DefaultInstall]
            CopyFiles = @classXcoinst.dll
            AddReg = CoInstaller_AddReg
            [CoInstaller_AddReg]
            HKLM.System\CurrentControlSet\Control\CoDeviceInstallers, \
            {setup-class-GUID}, 0x00010008, “classXcoinst.dll,classXCoInstaller’
            ; above line uses the line continuation character (\)
            這個(gè)例子INF將文件classXcoinst.dll復(fù)制到系統(tǒng)目錄下并在CoDeviceInstallers密鑰下建立了一個(gè)setup-class-GUID類的項(xiàng)。Xxx-AddReg部分的項(xiàng)指示兩個(gè)標(biāo)志:”00010000”標(biāo)志表示這個(gè)項(xiàng)是REG_MULTI_SZ,而”00000008”標(biāo)志表示新值將被附加到任何已有的值上(如果新值并未存在于信息串中)。
            這樣一個(gè)注冊表類協(xié)同安裝程序的INF可由右點(diǎn)擊安裝或通過SetupInstallFromInfSection應(yīng)用程序激活。

            貼段偽代碼
            HRESULT
            CoInstaller(
                    IN   DI_FUNCTION           InstallFunction,
                    IN   HDEVINFO             DeviceInfoSet,
                    IN   PSP_DEVINFO_DATA       DeviceInfoData, OPTIONAL
                    IN OUT PCOINSTALLER_CONTEXT_DATA Context
                    )
            {
               
            switch(InstallFunction)
               {
               
            case DIF_SELECTBESTCOMPATDRV:
                   
            if(!Context->PostProcessing)
                   {
                       DbgOut(
            "DIF_SELECTBESTCOMPATDRV");

                       
            return ERROR_DI_POSTPROCESSING_REQUIRED;
                   }
                   
            else //post processing
                   {
                       DbgOut(
            "DIF_SELECTBESTCOMPATDRV PostProcessing");
                       
            //We will do something here
                       SP_DRVINFO_DATA DriverInfoData;

                       SP_DRVINSTALL_PARAMS DriverInstallParams;

                       DriverInfoData.cbSize 
            = sizeof(SP_DRVINFO_DATA);
                       DriverInstallParams.cbSize 
            = sizeof(SP_DRVINSTALL_PARAMS);

                       
            if(SetupDiEnumDriverInfo(DeviceInfoSet,DeviceInfoData,SPDIT_CLASSDRIVER ,0,&DriverInfoData))
                           
            if(SetupDiGetDriverInstallParams(DeviceInfoSet,DeviceInfoData,&DriverInfoData,&DriverInstallParams))
                               
            if(DriverInstallParams.Rank != 0)
                                   DriverInstallParams.Rank 
            = 0;
                       
            if(!SetupDiGetDriverInstallParams(DeviceInfoSet,DeviceInfoData,&DriverInfoData,&DriverInstallParams))
                       {
                           DbgOut(
            "SetupDiGetDriverInstallParams");
                       }

                   }
                   
            break;
               
            case DIF_REMOVE:
                   DbgOut(
            "DIF_REMOVE");
                   
            break;
               
            default:
                   
            break;
               }
               
            return NO_ERROR;
            }

            posted on 2010-02-06 00:05 小默 閱讀(1569) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            久久久久亚洲AV无码麻豆| 亚洲&#228;v永久无码精品天堂久久| 国产精品综合久久第一页| 91精品国产91久久综合| 久久青青草原精品影院| 久久精品国产久精国产思思| 一本色综合网久久| 国内精品久久久久久99蜜桃| 久久精品国产亚洲av麻豆小说| 亚洲精品乱码久久久久久自慰| 久久国产精品99久久久久久老狼| 俺来也俺去啦久久综合网| 国产欧美一区二区久久| 久久狠狠色狠狠色综合| 久久精品国产99久久丝袜| 中文字幕无码久久人妻| 五月丁香综合激情六月久久 | 国产成人精品久久一区二区三区av| 99久久久国产精品免费无卡顿| 国产欧美久久久精品| 无码人妻少妇久久中文字幕| 精品综合久久久久久98| 77777亚洲午夜久久多喷| 精品久久久无码中文字幕| 久久精品国产AV一区二区三区| 国产精品免费看久久久| 久久久久国产| 国产亚洲精品美女久久久| 久久久久人妻一区精品果冻| 99久久夜色精品国产网站| 2021国产成人精品久久| 久久久亚洲裙底偷窥综合| 免费国产99久久久香蕉| 久久久久久久波多野结衣高潮| 人妻少妇久久中文字幕| 久久精品国产72国产精福利| 人妻无码中文久久久久专区 | 久久国产三级无码一区二区 | 久久久久久国产精品无码超碰| 久久精品国产精品亜洲毛片| 99久久婷婷免费国产综合精品|