#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;
}