Re: Device Property Page для драйвера
От: Vovkos Россия https://ioninja.com
Дата: 02.07.02 08:48
Оценка: 4 (1)
Здравствуйте Misha-5, Вы писали:

M5>Теперь о неприятностях: каким образом вызывается скомпилированный коинсталлер (и как правильно его описать в .inf файле драйвера) и как он выводит окно (или регистрирует property page) — не понимаю.

M5>И что плохо, нигде не смог найти ни единого примера, даже отдаленно похожего, чтобы хоть за что-то зацепиться..
M5>Если кто сможет, помогите пожалуйста советом.
M5>Misha-5

Существует 2 способа добавить страничку свойств в Device Manager.
  1. В class regkey для твоего класса устройств прописываешь строчку EnumPropPages32 = "myproppageprovider.dll, MyPropPageProvider", эта DLL соответвенно экспортирует функцию MyPropPageProvider (если экспортируемая функция называется "EnumPropPages", то в реестре ее явно после запятой указывать не обязательно). Прототип вот
    BOOL CALLBACK MyPropPageProvider(PSP_PROPSHEETPAGE_REQUEST pInfo, LPFNADDPROPSHEETPAGE pfnAddFunc, LPARAM lParam);

    Примеры этого способа имеются в DDK, посмотри например src/setup/pnpports
    Этот способ хорошо подходит если ты для своих устройств зарегистрировал новый класс. В противном случае смотри способ 2

  2. В свой inf добавляешь регистрацию coinstallera, то есть

    [MyDeviceInstall.nt.CoInstallers]
    AddReg=CoInstaller.AddReg
    
    [CoInstaller.AddReg]
    HKR,,CoInstallers32,0x00010000,"mycoinst.dll, MyCoDeviceInstall"


    Опять же если экспортируемая функция называется CoDeviceInstall, то ее явно после запятой указывать не обязательно.
    А в самом coinstaller'е обрабатываешь DIF_ADDPROPERTYPAGE_ADVANCED примерно так:

    #pragma comment (linker, "/export:MyCoDeviceInstall=_MyCoDeviceInstall@16")
    extern "C" DWORD CALLBACK MyCoDeviceInstall(
        DI_FUNCTION func,
        HDEVINFO hDevInfoSet,
        PSP_DEVINFO_DATA pDevInfoData,
        PCOINSTALLER_CONTEXT_DATA pContext)
    {
        ...
    
        switch(func) 
        {
            ...
    
        case DIF_ADDPROPERTYPAGE_ADVANCED:         
            SP_ADDPROPERTYPAGE_DATA AddPropertyPageData;
            memset(&AddPropertyPageData, 0, sizeof(SP_ADDPROPERTYPAGE_DATA));
            AddPropertyPageData.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
            AddPropertyPageData.ClassInstallHeader.InstallFunction = DIF_ADDPROPERTYPAGE_ADVANCED;
            
            if (!SetupDiGetClassInstallParams(
                hDevInfoSet, pDevInfoData,
                (PSP_CLASSINSTALL_HEADER)&AddPropertyPageData,
                sizeof(SP_ADDPROPERTYPAGE_DATA), NULL) ||
                AddPropertyPageData.NumDynamicPages + N >= MAX_INSTALLWIZARD_DYNAPAGES)
            {
                TRACE("(ERROR) Unable to add proppages - MAX_INSTALLWIZARD_DYNAPAGES reached\n");
                break;
            }
    
            AddPropertyPageData.DynamicPages[AddPropertyPageData.NumDynamicPages++] = CreatePropertySheetPage(...);
            AddPropertyPageData.DynamicPages[AddPropertyPageData.NumDynamicPages++] = CreatePropertySheetPage(...);        
    
            if (!SetupDiSetClassInstallParams(
                hDevInfoSet, pDevInfoData,
                (PSP_CLASSINSTALL_HEADER)&AddPropertyPageData,
                sizeof(SP_ADDPROPERTYPAGE_DATA)))
            {
                TRACE("(ERROR) Unable to add proppages - SetupDiSetClassInstallParams failed\n");
                // destroy created pages
                break;
            }
            break;
    
            ...
    
        }
    
        ...
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.