Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

123 lines
3.8 KiB

//Copyright (c) 1998 - 2001 Microsoft Corporation
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <tchar.h>
#include "DigPid1.h"
#include "PidGen.h"
#include "ValidDP.h"
#include "LicenseCodeLite.h"
#include "SequenceRanges.h"
#define GROUP12TXT _TEXT("06")
#define GROUP14TXT _TEXT("07")
#define GROUP0TXT _TEXT("00")
DWORD GetLCProductType(TCHAR * tcLicenceCode, TCHAR ** tcProductType, DWORD * dwGroupID)
{
BOOL fOk = false; // success flag
TCHAR *pszMpc= _TEXT("12345"); // 5 numeral Microsoft Product Code
TCHAR szPid2[32]; // Microsoft Product ID
BYTE abPid3[DIGITALPIDMAXLEN]; // new Digital Product ID
DWORD dwSeq = 0; // 9 digit sequence number
BOOL fOEM = FALSE; // [IN] Is this an OEM Product Key, default to Retail
BOOL fCCP = FALSE; // [OUT] Compliance Checking Product (Is upgrade?)
DWORD dwPge; // PidGenError
DWORD dwSearchLoop;
TCHAR * tcGroupId;
DWORD dwRetVal = ERROR_SUCCESS;
szPid2[0] = _TEXT('\0');
// Must set the first DWORD of abPid3 to the total length of the
// buffer. On return the first DWORD will be set the the length
// actually used.
*(LPDWORD)abPid3 = sizeof(abPid3);
// Both Unicode and ANSI versions of PIDGenSimp are supported
#ifdef UNICODE
// return value is a PidGenError (see PidGen.h)
dwPge = PIDGenStatic(
tcLicenceCode, // [IN] 25-character Secure CD-Key (gets U-Cased)
pszMpc, // [IN] 5-character Microsoft Product Code
L"", // [IN] Stock Keeping Unit (formatted like 123-12345)
NULL, // [IN] 4-character OEM ID or NULL
NULL, // [IN] pointer to optional public key or NULL
0, // [IN] byte length of optional public key
0, // [IN] key pair index optional public key
fOEM, // [IN] is this an OEM install?
szPid2, // [OUT] PID 2.0, pass in ptr to 24 character array
abPid3, // [IN/OUT] pointer to binary PID3 buffer.
&dwSeq, // [OUT] optional ptr to sequence number (can be NULL)
NULL); // [OUT] ptr to Compliance Checking flag or NULL
#else
// return value is a PidGenError (see PidGen.h)
dwPge = PIDGenStatic(
tcLicenceCode, // [IN] 25-character Secure CD-Key (gets U-Cased)
pszMpc, // [IN] 5-character Microsoft Product Code
"", // [IN] Stock Keeping Unit (formatted like 123-12345)
NULL, // [IN] 4-character OEM ID or NULL
fOEM, // [IN] is this an OEM install?
szPid2, // [OUT] PID 2.0, pass in ptr to 24 character array
abPid3, // [IN/OUT] pointer to binary PID3 buffer.
&dwSeq, // [OUT] optional ptr to sequence number (can be NULL)
NULL); // [OUT] ptr to Compliance Checking flag or NULL
#endif
if (pgeSuccess != dwPge)
{
dwRetVal = INVALID_PRODUCT_KEY;
goto done;
}
//Using the PID2 object generated by PIDGen determine the GroupID
//The ValidDP12.lib provides the PIDGen interface and is configured for only Group 12 and 0.
tcGroupId = szPid2+18;
if (!_tcsncmp( tcGroupId, GROUP12TXT, 2 ))
{
*dwGroupID = 12;
}
else if (!_tcsncmp( tcGroupId, GROUP0TXT, 2 ))
{
*dwGroupID = 0;
}
else if(!_tcsncmp( tcGroupId, GROUP14TXT, 2 ))
{
*dwGroupID = 14;
}
else
{
*dwGroupID = -1;
dwRetVal = INVALID_GROUP_ID;
goto done;
}
//Check if the sequence number falls into one of the predefined product type ranges.
for (dwSearchLoop = 0; dwSearchLoop < RANGE_SIZE; dwSearchLoop++)
{
if (g_ProductTypeRanges[dwSearchLoop].dwRangeStart <= dwSeq &&
g_ProductTypeRanges[dwSearchLoop].dwRangeEnd >= dwSeq)
{
*tcProductType = g_ProductTypeRanges[dwSearchLoop].szProductType;
fOk = true;
break;
}
}
if (!fOk)
dwRetVal = INVALID_SERIAL_NUMBER;
done:
return dwRetVal;
}