/*++

Copyright (c) 1999, Microsoft Corporation

Module Name:

    spidgen.cpp

Abstract:

   wrapper for PIDGen used by winnt32 and syssetup

--*/


#define WINDOWS_LEAN_AND_MEAN  // faster compile

#include <windows.h>

#if defined(WIN32) || defined(_WIN32)

#include <tchar.h>
#include "hardware.h"

#else

#include <stdlib.h>
#include <time.h>
#include <dos.h>

#include "..\..\inc\tchar.h"

extern "C" extern WORD _C000H;
extern "C" extern WORD _F000H;

#endif

#include "..\inc\DigPid.h"
#include "..\inc\shortsig.h"

#include "pidgen.h"
#include "util.h"

#include "crc-32.h"

#ifdef BUILD_SRV
LPSTR lpstrSelectPidKeyA = "R7MPM-R36DT-F38FC-RPPCX-XJG7M";
LPWSTR lpstrSelectPidKeyW = L"R7MPM-R36DT-F38FC-RPPCX-XJG7M";
#endif

#ifdef BUILD_PRO
LPSTR lpstrSelectPidKeyA = "HB9CF-JTKJF-722HV-VPBRF-9VKVM";
LPWSTR lpstrSelectPidKeyW = L"HB9CF-JTKJF-722HV-VPBRF-9VKVM";
#endif

#ifdef BUILD_PER
LPSTR lpstrSelectPidKeyA = "HB9CF-JTKJF-722HV-VPBRF-9VKVM";
LPWSTR lpstrSelectPidKeyW = L"HB9CF-JTKJF-722HV-VPBRF-9VKVM";
#endif

#ifdef BUILD_DDK
LPSTR lpstrSelectPidKeyA = "R2D43-3DHG9-DQ79W-W3DXQ-929DY";
LPWSTR lpstrSelectPidKeyW = L"R2D43-3DHG9-DQ79W-W3DXQ-929DY";
#endif

#ifdef BUILD_TRIAL
// can't have a trial version of select
LPSTR lpstrSelectPidKeyA = "99999-99999-99999-99999-99999";
LPWSTR lpstrSelectPidKeyW = L"99999-99999-99999-99999-99999";
#endif BUILD_TRIAL

#ifdef BUILD_VOL
LPSTR lpstrSelectPidKeyA = "HB9CF-JTKJF-722HV-VPBRF-9VKVM";
LPWSTR lpstrSelectPidKeyW = L"HB9CF-JTKJF-722HV-VPBRF-9VKVM";
#endif

#ifdef BUILD_EVAL
// can't have a trial version of select
LPSTR lpstrSelectPidKeyA = "99999-99999-99999-99999-99999";
LPWSTR lpstrSelectPidKeyW = L"99999-99999-99999-99999-99999";
#endif BUILD_TRIAL

extern "C" BOOL STDAPICALLTYPE SetupPIDGenA(
    LPSTR   lpstrSecureCdKey,   // [IN] 25-character Secure CD-Key (gets U-Cased)
    LPCSTR  lpstrRpc,           // [IN] 5-character Release Product Code
    LPCSTR  lpstrSku,           // [IN] Stock Keeping Unit (formatted like 123-12345)
    BOOL    fOem,               // [IN] is this an OEM install?
    LPSTR   lpstrPid2,          // [OUT] PID 2.0, pass in ptr to 24 character array
    LPBYTE  lpbPid3,            // [OUT] pointer to binary PID3 buffer. First DWORD is the length
    LPBOOL  pfCCP)              // [OUT] optional ptr to Compliance Checking flag (can be NULL)
{
    DWORD dwRet;

    // lpstrSecureCdKey must not be NULL
    if ('\0' == lpstrSecureCdKey[0]){
	// if we are passed an empty string, assume it's the select string
	DWORD i;
	// lets not forget that the Secure CD-Key has dashes in it
	for(i=0; i <= 29; i++){
	    lpstrSecureCdKey[i] = lpstrSelectPidKeyA[i];
	}
    }

    dwRet = PIDGenA(
        lpstrSecureCdKey,
        lpstrRpc,
        lpstrSku,
        NULL,
        NULL,
        NULL,
        0,
        0,
        fOem,

        lpstrPid2,
        lpbPid3,
        NULL,
        pfCCP,
        NULL);

    return dwRet;
}

