Actualizar Windows 8 PRO a Windows 8.1 Pro Preview desde la imagen ISO.

Después de una larga espera, Microsoft ha liberado el primer Preview de lo que será su próxima actualización, que empezó con nombre código de “Blue” y finalmente adquirió el oficial como Windows 8.1.

En la página oficial, se puede descargar la actualización para instalarlo desde la Tienda de Windows, o bien la imagen ISO para instalación offline.

En este artículo, mostraré el paso a paso para actualizar desde Windows 8 / Windows 8 PRO a Windows 8.1 Pro Preview utilizando el archivo ISO que se descargar de la página oficial, aprovechando la ventaja de que desde Windows 8 no es necesario grabar la imagen, sólo montarla y proceder con el asistente.

Requerimientos

1. La clave de producto para la activación: NTTX3-RV7VB-T7X7F-WQYYY-9Y92F

2. El archivo ISO para la instalación. Se puede descargar desde la página oficial:
http://windows.microsoft.com/es-es/windows-8/preview-download

3. Un equipo que esté ejecutando Windows 8 o Windows 8 PRO.

*Nota: Si el equipo es una versión inferior de Windows 8, se debe grabar el medio en un DVD o USB y realizar la instalación desde allí.

Actualizando a Windows 8.1

1. Una vez descargado el archivo ISO (.iso), se debe Montar utilizando el Explorador de Windows, haciendo clic derecho y seleccionando Montar:

image

2. Al crearse la unidad virtual, se abrirá automáticamente, y hacemos clic en Setup.exe para iniciar el asistente de instalación de Windows 8.1:

image

3. En la página de Consigue lo último, seleccionamos en No, gracias y clic en Siguiente:

image

4. En la página de Clave de producto, le indicamos la que especifiqué en los requerimientos y clic en el botón Siguiente:

image

5. En la página de Términos de licencia, seleccionamos la casilla de Acepto los términos de licencia en la parte inferior y clic en el botón Aceptar:

image

6. En la página de Elige lo que quieres conservar, dejamos la selección predeterminada de Conservar archivos personales, aplicaciones y configuraciones de Windows y clic en el botón Siguiente:

image

*Nota: Dependiendo de cómo quisiéramos que fuese nuestra instalación, podríamos también seleccionar Conservar solo archivos personales (Básicamente el perfil y su contenido) o bien Nada.

7. Si el asistente de instalación no detecta problemas de compatibilidad o algo adicional, debería mostrar la página de Listo para instalar aprobando las configuraciones:

image

Clic en el botón Instalar para iniciar la actualización.

image

*Nota: Como lo indica el asistente, habrán algunos reinicios durante el proceso de actualización. Debemos esperar a que finalice y el tiempo dependerá de nuestros recursos, y lo que tengamos instalado, pero debe ser relativamente rápido.

Post-Configuración

Después de un par de reinicios, Windows mostrará lo que se conoce técnicamente como la fase de OOBE, que en otras palabras, es la configuración que se hace posterior a la instalación. Normalmente la vemos cuando adquirimos un equipo nuevo y que trae una licencia original de Windows (Equipos OEM).

El asistente nos pedirá indicar un tipo de configuración, así que le daremos en el botón de Usar configuración rápida para iniciar:

image

Después de esto, el asistente de Windows comprobará el estado de conexión a internet, y si detecta que hay, nos pedirá conectar nuestro equipo a una cuenta Microsoft, donde le indicaremos un correo electrónico como Hotmail, Live, Outlook, etc y sus respectivas credenciales:

image

*Nota 1: Si el equipo no detecta conexión a internet, procederá con la cuenta local.

*Nota 2: Una cuenta Microsoft nos permitirá sincronizar todas nuestras configuraciones entre diferentes equipos donde tengamos instalado Windows 8/8.1 e iniciemos sesión con ella, además de poder gestionar nuestra cuenta de la Tienda y consumir las aplicaciones que tienen servicios de internet como correo electrónico automáticamente, una vez se ingrese a ellas por primera vez.

