elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [aporte]codigo c solo permitir una ejecucion a la vez
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [aporte]codigo c solo permitir una ejecucion a la vez  (Leído 4,511 veces)
daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
[aporte]codigo c solo permitir una ejecucion a la vez
« en: 9 Junio 2013, 16:35 pm »

eso para que el programa se ejecute correctamente ponganle de nombre programa.exe y ejecutenlo fuera del ide:
la idea es que el proceso no se pueda ejecutar dos veces   :P

Código
  1. /* nota para que funcione correctamente se debe ejecutar desde fuera de un ide */
  2. #include <windows.h>
  3. #include <stdio.h>
  4.  
  5. void instalar()
  6. {
  7.    /* aca se supone copia el programa en directorio fijo asi programa.exe siempre sera el mismo y no cambiara el nombre*/
  8.  
  9. }
  10.  
  11. bool bloquear()
  12. {
  13.    HANDLE hFile = CreateFileA("programa.exe", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);  // se abre el archivo en modo lectura
  14.    OVERLAPPED overlapped;
  15.    memset(&overlapped, 0, sizeof(overlapped));
  16.    const int lockSize = 10;
  17.    if (!LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY, 0, lockSize, 0, &overlapped))//lo que hace es bloquear  un archivo  para que solo un programa pueda abrirlo; se bloquea el mismo programa en ejecucion en caso de que ya esta bloqueado se asume que ya esta  en ejecucion
  18.    {
  19.        return true;
  20.    }
  21.    else
  22.    {
  23.        printf("[+]bloqueado\n");
  24.        return false;
  25.    }
  26. }
  27.  
  28.  
  29. int main()
  30. {
  31.    if(!bloquear()) // si lo logra bloquear entonces se ejecuta
  32.    {
  33.    while(true)
  34.     {
  35.        printf("ejecutandose\n");
  36.        Sleep(1000);
  37.     }
  38.    }
  39.    else // si no cierra el proceso
  40.    {
  41.        printf("solo se permite una ejecucion del programa");
  42.        Sleep(2000);
  43.        return 0;
  44.    }
  45.  
  46.  
  47. return 0;
  48. }
  49.  
  50.  
  51.  


« Última modificación: 9 Junio 2013, 16:38 pm por daryo » En línea

buenas
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #1 en: 9 Junio 2013, 18:41 pm »

No es más fácil:

Código
  1. /* nota para que funcione correctamente se debe ejecutar desde fuera de un ide */
  2. #include <windows.h>
  3. #include <stdio.h>
  4.  
  5.  
  6. int main()
  7. {
  8.    // Abro el archivo, no permito otros accesos de lectura/escritura/borrado
  9.  
  10.    CreateFileA("programa.exe", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
  11.  
  12.    Sleep(10000); // Duemo 10 segundos
  13.  
  14.    return 0;
  15. }
  16.  

Por cierto la ruta del programa se le pasa como argumento al main. Puedes intentar obtener el nombre del programa ahí  ;)


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
aguml


Desconectado Desconectado

Mensajes: 378



Ver Perfil
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #2 en: 9 Junio 2013, 23:35 pm »

¿createfile para ver si se esta ejecutando un proceso? ¿Pero eso lo que haria no seria crear un archivo o abrirlo y darnos el handle? Yo para eso uso dos formas diferentes, la primera lo que haria es buscar la ventana con findwindow y si la encuentra es que ya se esta ejecutando. El segundo metodo lo que haria es un snapshop de todos los procesos que esten ejecutandose y comparando el nombre de mi proceso con el que lea y si coincide pues esta ya ejecutandose.
En línea

daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #3 en: 9 Junio 2013, 23:56 pm »


Por cierto la ruta del programa se le pasa como argumento al main. Puedes intentar obtener el nombre del programa ahí  ;)

si todo eso lo se , pero tu programa no funcionaria como deberia porque con LockFileEx bloqueo el acceso a los demas programas  y no solo en escritura como es lo comun sino tambien en lectura con el parametro LOCKFILE_EXCLUSIVE_LOCK  y de paso devuelve un booleano y en caso de no poderse bloquear pues otro proceso lo tiene abierto.

lo del main no funcionaria porque en caso de que el programa tenga otra ubicacion se bloquearia a si mismo y el otro programa tambien se bloquearia a si mismo pero eso significaria  que tendria por cada copia del programa una posibilidad de ejecucion

¿createfile para ver si se esta ejecutando un proceso? ¿Pero eso lo que haria no seria crear un archivo o abrirlo y darnos el handle? Yo para eso uso dos formas diferentes, la primera lo que haria es buscar la ventana con findwindow y si la encuentra es que ya se esta ejecutando. El segundo metodo lo que haria es un snapshop de todos los procesos que esten ejecutandose y comparando el nombre de mi proceso con el que lea y si coincide pues esta ya ejecutandose.
no es create file es lockfilex lo que sucede es que antes de bloquear el acceso tienes que abrir el archivo. lo de el nombre de la ventana esta bien pero estoy usando consola y no le estoy dando titulo a los programas.

el segundo metodo creo que alerta mas a los antivirus por eso preferi hacerlo asi ademas me parecio mas simple  ;D
« Última modificación: 9 Junio 2013, 23:58 pm por daryo » En línea

buenas
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #4 en: 10 Junio 2013, 00:09 am »

