[m][SRC][Semaforos!] Alternativa a CreateMutex

Iniciado por Karcrack, 16 Marzo 2010, 15:58 PM

0 Miembros y 2 Visitantes están viendo este tema.

Karcrack

Ya puse una alternativa hace un tiempo:
http://foro.elhacker.net/programacion_vb/srcmaltmutexbas_alternativa_a_createmutex-t243771.0.html

Pues aqui va otra trabajando con Semaforos :P
Código (vb) [Seleccionar]
Option Explicit
'KERNEL32
Private Declare Function CreateSemaphoreW Lib "kernel32.dll" (ByVal lpSemaphoreAttributes As Long, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As Long) As Long

Private Const ERROR_ALREADY_EXISTS  As Long = 183&

Public Function bWasIOpened(ByVal lpName As String) As Boolean
    bWasIOpened = (CreateSemaphoreW(0&, 0&, 1&, StrPtr(lpName)) > 0) And (Err.LastDllError = ERROR_ALREADY_EXISTS)
End Function

Minimalista, como a mi me gusta >:D

Bueno, para que no sepa para que sirve esto lo explico, es bastante facil. Sirve para que no hayan dos instancias de nuestra aplicacion ejecutandose simultaneamente...
Una mejor explicacion de nuestro amigo MadAntrax :P
Cita de: ||MadAntrax|| en 19 Mayo 2007, 17:33 PM
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 (vb) [Seleccionar]
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).

Ejemplo de uso del code:
Código (vb) [Seleccionar]
Private Sub Form_Load()
    If bWasIOpened("Cualquier_Cosa") = True Then End
End Sub


Nota:Probar solo compilado.

Saludos :D

Hasseds

If App.PrevInstance = True Or App.EXEName <> "Project1" Then End

:silbar:
Sergio Desanti

ssccaann43 ©

Jajaja XD...

Karcrack como dice cobein... Sos un capo...! Me gustó este code...! ::D
- Miguel Núñez
Todos tenemos derechos a ser estupidos, pero algunos abusan de ese privilegio...
"I like ^TiFa^"

Karcrack

Cita de: Hasseds en 16 Marzo 2010, 16:22 PM
If App.PrevInstance = True Or App.EXEName <> "Project1" Then End

:silbar:

Creo que no has leido la cita que he hecho a MadAntrax...
Si se renombra el fichero y se vuelve a ejecutar el proceso eso no sirve para nada :)


Cita de: ssccaann43 en 16 Marzo 2010, 16:24 PM
Jajaja XD...

Karcrack como dice cobein... Sos un capo...! Me gustó este code...! ::D
Gracias :-[ :xD :xD

Hasseds

Cita de: ssccaann43 en 16 Marzo 2010, 16:24 PM
Jajaja XD...

Karcrack como dice cobein... Sos un capo...! Me gustó este code...! ::D

+1 , tambien me gustó el code

Cita de: Karcrack en 16 Marzo 2010, 16:24 PM
Si se renombra el fichero y se vuelve a ejecutar el proceso eso no sirve para nada :)

Como que no sirve, si renombras (en la misma carpeta o ya está corriendo  no hay segunda instancia
PD: y app.path en el caso que se renombre en otra carpeta

Sergio Desanti

Karcrack

Cita de: Hasseds en 16 Marzo 2010, 16:33 PM
Como que no sirve, si renombras (en la misma carpeta o ya está corriendo  no hay segunda instancia
PD: y app.path en el caso que se renombre en otra carpeta
1- No es buena idea 'hardcodear' un nombre (de carpeta o fichero, da igual), ya que eso es facilmente modificable...
2- Prueba a usar el metodo de app.PrevInstance haciendo esto:
Compila el ejecutable como "Proyecto1.exe" ejecutalo, ira sin problemas... copia el "Proyecto1.exe" a "Proyecto2.exe" y abrelo... veras que hay dos instancias de la misma aplicacion...

Hasseds

Cita de: Karcrack en 16 Marzo 2010, 16:38 PM
Cita de: Hasseds en 16 Marzo 2010, 16:33 PM
Como que no sirve, si renombras (en la misma carpeta o ya está corriendo  no hay segunda instancia
PD: y app.path en el caso que se renombre en otra carpeta
1- No es buena idea 'hardcodear' un nombre (de carpeta o fichero, da igual), ya que eso es facilmente modificable...
2- Prueba a usar el metodo de app.PrevInstance haciendo esto:
Compila el ejecutable como "Proyecto1.exe" ejecutalo, ira sin problemas... copia el "Proyecto1.exe" a "Proyecto2.exe" y abrelo... veras que hay dos instancias de la misma aplicacion...


If App.PrevInstance = True Or App.EXEName <> "Proyecto1" Then End

como va a abrir Proyecto2 si no es = a Proyecto1



Sergio Desanti

Karcrack

Cita de: Hasseds en 16 Marzo 2010, 16:45 PM
If App.PrevInstance = True Or App.EXEName <> "Proyecto1" Then End

como va a abrir Proyecto2 si no es = a Proyecto1
Si, si, mientras uses esa condicion al cambiar el nombre se cerrará... pero te digo que no es buena idea, porque si cambias el nombre al EXE original... es decir, cambias el nombre al "Proyecto1" por incluso "PROYECTO1" dejara de ir.... Por eso no es buena idea :xD O si lo pusieses en un AutoExtraible del WinRar tampoco iria, porque a no ser que digas lo contrario el Winrar pone nombres aleatorios :D

Sm0kes

hey genial Karcrack lo tomare como alternativa vere que otros metodos habra me has motivado xD... Salu2 y thankz ;)

cobein

Muy bueno Karcrack =D

@Hasseds, todo eso que pusiste se puede "saltar" por ejemplo copiando la app a otra unidad, mismo nombre etc y va a correr. Digamos que los semaforos o mutex son alternativas mas "globales"
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.