QQ1321.CN 努力为您提供一个时尚的QQ空间代码交流平台!
一生愛妳QQ空间站
您当前的位置:QQ空间代码|QQ空间模块|QQ图标|QQ空间互踩|QQ免费资源 >> QQ空间代码 >> 文章内容 ╰☆╮文字广告位 ☏非主流同城缘分 ☜网友自由发布空间模块平台☞
创建SvcHost.exe 调用的服务原理与实践(6)
作者:郁郁小蝎 来源:中国站长学院(QQ1321)原创Www.QQ1321.Cn 收藏到QQ书签 【添加到百度搜藏】  推荐好友
void __stdcall ServiceMain( int argc, wchar_t* argv[] )
{
//DebugBreak();
char svcname[256];
strncpy(svcname, (char*)argv[0], sizeof svcname); //it's should be unicode, but if it's ansi we do it well
wcstombs(svcname, argv[0], sizeof svcname);
OutputString("SvcHostDLL: ServiceMain(%d, %s) called", argc, svcname);

 hSrv = RegisterServiceCtrlHandler( svcname, (LPHANDLER_FUNCTION)ServiceHandler );
if( hSrv == NULL )
{
OutputString("SvcHostDLL: RegisterServiceCtrlHandler %S failed", argv[0]);
return;
}else FreeConsole();

 TellSCM( SERVICE_START_PENDING, 0, 1 );
TellSCM( SERVICE_RUNNING, 0, 0 );

 // call Real Service function noew
if(argc > 1)
strncpy(svcname, (char*)argv[1], sizeof svcname),
wcstombs(svcname, argv[1], sizeof svcname);
RealService(argc > 1 ? svcname : MY_EXECUTE_NAME, argc > 2 ? 1 : 0);

 do{
Sleep(10);//not quit until receive stop command, otherwise the service will stop
}while(dwCurrState != SERVICE_STOP_PENDING && dwCurrState != SERVICE_STOPPED);

 OutputString("SvcHostDLL: ServiceMain done");
return;
}

int TellSCM( DWORD dwState, DWORD dwExitCode, DWORD dwProgress )
{
SERVICE_STATUS srvStatus;
srvStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
srvStatus.dwCurrentState = dwCurrState = dwState;
srvStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;
srvStatus.dwWin32ExitCode = dwExitCode;
srvStatus.dwServiceSpecificExitCode = 0;
srvStatus.dwCheckPoint = dwProgress;
srvStatus.dwWaitHint = 3000;
return SetServiceStatus( hSrv, &srvStatus );
}

void __stdcall ServiceHandler( DWORD dwCommand )
{
// not really necessary because the service stops quickly
switch( dwCommand )
{
case SERVICE_CONTROL_STOP:
TellSCM( SERVICE_STOP_PENDING, 0, 1 );
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_STOP");
Sleep(10);
TellSCM( SERVICE_STOPPED, 0, 0 );
break;
case SERVICE_CONTROL_PAUSE:
TellSCM( SERVICE_PAUSE_PENDING, 0, 1 );
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_PAUSE");
TellSCM( SERVICE_PAUSED, 0, 0 );
break;
case SERVICE_CONTROL_CONTINUE:
TellSCM( SERVICE_CONTINUE_PENDING, 0, 1 );
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_CONTINUE");
TellSCM( SERVICE_RUNNING, 0, 0 );
break;
case SERVICE_CONTROL_INTERROGATE:
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_INTERROGATE");
TellSCM( dwCurrState, 0, 0 );
break;
case SERVICE_CONTROL_SHUTDOWN:
OutputString("SvcHostDLL: ServiceHandler called SERVICE_CONTROL_SHUTDOWN");
TellSCM( SERVICE_STOPPED, 0, 0 );
break;
}
}


//RealService just create a process
int RealService(char *cmd, int bInteract)
{
OutputString("SvcHostDLL: RealService called '%s' %s", cmd, bInteract ? "Interact" : "");
STARTUPINFO si = {0};
PROCESS_INFORMATION pi;
si.cb = sizeof si;
if(bInteract) si.lpDesktop = "WinSta0\\Default";
if(!CreateProcess(NULL, cmd, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
OutputString("SvcHostDLL: CreateProcess(%s) error:%d", cmd, GetLastError());
else OutputString("SvcHostDLL: CreateProcess(%s) to %d", cmd, pi.dwProcessId);

 return 0;
}


上篇内容:文章:创建SvcHost.exe 调用的服务原理与实践(7)
下篇内容:文章:创建SvcHost.exe 调用的服务原理与实践(5)
将本文收藏到QQ书签中,以便日后查看或与好友分享
代码阅读排行
· 入侵检测及网络安全发展技术探讨(3)...
· 在Windows XP中如何取得文件或文件夹...
· Win2003“安全事件ID”分析(2)
· Win2003“安全事件ID”分析(3)
· 清除Security列表中的未知用户
· 电脑高手常用的五个按钮
站长精彩推荐
精彩推荐内容
· 何谓HTTP 500内部服务器错误


版权所有:一生愛妳┆QQ空间代码酷站 最佳分辨率 IE6.0 1024×768 备案中 站长(信仰自由)QQ:271443991
未经本站授权严禁建立镜像.本站部分资源来源于网络,版权归原作者所有 欢迎任何建议、批评和鼓励
Copyright © 2007-2008 信仰自由 All Rights Reserved .
收藏此页 - 推荐好友 - 友情连接 - - 信仰自由 - 联系我们 - 网站地图 - 关于我们