急急急!svchost启动服务Dll,无法启动,ServiceMain似乎进不去?

Jo_Kael 2016-06-22 11:41:14
用svchost.exe调用一个自己写的dll服务,服务可以创建,但是启动不了,看日志,ServiceMain压根没有进去,DllMain进去了,哪个大神帮忙看下,代码如下:
#pragma  once

#ifdef SVCHOSTLIBDLLSRV
#define SvcHostSrvApi _declspec(dllexport)
#else
#define SvcHostSrvApi _declspec(dllimport)
#endif

class SvcHostSrvApi SvcHostDllSrv
{
public:
SvcHostDllSrv();
~SvcHostDllSrv();

int InstallService(char *name);
int UninstallService(char *name);
void __stdcall ServiceMain( int argc, wchar_t* argv[] );

static int ConsoleSCManager(DWORD dwState, DWORD dwExitCode, DWORD dwProgress );
static unsigned __stdcall OutPutDateTime(void *pm);

static DWORD m_dwCurrState;

private:

BOOL CreateStringReg(HKEY hRoot,char *szSubKey, unsigned long kType,char* ValueName,char *Data);
BOOL CreateDWORDReg(HKEY hRoot,char *szSubKey,char* ValueName,DWORD Data);

void CoreWork();
bool OpenCalcExe();

static bool m_bExitFlag;
static SERVICE_STATUS_HANDLE m_hSrv;
};

// SvcHostDllSrv.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"

#define SVCHOSTLIBDLLSRV

#include "SvcHostDllSrv.h"

#include "logfile.h"

CLogFile g_runLog(("Log_"));


SERVICE_STATUS_HANDLE SvcHostDllSrv::m_hSrv = NULL;
DWORD SvcHostDllSrv::m_dwCurrState = 0;
bool SvcHostDllSrv::m_bExitFlag = false;

SvcHostDllSrv::SvcHostDllSrv()
{
m_bExitFlag = false;
}

SvcHostDllSrv::~SvcHostDllSrv()
{
m_bExitFlag = true;
}

void __stdcall ServiceHandler(DWORD dwCommand)
{
switch( dwCommand )
{
case SERVICE_CONTROL_STOP:
SvcHostDllSrv::ConsoleSCManager( SERVICE_STOP_PENDING, 0, 1 );
Sleep(10);
SvcHostDllSrv::ConsoleSCManager( SERVICE_STOPPED, 0, 0 );
break;
case SERVICE_CONTROL_PAUSE:
SvcHostDllSrv::ConsoleSCManager( SERVICE_PAUSE_PENDING, 0, 1 );
SvcHostDllSrv::ConsoleSCManager( SERVICE_PAUSED, 0, 0 );
break;
case SERVICE_CONTROL_CONTINUE:
SvcHostDllSrv::ConsoleSCManager( SERVICE_CONTINUE_PENDING, 0, 1 );
SvcHostDllSrv::ConsoleSCManager( SERVICE_RUNNING, 0, 0 );
break;
case SERVICE_CONTROL_INTERROGATE:
SvcHostDllSrv::ConsoleSCManager( SvcHostDllSrv::m_dwCurrState, 0, 0 );
break;
case SERVICE_CONTROL_SHUTDOWN:
SvcHostDllSrv::ConsoleSCManager( SERVICE_STOPPED, 0, 0 );
break;
}
}

void __stdcall SvcHostDllSrv::ServiceMain(int argc, wchar_t* argv[])
{
g_runLog.Write("SvcHostDllSrv:ServiceMain Begin...\r\n");
char svcname[256];
strncpy(svcname, (char*)argv[0], sizeof svcname); // 支持unicode和ansi
wcstombs(svcname, argv[0], sizeof svcname);

m_hSrv = RegisterServiceCtrlHandler( svcname, (LPHANDLER_FUNCTION)ServiceHandler );
if( m_hSrv == NULL )
{
g_runLog.Write("SvcHostDllSrv: RegisterServiceCtrlHandler failed!\r\n");
return;
}else FreeConsole();

ConsoleSCManager( SERVICE_START_PENDING, 0, 1 );
ConsoleSCManager( 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);

CoreWork();

do{
Sleep(10);
}while(m_dwCurrState != SERVICE_STOP_PENDING && m_dwCurrState != SERVICE_STOPPED);

g_runLog.Write("SvcHostDllSrv:ServiceMain done\r\n");
}

int SvcHostDllSrv::InstallService(char *name)
{
HKEY hkRoot = HKEY_LOCAL_MACHINE, hkParam = 0;
SC_HANDLE hscm = NULL, hscService = NULL;

//install service
hscm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hscm == NULL)
{
g_runLog.Write("InstallService OpenSCManager Error [%d]\r\n", GetLastError());
return GetLastError();
}
char *bin = "%systemroot%\\system32\\svchost.exe -k NBA";