¿createfile para ver si se esta ejecutando un proceso? ¿Pero eso lo que haria no seria crear un archivo o abrirlo y darnos el handle?
Sí, pero createfile nos permite poner políticas a la hora de compartir el archivo. Podemos compartir la lectura, la escritura y los borrados.

En este caso no comparto nada, como no puedes leer el archivo no lo puedes ejecutar.

si todo eso lo se , pero tu programa no funcionaria como deberia porque con LockFileEx bloqueo el acceso a los demas programas  y no solo en escritura como es lo comun sino tambien en lectura con el parametro LOCKFILE_EXCLUSIVE_LOCK  y de paso devuelve un booleano y en caso de no poderse bloquear pues otro proceso lo tiene abierto.
Con mi programa también bloqueo el acceso a las demás aplicaciones (¿Como vas a ejecutar un archivo que no puedes leer?).

lo del main no funcionaria porque en caso de que el programa tenga otra ubicacion se bloquearia a si mismo y el otro programa tambien se bloquearia a si mismo pero eso significaria  que tendria por cada copia del programa una posibilidad de ejecucion.
Claro, la idea esque el programa se bloquee a sí mismo. Y luego cuando lo considere oportuno se desbloquee por su cuenta.
« Última modificación: 10 Junio 2013, 00:14 am por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #5 en: 10 Junio 2013, 00:12 am »

Sí, pero createfile nos permite poner políticas a la hora de compartir el archivo. Podemos compartir la lectura, la escritura y los borrados.

En este caso no comparto nada, como no puedes leer el archivo no lo puedes ejecutar.
Con mi programa también bloqueo el acceso a las demás aplicaciones (¿Como vas a ejecutar un archivo que no puedes leer?).
Claro, la idea esque el programa se bloquee a sí mismo. Y luego cuando lo considere oportuno se desbloquee por su cuenta.
algunas pruebas con tu programa  y comento por aca a ver que tal :D
En línea

buenas
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #6 en: 10 Junio 2013, 00:14 am »

algunas pruebas con tu programa  y comento por aca a ver que tal :D
Recuerda que createfile devuelve un HANDLE, si este HANDLE no tiene un valor válido significaría que no se ha podido realizar la operación.

Lo digo porque decías que "LOCKFILE_EXCLUSIVE_LOCK devuelve un booleano en caso de fallo".
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #7 en: 10 Junio 2013, 00:24 am »

Recuerda que createfile devuelve un HANDLE, si este HANDLE no tiene un valor válido significaría que no se ha podido realizar la operación.

Lo digo porque decías que "LOCKFILE_EXCLUSIVE_LOCK devuelve un booleano en caso de fallo".

tu metodo tiene un error curioso estoy subiendo un video a youtube para mostrar xD



el error sucede por lo siguente cuando abro el archivo de forma normal no bloquea la lectura y cualquier programa puede leerlo asi que cuando lo ejecuto desde una copia abre el archivo original solo para leerlo y permite ejecutarse

si abro siempre el original como intenta ejecutarse tambien el os lo toma como escritura por eso ahi si funciona

PD:ya cargo el video  :P
« Última modificación: 10 Junio 2013, 00:31 am por daryo » En línea

buenas
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #8 en: 10 Junio 2013, 01:24 am »

Lamento decírtelo, pero has incumplido tu propia condición. El programa no estaba bloqueado porque como tu mismo dijiste, no funciona si se ejecuta dentro del IDE ya que se ejecuta sin privilegios de administrador.

Voy ha hacer una retruscturación del código:

Código
  1. /* nota para que funcione correctamente se debe ejecutar desde fuera de un ide */
  2. #include <windows.h>
  3. #include <stdio.h>
  4.  
  5.  
  6. int main()
  7. {
  8.    // Abro el archivo, no permito otros accesos de lectura/escritura/borrado
  9.  
  10.    HANDLE Lectura = CreateFileA("programa.exe", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
  11.  
  12.    if (Lectura == INVALID_HANDLE_VALUE)
  13.    {
  14.        printf("No se pudo bloquear el programa");
  15.        return 1;
  16.    }
  17.  
  18.    Sleep(30000); // Duemo 30 segundos
  19.  
  20.    return 0;
  21. }
  22.  

Ahora en caso de que no se pueda bloquear (ya sea porque otro proceso lo esté usando o por falta de permisos) devolverá un mensaje de error.
« Última modificación: 10 Junio 2013, 01:31 am por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
Re: [aporte]codigo c solo permitir una ejecucion a la vez
« Respuesta #9 en: 10 Junio 2013, 01:29 am »

sip tienes razon

gracias  ;D
En línea

buenas
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Aporte]Crear controles en tiempo de Ejecución
Programación Visual Basic
Freeze. 0 2,782 Último mensaje 11 Julio 2007, 15:27 pm
por Freeze.
Permitir SOLO 1 pendrive en XP
Windows
SuEz 2 4,772 Último mensaje 12 Marzo 2011, 18:01 pm
por SuperDraco
[SOLUCIONADO] Permitir solo una coma en un textbox
.NET (C#, VB.NET, ASP)
Eleкtro 4 6,013 Último mensaje 15 Enero 2013, 16:48 pm
por Eleкtro
Permitir solo algunos puertos con iptables
Seguridad
matiasramos 0 2,391 Último mensaje 28 Junio 2013, 22:25 pm
por matiasramos
Permitir iframe solo desde un determinado dominio
Desarrollo Web
lucheano 2 2,085 Último mensaje 2 Mayo 2019, 20:23 pm
por lucheano
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines