首页
社区
课程
招聘
[求助]关于服务与优化!
发表于: 2008-2-17 21:18 5133

[求助]关于服务与优化!

2008-2-17 21:18
5133
问题:
1.WinMain不能返回,其它函数都可以返回,VC6和VC7都试过了!
2.用CreateProcess创建的进程不能显示,任务管理器显示为SYSTEM!
3.case WM_HOTKEY不能收到消息!
4.VC7怎么优化(就是生成的程序小)?
代码如下:
#include <windows.h>
#include <winsvc.h>

#define HOMEKEY 1008

STARTUPINFO si;
BOOL bServiceRunning;
HANDLE hEvent,hThread;
PROCESS_INFORMATION pi;
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE ServiceStatusHandle;

DWORD WINAPI Service(LPVOID lpParam)
{
        MessageBox(NULL,"服务成功启动!","提示",MB_DEFAULT_DESKTOP_ONLY);
        while(bServiceRunning) Sleep(500);
        return 0;
}

void WINAPI ServiceCtrlHandler(DWORD dwControlCode)
{
        switch(dwControlCode)
        {
        case WM_HOTKEY:
                MessageBox(NULL,"收到热键消息!","提示",MB_DEFAULT_DESKTOP_ONLY);
                        break;
        case SERVICE_CONTROL_SHUTDOWN:
        case SERVICE_CONTROL_STOP:
                ServiceStatus.dwWin32ExitCode=0;
                ServiceStatus.dwCurrentState=SERVICE_STOP_PENDING;
                ServiceStatus.dwCheckPoint=1;
                ServiceStatus.dwWaitHint=1000;
                SetServiceStatus(ServiceStatusHandle,&ServiceStatus);
               
                bServiceRunning=FALSE;
                SetEvent(hEvent);

                ServiceStatus.dwCurrentState=SERVICE_STOP;
                ServiceStatus.dwCheckPoint=0;
                ServiceStatus.dwWaitHint=0;
                SetServiceStatus(ServiceStatusHandle,&ServiceStatus);
                break;
        default: break;
        }
        return;
}

void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
        DWORD dwThreadId;
        ServiceStatusHandle=RegisterServiceCtrlHandler("NT Service",(LPHANDLER_FUNCTION)ServiceCtrlHandler);
        if(!ServiceStatusHandle) return;
       
        ServiceStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
        ServiceStatus.dwCurrentState=SERVICE_START_PENDING;
        ServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN
                | SERVICE_ACCEPT_PAUSE_CONTINUE;
        ServiceStatus.dwServiceSpecificExitCode=0;
        ServiceStatus.dwWin32ExitCode=0;
        ServiceStatus.dwCheckPoint=2;
        ServiceStatus.dwWaitHint=1000;
       
        SetServiceStatus(ServiceStatusHandle,&ServiceStatus);

        if(!(hEvent=CreateEvent(NULL,TRUE,FALSE,NULL)))  return;

        ServiceStatus.dwCurrentState=SERVICE_START_PENDING;
        ServiceStatus.dwCheckPoint=1;
        ServiceStatus.dwWaitHint=1000;
        SetServiceStatus(ServiceStatusHandle,&ServiceStatus);
               
        ZeroMemory(&si,sizeof(STARTUPINFO));
        ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
        si.cb=sizeof(STARTUPINFO);
        si.dwFlags=STARTF_USESHOWWINDOW;
        si.wShowWindow=SW_SHOW;
        if(CreateProcess("F:\\扫描工具\\KillBox.exe",NULL,NULL,NULL,FALSE,CREATE_SUSPENDED | NORMAL_PRIORITY_CLASS,NULL,"F:\\扫描工具",&si,&pi))
                MessageBox(NULL,"启动进程失败!","提示",MB_DEFAULT_DESKTOP_ONLY);
        if(RegisterHotKey((HWND)GetCurrentThread(),HOMEKEY,NULL,VK_HOME))
                MessageBox(NULL,"注册热键失败!","提示",MB_DEFAULT_DESKTOP_ONLY);
        ResumeThread(pi.hThread);

        if(!(hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Service,(LPVOID)0,0,&dwThreadId))) return;
        bServiceRunning=TRUE;

        ServiceStatus.dwCurrentState=SERVICE_RUNNING;
        ServiceStatus.dwCheckPoint=0;
        ServiceStatus.dwWaitHint=0;
        SetServiceStatus(ServiceStatusHandle,&ServiceStatus);

        UnregisterHotKey((HWND)GetCurrentThread(),HOMEKEY);
        WaitForSingleObject(hEvent,INFINITE);
        UnregisterHotKey((HWND)GetCurrentThread(),HOMEKEY);
        CloseHandle(hEvent);
        CloseHandle(hThread);
        return;
}

int WINAPI WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        SERVICE_TABLE_ENTRY servicetable[]={
                {"NT Service",(LPSERVICE_MAIN_FUNCTION)ServiceMain},
                {NULL,NULL}
        };
        if(StartServiceCtrlDispatcher(servicetable))
                MessageBox(NULL,"StartServiceCtrlDispatcher返回!","提示",MB_DEFAULT_DESKTOP_ONLY);
        return 0;
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
[1]调用StartServiceCtrlDispatcher成功后,调用线程就与服务控制管理器联系起来,直到服务结束时才会返回
[2]这是因为服务进程的桌面不是Winsta0\default,如果要在服务进程中创建属于default桌面的进程,就要在CreateProcess的STARTUPINFO参数的lpDesktop设置为“Winsta0\default”,显示的指定进程的所属桌面。
[3]RegisterHotKey函数用的不对,快捷键消息是基于窗体的,MSDN中说的很清楚
2008-2-18 00:41
0
雪    币: 241
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=北极星2003;417278][1]调用StartServiceCtrlDispatcher成功后,调用线程就与服务控制管理器联系起来,直到服务结束时才会返回
[2]这是因为服务进程的桌面不是Winsta0\default,如果要在服务进程中创建属于default桌面的进程,就要在CreateProcess的STARTUPIN...[/QUOTE]

问题就是服务结束时也不能返回啊!
2008-2-18 18:21
0
游客
登录 | 注册 方可回帖
返回
//