C/Visual C - api RegisterServiceProcess ?

 
Vista:

api RegisterServiceProcess ?

Publicado por ifer (31 intervenciones) el 18/07/2003 19:50:18
esta funcion poco conocida (RegisterServiceProcess) ubicada en kernel32.dll no es reconocida por VC, asi incluyendo
todas las cabeceras habidas y por haber, sin embargo VB lo reconoce facilmente con:
Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal dwType As Long) As Long
como puedo cargar esta funcion API?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Cómo cargar y usar la función `RegisterServiceProcess` de kernel32.dll

Publicado por Alejandro (1286 intervenciones) el 15/07/2025 20:59:02
Efectivamente, iFer, `RegisterServiceProcess` no está declarada en las cabeceras estándar de Windows y, en algunos casos, no está documentada oficialmente, pero aún así puedes usarla mediante carga dinámica de funciones en `kernel32.dll`.

¿Qué hacer?



1. Cargar dinámicamente la función con `GetProcAddress`
2. Definir un puntero a función con la firma correcta
3. Llamar a la función si se carga correctamente

---

Ejemplo en C++ para cargar `RegisterServiceProcess`



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <windows.h>
#include <stdio.h>
 
// Define la firma de la función
typedef BOOL (WINAPI *RegisterServiceProcess_t)(DWORD dwProcessId, DWORD dwType);
 
int main() {
    // Cargar kernel32.dll
    HMODULE hKernel32 = LoadLibrary(TEXT("kernel32.dll"));
    if (!hKernel32) {
        printf("No se pudo cargar kernel32.dll\n");
        return 1;
    }
 
    // Obtener la dirección de la función
    RegisterServiceProcess_t pRegisterServiceProcess = (RegisterServiceProcess_t)GetProcAddress(hKernel32, "RegisterServiceProcess");
 
    if (!pRegisterServiceProcess) {
        printf("No se encontró RegisterServiceProcess en kernel32.dll\n");
        FreeLibrary(hKernel32);
        return 1;
    }
 
    // Llamar a la función (ejemplo: proceso actual, tipo 0)
    DWORD dwProcessID = GetCurrentProcessId();
    DWORD dwType = 0; // valor que quieras usar
    BOOL result = pRegisterServiceProcess(dwProcessID, dwType);
 
    if (result) {
        printf("RegisterServiceProcess ejecutada correctamente.\n");
    } else {
        printf("Error al ejecutar RegisterServiceProcess. Error: %d\n", GetLastError());
    }
 
    FreeLibrary(hKernel32);
    return 0;
}

---

Notas importantes


- La función `RegisterServiceProcess` no está documentada oficialmente en las versiones modernas de Windows, y su uso puede ser no recomendable o no soportado en versiones recientes.
- La función en VB funciona porque VB puede acceder a funciones no documentadas mediante `Declare` y carga dinámica en tiempo de ejecución.
- En C++, debes hacer lo mismo: cargar dinámicamente y verificar si la función existe antes de usarla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar