Comment utiliser SetupCopyOEMInf pendant l’installation

J’ai un pilote inf et un catalogue qui a été généré avec Libusbdotnet pour mon périphérique USB.

Tout fonctionne bien, à l’exception de l’installation complète du pilote qui est vraiment fastidieuse. Parce que mon pilote n’est pas signé numériquement et qu’il n’est pas en WHQL … il faut beaucoup d’interaction de l’utilisateur pour installer le pilote pour mon périphérique.

Donc, je cherche à le faire automatiquement toujours sans signature et WHQL si possible. J’ai donc fait quelques recherches et trouvé la fonction SetupCopyOEMInf.

J’ai une application écrite en c # et .net et aussi un paquet MSI.

En gros, j’aimerais pouvoir utiliser SetupCopyOEMInf lors de l’installation pour copier les pilotes afin que Windows puisse détecter automatiquement le pilote lorsque l’utilisateur twig le périphérique pour la première fois.

Mais je ne trouve aucun exemple montrant comment utiliser SetupCopyOEMInf.

Toute aide est appréciée.

Je vous remercie,

Je ne suis pas sûr que cela aidera, mais voici un exemple de code sur la façon d’utiliser la fonction elle-même. J’ai beaucoup utilisé MSDN et Pinvoke de Microsoft pour créer du code rapide.

[DllImport("setupapi.dll", SetLastError = true)] public static extern bool SetupCopyOEMInf( ssortingng SourceInfFileName, ssortingng OEMSourceMediaLocation, OemSourceMediaType OEMSourceMediaType, OemCopyStyle CopyStyle, ssortingng DestinationInfFileName, int DestinationInfFileNameSize, ref int RequiredSize, ssortingng DestinationInfFileNameComponent ); ///  /// Driver media type ///  internal enum OemSourceMediaType { SPOST_NONE = 0, //Only use the following if you have a pnf file as well SPOST_PATH = 1, SPOST_URL = 2, SPOST_MAX = 3 } internal enum OemCopyStyle { SP_COPY_NEWER = 0x0000004, // copy only if source newer than or same as target SP_COPY_NEWER_ONLY = 0x0010000, // copy only if source file newer than target SP_COPY_OEMINF_CATALOG_ONLY = 0x0040000, // (SetupCopyOEMInf only) don't copy INF--just catalog } static void Main(ssortingng[] args) { //Not really needed but I couldn't figure out how to not specify a ref parameter int size = 0; bool success = SetupCopyOEMInf("source.inf", "", OemSourceMediaType.SPOST_NONE, OemCopyStyle.SP_COPY_NEWER, null, 0, ref size, null); if(!success) { var errorCode = Marshal.GetLastWin32Error(); var errorSsortingng = new Win32Exception(errorCode).Message; Console.WriteLine(errorSsortingng); Console.ReadLine(); } } 

En supposant que votre fichier INF soit complètement correct avec les répertoires de destination appropriés spécifiés, cette fonction essaiera également de copier tous les fichiers que vous avez spécifiés via la directive CopyFiles (dans le fichier INF) dans ces répertoires de destination. Si le fichier n’existe pas, la commande échouera.

Un autre problème que j’avais, c’est que la fonction doit copier vos fichiers INF et CAT dans le répertoire de destination spécifié (j’ai indiqué un ID de 12, documenté sous le nom% windir% \ system32 \ drivers), mais l’a copié dans% windir%. \ system32 \ DriverStore \ FileRepository \ source.inf_amd64_neutral_blah. Cela était probablement dû au fait que je testais avec un fichier inf créé à la main et manquant des informations requirejses.

J’espère que ça vous aide un peu 🙂

Personnellement, j’envisagerais d’utiliser un certificate auto-signé généré au lieu d’essayer de contourner les mesures intégrées à Windows afin de prévenir les risques de sécurité. La signature du pilote est utile dans une certaine mesure.

Puisque vous souhaitez installer ces pilotes sur votre ordinateur local, vous pouvez effectuer l’une des quatre choses suivantes:

  • Acquérir un certificate (payant)
  • Ignorez l’application d’un pilote spécifique non signé à l’aide d’un outil de signature. Je ne suis pas au courant des implications juridiques d’un tel plan d’action et je ne donnerai donc pas de détails à ce sujet.
  • Désactivez le contrôle de compte d’utilisateur et démarrez avec F8 pour désactiver l’application (je présume qu’il s’agit d’une opération unique qui doit être répétée pour chaque installation ou dans tous les cas pour chaque session et qui peut ne pas être préférée si vous recherchez une solution permanente)
  • Utilisez un certificate auto-signé pour votre machine que vous pouvez utiliser pour signer les pilotes. C’est la solution que je préférerais, car vous pouvez écrire une petite application autour du processus (générer ou importer le certificate, l’appliquer, exécuter / démarrer l’installation du pilote).

Par contre, je n’ai aucune expérience dans la création d’une telle application. Je pensais juste que vous apportiez un problème intéressant à la table et je ne fais qu’évoquer ce que je sais et / ou trouver. Cela n’exclut pas la possibilité que je manque complètement le ballon 🙂

Curieux de voir comment vous allez résoudre ce problème.

Je pense que vous pouvez éviter d’écrire votre propre programme d’installation de pilote en utilisant simplement pnputil , fourni avec Microsoft Windows Vista et plus récent.

(Exécuter en tant qu’administrateur)

 pnputil /a mydriver.inf