Esta vez sirve para controlar que nuestra aplicación no sea ejecutada 2 veces en un mismo equipo. Algunos pensareis que eso ya se puede hacer con
Código
If App.PrevInstance = True Then End
pero eso no es cierto... si nuestra aplicación se copia en System32 como: programa1.exe y programa2.exe... el usuario podrá ejecutar el programa1.exe y el programa2.exe simultáneamente! Eso puede suponer un problema en el caso de estar programando un troyano o un keylogger (donde lo importante es solo tener una instancia de nuestro malware a la vez).
Si no recuerdo mal, el troyano Bifrost usa esta función para controlar que solo un server.exe esté ejecutándose a la vez en un mismo sistema, y si la memoria no me falla este Mutex se puede personalizar en el EditServer. Bien, como creo yo una función similar en VB, así de simple:
Module1.bas
Código
'Estas sin las API's necesarias para crear y controlar el Mutex Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 'Variable Global que almacena el Handle de nuestro Mutex Private hMutex As Long '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' IsMutexRunning Parametros: ' MutexStr = String ' Cadena de texto única que usaremos para controlar nuestro Mutex ' ' Valor de retorno = Boolean ' Devuelve TRUE si existe el Mutex ' Devuleve FALSE si no encuentra el Mutex '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Function IsMutexRunning(ByVal MutexStr As String) As Boolean hMutex = CreateMutex(0&, 0&, MutexStr) 'Creamos nuestro Mutex único If hMutex = 0 Then 'Si el Handle es 0 es que algo no va bien :S MsgBox "Ha ocurrido un error al intentar crear el Mutex. Es imposible controlar las instancias de este proceso", vbCritical + vbOKOnly, "CreateMutex Error" IsMutexRunning = False Else If WaitForSingleObject(hMutex, 0&) = &H0 Then 'Comprobamos si ya existe ese Handle IsMutexRunning = False 'Si no existe, devolvemos FALSE Else MsgBox "Solo se permite una instancia simultanea de este proceso", vbOKOnly, "CreateMutex" CloseHandle hMutex 'Si existe, cerramos el nuevo Handle IsMutexRunning = True 'Y devolvemos TRUE End If End If End Function
y el el Form1.frm...
Código
Private Sub Form_Load() 'Evitar usar un Mutex superior a 256 carácteres 'Recomiendo usar un Mutex poco común, asi evitamos problemas... If IsMutexRunning("MadAntrax_Mutex[73@]") = True Then End End Sub
Así de simple!! os dejo un proyecto de ejemplo 100% funcional, la descarga esta habilitada solo a usuarios registrados!!
Saludos!!