Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: patilanz en 17 Junio 2014, 23:01 pm



Título: Evento logout windows sin ventana
Publicado por: patilanz en 17 Junio 2014, 23:01 pm
Hola hice un programa que me diga cuanto tiempo he estado sin encender el pc. Funciona pero creo que no es la mejor forma de hacer se. Por ejemplo tengo esto:

Código
  1. while(1){
  2. Sleep(1000*60);
  3. refreshTime();
  4. }
  5. void refreshTime(){
  6. HKEY clave;
  7. RegOpenKey(HKEY_CURRENT_USER,"Software\\first logout",&clave);
  8. time_t c_time=time(0);
  9. char save[256];
  10. _itoa_s(c_time,save,10);
  11. int size=sizeof(save);
  12. RegSetValueEx(clave,"time",0,REG_SZ,(BYTE *)&save,sizeof(save));
  13. }

Cambia el ultimo tiempo con el pc encendido cada 1m. Lo hago asi porque no se como hacer el evento de windows shutdown. Ya se que se envía a la cola de mensajes pero si no tengo ventana no tengo cola y no se crear la.

Luego al mostrar un messagebox con el tiempo preparo un string y le agrego el tiempo de una forma por lo menos a mi me parece rara. El resto del código:

Código
  1. int WINAPI WinMain(HINSTANCE instance,HINSTANCE,LPSTR,int){
  2. HKEY clave;
  3. RegCreateKey(HKEY_CURRENT_USER,"Software\\first logout",&clave);
  4. int result;
  5. char *test=0;
  6. if(RegGetValue(clave,"","created",RRF_RT_ANY,0,test,0)!=ERROR_SUCCESS){
  7. //First load
  8. char dir[MAX_PATH];
  9. GetWindowsDirectory(dir,sizeof(dir));
  10. HMODULE handle = GetModuleHandle(0);
  11. TCHAR fileName[256];
  12. GetModuleFileName(handle,fileName,sizeof(fileName));
  13. strcat_s(dir,"\\System32\\first_logout.exe");
  14. Wow64DisableWow64FsRedirection(0);
  15. CopyFile(fileName,dir,0);
  16. RegSetValueEx(clave,"created",0,REG_SZ,(BYTE *)"1",sizeof(dir));
  17.  
  18. RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&clave);
  19. RegSetValueEx(clave,"first logout",0,REG_SZ,(LPBYTE)dir,sizeof(dir));
  20. Wow64EnableWow64FsRedirection(0);
  21. refreshTime();
  22. }else{
  23. BYTE save[512];
  24. time_t t=0;
  25. DWORD size;
  26. int result2=RegQueryValueEx(clave,"time",0,0,save,&size);
  27. t=atoi((char*)save);
  28. time_t st=difftime(time(0),t);
  29. tm rt;
  30. gmtime_s(&rt,&st);
  31. string result;
  32. char add[256];
  33.  
  34. result.append("horas: ");
  35. _itoa_s(rt.tm_hour,add,10);
  36. result.append(add);
  37. result.append(" || minutos: ");
  38. _itoa_s(rt.tm_min,add,10);
  39. result.append(add);
  40. result.append(" || secundos: ");
  41. _itoa_s(rt.tm_sec,add,10);
  42. result.append(add);
  43. MessageBox(0,result.c_str(),"The time after first logout",MB_ICONINFORMATION);
  44.  
  45. }
  46. while(1){
  47. Sleep(1000*60);
  48. refreshTime();
  49. }
  50. }


Me podéis dar algunos consejos de como lo podría mejorar ?

Gracias


Título: Re: Evento logout windows sin ventana
Publicado por: daryo en 18 Junio 2014, 01:20 am
aca hay un tuto de creacion de ventanas en windows
http://www.portalhacker.net/b18/tutorial-uso-apis-windows-para-crear-entorno-grafico/100744/


Título: Re: Evento logout windows sin ventana
Publicado por: patilanz en 18 Junio 2014, 10:45 am
Yo se como crear una ventana en windows y luego anadir la cola de mensajes pero quiero tener la cola de mensajes sin la ventana porque quiero detectar cuando se va cerrar el windows.


