Erreur StartService

Résolu
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008 - 28 févr. 2008 à 22:26
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 28 févr. 2008 à 22:57
Bonjour, je souhaiterais créer un service (Driver) ainsi que le lancer, voici mon code, l'erreur se situe au niveau de l'appel StartService avec le code erreur 0x02 (FILE_NOT_FOUND), ce qui me semble bizzard, vu que le driver est bien sur le disque.

#include <windows.h>
#include <winsvc.h>

#include <stdlib.h>
#include <stdio.h>

BOOL ExtractSYS(PCHAR, DWORD);

DWORD RegisterDriver(PCHAR, PCHAR, PCHAR, DWORD);
DWORD LoadDriver(PCHAR);

int main(int argc, char *argv[])
{
    if(RegisterDriver("C:\\Driver.sys", "Driver", "Driver", 0x00) == DRIVER_MANAGER_OK) {

        LoadDriver("Driver");
    }

    return 0;
}

BOOL IsFileExist(LPSTR lpszFilename)
{
    DWORD dwAttr = GetFileAttributesA(lpszFilename);
   
    if(dwAttr == 0xffffffff) return FALSE;
    else return TRUE;
}

DWORD LoadDriver(PCHAR nom_driver)
{
    HANDLE hService;
    HANDLE hSCManager;

    //Ouvre le Service Manager
    hSCManager = OpenSCManager(
        NULL,                                        //lpMachineName
        NULL,                                        //lpDatabaseName
        SC_MANAGER_CREATE_SERVICE                    //dwDesiredAccess
        );
   
    if(!hSCManager)    return DRIVER_MANAGER_ERROR_SCM;

    //Si tout va bien, ouvre le driver
    hService = OpenService(
        hSCManager,                                    //hSCManager
        nom_driver,                                    //lpServiceName
        SERVICE_ALL_ACCESS                            //dwDesiredAccess
        );

    if (!hService)
    {
        fprintf(stderr, "Error with OpenService : 0x%.8X\n\n", GetLastError());

        CloseServiceHandle(hSCManager);
       
        return DRIVER_MANAGER_ERROR_ACCESS;
    }

    //Le démarre
    if (!StartService(
            hService,                                //hService
            0,                                        //dwNumServiceArgs
            NULL                                    //lpServiceArgVectors
            )
        )
    {
        fprintf(stderr, "Error with StartService : 0x%.8X\n\n", GetLastError());

        CloseServiceHandle(hService);
        CloseServiceHandle(hSCManager);
       
        return DRIVER_MANAGER_ERROR_RUN;

    }

    //Nettoie tout ca
    CloseServiceHandle(hService);
    CloseServiceHandle(hSCManager);
       
    return DRIVER_MANAGER_OK;
}

DWORD RegisterDriver(PCHAR emplacement, PCHAR nom_court, PCHAR nom_complet, DWORD type)
{
    // Ouvre une connexion au Service Manager
    SC_HANDLE hSCManager;
    SC_HANDLE hService;

    DWORD type_value;

     // Vérifie si le fichier existe
    if(!IsFileExist(emplacement)) return DRIVER_MANAGER_NO_FILE;

    hSCManager= OpenSCManager(
        NULL,                                        // lpMachineName
        NULL,                                        // lpDatabaseName
        SC_MANAGER_CREATE_SERVICE                    // dwDesiredAccess
        );
   
    if(!hSCManager){
       
        fprintf(stderr, "Error with OpenSCManager : 0x%.8X", GetLastError());   
        return DRIVER_MANAGER_ERROR_SCM;
    }

    switch (type)
    {
        case 0:   // A la demande
            type_value = SERVICE_DEMAND_START;
            break;

        case 1:   // Automatique
            type_value = SERVICE_AUTO_START;
            break;

        case 2:   // Boot
            type_value = SERVICE_BOOT_START;
            break;

        case 3:   // Désactivé
            type_value = SERVICE_DISABLED;
            break;

        case 4:   // Système
            type_value = SERVICE_SYSTEM_START;
            break;

        default:
            return DRIVER_MANAGER_ERROR_CREATE;
    }

   
    // Si tout va bien, on enregistre le driver
    hService = CreateService(
        hSCManager,                                    // hSCManager
        TEXT("Driver"),                                    // lpServiceName
        TEXT("Driver"),                                // lpDisplayName
        SERVICE_ALL_ACCESS,                            // dwDesiredAccess
        SERVICE_KERNEL_DRIVER,                        // dwServiceType
        SERVICE_DEMAND_START,                        // dwStartType
        SERVICE_ERROR_NORMAL,                        // dwErrorControl
        emplacement,                                // lpBinaryPathName
        NULL,                                        // lpLoadOrderGroup
        NULL,                                        // lpdwTagId
        NULL,                                        // lpDependencies
        NULL,                                        // lpServiceStartName
        NULL                                        // lpPassword
        );

    if(!hService)
    {
        fprintf(stderr, "Error with CreateService : 0x%.8X\n\n", GetLastError());

        CloseServiceHandle(hSCManager);

        if (GetLastError() == ERROR_SERVICE_EXISTS)
            return DRIVER_MANAGER_ERROR_ALREADY;
        else
            return DRIVER_MANAGER_ERROR_CREATE;
    }

    // Nettoie tout ca
    CloseServiceHandle(hService);
    CloseServiceHandle(hSCManager);
       
    return DRIVER_MANAGER_OK;
}

Si vous voyez d'où peut provenir le problème, merci.

____________________________
MVS - Microsoft Student Partner

3 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 févr. 2008 à 22:57
Refais déja cohérent asi OU unicode, faut enlever source de bug l'une après l'autre.

Prends exemple ici, c'est full exemple qui fonctionne:
http://www.cppfrance.com/code.aspx?ID=36941
te suffit de regarder dans le code de l'installeur du service.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 févr. 2008 à 22:45
C'est voulu que tu mixes ANSI et UNICODE dans ton prog ?

ciao...
BruNews, MVP VC++
0
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
28 févr. 2008 à 22:47
A vrai dire, c'est codé "à la vas-vite", j'y ai pas prêté attention, tu n'aurais pas idée de la source du pb ?

Merci

___________________
MVS - Most Valuable Student ( Microsoft)
0
Rejoignez-nous