Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo crea VC un servicio?

¿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>

#include lt;winioctl.hgt;

//Este es mi tipo personalizado, no tiene nada que ver con tu pregunta, solo trátalo como un tipo

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)

{

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;

}