El asistente procederá con unas configuraciones de seguridad para la cuenta, y finalmente preguntará si deseamos activar Skydrive para nuestra cuenta, y que podamos sincronizar los diferentes archivos entre los equipos:

image

Será decisión de cada uno darle a No usar SkyDrive o bien, Usar SkyDrive.

Acto seguido, el equipo se reiniciará, configurará actualizaciones si nes necesario y nos pedirá credenciales de nuestra cuenta para iniciar sesión:

image

Después de que se configuren las aplicaciones predeterminadas, tendremos nuestra mejorada Pantalla de Inicio frente a nosotros lista para disfrutar Windows 8.1 Preview:

image

*Nota: Es posible que tengan que activar el sistema operativo para poder utilizar todas las funciones, para esto, basta con ir a la apliación de Cambiar configuración de PC y clic en la pestaña de Activar Windows para proceder:

image

Saludos,

Checho

El cliente de Oracle 10g x64 que no era compatible con Windows 8, Process Explorer, ACT y su solución

shutterstock_82751101_6E4CAFF4

Dentro de las funciones que hago en mi trabajo, están las de visitar diferentes clientes alrededor del país (Colombia) y ayudarlos a diagnosticar y de ser posible, mitigar problemas en cuanto a Compatibilidad de Aplicaciones sobre la última plataforma Windows disponible – En este caso, Windows 8 por supuesto.- Lamentablemente, esto no sucede con la frecuencia que me gustaría, pues enfrentarse a este tipo de problmeas supone retos y aprendizajes muy enriquecedores.

En el caso que expondré en este post, me enfrenté a una aplicación que muy probablemente varias empresas deberán instalar cuando prueben Windows 8, así que decidí explicar como siempre el problema, la posible causa y una solución esperando que les sirva en caso de que den a parar en este blog buscando respuestas.

El problema

Como es normal en gran mayoría de las empresas que están probando actualmente Windows 8, se están enfrentando no solo a la compatibilidad de la aplicación en sí con el sistema operativo, sino también al funcionamiento en la arquitectura de 64 bits. Para el caso en cuestión, se trataba del cliente de 64 bits de Oracle Universal Installer 10g.

A pesar de que el cliente funciona sin ningún problema en Windows 7, al tratar de instalarlo en un Windows 8 x64, ejecutando el Setup.exe recibía el siguiente mensaje desde un Símbolo del Sistema:

image

Como ven, apenas lanzado el instalador, estaba revisando la versión del sistema operativo, y muy claramente especificada que debía ser 5.0, 5.1, 5.2, 6.0 o 6.1. Resultado de esta revisión, encontraba que la que versión Actual era la 6.2 (Windows 8) y por ende, reportaba un fallo (Failed <<<<) y pedía presionar una tecla para salir.

La causa

Claramente, como se da en un alto porcentaje de las aplicaciones que dicen no funcionar en un sistema operativo posterior, estaba comprobando explícitamente por versión del sistema operativo; aunque este, a diferencia de muchas aplicaciones, tenía un rango más alto en las versiones del sistema operativo que soportaba nativamente.  La versión interna de Windows 8, es 6.2, y como el cliente comprueba la versión mayor y menor, es decir, 6 y después 2, nunca lo aceptará.

Ahora, lo que normalmente se hace en primera instancia con este tipo de aplicaciones, es ir a las propiedades del ejecutable, en este caso del Setup.exe, pestaña de Compatibilidad y aplicar el Modo de Compatibilidad con alguna versión en la que funcione, por ejemplo Windows 7. De esta forma, Windows aplicará una mentira sobre versión e intentará engañar al ejecutable para tratar de responderle con la versión que busca:

image

Al ejecutar nuevamente el Setup.exe, la primera impresión fue bastante gratificante, pues la aplicación parecía pasar esta etapa de validación de versión, pues el resultado para el instalador era 6.1 así que indicaba Passed, y esto debía llevar a lanzar el asistente de instalación:

