Partage
  • Partager sur Facebook
  • Partager sur Twitter

Éjection des appareils aux périphèriques USB

Sujet résolu
    3 février 2023 à 15:23:18

    Bonjour (Bonsoir) Informaticien(ne),

    Je présente mon soucis ;
    je code sous Visual Studio Code et le programme est en Python. Il est (sensé) éjecter toutes appareils connectés aux périphériques.
    Le seul soucis est que j'ai une erreur qui m'indique (si j'ai bien compris) une interdiction d'écrire à un endroit spécifique de la mémoire.
    Je ne vous cache pas que j'ai pris des morceaux de code par-ci par-là et que j'essaie tant bien que mal à comprendre le code (je commente au fur et à mesure).
    Voici le code :

    import time
    import ctypes
    from ctypes import *
    
    WORD = ctypes.c_ushort
    DWORD = ctypes.c_ulong
    GUID = ctypes.c_ulong * 2
    ULONG = ctypes.c_ulong
    HANDLE = ctypes.c_void_p
    UCHAR = c_ubyte
    
    winusb = ctypes.WinDLL("WinUsb.dll")
    WinUsb_Initialize = winusb.WinUsb_Initialize
    WinUsb_Initialize.argtypes = [HANDLE, ctypes.POINTER(ctypes.c_void_p)]
    WinUsb_Initialize.restype = ctypes.c_bool
    
    WinUsb_Free = winusb.WinUsb_Free
    
    
    class SP_DEVINFO_DATA(ctypes.Structure):
        _fields_ = [
            ("cbSize", DWORD),
            ("ClassGuid", GUID),
            ("DevInst", DWORD),
            ("Reserved", ULONG)
        ]
    
    class DEV_BROADCAST_HDR(ctypes.Structure):
        _fields_ = [
            ("dbch_size", DWORD),
            ("dbch_devicetype", DWORD),
            ("dbch_reserved", DWORD)
        ]
    
    def eject_device(device_id):
        # Ouverture de la gestion des périphériques
        DIGCF_PRESENT = 2
        DIGCF_ALLCLASSES = 4
        hdev = ctypes.windll.setupapi.SetupDiGetClassDevsA(None, device_id, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES)
    
        if hdev == -1:
            raise Exception("Impossible d'ouvrir la gestion des périphériques")
    
        try:
            # Structure pour stocker les informations sur le périphérique
            dev_info = SP_DEVINFO_DATA()
            dev_info.cbSize = ctypes.sizeof(SP_DEVINFO_DATA)
    
            # Récupération des informations sur le premier périphérique
            ctypes.windll.setupapi.SetupDiEnumDeviceInfo(hdev, 0, ctypes.byref(dev_info))
    
            # Récupération de l'identifiant du périphérique
            device_id = ctypes.create_string_buffer(1024)
            
            ctypes.windll.setupapi.SetupDiGetDeviceInstanceIdA(hdev, ctypes.byref(dev_info), device_id, 1024, None)
            
            # Conversion de l'identifiant du périphérique en chaîne de caractères
            device_id = str(device_id.value, 'utf-8')
            
            # Ejection du périphérique
            ctypes.windll.winusb.WinUsb_AbortPipe(device_id)
            
            ctypes.windll.winusb.WinUsb_Free(device_id)
            
    
            # Attente de l'éjection complète du périphérique
            time.sleep(0.5)
        except OSError:
            print (device_id)
    
        finally:
            # Fermeture de la gestion des périphériques
            ctypes.windll.setupapi.SetupDiDestroyDeviceInfoList(hdev)
    
    result = eject_device("USB")
    print(result)
    
    

    Voici l'erreur :

    Traceback (most recent call last):
    line 72, in <module> eject_device("USB")
    line 63, in eject_device
        ctypes.windll.winusb.WinUsb_Free(device_id)
    OSError: exception: access violation writing 0x00007FFF896E61E8

    y at-il un moyen pour un programme d'avoir des autorisations ? Est-ce que j'ai fait une aberration de la programmation ?

    Merci pour votre aide et temps, c'est la première fois que je demande de l'aide sur un forum.
    Je m'excuse pour les fautes d'orthographe s'il y en a. ^^'

    -
    Edité par Pyrite192Machalite 6 février 2023 à 10:10:50

    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2023 à 16:48:24

      Pyrite192Machalite a écrit:

      y at-il un moyen pour un programme d'avoir des autorisations ? Est-ce que j'ai fait une aberration de la programmation ?

      L'API windows utilisée doit indiquer les privilèges à avoir pour fonctionner... maintenant si vous passez en mode noyau pour modifier n'importe comment une adresse mémoire, c'est la corruption de l'état du système et un crash assuré plus ou moins rapidement.

      Et comme il s'agit d'utilisation d'API Windows, peut être que c'est vers ce genre de forum qu'il faut demander de l'aide.

      • Partager sur Facebook
      • Partager sur Twitter
        3 février 2023 à 16:48:39

        Bonjour,

        Il est censé (supposé), pas sensé ..

        Pourrais-tu afficher ton code en utilisant l'icone adéquate ?

        • Partager sur Facebook
        • Partager sur Twitter
          3 février 2023 à 17:41:13

          peut-être regarder aussi le retour de AbortPipe qui retourne TRUE si réussi et FALSE sinon.

          Rajoute le catch à ton bloc try pour par exemple afficher le périphérique qui pose souci

          • Partager sur Facebook
          • Partager sur Twitter
            6 février 2023 à 9:48:41

            Merci de vos réponse et désolé si je n'ai pas répondu tout suite, je pensais que j'allais recevoir des mails

            mps a écrit:

            L'API windows utilisée doit indiquer les privilèges à avoir pour fonctionner... maintenant si vous passez en mode noyau pour modifier n'importe comment une adresse mémoire, c'est la corruption de l'état du système et un crash assuré plus ou moins rapidement.

            Et comme il s'agit d'utilisation d'API Windows, peut être que c'est vers ce genre de forum qu'il faut demander de l'aide.


            Je souhaite pas modifier l'adresse mémoire et c'est ça qui me consterne, je veux juste éjecter un ou plusieurs appareil aux périphériques.
            J'ai essayer d'un autre coté avec les événements Windows mais j'en reviens toujours au problème d'autorisations...
            Donc je dois plus me tourner vers le forum windows ?

            Merci pour la mise pages du code Phil_1857, c'est bon à savoir !

            umfred a écrit:

            peut-être regarder aussi le retour de AbortPipe qui retourne TRUE si réussi et FALSE sinon.

            Rajoute le catch à ton bloc try pour par exemple afficher le périphérique qui pose souci

            Quand j'ai mis l'exception (c'est l'équivalent de catch en python) pour AbortPipe, je n'obtiens pas de résultat visible (une barre vide) mais ce n'est pas Null ou None.

            Si il y a d'autre moyen que la voie que j'ai prise (toujours en python) je suis ouvert au proposition.
            EDIT :
            Je viens de trouver la solution à mon soucis, merci à tous.

            -
            Edité par Pyrite192Machalite 6 février 2023 à 10:10:05

            • Partager sur Facebook
            • Partager sur Twitter
              6 février 2023 à 12:14:25

              ça pourrait être sympa de nous partager ta solution, non?
              • Partager sur Facebook
              • Partager sur Twitter

              Éjection des appareils aux périphèriques USB

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown