HIVE注册表恢复出厂设置

发 布 时 间 : 2009-07-27 来 源 : http://chenyq2008.spaces.live.com/blog/ 作 者 : 匿名 浏 览 :

Hive组件具有保存注册表功能。 就是使用了hive, 注册表修改后可以保存。

有时候也碰上想恢复注册表的情形。 我在调试一个没有lcd的设备, 我使用pocket controller工具远程抓屏, 如果想每次都能使用这个工具,就会需要恢复注册表出厂设置。(注册表不是引起这个的原因,但却是个解决办法, 原因具体就不说了)。


如何恢复注册表?帮助里面搜索一下IOCTL_HAL_GET_HIVE_CLEAN_FLAG关键字。Filesys.exe启动时候会使用这个命令询问oem是否删除重建注册表,返回TRUE就是执行删除了。


Eboot可 以传递参数给nk,其实也不会多复杂, 双方明确参数所在区域和参数包含意义就可以传递了。比如我的系统里面,0xA0020800就是参数区域。 我在 eboot里面菜单里面增加一个bool参数bHiveClean的设置命令, 然后将这个参数告诉内核。 Oal在OEMInit()里面也访问这个区 域, 获得参数, 根据参数设置标志位,通知filesys.exe执行删除动作.


 


下面是实现。


eboot增加了下面命令


C) Clean SYS Hive register: TRUE
    c) Clean USER Hive register: TRUE


用来设置bSysHiveClean和bUserHiveClean变量。


 


oal部分:



Ioctl.c


--------


//


//   Function:   OALIoCtlBGetHiveCleanFlag


//


//   This function is Get the Clean Hive Clean Flage


//


BOOL OALIoCtlBGetHiveCleanFlag(


        UINT32 code, VOID *lpInBuf , UINT32 nInBufSize, VOID *lpOutBuf,        UINT32 nOutBufSize , UINT32 *pOutSize)


{


     DWORD *pdwFlags;


     BOOL *pfClean;


BSP_ARGS * pBspArgs = (BSP_ARGS *)IMAGE_SHARE_ARGS_UA_START; 


     BOOL Flage = 0;


     if (!lpInBuf || (nInBufSize != sizeof(DWORD)) || !lpOutBuf || (nOutBufSize != sizeof(BOOL))) {


         NKSetLastError(ERROR_INVALID_PARAMETER);


         return FALSE;


     }


 


     pdwFlags = (DWORD *)lpInBuf;


     pfClean = (BOOL*)lpOutBuf;


 


 


     if (*pdwFlags == HIVECLEANFLAG_SYSTEM) {


         if(pBspArgs->bSysHiveClean)   


             RETAILMSG(1, (TEXT("OEM: cleaning system hive\r\n")));


         else


             RETAILMSG(1, (TEXT("OEM: Not cleaning system hive\r\n")));


 


         *pfClean = (pBspArgs->bSysHiveClean==TRUE);


     }


     else if (*pdwFlags == HIVECLEANFLAG_USERS) {


         if(pBspArgs->bUserHiveClean) 


             RETAILMSG(1, (TEXT("OEM: cleaning user hive\r\n")));


         else


             RETAILMSG(1, (TEXT("OEM: Not cleaning user hive\r\n")));


         *pfClean = (pBspArgs->bUserHiveClean==TRUE);


     }


 


     return TRUE;


}


 


这个宏IMAGE_SHARE_ARGS_UA_START就是指向0xa0020800.eboot也往同一个地址设置即可.


 


Ioctl_tab.h


----------------


增加新的ioctl:


// 清除hive注册表


{IOCTL_HAL_GET_HIVE_CLEAN_FLAG,   0, OALIoCtlBGetHiveCleanFlag     },



上一篇:wince5.0 注册表还原 下一篇:MapPtrToProcess 用法 WINCE驱动分析3