在驱动里从注册表里读写参数

摘自ramdisk驱动程序

VOID
RamDiskQueryDebugRegParameters(
    IN PUNICODE_STRING RegistryPath
    )
/*++

Routine Description:

    This routine is called from the DriverEntry to get the debug
    parameters from the registry. If the registry query fails, then
    default values are used.

Arguments:

    RegistryPath    - Points the service path to get the registry parameters

Return Value:

    None

--*/
{

    RTL_QUERY_REGISTRY_TABLE    rtlQueryRegTbl[ 4 + 1 ];  // Need 1 for NULL
    NTSTATUS                    status;
    DEBUG_INFO                  defDebugRegInfo;

    PAGED_CODE();

    DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_VERBOSE, ("QueryDebugRegParameters\n" ) );
    ASSERT( RegistryPath->Buffer != NULL );

    // Set the default values

    defDebugRegInfo.BreakOnEntry      = DEFAULT_BREAK_ON_ENTRY;
    defDebugRegInfo.DebugLevel        = DEFAULT_DEBUG_LEVEL;
    defDebugRegInfo.DebugComp         = DEFAULT_DEBUG_COMP;

    RtlZeroMemory( rtlQueryRegTbl, sizeof(rtlQueryRegTbl) );

    //
    // Setup the query table
    //

    rtlQueryRegTbl[0].Flags         = RTL_QUERY_REGISTRY_SUBKEY;
    rtlQueryRegTbl[0].Name          = L"Parameters";
    rtlQueryRegTbl[0].EntryContext  = NULL;
    rtlQueryRegTbl[0].DefaultType   = (ULONG)NULL;
    rtlQueryRegTbl[0].DefaultData   = NULL;
    rtlQueryRegTbl[0].DefaultLength = (ULONG)NULL;

    //
    // Debug paramters
    //

    rtlQueryRegTbl[1].Flags         = RTL_QUERY_REGISTRY_DIRECT;
    rtlQueryRegTbl[1].Name          = L"BreakOnEntry";
    rtlQueryRegTbl[1].EntryContext  = &BreakOnEntry;
    rtlQueryRegTbl[1].DefaultType   = REG_DWORD;
    rtlQueryRegTbl[1].DefaultData   = &defDebugRegInfo.BreakOnEntry;
    rtlQueryRegTbl[1].DefaultLength = sizeof(ULONG);

    rtlQueryRegTbl[2].Flags         = RTL_QUERY_REGISTRY_DIRECT;
    rtlQueryRegTbl[2].Name          = L"DebugLevel";
    rtlQueryRegTbl[2].EntryContext  = &DbgLevel;
    rtlQueryRegTbl[2].DefaultType   = REG_DWORD;
    rtlQueryRegTbl[2].DefaultData   = &defDebugRegInfo.DebugLevel;
    rtlQueryRegTbl[2].DefaultLength = sizeof(ULONG);

    rtlQueryRegTbl[3].Flags         = RTL_QUERY_REGISTRY_DIRECT;
    rtlQueryRegTbl[3].Name          = L"DebugComp";
    rtlQueryRegTbl[3].EntryContext  = &DbgComp;
    rtlQueryRegTbl[3].DefaultType   = REG_DWORD;
    rtlQueryRegTbl[3].DefaultData   = &defDebugRegInfo.DebugComp;
    rtlQueryRegTbl[3].DefaultLength = sizeof(ULONG);

    status = RtlQueryRegistryValues(
                                    RTL_REGISTRY_ABSOLUTE | RTL_REGISTRY_OPTIONAL,    
                                    RegistryPath->Buffer,
                                    rtlQueryRegTbl,
                                    NULL,
                                    NULL
                                    );

    if ( !NT_SUCCESS( status ) ) {
        DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_WARN, ("RrlQueryRegistryValues returned 0x%x\n", status ) );
        BreakOnEntry = defDebugRegInfo.BreakOnEntry;
        DbgLevel     = defDebugRegInfo.DebugLevel;
        DbgComp      = defDebugRegInfo.DebugComp;
    }
    DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_INFO, ("BreakOnEntry = 0x%lx\n", BreakOnEntry) );
    DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_INFO, ("DebugLevel   = 0x%lx\n", DbgLevel) );
    DBGPRINT( DBG_COMP_INIT, DBG_LEVEL_INFO, ("DebugComp    = 0x%lx\n", DbgComp) );
    return;
}   // End of RamDiskDebugQueryRegParameters()

转载于:https://www.cnblogs.com/fanzi2009/archive/2009/05/06/1450707.html

### 已删除的 Windows 注册表键值存储位置 在 Windows 操作系统中,当通过标准方法(如 `reg delete` 命令或注册表编辑器 GUI)删除某个注册表项时,该数据并不会立即被物理清除。相反,它会被标记为“已删除”,并可能暂时存在于内存中的缓存区域或者磁盘上的未分配空间中[^1]。 #### 临时存储机制 - **NTUSER.DAT 和 SYSTEM hive 文件**:如果某些应用程序依赖于特定用户的配置文件,则这些更改可能会反映到 `%UserProfile%\ntuser.dat` 或者系统的蜂巢文件(hive files),即使它们已被逻辑上移除。 - **页面文件 (Pagefile.sys)**:有时,在执行复杂操作期间,操作系统会将部分注册表内容交换到硬盘驱动器上的虚拟内存页文件;尽管这通常不会保存敏感信息超过必要时间长度[^2]。 #### 数据恢复可能性 对于那些希望找回曾经存在但现在不可见的数据来说,可以考虑以下几种方式来尝试定位残留痕迹: 1. 使用专业的取证工具扫描整个硬盘寻找丢失记录; 2. 利用第三方软件重建历史状态下的注册表结构; 3. 如果之前创建过系统还原点的话,可以从那提取旧版副本[^3]。 需要注意的是,并不存在一个专门用来存放所有曾被删掉条目的集中目录——因为一旦某项真正意义上从数据库层面消失之后,就再也不会重新显现出来除非采取特别措施去挖掘深层细节。 ```powershell # 示例 PowerShell 脚本片段展示如何查询当前加载的 hives Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' | Select-Object -ExpandProperty PendingFileRenameOperations ``` 以上脚本仅作为例子说明访问低级系统参数的方法之一,并不直接关联到检索已消除项目的过程当中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值