Device Property Page для драйвера
От: Misha-5 Россия m-vorobiev.narod.ru
Дата: 01.07.02 19:10
Оценка:
Я написал драйвер, который работает, и к которому хочу добавить property page (которая видна, когда открываешь свойства какого-нибудь устройства в Device Manager). По умолчанию всегда есть две вкладки: General и Driver. Я хочу добавить ещу одну вкладку и назвать ее Properties. В ней мне бы хотелось иметь диалоговое окно, чтобы настраивать адрес устройства при помощи combo_box'а. Примерный механизм описанный в DDK выглядит так:

1. пишется драйвер
2. независимо пишется CoInstaller , который компилируется как win32 DLL , который и должен в процессе установки драйвера вызваться системой и выполнить "нестандартные" функции — добавить класс диалогового окошка как property page sheet, проинициализировать мои переменные (которые потом будут храниться в registry, а драйвер впоследствии при работе сможет их вызывать) и сделать еще какие-нибудь действия.

Теперь о неприятностях: каким образом вызывается скомпилированный коинсталлер (и как правильно его описать в .inf файле драйвера) и как он выводит окно (или регистрирует property page) — не понимаю.
И что плохо, нигде не смог найти ни единого примера, даже отдаленно похожего, чтобы хоть за что-то зацепиться..
Если кто сможет, помогите пожалуйста советом.
Misha-5
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...
Пока на собственное сообщение не было ответов, его можно удалить.