对于Windows操作系统,注册表中保存了很多系统配置,例如常见的IE主页保存在HKEY_LOCAL_MACHINE\Software\Mircosoft\InternetExplorer\下主要在起始页;再如,在注册表中HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer下的NoDriveTypeAutoRun中设置了禁止磁盘驱动器自动运行的AutoRun功能;很多系统比如图片劫持、文件关联配置都可以直接在注册表中配置。有很多常用的安全工具需要操作注册表。下面介绍通过注册表获取Windows系统启动时的启动项。在注册表中的启动项中,除了正常的系统工具和软件工具外,病毒、木马也会利用注册表中的启动项,随着Windows的启动悄悄启动自己,从而实现自启动的功能。接下来,我们将通过编写枚举注册表启动项的工具,进一步研究在注册表操作中使用API??函数的相关过程。一、程序界面及相关代码注册表中有很多地方可以用来完成开机。这里我们只介绍注册表中可以用来完成开机的众多地方之一。这里的程序是对话框的形式,其界面如图1所示。图1注册表启动项管理界面该界面使用了CListCtrl控件,用户可以添加并进行相应的设置。下面是一段关于CListCtrl初始化的代码,如下:/在ListCtrl中插入一个新列m_RunList.InsertColumn(0,"NO.");m_RunList.InsertColumn(1,"键值名称");m_RunList.InsertColumn(2,"键值");/*LVSCW_AUTOSIZE_USEHEADER:列宽度自动匹配标题文本。如果最后一列使用该值,则列宽设置为ListCtrl的剩余长度*/m_RunList.SetColumnWidth(0,LVSCW_AUTOSIZE_USEHEADER);m_RunList.SetColumnWidth(1,LVSCW_AUTOSIZE_USEHEADER);m_RunList.SetColumnWidth(2,LVSCW_AUTOSIZE_USEHEADER));}2.启动项的枚举本例主要是通过枚举注册表中“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”子键下的键值项来获取Windows以下的启动启动程序。运行“注册表启动项管理”软件后,应该会显示上述注册表子项下所有启动项的内容,代码如下:#defineREG_RUN"Software\\Microsoft\\Windows\\CurrentVersion\\Run\\"VOIDCManageRunDlg::ShowRunList(){//清空ListCtrlm_RunList.DeleteAllItems();DWORDdwType=0;DWORDdwBufferSize=MAXBYTE;DWORDdwKeySize=MAXBYTE;charszValueName[MAXBYTE]={0};charszValueKey[MAXBYTE]={0};HKEYhKey=NULL;LONGlRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,REG_RUN,0,KEY_ALL_ACCESS,&hKey);if(lRet!=ERROR_SUCCESS){return;}inti=0;CStringstrTmp;while(TRUE){//枚举键项lRet=RegEnumValue(hKey,i,szValueName,&dwBufferSize,NULL,&dwType,(unsignedchar*)szValueKey,&dwKeySize);//如果没有item,退出循环if(lRet==ERROR_NO_MORE_ITEMS){break;}//显示在列表控件strTmp.Format("%d",i);m_RunList.InsertItem(i,strTmp);m_RunList.SetItemText(i,1,szValueName);m_RunList.SetItemText(i,2,szValueKey);ZeroMemory(szValueKey,MAXBYTE);ZeroMemory(szValueName,MAXBYTE);dwBufferSize=MAXBYTE;dwKeySize=MAXBYTE;i++;}RegCloseKey(hKey);}显示注册表中的自启动项时,必须一定对于注册表中启动项的管理,常用的功能有3个,第一个是屏蔽启动项,第二个是删除启动项,最后是添加启动项(这三个是并列的,没有先后顺序).这里的程序只完成了最后两个功能,即删除启动项和添加启动项。删除启动项和屏蔽启动项是有区别的。不同的是,屏蔽启动项是可以恢复的,而删除启动项是不可逆的。至于屏蔽启动项的功能,就交给大家去实现了。3、添加启动项的代码只需将需要随Windows启动的软件添加到“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”子键中即可实现所需功能。代码如下:voidCManageRunDlg::OnBtnAdd(){//TODO:AddyourcontrolnotificationhandlercodehereCRegAddRegAdd;RegAdd.DoModal();//判断输入是否完成if(strlen(RegAdd.m_szKeyName)>0&&strlen(RegAdd.m_szKeyValue)>0){HKEYhKey=NULL;LONGlRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,REG_RUN,0,KEY_ALL_ACCESS,&hKey);if(lRet!=ERROR_SUCCESS){return;}RegSetValueEx(hKey,RegAdd.m_szKeyName,0,REG_SZ,(constunsignedchar*)RegAdd.m_szKeyValue,strlen(RegAdd.m_szKeyValue)+sizeof(char));RegCloseKey(hKey);ShowRunList();}else{AfxMessageBox("请输入完整内容");}}代码中CRegAdd对应的窗口为添加启动项,该窗口的代码如下:IDC_EDIT_KEYVALUE,m_szKeyValue,MAX_PATH);EndDialog(0);}4.删除启动item'sgeneration删除启动项的代码比添加启动项的代码要简单,但是在删除时涉及到CListCtrl控件的编程,即选中列表框中的哪个启动项进行删除。这是控件的编程。问题,代码中获取到选中的启动项后,删除它很简单,代码如下:while(pos){nSelected=m_RunList.GetNextSelectedItem(pos);}if(-1==nSelected){AfxMessageBox("请选择要删除的启动项");return;}charszKeyName[MAXBYTE]={0};用于注册表启动项您可以在软件中添加其他允许软件启动的注册表子项,这样启动项管理软件会更加强大和完善。但是,当你对注册表的理解不断加深时,你会发现更多的让软件随机启动的子键,所以每次都需要在代码中添加新发现的子键,而且每次都改代码非常麻烦的时间。那么,有没有什么好的方法可以在不改变代码本身的情况下,每次都添加一个子键呢?可以将要枚举的注册表子键保存到一个文件中,然后让程序从文件中读取这些子键,最后通过API函数枚举注册表。这样,以后每当注册表有新的内容需要枚举时,只需要修改保存注册表子项的文件,而程序本身不需要修改。