image

No obstante, después de unos segundos de la pantalla inicial, el asistente de instalación de Oracle Universal Installer núnca aparecía, cosa que no debía ser así, pues si ya había pasado el mayor problema, que era la validación de versión, tenía que iniciarse. Después de validar que esto sucediera en todos los equipos Windows 8 a 64 bits, para descartar que fuera solo de un PC, pensé que era necesario ser un poco más fuertes con el instalador y aplicarle un Shim, utilizando la estupenda herramienta de Application Compatibility Toolkit (ACT).

Después de correr el ACT, inicié el asistente para la creación de un nuevo Fix, indiqué los primeros datos requeridos por el asistente, seleccioné el Shim de Win7RTMVersionLie, que aplicaría una mentira sobre versión, pero al darle al botón Run test para verificar que el Shim funcionara en el Setup.exe, recibí un mensaje de error de parte de ACT:

image

A parte de que la aplicación no me corría, ACT no era capaz de aplicar el Shim y mostraba un mensaje que al parecer, se referería a algún tema de permisos. Sin embargo, por más que busqué con Process Monitor, por lo menos desde mi experiencia, no fui capaz de encontrar algo que me ayudara, así que ahora tenía dos problemas en uno.
Después de dar varias vueltas durante bastantes días con este problema, recordé que Process Monitor no es la única herramienta de Sysinternals que me podría echar una mano en este caso, y aquí es donde recordé al Súper Administrador de Tareas: Process Explorer.

Una de las características más sencillas y notables de Process Explorer (A mi modo de ver), es que permite organizar los resultados en un Árbol de Procesos, permitiendo identificar los procesos padres de cada ejecutable, si es que tiene alguno, y ver detalles relevantes como el contexto en el que está corriendo, tanto a nivel de Windows (Kernel o Usuario) como a nivel de seguridad, entre muchas otras cosas. A parte del Árbol de Procesos, lo que en este caso me ayudó, es que Process Explorer identifica cuando un proceso se está recién ejecutando porque lo resalta de color verde de forma predeterminada, al igual que cuando se está cerrando, pues lo pone en color rojo. Aunque es 1 segundo, se puede modificar el delay hasta 9 segundos, permitiendo dar una mirada pequeña, pero más detallada a lo que se abre y se lanza mientras se reproduce el comportamiento.

*Nota: La guía ideal para Process Explorer y todas las herramientas de Sysinternals, están en el libro de Sysinternals Administrator’s Reference:
http://technet.microsoft.com/en-us/sysinternals/hh290819.aspx

En este orden de ideas, lo que hice fue ejecutar Process Explorer, ir al menú de Options, seleccionar Difference Highlighting Duration, y lo establecí a 9 segundos:

image

Después de esto, con el Process Explorer abierto, ejecuté el Setup.exe de los archivos de instalación del cliente de Oracle, y mientras se reproducía el comportamiento de abrir y terminar la consola sin ningún asistente, volví al Process Explorer, y después de unos segundos en Verde, esto fue lo que vi en color Rojo, indicando que se estaba cerrando:

image

Exceptuando el javaw.exe, los dos unzip.exe y el conhost.exe, que son subprocesos para mostrar la Consola, descomprmir (algo, ni idea qué) y lanzar la aplicación, mi primera impresión se debió al oui.exe, que estaba siendo llamado por el setup.exe ya que desde ahí se supone que se estaba lanzando en verdad el asistente de instalación. Ahora bien, ¿De dónde salía el oui.exe? La respuesta la da el propio Process Explorer, pues con solo pasar el mouse por el proceso o bien hacer doble clic para entrar a sus propiedades, podía ver el Path y el Command Line que me indicaban dónde estaba físicamente y esto fue lo que pude ver:

image

