IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

service NT avec interface (IHM)


Sujet :

Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut service NT avec interface (IHM)
    bonjour je suis en train de creer un service NT
    et je voudrais faire a coté de ça une autre programme avec une interface graphique qui permettrai de modifier les paramètres de mon service NT

    comment faire pour que le programme2 avec interface graphique puisse interagir avec le service NT?

    comment a partir d une programme passer des parametres a un service?

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Si tu parles de services NT en mode Kernel (donc .sys), les questions que tu poses sont vraiment la base de la programmation de drivers, un petit peu de lecture serait bienvenue pour parfaire les connaissances de bases.

    Le DDK est réellement une mine d'or pour cela. Bien que très touffu et pesant, c'est réellement un passage obligé pour pouvoir programmer des services.


    comment faire pour que le programme2 avec interface graphique puisse interagir avec le service NT?
    un SCP (le programme ring3 / user mode) [service control program] envoit des requêtes vers un driver au travers de 3 apis notemment :

    -DeviceIoControl
    -ReadFile
    -WriteFile

    (en réalité on ne communique pas directement avec le driver, mais on passe par le Service Control Manager et le gestionnaire d'E/S).

    DeviceIoControl permet d'envoyer des requêtes personnelles vers le driver. ReadFile permet de lire des données depuis le driver, alors que WriteFile permet l'inverse (écrire des données vers le driver).

    Les requêtes se font par des IOCTL (Input Output control), soit définis en constantes dans winnt.h, soit personnel, c'est à dire que l'ont forge soit même.

    Lorsque l'on envoit un IOCTL au driver celui ci recoit un IRP (Input request packet) correspondant. Si l'IRP posséde une fonction de gestion il est à même de la gérer au travers de sa routine qui enverra le code à la bonne fonction.

    comment a partir d une programme passer des parametres a un service?
    Le mieux est encore (au départ) de passer par WriteFile pour envoyer un IRP_MJ_WRITE et traiter cela dans la fonction adéquate. Tout dépend du type de données et ce que le driver doit recevoir, si ca devient complexe, il faudra passer par son propre IOCTL et coder la fonction qui va avec dans le driver.

    exemple de routine de dispatch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDO,
                             IN PUNICODE_STRING pRegPath ) {
    
        pDO->MajorFunction[ IRP_MJ_CREATE ] = DispCreate;
        pDO->MajorFunction[ IRP_MJ_CLOSE ] = DispClose;
        pDO->MajorFunction[ IRP_MJ_CLEANUP ] = DispCleanup;
        pDO->MajorFunction[ IRP_MJ_READ ]= DispRead;
        pDO->MajorFunction[ IRP_MJ_WRITE ] = DispWrite;//ici on gère la réception de données
        return STATUS_SUCCESS;
    }
    et la fonction qui va avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NTSTATUS DispWrite ( IN PDEVICE_OBJECT pDO,
                            IN PIRP pIrp ) {
    
    // code qui ne fait rien si ce n'est recevoir le code de contrôle
        pIrp->IoStatus.Status = STATUS_SUCCESS;
    //normalement ici il faudrait traité les données reçues
        IoCompleteRequest( pIrp, IO_NO_INCREMENT );// la requête est completée
        return STATUS_SUCCESS;// tout est O.K !
    }
    La pricipale difficulté est de choisir la méthode de buffering pour les requêtes (Direct IO, Buffered ou Neither).

    Voilà, j'espère ne pas m'être fourvoyé en répondant à coté de la plaque si j'ai mal compris la question...

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    C'est pas lié au C++. Je déplace.

    Attention à pas mélanger driver et service. Cela dit dans le principe c'est un peu comparable : ton appli cliente communique avec ton service via ControlService (au lieu de DeviceIoControl pour les drivers) et ce dernier gèrera la requete dans la handler enregistré via RegisterServiceCtrlHandlerEx.
    http://msdn.microsoft.com/library/en-us/dllproc/base/sending_control_requests_to_a_service.asp

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Au temps pour moi, j'en suis resté à service = driver service, alors qu'il existe des "services" tout court

    Je m'excuse d'avoir répondu à coté de la plaque, et je remercie Aurélien pour la précision

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    merci pour vos reponse, je vais essayer de creuser un peu.
    je vous tiens au courant si g d'autre question
    bonne journée

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    voilà un bout de code pour controler le service
    mais je ne saias pas pourquoi
    schService (SC_HANDLE) est toujours NULL
    MERCI d'avance à ceux qui regarde le code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    bool __fastcall TForm_otrad::ControlSampleService(DWORD fdwControl)
    {
        SERVICE_STATUS ssStatus;
        DWORD fdwAccess;
        DWORD dwStartTickCount, dwWaitTime;
    
        // The required service object access depends on the control.
    
        switch (fdwControl)
        {
            case SERVICE_CONTROL_STOP:
    
                fdwAccess = SERVICE_STOP; 
                break;
     
            case SERVICE_CONTROL_PAUSE:
            case SERVICE_CONTROL_CONTINUE:
                fdwAccess = SERVICE_PAUSE_CONTINUE;
                break; 
    
            case SERVICE_CONTROL_INTERROGATE:
    
                fdwAccess = SERVICE_INTERROGATE; 
                break; 
     
            default:
                fdwAccess = SERVICE_INTERROGATE;
        }
    
     //   SC_HANDLE schSCManager;
    
    // Open a handle to the SC Manager database. 
     
    schSCManager = OpenSCManager( 
        NULL,                    // local machine 
        NULL,                    // ServicesActive database
        SC_MANAGER_ALL_ACCESS);  // full access rights
    
    if (NULL == schSCManager) {
            Label4->Caption="schSCManager null";
        printf("OpenSCManager failed (%d)\n", GetLastError());}
     
        // Open a handle to the service.
    
        schService = OpenService(
            schSCManager,        // SCManager database
            TEXT("ici_c_le_nom_de_mon_service"),  // name of service
            fdwAccess);          // specify access
    
        if (schService == NULL)
        {   Label4->Caption="schService null";
    //ICI
    //LE SCHSERVICE EST TOUJOURS NULL POURQUOI????
    //ICI
            printf("OpenService failed (%d)\n", GetLastError()); 
            return FALSE;
        }
     
        // Send a control value to the service. 
     
        if (! ControlService( 
                schService,   // handle to service 
                fdwControl,   // control value to send
                &ssStatus) )  // address of status info 
        {
            printf("ControlService failed (%d)\n", GetLastError()); 
            return FALSE;
        }
    
        // Print the service status. 
    
        printf("\nStatus of Sample_Srv: \n");
        printf("  Service Type: 0x%x\n", ssStatus.dwServiceType);
        printf("  Current State: 0x%x\n", ssStatus.dwCurrentState);
        printf("  Controls Accepted: 0x%x\n", 
            ssStatus.dwControlsAccepted);
        printf("  Exit Code: %d\n", ssStatus.dwWin32ExitCode);
        printf("  Service Specific Exit Code: %d\n", 
            ssStatus.dwServiceSpecificExitCode);
        printf("  Check Point: %d\n", ssStatus.dwCheckPoint);
        printf("  Wait Hint: %d\n", ssStatus.dwWaitHint);
    
     
        Label4->Caption="fin";
        return TRUE;
    }

  7. #7
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    A priori le code me semble bon... Il serait peut être bon de nous signaler quel est le code d'erreur retourné par GetLastError.

    Sinon c'est peut être une erreur sur le nom du service (les noms sont sensibles à la casse [maj / min]).

    C'est peut être un problème sur le paramètre dwDesiredAccess (problème de droit d'utilisateur / security descriptor) :

    - SERVICE_INTERROGATE => ok pour tout le monde (utilisateur authentifié)

    - SERVICE_STOP et SERVICE_PAUSE_CONTINUE
    => réservés au groupe "Power users".

    Voilà, sinon je ne vois rien d'autre... Bon courage

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    merci
    apparement c'étatait bien le nom du service qui géné.
    A present, le code passe entier mais n'a aucune action sur mes services
    quand je lui dis de sarreter il ne s'arrete pas.
    j'ai essayé avec un autre prog en .net et lui arrete bien le service.

    Je vois pas ou est le soucis dans mon code....

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut


    Que vaut fdwControl ?

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Avec un combo box je renseigne l'action a entreprendre
    le fdwControl est renseigné alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm_otrad::ComboBox_choixChange(TObject *Sender)
    {
            Label2->Caption=ComboBox_choix->Text;
            if ( ComboBox_choix->Text=="Stop"){fdwControl=SERVICE_CONTROL_STOP;}
            if ( ComboBox_choix->Text=="Pause"){fdwControl=SERVICE_CONTROL_PAUSE;}
            if ( ComboBox_choix->Text=="Marche"){fdwControl=SERVICE_CONTROL_CONTINUE;}
            else //( ComboBox_choix->SelText=="Statuts")
            {fdwControl=SERVICE_CONTROL_INTERROGATE;}
            b_stat=false;
            b_stat = ControlSampleService(fdwControl);
            if(b_stat==true){Label1->Caption="1";}
    
    }

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Dans ce code, si ton combo n'est pas à "Marche", fdwControl vaudra SERVICE_CONTROL_INTERROGATE...
    Il manque des else...

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup
    j'arrive a l'arreter maintent mais pause et marche ne marche pas.
    Une fois que je l'ai arreté, je n'arrive pas a le redemarrer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm_otrad::ComboBox_choixChange(TObject *Sender)
    {
            Label2->Caption=ComboBox_choix->Text;
            if ( ComboBox_choix->Text=="Stop"){fdwControl=SERVICE_CONTROL_STOP;}
            else if ( ComboBox_choix->Text=="Pause"){fdwControl=SERVICE_CONTROL_PAUSE;}
            else if ( ComboBox_choix->Text=="Marche"){fdwControl=SERVICE_CONTROL_CONTINUE;}
            else //( ComboBox_choix->SelText=="Statuts")
            {fdwControl=SERVICE_CONTROL_INTERROGATE;}
            b_stat=false;
            b_stat = ControlSampleService(fdwControl);
            if(b_stat==true){Label1->Caption="1";}
    
    }

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    comme je ne sais pas comment le redemarrer avec lautre methode j'ai trouvé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    bool __fastcall TForm_otrad::StartSampleService()
    {
    
    
        SC_HANDLE schSCManager = OpenSCManager(
        NULL,                    // local machine
        NULL,                    // ServicesActive database
        SC_MANAGER_ALL_ACCESS);  // full access rights
    
    
    
        SC_HANDLE schService;
        SERVICE_STATUS_PROCESS ssStatus;
        DWORD dwOldCheckPoint; 
        DWORD dwStartTickCount;
        DWORD dwWaitTime;
        DWORD dwBytesNeeded;
     
        schService = OpenService(
            schSCManager,          // SCM database 
            "DefWatch",          // service name
            SERVICE_ALL_ACCESS); 
     
        if (schService == NULL) 
        { 
            return 0;
        }
     
        if (!StartService(
                schService,  // handle to service 
                0,           // number of arguments 
                NULL) )      // no arguments 
        {
            return 0; 
        }
        else 
        {
            printf("Service start pending.\n"); 
        }
    
        // Check the status until the service is no longer start pending. 
     
        if (!QueryServiceStatusEx( 
                schService,             // handle to service 
                SC_STATUS_PROCESS_INFO, // info level
                &ssStatus,              // address of structure
                sizeof(SERVICE_STATUS_PROCESS), // size of structure
                &dwBytesNeeded ) )              // if buffer too small
        {
            return 0; 
        }
     
        // Save the tick count and initial checkpoint.
    
        dwStartTickCount = GetTickCount();
        dwOldCheckPoint = ssStatus.dwCheckPoint;
    
        while (ssStatus.dwCurrentState == SERVICE_START_PENDING) 
        { 
            // Do not wait longer than the wait hint. A good interval is 
            // one tenth the wait hint, but no less than 1 second and no
            // more than 10 seconds. 
     
            dwWaitTime = ssStatus.dwWaitHint / 10;
    
            if&#40; dwWaitTime < 1000 &#41;
                dwWaitTime = 1000;
            else if &#40; dwWaitTime > 10000 &#41;
                dwWaitTime = 10000;
    
            Sleep&#40; dwWaitTime &#41;;
    
            // Check the status again. 
     
        if &#40;!QueryServiceStatusEx&#40;
                schService,             // handle to service 
                SC_STATUS_PROCESS_INFO, // info level
                &ssStatus,              // address of structure
                sizeof&#40;SERVICE_STATUS_PROCESS&#41;, // size of structure
                &dwBytesNeeded &#41; &#41;              // if buffer too small
                break; 
    
            if &#40; ssStatus.dwCheckPoint > dwOldCheckPoint &#41;
            &#123;
                // The service is making progress.
    
                dwStartTickCount = GetTickCount&#40;&#41;;
                dwOldCheckPoint = ssStatus.dwCheckPoint;
            &#125;
            else
            &#123;
                if&#40;GetTickCount&#40;&#41;-dwStartTickCount > ssStatus.dwWaitHint&#41;
                &#123;
                    // No progress made within the wait hint
                    break;
                &#125;
            &#125;
        &#125; 
    
        CloseServiceHandle&#40;schService&#41;; 
    
        if &#40;ssStatus.dwCurrentState == SERVICE_RUNNING&#41; 
        &#123;
            printf&#40;"StartService SUCCESS.\n"&#41;; 
            return 1;
        &#125;
        else 
        &#123; 
            printf&#40;"\nService not started. \n"&#41;;
            printf&#40;"  Current State&#58; %d\n", ssStatus.dwCurrentState&#41;;
            printf&#40;"  Exit Code&#58; %d\n", ssStatus.dwWin32ExitCode&#41;; 
            printf&#40;"  Service Specific Exit Code&#58; %d\n", 
                ssStatus.dwServiceSpecificExitCode&#41;; 
            printf&#40;"  Check Point&#58; %d\n", ssStatus.dwCheckPoint&#41;; 
            printf&#40;"  Wait Hint&#58; %d\n", ssStatus.dwWaitHint&#41;; 
            return 0;
        &#125;
    &#125;

    le soucis c'est que pour les lignes de codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if &#40;!QueryServiceStatusEx&#40; 
                schService,             // handle to service 
                SC_STATUS_PROCESS_INFO, // info level
                &ssStatus,              // address of structure
                sizeof&#40;SERVICE_STATUS_PROCESS&#41;, // size of structure
                &dwBytesNeeded &#41; &#41;              // if buffer too small
        &#123;
            return 0; 
        &#125;
    mon compilateur me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     &#91;C++ Error&#93; OTrad.cpp&#40;175&#41;&#58; E2034 Cannot convert '_SERVICE_STATUS_PROCESS *' to 'unsigned char *'
    je vous remercie de m'éclairer

  14. #14
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Cast ta struct en LPBYTE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    &#40;LPBYTE&#41;&ssStatus,

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup
    c etait bien cela
    la pause, le redemarrage, l'arret et la mise en marche fonctionnent tous

    Le probleme est résolu
    merci encore.
    bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/04/2015, 16h40
  2. Développer un Web Service avec interface graphique
    Par annonyme dans le forum Services Web
    Réponses: 1
    Dernier message: 12/02/2013, 10h04
  3. Réponses: 1
    Dernier message: 02/12/2010, 23h26
  4. [Eclipse] créer un service Windows avec Eclipse
    Par tck-lt dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/09/2005, 17h28
  5. Application multiplateforme avec interface graphique
    Par TNorth dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 31/01/2004, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo