// ProcApp.cpp : 定义控制台应用程序的入口点。
//
#pragma once
#include "stdafx.h"
#include <windows.h>
#include <winioctl.h>
//这是我自定义的类型,和你问和问题无关,你就把它当成一个类型就是了
typedef struct _CALL_BACK
{
HANDLE pParentId
HANDLE pProcessId
BOOLEAN bCreate
}CALLBACKINFO,*PCALLBACKINFO
//这个定义也和创建服务无关。你就把它当成一个常量吧
#define IOCTL_NTPROCDRV_GET_PROCINFO CTL_CODE(FILE_DEVICE_UNKNOWN,0x0800,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t szSymlName[]=L"slNTProcDrvYH"
wchar_t szDriverPath[MAX_PATH]
wchar_t *p
::GetFullPathName(L"服务.sys",MAX_PATH,szDriverPath,&p)
//上面这个是得到服务的可执行文件路径,一个服务总有一个可执行文件的
//打开服务管理器,第一个参数是计算机名,本机就用NULL,第二个是数据库名
//默认数据库就用NULL,第三个是访问权限。这个API返回服务管理器句柄。
SC_HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS)
if (!scm)
{
printf("OpenSCManager失败!")
return 0
}
//这个是创建服务,它的第一个参数是服务管理器的句柄,第二个参数是服务
//名,第三个参数是服务的显示名,第四个参数是权限设置,第五个是服务类
//型,其它的你看一下MSDN吧
SC_HANDLE scs=CreateService(scm,szSymlName,szSymlName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,szDriverPath,NULL,0,NULL,NULL, NULL)
if (!scs)
{
int nError=GetLastError()
if (nError==ERROR_SERVICE_EXISTS||nError==ERROR_SERVICE_MARKED_FOR_DELETE)
{
scs=OpenService(scm,szSymlName,SERVICE_ALL_ACCESS)
}
if (!scs)
{
printf("CreateService失败!%d",GetLastError())
return 0
}
}
//这里是启动服务
if (!::StartService(scs,0,NULL))
{
int nError=::GetLastError()
if (nError!=ERROR_SERVICE_ALREADY_RUNNING)
{
printf("StartService失败!%d\n",nError)
CloseServiceHandle(scs)
CloseServiceHandle(scm)
return 0
}
}
//下面的和你的问题没有关了,你可以不用看了,但是后面有个关闭句柄的,不要忘了
HANDLE hDriver=::CreateFile(L"\\\\.\\slNTProcDrv",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
if (hDriver==INVALID_HANDLE_VALUE)
{
printf("打开设备失败!")
return 0
}
HANDLE hProcessEvent=::OpenEvent(SYNCHRONIZE,FALSE,TEXT("Global\\NTProcDrvProcessEvent"))
if (!hProcessEvent)
{
printf("OpenEvent失败!%d\n",::GetLastError())
CloseServiceHandle(scs)
CloseServiceHandle(scm)
return 0
}
CALLBACKINFO callbackinfo,callbacktemp={0}
while(::WaitForSingleObject(hProcessEvent,INFINITE)==WAIT_OBJECT_0)
{
DWORD nBytsReturn
BOOL bRet=::DeviceIoControl(hDriver,IOCTL_NTPROCDRV_GET_PROCINFO,NULL,0,(LPVOID)&callbackinfo,sizeof(callbackinfo),&nBytsReturn,NULL)
if (bRet)
{
if (callbackinfo.bCreate!=callbacktemp.bCreate||callbacktemp.pParentId!=callbackinfo.pParentId||callbackinfo.pProcessId!=callbacktemp.pProcessId)
{
if (callbackinfo.bCreate)
{
printf("有进程被创建,PID:%d\n",callbackinfo.pProcessId)
}
else
{
printf("有进程被结束,PID: %d\n",callbackinfo.pProcessId)
}
}
}
else
{
printf("进程信息获取失败!")
break
}
}
CloseHandle(hDriver)
SERVICE_STATUS ss
::ControlService(scs,SERVICE_CONTROL_STOP,&ss)
::DeleteService(scs)
::CloseServiceHandle(scs)
::CloseServiceHandle(scm)
return 0
}
楼主连这个都不同,就不要去做程序员了,可惜你交的几年学费了,呵呵ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。
如果您使用的是Windows操作系统,您或许会注意到一些以OCX结尾的文件。OCX代表“对象链接与嵌入控件”(OLE),这个技术是Microsoft提出的程序技术,用于处理桌面文件的混合使用。现在COM的概念已经取代OLE的一部分,Microsoft也使用ActiveX控件代表组件对象。
组件的一大优点就是可以被大多数应用程序再使用(这些应用程序称为组件容器)。一个COM组件(ActiveX控件)可由不同语言的开发工具开发,包括C++和Visual Basic或PowerBuilder,甚至一些技术性语言如VBScript。
组件是一个独立发布的二进制单元,在windows平台上多以dll或exe的形式发布。组件分进程内组件和进程外组件。而接口是客户程序访问组件的唯一途径,客户只有通过组件提供的接口访问组件。类厂其实开发人员不用关心,因为那是操作系统的COM服务层所做的事情。
我,希望对你有帮助
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)