El proceso de oui.exe, se encontraba dentro de la carpeta install, que hace parte de los archivos de instalación del cliente de Oracle 10g. El problema es que cuando fui a buscar el proceso, no lo pude ver:

image

El motivo de esto, es que ese ejecutable predetermiadamente se encuentra como un archivo oculto, así que primero debía mostrar todo lo oculto desde las Propiedades de las carpetas en el Explorador de Windows y luego podría tener acceso a él. Para mi mala suerte, aún cambiando las propiedades de compatibilidad del oui.exe y ejecutándolo con privilegios elevados, el problema seguía exactamente igual, solo abría la primera ventana con el Símbolo del sistema aprobando la instalación.

La solución

En el mundo del Troubleshooting y la Compatibilidad de Aplicaciones, es necesario ser paciente, buscarse algo de creatividad y sobre todo, muy persistente; pues hay muchas variantes en las que puedes buscar la solución, pero afortunadamente varias formas en las que puedes llegar a ella…

En este caso, como última opción dentro de mis limitados conocimientos, se me ocurrió aplicar el Shim de ACT, pero esta vez directamente al oui.exe, quera desde donde finalmente se iniciaba el proceso para el arranque del asistente de instalación. Desde ACT, creé entonces un nuevo Fix, pasé en blanco la página de Compatibility Modes y en la página de Compatibility Fixes, seleccioné nuevamente Win7RTMVersionLie:

image

Le di clic en el botón Test Run… para realizar la prueba, y para mi fortuna, después de unos pocos segundos el aclamado asistente apareció:

image

Al probar el funcionamiento del Shim, cerré el asistente y le di clic en el botón Next y Finish para terminar. Finalmente, le di clic en el botón Save de la parte superior en la Consola de ACT para guardar el Shim, especificando dos veces el nombre, uno para el que maneja la consola y otro para el que se guarda físicamente:

image

Solo quedaba aprovechar la consola de ACT para instalar el Shim localmente haciendo clic derecho en la Base de datos que se creó desde el asistente para  el nuevo Fix y seleccionando Install.

image

Con esto, y después del mensaje de confirmación, el asistente se lanzó sin problemas y sin necesidad de modificar las propiedades de compatibilidad, y facilitando su instalación aunque él mismo no lo quisiera en primera instancia.

[Appendix]: Descarga e instalación del Shim

Si alguno de ustedes tiene exactamente el mismo problema en equipos Windows 8 a 64 bits, con el cliente de Oracle 10 x64, pueden descargar el Shim desde aquí:

Enlace directo: http://sdrv.ms/16Wk758

Para instalar, basta con descomprimir el archivo ShimOracle.zip, y ejecutar ShimOracle.exe. Les pedirá elevación de privilegios (Por el UAC), y después de aceptar los pequeños términos de licencia, deberán ver un mensaje en Consola similar al siguiente:

image

Después de asegurarse que diga “Installation of OUI complete.” y presionar una tecla para cerrar, deberían poder lanzar el instalador del Oracle 10g sin problemas.

*Nota: En caso de tener inconvenientes, pueden descomprimir el .exe con WinRAR, y ejecutar como administradores el archivo InstallShim.bat.

Saludos,

Checho

Explorando la API de Windows en C++: Creando mi primera clave de Registro con la función RegCreateKeyEx

TechDays Figure with Laptop

Como probablemente se darán cuenta todos los que se toman el trabajo de entrar y leer las entradas de este blog, este artículo es completamente diferente a todo lo que aquí he expuesto antes, pues esta vez no hablaré acerca de una característica de Windows 8, de alguna solución sobre un problema que enfrente o tema relacionado a su implementación. Lo que mostraré por primera vez, algo más orientado a Windows Internals, tocando código y API de Windows en C++.

La razón de este post, es que me estoy planteando seriamente el reto de entrar en el mundo de la API de Windows, y es debido a que como bien dicen expertos: “Para poder solucionar los problemas de Windows, debes saber cómo funciona el sistema operativo.” La mejor forma, es necesariamente saber sobre Windows Internals, y para esto, es importantísimo entender y manejar la API. Como existen demasiadas funciones, quise empezar por algo que fuera familiar, y algo más fácil de entender, las operaciones con el Registro de Windows.