Título: Re: Evento logout windows sin ventana
Publicado por: Eternal Idol en 18 Junio 2014, 10:55 am
Busca SetConsoleCtrlHandler en la MSDN.


Título: Re: Evento logout windows sin ventana
Publicado por: eferion en 18 Junio 2014, 10:58 am
Y no es más sencillo leer la fecha y hora en la que se ha apagado el equipo??

HKLM\System\CurrentControlSet\Control\Windows -> ShutdownTime

La clave está en formato FILETIME. Puedes convertirlo a formato time_t con una función tal que:

Código
  1. time_t filetimeToTimet(FILETIME *ft)
  2. {
  3.  ULARGE_INTEGER ull;
  4.  ull.LowPart = ft->dwLowDateTime;
  5.  ull.HighPart = ft->dwHighDateTime;
  6.  return ull.QuadPart / 10000000ULL - 11644473600ULL;
  7. }


Título: Re: Evento logout windows sin ventana
Publicado por: patilanz en 18 Junio 2014, 13:22 pm
eferion no sabia que windows guarda el tiempo. Lo he encontrado en el registro pero no entiendo tu funciona de convertir el FILETIME. Me la puedes explicar ?

Y una cosa mas, si el pc se apaga inesperadamente por ejemplo si se queda sin corriente windows lo guarda correctamente?


Título: Re: Evento logout windows sin ventana
Publicado por: eferion en 18 Junio 2014, 13:56 pm
eferion no sabia que windows guarda el tiempo. Lo he encontrado en el registro pero no entiendo tu funciona de convertir el FILETIME. Me la puedes explicar ?

¿No lo entiendes o no funciona?

Si la opción buena es que no entiendes el código, tienes que saber que:

  • FILETIME indica el tiempo que ha pasado desde el 1 de Enero de 1601 en intervalos de 100 nanosegundos.
  • time_t indica el tiempo que ha pasado desde el 1 de Enero de 1970 en intervalos de 1 segundo.

Lo que hace al función es realizar la conversión entre estas dos escalas de tiempo (se asume que la fecha de apagado que va a figurar en el registro no es anterior a 1970 ;))

Y una cosa mas, si el pc se apaga inesperadamente por ejemplo si se queda sin corriente windows lo guarda correctamente?

Si se va la corriente no hay sistema sin batería que te vaya a registrar la hora exacta en la que ésto ha sucedido... y Windows no es una excepción. Lo que sucede es que tener una aplicación residente actualizando un registro en disco para poder saber en qué momento se ha ido la luz es algo cuanto menos extraño.

Este caso, desde mi punto de vista, se debería tratar de otra manera: Le acoplas un SAI al pc, conectas el cable de datos del SAI al pc y lo configuras para que el PC se apague automáticamente cuando el flujo eléctrico falle.


Título: Re: Evento logout windows sin ventana
Publicado por: daryo en 18 Junio 2014, 15:00 pm
Busca SetConsoleCtrlHandler en la MSDN.
http://www.codeproject.com/Articles/2357/Console-Event-Handling
mas claro imposible.

 por cierto es dificil entenderte no te lo tomes a mal pero cuida tu redaccion.



Título: Re: Evento logout windows sin ventana
Publicado por: Eternal Idol en 18 Junio 2014, 15:09 pm
http://www.codeproject.com/Articles/2357/Console-Event-Handling
mas claro imposible.

Es posible, la idea era que buscara informacion (la MSDN es la referencia oficial) una vez que supiera que funcion de la API usar.

por cierto es dificil entenderte no te lo tomes a mal pero cuida tu redaccion.

¿Me estabas hablando a mi? Lo digo por la cita ...


Título: Re: Evento logout windows sin ventana
Publicado por: daryo en 18 Junio 2014, 15:12 pm
¿Me estabas hablando a mi? Lo digo por la cita ...
no a  patilanz


Título: Re: Evento logout windows sin ventana
Publicado por: Eternal Idol en 18 Junio 2014, 15:32 pm
no a  patilanz

Bueno, ya sabes, la proxima vez por favor cita a quien le respondes o pone su nombre de usuario, asi nos entedemos mejor todos.