13. May 2017 · Write a comment · Categories: Uncategorized

Dear (V)C++ programmers,

I am required to make a registry node, on windows 10, 64 bit.

I am using VC++ 10(VS 2010).

My analysis work told, that windows has 2 registry keys(32 / 64 bit).

I digged with msdn samples to do so.

I made my solution compatible to 64 bit, after downloading a SDK from microsoft site.

Sample compiled as x64.

But while I try to create a registry on 64 bit(under 'WOW6432' node), RegCreateKeyEx(..)always fails.

Though I tried to do so, after solving acl code too....then too this api fails...

Here is snippet. Any help will be highly appreciated..

-Pankaj

.......................(MSDN Sample)

#include "stdafx.h"

#include <windows.h>

#include <stdio.h>

#pragma comment(lib, "advapi32.lib")

// Define application constants.

#if defined(_WIN64)

#define VIEW_DATA L"Hello! 64-bit World"

#define ALT_VIEW_DATA L"Hello! 32-bit World"

#define CROSS_ACCESS KEY_WOW64_32KEY

#else

#define VIEW_DATA L"Hello! 32-bit World"

#define ALT_VIEW_DATA L"Hello! 64-bit World"

#define CROSS_ACCESS KEY_WOW64_64KEY

#endif

// Create a registry key and set its value.

// Return TRUE if the function succeeds, FALSE if it fails.

BOOL

   CreateRegistryKeyValue(

       HKEY hKeyParent,

       PWCHAR KeyName,

       REGSAM rsAccessMask,

       REGSAM rsSamViewFlag,

       PBYTE pValue,

       DWORD dwValueSize

       )

{

   DWORD dwDisposition;

   HKEY hKey;

   DWORD dwRet;

   dwRet =

       RegCreateKeyEx(

           hKeyParent,

           KeyName,

           0,

           NULL,

           REG_OPTION_NON_VOLATILE,

   rsAccessMask | rsSamViewFlag |FORMAT_MESSAGE_FROM_SYSTEM,

           NULL,

           &hKey,

           &dwDisposition);

   if (dwRet != ERROR_SUCCESS)

   {

       printf("Error opening or creating key.\n");

 

       return FALSE;

   }

   // Attempt to set the value of the key.

   // If the call fails, close the key and return.

   if (ERROR_SUCCESS !=

           RegSetValueEx(

               hKey,

               NULL,

               0,

               REG_SZ,

               pValue,

               dwValueSize))

   {

       printf("Could not set registry value.\n");

       RegCloseKey(hKey);

       return FALSE;

   }

   RegCloseKey(hKey);

   return TRUE;

}

// Access a registry key and print its value.

// Return TRUE if the function succeeds, FALSE if it fails.

BOOL

   AccessRegistryKeyValue(

       HKEY hKeyParent,

       PWCHAR KeyName,

       REGSAM rsAccessMask,

       REGSAM rsSamViewFlag

       )

{

   HKEY hKey;

   WCHAR Buffer[MAX_PATH];

   DWORD dwSize = sizeof(Buffer);

   DWORD dwType;

   DWORD dwRet;

   dwRet =

       RegOpenKeyEx(

           hKeyParent,

           KeyName,

           0,

           rsAccessMask | rsSamViewFlag,

           &hKey);

   if (dwRet != ERROR_SUCCESS)

   {

       printf("Error opening key!\n");

       return FALSE;

   }

   if (ERROR_SUCCESS !=

           RegQueryValueEx(

               hKey,

               NULL,

               0,

               &dwType,

               (PBYTE)Buffer,

               &dwSize))

   {

       printf("Could not read registry value.\n");

       RegCloseKey(hKey);

       return FALSE;

   }

   if (rsSamViewFlag != 0)

   {

       printf("Alternate view:  %S\n", Buffer);

   }

   else

   {

       printf("Default view:    %S\n", Buffer);

   }

   RegCloseKey(hKey);

   return TRUE;

}

int

main()

{

   BOOL Res;

   // Define the list of keys to work with.

   typedef struct {

       HKEY hkRoot;

       LPWSTR szRootName;

       LPWSTR szName;

   }KEYDATA;

   KEYDATA Keys[] =

   {

       { HKEY_LOCAL_MACHINE, L"HKLM", L"Software\\Hello World" },

       { HKEY_CLASSES_ROOT, L"HKCR", L"Hello" },

       { HKEY_CLASSES_ROOT, L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}" },

       { HKEY_CLASSES_ROOT, L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}\\InprocServer32" },

       { HKEY_CLASSES_ROOT, L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}\\LocalServer32" }

   };

   // Now create the keys.

   for (int i = 0; i < _countof(Keys); i++)

   {

       // Create the keys in the alternate view of the registry.

       Res =

           CreateRegistryKeyValue(

               Keys[i].hkRoot,

               Keys[i].szName,

               KEY_READ | KEY_WRITE,

               CROSS_ACCESS,

               (PBYTE)ALT_VIEW_DATA,

               sizeof(ALT_VIEW_DATA));

       if (Res == FALSE)

       {

           printf("Could not create keys in alternate view of the registry.\n");

           return 1;

      }

       // Create the keys in the default view of the registry.

       Res =

           CreateRegistryKeyValue(

               Keys[i].hkRoot,

               Keys[i].szName,

               KEY_READ | KEY_WRITE,

               0,

               (PBYTE)VIEW_DATA,

               sizeof(VIEW_DATA));

       if (Res == FALSE)

       {

           printf("Could not create keys in default view of the registry.\n");

           return 1;

       }

   }

   // Access the registry and print key values.

   printf("Application string: %S\n", VIEW_DATA);

   for (int i = 0; i < _countof(Keys); i++)

   {

       printf("%S\\%S\n", Keys[i].szRootName, Keys[i].szName);

       Res =

           AccessRegistryKeyValue(

               Keys[i].hkRoot,

               Keys[i].szName,

               KEY_READ,

               0);

       if (Res == FALSE)

       {

           printf("Unable to access default view of registry.\n");

           return 1;

       }

       // Calls with CROSS_ACCESS explicitly access the alternate registry view.

       Res =

           AccessRegistryKeyValue(

               Keys[i].hkRoot,

               Keys[i].szName,

               KEY_READ,

               CROSS_ACCESS);

       if (Res == FALSE)

       {

           printf("Unable to access alternate view of registry.\n");

           return 1;

       }

   }

   return 0;

}

Leave a Reply

Your email address will not be published. Required fields are marked *