La primera función con la que quiero empezar, se llama RegCreateKeyEx, y es básicamente la que nos permite, a través de la API de Win32, crear una clave específica en el Registro de Windows. El problema que tuve yo, fue que enfrentarme a crear por primera vez una aplicación de Win32 y manejar este tipo de funciones en C++, definitivamente me iba a resultar complejo, y la documentación de MSDN es muy precisa y de pocos ejemplos para poder empezar. Tuve que indagar en la web, y después de ires y venires con diferentes variaciones, pude comprender en términos generales la forma como se expresa la función en MSDN, y finalmente crear mi primera clave. El segundo problema, es que para poder aprender de una mejor forma, necesitaba además de practicar, poder tener documentarlo en alguna parte, y que se convierta en mi propia referencia a futuro, y es aquí donde aparece mi blog, ¿qué mejor lugar para hacerlo, si no es en mi propio espacio?

Lo que haré en este artículo, será mostrar el paso a paso para crear nuestra primera aplicación de Win32 como referencia, pero además, cómo utilizar la función RegCreateKeyEx de una forma correcta para generar una clave en el Registo de Windows, incluyendo diferentes algunas formas de interactuar con ella utilizando Process Monitor de Sysinternals.

Creando la primera App de Win32

Antes que utilizar cualquier función, es necesario por supuesto crear un nuevo proyecto; y para asegurarme que los que sigan este artículo les funcione, quise incluir esta primera parte de la creación básica de una Aplicación de Win32. Necesitaremos básicamente:

Visual Studio, en cualquier versión, pues este tipo de proyectos se crea desde cero. Preferiblemente, aconsejaría estar bajo 2012 que es la última oficial. Pueden descargar la versión Express que es totalmente gratuita desde aquí:
http://www.microsoft.com/visualstudio/esn/downloads#d-2012-express

Equipo técnico con Windows XP / Vista / 7 / 8 para realizar la prueba. Este post se enfocará sobre Windows 8.

Para crear y configurar nuestro proyecto:

1. Desde Visual Studio, hacemos clic en Archivo > Nuevo > Proyecto.

2. Seleccionamos Visual C++ dentro de las Plantillas, o bien dentro del nodo de Otros tipos de proyectos (Según como hayamos configurado Visual Studio), y escogemos Proyecto de Win32. Lo demás será indicar el nombre y el destino del proyecto:

image

3. En el Asistente para Aplicación de Win32 que aparece, hacemos clic en el botón de Siguiente (Next) y después seleccionamos ‘Aplicación de Windows’ debajo de Tipo de Aplicación y Proyecto Vacio, debajo de Opciones adicionales para darle clic en Finish.

image

4. Hasta aquí, lo único que veremos será nuestro Explorador de Soluciones sin nada agregado en el panel derecho. Para poder agregar el código fuente, hacemos clic en el menú de Proyecto > Agregar nuevo elemento, seleccionamos Archivo de C++, le ponemos un nombre (Puede ser el predeterminado) y clic en Agregar:
 
image

5. Una vez estemos en la plantilla en blanco de nuestro código fuente, podremos empezar a escribir nuestra aplicación de Win32. Lo primero, y más importante, es referenciar nuestro archivo de cabecera, y nuestro punto de entrada, que conocemos como función principal.
Para una aplicación de Win32, nuestro punto de entrada es <Windows.h>, que incluye a su vez otras cabeceras de Windows y la función principal, o punto de entrada se llama WinMain.

Llevando esto al código, para cada aplicación de Win32, tendríamos lo siguiente:

#include <Windows.h>
 
//Se declara método principal 
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, 
                   int nCmdShow){
 
} //Cierra método principal.
 

