Como um jogo pode impedir que as pessoas executem várias instâncias por si só?

15

O Starcraft II me impede de executar várias instâncias, mas se eu executar a segunda instância na área restrita no Sandboxie , ela funcionará. O que pode explicar isso?

Como posso replicar esse comportamento para meus próprios jogos?

Brandon
fonte

Respostas:

15

Além do Starcraft 2, a resposta geral é: Adquira (e bloqueie, se a aquisição em si já não for equivalente a bloquear) um recurso específico do sistema operacional. Saia do jogo se a aquisição / bloqueio falhar. Exemplos de tais recursos são:

  1. Portas TCP ou UDP específicas.
  2. Bloqueios mutuamente exclusivos ("mutexes") ou semáforos (esses dois geralmente estão relacionados no nível do SO)
  3. Arquivos (os arquivos de log geralmente são a escolha mais óbvia)

No topo, o mais problemático para o cliente, o hardware especializado que (às vezes necessariamente como alguns componentes de controle robótico) pode ser usado exclusivamente exclusivamente por um único encadeamento também pode ser usado dessa maneira.

Martin Sojka
fonte
5
Também pode ser útil ter em mente as possíveis complicações de segurança: " Um programa de instância única é sua própria negação de serviço ".
EnoughTea
Como funciona no sandboxie, provavelmente não é o primeiro. 2 ou 3 são boas possibilidades, dando uma olhada em quais arquivos estão abertos para seus processos provavelmente o identificarão.
Doug-W
3
@ Doug-W Não vejo como ele funciona no sandboxie exclui o número 1.
AttackingHobo
@AttackingHobo, a menos que eu não entenda a complexidade do sandboxie, o fato de uma porta estar ligada fora do sandboxie não o impediria de vincular dentro? Ou o sandboxie fornece uma interface virtual para cada programa em execução dentro dele?
Doug-W
@Vigil No que me diz respeito, você pode citar Raymond Chen o dia todo, mas não adicione erros gramaticais às suas citações. : P (copiar Just / colá-los em seu lugar.)
hheimbuerger
4

Eu recomendo a abordagem mutex, mas:

Outro método frequentemente usado é simplesmente verificar se outro processo com o mesmo nome está em execução.

A vantagem é que é ridiculamente fácil - você não precisa se preocupar com permissões de arquivo ou saber o que é um mutex. A desvantagem é que você receberá um falso positivo se um programa diferente chamado starcraft2.exeestiver em execução na máquina.

BlueRaja - Danny Pflughoeft
fonte
2
Hehe, ou se o usuário decidir renomear o programa.
Brandon
@ Jonathan: Então não codifique o nome do executável ...
BlueRaja - Danny Pflughoeft
11
Eu quis dizer mais como, e se o usuário copiar o programa e renomeá-lo e executá-lo duas vezes?
Brandon
3

Se você estiver usando C ++ e a API do Windows, é possível, usando uma maneira FindWindow, transmitir parâmetros como o nome da classe e / ou o nome da janela. Então, se você encontrar uma correspondência, basta sair do seu programa antes mesmo de carregar ou criar uma janela.

SourceTurtle
fonte