zoukankan      html  css  js  c++  java
  • 学习自建调试体系(三)

    这部分是讲释放在OD插件中的资源文件,也就是一个驱动,然后安装驱动、卸载驱动的过程。主要关注点放在安装、卸载者部分代码上。

    安装、启动服务

    总结大致步骤如下:

    1. 获得服务控制管理器句柄(OpenSCManager)
    2. 获得服务句柄(CreateService)
    3. 如果CreateService失败,使用OpenService再次获得服务句柄
    4. StartService
    //
    // 安装服务
    //
    BOOL DbgObjInstallService(
    	const wchar_t *SzPath,		//驱动路径
    	const wchar_t *SzName)		//服务名称
    {
    	BOOL bRet = FALSE;
    	DWORD dwLastError;
    	SC_HANDLE hSCManager;
    	SC_HANDLE hService = NULL;
    	
      	// 获得服务控制管理器句柄
    	if (hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS))
    	{
            //获得服务句柄
    		hService = CreateService(
    			hSCManager, SzName,
    			SzName, SERVICE_ALL_ACCESS,
    			SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
    			SERVICE_ERROR_IGNORE, SzPath,
    			NULL, NULL, NULL, NULL, NULL
    			);
    
    		if (hService == NULL)
    		{
              	//再次获得服务句柄
    			hService = OpenService(hSCManager, SzName, SERVICE_ALL_ACCESS);
    
    			if (!hService)
    			{
    				CloseServiceHandle(hSCManager);
    				return FALSE;
    			}
    
    		}
    		//开启服务
    		bRet = StartService(hService, 0, NULL);
    		if (!bRet)
    		{
    			dwLastError = GetLastError();
    		}
    	}
    
    	if (hService)
    	{
    		CloseServiceHandle(hService);
    	}
    
    	if (hSCManager)
    	{
    		CloseServiceHandle(hSCManager);
    	}
    
    	return bRet;
    }
    

    卸载服务

    //
    // 卸载服务 参数:服务名称
    //
    BOOL DbgObjUnInstallService(wchar_t* SzServiceName)
    {
    	BOOL bRet = FALSE;
    	SC_HANDLE hServiceMgr = NULL;
    	SC_HANDLE hServiceDDK = NULL;
    	SERVICE_STATUS SvrSta;
    
    	do
    	{
    		//
    		// 打开SCM管理器
    		//
    		hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    
    		if (hServiceMgr == NULL)
    		{
    			break;
    		}
    
    		//
    		// 打开驱动所对应的服务
    		//
    		hServiceDDK = OpenService(hServiceMgr, SzServiceName, SERVICE_ALL_ACCESS);
    
    		if (hServiceDDK == NULL)
    		{
    			break;
    		}
    		//
    		// 关闭驱动所对应的服务
    		//
    		ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta);
    
    
    		if (DeleteService(hServiceDDK))
    		{
    			bRet = TRUE;
    		}
    
    	} while (FALSE);		//while FALSE 是个什么鬼?
    
    	if (hServiceDDK)
    	{
    		CloseServiceHandle(hServiceDDK);
    	}
    
    	if (hServiceMgr)
    	{
    		CloseServiceHandle(hServiceMgr);
    	}
    
    	return bRet;
    }
    
  • 相关阅读:
    CF580B Kefa and Company 尺取法
    [USACO08OCT]牧场散步Pasture Walking BZOJ1602 LCA
    [USACO09FEB]改造路Revamping Trails 分层最短路 Dijkstra BZOJ 1579
    [USACO09OPEN]牛的数字游戏Cow Digit Game 博弈
    Codeforces 628F 最大流转最小割
    Codeforces 513D2 Constrained Tree
    Codeforces 1009G Allowed Letters 最大流转最小割 sosdp
    Codeforces 431E Chemistry Experiment 线段树 + 二分
    Codeforces 359E Neatness
    Codeforces 1045B Space Isaac
  • 原文地址:https://www.cnblogs.com/Lnju/p/5414026.html
Copyright © 2011-2022 走看看