*Nota: En toda aplicación de Win32, siempre existirá la cabecera de Windows.h y la función de WinMain.

Acerca de RegCreateKeyEx

La sintaxis de la función RegCreateKeyEx, requiere nueve entradas que se pueden especificar manualmente mientras se escribe, o bien, declararlas desde antes y enviarle las variables como muestra la documentación de MSDN. Las variables (Que no necesariamente requieren tener los mismos nombres) son:

HKEY hKey: Este es el apuntador a una clave de Registro abierta, y tiene unas predeterminadas, que en mi concepto, son las que deberíamos utilizar aquí siempre como punto de partida, que son:

HKEY_CLASSES_ROOT.

HKEY_CURRENT_CONFIG.

HKEY_CURRENT_USER.

HKEY_LOCAL_MACHINE.

HKEY_USERS.

*Nota: Como ven, los que maneja predeterminadamente son la mayoría de los Hives que tiene Windows.

LPCTSTR lpSubKey: Este es el nombre denuestra subclave que vamos a abrir o crear. Debe estar contemplada como una subclave de la clave que creamos con hKey. Por ejemplo, si especificamos que escribiríamos en HKEY_LOCAL_MACHINESoftware una subclave llamada MiPrograma, lpSubKey debería contener: “\Software\MiPrograma”.

DWORD Reserved: Este parámetro siempre debe ser 0.

LPTSTR lpClass: Es el tipo de clase definidio por el usuario, pero suele ser NULL.

DWORD dwOptions: Este parámetro tiene diferentes opciones:

REG_OPTION_BACKUP_RESTORE.

REG_OPTION_CREATE_LINK.

REG_OPTION_NON_VOLATILE

REG_OPTION_VOLATILE.

El parámetro predeterminado es REG_OPTION_NON_VOLATILE, que permite básicamente que la información se preserve en un archivo cuando se reinicie el sistema.

REGSAM samDesired: Aquí se especificará qué operación se permitirá realizar a la llave que se retorna, es decir, a la que se creó. Si se especifica 0, una aplicación podría obtener ACCESS DENIED cuando trate de escribir sobre ella, algo que puede ser demostrado fácilmente con Process Monitor:

image

Los parámetros ideales para esta variable, pueden ser escogidos entre una lista que recibe el tipo de dato para determinar los derechos de acceso. Los más comunes son:

KEY_ALL_ACCESS

KEY_READ

KEY_WRITE

KEY_QUERY_VALUE.

Pueden ver toda la lista aquí:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724878(v=vs.85).aspx

LPSECURITY_ATTRIBUTES lpSecurityAtrtributes: Si se desea establecer los ACLs para la clave que se cree, se utilizarían los parámetros de este tipo de dato. Lo más fácil para empezar, es dejarlo como NULL, para que obtenga los descritpores de seguridad predeterminados.

PHKEY phkResult: Este no es más que un apuntador a la variable que se creó o se abrió. Basta con delclararlo sin entregarle contenido, pues lo recibirá después de la operación.

DWORD lpdwDisposition: Este es un apuntador a una variable que puede recibir los siguientes valores después de la operación:

REG_CREATED_NEW_KEY.

REG_OPENED_EXISTING_KEY.

El que reciba una u otra, dependerá de si la clave que intentemos crear esté creada, incompleta o no se haya creado. Si está creada o incompleta, se recibirá REG_OPENED_EXISTING_KEY, pero si no está creada, se recibirá REG_CREATED_NEW_KEY.

*Nota: Internamente, Windows recibe es el número que referencia a estos valores. Si se especifica como NULL, no habrá retorno de nada.

Cabe aclarar que la función en sí misma tiene un retorno; en caso de ser satisfactoria la operación, es decir, que se creó, devolverá: ERROR_SUCCESS, aunque por experiencia propia, se vuelve más cómodo trabajar con el valor que retorne lpdwDisposition.

