《反勒索软件开发笔记》(一)vs常见问题与使用技巧,服务程序标准框架

下断点时候当前代码下断代码不匹配

在工具->选项->调试->常规去掉要求源文件与原始版本完全匹配

在重新编译时候重新生成表一些错,比如无法贷款数据库等

先清理解决方案,在重新生成,如果还不行,就关闭项目,删除项目的.ncb文件,然后重新生成。

杂项

注意相对路径,另外做产品一般使用Unicode,不要用多字节,代码生成一步用MT或MTd。

优化

产品级的项目尽量避免内嵌汇编。如果一定要记得禁用优化。

《反勒索软件开发笔记》(一)vs常见问题与使用技巧,服务程序标准框架_第1张图片

IDE的生成窗口被关掉

不小心关了选择编译平台时候可以点击

《反勒索软件开发笔记》(一)vs常见问题与使用技巧,服务程序标准框架_第2张图片

《反勒索软件开发笔记》(一)vs常见问题与使用技巧,服务程序标准框架_第3张图片

 

如图选被关掉了,最后选重排命令确定

服务程序标准框架

一个标准服务需要有如下:

入口点有代码

	SERVICE_TABLE_ENTRY dispatchTable[]=
	{
		{ST,(LPSERVICE_MAIN_FUNCTION)Service_Main},{ NULL,NULL}//服务名,入口程序
	};
	if(!StartServiceCtrlDispatcher(dispatchTable))//服务处理分发例程

服务主函数

void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)
{
	Sleep(20000);
//下面全局变量代码规范一般加前缀g_,主状态
	ssStatus.dwServiceType        = SERVICE_WIN32;			//指明可执行文件类型
	ssStatus.dwCurrentState       = SERVICE_START_PENDING;  //指明服务当前状态
	ssStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;	//指明服务接受何种控制   
	ssStatus.dwWin32ExitCode      = 0;   
	ssStatus.dwServiceSpecificExitCode = 0;   
	ssStatus.dwCheckPoint         = 0;   
	ssStatus.dwWaitHint           = 0;    

	//注册服务控制处理函数
	sshStatusHandle=RegisterServiceCtrlHandler(ST, Service_Ctrl);
	//如果注册失败
	if(!sshStatusHandle)
	{
		goto cleanup;
		return;
	}

	//更新服务状态
	if(!ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, TIMEOUT))
		goto cleanup; //更新服务状态失败则转向 cleanup
	ServiceStart(dwArgc,lpszArgv);
	return;
cleanup:
	//把服务状态更新为 SERVICE_STOPPED,并退出。
	if(sshStatusHandle)
		ReportStatusToSCMgr(SERVICE_STOPPED, GetLastError(), 0);
}

 

还要有服务控制函数

//控制处理程序函数
void WINAPI Service_Ctrl(DWORD dwCtrlCode)
{
	//处理控制请求码
	switch(dwCtrlCode)
	{
	case SERVICE_CONTROL_STOP:			//先更新服务状态为 SERVICDE_STOP_PENDING,再停止服务。
		ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 500);
		ServiceStop(); 
		return;
	case SERVICE_CONTROL_PAUSE:			//暂停服务
		ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
		ServicePause(); 
		ssStatus.dwCurrentState=SERVICE_PAUSED;
		return;
	case SERVICE_CONTROL_CONTINUE:		//继续服务
		ReportStatusToSCMgr(SERVICE_CONTINUE_PENDING, NO_ERROR, 500);
		ServiceContinue();
		ssStatus.dwCurrentState=SERVICE_RUNNING;
		return;
	case SERVICE_CONTROL_INTERROGATE:	//更新服务状态
		break;
	default:	//无效控制码
		break;
	}
	ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
}

注意点:改变服务状态ReportStatusToSCMgr

编写流程

接口设计从顶向下

gui-》gui跟服务通信接口-》跟通信驱动接口-》清除模块

个人开发从底层向上

先设计接口,从核心到周边,

源码分析

从通信中枢往外围看

关键通信加密。

你可能感兴趣的:(windows,内核,驱动开发)