zoukankan      html  css  js  c++  java
  • Wince 中如何实现注册表恢复原厂设置

    理论:

    使用HIVE注册表,系统在完成了第一阶段也就是加载完了boot.hv+binfs之后和加载系统HIVE注册表之前,filesys.exe都会调用OEMIoControl来查询是否需要清除保存在block设备上的hv文件,其CODE代码为IOCTL_HAL_GET_HIVE_CLEAN_FLAG,它的输入参数lpInBuf固定为HIVECLEANFLAG_SYSTEM或HIVECLEANFLAG_USERS,filesys.exe会分别用这两种参数调用两次IOCTL_HAL_GET_HIVE_CLEAN_FLAG,第一次用HIVECLEANFLAG_SYSTEM来问OEM是否需要清除system.hv,第二次用HIVECLEANFLAG_USERS做参数来查询是否要清除user.hv,如果返回的lpOutBuf中的值为TRUE则做清除操作,如果为False则保留block设备上的注册表文件。

    默认WINCE并没有实现这个IOCTL,所以OEM要删除注册表文件就必须先编写这个IOCTL代码。代码的例子可参考标题为“IOCTL_HAL_GET_HIVE_CLEAN_FLAG”的帮助文档。另外 必须在ioctl.h和ioctl.c两个文件中编写该代码。

    要进一步了解这个全局数组,参见标题为“IOCTL Library”的帮助文档。

    可以使用共享内存空间来实现,我们可以在物理内存中保留出一块不会被其他模块占用的空间,在这个空间放置两个BOOL变量分别来保存system和user的hv清除的标志符,缺省它们都为False,OALIoCtlBGetHiveCleanFlag()读到Flase则认为不清注册表,AP在需要的时候将这两个标志符置为True,接下来就是要重新启动到OALIoCtlBGetHiveCleanFlag()函数被调用的地方,由于标志符号是保存在RAM中的,断电会丢失,还好有个方法可以让系统复位而又能保存RAM中的内容,那就是Reset,所以让AP在设置完标志符后马上调用Reset指令就可以完美实现Clean boot了。

    实现:

      1 在ioctl.c文件中找到 const OAL_IOCTL_HANDLER g_oalIoCtlTable[],添加IOCTL和对应的处理函数OALIoCtlBGetHiveCleanFlag 

    { IOCTL_HAL_GET_HIVE_CLEAN_FLAG,  0,  OALIoCtlBGetHiveCleanFlag  },

      2 在ioctl.c文件中实现该函数

    //added by aulyp for 恢复出厂设置

    BOOL OALIoCtlBGetHiveCleanFlag(   // 一般在IOCTL.C中实现

                                                          UINT32 code, VOID *lpInBuf , UINT32 nInBufSize, VOID *lpOutBuf,

                                                          UINT32 nOutBufSize , UINT32 *pOutSize)

    {

    BSP_ARGS *pArgs = (BSP_ARGS*)IMAGE_SHARE_ARGS_UA_START; //保留的共享RAM空间的虚拟地址

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

     {

         SetLastError(ERROR_INVALID_PARAMETER);

         return FALSE;

     }

    else

    {

         DWORD *pdwFlags = (DWORD*)lpInBuf;

         BOOL *pfClean = (BOOL*)lpOutBuf;

        if (*pdwFlags == HIVECLEANFLAG_SYSTEM)

        {

              if(pArgs->bClearSystemHive) //判断是否清除system.hv

                {

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

                            }

                  else

                     {

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

                     }

           *pfClean = pArgs->bClearSystemHive;   

           pArgs->bClearSystemHive=FALSE; //一定在执行完后设置为默认的false否则常规reset都会清空注册表

         }

             

        else if (*pdwFlags == HIVECLEANFLAG_USERS)

                       {

               if(pArgs->bClearUserHive) //判断是否清除user.hv

               {

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

               }

               else

               {

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

               }

                    *pfClean = pArgs->bClearUserHive

                pArgs->bClearUserHive=FALSE; //restore to default

          }

     }

    return TRUE;

    }

      3 Args.h文件中,找到BSP_ARGS结构体定义

      加入如下:

        BOOL bClearSystemHive=FALSE;  //TRUE ? clear system.hv

        BOOL bClearUserHive=FALSE;    //TRUE ? clear user.hv

      4 在Oal_ioctl.h中加入函数声明

    BOOL OALIoCtlBGetHiveCleanFlag(UINT32 code, VOID *lpInBuf , UINT32 nInBufSize,

                                   VOID *lpOutBuf,UINT32 nOutBufSize , UINT32 *pOutSize);

    5在应用中可以如下使用:

       Void On_CleanBoot()

    {

    BSP_ARGS* pArgs = (BSP_ARGS*)IMAGE_SHARE_ARGS_UA_START;

    //保留的共享RAM空间的虚拟地址

    pArgs-> bClearSystemHive =TRUE;         //设置system.hv清空标志符

    pArgs-> bClearUserHive =TRUE;            //设置user.hv清空标志符

    ReSet();

    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ok138ok/archive/2009/07/20/4364998.aspx

    理论:

    使用HIVE注册表,系统在完成了第一阶段也就是加载完了boot.hv+binfs之后和加载系统HIVE注册表之前,filesys.exe都会调用OEMIoControl来查询是否需要清除保存在block设备上的hv文件,其CODE代码为IOCTL_HAL_GET_HIVE_CLEAN_FLAG,它的输入参数lpInBuf固定为HIVECLEANFLAG_SYSTEM或HIVECLEANFLAG_USERS,filesys.exe会分别用这两种参数调用两次IOCTL_HAL_GET_HIVE_CLEAN_FLAG,第一次用HIVECLEANFLAG_SYSTEM来问OEM是否需要清除system.hv,第二次用HIVECLEANFLAG_USERS做参数来查询是否要清除user.hv,如果返回的lpOutBuf中的值为TRUE则做清除操作,如果为False则保留block设备上的注册表文件。

    默认WINCE并没有实现这个IOCTL,所以OEM要删除注册表文件就必须先编写这个IOCTL代码。代码的例子可参考标题为“IOCTL_HAL_GET_HIVE_CLEAN_FLAG”的帮助文档。另外 必须在ioctl.h和ioctl.c两个文件中编写该代码。

    要进一步了解这个全局数组,参见标题为“IOCTL Library”的帮助文档。

    可以使用共享内存空间来实现,我们可以在物理内存中保留出一块不会被其他模块占用的空间,在这个空间放置两个BOOL变量分别来保存system和user的hv清除的标志符,缺省它们都为False,OALIoCtlBGetHiveCleanFlag()读到Flase则认为不清注册表,AP在需要的时候将这两个标志符置为True,接下来就是要重新启动到OALIoCtlBGetHiveCleanFlag()函数被调用的地方,由于标志符号是保存在RAM中的,断电会丢失,还好有个方法可以让系统复位而又能保存RAM中的内容,那就是Reset,所以让AP在设置完标志符后马上调用Reset指令就可以完美实现Clean boot了。

    实现:

      1 在ioctl.c文件中找到 const OAL_IOCTL_HANDLER g_oalIoCtlTable[],添加IOCTL和对应的处理函数OALIoCtlBGetHiveCleanFlag 

    { IOCTL_HAL_GET_HIVE_CLEAN_FLAG,  0,  OALIoCtlBGetHiveCleanFlag  },

      2 在ioctl.c文件中实现该函数

    //added by aulyp for 恢复出厂设置

    BOOL OALIoCtlBGetHiveCleanFlag(   // 一般在IOCTL.C中实现

                                                          UINT32 code, VOID *lpInBuf , UINT32 nInBufSize, VOID *lpOutBuf,

                                                          UINT32 nOutBufSize , UINT32 *pOutSize)

    {

    BSP_ARGS *pArgs = (BSP_ARGS*)IMAGE_SHARE_ARGS_UA_START; //保留的共享RAM空间的虚拟地址

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

     {

         SetLastError(ERROR_INVALID_PARAMETER);

         return FALSE;

     }

    else

    {

         DWORD *pdwFlags = (DWORD*)lpInBuf;

         BOOL *pfClean = (BOOL*)lpOutBuf;

        if (*pdwFlags == HIVECLEANFLAG_SYSTEM)

        {

              if(pArgs->bClearSystemHive) //判断是否清除system.hv

                {

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

                            }

                  else

                     {

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

                     }

           *pfClean = pArgs->bClearSystemHive;   

           pArgs->bClearSystemHive=FALSE; //一定在执行完后设置为默认的false否则常规reset都会清空注册表

         }

             

        else if (*pdwFlags == HIVECLEANFLAG_USERS)

                       {

               if(pArgs->bClearUserHive) //判断是否清除user.hv

               {

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

               }

               else

               {

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

               }

                    *pfClean = pArgs->bClearUserHive

                pArgs->bClearUserHive=FALSE; //restore to default

          }

     }

    return TRUE;

    }

      3 Args.h文件中,找到BSP_ARGS结构体定义

      加入如下:

        BOOL bClearSystemHive=FALSE;  //TRUE ? clear system.hv

        BOOL bClearUserHive=FALSE;    //TRUE ? clear user.hv

      4 在Oal_ioctl.h中加入函数声明

    BOOL OALIoCtlBGetHiveCleanFlag(UINT32 code, VOID *lpInBuf , UINT32 nInBufSize,

                                   VOID *lpOutBuf,UINT32 nOutBufSize , UINT32 *pOutSize);

    5在应用中可以如下使用:

       Void On_CleanBoot()

    {

    BSP_ARGS* pArgs = (BSP_ARGS*)IMAGE_SHARE_ARGS_UA_START;

    //保留的共享RAM空间的虚拟地址

    pArgs-> bClearSystemHive =TRUE;         //设置system.hv清空标志符

    pArgs-> bClearUserHive =TRUE;            //设置user.hv清空标志符

    ReSet();

    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ok138ok/archive/2009/07/20/4364998.aspx

    理论:

    使用HIVE注册表,系统在完成了第一阶段也就是加载完了boot.hv+binfs之后和加载系统HIVE注册表之前,filesys.exe都会调用OEMIoControl来查询是否需要清除保存在block设备上的hv文件,其CODE代码为IOCTL_HAL_GET_HIVE_CLEAN_FLAG,它的输入参数lpInBuf固定为HIVECLEANFLAG_SYSTEM或HIVECLEANFLAG_USERS,filesys.exe会分别用这两种参数调用两次IOCTL_HAL_GET_HIVE_CLEAN_FLAG,第一次用HIVECLEANFLAG_SYSTEM来问OEM是否需要清除system.hv,第二次用HIVECLEANFLAG_USERS做参数来查询是否要清除user.hv,如果返回的lpOutBuf中的值为TRUE则做清除操作,如果为False则保留block设备上的注册表文件。

    默认WINCE并没有实现这个IOCTL,所以OEM要删除注册表文件就必须先编写这个IOCTL代码。代码的例子可参考标题为“IOCTL_HAL_GET_HIVE_CLEAN_FLAG”的帮助文档。另外 必须在ioctl.h和ioctl.c两个文件中编写该代码。

    要进一步了解这个全局数组,参见标题为“IOCTL Library”的帮助文档。

    可以使用共享内存空间来实现,我们可以在物理内存中保留出一块不会被其他模块占用的空间,在这个空间放置两个BOOL变量分别来保存system和user的hv清除的标志符,缺省它们都为False,OALIoCtlBGetHiveCleanFlag()读到Flase则认为不清注册表,AP在需要的时候将这两个标志符置为True,接下来就是要重新启动到OALIoCtlBGetHiveCleanFlag()函数被调用的地方,由于标志符号是保存在RAM中的,断电会丢失,还好有个方法可以让系统复位而又能保存RAM中的内容,那就是Reset,所以让AP在设置完标志符后马上调用Reset指令就可以完美实现Clean boot了。

    实现:

      1 在ioctl.c文件中找到 const OAL_IOCTL_HANDLER g_oalIoCtlTable[],添加IOCTL和对应的处理函数OALIoCtlBGetHiveCleanFlag 

    { IOCTL_HAL_GET_HIVE_CLEAN_FLAG,  0,  OALIoCtlBGetHiveCleanFlag  },

      2 在ioctl.c文件中实现该函数

    //added by aulyp for 恢复出厂设置

    BOOL OALIoCtlBGetHiveCleanFlag(   // 一般在IOCTL.C中实现

                                                          UINT32 code, VOID *lpInBuf , UINT32 nInBufSize, VOID *lpOutBuf,

                                                          UINT32 nOutBufSize , UINT32 *pOutSize)

    {

    BSP_ARGS *pArgs = (BSP_ARGS*)IMAGE_SHARE_ARGS_UA_START; //保留的共享RAM空间的虚拟地址

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

     {

         SetLastError(ERROR_INVALID_PARAMETER);

         return FALSE;

     }

    else

    {

         DWORD *pdwFlags = (DWORD*)lpInBuf;

         BOOL *pfClean = (BOOL*)lpOutBuf;

        if (*pdwFlags == HIVECLEANFLAG_SYSTEM)

        {

              if(pArgs->bClearSystemHive) //判断是否清除system.hv

                {

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

                            }

                  else

                     {

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

                     }

           *pfClean = pArgs->bClearSystemHive;   

           pArgs->bClearSystemHive=FALSE; //一定在执行完后设置为默认的false否则常规reset都会清空注册表

         }

             

        else if (*pdwFlags == HIVECLEANFLAG_USERS)

                       {

               if(pArgs->bClearUserHive) //判断是否清除user.hv

               {

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

               }

               else

               {

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

               }

                    *pfClean = pArgs->bClearUserHive

                pArgs->bClearUserHive=FALSE; //restore to default

          }

     }

    return TRUE;

    }

      3 Args.h文件中,找到BSP_ARGS结构体定义

      加入如下:

        BOOL bClearSystemHive=FALSE;  //TRUE ? clear system.hv

        BOOL bClearUserHive=FALSE;    //TRUE ? clear user.hv

      4 在Oal_ioctl.h中加入函数声明

    BOOL OALIoCtlBGetHiveCleanFlag(UINT32 code, VOID *lpInBuf , UINT32 nInBufSize,

                                   VOID *lpOutBuf,UINT32 nOutBufSize , UINT32 *pOutSize);

    5在应用中可以如下使用:

       Void On_CleanBoot()

    {

    BSP_ARGS* pArgs = (BSP_ARGS*)IMAGE_SHARE_ARGS_UA_START;

    //保留的共享RAM空间的虚拟地址

    pArgs-> bClearSystemHive =TRUE;         //设置system.hv清空标志符

    pArgs-> bClearUserHive =TRUE;            //设置user.hv清空标志符

    ReSet();

    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ok138ok/archive/2009/07/20/4364998.aspx

  • 相关阅读:
    Begin Example with Override Encoded SOAP XML Serialization
    State Machine Terminology
    How to: Specify an Alternate Element Name for an XML Stream
    How to: Publish Metadata for a WCF Service.(What is the Metadata Exchange Endpoint purpose.)
    Beginning Guide With Controlling XML Serialization Using Attributes(XmlSerializaiton of Array)
    Workflow 4.0 Hosting Extensions
    What can we do in the CacheMetaData Method of Activity
    How and Why to use the System.servicemodel.MessageParameterAttribute in WCF
    How to: Begin Sample with Serialization and Deserialization an Object
    A Test WCF Service without anything of config.
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298727.html
Copyright © 2011-2022 走看看