Hay que tener en cuenta que cuando un proceso se ejecuta, el sistema operativo le asigna un espacio de direcciones y lo añade a una tabla de procesos. El espacio de direcciones de cada proceso contiene las instrucciones y datos del programa, además tiene una pila que lleva la cuenta de las llamadas a procedimientos. En el siguiente script de ejemplo podemos ver información sobre la memoria de ese proceso que se está ejecutando y que es PowerShell, en él que se almacenan valores en variables (datos del programa).
1 2 3 4 5 6 7 8 9 10 11 12 |
# StringToHGlobalAnsi: Copia el contenido de un String administrado en la memoria no administrada, convirtiéndolo en formato ANSI mientras realiza la copia. # PtrToStringAnsi: Asigna un String administrado y copia en él total o parcialmente una cadena ANSI (en Windows) o UTF-8 (en Unix) no administrada. $a = "hola" # Dirección del primer carácter de la cadena no administrada. Dirección, en memoria no administrada, donde se copió la cadena o 0 si $a es null. $ptra = [Runtime.InteropServices.Marshal]::StringToHGlobalAnsi($a); $ptra 1..10000 | %{ # Obtener el valor de una variable en base a una dirección Ptr más un variable contador [Runtime.InteropServices.Marshal]::PtrToStringAnsi($ptra.ToInt64()+$_) } |