Здравствуйте.
Проблема такая: нужно в Windows XP в свойствах Network Adapter выключить опцию энергосбережения — как такое можно сделать ?
Вот здесь http://support.microsoft.com/kb/837058 есть ответ на мой вопрос. То есть залезть в реестр и поменять значение, но эффект будет
только после перезагрузки. Как можно решить проблему без перезагрузки ?
Думаю нужно послать какое-то сообщение сетевому адаптеру чтобы тот, перечитал свои настройки (в моём случае изменённые в реестре).
Как такое можно сделать ? может есть другой путь решения проблемы ?
Здравствуйте, perceptron,
P>Проблема такая: нужно в Windows XP в свойствах Network Adapter выключить опцию энергосбережения — как такое можно сделать ? P>Вот здесь http://support.microsoft.com/kb/837058 есть ответ на мой вопрос. То есть залезть в реестр и поменять значение, но эффект будет P>только после перезагрузки. Как можно решить проблему без перезагрузки ?
--
Попробуйте перезапустить соответсвуюший драйвер (остановить и запустить снова).
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Попробуйте перезапустить соответсвуюший драйвер (остановить и запустить снова).
Так остановка драйвера вызовет потерю всех имеющихся в данный момент сетевых соединений. Винда параметры из диспетчера задач как-то корректно обрабатывает без остановок и перезапусков драйверов...
Поправлюсь: не из диспетчера задач — а из диспетчера устройств свойства сетевой карты меняются сразу и без перезагрузок.
То есть вызвав свойства своей сетевой карты через rundll32.exe devmgr.dll /DeviceID PCI\VEN_10EC&DEV_8139&SUBSYS_813910EC&REV_10\4&1674F76A&0&3840
Всё можно установить без перезагрузки и остановки драйвера.
Но как программно добраться до нужного таба Power Management и нужного чекбокса (без явного открытия диспетчера)? (например через cfgmgr32.dll и setupapi.dll?) (Этот таб есть не у всех драйверов NDIS...).
P>Поправлюсь: не из диспетчера задач — а из диспетчера устройств свойства сетевой карты меняются сразу и без перезагрузок. P>То есть вызвав свойства своей сетевой карты через rundll32.exe devmgr.dll /DeviceID PCI\VEN_10EC&DEV_8139&SUBSYS_813910EC&REV_10\4&1674F76A&0&3840
в таких случаях можно предложить ставить специнструментарий или цеплять WinDbg — и смотреть какие IRP приходят устройству при операциях в диалоге.
по поводу идеи с правкой реестра — возможно, обновления состояния сетевого адаптера можно добиться через NetSh\WMI и\или манипуляции с соотв. конфигурациями (открыть\что-то изменить\закрыть).
P>Всё можно установить без перезагрузки и остановки драйвера. P>Но как программно добраться до нужного таба Power Management и нужного чекбокса (без явного открытия диспетчера)? (например через cfgmgr32.dll и setupapi.dll?) (Этот таб есть не у всех драйверов NDIS...).
Во-первых, наличие таба Power Management и чекбокса определяется через WMI (GUID_POWER_DEVICE_ENABLE and GUID_POWER_DEVICE_WAKE_ENABLE). Соответственно, требуется поддержка этого дела (и WMI) в драйверах, которым нужен таб.
Во-вторых, подозреваю, что NDIS устройству нужно так или иначе наладить некий set power request. Каким образом это сделать из UM — отдельный вопрос, см первый абзац и для игр с WMI — WMI cmd line tools.
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Убедился, что значения изменённые в реестре перечитываются без перезагрузки если отключить/включить сетевой адаптер (чего не хотелось бы делать).
+ нашёл в инете такую цитату касательно моей проблемы:
to apply the changes you must restart the corresponding device driver. so you have to use the SetupDi... functions (windows DDK)
Поэкспериментировал с setupapi.dll (SetupDiGetClassDevs, SetupDiEnumDeviceInfo, SetupDiSetClassInstallParams, SetupDiCallClassInstaller) с выключением-включением сетевого адаптера: да программно включается-выключается. Даже если в SP_PROPCHANGE_PARAMS выставить свойство DICS_PROPCHANGE,
то происходит рестарт сетевого соединения со всеми вытекающими последствиями. Т.е. настройки из реестра перечитываются. Сетевой адаптер рестартует свой драйвер. Но мне рестарта как раз и не нужно. Походу прихожу к мысли, что рестарт сетевого драйвера всё-таки неизбежен...
Наткнулся ещё на упоминание INetCfg COM interfaces и конкретно интерфейс INetCfgComponentControl с его методом ApplyRegistryChanges()
Но ещё не пробовал...
P.s. Не хотелось бы использовать WMI и Win32_NetworkAdapterConfiguration class запуская скрипты на VB...
Здравствуйте, perceptron,
P>Поэкспериментировал с setupapi.dll (SetupDiGetClassDevs, SetupDiEnumDeviceInfo, SetupDiSetClassInstallParams, SetupDiCallClassInstaller) с выключением-включением сетевого адаптера: да программно включается-выключается. Даже если в SP_PROPCHANGE_PARAMS выставить свойство DICS_PROPCHANGE, P>то происходит рестарт сетевого соединения со всеми вытекающими последствиями. Т.е. настройки из реестра перечитываются. Сетевой адаптер рестартует свой драйвер. Но мне рестарта как раз и не нужно. Походу прихожу к мысли, что рестарт сетевого драйвера всё-таки неизбежен...
--
Попробуйте определить, как (кем) происходит установка и считывание значение этого флага из registry, используя Process Monitor и выполняя функции SetipApi*.
ГМ>Попробуйте определить, как (кем) происходит установка и считывание значение этого флага из registry, используя Process Monitor и выполняя функции SetipApi*.
Если изменять состояния чекбокса вручную, то видно в ProcessMonitor, что Explorer.exe запускает WMI и тот с помощью services.exe опрашивает драйвер устройства (сетевой карты в моём случае). Далее видно, что при нажатии на "OK" сохраняются данные в ветку реестра HKLM\System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\0008\PnPCapabilities тем же самым процессом Explorer.exe
Больше ProcessMonitor никакой дополнительной инфы не даёт....
Тут надо как писал Valery A. Boronin "цеплять WinDbg — и смотреть какие IRP приходят устройству при операциях в диалоге".
Здравствуйте, perceptron,
ГМ>>Попробуйте определить, как (кем) происходит установка и считывание значение этого флага из registry, используя Process Monitor и выполняя функции SetipApi*.
P>Если изменять состояния чекбокса вручную, то видно в ProcessMonitor, что Explorer.exe запускает WMI и тот с помощью services.exe опрашивает драйвер устройства (сетевой карты в моём случае). Далее видно, что при нажатии на "OK" сохраняются данные в ветку реестра HKLM\System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\0008\PnPCapabilities тем же самым процессом Explorer.exe P>Больше ProcessMonitor никакой дополнительной инфы не даёт....
--
1. Это означает, скорее всего, что перечитываться это значение из регистра будут только во время перестарта драйвера. Вряд ли кто-то посылает IRP для этого.
Попробуете перезапустить драйвер и проконтролируйте, кто и когда считывает это значение из регистра.
2. С помошью WMI в принципе можно не только считывать информацию из драйвера, но и записывать ее туда. Так что советую обратить внимание на сообщение Валеры, тем более, что вполне можно написать приложение на WMI и на С++/С.