Как отключить Windows для создания автоматической точки восстановления при установке драйвера моего ядра?
Я разработал драйвер ядра NDIS 6.x LWF и обернул его в установщик, используя NSIS 2.46. Я обнаружил, что после установки Windows автоматически создает точку восстановления системы с именем Device Driver Package Install: Nmap Project Network Service
,
Однако на деле оказывается, что эта точка восстановления, созданная Windows, не годится. Я попытался откатиться к этой точке восстановления, и мое программное обеспечение все еще там, включая драйвер .sys
файл и другие изменения в системе (например, создание адаптера, такого как Windows Loopback Adapter
).
Это понятно, потому что мой установщик действительно вносит некоторые изменения перед установкой драйвера, в то время как Windows делает снимок только во время установки драйвера. Так что мои изменения до установки драйвера не включены.
Поэтому я решил создать точку восстановления самостоятельно (используя SysRestore
предоставляется NSIS) перед всеми фактическими шагами установки установщика.
И я хочу отключить Windows, чтобы автоматически создать точку восстановления для моего драйвера. Что лучше сделать это? Спасибо!
3 ответа
Плагин SysRestore вызывает SRSetRestorePoint
с BEGIN_SYSTEM_CHANGE
но в соответствии с MSDN вы можете позвонить с BEGIN_NESTED_SYSTEM_CHANGE
создать только одну точку восстановления. Я не знаю, относится ли это только к одному процессу или к дочернему процессу, который вы можете использовать для установки драйвера, но, возможно, стоит попробовать. Код может выглядеть примерно так:
!define MAX_DESC 64
!define MAX_DESC_W 256
!define STATEMGRSTATUS i,l
!define RESTOREPOINTINFOA i,i,l,&m${MAX_DESC}
!define RESTOREPOINTINFOW i,i,l,&w${MAX_DESC_W}
!if "${NSIS_CHAR_SIZE}" <= 1
!define RESTOREPOINTINFO "${RESTOREPOINTINFOA}"
!else
!define RESTOREPOINTINFO "${RESTOREPOINTINFOW}"
!endif
!define BEGIN_NESTED_SYSTEM_CHANGE 102
!define END_NESTED_SYSTEM_CHANGE 103
!define DEVICE_DRIVER_INSTALL 10
Section
System::Call 'KERNEL32::LoadLibrary(t "$SysDir\SrClient.dll")'
Var /Global SRSTATUS
System::Call '*(${STATEMGRSTATUS})i.s'
Pop $SRSTATUS
System::Call '*(${RESTOREPOINTINFO})(${BEGIN_NESTED_SYSTEM_CHANGE},${DEVICE_DRIVER_INSTALL},0,&t${MAX_DESC} "Installed driver XYZ")i.r0'
System::Call 'SrClient::SRSetRestorePoint(ir0,i$SRSTATUS)i.r1'
IntCmpU $1 0 "" +2 +2
System::Call '*$SRSTATUS(${STATEMGRSTATUS})(0)' ; Make sure nStatus is ERROR_SUCCESS
System::Free $0
DetailPrint "SRSetRestorePoint(BEGIN_NESTED_SYSTEM_CHANGE) returned $1"
; TODO: Install driver here
System::Call '*$SRSTATUS(${STATEMGRSTATUS})(.r0,.r1)' ; Extract nStatus and llSequenceNumber
IntCmpU $0 0 "" norpt norpt ; Did the first call to SRSetRestorePoint succeed?
System::Call '*(${RESTOREPOINTINFO})(${END_NESTED_SYSTEM_CHANGE},${DEVICE_DRIVER_INSTALL},r1)i.r0'
System::Call 'SrClient::SRSetRestorePoint(ir0,i$SRSTATUS)i.r1'
System::Free $0
DetailPrint "SRSetRestorePoint(END_NESTED_SYSTEM_CHANGE) returned $1"
norpt:
System::Free $SRSTATUS
SectionEnd
Есть несколько альтернатив WSR, которые выполняют те же функции (например, Comodo Time Machine, Shadow Defender, RollbackRx и т. Д.). Вам лучше использовать их для создания снимка, так как я уверен, что они не имеют таких ограничений.
Я не знаю, лучший ли это способ, но вы всегда можете остановить службу восстановления системы. На мой взгляд, это деликатный вопрос и, вероятно, большее вмешательство, чем пользователь ожидает от установщика драйвера.
В любом случае вам следует заранее сообщить об этом своим пользователям и (пере) запустить службу по завершении.
Section
# Stop the service
nsExec::Exec 'net.exe STOP "srservice"'
# Install kernel driver
SectionEnd
# Restore original setting
Function startSysRestore
nsExec::Exec 'net.exe START "srservice"'
FunctionEnd
# Things go right
Function .onInstSuccess
Call startSysRestore
FunctionEnd
# Things might go wrong
Function .onUserAbort
Call startSysRestore
FunctionEnd
Function .onInstFailed
Call startSysRestore
FunctionEnd
Изменить: в предыдущей версии этого ответа описано, как отключить службу ServiceRestore.