记忆中的函数2

来源:互联网 发布:js页面跳转 带referrer 编辑:程序博客网 时间:2024/04/27 19:03
 push    0F003F00408F1D    push    0      push    000408F21  call    [<&ADVAPI32.OpenSCManagerA>];  第一步,打开服务控制管理器  mov     ebx, eax   ;                  得到服务控制管理器的句柄hSCManager,存于ebx中二call OpenSCManagerA    打开服务控制管理器call OpenServiceA           打开服务call ControlService          传递SERVICE_STOPED参数来关闭服务看来,关闭服务和打开服务的第一第二步是一样的,为了减少增加的代码,改造一下上面主程序的打开服务的代码,增加关闭的功能。(1)  先要修改打开服务时,设置的权限,改服务启动权限为  SERVICE_START | SERVICE_STOP,保证有结束权限三RegCloseKey 释放指定注册键的句柄函数原型LONG RegCloseKey(     HKEY hKey   // 释放键的句柄     );hKey : [输入] 想要关闭的已经打开的键。 返回值: 如果过程执行成功,返回值是 ERROR_SUCCESS。如果功能失败,返回一个非零值,错误码在 Winerror.h定义。可以使用FormatMessage 函数和FORMAT_MESSAGE_FROM_SYSTEM 标记获得一个分类的错误描述。备注: 被关闭的句柄将不可以再使用,应为已经不再有效。RegCloseKey 函数在返回以前不能执行必要的写操作;它能够保持几秒钟为缓存执行写入磁盘,如果一个应用程序必须要写入注册表到硬盘,应该使用 RegFlushKey、RegFlushKey。. 转换基础键HKEY GetBaseRegKey(char* keystr){ HKEY hKey; if(strcmp(keystr,"HKEY_CLASSES_ROOT")==0)  hKey=HKEY_CLASSES_ROOT; if(strcmp(keystr,"HKEY_CURRENT_CONFIG")==0)  hKey=HKEY_CURRENT_CONFIG; if(strcmp(keystr,"HKEY_CURRENT_USER")==0)  hKey=HKEY_CURRENT_USER; if(strcmp(keystr,"HKEY_LOCAL_MACHINE")==0)  hKey=HKEY_LOCAL_MACHINE; if(strcmp(keystr,"HKEY_USERS")==0)  hKey=HKEY_USERS; return hKey;}       //-- 创建子键int CreateRegKey(PARAINFO painfo){ HKEY  bKey; HKEY  hKey; DWORD  lpdwDisposition; LONG  retVal; char BaseKey[512]; char SubKey[512]; int  OpenState; strcpy(BaseKey,painfo.BaseKey); strcpy(SubKey,painfo.SubKey); OpenState = painfo.RegState; bKey = GetBaseRegKey(BaseKey); retVal = RegCreateKeyEx( bKey,  SubKey,  NULL,  NULL,  REG_OPTION_NON_VOLATILE,  KEY_ALL_ACCESS,  NULL,  &hKey,  &lpdwDisposition); if(retVal != ERROR_SUCCESS) {  RegCloseKey(hKey);        //-- 关闭句柄  return 1; } if(OpenState!= REG_STATE_OPEN) {  RegCloseKey(hKey);         //-- 关闭句柄 } return 0;  }


License查看程序将调用RegSetValueExa函数修改注册表查看msdn发现RegSetValueExa函数压栈6个参数,
原创粉丝点击