extern "C" BOOL STDAPICALLTYPE SetupPIDGenExA(
    LPSTR   lpstrSecureCdKey,   // [IN] 25-character Secure CD-Key (gets U-Cased)
    LPCSTR  lpstrRpc,           // [IN] 5-character Release Product Code
    LPCSTR  lpstrSku,           // [IN] Stock Keeping Unit (formatted like 123-12345)
    BOOL    fOem,               // [IN] is this an OEM install?
    LPSTR   lpstrPid2,          // [OUT] PID 2.0, pass in ptr to 24 character array
    LPBYTE  lpbPid3,            // [OUT] pointer to binary PID3 buffer. First DWORD is the length
    LPBOOL  pfCCP,              // [OUT] optional ptr to Compliance Checking flag (can be NULL)
    LPBOOL  pfVL)
{
    DWORD dwRet;

    // lpstrSecureCdKey must not be NULL
    if ('\0' == lpstrSecureCdKey[0]){
	// if we are passed an empty string, assume it's the select string
	DWORD i;
	// lets not forget that the Secure CD-Key has dashes in it
	for(i=0; i <= 29; i++){
	    lpstrSecureCdKey[i] = lpstrSelectPidKeyA[i];
	}
    }

    dwRet = PIDGenExA(
        lpstrSecureCdKey,
        lpstrRpc,
        lpstrSku,
        NULL,
        NULL,
        NULL,
        0,
        0,
        fOem,

        lpstrPid2,
        lpbPid3,
        NULL,
        pfCCP,
        NULL,
        pfVL);

    return dwRet;
}

#if defined(WIN32) || defined(_WIN32)

extern "C" BOOL STDAPICALLTYPE SetupPIDGenW(
    LPWSTR  lpstrSecureCdKey,   // [IN] 25-character Secure CD-Key (gets U-Cased)
    LPCWSTR lpstrRpc,           // [IN] 5-character Release Product Code
    LPCWSTR lpstrSku,           // [IN] Stock Keeping Unit (formatted like 123-12345)
    BOOL   fOem,                // [IN] is this an OEM install?
    LPWSTR lpstrPid2,           // [OUT] PID 2.0, pass in ptr to 24 character array
    LPBYTE  lpbPid3,            // [OUT] pointer to DigitalPID. First DWORD is the length
    LPBOOL  pfCCP)              // [OUT] optional ptr to Compliance Checking flag (can be NULL)
{

    DWORD dwRet;

    if (L'\0' == lpstrSecureCdKey[0]){
	// if we are passed an empty key write the select key in.
	DWORD i;
	// don't forget that the SecureCd-Key has dashes in it.
	for(i=0; i <= 29; i++){
	    lpstrSecureCdKey[i] = lpstrSelectPidKeyW[i];
	}
    }

    dwRet = PIDGenW(
        lpstrSecureCdKey,
        lpstrRpc,
        lpstrSku,
        NULL,
        NULL,
        NULL,
        0,
        0,
        fOem,

        lpstrPid2,
        lpbPid3,
        NULL,
        pfCCP,
        NULL);

     return dwRet;
}

extern "C" BOOL STDAPICALLTYPE SetupPIDGenExW(
    LPWSTR  lpstrSecureCdKey,   // [IN] 25-character Secure CD-Key (gets U-Cased)
    LPCWSTR lpstrRpc,           // [IN] 5-character Release Product Code
    LPCWSTR lpstrSku,           // [IN] Stock Keeping Unit (formatted like 123-12345)
    BOOL   fOem,                // [IN] is this an OEM install?
    LPWSTR lpstrPid2,           // [OUT] PID 2.0, pass in ptr to 24 character array
    LPBYTE  lpbPid3,            // [OUT] pointer to DigitalPID. First DWORD is the length
    LPBOOL  pfCCP,              // [OUT] optional ptr to Compliance Checking flag (can be NULL)
    LPBOOL  pfVL)
{

    DWORD dwRet;

    if (L'\0' == lpstrSecureCdKey[0]){
	// if we are passed an empty key write the select key in.
	DWORD i;
	// don't forget that the SecureCd-Key has dashes in it.
	for(i=0; i <= 29; i++){
	    lpstrSecureCdKey[i] = lpstrSelectPidKeyW[i];
	}
    }

    dwRet = PIDGenExW(
        lpstrSecureCdKey,
        lpstrRpc,
        lpstrSku,
        NULL,
        NULL,
        NULL,
        0,
        0,
        fOem,

        lpstrPid2,
        lpbPid3,
        NULL,
        pfCCP,
        NULL,
        pfVL);

     return dwRet;
}

#endif // defined(WIN32) || defined(_WIN32)

