/*++

Copyright (c) 1994 - 1995 Microsoft Corporation

Module Name:

    Ci.c

Abstract:

    Class installer test program

Author:


Revision History:


--*/

#define NOMINMAX
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <cfgmgr32.h>
#include <setupapi.h>
#include <initguid.h>
#include <devguid.h>
#include <winspool.h>
#include <stdio.h>
#include <stdlib.h>

#include "..\splsetup.h"

HDEVINFO    hDevInfo;

void
DoInstallWizard(
    )
{
    SP_INSTALLWIZARD_DATA InstWizData;

    ZeroMemory(&InstWizData, sizeof(SP_INSTALLWIZARD_DATA));
    InstWizData.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    InstWizData.ClassInstallHeader.InstallFunction = DIF_INSTALLWIZARD;
    InstWizData.hwndWizardDlg = 0;

    if ( !SetupDiSetClassInstallParams(hDevInfo,
                                       NULL,
                                       &InstWizData.ClassInstallHeader,
                                       sizeof(InstWizData),
                                       NULL) ) {

        printf("SetupDiSetClassInstallParams fails with %d\n", GetLastError());
        return;
    }

    SetupDiCallClassInstaller(DIF_INSTALLWIZARD, hDevInfo, NULL);
    SetupDiCallClassInstaller(DIF_DESTROYWIZARDDATA, hDevInfo, NULL);
}


void
InstallDevice(
    )
{
    SP_DEVINFO_DATA     DevInfoData;
    DWORD               Error;
    HKEY                hKey;

    do {

        PSetupSelectDriver(hDevInfo);

        if ( GetLastError() != ERROR_SUCCESS )
            break;
        
        DevInfoData.cbSize = sizeof(DevInfoData);
        if ( !SetupDiCreateDeviceInfo(hDevInfo,
                                      TEXT("Printer"),
                                      (LPGUID)&GUID_DEVCLASS_PRINTER,
                                      NULL,
                                      0,
                                      DICD_GENERATE_ID | DICD_INHERIT_CLASSDRVS,
                                      &DevInfoData) ) {

            printf("SetupDiCreateDeviceInfo failed with %d\n", GetLastError());
            continue;
        }

        if ( Error = CM_Open_DevNode_Key(DevInfoData.DevInst,
                                         KEY_WRITE,
                                         0,
                                         RegDisposition_OpenAlways,
                                         &hKey,
                                         CM_REGISTRY_HARDWARE) ) {

            printf("CM_Open_DevNode_Key failed with %d\n", Error);
            continue;
        }

        if ( Error = RegSetValueEx(hKey,
                                   TEXT("PortName"), 
                                   NULL,
                                   REG_SZ,  
                                   TEXT("LPT1:"),
                                   (lstrlen(TEXT("LPT1")) + 1 ) * sizeof(TCHAR)) ) {

            printf("RegSetValueEx failed with %d\n", Error);
            continue;
        }

        RegCloseKey(hKey);

        SetupDiCallClassInstaller(DIF_INSTALLDEVICE, hDevInfo, &DevInfoData);
    } while ( 1 );

}


void
InstallDriver(
    )
{
}

int
#if !defined(_MIPS_) && !defined(_ALPHA_) && !defined(_PPC_)
_cdecl
#endif
main (argc, argv)
    int argc;
    char *argv[];
{
    DWORD   dwLastError;

    hDevInfo = PSetupCreatePrinterDeviceInfoList(0);

    if ( hDevInfo == INVALID_HANDLE_VALUE ) {

        printf("%s: PSetupCreatePrinterDeviceInfoList fails with %d\n",
               argv[0], GetLastError());
        return 0;
    }

    DoInstallWizard();
    InstallDevice();

    PSetupDestroyPrinterDeviceInfoList(hDevInfo);
}


void
DumpDriverInfo3(
    LPDRIVER_INFO_3 p3
    )
{
    LPTSTR   pp;

    printf("\tDriverInfo3:\n");
    printf("\t----------------------------------------------------------\n");
    printf("Driver Name     : %ws\n", p3->pName);
    printf("Driver File     : %ws\n", p3->pDriverPath);
    printf("Config File     : %ws\n", p3->pConfigFile);
    printf("Data File       : %ws\n", p3->pDataFile);
    printf("Help File       : %ws\n", p3->pHelpFile);

    if ( p3->pDependentFiles && *p3->pDependentFiles ) {

        printf("Dependent File  : ");
        for ( pp = p3->pDependentFiles; pp && *pp ; pp += wcslen(pp) + 1 )
            printf("%ws ", pp);
       printf("\n");
    } else
        printf("Dependent File  : %ws\n", p3->pDependentFiles);

    printf("Monitor Name    : %ws\n", p3->pMonitorName);
    printf("DefaultData     : %ws\n", p3->pDefaultDataType);
}

void
DumpSelectedDriver(
    HDEVINFO    hDevInfo
    )
{
}