/*++

Copyright (c) 1997 Microsoft Corporation

Module Name:

    hkcrtool.c

Abstract:

    Implements a stub tool that is designed to run with NT-side
    upgrade code.

Author:

    <full name> (<alias>) <date>

Revision History:

    <alias> <date> <comments>

--*/

#include "pch.h"


BOOL
Init (
    VOID
    )
{
    HINSTANCE hInstance;
    DWORD dwReason;
    PVOID lpReserved;

    //
    // Simulate DllMain
    //

    hInstance = GetModuleHandle (NULL);
    dwReason = DLL_PROCESS_ATTACH;
    lpReserved = NULL;

    //
    // Initialize DLL globals
    //

    if (!FirstInitRoutine (hInstance)) {
        return FALSE;
    }

    //
    // Initialize all libraries
    //

    if (!InitLibs (hInstance, dwReason, lpReserved)) {
        return FALSE;
    }

    //
    // Final initialization
    //

    if (!FinalInitRoutine ()) {
        return FALSE;
    }

    return TRUE;
}

VOID
Terminate (
    VOID
    )
{
    HINSTANCE hInstance;
    DWORD dwReason;
    PVOID lpReserved;

    //
    // Simulate DllMain
    //

    hInstance = GetModuleHandle (NULL);
    dwReason = DLL_PROCESS_DETACH;
    lpReserved = NULL;

    //
    // Call the cleanup routine that requires library APIs
    //

    FirstCleanupRoutine();

    //
    // Clean up all libraries
    //

    TerminateLibs (hInstance, dwReason, lpReserved);

    //
    // Do any remaining clean up
    //

    FinalCleanupRoutine();
}


INT
__cdecl
wmain (
    INT argc,
    WCHAR *argv[]
    )
{
    REGKEY_ENUM e1, e;
    HKEY Key;
    BOOL b;
    PCTSTR Data;
    TCHAR KeyName[MAX_REGISTRY_KEY];

    if (!Init()) {
        wprintf (L"Unable to initialize!\n");
        return 255;
    }

    if (1) {
        _tprintf (TEXT("Keys in CLSID that are in TypeLib too:\n\n"));

        if (EnumFirstRegKeyStr (&e1, TEXT("HKLM\\Software\\Classes\\CLSID"))) {
            do {
                wsprintf (KeyName, TEXT("HKLM\\Software\\Classes\\TypeLib\\%s"), e1.SubKeyName);
                Key = OpenRegKeyStr (KeyName);

                if (Key) {
                    _tprintf (TEXT("%s\n"), e1.SubKeyName);
                    CloseRegKey (Key);
                }
            } while (EnumNextRegKey (&e1));
        }
    }

    else if (0) {

        _tprintf (TEXT("Overwritable GUIDs:\n\n"));

        if (EnumFirstRegKeyStr (&e1, TEXT("HKLM\\Software\\Classes\\CLSID"))) {
            do {
                Key = OpenRegKey (e1.KeyHandle, e1.SubKeyName);
                b = TRUE;

                if (EnumFirstRegKey (&e, Key)) {
                    do {
                        if (StringIMatchCharCount (e.SubKeyName, TEXT("Inproc"), 6) ||
                            StringIMatch (e.SubKeyName, TEXT("LocalServer")) ||
                            StringIMatch (e.SubKeyName, TEXT("LocalServer32")) ||
                            StringIMatch (e.SubKeyName, TEXT("ProxyStubClsid32"))
                            ) {
                            b = FALSE;
                            break;
                        }
                    } while (EnumNextRegKey (&e));
                }

                if (b) {
                    Data = (PCTSTR) GetRegKeyData (e1.KeyHandle, e1.SubKeyName);
                    if (Data && *Data) {
                        _tprintf (TEXT("  %s\n"), Data);
                        MemFree (g_hHeap, 0, Data);
                    } else {
                        _tprintf (TEXT("  GUID: %s\n"), e1.SubKeyName);
                    }

                    if (EnumFirstRegKey (&e, Key)) {
                        do {
                            _tprintf (TEXT("    %s\n"), e.SubKeyName);
                        } while (EnumNextRegKey (&e));
                    }
                }

                CloseRegKey (Key);
            } while (EnumNextRegKey (&e1));
        }
    }


    Terminate();

    return 0;
}