windows-nt/Source/XPSP1/NT/sdktools/sysparse/nt4dev.cpp
2020-09-26 16:20:57 +08:00

194 lines
5.4 KiB
C++

#include "globals.h"
kNT4DevWalk::kNT4DevWalk(kLogFile *Proc, HWND hIn)
{
LogProc=Proc;
hMainWnd=hIn;
}
BOOL kNT4DevWalk::Begin()
{
DWORD dwRet = 0;
dwCurrentKey = 0;
dwLevel2Key = 0;
lstrcpy(szRootKeyString, "SYSTEM\\CurrentControlSet\\Enum\\Root");
if (ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE, szRootKeyString, 0, KEY_READ, &hkeyRoot))
return REG_SUCCESS;
else
return REG_FAILURE;
return REG_FAILURE;
}
BOOL kNT4DevWalk::Walk()
{
DWORD dwIndex = 0;
PTCHAR pName = NULL, pFull = NULL;
DWORD dwSizeName = MAX_PATH * 4;
pName = (PTCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSizeName);
if(!pName)
return FALSE;
pFull = (PTCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSizeName);
if(!pFull) {
HeapFree(GetProcessHeap(), NULL, pName);
return FALSE;
}
while (ERROR_SUCCESS == RegEnumKeyEx(hkeyRoot, dwIndex, pName, &dwSizeName, NULL, NULL, NULL, NULL)) {
wsprintf(pFull, "SYSTEM\\CurrentControlSet\\Enum\\Root\\%s", pName);
if (!lstrcmp(pName, "Control")) {
GetKeyValues(pFull);
}
SearchSubKeys(pFull);
dwSizeName = MAX_PATH * 4;
dwIndex++;
}
HeapFree(GetProcessHeap(), NULL, pName);
HeapFree(GetProcessHeap(), NULL, pFull);
return TRUE;
}
BOOL kNT4DevWalk::SearchSubKeys(PTCHAR szName)
{
HKEY hKeyTemp;
DWORD dwIndex = 0;
PTCHAR szName2 = NULL;
DWORD dwSizeName = MAX_PATH * 4;
szName2 = (PTCHAR)malloc(MAX_PATH * 4);
if(!szName2)
return FALSE;
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, szName, 0, KEY_READ, &hKeyTemp))
{
free(szName2);
return FALSE;
}
while (ERROR_SUCCESS == RegEnumKeyEx(hKeyTemp, dwIndex, szName2, &dwSizeName, NULL, NULL, NULL, NULL))
{
TCHAR szFull[MAX_PATH * 4];
wsprintf(szFull, "%s\\%s", szName, szName2);
if (ERROR_SUCCESS == lstrcmp(szName2, "Control"))
{
GetKeyValues(szName);
SearchSubKeys(szFull);
dwSizeName = MAX_PATH * 4;
dwIndex++;
}
}
free(szName2);
return TRUE;
}
BOOL kNT4DevWalk::GetKeyValues(PTCHAR szName)
{
HKEY hkeyUninstallKey;
TCHAR szFullKey[MAX_PATH * 4];
PTCHAR szProductName = NULL;
DWORD dwProductSize = MAX_PATH * 4;
DWORD dwType = REG_SZ;
szProductName = (PTCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PATH * 4);
if(!szProductName)
return FALSE;
wsprintf(szFullKey, "%s\\%s", szRootKeyString, szName);
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szName, 0, KEY_READ, &hkeyUninstallKey))
{
LogProc->LogString(",%s,", szName);
szProductName[0] = 0;
dwProductSize = MAX_PATH * 4;
if (ERROR_SUCCESS == RegQueryValueEx(hkeyUninstallKey, "Class", NULL, &dwType, (PBYTE)szProductName, &dwProductSize)
&& lstrlen(szProductName) != 0)
{
LogProc->LogString("%s,", szProductName);
}
else
{
LogProc->LogString("NULL,");
}
szProductName[0] = 0;
dwProductSize = MAX_PATH * 4;
if (ERROR_SUCCESS == RegQueryValueEx(hkeyUninstallKey, "DeviceDesc", NULL, &dwType, (PBYTE)szProductName, &dwProductSize)
&& lstrlen(szProductName) != 0)
{
LogProc->StripCommas(szProductName);
LogProc->LogString("%s,", szProductName);
}
else
LogProc->LogString("NULL,");
lstrcpy(szProductName, "");
dwProductSize = MAX_PATH * 4;
if (ERROR_SUCCESS == RegQueryValueEx(hkeyUninstallKey, "HardWareID", NULL, &dwType, (PBYTE)szProductName, &dwProductSize)
&& lstrlen(szProductName)!=0)
{
LogProc->StripCommas(szProductName);
LogProc->LogString("%s,", szProductName);
}
else
LogProc->LogString("NULL,");
szProductName[0] = 0;
dwProductSize = MAX_PATH * 4;
if (ERROR_SUCCESS == RegQueryValueEx(hkeyUninstallKey, "Mfg", NULL, &dwType, (PBYTE)szProductName, &dwProductSize)
&& lstrlen(szProductName) != 0)
{
LogProc->StripCommas(szProductName);
LogProc->LogString("%s,", szProductName);
}
else
LogProc->LogString("NULL,");
szProductName[0] = 0;
wsprintf(szFullKey, "%s\\Control", szName);
HKEY hkTemp;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szFullKey, 0, KEY_READ, &hkTemp))
{
dwProductSize = MAX_PATH * 4;
if (ERROR_SUCCESS == RegQueryValueEx(hkTemp, "ActiveService", NULL, &dwType, (PBYTE)szProductName, &dwProductSize)
&& lstrlen(szProductName) != 0)
{
LogProc->StripCommas(szProductName);
LogProc->LogString("%s,\r\n", szProductName);
}
else
LogProc->LogString("NULL,\r\n");
szProductName[0] = 0;
RegCloseKey(hkTemp);
}
else
LogProc->LogString("NULL,\r\n");
}
else
{
HeapFree(GetProcessHeap(), NULL, szProductName);
return REG_FAILURE;
}
HeapFree(GetProcessHeap(), NULL, szProductName);
RegCloseKey(hkeyUninstallKey);
return REG_SUCCESS;
}