Как отключить 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.

Другие вопросы по тегам