If you are the windows application or driver developer, then might be you need to access the windows registry. In this article, I will describe the way to how to create and access the key in windows registry. Here, I am assuming you are familiar with windows internals and API. If you are not familiar with windows internal and API, see this popular course: Windows Internals
Below find the list of some WinAPI that I am using to create and access the windows registry key:
- RegOpenKeyEx
- RegCreateKeyEx
- RegSetValueEx
- RegQueryValueEx
- RegCloseKey
You can find here a complete list of registry functions – MSDN.
Note: To access the windows registry you should have the admin rights.
Before creating the key we need to understand the windows registry hives. The hives are the group of registry keys, subkey, and the registry values.
You can see the registry hives in registry editor left-hand side of the screen. You can open the registry editor to running the command regedit in the search box or Run window.
Here is a list of some common registry hives in Windows:
- HKEY_CLASSES_ROOT
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
- HKEY_USERS
- HKEY_CURRENT_CONFIG
I think now time to see the example code. In this example code, I will create a key and read/write the value.
How to create a key under the hives:
In this code, you just need to pass the registry hives and key name which you want to create. If everything is fine then this function creates the key under the given hives.
BOOL CreateRegistryKey(HKEY hKeyParent,PWCHAR subkey)
{
DWORD dwDisposition; //It verify new key is created or open existing key
HKEY hKey;
DWORD Ret;
Ret =
RegCreateKeyEx(
hKeyParent,
subkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition);
if (Ret != ERROR_SUCCESS)
{
printf("Error opening or creating new key\n");
return FALSE;
}
RegCloseKey(hKey); //close the key
return TRUE;
}
Write a DWORD value into the created key:
In this function, you need to pass the hives name, key name, value name and DWORD value which you want to store in the key. In this function, I am opening the key and just write the value. If everything fines then the value will store in the registry.
BOOL WriteInRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName,DWORD data)
{
DWORD Ret; //use to check status
HKEY hKey; //key
//Open the key
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_WRITE,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
//Set the value in key
if (ERROR_SUCCESS !=
RegSetValueEx(
hKey,
valueName,
0,
REG_DWORD,
reinterpret_cast<BYTE *>(&data),
sizeof(data)))
{
RegCloseKey(hKey);
return FALSE;
}
//close the key
RegCloseKey(hKey);
return TRUE;
}
return FALSE;
}
If you love online courses, then here is a good c language course for you from the Pluralsight, 10 days trial is Free.
Write a string into the created key:
In this function, you need to pass the hives name, key name, value name, and string which you want to store in the key. Here one thing is to need to remember the size of wide char is 16 bits, so you need to be careful before writing the string into the windows registry.
BOOL writeStringInRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, PWCHAR strData)
{
DWORD Ret;
HKEY hKey;
//Check if the registry exists
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_WRITE,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
if (ERROR_SUCCESS !=
RegSetValueEx(
hKey,
valueName,
0,
REG_SZ,
(LPBYTE)(strData),
((((DWORD)lstrlen(strData) + 1)) * 2)))
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
return FALSE;
}
Read a DWORD value from the created key:
Before reading the value from a key, you should open it first. You require hives name, key name and value name to read the DWORD.
BOOL readDwordValueRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, DWORD *readData)
{
HKEY hKey;
DWORD Ret;
//Check if the registry exists
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_READ,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
DWORD data;
DWORD len = sizeof(DWORD);//size of data
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(LPBYTE)(&data),
&len
);
if (Ret == ERROR_SUCCESS)
{
RegCloseKey(hKey);
(*readData) = data;
return TRUE;
}
RegCloseKey(hKey);
return TRUE;
}
else
{
return FALSE;
}
}
Read a string from the created key:
Similar to the above method. You require hives name, key name and value name to read the string from the key. Before reading the string you need to give the proper length of the string either you will get an error.
BOOL readStringFromRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, PWCHAR *readData)
{
HKEY hKey;
DWORD len = TOTAL_BYTES_READ;
DWORD readDataLen = len;
PWCHAR readBuffer = (PWCHAR )malloc(sizeof(PWCHAR)* len);
if (readBuffer == NULL)
return FALSE;
//Check if the registry exists
DWORD Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_READ,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(BYTE*)readBuffer,
&readDataLen
);
while (Ret == ERROR_MORE_DATA)
{
// Get a buffer that is big enough.
len += OFFSET_BYTES;
readBuffer = (PWCHAR)realloc(readBuffer, len);
readDataLen = len;
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(BYTE*)readBuffer,
&readDataLen
);
}
if (Ret != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return false;;
}
*readData = readBuffer;
RegCloseKey(hKey);
return true;
}
else
{
return false;
}
}
To understand the above methods let see an example code, In the below example, I have created a key “Aticleworld” and two value “date” and “Message”. I will store and read the stored value from the key using the above-described methods.

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#define TOTAL_BYTES_READ 1024
#define OFFSET_BYTES 1024
//Create key in registry
BOOL CreateRegistryKey(HKEY hKeyParent,PWCHAR subkey)
{
DWORD dwDisposition; //It verify new key is created or open existing key
HKEY hKey;
DWORD Ret;
Ret =
RegCreateKeyEx(
hKeyParent,
subkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition);
if (Ret != ERROR_SUCCESS)
{
printf("Error opening or creating key.\n");
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
//Write data in registry
BOOL WriteDwordInRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName,DWORD data)
{
DWORD Ret;
HKEY hKey;
//Open the key
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_WRITE,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
//Set the value in key
if (ERROR_SUCCESS !=
RegSetValueEx(
hKey,
valueName,
0,
REG_DWORD,
reinterpret_cast<BYTE *>(&data),
sizeof(data)))
{
RegCloseKey(hKey);
return FALSE;
}
//close the key
RegCloseKey(hKey);
return TRUE;
}
return FALSE;
}
//Read data from registry
BOOL readDwordValueRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, DWORD *readData)
{
HKEY hKey;
DWORD Ret;
//Check if the registry exists
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_READ,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
DWORD data;
DWORD len = sizeof(DWORD);//size of data
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(LPBYTE)(&data),
&len
);
if (Ret == ERROR_SUCCESS)
{
RegCloseKey(hKey);
(*readData) = data;
return TRUE;
}
RegCloseKey(hKey);
return TRUE;
}
else
{
return FALSE;
}
}
//Write range and type into the registry
BOOL writeStringInRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, PWCHAR strData)
{
DWORD Ret;
HKEY hKey;
//Check if the registry exists
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_WRITE,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
if (ERROR_SUCCESS !=
RegSetValueEx(
hKey,
valueName,
0,
REG_SZ,
(LPBYTE)(strData),
((((DWORD)lstrlen(strData) + 1)) * 2)))
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
return FALSE;
}
//read customer infromation from the registry
BOOL readUserInfoFromRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, PWCHAR *readData)
{
HKEY hKey;
DWORD len = TOTAL_BYTES_READ;
DWORD readDataLen = len;
PWCHAR readBuffer = (PWCHAR )malloc(sizeof(PWCHAR)* len);
if (readBuffer == NULL)
return FALSE;
//Check if the registry exists
DWORD Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_READ,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(BYTE*)readBuffer,
&readDataLen
);
while (Ret == ERROR_MORE_DATA)
{
// Get a buffer that is big enough.
len += OFFSET_BYTES;
readBuffer = (PWCHAR)realloc(readBuffer, len);
readDataLen = len;
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(BYTE*)readBuffer,
&readDataLen
);
}
if (Ret != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return false;;
}
*readData = readBuffer;
RegCloseKey(hKey);
return true;
}
else
{
return false;
}
}
//main function
int _tmain(int argc, _TCHAR* argv[])
{
BOOL status;
DWORD readData;
PWCHAR readMessage = nullptr;
status = CreateRegistryKey(HKEY_CURRENT_USER, L"Aticleworld"); //create key
if (status != TRUE)
return FALSE;
status = WriteDwordInRegistry(HKEY_CURRENT_USER, L"Aticleworld",L"date",12082016); //write dword
if (status != TRUE)
return FALSE;
status = readDwordValueRegistry(HKEY_CURRENT_USER, L"Aticleworld", L"date", &readData); //read dword
if (status != TRUE)
return FALSE;
printf("%ld", readData);
status = writeStringInRegistry(HKEY_CURRENT_USER, L"Aticleworld", L"Message", L"Happy"); //write string
if (status != TRUE)
return FALSE;
status = readUserInfoFromRegistry(HKEY_CURRENT_USER, L"Aticleworld", L"Message", &readMessage); //read string
if (status != TRUE)
return FALSE;
if (readMessage != nullptr)
{
printf(" Message = %S\n", readMessage);
free(readMessage);
readMessage = nullptr;
}
return 0;
}
- Best 5 C Books.
- Get COM PORT of USB Serial Device using the VID and PID.
- Serial port programming using Win32 API.
- Install the port monitor silently without user interaction.
- C++ Interview Questions with Answers.
- C-Sharp Interview Questions.
- Python Interview Questions with Answer.
- Memory Layout in C.
- 100 C interview questions, your interviewer might ask.
- C Interview Questions for the experience.
- 10 questions about dynamic memory allocation
- File handling in C, in few hours.



