问题:
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作者讲授!