Procesos Nativos de Windows
Archivo: src/native_proceso_win.rs (604 líneas)
¿Por qué existe?
Expone a Forja la manipulación de procesos de Windows a bajo nivel: búsqueda de PID por nombre (Toolhelp32), apertura/cierre de handles (OpenProcess/CloseHandle), lectura/escritura de memoria remota (ReadProcessMemory/WriteProcessMemory), obtención de módulos cargados (como client.dll), estado de teclas (GetAsyncKeyState) y ocultar/mostrar la consola (ShowWindow). En plataformas que no son Windows todas las funciones retornan valores por defecto (0, falso o arreglo vacío) para no romper la compilación.
Arquitectura / Estructuras clave
| Componente | Descripción |
|---|---|
PROCESSENTRY32W / MODULEENTRY32W | Estructuras #[repr(C)] de la API Toolhelp32 (wide-char) |
| Declaraciones FFI | OpenProcess, CloseHandle, GetLastError, CreateToolhelp32Snapshot, Process32FirstW/NextW, Module32FirstW/NextW, ReadProcessMemory, WriteProcessMemory, GetAsyncKeyState, GetConsoleWindow, ShowWindow, SetConsoleCtrlHandler |
| Constantes | TH32CS_SNAPPROCESS, TH32CS_SNAPMODULE, TH32CS_SNAPMODULE32, SW_HIDE, SW_SHOW, MAX_PATH, MAX_MODULE_NAME |
ESTADO_RESTAURAR | Mutex<Option<(handle, direccion, byte1, byte2)>>: estado global para restaurar bytes automáticamente al salir |
ESTADO_TECLA_ANTERIOR | Mutex<Option<(vk, presionada)>>: estado anterior de tecla para detección de flanco |
| Helpers | lower_u16, wstr_igual (comparación WCHAR case-insensitive), a_utf16 |
Funciones nativas registradas
Registradas por NativeRegistry::registrar_proceso_win():
| Función | Descripción |
|---|---|
_proceso_obtener_pid(nombre) | Devuelve el PID del primer proceso cuyo ejecutable coincide (case-insensitive), o 0 |
_proceso_abrir_pid(pid, acceso) | Abre el proceso con OpenProcess y devuelve el handle (default: PROCESS_ALL_ACCESS 0x001FFFFF) |
_proceso_ultimo_error() | Devuelve el último código de error (GetLastError) |
_proceso_cerrar(handle) | Cierra el handle con CloseHandle |
_proceso_modulo_base(pid, nombre) | Dirección base de un módulo cargado en el proceso (0 si no existe) |
_proceso_modulo_tamano(pid, nombre) | Tamaño en bytes del módulo (0 si no existe) |
_proceso_leer_bytes(handle, direccion, tamano) | Lee memoria remota en bloques de 1 MB; los bloques fallidos se rellenan con 0 (siempre devuelve tamano elementos; máx. 1 GB) |
_proceso_escribir_bytes(handle, direccion, bytes) | Escribe el arreglo de bytes en memoria remota |
_buscar_firma(bytes, firma, mascara) | Busca un pattern con máscara de comodines (0 = comodín) y devuelve el offset, o -1 |
_tecla_presionada(vk) | Devuelve si la tecla virtual (GetAsyncKeyState, bit 0x8000) está presionada |
_flanco_tecla(vk) | Devuelve verdadero solo en la transición no-presionada → presionada; el estado anterior se guarda en Rust (ESTADO_TECLA_ANTERIOR) |
_consola_ocultar(ocultar) | Oculta (SW_HIDE) o muestra (SW_SHOW) la ventana de consola actual |
_imprimir_stdout(texto) | Imprime a stdout con flush inmediato (el builtin escribir acumula en buffer) |
_restaurar_al_salir(handle, direccion, byte1, byte2) | Registra un handler de Ctrl+C/cierre (SetConsoleCtrlHandler) que restaura los bytes originales al salir |
Restauración automática de bytes
handler_ctrl es un callback extern "system" registrado vía _restaurar_al_salir. Al recibir un evento de cierre, restaura los 2 bytes originales en la dirección guardada con WriteProcessMemory y retorna 0 (FALSE) para dejar que el handler por defecto continúe.
#[cfg(target_os = "windows")] / #[cfg(not(target_os = "windows"))]. En no-Windows devuelven 0, falso o arreglo vacío, lo que mantiene compilable y ejecutable el mismo script en todas las plataformas.