关于Win2000的服务和运行Dos程序的问题(不要轻易下结论进去看了再说)(200分)

  • 主题发起人 主题发起人 SuperJS
  • 开始时间 开始时间
S

SuperJS

Unregistered / Unconfirmed
GUEST, unregistred user!
1、我想问的是如何启动停止系统的一个服务,注意不是sqlserver是系统自己的services
如DHCP Client等
2、我查了一下以前的帖子只有讲如何运行Dos程序的,现在我想要得到的是Dos程序运行后
返回的结果,该怎么办呢!另外可不可以在内存中执行,不存在于硬盘上(不用临时文件)
希望高手关注!即我把Dos程序脱壳出来后,当做Dll中的函数来运行,可不可能呢!
 
1. net start/stop xxxserver
2. 除非这个DOS的源码你有,改成DLL/LIB就可以了。否则一般只能将输出的结果倒到文件中
像“xxx.exe >c:/temp/a.txt”,然后分析a.txt!!!
 
思考中、、、
 
Windows API ;QueryServiceStatus(...)
 
第一个问题差不多解决了!但是如何判断一个服务当前的状态呢!?谢谢!
还有能不能不通过net这个程序来作呢!系统自己是怎么作的啊,他不会也是这样作的吧!
net中应该也有调api才对啊!
 
DWORD StartSampleService()
{
; ; SERVICE_STATUS ssStatus;
; ; DWORD dwOldCheckPoint;
; ; DWORD dwStartTickCount;
; ; DWORD dwWaitTime;
; ; DWORD dwStatus;
;
; ; schService = OpenService(
; ; ; ; schSCManager, ; ; ; ; ;// SCM database
; ; ; ; "Sample_Srv", ; ; ; ; ;// service name
; ; ; ; SERVICE_ALL_ACCESS);
;
; ; if (schService == NULL)
; ; {
; ; ; ; MyErrorExit("OpenService");
; ; }
;
; ; if (!StartService(
; ; ; ; ; ; schService, ;// handle to service
; ; ; ; ; ; 0, ; ; ; ; ; // number of arguments
; ; ; ; ; ; NULL) ) ; ; ;// no arguments
; ; {
; ; ; ; MyErrorExit("StartService");
; ; }
; ; else
; ; {
; ; ; ; printf("Service start pending./n");
; ; }
;
; ; // Check the status until the service is no longer start pending.
;
; ; if (!QueryServiceStatus(
; ; ; ; ; ; schService, ; // handle to service
; ; ; ; ; ; &ssStatus) ) ;// address of status information structure
; ; {
; ; ; ; MyErrorExit("QueryServiceStatus");
; ; }
;
; ; // Save the tick count and initial checkpoint.

; ; dwStartTickCount = GetTickCount();
; ; dwOldCheckPoint = ssStatus.dwCheckPoint;

; ; while (ssStatus.dwCurrentState == SERVICE_START_PENDING)
; ; {
; ; ; ; // Do not wait longer than the wait hint. A good interval is
; ; ; ; // one tenth the wait hint, but no less than 1 second and no
; ; ; ; // more than 10 seconds.
;
; ; ; ; dwWaitTime = ssStatus.dwWaitHint / 10;

; ; ; ; if( dwWaitTime < 1000 )
; ; ; ; ; ; dwWaitTime = 1000;
; ; ; ; else if ( dwWaitTime > 10000 )
; ; ; ; ; ; dwWaitTime = 10000;

; ; ; ; Sleep( dwWaitTime );

; ; ; ; // Check the status again.
;
; ; ; ; if (!QueryServiceStatus(
; ; ; ; ; ; ; ; schService, ; // handle to service
; ; ; ; ; ; ; ; &ssStatus) ) ;// address of structure
; ; ; ; ; ; break;
;
; ; ; ; if ( ssStatus.dwCheckPoint > dwOldCheckPoint )
; ; ; ; {
; ; ; ; ; ; // The service is making progress.

; ; ; ; ; ; dwStartTickCount = GetTickCount():
; ; ; ; ; ; dwOldCheckPoint = ssStatus.dwCheckPoint;
; ; ; ; }
; ; ; ; else
; ; ; ; {
; ; ; ; ; ; if(GetTickCount()-dwStartTickCount > ssStatus.dwWaitHint)
; ; ; ; ; ; {
; ; ; ; ; ; ; ; // No progress made within the wait hint
; ; ; ; ; ; ; ; break;
; ; ; ; ; ; }
; ; ; ; }
; ; }

; ; if (ssStatus.dwCurrentState == SERVICE_RUNNING)
; ; {
; ; ; ; printf("StartService SUCCESS./n");
; ; ; ; dwStatus = NO_ERROR;
; ; }
; ; else
; ; {
; ; ; ; printf("/nService not started. /n");
; ; ; ; printf(" ;Current State: %d/n", ssStatus.dwCurrentState);
; ; ; ; printf(" ;Exit Code: %d/n", ssStatus.dwWin32ExitCode);
; ; ; ; printf(" ;Service Specific Exit Code: %d/n",
; ; ; ; ; ; ssStatus.dwServiceSpecificExitCode);
; ; ; ; printf(" ;Check Point: %d/n", ssStatus.dwCheckPoint);
; ; ; ; printf(" ;Wait Hint: %d/n", ssStatus.dwWaitHint);
; ; ; ; dwStatus = GetLastError();
; ; }
;
; ; CloseServiceHandle(schService);
; ; return dwStatus;
}
从《MSDN》贴了一段,高手来谈谈!我不太理解!改成Delphi该怎么写呢!
 
这程序很清楚,如果你嫌麻烦,可以去找找相关控件
至于你第2个问题,如果要运行的是一段精心构建的代码,是可以做到的,很多病毒就是这么干的。
你可以去参考一些win32汇编的书,如果是一个dos程序,那么就几乎不可能,除非你了解win32下
dos程序的加载机制,dos可执行文件格式,以及初始一个dos程序需要的工作和相关的系统权限,那
或许也能够办到,等于写一个你自己的win32下dos shell?呵呵
 
啊,对我来说是遥不可及的事情了,先把基本功练好再说!
另外我提这个问题的初衷是,用系统自己的net send可以给启动Messager服务的机器发消息!
但是只能用这个Dos命令,还有就是他会把发给你的消息弹出一个对话框!这些消息你按确定
就没有了!我想把他存下来!就是给他作个外壳!
想了一下,除非知道net send的实现原理,自己写一个代替他,否则就只有开个线程不停的
检测窗口,或者在网络传输协议上下功夫,监听端口等,把消息给抢过来!
现在我觉得比较难实现了!
看看有没有高手可以实现呢!
 
后退
顶部