396 lines
12 KiB
C
396 lines
12 KiB
C
/*******************************************************************************
|
|
*
|
|
* (C) COPYRIGHT MICROSOFT CORP., 1997
|
|
*
|
|
* TITLE: MAKEINF.C
|
|
*
|
|
* VERSION: 2.0
|
|
*
|
|
* AUTHOR: ReedB
|
|
*
|
|
* DATE: 1 Jan, 1997
|
|
*
|
|
* DESCRIPTION:
|
|
* Main code for the default power schemes INF generator, MAKEINF.EXE.
|
|
* Generates INF file which can be read by Memphis setup.
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#include "parse.h"
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* WriteRegBinary
|
|
*
|
|
* DESCRIPTION:
|
|
* Write binary data out to the registry specification file.
|
|
*
|
|
* PARAMETERS:
|
|
*
|
|
*******************************************************************************/
|
|
|
|
VOID WriteRegBinary(FILE *fInf, PVOID pv, UINT uiSize, char *pszIndent, char *pszDecoration)
|
|
{
|
|
PBYTE pb = pv;
|
|
UINT uiRow = 0;
|
|
|
|
fprintf(fInf, "%s%s", pszDecoration, pszIndent);
|
|
while (uiSize) {
|
|
if (uiSize > 1) {
|
|
fprintf(fInf, "%02X,", *pb++);
|
|
}
|
|
else {
|
|
fprintf(fInf, "%02X", *pb++);
|
|
}
|
|
uiSize--;
|
|
if (uiRow++ == 15) {
|
|
uiRow = 0;
|
|
if (uiSize > 1) {
|
|
fprintf(fInf, "\\\n%s%s", pszDecoration, pszIndent);
|
|
}
|
|
else {
|
|
fprintf(fInf, "\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* WriteInfHeader
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* PARAMETERS:
|
|
*
|
|
*******************************************************************************/
|
|
|
|
BOOLEAN WriteInfHeader(FILE *fInf)
|
|
{
|
|
fprintf(fInf, "; POWERCFG.INF\n");
|
|
fprintf(fInf, "; Copyright (c) 1993-2000, Microsoft Corporation\n");
|
|
fprintf(fInf, "\n");
|
|
fprintf(fInf, "[Version]\n");
|
|
fprintf(fInf, "Signature = \"$CHICAGO$\"\n");
|
|
fprintf(fInf, "SetupClass = BASE\n");
|
|
fprintf(fInf, "LayoutFile = layout.inf, layout1.inf\n");
|
|
fprintf(fInf, "\n");
|
|
fprintf(fInf, "[DestinationDirs]\n");
|
|
fprintf(fInf, "PowerCfg.copy.inf = 17 ; LDID_INF\n");
|
|
fprintf(fInf, "PowerCfg.copy.sys = 11 ; LDID_SYS\n");
|
|
fprintf(fInf, "\n");
|
|
fprintf(fInf, "[BaseWinOptions]\n");
|
|
fprintf(fInf, "PowerCfg.base\n");
|
|
fprintf(fInf, "\n");
|
|
fprintf(fInf, "[PowerCfg.base]\n");
|
|
fprintf(fInf, "CopyFiles = PowerCfg.copy.inf, PowerCfg.copy.sys\n");
|
|
fprintf(fInf, "AddReg = PowerCfg.addreg\n");
|
|
fprintf(fInf, "\n");
|
|
fprintf(fInf, "[PowerCfg.copy.inf]\n");
|
|
fprintf(fInf, "; files to copy to \\windows\\inf directory\n");
|
|
fprintf(fInf, "PowerCfg.inf\n");
|
|
fprintf(fInf, "\n");
|
|
fprintf(fInf, "[PowerCfg.copy.sys]\n");
|
|
fprintf(fInf, "; files to copy to \\windows\\system directory\n");
|
|
fprintf(fInf, "powercfg.cpl\n");
|
|
fprintf(fInf, "powrprof.dll\n");
|
|
fprintf(fInf, "batmeter.dll\n");
|
|
fprintf(fInf, "\n");
|
|
fprintf(fInf, "[PowerCfg.addreg]\n");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* TabTo
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* PARAMETERS:
|
|
*
|
|
*******************************************************************************/
|
|
|
|
VOID TabTo(FILE *fInf, UINT uiCharSoFar, UINT uiCol)
|
|
{
|
|
UINT i;
|
|
|
|
for (i = 0; i < (uiCol - uiCharSoFar); i++) {
|
|
fprintf(fInf, " ");
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* WriteNTInf
|
|
*
|
|
* DESCRIPTION:
|
|
* Write out the NT setup file in INF format.
|
|
*
|
|
* PARAMETERS:
|
|
*
|
|
*******************************************************************************/
|
|
|
|
BOOLEAN WriteNTInf(
|
|
char **pszName,
|
|
char **pszDesc,
|
|
char **pszDecoration,
|
|
UINT uiCount
|
|
)
|
|
{
|
|
UINT i, sku;
|
|
FILE *fInf;
|
|
static char skuDecoration[5];
|
|
UINT compareVal;
|
|
|
|
//
|
|
// First, write the Software Hive. (Machine policy.)
|
|
//
|
|
|
|
if ((fInf = fopen(MACHINE_INF_NAME, "w+")) != NULL) {
|
|
printf("\nWriting Machine INF specification file: %s", MACHINE_INF_NAME);
|
|
}
|
|
else {
|
|
DefFatalExit(TRUE, "Error opening INF specification file: %s for output\n", MACHINE_INF_NAME);
|
|
}
|
|
|
|
// Write fixed header information.
|
|
WriteInfHeader(fInf);
|
|
printf(".");
|
|
|
|
//
|
|
// Now we write the machine hives, by SKU. SKU 0 is the default SKU.
|
|
// it gets written without any decoration. If another SKU is different
|
|
// from the default SKU, it gets written, too, but with its own decoration.
|
|
//
|
|
|
|
for (sku = 0; sku < MAX_SKUS; sku++) {
|
|
|
|
if (sku == 0) {
|
|
|
|
strcpy(skuDecoration, "\0");
|
|
|
|
} else {
|
|
|
|
//printf("\nSKU decoration %s\n", pszDecoration[sku]);
|
|
sprintf(skuDecoration, "@%s:", pszDecoration[sku]);
|
|
}
|
|
|
|
compareVal = 1;
|
|
if (sku != 0) {
|
|
|
|
compareVal = memcmp(&g_gmpp[sku],
|
|
&g_gmpp[0],
|
|
sizeof(GLOBAL_MACHINE_POWER_POLICY));
|
|
}
|
|
|
|
if (compareVal) {
|
|
|
|
// Machine misc.
|
|
fprintf(fInf, "%sHKLM,\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\PowerCfg\",\"LastID\",0x00000002,\"%d\"\n", skuDecoration,uiCount - 1);
|
|
fprintf(fInf, "%sHKLM,\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\PowerCfg\",\"DiskSpinDownMax\",0x00000002,\"3600\"\n", skuDecoration);
|
|
fprintf(fInf, "%sHKLM,\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\PowerCfg\",\"DiskSpinDownMin\",0x00000002,\"3\"\n", skuDecoration);
|
|
fprintf(fInf, "%sHKLM,\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\PowerCfg\\GlobalPowerPolicy\",\"Policies\",0x00030001,\\\n", skuDecoration);
|
|
WriteRegBinary(fInf, &g_gmpp[sku], sizeof(GLOBAL_MACHINE_POWER_POLICY),
|
|
" ", skuDecoration);
|
|
fprintf(fInf, "%sHKLM,\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\PowerCfg\\PowerPolicies\",,0x00000012\n", skuDecoration);
|
|
fprintf(fInf, "\n\n");
|
|
printf(".");
|
|
}
|
|
|
|
for (i = 0; i < uiCount; i++) {
|
|
|
|
compareVal = 1;
|
|
if (sku != 0) {
|
|
|
|
compareVal = memcmp(g_pmpp[sku][i],
|
|
g_pmpp[0][i],
|
|
sizeof(MACHINE_POWER_POLICY));
|
|
}
|
|
|
|
if (compareVal) {
|
|
fprintf(fInf, "%sHKLM,\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\PowerCfg\\PowerPolicies\\%d\",\"Policies\",0x00030003,\\\n", skuDecoration, i);
|
|
WriteRegBinary(fInf, g_pmpp[sku][i], sizeof(MACHINE_POWER_POLICY)," ", skuDecoration);
|
|
fprintf(fInf, "\n");
|
|
printf(".");
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < uiCount; i++) {
|
|
|
|
compareVal = 1;
|
|
if (sku != 0) {
|
|
compareVal = memcmp(g_ppmpp[sku][i],
|
|
g_ppmpp[0][i],
|
|
sizeof(MACHINE_PROCESSOR_POWER_POLICY));
|
|
}
|
|
|
|
if (compareVal) {
|
|
fprintf(fInf, "%sHKLM,\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\PowerCfg\\ProcessorPolicies\\%d\",\"Policies\",0x00030001,\\\n", skuDecoration, i);
|
|
WriteRegBinary(fInf, g_ppmpp[sku][i], sizeof(MACHINE_PROCESSOR_POWER_POLICY)," ", skuDecoration);
|
|
fprintf(fInf, "\n");
|
|
printf(".");
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
fclose(fInf);
|
|
|
|
//
|
|
// Next, write the User Hive. (User Policy.)
|
|
//
|
|
|
|
if ((fInf = fopen(USER_INF_NAME, "w+")) != NULL) {
|
|
printf("\nWriting User INF specification file: %s\n", USER_INF_NAME);
|
|
}
|
|
else {
|
|
DefFatalExit(TRUE, "Error opening INF specification file: %s for output\n", USER_INF_NAME);
|
|
}
|
|
|
|
// Write fixed header information.
|
|
WriteInfHeader(fInf);
|
|
printf(".");
|
|
|
|
// User misc.
|
|
fprintf(fInf, "HKCU,\"Control Panel\\PowerCfg\",CurrentPowerPolicy,0x00000002,\"0\"\n");
|
|
|
|
for (sku = 0; sku < MAX_SKUS; sku++) {
|
|
|
|
if (sku == 0) {
|
|
|
|
strcpy(skuDecoration, "\0");
|
|
|
|
} else {
|
|
|
|
sprintf(skuDecoration, "@%s:", pszDecoration[sku]);
|
|
}
|
|
|
|
compareVal = 1;
|
|
if (sku != 0) {
|
|
|
|
compareVal = memcmp(&g_gupp[sku],
|
|
&g_gupp[0],
|
|
sizeof(GLOBAL_USER_POWER_POLICY));
|
|
}
|
|
|
|
if (compareVal) {
|
|
|
|
// User global policies.
|
|
fprintf(fInf, "%sHKCU,\"Control Panel\\PowerCfg\\GlobalPowerPolicy\",Policies,0x00030003,\\\n", skuDecoration);
|
|
WriteRegBinary(fInf, &g_gupp[sku], sizeof(GLOBAL_USER_POWER_POLICY), " ", skuDecoration);
|
|
fprintf(fInf, "\n\n");
|
|
printf(".");
|
|
|
|
}
|
|
|
|
// User power schemes.
|
|
for (i = 0; i < uiCount; i++) {
|
|
|
|
compareVal = 1;
|
|
if (sku != 0) {
|
|
|
|
compareVal = memcmp(g_pupp[sku][i],
|
|
g_pupp[0][i],
|
|
sizeof(USER_POWER_POLICY));
|
|
}
|
|
|
|
if (compareVal) {
|
|
fprintf(fInf, "%sHKCU,\"Control Panel\\PowerCfg\\PowerPolicies\\%d\",Name,0x00000002,\"%s\"\n", skuDecoration, i, pszName[i]);
|
|
fprintf(fInf, "%sHKCU,\"Control Panel\\PowerCfg\\PowerPolicies\\%d\",Description,0x00000002,\"%s\"\n", skuDecoration, i, pszDesc[i]);
|
|
fprintf(fInf, "%sHKCU,\"Control Panel\\PowerCfg\\PowerPolicies\\%d\",Policies,0x00030003,\\\n", skuDecoration, i);
|
|
WriteRegBinary(fInf, g_pupp[sku][i], sizeof(USER_POWER_POLICY)," ", skuDecoration);
|
|
fprintf(fInf, "\n\n");
|
|
printf(".");
|
|
}
|
|
}
|
|
}
|
|
|
|
fclose(fInf);
|
|
printf("OK\n");
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* main
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* PARAMETERS:
|
|
*
|
|
*******************************************************************************/
|
|
|
|
void __cdecl main (int argc, char **argv)
|
|
{
|
|
DWORD dwSize;
|
|
char *psz;
|
|
FILE *fInf;
|
|
UINT uiNameCount, uiDescCount, i, sku;
|
|
char *p;
|
|
char *pszName[MAX_PROFILES];
|
|
char *pszDesc[MAX_PROFILES];
|
|
char *pszDecoration[MAX_SKUS];
|
|
char *pszTok;
|
|
|
|
printf("Building name and description arrays...\n");
|
|
ReadSource();
|
|
BuildLineArray();
|
|
|
|
for (sku = 0; sku < MAX_SKUS; sku++) {
|
|
|
|
printf(" Parsing names, SKU[%d].", sku);
|
|
GetCheckLabelToken(SKU_LINE, "SKU Decoration", sku);
|
|
|
|
pszTok = strtok(NULL, DELIMITERS);
|
|
StrTrimTrailingBlanks(pszTok);
|
|
|
|
pszDecoration[sku] = malloc(5);
|
|
if (!pszDecoration[sku]) {
|
|
printf("Failed to alloc memory\n");
|
|
exit (0);
|
|
}
|
|
strncpy(pszDecoration[sku], pszTok, 2);
|
|
|
|
GetCheckLabelToken(NAME_LINE, "Name", sku);
|
|
uiNameCount = GetTokens(NULL, REGSTR_MAX_VALUE_LENGTH, pszName,
|
|
MAX_PROFILES, DELIMITERS);
|
|
if (uiNameCount) {
|
|
printf(" Parsed %d names successfully.\n", uiNameCount);
|
|
printf(" Parsing descriptions.");
|
|
GetCheckLabelToken(DESCRIPTION_LINE, "Description", sku);
|
|
uiDescCount = GetTokens(NULL, MAX_DESC_LEN, pszDesc,
|
|
MAX_PROFILES, DELIMITERS);
|
|
if (uiDescCount == uiNameCount) {
|
|
printf(" Parsed %d descriptions successfully.\n", uiDescCount);
|
|
g_uiPoliciesCount[sku] = uiNameCount;
|
|
|
|
}
|
|
else {
|
|
printf(" Name count: %d != description count: %d.\n", uiNameCount, uiDescCount);
|
|
printf("ProcessAndWrite failed, Last Error: %d\n", GetLastError());
|
|
exit(1);
|
|
}
|
|
}
|
|
else {
|
|
printf(" Name parsing failure.\n");
|
|
printf("ProcessAndWrite failed, Last Error: %d\n", GetLastError());
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
// Get the power policies, schemes
|
|
GetPolicies();
|
|
|
|
// Get the global power policies
|
|
GetGlobalPolicies();
|
|
|
|
// Write the INF specification files.
|
|
WriteNTInf(pszName, pszDesc, pszDecoration, g_uiPoliciesCount[0]);
|
|
printf("\n\nDefault Processing Success. Output files are valid.\n");
|
|
exit(0);
|
|
}
|
|
|
|
|