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?

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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.