<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET o no .NET, esa es la cuestión : vista, hardware</title><link>http://geeks.ms/blogs/rfog/archive/tags/vista/hardware/default.aspx</link><description>Etiquetas: vista, hardware</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Cómo salta Windows entre anillos (Modo Kernel y modo Usuario)</title><link>http://geeks.ms/blogs/rfog/archive/2009/11/21/c-243-mo-salta-windows-entre-anillos-modo-kernel-y-modo-usuario.aspx</link><pubDate>Sat, 21 Nov 2009 13:37:03 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:160981</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=160981</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=160981</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2009/11/21/c-243-mo-salta-windows-entre-anillos-modo-kernel-y-modo-usuario.aspx#comments</comments><description>&lt;p align="justify"&gt;Esta semana estamos de fiesta, y es que una de mis pasiones en el desarrollo siempre ha sido verle las tripas a Windows, y a ello vamos. Antes de nada, lo que voy a contar aquí es un resumen del punto &lt;i&gt;System Service Dispatching&lt;/i&gt; del capítulo 3 de &lt;i&gt;Windows Internals &lt;/i&gt;5ª edición, pero es un resumen un poco &lt;i&gt;especial&lt;/i&gt; porque voy a añadir cosas de mi cosecha, como siempre hago, ya que no es cosa de ir parafraseando lo que voy aprendiendo/recordando.&lt;/p&gt;  &lt;p align="justify"&gt;En entradas anteriores, y algunas veces en los foros, he comentado sobre &lt;i&gt;saltos entre anillo 0 y anillo 3&lt;/i&gt;, y aquí voy a explicar de pasada lo que significa. Un microprocesador moderno (y no tan moderno), cuenta con un juego de instrucciones en cierta medida especiales, instrucciones que son necesarias para configurar el hardware y el propio funcionamiento del software. Hablamos aquí de las interrupciones y toda su parafernalia asociada, del control de la memoria virtual, del acceso directo a hardware (es decir, escribir o leer en una dirección de memoria o en un puerto en el que no hay tal, sino alguna electrónica que debe reaccionar en base a dicha lectura o escritura), etc.&lt;/p&gt;  &lt;p align="justify"&gt;Esas instrucciones son peligrosas de usar, y en general no deben estar disponibles para los programas normales, ya que entonces un error podría llevar a la caída total del sistema o incluso a la rotura de algún elemento electrónico.&lt;/p&gt;  &lt;p align="justify"&gt;Es decir, que podríamos dividir el juego de instrucciones de un microprocesador en dos grandes grupos: aquellas que no son necesarias para que un programa funcione normalmente y las que, si se usan de forma incorrecta, pueden terminar armando un buen pirifostio.&lt;/p&gt;  &lt;p align="justify"&gt;Pues básicamente eso son los anillos 0 y 3. En el 0 están las instrucciones peligrosas, en el 3 las que cualquier programa puede usar, y si un programa normal utiliza una del cero, generará una excepción (¿De qué me sonará esto?) que será capturada por el sistema operativo y manejada a su antojo. Aunque realmente no es del todo así, para nuestro propósito es suficiente. &lt;/p&gt;  &lt;p align="justify"&gt;(Si os dais cuenta, he hablado del 0 y del 3, pero también hay un 1 y un 2, que Windows no utiliza. Digamos que la separación de las instrucciones en estos distintos niveles permiten una serie de facilidades a la hora de construir software de sistemas, ya sean sistemas operativos o aplicaciones que vayan a correr en un microprocesador con estas características, lo que ocurre es que Windows aprovecha estos niveles únicamente de una sola forma, que llama modo usuario y modo kernel).&lt;/p&gt;  &lt;p align="justify"&gt;Pues bien, el &lt;i&gt;kelmer&lt;/i&gt;, uis, perdón, el kernel, la mayoría de los drivers, y el motor gráfico (que fue ampliamente criticado en su momento pero que permitió que NT 4.0 pudiera ser usado en ordenadores no tan potentes) se ejecutan en el anillo 0, y los demás subsistemas (incluido Win32) en el 3. De esta forma un programador chapucero (o un compilador) sólo podrá tumbar su programa y nada más. Recordemos los días de Windows 3.x y DOS en los cuales tumbar por completo el sistema era tan fácil como ejecutar dos instrucciones de ensamblador seguidas: cli y luego sti, o al revés, ya no me acuerdo.&lt;/p&gt;  &lt;p align="justify"&gt;Una aplicación llama a una función, que debe terminar siendo ejecutada dentro del kernel (por ejemplo, abrir y leer de un fichero, cosa que necesita que los drivers de disco hagan trabajo de bajo nivel sobre la controladora y sobre el propio disco). Pongamos que nuestro programa llama a &lt;i&gt;WriteFile()&lt;/i&gt;, y nos da igual que sea una aplicación .NET llamando a sus clases, ya que terminará en esa función. Esa función, que está en Kernel32.dll y pertenece al subsistema Win32, llamará a NtWriteFile(), que está en Ntdll.dll y no pertenece a ningún subsistema, sino que está disponible para cualquiera de ellos. Esta función llamará entonces a KiSystemService(), que está en Ntoskrnl.exe y se ejecuta en el anillo 0 en lugar del 3. Finalmente, esta última función hará lo que tenga que hacer llamando a otras funciones del kernel y de los drivers hasta que al final devolverá el resultado hacia atrás hasta nuestra aplicación.&lt;/p&gt;  &lt;p align="justify"&gt;Fácil, ¿no? Pues no, porque si nuestra aplicación hubiera llamado a WriteFile() con algún parámetro mal que fuera crítico (y se me ocurre pasar un valor aleatorio diferente de cero al handle del fichero sobre el que queremos escribir), lo más seguro es que termináramos en una pantalla azul (como más o menos ocurría en Windows 3.x y a veces en Windows 9x). Además, es muy posible que durante el procesamiento de la función, se salte varias veces entre el modo kernel y el user por necesidades del guión.&lt;/p&gt;  &lt;p align="justify"&gt;Pero todavía hay más, ya que no hemos tenido en cuenta que el controlador de tiempos y de procesos puede cortar en cualquier momento esa llamada para atender otros procesos o incluso hilos de nuestra aplicación. Vamos, que no es fácil ni de lejos.&lt;/p&gt;  &lt;p align="justify"&gt;¿Cómo se produce el salto entre el anillo 3 y el 0, que hemos descrito más arriba? Pues depende del procesador que estemos usando. En la época de Windows 9x (y de la parte en modo protegido de Windows 3.x cuando la había), y para micros antiguos, NtWriteFile(), después de verificar que los parámetros recibidos son correctos, coloca en varios registros del procesador lo necesario, y ejecuta la instrucción &lt;i&gt;int 0x2e&lt;/i&gt;, que genera una excepción si se hace desde el anillo 3. Esta excepción es recogida por el Kernel, que mediante los parámetros que hay en los registros determina si es una petición válida (y si no lo es protestará) y la procesará mediante la ejecución de la función correspondiente situada en un array de punteros a función que se llama &lt;i&gt;System Service Dispatch Table&lt;/i&gt;, de las que creo que hay varias. Básicamente, lo que está haciendo es recibir un índice que se corresponde a una posición dentro del array de punteros, y como nos equivoquemos con esto la hemos cagado a base de bien, y es por eso por lo que antes del salto entre anillos se verifican los parámetros. El retorno al anillo 3 se produce con la ejecución de la instrucción &lt;i&gt;iretd.&lt;/i&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En micros Intel más modernos, el salto se hace mediante la instrucción &lt;i&gt;sysenter&lt;/i&gt; y la vuelta mediante &lt;i&gt;sysexit&lt;/i&gt; (o &lt;i&gt;iret&lt;/i&gt; si estamos en modo depuración). En un AMD las instrucciones son &lt;i&gt;syscall&lt;/i&gt; y &lt;i&gt;sysret&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Y finalmente, en micros de 64 bits con la arquitectura x64 las instrucciones son las mismas que en el AMD (por que fueron los primeros en implementarla) y en la I64, &lt;i&gt;epc&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Si os dais cuenta, dependiendo del microprocesador se hace de una u otra forma, lo que puede ser un serio quebradero de cabeza. Lo que hace Windows al arrancar un sistema de 32 bits es instalar la instrucción correcta en una posición de memoria y juego ejecutar sobre ella, con lo que a lo anterior añadimos un nuevo nivel de indirección. &lt;/p&gt;  &lt;p align="justify"&gt;La secuencia completa de paso del anillo 3 al 0 consiste, más o menos, en lo siguiente: primero se verifican los parámetros recibidos de la forma más completa posible, luego se ejecuta la instrucción que hay en cierta posición de memoria, que a su vez generará una excepción, que será controlada por el sistema operativo, que mirará si los parámetros son correctos, y si lo son volverá a saltar sobre un puntero a puntero a función, y finalmente lo que haya allí hará el trabajo. &lt;/p&gt;  &lt;p align="justify"&gt;Eso para un solo salto. Imaginaros cuántos son necesarios para que nuestro programa, y el sistema operativo funcione. Y no hemos hablado de que en cada una de esos pasos es necesario que la pila se guarde o se recupere, y que los datos deben ser copiados desde la pila de modo user a la de modo kernel para evitar que la aplicación pueda modificarlos en medio de una operación interna…&lt;/p&gt;  &lt;p align="justify"&gt;En un sistema x64 la operación es algo más sencilla porque la instrucción de salto es siempre la misma y no es necesaria la indirección extra sobre la instrucción ya que da igual que el microprocesador sea un Intel o un AMD.&lt;/p&gt;  &lt;p align="justify"&gt;Esto quizás te presente una duda en el caso de equipos de 32 bits: ¿por qué no está cableada dicha instrucción y simplemente a la hora de instalar Windows o de arrancarlo, el cargador pone en memoria el juego de DLLs correcto? Pues realmente no tengo ni idea, lo que sí tengo claro es que en ese caso Windows debería contar con al menos 4 juegos completos de DLLs y o bien elegir el necesario durante la instalación o casi cuadriplicar el espacio ocupado en disco. Lo que sí es cierto es que si se hubiera hecho así, el Windows de 32 bits funcionaría sensiblemente más rápido… o no.&lt;/p&gt;  &lt;p align="justify"&gt;Sólo nos queda ver, por mor de completitud, cómo funciona internamente el kernel sobre sí mismo. Supongamos por un momento que el kernel necesita acceder a la funcionalidad que hay en WriteFile(), pero en lugar de llamar a esta función directamente, lo que hace es llamar directamente a la rutina a la que se está apuntando en la tabla SSDT y santas pascuas, ya que en principio no se necesita verificar los parámetros que se suponen son correctos, y aparte de eso ya estamos en el anillo 0. No obstante, un driver no puede hacerlo así porque Microsoft no se fía de ellos, y es por ello que existen unas funciones que tiene como prefijo Zw y que son las que llamarán a su homónimo apuntado por la SSDT después de realizar las verificaciones –menos que si se llamara desde el anillo 3- oportunas.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160981" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/vista/default.aspx">vista</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/libros/default.aspx">libros</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx">Win32</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+7/default.aspx">Windows 7</category></item><item><title>Eligiendo qué hacer cuando pete nuestra aplicación</title><link>http://geeks.ms/blogs/rfog/archive/2009/11/19/eligiendo-qu-233-hacer-cuando-pete-nuestra-aplicaci-243-n.aspx</link><pubDate>Thu, 19 Nov 2009 17:53:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:160861</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=160861</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=160861</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2009/11/19/eligiendo-qu-233-hacer-cuando-pete-nuestra-aplicaci-243-n.aspx#comments</comments><description>&lt;p align="justify"&gt;En la &lt;a href="http://geeks.ms/blogs/rfog/archive/2009/11/18/de-excepciones-del-depurador-de-windows-y-de-visual-studio.aspx"&gt;entrada anterior&lt;/a&gt; expliqu&amp;eacute; qu&amp;eacute; ocurre cuando una aplicaci&amp;oacute;n peta y se genera una excepci&amp;oacute;n no controlada (o controlada pero relanzada), y en esta voy a explicar c&amp;oacute;mo podemos, desde nuestro propio programa, configurar el modo en que eso ocurre. Pero antes una introducci&amp;oacute;n.&lt;/p&gt;
&lt;p align="justify"&gt;En algunos lados he dicho que las excepciones son caras. Con eso no me refiero a que cuesten dinero, sino a que es un tipo de caracter&amp;iacute;stica que resulta muy complicada de procesar y que a veces requiere de bastante tiempo de proceso. Cuando se dispara una interrupci&amp;oacute;n en una aplicaci&amp;oacute;n, sobre todo si ocurre en el lado del kernel, &amp;eacute;ste tiene que entrar y salir varias veces entre su modo y el de usuario, operaciones que no son baratas (de nuevo no en dinero, aunque lo mismo en su servidor en producci&amp;oacute;n s&amp;iacute;) ya que significan saltar entre los anillos 0 y 3 del procesador. Aparte de eso, se debe recorrer la pila (a ambos lados de los anillos) para ir buscando el controlador adecuado, ejecutarlo y en la mayor&amp;iacute;a de casos continuar con la b&amp;uacute;squeda. &lt;/p&gt;
&lt;p align="justify"&gt;Cuando ponemos un bloque try/catch, o __try/__except &amp;oacute; __try/__finally, el compilador deja &amp;ldquo;marcas&amp;rdquo; en la pila, &amp;ldquo;marcas&amp;rdquo; que ser&amp;aacute;n le&amp;iacute;das por el controlador de excepciones. Dependiendo de c&amp;oacute;mo lo hayamos hecho, y el n&amp;uacute;mero de bloques y de controladores, el sistema tendr&amp;aacute; que salvar y restaurar el estado de la pila y de la aplicaci&amp;oacute;n para ir ejecutando los diferentes bloques de captura, y a veces incluso se necesita de cierta &amp;ldquo;inteligencia&amp;rdquo; para que la ejecuci&amp;oacute;n sea la correcta. El tema queda bastante claro una vez que se han le&amp;iacute;do los cap&amp;iacute;tulos de los dos libros que mencion&amp;eacute;, con una excepci&amp;oacute;n: que esos recorridos requieren tiempo, sobre todo si hay saltos entre anillo 0 y 3, por lo que en general el uso de excepciones est&amp;aacute; para eso: para ser usadas cuando realmente se produzca una, y no alegremente como una mera caracter&amp;iacute;stica de nuestro lenguaje.&lt;/p&gt;
&lt;p align="justify"&gt;Dicho esto, considero que el ejemplo que Jeffrey Ritcher pone al final del cap&amp;iacute;tulo 25 no es muy correcto, no porque est&amp;eacute; mal, sino porque realizar gesti&amp;oacute;n de memoria mediante excepciones me parece que es matar moscas a ca&amp;ntilde;onazos&amp;hellip; aparte del desperdicio de la misma. Ritcher crea una hoja de c&amp;aacute;lculo de un tama&amp;ntilde;o predefinido pero sin asignar ning&amp;uacute;n tipo de memoria. Luego, ante cada requerimiento de que una celda sea llenada con algo, intenta escribir en la posici&amp;oacute;n. Si ya hay memoria asignada todo ir&amp;aacute; bien, pero si no, se disparar&amp;aacute; una excepci&amp;oacute;n que asignar&amp;aacute; un bloque a dicha celda. La barbaridad est&amp;aacute; en que cada asignaci&amp;oacute;n, aunque sea de un solo byte, asignar&amp;aacute; 4KB (que es el tama&amp;ntilde;o de p&amp;aacute;gina de RAM), y en que el gasto de la excepci&amp;oacute;n y su control es enormemente m&amp;aacute;s caro que simplemente comprobar si la memoria est&amp;aacute; asignada o no. A no ser que se me escape algo, como ejemplo sobre el funcionamiento de las excepciones, vale, pero como ejemplo de algoritmo gen&amp;eacute;rico, no.&lt;/p&gt;
&lt;p align="justify"&gt;De todos modos, el sistema de excepciones es my potente y vers&amp;aacute;til, y con la combinaci&amp;oacute;n del registro, podemos configurar a base de bien el comportamiento de las no controladas. &lt;i&gt;Windows Internals&lt;/i&gt; lista 25 claves para cambiar el comportamiento, alguna de ellas tan radicales como hacer que ni siquiera se ejecute &lt;i&gt;WerFault.exe&lt;/i&gt; y nuestra aplicaci&amp;oacute;n desaparezca de forma silenciosa.&lt;/p&gt;
&lt;p align="justify"&gt;Pero como dir&amp;iacute;a el personaje de los dibujos animados, &lt;i&gt;no se vayan todav&amp;iacute;a, que hay m&amp;aacute;s&lt;/i&gt;. Aparte de poder instalar y controlar ciertas funciones de control de excepciones, podemos configurar el modo con que nuestra aplicaci&amp;oacute;n se comunica con el gestor de las mismas. Es decir, mediante ciertas llamadas a funciones de Win32, podemos decirle al sistema &lt;i&gt;WER&lt;/i&gt; c&amp;oacute;mo debe comportarse, qu&amp;eacute; ficheros adjuntar, etc.&lt;/p&gt;
&lt;p align="justify"&gt;La mayor&amp;iacute;a de las funciones que voy a citar aqu&amp;iacute; de pasada, se encuentran dentro de &lt;i&gt;kernel32.dll&lt;/i&gt; y para usarlas debemos incluir &lt;i&gt;werapi.h.&lt;/i&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;i&gt;WerSetFlags()/WerGetFlags()&lt;/i&gt;. Cambiamos o leemos si queremos que se incluya el &lt;i&gt;heap&lt;/i&gt; (mont&amp;iacute;culo) en el informe, si se suspender&amp;aacute;n todos los hilos o s&amp;oacute;lo el que fall&amp;oacute;, si se a&amp;ntilde;adir&amp;aacute; el informe a la lista de errores, y si se enviar&amp;aacute; o no a Microsoft. &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;i&gt;WerAddExcludedApplication()/WerRemoveExcludedApplication()&lt;/i&gt;. A&amp;ntilde;adir o eliminar una aplicaci&amp;oacute;n a la lista de aplicaciones excluidas de la generaci&amp;oacute;n de informes.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;i&gt;WerRegisterFile()/WerUnregisterFile()&lt;/i&gt;. A&amp;ntilde;adir o quitar el fichero indicado al informe.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;i&gt;WerRegisterMemoryBlock()/WerUnregisterMemoryBlock()&lt;/i&gt;.&lt;i&gt; &lt;/i&gt;A&amp;ntilde;adir/Qutar un volcado de un &amp;aacute;rea de la memoria de nuestro programa.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Tambi&amp;eacute;n podemos crear un informe desde nuestro programa cuando queramos. Los pasos a seguir son:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Llamar a &lt;i&gt;WerReportCreate()&lt;/i&gt;, que inicia el informe.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Llamar tantas veces a &lt;i&gt;WerReportSetParameter()&lt;/i&gt; como par&amp;aacute;metros queramos cambiar.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Llamar tantas veces a &lt;i&gt;WerReportAddDump()&lt;/i&gt; como bloques de memoria queramos incluir.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Llamar tantas veces a &lt;i&gt;WerReportAddFile()&lt;/i&gt; como ficheros del tipo que sean queramos incluir.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Llamar a &lt;i&gt;WerReportSetUIString()&lt;/i&gt; para a&amp;ntilde;adir opciones a la pantalla de WerFault.exe.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Llamar a &lt;i&gt;WerReportSubmit()&lt;/i&gt;, que dependiendo de la configuraci&amp;oacute;n para el programa y/o gen&amp;eacute;ricas que se tengan, enviar&amp;aacute; o no, preguntar&amp;aacute; o no, etc. qu&amp;eacute; hacer con el informe.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Llamar a &lt;i&gt;WerReportCloseHandle() &lt;/i&gt;para terminar con el tema.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p align="justify"&gt;Como pod&amp;eacute;is ver, la cosa es muy potente, y puede ser enormemente &amp;uacute;til en determinadas situaciones. Imaginemos que nuestra aplicaci&amp;oacute;n est&amp;eacute; petando en casa del cliente y no haya modo de ver qu&amp;eacute; pu&amp;ntilde;etas pasa. La generaci&amp;oacute;n de informes a demanda podr&amp;iacute;a ser la soluci&amp;oacute;n. Lo que no he visto es c&amp;oacute;mo recibir e interpretar esos informes.&lt;/p&gt;
&lt;p align="justify"&gt;Tambi&amp;eacute;n podemos usar estas funciones cuando sea nuestra aplicaci&amp;oacute;n la que est&amp;eacute; controlando la excepci&amp;oacute;n, pero debemos ser cuidadosos ya que &amp;eacute;sta podr&amp;iacute;a estar tan estropeada que el uso de todo esto volviera a genera nuevas excepciones que terminaran en el mismo c&amp;oacute;digo, que a su vez generara otras que&amp;hellip;&lt;/p&gt;
&lt;p align="justify"&gt;Se supone que Windows es lo suficientemente inteligente como para detener la cadena, pero como yo ya he visto m&amp;aacute;s de una vez petar de forma continua a una aplicaci&amp;oacute;n en Windows Vista hasta que la he matado desde el administrador de tareas, debemos ser cuidadosos con su uso.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160861" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/vista/default.aspx">vista</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/libros/default.aspx">libros</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx">Win32</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+7/default.aspx">Windows 7</category></item><item><title>De excepciones, del depurador, de Windows y de Visual Studio</title><link>http://geeks.ms/blogs/rfog/archive/2009/11/18/de-excepciones-del-depurador-de-windows-y-de-visual-studio.aspx</link><pubDate>Wed, 18 Nov 2009 16:54:09 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:160776</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=160776</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=160776</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2009/11/18/de-excepciones-del-depurador-de-windows-y-de-visual-studio.aspx#comments</comments><description>&lt;p align="justify"&gt;Esto leyendo la quinta edición de &lt;i&gt;&lt;a href="http://www.microsoft.com/learning/en/us/Book.aspx?ID=12069&amp;amp;locale=en-us"&gt;Windows Internals,&lt;/a&gt;&lt;/i&gt; que cubre Windows Vista y Windows Server 2008 y es la última versión disponible del libro. Allá por los años del Windows 95 y del NT 4.0, un poco antes, un poco después, estaba yo muy interesado en las tripillas de los sistemas operativos, y aparte de empacharme con algún que otro mamotreto genérico sobre el tema, le di caña a los equivalentes, como &lt;i&gt;Windows 95, al descubierto&lt;/i&gt;, o el &lt;i&gt;Windows NT&lt;/i&gt; de Helen Custer, así como otros de similar temática. Vamos, que prácticamente me leí todo lo que pude conseguir sobre las interioridades de esos sistemas operativos.&lt;/p&gt;  &lt;p align="justify"&gt;Pero desde hace un tiempo me veo en la tesitura de que, conversando aquí y allí, me he dado cuenta de que me he quedado bastante obsoleto en el tema, con cosas que no sólo han sido mejoradas, sino que ahora funcionan de forma completamente diferente, así que me he puesto las pilas y le estoy dando un buen repaso al libro…&lt;/p&gt;  &lt;p align="justify"&gt;Bueno, pues como iba diciendo, el capítulo 3 del citado no es que sea nada del otro mundo. Bueno, sí, lo cierto es que como no sepas de programación de hardware y hayas hecho algo, te vas a quedar poco menos que a dos velas con muchas de las cosas que aparecen, ya que tienen que ver con la gestión de interrupciones, tanto de software como de hardware, así como las excepciones y demás intríngulis que todo sistema operativo ha de cumplir. &lt;/p&gt;  &lt;p align="justify"&gt;Personalmente yo he hecho un par de proyectos basados en un microprocesador, aunque generalmente, cuando lo hago, suelo trastear con microcontroladores más o menos potentes, y la verdad es que muchas de las cosas que aparecen ahí explicadas, con la evidente diferencia entre un sistema operativo como es Windows y lo que un mindundi como yo haya podido hacer, me las he encontrado en mis desarrollos. Tener en cuenta las prioridades y los niveles de las interrupciones, programarlos y cambiarlos en tiempo real, instalar y quitar vectores de interrupción, etc.&lt;/p&gt;  &lt;p align="justify"&gt;Por lo menos eso es de lo que trata la parte del capítulo 3 que he leído, que ciertamente me parece demasiado detallista en cosas que, la verdad, a no ser que vayas a meterte de lleno en la creación de drivers primarios para Windows, de poco te sirve. Y si sabes de sistemas operativos, lo único llamativo es que te enteras de que Windows no es mucho más diferente que otros sistemas.&lt;/p&gt;  &lt;p align="justify"&gt;Volviendo al tema (lo que me mola irme por las ramas), sobre la página ciento y pico (je je, me quedan todavía más de mil cien por leer, ¡qué emoción!) se pone a hablar del control de las excepciones del sistema operativo, y cómo son controladas en conjunción con el software de aplicación (ese que tu y yo hacemos) y el propio sistema. Y entonces te dice que si no tienes claro cómo funciona a nivel de programador, que mires los capítulos finales de &lt;i&gt;Windows via C/C++&lt;/i&gt;. Y como resulta que tengo ese libro en la lista de pendientes (hace unos años leí y estudié la misma versión pero mucho más antigua, y encima en castellano), pues dejé uno y me puse con el otro, máxime recordando que fueron precisamente esos capítulos los que no leí en la edición anterior.&lt;/p&gt;  &lt;p align="justify"&gt;El sistema de excepciones de Windows es muy potente y versátil, y todos deberíamos saber lo básico sobre él. Pero no, no voy a entrar en detalles sobre el mismo, simplemente os diré que funciona muy parecido a las excepciones de un lenguaje de programación, con la salvedad de que es el sistema operativo el que las lanza y las gestiona si no lo has hecho tu.&lt;/p&gt;  &lt;p align="justify"&gt;En Windows Vista y siguientes existe una aplicación que se llama &lt;i&gt;WerFault.exe&lt;/i&gt; y que seguro que habéis visto en ejecución. De hecho, cada vez que os peta un programa, es esa aplicación la que toma el control y saca la barra de progreso moviéndose y te permite unas u otras acciones una vez que ha hecho sus deberes.&lt;/p&gt;  &lt;p align="justify"&gt;Es decir, cuando una aplicación genera una excepción, o el sistema operativo dispara una causada por la aplicación (por ejemplo, una división entre cero o una escritura fuera de rango), se trastea con la pila de tu programa y se busca un controlador de excepción adecuado. Ojo, no estamos hablando de bloques try/catch, sino de bloques __try/__except… aunque a veces el control termina también en un catch, sobre todo si usamos C++ y hemos habilitado la compatibilidad de control de excepciones del sistema operativo (y esto no viene explicado así en el libro, que asume la compatibildad). En .NET no sé qué ocurrirá, pero no creo que haya mucha diferencia.&lt;/p&gt;  &lt;p align="justify"&gt;Si nuestro programa tiene un manejador para esa excepción, se ejecutará, y dependiendo de lo que devuelva, se reintentará la instrucción (de código máquina, así que ojo) que generó la excepción, se continuará como si nada hubiera pasado (y en este caso podríamos liarla todavía más gorda), o se seguirá buscando otro nuevo manejador. Es decir, independientemente de lo que quiera que hagamos en nuestro controlador, podemos decirle al sistema operativo que reintente, que ignore o que busque otro controlador más.&lt;/p&gt;  &lt;p align="justify"&gt;Una vez que se han recorrido todos los controladores adecuados, además de dos más extra que podemos instalar mediante &lt;i&gt;AddVectoredExceptionHandler()&lt;/i&gt; y &lt;i&gt;SetUnhandledExceptionFilter()&lt;/i&gt;, y siempre que se haya llegado al final de toda la cadena de excepciones (que es algo más larga y compleja de lo que aquí he expuesto) sin haber sido detenida, Windows lanzará el citado programa, y le pasará un manejador al proceso que está fallando, aparte de detener por completo la ejecución de todos sus hilos (en XP sólo se detenía el que fallaba) mediante unas APIs ALPC no documentadas.&lt;/p&gt;  &lt;p align="justify"&gt;Este programa, en base a algunas claves del registro, hará una cosa u otra. Como ha recibido los manejadores en modo heredado, tendrá control sobre el programa que está fallando. Aparte de añadir el evento correspondiente, podrá enviar el informe a Microsoft, o añadirlo a la lista de pendientes. Incluso existe la posibilidad de que ni siquiera aparezca, haciendo todas sus tareas de forma oculta, o incluso que no haga ninguna. Podemos incluso filtrar el comportamiento según qué aplicación haya fallado.&lt;/p&gt;  &lt;p align="justify"&gt;Después de que ha hecho sus tareas internas, si existe algún depurador registrado y si la configuración (o lo que hayamos elegido) lo permite, abrirá el programa &lt;i&gt;vsjitdebugger.exe&lt;/i&gt; que mostrará los depuradores registrados. De nuevo este programa recibe los manejadores de forma heredada, y mientras, nuestra aplicación está completamente muerta, esperando. Una vez que hemos elegido un depurador, éste será ejecutado pasando, otra vez, la información necesaria para que sea capaz de buscar y localizar la aplicación que ha fallado.&lt;/p&gt;  &lt;p align="justify"&gt;Es entonces cuando ésta se abrirá dentro del depurador, y si están disponibles los símbolos y demás, podremos ver qué ha fallado y por qué.&lt;/p&gt;  &lt;p align="justify"&gt;Si os fijáis, el tema no es sencillo ni de lejos. En primer lugar, el programa fallante no puede hacer nada porque podría estar en un estado indeterminado, con la memoria o la pila completamente corruptas, así que es el sistema operativo el que debe tomar el control y lanzar una nueva aplicación que se encargue de todo el paripé, que a su vez lanzará un depurador que no es tal, sino un &lt;i&gt;concentrador de depuradores&lt;/i&gt;, que al final sí, lanzará el depurador elegido, que tomará bajo su ala a nuestro programa petado.&lt;/p&gt;  &lt;p align="justify"&gt;¿Os dais cuenta lo complejo que es algo que asumimos de forma inconsciente como trivial? Pues no todo termina ahí, sino que es ahora el depurador el que debe meter las garras dentro de la aplicación defectuosa, insertándose en su espacio de direcciones de alguna manera.&lt;/p&gt;  &lt;p align="justify"&gt;Para finalizar, comentaros que esto no es más que un resumen de los capítulos 23, 24 y 25 de &lt;i&gt;&lt;a href="http://www.microsoft.com/learning/en/us/book.aspx?ID=11241&amp;amp;locale=en-us"&gt;Windows via C/C++&lt;/a&gt;&lt;/i&gt;, quinta edición.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160776" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/vista/default.aspx">vista</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/libros/default.aspx">libros</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx">Win32</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+7/default.aspx">Windows 7</category></item><item><title>El loco de la colina y las colinas locas (Sobre el SP1 del Vista)</title><link>http://geeks.ms/blogs/rfog/archive/2008/03/01/el-loco-de-la-colina-y-las-colinas-locas-sobre-el-sp1-del-vista.aspx</link><pubDate>Sat, 01 Mar 2008 14:14:24 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:75872</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>17</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=75872</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=75872</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2008/03/01/el-loco-de-la-colina-y-las-colinas-locas-sobre-el-sp1-del-vista.aspx#comments</comments><description>&lt;p&gt;Ya s&amp;#233; que &amp;#250;ltimamente no abundan los contenidos t&amp;#233;cnicos por aqu&amp;#237;, pero estoy laboralmente muy ocupado y el tiempo libre que tengo lo paso leyendo y relaj&amp;#225;ndome, imagino que de aqu&amp;#237; a un mes volver&amp;#233; a estar m&amp;#225;s libre&amp;#8230; Eso o estar&amp;#233; en paro, ya que no me gusta absolutamente nada la din&amp;#225;mica que est&amp;#225; tomando mi curro, con salidas a toda Espa&amp;#241;a a reparar m&amp;#225;quinas de las que no entiendo ni quiero entender y que ya de por s&amp;#237; su comprensi&amp;#243;n suponen un oficio en s&amp;#237; mismo.&lt;/p&gt;  &lt;p&gt;Pero hoy no voy a hablar de m&amp;#237;, sino de Microsoft y sus &amp;#250;ltimas pifias. Ahora como MVP tengo l&amp;#237;nea directa, pero a fin de cuentas es como si no la tuviera, ya que por lo menos a mi no me hacen ni p*to caso. Y a veces son cosas muy serias, como las del final de esta entrada.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Visual Studio 2008&lt;/u&gt;&lt;/b&gt;     &lt;br /&gt;Quien tenga una subscripci&amp;#243;n a la MSDN lo habr&amp;#225; podido descargar m&amp;#225;s o menos desde noviembre del a&amp;#241;o pasado, as&amp;#237; que debe estar bastante familiarizado con &amp;#233;l. En mi caso no le encuentro ninguna pega destacable. Aunque tampoco es que le haya dado mucha ca&amp;#241;a: una peque&amp;#241;a aplicaci&amp;#243;n en C#, dos tonter&amp;#237;as en MFC y s&amp;#237; una espuerta de DLLs en Win32. Y si fallara haciendo DLLs pues ya ser&amp;#237;a la rehostia&amp;#8230;&lt;/p&gt;  &lt;p&gt;Estooooo&amp;#8230; &amp;#191;Digo que no falla? Pues s&amp;#237; que falla, o mejor dicho fallaba. Y no s&amp;#233; c&amp;#243;mo lo han actualizado, pero lo han hecho. Si uno crea un proyecto con una DLL nativa, y usa esa DLL nativa en otro proyecto dentro de la misma soluci&amp;#243;n, el linker revienta a la hora de enlazar. Es muy curioso, porque solo revienta justo despu&amp;#233;s de reiniciar Windows, y s&amp;#243;lo en Vista. O en otras palabras: la primera compilaci&amp;#243;n parcial tras un reinicio hace que el linker genere un error interno. Curioso, &amp;#191;no?&lt;/p&gt;  &lt;p&gt;Pues tras informar del error (yo fui el primero, luego comenz&amp;#243; a pasarle a m&amp;#225;s gente), lo han solucionado. &amp;#191;C&amp;#243;mo? Pues no lo s&amp;#233;. El Visual Studio no lo han actualizado, as&amp;#237; que ha debido ser una actualizaci&amp;#243;n secreta de esas que no te dicen nada o junto a alguna actualizaci&amp;#243;n del propio Windows.&lt;/p&gt;  &lt;p&gt;Decir que est&amp;#225; actualizado es mucho afirmar, m&amp;#225;s bien el problema queda minimizado y s&amp;#243;lo ocurre con muy poca frecuencia, tan poca que apenas es molesto. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;M&amp;#225;s Visual Studio 2008 y el SDK 6.1&lt;/u&gt;&lt;/b&gt;     &lt;br /&gt;Otra, esta algo m&amp;#225;s grande. Hay dos nuevos Windows SDK, ambos con la versi&amp;#243;n 6.1. Uno para Vista SP1 y otro para Windows Server 2008. El que trae el Visual Studio es la versi&amp;#243;n 6.0A.&lt;/p&gt;  &lt;p&gt;&amp;#191;Los ha instalado alguien? &amp;#191;En Vista x64, con o sin SP1? No hace falta que lo hag&amp;#225;is, ya que si bien se instalan perfectamente, cuando utilizamos el nuevo &amp;#8220;Windows SDK Configuration Tool&amp;#8221; para cambiarle al VS2008 el SDK activo, lo rompe y lo deja incapaz de compilar; en el caso del SDK de Vista, ya no es posible crear aplicaciones en C++/CLI, y en el caso del de Windows Server, nativas. Tras comprobar que la instalaci&amp;#243;n del SDK del Server fall&amp;#243;, y un par de cuelgues duros de Vista durante la reinstalaci&amp;#243;n, al final el problema que presenta el SDK del Server es el mismo que el del Vista.&lt;/p&gt;  &lt;p&gt;Tampoco vale la pena que utilices dicha herramienta para volver al status anterior: El Visual Studio 2008 ya no te volver&amp;#225; a funcionar a no ser que desinstales los SDK (menos mal).&lt;/p&gt;  &lt;p&gt;&amp;#191;Soluci&amp;#243;n? Ninguna. Silencio administrativo.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Windows Vista SP1&lt;/u&gt;&lt;/b&gt;     &lt;br /&gt;Antes de la salida p&amp;#250;blica del SP1 los suscriptores a la MSDN tambi&amp;#233;n tienen acceso a dicho Service Pack. Ciertamente pagar una suscripci&amp;#243;n a la MSDN cada vez tiene menos sentido, sobre todo las caras, ya que MS va liberando poco a poco casi todo lo que antes costaba dinero o ten&amp;#237;as que ser un Partner para obtenerlo. Como consecuencia de ello, los subscriptores pusieron el grito en el cielo y al poco se permiti&amp;#243; la descarga del SP1. Decir que tampoco a los MVP que no fueran betatester del propio SP1 nos dieron acceso a &amp;#233;l&amp;#8230;&lt;/p&gt;  &lt;p&gt;Pues bien, tras estar un par de semanas con &amp;#233;l instalado de forma limpia, es decir, instalas el Vista, luego el SP1 y sigues con todo lo dem&amp;#225;s, ya que los chicos de las altas esferas han decidido que no se pueda crear un CD integrado, mis conclusiones no podr&amp;#237;an ser m&amp;#225;s p&amp;#233;simas. Vamos all&amp;#225;.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Windows Mail&lt;/u&gt;&lt;/b&gt;. Si antes del SP1 era p&amp;#233;simo, despu&amp;#233;s de &amp;#233;l sigue si&amp;#233;ndolo. Es decir, los parpadeos contin&amp;#250;an, los autismos tambi&amp;#233;n, y en general los problemas de que adolece se siguen presentando de igual forma, aunque con un, digamos, 10% menos de frecuencia.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Arranque y apagado.&lt;/u&gt;&lt;/b&gt; Ninguna mejora. Tarda la misma eternidad en arrancar y parar, y durante el arranque sigues dejando de tener todo funcional hasta pasado un buen rato despu&amp;#233;s del que te muestre el escritorio.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Autismos varios.&lt;/u&gt;&lt;/b&gt; Es decir, esas congelaciones que se producen en ciertas aplicaciones se vienen produciendo con algo menos de frecuencia, pero siguen pasando.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Otros&lt;/u&gt;&lt;/b&gt;. Parece ser que s&amp;#237; que han mejorado algo la I/O por prioridades, y ahora copia y mueve archivos mucho m&amp;#225;s r&amp;#225;pido, pero siguen los autismos en cuanto a arrastrar y soltar. El IE se sigue cayendo solo igual que antes, el explorador sigue sin recordar posiciones ni ciertas configuraciones y en general, salvo la copia, la gesti&amp;#243;n de archivos sigue siendo tan mala que antes, lo que me lleva al siguiente punto.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;No se copian ni mueven todos los ficheros&lt;/u&gt;&lt;/b&gt;     &lt;br /&gt;Pues lo dicho. As&amp;#237; que ojito con copiar y luego borrar el original sin comprobar la copia. Me da igual que se deba a los hooks de terceros o a lo que sea. Es completamente inaceptable. Ni siquiera Linux en sus peores d&amp;#237;as hac&amp;#237;a eso.&lt;/p&gt;  &lt;p&gt;Antes del SP1 experiment&amp;#233; el problema de dos formas distintas. En la primera, al mover ficheros, en el origen quedaban restos que si bien se hab&amp;#237;an copiado, no se hab&amp;#237;an borrado. En la segunda, al borrar ficheros, me pasaba lo mismo, pues supuse que se deb&amp;#237;a a que alguien bloqueaba el fichero y se olvidaba de liberarlo, ya que la &amp;#250;nica forma de poderlos borrar era saliendo y volviendo a entrar en la sesi&amp;#243;n. Como eran ficheros que no se hab&amp;#237;an visto en ning&amp;#250;n momento, el candidato que generaba el problema deb&amp;#237;a ser el propio Vista.&lt;/p&gt;  &lt;p&gt;Despu&amp;#233;s de eso otro MVP coment&amp;#243; que le parec&amp;#237;a que le hab&amp;#237;a fallado la copia, pero no estaba seguro de ello.&lt;/p&gt;  &lt;p&gt;Y yo me qued&amp;#233; con la mosca detr&amp;#225;s de la oreja&amp;#8230; Despu&amp;#233;s instal&amp;#233; el SP1, y observ&amp;#233; el problema que cuento en la secci&amp;#243;n siguiente (que ya es el s&amp;#250;mmum de todo), por lo que proced&amp;#237; a limpiar la unidad&amp;#8230;&lt;/p&gt;  &lt;p&gt;&amp;#191;Imaginan? Pues se quedaron ficheros sin mover. Bien es cierto que eran ficheros ocultos y de s&amp;#243;lo lectura, pero otros ocultos y de s&amp;#243;lo lectura se movieron, as&amp;#237; que ese no era el motivo. Un arrastrar y soltar los copi&amp;#243;, pero el problema est&amp;#225; ah&amp;#237;.&lt;/p&gt;  &lt;p&gt;Y vayamos al apote&amp;#243;sico final.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Particiones sucia&lt;/u&gt;&lt;/b&gt;     &lt;br /&gt;Tengo una partici&amp;#243;n con la que trabajo todos los d&amp;#237;as, donde est&amp;#225; el c&amp;#243;digo fuente de la empresa, almacenes de correo y dem&amp;#225;s. El System Restore est&amp;#225; deshabilitado globalmente. La unidad es NTFS formateada desde la misma instalaci&amp;#243;n. Pues bien, de 11 GB de datos que hay (datos en disco, teniendo en cuenta el tama&amp;#241;o del cluster), en el disco hay realmente m&amp;#225;s de 20 GB. Tras borrar todo lo del disco, me segu&amp;#237;an quedando esos 10 GB ocupados, o sea, que son basuras que deja el Vista, ya que a nivel de usuario no queda nada. Activando mostrar ficheros ocultos por el sistema operativo, tomo posesi&amp;#243;n de &amp;quot;System Volume Information&amp;quot; y veo un mont&amp;#243;n de archivos con nombres de GUIID con tama&amp;#241;os de entre varios cientos de megas y gigas... Y de repente, antes de que me d&amp;#233; tiempo de mirarlos, &amp;#161;desaparecen! y la unidad se queda como deber&amp;#237;a haber estado en un primer momento. &lt;/p&gt;  &lt;p&gt;&amp;#191;Qu&amp;#233; se oculta ah&amp;#237;? &amp;#191;Por qu&amp;#233; desaparecen esos ficheros nada m&amp;#225;s verlos? &amp;#191;Qu&amp;#233; son esos restos (el system restore no puede ser ya que est&amp;#225; desactivado) que Vista no quiere que tengamos acceso a ellos? &lt;/p&gt;  &lt;p&gt;Me hubiera gustado haber recibido una respuesta oficial, cre&amp;#237;ble y documentada. Pero no fue as&amp;#237;. Silencio administrativo. &lt;/p&gt;  &lt;p&gt;&amp;#191;Por qu&amp;#233; roba Vista ese espacio en disco? &lt;/p&gt;  &lt;p&gt;Podr&amp;#237;a ser un resto del shadow copy de la copia de seguridad del propio Vista: en ese caso, chapuzas dobles y triples. Nunca los programas de copia de seguridad que han acompa&amp;#241;ado al sistema operativo han sido buenos, pero llegar hasta ese punto... Es decir, tengo programado el Backup del Vista para que haga copia de esa unidad sobre otra, si son los restos de la preparaci&amp;#243;n del shadow, lo dicho. &lt;/p&gt;  &lt;p&gt;Podr&amp;#237;a ser que aunque se ha desactivado globalmente el System Restore, Vista pasara ol&amp;#237;mpicamente de nosotros e hiciera copias... en una unidad que nunca lo ha tenido activado. Aqu&amp;#237; entrar&amp;#237;amos en cuestiones de otro tipo, como las actualizaciones ocultas que se instalan de forma oculta aunque las tengas desactivadas... lo que me parece un punto de soberbia, prepotencia y abuso de poder completamente intolerable... &lt;/p&gt;  &lt;p&gt;No se me ocurren otras posibles causas, y las que se me ocurren mejor no mencionarlas (qu&amp;#233; casualidad que s&amp;#243;lo pase en la &amp;#250;nica partici&amp;#243;n en la que hay c&amp;#243;digo fuente...) etc.&lt;/p&gt;  &lt;p&gt;El tema es que han pasado unos d&amp;#237;as y ya tengo otra vez la partici&amp;#243;n con 5 gigas de basura&amp;#8230; Pero esta vez no se me escapan&amp;#8230;&lt;/p&gt;  &lt;p&gt;Eso ser&amp;#225; despu&amp;#233;s de que instale XP.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=75872" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/SP1/default.aspx">SP1</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/vista/default.aspx">vista</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category></item></channel></rss>