Ich arbeite an einem Installationsprogramm in OS X, das einen IOKit-Treiber für ein USB-Gerät installiert, und ich versuche, dafür zu sorgen, dass am Ende kein Neustart erforderlich ist. Das Installationsprogramm installiert den Treiber korrekt und baut den Kext-Cache neu auf. Wenn ich das USB-Gerät abziehe und wieder einstecke, lädt es den neuen Treiber korrekt und alles funktioniert einwandfrei.Programmatisch "ein USB-Gerät ausstecken und umstecken", um neue Treiber in OS X zu laden?
Ich möchte jedoch nicht, dass der Benutzer das Gerät physisch trennen muss, damit der neue Treiber geladen werden kann. Es muss eine Möglichkeit geben, OS X dazu zu bringen, den neuen Treiber programmatisch zu laden - im Prinzip simulieren Sie, dass das Gerät ausgesteckt und wieder angeschlossen wird, oder etwas Ähnliches. Wie würde ich das machen? Bisher haben Stunden des Googelns nichts gebracht, also wird jede Hilfe sehr geschätzt!
Ich würde versuchen, Blick auf den Code, der ausgeführt wird, wenn Sie ein USB-Massenspeichergerät auswerfen - Ich bin nicht sicher, ob es entsprechende USB-Verkehr oder wenn es nur das USB-Subsystem anweist, den Port zu ignorieren, bis eine physische Trennung erfolgt. Im ersteren Fall (eine "USB-Auswurf" -Meldung) gibt es möglicherweise keine einfache Möglichkeit zum "Auswerfen", abgesehen von einem Stromausfall oder einem USB-Reset, die beide für andere USB-Geräte problematisch sein können. Aber das ist hoffentlich irgendwo, wo ich anfangen soll. –
Ich habe etwas über 'pmount' gelesen, das willkürlichere USB-Geräte aushängen kann, aber ich weiß nicht, ob das Ihr Gerät enthält. Der einzige große Nachteil ist, dass es standardmäßig nicht mit OS X geliefert wird. – rien333
Ich bin mir ziemlich sicher, dass Sie dies nicht direkt aus Benutzerraum tun können. Im Kernel könnten Sie jedoch versuchen, terminate() auf dem vorhandenen Client aufzurufen, der das Gerät blockiert. – pmdj