140 lines
3.2 KiB
C++
140 lines
3.2 KiB
C++
/*++
|
|
|
|
Copyright (c) 1998-1999, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
|
|
PIDSet.cpp
|
|
|
|
Abstract:
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
|
|
#include "hardware.h"
|
|
|
|
#include "tchar.h"
|
|
#include "DigPid.h"
|
|
#include "crc-32.h"
|
|
|
|
|
|
BOOL PidRead(LPDIGITALPID pdpid, DWORD cbDpid)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
|
|
LONG lStatus;
|
|
HKEY hkey;
|
|
|
|
if (NULL != pdpid)
|
|
{
|
|
lStatus = RegOpenKeyEx(
|
|
HKEY_LOCAL_MACHINE,
|
|
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion"),
|
|
0,
|
|
KEY_QUERY_VALUE,
|
|
&hkey);
|
|
|
|
if ( lStatus == ERROR_SUCCESS )
|
|
{
|
|
DWORD dwValueType;
|
|
|
|
lStatus = RegQueryValueEx(
|
|
hkey, TEXT("DigitalProductId"), NULL, &dwValueType, (LPBYTE)pdpid, &cbDpid);
|
|
|
|
fSuccess = (ERROR_SUCCESS == lStatus);
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
}
|
|
return fSuccess;
|
|
}
|
|
|
|
|
|
BOOL PidWrite(LPDIGITALPID pdpid, DWORD cbDpid)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
|
|
LONG lStatus;
|
|
HKEY hkey;
|
|
|
|
if (NULL != pdpid)
|
|
{
|
|
lStatus = RegOpenKeyEx(
|
|
HKEY_LOCAL_MACHINE,
|
|
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion"),
|
|
0,
|
|
KEY_WRITE,
|
|
&hkey);
|
|
|
|
if ( lStatus == ERROR_SUCCESS )
|
|
{
|
|
lStatus = RegSetValueEx(
|
|
hkey, // handle of key to set value for
|
|
TEXT("DigitalProductId"), // name of the value to set
|
|
0, // reserved
|
|
REG_BINARY, // flag for value type
|
|
(LPBYTE)pdpid, // address of value data
|
|
cbDpid); // size of value data
|
|
|
|
fSuccess = (ERROR_SUCCESS == lStatus);
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
}
|
|
return fSuccess;
|
|
}
|
|
|
|
|
|
int PASCAL WinMain(
|
|
HINSTANCE, // hInstance, // handle to current instance
|
|
HINSTANCE, // hPrevInstance, // handle to previous instance
|
|
LPSTR, // lpCmdLine, // pointer to command line
|
|
int )// nCmdShow // show state of window)
|
|
{
|
|
BOOL fOk = TRUE;
|
|
BYTE abDigPid[1024] = {0};
|
|
LPDIGITALPID pdpid = (LPDIGITALPID)abDigPid;
|
|
|
|
|
|
fOk = PidRead(pdpid, sizeof(abDigPid));
|
|
|
|
// check the version and ensure the HWID has not been set
|
|
|
|
if (
|
|
fOk &&
|
|
3 == pdpid->wVersionMajor &&
|
|
'\0' == pdpid->aszHardwareIdStatic[0] &&
|
|
0 == pdpid->dwBiosChecksumStatic &&
|
|
0 == pdpid->dwVolSerStatic &&
|
|
0 == pdpid->dwTotalRamStatic &&
|
|
0 == pdpid->dwVideoBiosChecksumStatic)
|
|
{
|
|
BOOL fCrcGood = ( 0 == CRC_32((LPBYTE)pdpid, sizeof(*pdpid)) );
|
|
CHardware hwid;
|
|
|
|
strcpy(pdpid->aszHardwareIdStatic, hwid.GetID());
|
|
|
|
pdpid->dwBiosChecksumStatic = hwid.GetBiosCrc32();
|
|
pdpid->dwVolSerStatic = hwid.GetVolSer();
|
|
pdpid->dwTotalRamStatic = hwid.GetTotalRamMegs();
|
|
pdpid->dwVideoBiosChecksumStatic = hwid.GetVideoBiosCrc32();
|
|
|
|
if (fCrcGood)
|
|
{
|
|
pdpid->dwCrc32 = CRC_32((LPBYTE)pdpid, sizeof(*pdpid)-sizeof(pdpid->dwCrc32));
|
|
}
|
|
else
|
|
{
|
|
pdpid->dwCrc32 = 0;
|
|
}
|
|
PidWrite(pdpid, pdpid->dwLength);
|
|
}
|
|
return 0;
|
|
}
|
|
|