hscService = CreateService(
hscm, // SCManager database
name, // name of service
NULL, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_SHARE_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
bin, // services binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password

if (hscService == NULL)
{
g_runLog.Write("InstallService CreateService Error [%d]\r\n", GetLastError());
return GetLastError();
}

CloseServiceHandle(hscService);
CloseServiceHandle(hscm);

char szFilePath[MAX_PATH];
GetModuleFileName(NULL,(LPSTR)szFilePath,sizeof(szFilePath));
(_tcsrchr(szFilePath, _T('\\')))[1] = 0;
CString strPath = szFilePath ;
strPath += "SvcHostDllSrv.dll";

CreateStringReg(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost", REG_MULTI_SZ, name,"NBA\0\0");
CreateStringReg(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA", REG_EXPAND_SZ, "ImagePath", bin);
CreateStringReg(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA", REG_SZ, "DisplayName", name);
CreateStringReg(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA", REG_SZ, "Description", "");
CreateStringReg(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA", REG_SZ, "ObjectName", "LocalSystem");
CreateDWORDReg( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA", "ErrorControl", 1);
CreateDWORDReg( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA", "Start", 2);
CreateStringReg(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA\\Parameters", REG_EXPAND_SZ, "ServiceDll", (char*)(LPSTR)(LPCTSTR)strPath);

RegCloseKey(hkRoot);
RegCloseKey(hkParam);
CloseServiceHandle(hscService);
CloseServiceHandle(hscm);

g_runLog.Write("Install SvcHostDllSrv Successful!\r\n");
return 0;
}

int SvcHostDllSrv::UninstallService(char *name)
{
m_bExitFlag = true;

HKEY hKey;
SC_HANDLE hSCM = NULL, hService = NULL;
SERVICE_STATUS ServiceStatus;
//卸载服务
hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(!hSCM)
{
g_runLog.Write("UninstallService CreateService Error [%d]\r\n", GetLastError());
return GetLastError();
}

hService = OpenService(hSCM, name, SERVICE_STOP | DELETE);

if(!hService)
{
g_runLog.Write("UninstallService OpenService Error [%d]\r\n", GetLastError());
//return GetLastError();
}

ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus);
DeleteService(hService);

CloseServiceHandle(hSCM);
CloseServiceHandle(hService);

long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost", 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hKey);
if(lRet == ERROR_SUCCESS)
{
g_runLog.Write("UninstallService RegOpenKeyEx Error [%d]\r\n", GetLastError());
lRet = RegDeleteValue(hKey, name);
RegCloseKey(hKey);
}
RegDeleteKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA\\Parameters");
RegDeleteKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\NBA");

g_runLog.Write("UnInstall SvcHostDllSrv Successful\r\n");
return 0;
}

void SvcHostDllSrv::CoreWork()
{
// 打开计算器
OpenCalcExe();

// 开启线程输出日期
_beginthreadex(NULL, 0, OutPutDateTime, this,0,NULL);
}

int SvcHostDllSrv::ConsoleSCManager(DWORD dwState, DWORD dwExitCode, DWORD dwProgress)
{
SERVICE_STATUS srvStatus;
srvStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
srvStatus.dwCurrentState = m_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( m_hSrv, &srvStatus );
}

bool SvcHostDllSrv::OpenCalcExe()
{
ShellExecute(0,"open","calc.exe","","",SW_SHOWNORMAL);
g_runLog.Write("Open Calc Success!\r\n");
return true;
}

unsigned __stdcall SvcHostDllSrv::OutPutDateTime(void *pm)
{
while (!m_bExitFlag)
{
if (m_bExitFlag)
break;
COleDateTime curTime = COleDateTime::GetCurrentTime();
CString strCurTime = curTime.Format("%Y-%m-%d %H:%M:%S");
g_runLog.Write("%s\r\n", strCurTime);
Sleep(1000);
}

return 0;
}

BOOL SvcHostDllSrv::CreateStringReg(HKEY hRoot,char *szSubKey, unsigned long kType,char* ValueName,char *Data)
{
HKEY hKey;

long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_WOW64_64KEY,NULL,&hKey,NULL);

if (lRet!=ERROR_SUCCESS)
return false;

lRet=RegSetValueEx(hKey, ValueName, 0, kType, (BYTE*)Data,strlen(Data));

if (lRet!=ERROR_SUCCESS)
return false;

RegCloseKey(hKey);
return true;
}

BOOL SvcHostDllSrv::CreateDWORDReg(HKEY hRoot,char *szSubKey,char* ValueName,DWORD Data)
{
HKEY hKey;

long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_WOW64_64KEY,NULL,&hKey,NULL);

if (lRet!=ERROR_SUCCESS)
return false;

DWORD dwSize=sizeof(DWORD);

lRet=RegSetValueEx(hKey,ValueName,0,REG_DWORD,(BYTE*)&Data,dwSize);

if (lRet!=ERROR_SUCCESS)
return false;

RegCloseKey(hKey);
return true;
}

// TestSrvHostDllSrv.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "SvcHostDllSrv.h"

#pragma comment(lib, "../Debug/SvcHostDllSrv.lib")

int _tmain(int argc, _TCHAR* argv[])
{
SvcHostDllSrv* shds = new SvcHostDllSrv();

shds->InstallService("NBA");

//Sleep(1000*60);

//shds->UninstallService("NBA");

if (shds)
{
delete shds;
shds = NULL;
}
return 0;
}
...全文
337 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
仅供参考: C:\>tlist -c | find "svchost.exe" 736 svchost.exe Command Line: C:\WINDOWS\system32\svchost.exe -k DcomLaunch 832 svchost.exe Command Line: C:\WINDOWS\system32\svchost.exe -k rpcss 896 svchost.exe Command Line: C:\WINDOWS\system32\svchost.exe -k NetworkService 932 svchost.exe Command Line: C:\WINDOWS\system32\svchost.exe -k LocalService 948 svchost.exe Command Line: C:\WINDOWS\System32\svchost.exe -k netsvcs 452 svchost.exe Command Line: C:\WINDOWS\System32\svchost.exe -k tapisrv Command Line: find "svchost.exe"
oyljerry 2016-06-24
  • 打赏
  • 举报
回复
是否调用svchost的命令启动服务

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