Con lo anterior claro, o por lo menos explicado de la mejor forma que entendí, y pude, lo siguiente es finalmente pasar a personalizar los parámetros y valores para que generar nuestra clave:

Creando nuestra primera clave de Registro

Para proceder y ser prácticos en toda la teoría anterior, crearé una clave que se llame: MiClave, dentro de HKEY_CURRENT_USERChecho’s Blog. Para no tener mayores inconvenientes con permisos ahora, y entre otras, porque todas las aplicaciones deberían escribir siempre allí; le pondré permisos para leer y escribir desde samDesired (KEY_READ | KEY_WRITE) y para poder corroborar, imprimiré un mensaje que me diga el resultado de la operación.

*Nota: Trataré lo del MessageBox al final del post.

Declarando las variables que introduje anteriormente, y con referencia a lo que quiero crear, el código quedaría así:

#include <Windows.h>

//Se declara método principal 

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, 
                   int nCmdShow){

//Declaración de variables y sus parámetros:

HKEY hKey=HKEY_CURRENT_USER;
LPCTSTR lpSubKey=L"Checho's Blog\MiClave";
DWORD Reserved=0;
LPTSTR lpClass=NULL;
DWORD dwOptions=REG_OPTION_NON_VOLATILE;
REGSAM samDesired=KEY_READ | KEY_WRITE;
LPSECURITY_ATTRIBUTES lpSecurityAttributes=NULL;
HKEY phkResult;
DWORD lpdwDisposition;


}//Cierra método principal.

*Nota: Hasta aquí, aún no hemos creado la clave, sólo se declararon las variables que utilizará la función de RegCreateKeyEx.

Ahora bien, en la función solo tendríamos que remplazar lo que pide con los valores en el orden adecuado, es decir:

RegCreateKeyEx(hKey,
               lpSubKey,
               Reserved,
               lpClass,
               dwOptions,
               samDesired,
               lpSecurityAttributes,
               &phkResult,
               &lpdwDisposition);

*Nota: En la documentación oficial, phkResult, debe ser de tipo PHKEY para que la función lo acepte, pero como es necesario después cerrar la operación con RegCloseKey, y ésta solo acepta un tipo HKEY, fue necesario declararla como tal, y dentro del la función anteponer un ‘&’ para que se refiere a la misma dirección de memoria que tiene nuestro valor. Lo mismo sucede con lpdwDisposition, pues para operar su resultado después, requiere que sea mínimo DWORD. Si logro encontrar la razón, o la forma de cómo no tener que modificarlas para suplir estas dos necesidades, actualizaré el post.

Con todo lo anterior, ya nuestra clave se crea sin ningún problema, pero como dije antes, es bueno tener algún tipo de respuesta de parte de la aplicación para saber cuándo fue exitoso, o cuándo falló. Para esto, utilizaremos el resultado que devuelva lpdwDisposition, y el método de MessageBox para mostrar un mensaje al usuario.

Como podemos tener REG_CREATED_NEW_KEY o REG_OPENING_EXISTING_KEY en lpdwDisposition, jugaremos con una sentencia de ‘if’ para mostrar el mensaje correcto.

El código sería:

//Validamos si la clave se creó.
if (lpdwDisposition==REG_CREATED_NEW_KEY)
{
    MessageBox(NULL,
        L"La clave se creó desde cero.",
        L"Mi primera Aplicación de Win32",
        MB_ICONINFORMATION);
}
//Validamos si la clave sólo se abrió, pues ya estaba creada.
else if(lpdwDisposition==REG_OPENED_EXISTING_KEY)
{
    MessageBox(NULL,
        L"La clave se abrió, pero no se modificó.",
        L"Mi primera Aplicación de Win32",
        MB_ICONEXCLAMATION);
}
//Error que no esté contemplado.
else
{
    MessageBox(NULL,
        L"Error al crear o abrir la clave.",
        L"Mi primera Aplicación de Win32",
        MB_ICONERROR);
 
}

Estamos validando con if, tres opciones:

