Thursday, December 1, 2011

Enumurating all names and values of registry key

HKEY hKey = NULL;
if( RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Hewlett-Packard\\LaserJetService\\{488E28CB-3EAC-4EF3-8ACA-EE161849B618}",0,KEY_READ,&hKey) == ERROR_SUCCESS)
{

DWORD cSubKeys; // number of subkeys
DWORD cbMaxSubKey; // longest subkey size
DWORD cchMaxClass; // longest class string
DWORD cValues = 0; // number of values for key
DWORD cchMaxValue; // longest value name
DWORD cbMaxValueData; // longest value data
DWORD cbSecurityDescriptor; // size of security descriptor
FILETIME ftLastWriteTime; // last write time

DWORD j;
DWORD retValue;

// Get the class name and the value count.
retValue = RegQueryInfoKey(hKey, // key handle
NULL, // buffer for class name
NULL, // length of class string
NULL, // reserved
&cSubKeys, // number of subkeys
&cbMaxSubKey, // longest subkey size
&cchMaxClass, // longest class string
&cValues, // number of values for this key
&cchMaxValue, // longest value name
&cbMaxValueData, // longest value data
&cbSecurityDescriptor, // security descriptor
&ftLastWriteTime); // last write time

// Enumerate the child keys, until RegEnumKeyEx fails.

TCHAR *achValueName = new TCHAR[cchMaxValue+1];
if (!achValueName) return;

TCHAR *achValueData = new TCHAR[cbMaxValueData+1];
if (!achValueData)
{
delete [] achValueName;
return;
}


// Enumerate the key values.

if (cValues && cValues!=-1 && retValue==ERROR_SUCCESS)
{
for (j = 0, retValue = ERROR_SUCCESS; j < cValues; j++)
{
DWORD cchValueName = cchMaxValue + 1;
DWORD cchValueData = cbMaxValueData + 1;
DWORD dwType;

achValueName[0] = _T('\0');
achValueData[0] = _T('\0');

retValue = RegEnumValue(hKey, j, achValueName,
&cchValueName,
NULL,
&dwType,
(LPBYTE) achValueData,
&cchValueData);

if (retValue == ERROR_SUCCESS)
{
int n = 8;
}

}

} // end if (cValues && cValues!=-1)

if (achValueData)
delete [] achValueData;
if (achValueName)
delete [] achValueName;

RegCloseKey(hKey);
}