¿Cómo crea VC un servicio?
Este es un ejemplo que escribí hace unos días: te lo anotaré. Si aún no lo entiendes, solo agrégame: Q11 (59) Q (59) 903
./ /ProcApp.cpp: Define el punto de entrada para la aplicación de consola.
//
#pragma once
#include "stdafx.h"
#include lt;windows.hgt; p>
p>
#include lt;winioctl.hgt;
//Este es mi tipo personalizado, no tiene nada que ver con tu pregunta, solo trátalo como un tipo p>
typedef struct _CALL_BACK
{
HANDLE pParentId;
HANDLE pProcessId;
BOOLEAN bCreate;
}CALLBACKINFO, *PCALLBACKINFO;
//Esta definición no tiene nada que ver con la creación de servicios. Simplemente trátelo como una constante
#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;
p>
:: GetFullPathName(L"Service.sys", MAX_PATH, szDriverPath, amp; p);
// La anterior es la ruta del archivo ejecutable para obtener el servicio. siempre es uno para un servicio del archivo ejecutable
//Abra el administrador de servicios. El primer parámetro es el nombre de la computadora. Para esta máquina, use NULL. El segundo parámetro es el nombre de la base de datos. >
//La base de datos predeterminada es Usar NULL, la tercera es el permiso de acceso. Esta API devuelve el identificador del administrador de servicios.
SC_HANDLE scm=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS
if (!scm)
{
printf("OpenSCManager); ¡Error!");
return 0;
}
//Esto es para crear un servicio, su primer parámetro es el identificador del administrador de servicios, El segundo parámetro es el nombre del servicio
//, el tercer parámetro es el nombre para mostrar del servicio, el cuarto parámetro es la configuración de permisos y el quinto parámetro es la clase de servicio
// Para otros tipos, consulte 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)
p>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) p>
{
printf("CreateService falló!d", GetLastError());
devuelve 0;
}
//Este es el servicio de inicio
if (!::StartService(scs, 0, NULL))
{
int nError=::GetLastError();
if (nError!=ERROR_SERVICE_ALREADY_RUNNING)
{
printf("StartService falló!d\n" , nError);
CloseServiceHandle(scs);
CloseServiceHandle(scm);
devuelve 0;
}
}
// Lo siguiente no tiene nada que ver con tu problema, no necesitas leerlo, pero hay un identificador de cierre más adelante, no lo olvides it
HANDLE hDriver= ::CreateFile(L"\\\\.\\slNTProcDrv", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
if); (hDriver==INVALID_HANDLE_VALUE)
{
printf("¡Error al abrir el dispositivo!");
return
}
HANDLE hProcessEvent=::OpenEvent(SYNCHRONIZE, FALSE, TEXT("Global\\NTProcDrvProcessEvent"));
if (!hProcessEvent)
{
printf ("¡OpenEvent falló! d\n", :: GetLastError());
CloseServiceHandle(scs);
CloseServiceHandle(scm); ;
}
CALLBACKINFO callbackinfo, callbacktemp={0};
while(::WaitForSingleObject(hProcessEvent, INFINITE)==WAIT_OBJECT_0)
{
DWORD nBytsReturn;
BOOL bRet=::DeviceIoControl(hDriver,IOCTL_NTPROCDRV_GET_PROCINFO,NULL,0,(LPVOID)amp;callbackinfo,sizeof(callbackinfo),amp; nBytsReturn, NULL);
if (bRet)
{
if (callbackinfo.bCreate!=callbacktemp.bCreate||callbacktemp.pParentId!=callbackinfo. pParentId||callbackinfo.pProcessId!=callbacktemp.pProcessId)
{
if (callbackinfo.bCreate)
{
printf( "Se crea un proceso, PID: d\n", callbackinfo.pProcessId
}
else
{
printf); ("Se finalizó un proceso, PID: d\n", callbackinfo.pProcessId
}
}
}
); else
{
printf("¡No se pudo obtener la información del proceso!");
break
}
}
CloseHandle(hDriver);
SERVICE_STATUS ss;
::ControlService(scs, SERVICE_CONTROL_STOP, amp; ss); p >::DeleteService(scs);
::CloseServiceHandle(scs);
::CloseServiceHandle(scm);
devuelve 0;
}