windows-nt/Source/XPSP1/NT/base/ntsetup/inc/pidgen.h
2020-09-26 16:20:57 +08:00

213 lines
7.3 KiB
C

/*++
Copyright (c) 1998-1999, Microsoft Corporation
Module Name:
PIDGen.h
Abstract:
public header
--*/
#ifdef __cplusplus
extern "C" {
#endif
#if defined(WIN32) || defined(_WIN32)
#ifdef UNICODE
#define PIDGen PIDGenW
#define PIDGenSimp PIDGenSimpW
#else
#define PIDGen PIDGenA
#define PIDGenSimp PIDGenSimpA
#endif // UNICODE
#else
#include <string.h>
#include <compobj.h>
typedef BOOL NEAR *PBOOL;
typedef BOOL FAR *LPBOOL;
typedef FILETIME FAR *LPFILETIME;
#define PIDGenA PIDGen
#define lstrlenA lstrlen
#define lstrcpyA lstrcpy
#define wsprintfA wsprintf
#define TEXT(s) __T(s)
#define ZeroMemory(pb, cb) memset(pb, 0, cb)
#define CopyMemory(pb, ab, cb) memcpy(pb, ab, cb)
#endif // defined(WIN32) || defined(_WIN32)
#define DIGITALPIDMAXLEN 256 // Max length of digital PID 3.0 data blob
#define INVALID_PID 0xFFFFFFFF
// PidGenSimp error code values
enum PidGenError { // pge
// Call succeded
pgeSuccess = 0,
// Unable to validate product key. Most likely causes:
// * Product Key was mistyped by user
// * Product Key not compatable with this .dll (wrong GroupId)
pgeProductKeyInvalid = 1,
// Product Key's sequence number is not allowed by this .dll.
// Most likely causes:
// * Using Select or MSDN key with a PidGen/PidCa
// that specifically excludes them
pgeProductKeyExcluded = 2,
// NULL was passed in for the required Product Key. (Must
// point to valid Product key.)
pgeProductKeyNull = 3,
// Product Key is wrong length. After removing any dashes, the length
// is required to be 25 characters
pgeProductKeyBadLen = 4,
// NULL was passed in for the required SKU. (Must point to
// valid SKU.)
pgeSkuNull = 5,
// SKU is wrong length (too long).
pgeSkuBadLen = 6,
// NULL was passed in for the required PID2. (Must
// point to buffer for return PID.)
pgePid2Null = 7,
// NULL was passed in for the required DigPid. (Must
// point to buffer for generated DigitalPID.)
pgeDigPidNull = 8,
// DigPid is wrong length (too small).
pgeDigPidBadLen = 9,
// NULL was passed in for the required MPC.
pgeMpcNull = 10,
// MPC is wrong length. Must be exactly 5 characters.
pgeMpcBadLen = 11,
// OemId is bad. If passed (it's not required) it must
// be 4 characters.
pgeOemIdBadLen = 12,
// Local char set is bad. If provided, must be 24 characters.
pgeLocalBad = 13,
};
/*++
Routine Description:
This routine will determine if a sequence is valid for a particular sku.
Return Value:
pgeSuccess if sequence is in range.
pgeProductKeyExcluded if sequence is not in range.
pgeProductKeyInvalid if range table not found.
--*/
DWORD STDAPICALLTYPE VerifyPIDSequenceW(
IN BOOL fOem, // [IN] is this an OEM install?
IN DWORD dwSeq, // [IN] Sequence to check.
IN PCWSTR pszSKU // [IN] Null terminated string for the SKU
);
// Original, outdated, interface to PidGen
BOOL STDAPICALLTYPE PIDGenA(
LPSTR lpstrSecureCdKey, // [IN] 25-character Secure CD-Key (gets U-Cased)
LPCSTR lpstrMpc, // [IN] 5-character Microsoft Product Code
LPCSTR lpstrSku, // [IN] Stock Keeping Unit (formatted like 123-12345)
LPCSTR lpstrOemId, // [IN] 4-character OEM ID or NULL
LPSTR lpstrLocal24, // [IN] 24-character ordered set to use for decode base conversion or NULL for default set (gets U-Cased)
LPBYTE lpbPublicKey, // [IN] pointer to optional public key or NULL
DWORD dwcbPublicKey, // [IN] byte length of optional public key
DWORD dwKeyIdx, // [IN] key pair index optional public key
BOOL fOem, // [IN] is this an OEM install?
LPSTR lpstrPid2, // [OUT] PID 2.0, pass in ptr to 24 character array
LPBYTE lpbDigPid, // [IN/OUT] pointer to DigitalPID buffer. First DWORD is the length
LPDWORD lpdwSeq, // [OUT] optional ptr to sequence number (can be NULL)
LPBOOL pfCCP, // [OUT] optional ptr to Compliance Checking flag (can be NULL)
LPBOOL pfPSS); // [OUT] optional ptr to 'PSS Assigned' flag (can be NULL)
// Simplified interface to PidGen
DWORD STDAPICALLTYPE PIDGenSimpA(
LPSTR lpstrSecureCdKey, // [IN] 25-character Secure CD-Key (gets U-Cased)
LPCSTR lpstrMpc, // [IN] 5-character Microsoft Product Code
LPCSTR lpstrSku, // [IN] Stock Keeping Unit (formatted like 123-12345)
LPCSTR lpstrOemId, // [IN] 4-character OEM ID or NULL
BOOL fOem, // [IN] is this an OEM install?
LPSTR lpstrPid2, // [OUT] PID 2.0, pass in ptr to 24 character array
LPBYTE lpbDigPid, // [IN/OUT] pointer to DigitalPID buffer. First DWORD is the length
LPDWORD lpdwSeq, // [OUT] optional ptr to sequence number or NULL
LPBOOL pfCCP); // [OUT] ptr to Compliance Checking flag or NULL
#if defined(WIN32) || defined(_WIN32)
// Original, outdated, interface to PidGen
BOOL STDAPICALLTYPE PIDGenW(
LPWSTR lpstrSecureCdKey, // [IN] 25-character Secure CD-Key (gets U-Cased)
LPCWSTR lpstrMpc, // [IN] 5-character Microsoft Product Code
LPCWSTR lpstrSku, // [IN] Stock Keeping Unit (formatted like 123-12345)
LPCWSTR lpstrOemId, // [IN] 4-character OEM ID or NULL
LPWSTR lpstrLocal24, // [IN] 24-character ordered set to use for decode base conversion or NULL for default set (gets U-Cased)
LPBYTE lpbPublicKey, // [IN] pointer to optional public key or NULL
DWORD dwcbPublicKey, // [IN] byte length of optional public key
DWORD dwKeyIdx, // [IN] key pair index optional public key
BOOL fOem, // [IN] is this an OEM install?
LPWSTR lpstrPid2, // [OUT] PID 2.0, pass in ptr to 24 character array
LPBYTE lpbDigPid, // [IN/OUT] pointer to DigitalPID buffer. First DWORD is the length
LPDWORD lpdwSeq, // [OUT] optional ptr to sequence number (can be NULL)
LPBOOL pfCCP, // [OUT] optional ptr to Compliance Checking flag (can be NULL)
LPBOOL pfPSS); // [OUT] optional ptr to 'PSS Assigned' flag (can be NULL)
// Simplified interface to PidGen
DWORD STDAPICALLTYPE PIDGenSimpW(
LPWSTR lpstrSecureCdKey, // [IN] 25-character Secure CD-Key (gets U-Cased)
LPCWSTR lpstrMpc, // [IN] 5-character Microsoft Product Code
LPCWSTR lpstrSku, // [IN] Stock Keeping Unit (formatted like 123-12345)
LPCWSTR lpstrOemId, // [IN] 4-character OEM ID or NULL
BOOL fOem, // [IN] is this an OEM install?
LPWSTR lpstrPid2, // [OUT] PID 2.0, pass in ptr to 24 character array
LPBYTE lpbDigPid, // [IN/OUT] pointer to DigitalPID buffer. First DWORD is the length
LPDWORD lpdwSeq, // [OUT] optional ptr to sequence number or NULL
LPBOOL pfCCP); // [OUT] ptr to Compliance Checking flag or NULL
#endif // defined(WIN32) || defined(_WIN32)
extern HINSTANCE g_hinst;
#ifdef __cplusplus
} /* End of extern "C" { */
#endif /* __cplusplus */