當前位置:編程學習大全網 - 編程語言 - VC 如何創建服務?

VC 如何創建服務?

這是我前幾天寫的壹個例子:我給妳註釋壹下,如果還不懂,就加我:Q11(59)Q(59)903

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

}

  • 上一篇:PyTorch-4 nn.DataParallel 數據並行詳解
  • 下一篇:安卓手機攝像頭如何實現自動對焦
  • copyright 2024編程學習大全網