Cambiar velocidad del protector de pantalla 3D Flying Objects de windows 95
Queriendo incluir en mi sistema operativo protectores de pantalla viejos de windows 95, he notado que algunos han envejecido mal en cuanto a velocidad, probablemente debido a que fueron diseñados para procesadores mucho menos potentes que los actuales.
En muchos casos, esto se puede resolver cambiando la velocidad en la configuración. Sin embargo, este no es el caso de 3D Flying Objects. En este caso, me las ingenié para hacerle ingeniería inversa, que al final voy a explicar. Pero a continuacion dejo un tutorial que funciona con un editor hexadecimal convencional, lo cual en mi opinion es mas confiable y util para ustedes que pasar un script que haga ese trabajo, o una version parcheada.
Las pruebas fueron hechas en linux, pero deberia de funcionar bien en windows.
Tutorial
1. Abrir el protector de pantalla con un editor hexadecimal.
2. Ir al offset 1b3c0. Los primeros 4 valores hexadecimales son los milisegundos que dura en pantalla cada fotograma.
3. Para obtener la duracion del fotograma en milisegundos a partir de los fps que desees, hay que hacer la division 1000 / fps (1000 es el numero de milisegundos en un segundo), redondear o truncar el valor (no se aceptan decimales) y convertir en hexadecimal. Voy a llamar al resultado, delta-time. delta-time debe escribirse desde la izquierda, y rellenar con ceros hasta reemplazar los primeros cuatro valores.
Obviamente, esto no producirá exactamente los fps deseados, pero el margen de error debería de ser muy pequeño.
A continuación, dejaré una imagen de ejemplo. También estoy considerando agregar un convertidor a esta entrada, pero tengo que hacer pruebas con la misma ya publicada, debido a que la vista previa es basicamente una imagen estatica.
4. Guardar los cambios
Detras de camaras
Los protectores de pantalla son, en realidad, exes. Esto permite hacerles ingeniería inversa con herramientas como ghidra (la que usé yo). Los protectores de pantalla utilizan la función SetTimer de la api de windows, para llamar a la función encargada de actualizar el estado actual de los mismos.
Localizar esta seccion del codigo es tan facil como ver en que partes del binario se utiliza SetTimer. Habitualmente, se usará una sola vez.
En el caso de 3D Flying Windows, el delta-time se guarda en una variable global, que ghidra traduce como DAT_0101bdc0, la cual se pasa a SetTimer como tercer argumento, tal y como dice la documentación de Windows
El timer está puesto en 16ms. Esto es aproximadamente 60 fps, algo que los procesadores viejos nunca alcanzaban. Es posible, segun la ia, y me parece que tiene sentido, que esto fuera un intento de los programadores de decir "actualizá el estado del protector lo antes posible". Esto también explicaría por que envejeció tan mal.
Lo que se hace en el tutorial antes mencionado, es modificar el valor de esta variable. Obtuve la posicion en el binario para que se pueda editar con un editor hexadecimal.
Comentarios
Publicar un comentario