// 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;
}