1. Si la clave se crea porque no existe.

2. Si no sucede lo primero, se valida que la clave ya exista.

3. Si no se da alguna de las anteriores, indicamos error.

Los tres mensajes se hacen con un MessageBox. Es muy sencillo de crear, le indicamos un valor NULL como primera parámetro, lo segundo es el texto que deseamos tenga, el tercer parámetro es el título del mensaje y el último, el icono y/o bonotes que puede mostrar. Más información acerca de la función de MessageBox:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

Finalmente, y como algo que siempre debe hacerse, cerramos la operación que hicimos sobre la sublcave de Registro con la función RegCloseKey, que solo recibe un parámetro, y es el apuntador que devuelve en este caso phkResult. La sintaxis sería:

RegCloseKey(phkResult);

Juntando todo lo anterior, el código completo sería:


#include <Windows.h>
 
//Se declara método principal 
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, 
                   int nCmdShow){
 
//Declaración de variables y sus parámetros:
 
HKEY hKey=HKEY_CURRENT_USER;
LPCTSTR lpSubKey=L"Checho's Blog\MiClave";
DWORD Reserved=0;
LPTSTR lpClass=NULL;
DWORD dwOptions=REG_OPTION_NON_VOLATILE;
REGSAM samDesired=KEY_READ | KEY_WRITE;
LPSECURITY_ATTRIBUTES lpSecurityAttributes=NULL;
HKEY phkResult;
DWORD lpdwDisposition;
 
//Declarando la función:
 
RegCreateKeyEx(hKey,
               lpSubKey,
               Reserved,
               lpClass,
               dwOptions,
               samDesired,
               lpSecurityAttributes,
               &phkResult,
               &lpdwDisposition);
 
//Validamos si la clave se creó.
if (lpdwDisposition==REG_CREATED_NEW_KEY)
{
    MessageBox(NULL,
        L"La clave se creó desde cero.",
        L"Mi primera Aplicación de Win32",
        MB_ICONINFORMATION);
}
//Validamos si la clave sólo se abrió, pues ya estaba creada.
else if(lpdwDisposition==REG_OPENED_EXISTING_KEY)
{
    MessageBox(NULL,
        L"La clave se abrió, pero no se modificó.",
        L"Mi primera Aplicación de Win32",
        MB_ICONEXCLAMATION);
}
//Error que no esté contemplado.
else
{
    MessageBox(NULL,
        L"Error al crear o abrir la clave.",
        L"Mi primera Aplicación de Win32",
        MB_ICONERROR);
 
}
 
RegCloseKey(phkResult);
 
}//Cierra método principal.

Cuando se cree, el mensaje indicado en MessageBox anterior debería ser similar al siguiente:

image

Cuando la clave ya exista, el mensaje debería ser similar al siguiente:

image

Si vemos con Process Monitor el resultado de los permisos resultantes en la subclave, teniendo en cuenta que le indiqué lectura y escritura, se vería así:

image

Las propiedades del resultado deben indicar claramente los permisos asignados:

image

*Dato curioso: La información actual sobre esta función (RegCreateKeyEx), indica que la DLL o el módulo que la contiene, es Advapi32.dll, pero al momento de confirmar esto, utilizando la pestaña de Stack que tiene Process Monitor, que permite ver operaciones a nivel de usuario y Kernel, el resultado es diferente:

image

Como ven, el módulo que ahora contiene esta y la gran mayoría de las principales funciones de la API de Windows, es: KernelBase.dll.

Según me confirmó muy amablemente Aaaron Margosis de Microsoft, existen todavía unos puntos de entrada en Advapi32.dll, pero redireccionan a KernelBase.dll, y que además esto sucede desde Windows 7.

Espero les sea de utilidad, y por supuesto, si hay algo en lo que puedan aportar, no duden en hacer su comentario.

*Nota: Es necesario tener un usuario en Geeks.ms para poder comentar en estos Blogs.

Saludos,

Checho