找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1017|回复: 28

[讨论] 浅谈国内网友所说的 Drive Snapshot 的"热还原"

  [复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 Bluebells 于 2026-4-4 17:47 编辑

Drive Snapshot 原始文档中根本没有提到所谓的"热还原(Hot Restore)", 即使是其它的众多备份还原软件中都不曾见过, 而"热备份"这个词汇倒是经常会看到
先看看从网上找到的"热备份"的定义: A hot backup, also known as a dynamic backup or an online backup, is the process of backing up data while the system continues to be in operation.
从热备份的定义中, 实在想不到如何实现所谓的"热还原"???
国内网友所指的"热还原"应该是 Drive Snapshot 中的"schedule restore", 计划在下次(系统)重启时还原映像内容
从 Drive Snapshot 官网的页面 http://www.drivesnapshot.de/en/restboot.htm 有相关说明, 也可以在命令行中执行 snapshot --help, 其输出内容也有相关说明
20260403194736.png
从上面的帮助信息中, 我们可以指定相关参数"计划在下次重启时还原", 但不立即执行重启系统操作
我们可以先使用 nirsoft 的 RegFromApp 监控一下 snapshot 执行 schedule restore 时是否有对注册表进行数据更改
20260403195614.png
20260403195914.png
从上面的截图中可以看到 snapshot 在执行 schedule restore 时确实有对注册表数据进行更改, 而且发现一处很有意思的注册表项[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SESSION MANAGER], 及其值"BootExecute"
为什么说这个注册表项的值的很有意思, 如果以前折腾过"0PE"的话, 对该注册表项的值的数据不会感到陌生
打开注册表编辑器, 定位到注册表项[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SESSION MANAGER], 并查看值"BootExecute"的数据
20260403201000.png
又发现一个很有趣的字符串"snapnative.exe", 其实这是一个文件名, 在系统所在分区的 \Windows\System32 目录中可以找到这个文件(这个文件是 Drive Snapshot 执行 schedule restore 时释放到此处的)
将这个文件复制到非系统分区的随便一个位置, 然后使用 Exeinfo PE 查看一下这个文件的信息
PS: 将该文件复制到其它位置是为了避免文件系统重定向问题
20260403201844.png
可以发现该可执行文件是一个 Windows Native 程序(其实所有利用那个注册表项的值 BootExecute 的程序都是这种程序)
再看看另一处改写的注册表项[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Snapshot]的所有内容
20260403202858.png
所谓的"热还原"就谈到这了
测试完后, 可以执行 snapshot --removeschedule 取消 schedule restore
PS: 也有人将 schedule restore 在执行还原时的环境称为 DOS, 如果你了解 DOS 与 UEFI 的兼容问题, 也许就不会这么说了
此外, Drive Snapshot 的 32 位版本是支持在 DOS 环境下运行的
20260403204059.png
上图为 drive snapshot 在 FreeDOS 下直接执行时的输出内容

发表于 4 天前 | 显示全部楼层
这么复杂
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
这个热还原应该指的是Drive Snapshot可以在当前系统的Native模式下直接覆盖系统分区,而不需要进入PE或者其他系统。重启肯定还是需要的。
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
热还原是不是一个伪命题?在联机的情况下,连系统自身的文件都不能随意删除或覆盖,脱机时也还是有些被依赖到。热还热备都是要去到另一个环境才可以操作的吧。如果热备能行的话,应该后续会用备份里的文件修复缺少的关键文件。
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
uefi应该不是DOS。 这个工具非常小,也不太像再生龙哪种,有个简单linux。
所以这个“热还原”到底是在什么环境下运行的
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
看了这个豁然开朗,上次有出现循环还原的问题,只要找到注册表的规则删除就好
回复

使用道具 举报

发表于 3 天前 来自手机 | 显示全部楼层
热还原?咋一听这个概念,我脑里就直接跳出,,,,影子系统?,还原精灵?,沙合?,,,好难猜啊!
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
热备份呢,一直在用,一点儿问题也没有。热还原呢,集成显卡环境下,也是一点儿问题也没有,而独立显卡环境下,热还原,时有成功,时有失败,不知道是怎么回事。
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
学习了。谢谢
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
很久以前用過 snapshot 的熱還原,有成功但也有失敗過。
但這種東西只要還原失敗過一次就不敢用了。
所以現在仍是老老實實的從PE中還原映像檔。

点评

同感,同感。  详情 回复 发表于 3 天前
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
学习了。谢谢
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
学习了。谢谢
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
学习了。谢谢!
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
谢谢老师,受教了。
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
guies 发表于 2026-4-4 08:58
很久以前用過 snapshot 的熱還原,有成功但也有失敗過。
但這種東西只要還原失敗過一次就不敢用了。
所以現 ...

同感,同感。
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
热还原?不是没有办法的情况下,热备份都不敢,不是完全锁定的情况下根本不保险
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
学习了!!!
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
来学习下
回复

使用道具 举报

发表于 3 天前 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
Snapshot本来也没有说是热还原啊, 人家只是巧妙的利用了Windows Native 环境的特性(最高权限,可修改任何系统文件)来还原系统。部分杀毒软件也有利用 Native 环境特性清除顽固病毒的情况。

点评

所以我在开头的第一句话就说了官方文档根本没有提到所谓的“热还原”,这是国内网友自己创建的一个词汇。你很喜欢使用的时光机的“子系统”就是运行在你提到“Windows Native 环境”,AOMEI 则是将这个环境称为“Pre  详情 回复 发表于 3 天前
回复

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
bfgxp 发表于 2026-4-4 16:58
Snapshot本来也没有说是热还原啊, 人家只是巧妙的利用了Windows Native 环境的特性(最高权限,可修改任何 ...

所以我在开头的第一句话就说了官方文档根本没有提到所谓的“热还原”,这是国内网友自己创建的一个词汇。你很喜欢使用的时光机的“子系统”就是运行在你提到“Windows Native 环境”,AOMEI 则是将这个环境称为“PreOS”

点评

你说的是RollbackRx的子系统,这个还真不是Native程序。  详情 回复 发表于 3 天前
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
Bluebells 发表于 2026-4-4 17:10
所以我在开头的第一句话就说了官方文档根本没有提到所谓的“热还原”,这是国内网友自己创建的一个词汇。 ...

你说的是RollbackRx的子系统,这个还真不是Native程序。

点评

记得咱们在09年左右讨论过这个东西,找了一下,果然有: https://bbs.wuyou.net/forum.php?mod=viewthread&tid=183485&highlight=SNAPSHOT  详情 回复 发表于 7 小时前
回复

使用道具 举报

发表于 前天 14:46 | 显示全部楼层
很不错,nice
回复

使用道具 举报

发表于 昨天 20:09 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
bfgxp 發表於 2026-4-4 17:45
你说的是RollbackRx的子系统,这个还真不是Native程序。

记得咱们在09年左右讨论过这个东西,找了一下,果然有:

https://bbs.wuyou.net/forum.php? ... ;highlight=SNAPSHOT
回复

使用道具 举报

发表于 7 小时前 | 显示全部楼层
Native Application 开发详解

https://www.cnblogs.com/BoyXiao/archive/2011/09/21/2183059.html

=====
深入Native应用程序

版权所有 1998 Mark Russinovich



翻译:MJ0011

最后更新:1998年2月8日


导言

如果你对WindowsNt结构有一定的了解,你可能会知道,Win32应用程序所使用的API,并非是"真正"的NT API

。POSIX,OS/2和Win32,这些WindowsNT操作系统环境,使用他们自己的API同他们的客户应用程序进行交流,

但却使用NT "native" API同 WindowsNT进行交流.这些native API大部分都是未公开的(undocumented)。大

约只有25个API(包含250种功能)在WindowsNT设备驱动开发工具包(Device Driver Kit)里有所描述。


尽管绝大多数人都不知道,但"native"应用程序的确存在与WindowsNT上,他们在操作环境上没有任何客户程

序. 这些程序交流着native nt API并且不能使用任何操作环境API比如 Win32. 为什么这样一种程序是必须

的呢?因为在Win32子系统启动之前(大约在登陆对话框出现时)只可以运行native应用程序.最常见的native

应用程序的例子是"autochk"程序,他在初始化兰色登陆屏幕前运行 chkdsk(程序在屏幕上打印一串".")。

当然,Win32应用程序环境服务程序:CSRSS.exe(客户-服务运行时间子系统),也是一个native应用程序

在这篇文章里,我将会讲述如何构造一个native应用程序以及它们是如何工作的,同时我也会提供一个

native应用程序的示例源代码。这个示例很容易安装,它会在启动时的兰色屏幕打印一段你指定的字符串


Autochk是如何被执行的

Autochk在当内存分页被打开,Windows启动和系统开始驱动被载入之间的时间内运行。在这个时间点 启动顺

序会话管理器(smss.exe)进入windowsNT用户模式,并且没有任何程序被启动
注册表中:HKLM/System/CurrentControlSet/Control/Session Manager/BootExecute
一个MULTI_SZ类型的键值
这里存放着将被会话管理器所执行的程序名称和参数
通常Autochk后加*号作为其参数"

Autocheck Autochk *
;名称 程序名 参数

会话管理器在<winnt>/system32目录下查找该值列出的可执行程序.当Autochk运行时,没有任何文件被打开

,所以Autochk可以用raw模式打开任何一个驱动器卷(包括根驱动器),并操作其磁盘数据结构.之后的任何

时间点都无法进行类似这样的操作

编译Native应用程序
微软没有提供相应的文档,但是NT DDK构建器知道如何去生成一个native应用程序,而且它可以被用来编译

autochk程序.和编写设备驱动程序一样,你必须指定SOURCE文件中的信息来定义应用程序。然而和编写驱动

不同的时,你在SOURCE文件中要求生成一个native应用程序需要这样定义:

TARGETTYPE=PROGRAM

构建器使用一个标准的makefile来进行向导:/ddk/inc/makefile.def 在编译native应用程序时会查找名为

nt.lib的运行库。不幸的是,微软并没在DDK上装载这个文件(在windows Server 2003 DDK里包括了这个文

件,但是我怀疑你用这个版本来连接你的native应用程序是无法运行在WindowsXP或win2000上的)
不管怎样,你可以忽略这个错误,方法是加入一行不考虑nt.lib,而指定visual c++的运行库msvcrt.lib到

makefile.lib中

如果你在DDK的"Checked Build"环境下进行编译,将会在%BASEDIR%/lib/%CPU%/Checked(例如

c:/ddk/lib/i386/checked/native.exe)产生一个包含了全部调试信息的native应用程序。如果你在"Free

Build"环境中编译,你会在%BASEDIR%/lib/%CPU%/Free得到一个释出版本的程序.这些和构造设备驱动程序

放置的位置是一样的。

Native应用程序有着".exe"的扩展名,但是你不能象 win32的.exe文件那样去运行它,如果你在WIN32环境

下运行下,将会得到如下提示:

"<应用程序名> 应用程序无法在Win32模式中运行。"

深入学习一个native应用程序

native应用程序的入口点是NtProcessStartup,类似winmain或main.不同于其他的 Win32入口点的是,

native应用程序提供一个数据结构来存放它的唯一的参数来定位命令行参数

大多数的native应用程序的运行环境是由WindowsNt的native API输出库---NTDLL.DLL提供的。native应用

程序必须使用RtlCreateHeap(一个ntdll函数)来创建他们自己的堆来分配存储,使用RtlAllocateHeap来分

配内存以及用RtlFreeHeap来释放内存。native应用程序需要使用NtDisplayString 函数才可以打印想要的

内容到屏幕上(将被输出到初始化时的兰色屏幕上)


Native应用程序不象win32程序那样简单地从他们的启动函数返回,你需要调用NtProcessTerminate函数来

结束它的进程

NTDLL运行包含了数百个函数允许native应用程序执行文件I/O,与设备驱动进行相连,并执行进程间通讯。

不幸的是,他们大部分都是未公开的。

一个native应用程序的例子
我创建一个“玩具”native 应用程序用来演示native应用程序是如何构建的以及他们是如何工作的。运行

install.bat来安装native程序。批处理程序复制native.exe到你的<winnt>/system32目录并在注册表中增

加一个BootExecute的入口点:


native Hello World!


当你重新启动时,会话管理器运行完autochk后就会执行native。native分配一些堆,定位它的命令行参数

并打印参数("Hello world!")到兰色屏幕上,它所使用的函数上面已说过了。如果你想要打印其他的简单内

容,可以编辑BootExecute值使用regedit或regedit32,修改"Hello world"为你想要的信息

运行uinstall.bat可以卸载这个native执行程序。它从<winnt>/system32目录删除native.exe,并修改

BootExecute值为通常的值


如果你想要构建native程序你必须要用Windows设备驱动工具包(DDK),复制makefile.def到 /ddk/inc然后你

可以运行构建

=========================================================
Native.H
//======================================================================
//
// Native.h
//
// Mark Russinovich
// http://www.ntinternals.com
//
// This file includes the definitions required by the Native.exe sample
// NT native program to do what it does.
//
//======================================================================
//
// Environment information, which includes command line and
// image file name
//
typedef struct {
       ULONG            Unknown[21];     
       UNICODE_STRING   CommandLine;
       UNICODE_STRING   ImageFile;
} ENVIRONMENT_INFORMATION, *PENVIRONMENT_INFORMATION;
//
// This structure is passed as NtProcessStartup's parameter
//
typedef struct {
       ULONG                     Unknown[3];
       PENVIRONMENT_INFORMATION  Environment;
} STARTUP_ARGUMENT, *PSTARTUP_ARGUMENT;
//
// Data structure for heap definition. This includes various
// sizing parameters and callback routines, which, if left NULL,
// result in default behavior
//
typedef struct {
ULONG     Length;
ULONG     Unknown[11];
} RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION;
//
// Native NT api function to write something to the boot-time
// blue screen
//
NTSTATUS
NTAPI
NtDisplayString(
  PUNICODE_STRING String
  );
//
// Native applications must kill themselves when done - the job
// of this native API
//
NTSTATUS
NTAPI
NtTerminateProcess(
     HANDLE ProcessHandle,
     LONG ExitStatus
     );
//
// Definition to represent current process
//
#define NtCurrentProcess() ( (HANDLE) -1 )
//
// Heap creation routine
//
HANDLE
NTAPI
RtlCreateHeap(
       ULONG Flags,
       PVOID BaseAddress,
       ULONG SizeToReserve,
       ULONG SizeToCommit,
       PVOID Unknown,
       PRTL_HEAP_DEFINITION Definition
       );
//
// Heap allocation function (ala "malloc")
//
PVOID
NTAPI
RtlAllocateHeap(
  HANDLE Heap,
  ULONG Flags,
  ULONG Size
  );
//
// Heap free function (ala "free")
//
BOOLEAN
NTAPI
RtlFreeHeap(
     HANDLE Heap,
     ULONG Flags,
     PVOID Address
     );
=========================================================================
Native.C
//======================================================================
//
// Native.c
//
// Mark Russinovich
// http://www.ntinternals.com
//
// This is a demonstration of a Native NT program. These programs
// run outside of the Win32 environment and must rely on the raw
// services provided by NTDLL.DLL. AUTOCHK (the program that executes
// a chkdsk activity during the system boot) is an example of a
// native NT application.
//
// This example is a native 'hello world' program. When installed with
// the regedit file associated with it, you will see it print
// "hello world" on the initialization blue screen during the system
// boot. This program cannot be run from inside the Win32 environment.
//
//======================================================================
#include "ntddk.h" // include this for its native functions and defn's
#include "stdio.h"
#include "native.h"
//
// Our heap
//
HANDLE Heap;
//----------------------------------------------------------------------
//
// NtProcessStartup
//
// Instead of a 'main' or 'winmain', NT applications are entered via
// this entry point.  
//
//----------------------------------------------------------------------
void NtProcessStartup( PSTARTUP_ARGUMENT Argument )
{
    PUNICODE_STRING commandLine;
    PWCHAR stringBuffer, argPtr;
    UNICODE_STRING helloWorld;
    RTL_HEAP_DEFINITION  heapParams;
    //
    // Initialize some heap
    //
    memset( &heapParams, 0, sizeof( RTL_HEAP_DEFINITION ));
    heapParams.Length = sizeof( RTL_HEAP_DEFINITION );
    Heap = RtlCreateHeap( 2, 0, 0x100000, 0x1000, 0, &heapParams );
    //
    // Point at command line
    //
    commandLine = &Argument->Environment->CommandLine;
    //
    // Locate the argument
    //
    argPtr = commandLine->Buffer;
    while( *argPtr != L' ' ) argPtr++;
    argPtr++;
    //
    // Print out the argument
    //
    stringBuffer = RtlAllocateHeap( Heap, 0, 256 );
    swprintf( stringBuffer, L"/n%s", argPtr );
    helloWorld.Buffer = stringBuffer;
    helloWorld.Length = wcslen( stringBuffer ) * sizeof(WCHAR);
    helloWorld.MaximumLength = helloWorld.Length + sizeof(WCHAR);
    NtDisplayString( &helloWorld );
    //
    // Free heap
    //
    RtlFreeHeap( Heap, 0, stringBuffer );
    //
    // Terminate
    //
    NtTerminateProcess( NtCurrentProcess(), 0 );
}
===========================================================================
Install.bat
@echo off
copy native.exe %systemroot%/system32/.
regedit /s add.reg
echo Native Example Installed
=============================================================================
uinstall.bat
@echo off
del %systemroot%/system32/native.exe
regedit /s remove.reg
echo Native Example Uninstalled
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-7 17:27

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表