Я написал драйвер, который работает, и к которому хочу добавить property page (которая видна, когда открываешь свойства какого-нибудь устройства в Device Manager). По умолчанию всегда есть две вкладки: General и Driver. Я хочу добавить ещу одну вкладку и назвать ее Properties. В ней мне бы хотелось иметь диалоговое окно, чтобы настраивать адрес устройства при помощи combo_box'а. Примерный механизм описанный в DDK выглядит так:
1. пишется драйвер
2. независимо пишется CoInstaller , который компилируется как win32 DLL , который и должен в процессе установки драйвера вызваться системой и выполнить "нестандартные" функции — добавить класс диалогового окошка как property page sheet, проинициализировать мои переменные (которые потом будут храниться в registry, а драйвер впоследствии при работе сможет их вызывать) и сделать еще какие-нибудь действия.
Теперь о неприятностях: каким образом вызывается скомпилированный коинсталлер (и как правильно его описать в .inf файле драйвера) и как он выводит окно (или регистрирует property page) — не понимаю.

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