Comment un jeu peut-il empêcher les gens d'exécuter plusieurs instances de lui-même?

15

Starcraft II m'empêche d'exécuter plusieurs instances, mais si j'exécute la deuxième instance en sandbox dans Sandboxie , cela fonctionne. Qu'est-ce qui pourrait expliquer cela?

Comment puis-je reproduire ce comportement pour mes propres jeux?

Brandon
la source

Réponses:

15

Mis à part Starcraft 2, la réponse générale à cette question est la suivante: acquérir (et verrouiller, si l'acquisition elle-même n'est pas déjà équivalente au verrouillage) une ressource spécifique du système d'exploitation. Quittez le jeu si l'acquisition / le verrouillage échoue. Des exemples de telles ressources sont:

  1. Ports TCP ou UDP spécifiques.
  2. Verrous mutuellement exclusifs ("mutex") ou sémaphores (ces deux sont souvent liés au niveau du système d'exploitation)
  3. Fichiers (les fichiers journaux sont souvent le choix le plus évident)

Sur le haut de gamme, le plus pénible pour le client, du matériel spécialisé qui (parfois nécessairement, comme pour certains composants de contrôle robotique) ne peut être utilisé exclusivement que par un seul thread peut également être utilisé de cette façon.

Martin Sojka
la source
5
Il peut également être utile de garder à l'esprit les complications de sécurité possibles: " Un programme à instance unique est son propre déni de service ".
EnoughTea
Puisqu'il fonctionne dans un bac à sable, ce n'est probablement pas le premier. 2 ou 3 sont de bonnes possibilités, regarder quels fichiers sont ouverts à leurs processus les identifiera probablement.
Doug-W
3
@ Doug-W Je ne vois pas comment cela fonctionne dans sandboxie exclut # 1.
AttackingHobo
@AttackingHobo, sauf si je manque de comprendre la complexité du bac à sable, le fait qu'un port soit lié à l'extérieur du bac à sable ne l'empêcherait-il pas de se lier à l'intérieur? Ou est-ce que sandboxie fournit une interface virtuelle pour chaque programme exécuté à l'intérieur de celui-ci?
Doug-W
@Vigil En ce qui me concerne, vous pouvez citer Raymond Chen toute la journée, mais veuillez ne pas ajouter d'erreurs grammaticales à ses citations. : P (il suffit de les copier / coller à la place.)
hheimbuerger
4

Je recommande l'approche mutex, mais:

Une autre méthode souvent utilisée consiste simplement à vérifier si un autre processus du même nom est en cours d'exécution.

L'avantage est que c'est ridiculement facile - vous n'avez pas à vous soucier des autorisations de fichiers ou à savoir ce qu'est un mutex. L'inconvénient est que vous obtiendrez un faux positif si un autre programme appelé starcraft2.exes'exécute sur la machine.

BlueRaja - Danny Pflughoeft
la source
2
Hehe, ou si l'utilisateur décide de renommer le programme.
Brandon
@Jonathan: Alors ne codez pas en dur le nom de l'exécutable ...
BlueRaja - Danny Pflughoeft
1
Je voulais dire plus comme, et si l'utilisateur copie le programme et le renomme et l'exécute deux fois?
Brandon
3

Si vous utilisez C ++ et l'API Windows, vous pouvez utiliser l'une des méthodes suivantes FindWindow, où vous pouvez transmettre des paramètres tels que le nom de la classe et / ou le nom de la fenêtre. Ensuite, si vous trouvez une correspondance, quittez simplement votre programme avant même de charger ou de créer une fenêtre.

SourceTurtle
la source