/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORP., 1997 * * TITLE: PARSE.C * * VERSION: 2.0 * * AUTHOR: ReedB * * DATE: 1 Jan, 1997 * * DESCRIPTION: * Helper parsing code for the default power schemes generator, MAKEINI.EXE. * *******************************************************************************/ #include #include #include #include #include #include #include #include #include "parse.h" /******************************************************************************* * * G L O B A L D A T A * *******************************************************************************/ char *g_pszSrc[MAX_SKUS]; char *g_pszLines[MAX_SKUS][MAX_LINES]; UINT g_uiLineCount; UINT g_uiPoliciesCount[MAX_SKUS]; PMACHINE_POWER_POLICY g_pmpp[MAX_SKUS][MAX_PROFILES]; PUSER_POWER_POLICY g_pupp[MAX_SKUS][MAX_PROFILES]; PMACHINE_PROCESSOR_POWER_POLICY g_ppmpp[MAX_SKUS][MAX_PROFILES]; GLOBAL_USER_POWER_POLICY g_gupp[MAX_SKUS]; GLOBAL_MACHINE_POWER_POLICY g_gmpp[MAX_SKUS]; char *g_pszSkuNames[MAX_SKUS] = { "..\\DEFAULTS.CSV", "..\\PER.CSV", "..\\PRO.CSV", "..\\SRV.CSV", "..\\ADS.CSV", "..\\DTC.CSV" }; char g_pszSkuDecoration[MAX_SKUS]; /******************************************************************************* * * StrTrimTrailingBlanks * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ void StrTrimTrailingBlanks(char *psz) { UINT i = 0; if (psz) { while (*psz) { psz++; } while (*--psz == ' ') { *psz = '\0'; } } } /******************************************************************************* * * StrToUpper * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ void StrToUpper(char *pszDest, char *pszSrc) { UINT i = 0; while (*pszSrc) { *pszDest = (char)toupper(*pszSrc); pszSrc++; pszDest++; if (++i == MAX_STR) { DefFatalExit(FALSE, "StrToUpper failure, source too large: %s\n", pszSrc); } } *pszDest = '\0'; } /******************************************************************************* * * GetTokens * * DESCRIPTION: * Fill an array with tokens. * * PARAMETERS: * *******************************************************************************/ UINT GetTokens( char *pszSrc, UINT uiMaxTokenSize, char **pszTokens, UINT uiMaxTokens, char *pszDelimiters ) { char *psz; DWORD dwSize; UINT i = 0; psz = strtok(pszSrc, pszDelimiters); StrTrimTrailingBlanks(psz); while (psz) { if (i % 2) { printf("."); } dwSize = strlen(psz) + 1; if (dwSize > uiMaxTokenSize) { printf("GetTokens, Token to large: %s\n", psz); return 0; } if ((pszTokens[i] = (char *) malloc(dwSize)) != NULL) { strcpy(pszTokens[i], psz); } else { printf("GetTokens, Unable to allocate token buffer: %s\n", psz); return 0; } i++; if (i == uiMaxTokens) { printf("GetTokens, Too many tokens: %d\n", i); return 0; } psz = strtok(NULL, pszDelimiters); StrTrimTrailingBlanks(psz); } return i; } /******************************************************************************* * * GetCheckLabelToken * * DESCRIPTION: * Consume a label token. Check to be sure it matches the passed parameter. * Call fatal exit if it doesn't. Labels are always comma delimited. Sets up * strtok for subsequent calls. * * PARAMETERS: * uiLine - One based line index. * *******************************************************************************/ VOID GetCheckLabelToken(UINT uiLine, char *pszCheck, UINT uiSku) { char szUpperCheck[MAX_STR]; static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; pszTok = strtok(g_pszLines[uiSku][uiLine - 1], DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE, "GetStringTokens failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); StrToUpper(szUpperCheck, pszCheck); if (strcmp(szUpperCheck, szUpperTok)) { DefFatalExit(FALSE, "GetStringTokens failure, check: %s doesn't match: %s\n",szUpperCheck, szUpperTok); } } /******************************************************************************* * * GetPowerActionToken * * DESCRIPTION: * Consume a token and return a power action. * * PARAMETERS: * *******************************************************************************/ POWER_ACTION GetPowerActionToken(VOID) { static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; pszTok = strtok(NULL, DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE,"GetPowerActionToken failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); if (!strcmp(szUpperTok, "NONE")) { return PowerActionNone; } if (!strcmp(szUpperTok, "DOZE")) { return PowerActionReserved; } if (!strcmp(szUpperTok, "SLEEP")) { return PowerActionSleep; } if (!strcmp(szUpperTok, "HIBERNATE")) { return PowerActionHibernate; } if (!strcmp(szUpperTok, "SHUTDOWN")) { return PowerActionShutdown; } if (!strcmp(szUpperTok, "SHUTDOWNRESET")) { return PowerActionShutdownReset; } if (!strcmp(szUpperTok, "SHUTDOWNOFF")) { return PowerActionShutdownOff; } DefFatalExit(FALSE,"GetPowerActionToken failure, check: %s doesn't match: \nNONE, DOZE, SLEEP, SHUTDOWN, SHUTDOWNRESET or SHUTDOWNOFF\n", szUpperTok); return 0; } /******************************************************************************* * * GetFlagToken * * DESCRIPTION: * Consume a token and return a flag value. * * PARAMETERS: * *******************************************************************************/ UINT GetFlagToken(UINT uiFlag) { static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; pszTok = strtok(NULL, DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE, "GetFlagToken failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); if (!strcmp(szUpperTok, "YES")) { return uiFlag; } if (!strcmp(szUpperTok, "TRUE")) { return uiFlag; } if (!strcmp(szUpperTok, "FALSE")) { return 0; } if (!strcmp(szUpperTok, "NO")) { return 0; } if (!strcmp(szUpperTok, "N/A")) { return 0; } DefFatalExit(FALSE, "GetFlagToken failure, check: %s doesn't match: YES, NO or N/A\n", szUpperTok); return 0; } /******************************************************************************* * * GetPowerStateToken * * DESCRIPTION: * Consume a token and return a power state. * * PARAMETERS: * *******************************************************************************/ UINT GetPowerStateToken(VOID) { static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; pszTok = strtok(NULL, DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE,"GetPowerStateToken failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); if (!strcmp(szUpperTok, "S0")) { return PowerSystemWorking; } if (!strcmp(szUpperTok, "S1")) { return PowerSystemSleeping1; } if (!strcmp(szUpperTok, "S2")) { return PowerSystemSleeping2; } if (!strcmp(szUpperTok, "S3")) { return PowerSystemSleeping3; } if (!strcmp(szUpperTok, "S4")) { return PowerSystemHibernate; } if (!strcmp(szUpperTok, "S5")) { return PowerSystemShutdown; } if (!strcmp(szUpperTok, "N/A")) { return PowerSystemUnspecified; } DefFatalExit(FALSE,"GetPowerStateToken failure, check: %s doesn't match: S0, S1, S2, S3, S4 or S5\n", szUpperTok); return PowerSystemUnspecified; } /******************************************************************************* * * GetINFTypeToken * * DESCRIPTION: * Consume a token and return an INF type. * * PARAMETERS: * *******************************************************************************/ UINT GetINFTypeToken(VOID) { static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; UINT uiRet = 0; pszTok = strtok(NULL, DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE,"GetINFTypeToken failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); if (strstr(szUpperTok, "TYPICALINSTALL")) { uiRet |= TYPICAL; } if (strstr(szUpperTok, "COMPACTINSTALL")) { uiRet |= COMPACT; } if (strstr(szUpperTok, "CUSTOMINSTALL")) { uiRet |= CUSTOM; } if (strstr(szUpperTok, "PORTABLEINSTALL")) { uiRet |= PORTABLE; } if (strstr(szUpperTok, "SERVERINSTALL")) { uiRet |= SERVER; } if (!uiRet) { DefFatalExit(FALSE,"GetINFTypeToken failure, check: %s doesn't match install file type\n", szUpperTok); } return uiRet; } /******************************************************************************* * * GetOSTypeToken * * DESCRIPTION: * Consume a token and return an OS type. * * PARAMETERS: * *******************************************************************************/ UINT GetOSTypeToken(VOID) { static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; UINT uiRet = 0; pszTok = strtok(NULL, DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE,"GetOSTypeToken failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); if (strstr(szUpperTok, "WIN95")) { uiRet |= WIN_95; } if (strstr(szUpperTok, "NT")) { uiRet |= WIN_NT; } if (!uiRet) { DefFatalExit(FALSE,"GetOSTypeToken failure, check: %s doesn't match: WINNT, WIN95\n", szUpperTok); } return uiRet; } /******************************************************************************* * * GetIntToken * * DESCRIPTION: * Consume a token and return an integer. Verify the units if passed. * * PARAMETERS: * *******************************************************************************/ UINT GetIntToken(char *pszUnits) { char szUpperUnits[MAX_STR]; static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; UINT i, uiMult = 1; pszTok = strtok(NULL, DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE,"GetIntToken failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); if (!strcmp(szUpperTok, "N/A")) { return 0; } if (!strcmp(szUpperTok, "DISABLED")) { return 0; } if (pszUnits) { StrToUpper(szUpperUnits, pszUnits); if (!strcmp(szUpperUnits, "%")) { // Percentages are a special case. Excel sometimes saves // 50% as 0.5. if ((pszUnits = strstr(szUpperTok, szUpperUnits)) != NULL) { // Strip off units. *pszUnits = '\0'; if (sscanf(szUpperTok, "%d", &i) == 1) { return i; } } if (*szUpperTok == '1') { return 100; } while ((*pszTok == '0') && (*(pszTok + 1) == '.')) { pszTok += 2; } // Get the first digit after the decimal. i = *pszTok++ - '0'; i *= 10; // if there is a second digit, get that, too. if ((*pszTok >= '0') && (*pszTok <= '9')) { i = i + (*pszTok - '0'); } return i; } else { if ((pszUnits = strstr(szUpperTok, szUpperUnits)) == NULL) { DefFatalExit(FALSE, "GetIntToken failure, units: %s doesn't match: %s\n", szUpperTok, szUpperUnits); } if (!strcmp(szUpperUnits, "MIN")) { uiMult = 60; } else if (!strcmp(szUpperUnits, "US")) { uiMult = 1; } else { DefFatalExit(FALSE, "GetIntToken failure, unknown units: %s\n", szUpperUnits); } // Strip off units. *pszUnits = '\0'; if (sscanf(szUpperTok, "%d", &i) == 1) { return i * uiMult; } } } DefFatalExit(FALSE,"GetIntToken failure, error converting: %s to integer\n", szUpperTok); return 0; } /******************************************************************************* * * GetNAToken * * DESCRIPTION: * Consume a N/A token. * * PARAMETERS: * *******************************************************************************/ VOID GetNAToken(VOID) { static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; pszTok = strtok(NULL, DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE, "GetNAToken failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); if (!strcmp(szUpperTok, "N/A")) { return; } DefFatalExit(FALSE, "GetNAToken failure, check: %s doesn't match: N/A\n", szUpperTok); } /******************************************************************************* * * GetThrottleToken * * DESCRIPTION: * Consume a N/A token. * * PARAMETERS: * *******************************************************************************/ UINT GetThrottleToken(VOID) { static char szUpperTok[MAX_STR] = "No last token"; char *pszTok; pszTok = strtok(NULL, DELIMITERS); StrTrimTrailingBlanks(pszTok); if (!pszTok) { DefFatalExit(FALSE, "GetNAToken failure, out of tokens. Last token: %s\n", szUpperTok); } StrToUpper(szUpperTok, pszTok); if (!strcmp(szUpperTok, "NONE")) { return PO_THROTTLE_NONE; } if (!strcmp(szUpperTok, "CONSTANT")) { return PO_THROTTLE_CONSTANT; } if (!strcmp(szUpperTok, "DEGRADE")) { return PO_THROTTLE_DEGRADE; } if (!strcmp(szUpperTok, "ADAPTIVE")) { return PO_THROTTLE_ADAPTIVE; } DefFatalExit(FALSE, "GetThrottleToken failure, check: %s doesn't match.\n", szUpperTok); return PO_THROTTLE_NONE; } /******************************************************************************* * * DefFatalExit * * DESCRIPTION: * Print error and exit. * * PARAMETERS: * *******************************************************************************/ VOID CDECL DefFatalExit(BOOLEAN bGetLastError, char *pszFormat, ... ) { va_list Marker; va_start(Marker, pszFormat); printf("\n\n"); vprintf(pszFormat, Marker); if (bGetLastError) { printf("Last error: %d\n", GetLastError()); } printf("\n\nDefault Processing Failure. Output files are invalid.\n"); exit(1); } /******************************************************************************* * * ReadSource * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ BOOLEAN ReadSource(void) { HANDLE fh; DWORD dwSize, dwRead, sku; BOOLEAN bRet; for (sku = 0; sku < MAX_SKUS; sku++) { bRet = FALSE; fh = CreateFile(g_pszSkuNames[sku], GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (fh != INVALID_HANDLE_VALUE) { // Allocate the source buffer. if ((dwSize = GetFileSize(fh, NULL)) != INVALID_FILE_SIZE) { if ((g_pszSrc[sku] = (char *) malloc(dwSize + 1)) != NULL) { // Read in the file buffer. SetFilePointer(fh, 0, NULL, FILE_BEGIN); if (ReadFile(fh, g_pszSrc[sku], dwSize, &dwRead, NULL)) { printf("ReadSource successful.\n"); g_pszSrc[sku][dwSize] = 0; bRet = TRUE; } } } CloseHandle(fh); } if (!bRet) { DefFatalExit(TRUE, "ReadSource failed reading: %s\n", g_pszSkuNames[sku]); } } return bRet; } /******************************************************************************* * * BuildLineArray * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ UINT BuildLineArray(void) { char *psz; UINT sku, lineCount; for (sku = 0; sku < MAX_SKUS; sku++) { printf("\nBuilding the line array."); lineCount = GetTokens(g_pszSrc[sku], MAX_LINE_SIZE, g_pszLines[sku], MAX_LINES, LINE_DELIMITERS); printf("\nFound %d lines in file %s.\n\n", lineCount, g_pszSrc[sku]); } return lineCount; } /******************************************************************************* * * GetSleepActionFlags * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ VOID GetSleepActionFlags( UINT uiStartLine, UINT uiFlagsAC[], UINT uiFlagsDC[], PUINT puiCount, UINT sku ) { UINT i; for (i = 0; i < *puiCount; i++) { uiFlagsAC[i] = 0; uiFlagsDC[i] = 0; } GetCheckLabelToken(uiStartLine, "Sleep action flags", sku); GetCheckLabelToken(uiStartLine+QUERY_APPS, "Query apps", sku); for (i = 0; i < *puiCount; i++) { uiFlagsAC[i] += GetFlagToken(POWER_ACTION_QUERY_ALLOWED); uiFlagsDC[i] += GetFlagToken(POWER_ACTION_QUERY_ALLOWED); } GetCheckLabelToken(uiStartLine+ALLOW_UI, "Allow UI", sku); for (i = 0; i < *puiCount; i++) { uiFlagsAC[i] += GetFlagToken(POWER_ACTION_UI_ALLOWED); uiFlagsDC[i] += GetFlagToken(POWER_ACTION_UI_ALLOWED); } GetCheckLabelToken(uiStartLine+IGNORE_NON_RESP, "Ignore non-responsive apps", sku); for (i = 0; i < *puiCount; i++) { uiFlagsAC[i] += GetFlagToken(POWER_ACTION_OVERRIDE_APPS); uiFlagsDC[i] += GetFlagToken(POWER_ACTION_OVERRIDE_APPS); } GetCheckLabelToken(uiStartLine+IGNORE_WAKE, "Ignore wakeup events", sku); for (i = 0; i < *puiCount; i++) { uiFlagsAC[i] += GetFlagToken(POWER_ACTION_DISABLE_WAKES); uiFlagsDC[i] += GetFlagToken(POWER_ACTION_DISABLE_WAKES); } GetCheckLabelToken(uiStartLine+IGNORE_CRITICAL, "Critical (go to sleep immediately)", sku); for (i = 0; i < *puiCount; i++) { uiFlagsAC[i] += GetFlagToken(POWER_ACTION_CRITICAL); uiFlagsDC[i] += GetFlagToken(POWER_ACTION_CRITICAL); } } /******************************************************************************* * * GetSleepActionFlagsGlobal * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ VOID GetSleepActionFlagsGlobal( UINT uiStartLine, PPOWER_ACTION_POLICY ppapAC, PPOWER_ACTION_POLICY ppapDC, UINT sku ) { UINT uiOne = 1; UINT uiFlagsAC[MAX_PROFILES]; UINT uiFlagsDC[MAX_PROFILES]; GetSleepActionFlags(uiStartLine, uiFlagsAC, uiFlagsDC, &uiOne, sku); if (ppapAC) { ppapAC->Flags = uiFlagsAC[0]; } ppapDC->Flags = uiFlagsDC[0]; } /******************************************************************************* * * GetSleepActionFlagsPolicy * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ VOID GetSleepActionFlagsUserPolicy( UINT uiStartLine, ULONG ulAcPowerPolicyOffset, ULONG ulDcPowerPolicyOffset, PUINT puiCount, UINT sku ) { UINT i; UINT uiFlagsAC[MAX_PROFILES]; UINT uiFlagsDC[MAX_PROFILES]; PPOWER_ACTION_POLICY ppap; GetSleepActionFlags(uiStartLine, uiFlagsAC, uiFlagsDC, puiCount, sku); for (i = 0; i < *puiCount; i++) { ppap = (PPOWER_ACTION_POLICY)((BYTE*)(g_pupp[sku][i]) + ulAcPowerPolicyOffset); ppap->Flags = uiFlagsAC[i]; ppap = (PPOWER_ACTION_POLICY)((BYTE*)(g_pupp[sku][i]) + ulDcPowerPolicyOffset); ppap->Flags = uiFlagsDC[i]; } } /******************************************************************************* * * GetSleepActionFlagsMachinePolicy * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ VOID GetSleepActionFlagsMachinePolicy( UINT uiStartLine, ULONG ulAcPowerPolicyOffset, ULONG ulDcPowerPolicyOffset, PUINT puiCount, UINT sku ) { UINT i; UINT uiFlagsAC[MAX_PROFILES]; UINT uiFlagsDC[MAX_PROFILES]; PPOWER_ACTION_POLICY ppap; GetSleepActionFlags(uiStartLine, uiFlagsAC, uiFlagsDC, puiCount, sku); for (i = 0; i < *puiCount; i++) { ppap = (PPOWER_ACTION_POLICY)((BYTE*)(g_pmpp[sku][i]) + ulAcPowerPolicyOffset); ppap->Flags = uiFlagsAC[i]; ppap = (PPOWER_ACTION_POLICY)((BYTE*)(g_pmpp[sku][i]) + ulDcPowerPolicyOffset); ppap->Flags = uiFlagsDC[i]; } } VOID GetEventCodes( UINT uiStartLine, PPOWER_ACTION_POLICY ppapAC, PPOWER_ACTION_POLICY ppapDC, UINT flagToken, UINT sku ) { UINT i; GetCheckLabelToken(uiStartLine, "Event Code", sku); GetCheckLabelToken(uiStartLine+NOTIFY_USER_CODE, "Notify User", sku); ppapAC->EventCode += GetFlagToken(flagToken); ppapDC->EventCode += GetFlagToken(flagToken); } /******************************************************************************* * * GetCStateThresholds * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ VOID GetCStateThresholds( UINT uiStartLine, UINT uiCState, PUINT puiCount, UINT sku ) { UINT i; uiCState -= 1; for (i = 0; i < *puiCount; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.PolicyCount = 3; g_ppmpp[sku][i]->ProcessorPolicyDc.PolicyCount = 3; } GetCheckLabelToken(uiStartLine+C_TIME_CHECK, "Time Check", sku); for (i = 0; i < *puiCount; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.Policy[uiCState].TimeCheck = GetIntToken("us"); g_ppmpp[sku][i]->ProcessorPolicyDc.Policy[uiCState].TimeCheck = GetIntToken("us"); } GetCheckLabelToken(uiStartLine+C_PROMOTE_LIMIT, "Promote Limit", sku); for (i = 0; i < *puiCount; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.Policy[uiCState].PromoteLimit = GetIntToken("us"); g_ppmpp[sku][i]->ProcessorPolicyDc.Policy[uiCState].PromoteLimit = GetIntToken("us"); } GetCheckLabelToken(uiStartLine+C_DEMOTE_LIMIT, "Demote Limit", sku); for (i = 0; i < *puiCount; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.Policy[uiCState].DemoteLimit = GetIntToken("us"); g_ppmpp[sku][i]->ProcessorPolicyDc.Policy[uiCState].DemoteLimit = GetIntToken("us"); } GetCheckLabelToken(uiStartLine+C_PROMOTE_PERCENT, "Promote Percent", sku); for (i = 0; i < *puiCount; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.Policy[uiCState].PromotePercent = (UCHAR)GetIntToken("%"); g_ppmpp[sku][i]->ProcessorPolicyDc.Policy[uiCState].PromotePercent = (UCHAR)GetIntToken("%"); } GetCheckLabelToken(uiStartLine+C_DEMOTE_PERCENT, "Demote Percent", sku); for (i = 0; i < *puiCount; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.Policy[uiCState].DemotePercent = (UCHAR)GetIntToken("%"); g_ppmpp[sku][i]->ProcessorPolicyDc.Policy[uiCState].DemotePercent = (UCHAR)GetIntToken("%"); } GetCheckLabelToken(uiStartLine+C_ALLOW_PROMOTION, "Allow Promotion", sku); for (i = 0; i < *puiCount; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.Policy[uiCState].Reserved = 0; g_ppmpp[sku][i]->ProcessorPolicyAc.Policy[uiCState].AllowPromotion = GetFlagToken(TRUE); g_ppmpp[sku][i]->ProcessorPolicyDc.Policy[uiCState].AllowPromotion = GetFlagToken(TRUE); } GetCheckLabelToken(uiStartLine+C_ALLOW_DEMOTION, "Allow Demotion", sku); for (i = 0; i < *puiCount; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.Policy[uiCState].AllowDemotion = GetFlagToken(TRUE); g_ppmpp[sku][i]->ProcessorPolicyDc.Policy[uiCState].AllowDemotion = GetFlagToken(TRUE); } } /******************************************************************************* * * GetDischargePolicies * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/ VOID GetDischargePolicies( UINT uiLine, UINT uiNum, UINT uiIndex, UINT sku ) { UINT i, uiOne = 1; char szLabel[] = "Discharge Policy 1"; sprintf(szLabel, "Discharge Policy %d", uiNum); GetCheckLabelToken(uiLine, szLabel, sku); GetCheckLabelToken(uiLine+DP_ENABLE, "Enable", sku); GetNAToken(); g_gupp[sku].DischargePolicy[uiIndex].Enable = (BOOLEAN)GetFlagToken(TRUE); GetCheckLabelToken(uiLine+DP_BAT_LEVEL, "Battery Level", sku); GetNAToken(); g_gupp[sku].DischargePolicy[uiIndex].BatteryLevel = GetIntToken("%"); GetCheckLabelToken(uiLine + DP_POWER_POLICY, "Power Policy", sku); GetNAToken(); g_gupp[sku].DischargePolicy[uiIndex].PowerPolicy.Action = GetPowerActionToken(); GetCheckLabelToken(uiLine + DP_MIN_SLEEP_STATE, "Min system sleep state", sku); GetNAToken(); g_gupp[sku].DischargePolicy[uiIndex].MinSystemState = GetPowerStateToken(); GetCheckLabelToken(uiLine + DP_TEXT_NOTIFY, "Text Notify", sku); GetNAToken(); g_gupp[sku].DischargePolicy[uiIndex].PowerPolicy.EventCode = GetFlagToken(POWER_LEVEL_USER_NOTIFY_TEXT); GetCheckLabelToken(uiLine+DP_SOUND_NOTIFY, "Sound Notify", sku); GetNAToken(); g_gupp[sku].DischargePolicy[uiIndex].PowerPolicy.EventCode |= GetFlagToken(POWER_LEVEL_USER_NOTIFY_SOUND); GetSleepActionFlagsGlobal(uiLine + DP_SLEEP_ACT_FLAGS, NULL, &(g_gupp[sku].DischargePolicy[uiIndex].PowerPolicy), sku); printf(" Parsed %s\n", szLabel); } /******************************************************************************* * * GetGlobalPolicies * * DESCRIPTION: * Parse the global policies into the USER: and HKEY_LOCAL_MACHINE global * power policies structures. * * PARAMETERS: * *******************************************************************************/ BOOLEAN GetGlobalPolicies(void) { UINT i, uiOne = 1, sku; for (sku = 0; sku < MAX_SKUS; sku++) { printf("Parsing global power policies\n"); // Set both User and Local Machine revision levels g_gupp[sku].Revision = DATA_REV; g_gmpp[sku].Revision = DATA_REV; //********************************************************************** // Advanced //********************************************************************** GetCheckLabelToken(ADVANCED_LINE, "Advanced", sku); GetCheckLabelToken(LOCK_ON_SLEEP_LINE, "Lock Workstation", sku); g_gupp[sku].GlobalFlags = GetFlagToken(EnablePasswordLogon); if (g_gupp[sku].GlobalFlags != GetFlagToken(EnablePasswordLogon)) { DefFatalExit(FALSE,"AC and DC Lock Workstation entries don't match"); } GetCheckLabelToken(WAKE_ON_RING_LINE, "Wake on Ring", sku); g_gupp[sku].GlobalFlags |= GetFlagToken(EnableWakeOnRing); if ((g_gupp[sku].GlobalFlags & EnableWakeOnRing) != GetFlagToken(EnableWakeOnRing)) { DefFatalExit(FALSE,"AC and DC Wake on Ring entries don't match"); } GetCheckLabelToken(VIDEO_DIM_DISPLAY_LINE, "Video Dim Display on DC", sku); GetFlagToken(0); g_gupp[sku].GlobalFlags |= GetFlagToken(EnableVideoDimDisplay); //********************************************************************** // Power button //********************************************************************** GetCheckLabelToken(POWER_BUTTON_LINE, "Power button", sku); g_gupp[sku].PowerButtonAc.Action = GetPowerActionToken(); g_gupp[sku].PowerButtonDc.Action = GetPowerActionToken(); GetSleepActionFlagsGlobal(POWER_BUTTON_SLEEP_ACTION_FLAGS_LINE, &(g_gupp[sku].PowerButtonAc), &(g_gupp[sku].PowerButtonDc), sku); GetEventCodes(POWER_BUTTON_SLEEP_EVENT_CODE_LINE, &(g_gupp[sku].PowerButtonAc), &(g_gupp[sku].PowerButtonDc), POWER_USER_NOTIFY_BUTTON, sku); printf(" Parsed Power Button Policies\n"); //********************************************************************** // Sleep button //********************************************************************** GetCheckLabelToken(SLEEP_BUTTON_LINE, "Sleep button", sku); g_gupp[sku].SleepButtonAc.Action = GetPowerActionToken(); g_gupp[sku].SleepButtonDc.Action = GetPowerActionToken(); GetSleepActionFlagsGlobal(SLEEP_BUTTON_SLEEP_ACTION_FLAGS_LINE, &(g_gupp[sku].SleepButtonAc), &(g_gupp[sku].SleepButtonDc), sku); GetEventCodes(SLEEP_BUTTON_SLEEP_EVENT_CODE_LINE, &(g_gupp[sku].PowerButtonAc), &(g_gupp[sku].PowerButtonDc), POWER_USER_NOTIFY_BUTTON, sku); printf(" Parsed Sleep Button Policies\n"); //********************************************************************** // Lid Closed //********************************************************************** GetCheckLabelToken(LID_CLOSE_LINE, "Lid close", sku); g_gupp[sku].LidCloseAc.Action = GetPowerActionToken(); g_gupp[sku].LidCloseDc.Action = GetPowerActionToken(); GetSleepActionFlagsGlobal(LID_CLOSE_SLEEP_ACTION_FLAGS_LINE, &(g_gupp[sku].LidCloseAc), &(g_gupp[sku].LidCloseDc), sku); printf(" Parsed Lid Close Policies\n"); //********************************************************************** // Lid Open Wake //********************************************************************** GetCheckLabelToken(LID_OPEN_WAKE_LINE, "Lid Open Wake", sku); g_gmpp[sku].LidOpenWakeAc = GetPowerStateToken(); g_gmpp[sku].LidOpenWakeDc = GetPowerStateToken(); printf(" Parsed Lid Open Wake Policies\n"); //********************************************************************** // Battery Policies //********************************************************************** GetCheckLabelToken(BROADCAST_CAP_RES_LINE, "Broadcast capacity resolution", sku); GetIntToken(NULL); g_gmpp[sku].BroadcastCapacityResolution = GetIntToken("%"); GetCheckLabelToken(BATMETER_ENABLE_SYSTRAY_FLAG_LINE, "Force Systray Battery Meter", sku); g_gupp[sku].GlobalFlags |= GetFlagToken(EnableSysTrayBatteryMeter); GetFlagToken(0); GetCheckLabelToken(BATMETER_ENABLE_MULTI_FLAG_LINE, "Enable Multi-Battery Display", sku); GetFlagToken(0); g_gupp[sku].GlobalFlags |= GetFlagToken(EnableMultiBatteryDisplay); printf(" Parsed Battery Policies\n"); //********************************************************************** // Discharge Policies 1, Low Battery //********************************************************************** GetDischargePolicies(DISCHARGE_POLICY_1_LINE, 1, DISCHARGE_POLICY_LOW, sku); //********************************************************************** // Discharge Policies 2, Critical Battery //********************************************************************** GetDischargePolicies(DISCHARGE_POLICY_2_LINE, 2, DISCHARGE_POLICY_CRITICAL, sku); } return TRUE; } /******************************************************************************* * * GetPolicies * * DESCRIPTION: * Parse the power policies into the USER: and HKEY_LOCAL_MACHINE global * power policies structures arrays. * * PARAMETERS: * *******************************************************************************/ BOOLEAN GetPolicies(void) { UINT i, sku; BOOLEAN bRet = FALSE; for (sku = 0; sku < MAX_SKUS; sku++) { printf("Processing SKU# %d\n\n", sku); printf("Parsing power policies\n"); // First get a place to put the data. for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i] = (PUSER_POWER_POLICY)malloc(sizeof(USER_POWER_POLICY)); g_pmpp[sku][i] = (PMACHINE_POWER_POLICY)malloc(sizeof(MACHINE_POWER_POLICY)); g_ppmpp[sku][i] = (PMACHINE_PROCESSOR_POWER_POLICY)malloc(sizeof(MACHINE_PROCESSOR_POWER_POLICY)); if (!g_pupp[sku][i] || !g_pmpp[sku][i] || !g_ppmpp[sku][i]) { goto gp_leave; } FillMemory(g_pupp[sku][i], sizeof(USER_POWER_POLICY), 0); FillMemory(g_pmpp[sku][i], sizeof(MACHINE_POWER_POLICY), 0); FillMemory(g_ppmpp[sku][i], sizeof(MACHINE_PROCESSOR_POWER_POLICY), 0); } // Initialize revision data. for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->Revision = DATA_REV; g_pmpp[sku][i]->Revision = DATA_REV; g_ppmpp[sku][i]->Revision = DATA_REV; } printf(" Allocated policies\n"); //********************************************************************** // System Idle //********************************************************************** GetCheckLabelToken(SYSTEM_IDLE_LINE, "Idle action", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->IdleAc.Action = GetPowerActionToken(); g_pupp[sku][i]->IdleDc.Action = GetPowerActionToken(); } GetCheckLabelToken(SYSTEM_IDLE_TIMEOUT_LINE, "Idle timeout", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->IdleTimeoutAc = GetIntToken("MIN"); g_pupp[sku][i]->IdleTimeoutDc = GetIntToken("MIN"); } GetSleepActionFlagsUserPolicy(SYSTEM_IDLE_SLEEP_ACTION_FLAGS_LINE, FIELD_OFFSET(USER_POWER_POLICY, IdleAc), FIELD_OFFSET(USER_POWER_POLICY, IdleDc), &g_uiPoliciesCount[sku], sku); GetCheckLabelToken(SYSTEM_IDLE_SENSITIVITY_LINE, "Idle sensitivity", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->IdleSensitivityAc = (UCHAR)GetIntToken("%"); g_pupp[sku][i]->IdleSensitivityDc = (UCHAR)GetIntToken("%"); } printf(" Parsed System Idle Policies\n"); //********************************************************************** // Sleep Policies //********************************************************************** GetCheckLabelToken(MIN_SLEEP_LINE, "Minimum sleep", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pmpp[sku][i]->MinSleepAc = GetPowerStateToken(); g_pmpp[sku][i]->MinSleepDc = GetPowerStateToken(); } GetCheckLabelToken(MAX_SLEEP_LINE, "Max sleep", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->MaxSleepAc = GetPowerStateToken(); g_pupp[sku][i]->MaxSleepDc = GetPowerStateToken(); } GetCheckLabelToken(REDUCED_LATENCY_SLEEP_LINE, "Reduced latency sleep", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pmpp[sku][i]->ReducedLatencySleepAc = GetPowerStateToken(); g_pmpp[sku][i]->ReducedLatencySleepDc = GetPowerStateToken(); } GetCheckLabelToken(DOZE_TIMEOUT_LINE, "Doze timeout", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pmpp[sku][i]->DozeTimeoutAc = GetIntToken("MIN"); g_pmpp[sku][i]->DozeTimeoutDc = GetIntToken("MIN"); } GetCheckLabelToken(DOZE_S4_TIMEOUT_LINE, "DozeS4Timeout", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pmpp[sku][i]->DozeS4TimeoutAc = GetIntToken("MIN"); g_pmpp[sku][i]->DozeS4TimeoutDc = GetIntToken("MIN"); } printf(" Parsed Sleep Policies\n"); //********************************************************************** // Device Power Management //********************************************************************** GetCheckLabelToken(VIDEO_TIMEOUT_LINE, "Video timeout", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->VideoTimeoutAc = GetIntToken("MIN"); g_pupp[sku][i]->VideoTimeoutDc = GetIntToken("MIN"); } GetCheckLabelToken(SPINDOWN_TIMEOUT_LINE, "Spindown timeout", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->SpindownTimeoutAc = GetIntToken("MIN"); g_pupp[sku][i]->SpindownTimeoutDc = GetIntToken("MIN"); } printf(" Parsed Device Power Management Policies\n"); //********************************************************************** // CPU Policies //********************************************************************** GetCheckLabelToken(OPTIMIZE_FOR_POWER_LINE, "Optimize for power", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->OptimizeForPowerAc = (BOOLEAN)GetFlagToken(TRUE); g_pupp[sku][i]->OptimizeForPowerDc = (BOOLEAN)GetFlagToken(TRUE); } GetCheckLabelToken(FAN_THROTTLE_TOL_LINE, "Fan throttle Tolerance", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->FanThrottleToleranceAc = (UCHAR)GetIntToken("%"); g_pupp[sku][i]->FanThrottleToleranceDc = (UCHAR)GetIntToken("%"); } GetCheckLabelToken(FORCED_THROTTLE_LINE, "Forced throttle", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pupp[sku][i]->ForcedThrottleAc = (UCHAR)GetIntToken("%"); g_pupp[sku][i]->ForcedThrottleDc = (UCHAR)GetIntToken("%"); } GetCheckLabelToken(MIN_THROTTLE_LINE, "Min throttle", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pmpp[sku][i]->MinThrottleAc = (UCHAR)GetIntToken("%"); g_pmpp[sku][i]->MinThrottleDc = (UCHAR)GetIntToken("%"); } GetCheckLabelToken(OVERTHROTTLED_LINE, "Overthrottled", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_pmpp[sku][i]->OverThrottledAc.Action = GetPowerActionToken(); g_pmpp[sku][i]->OverThrottledDc.Action = GetPowerActionToken(); } GetSleepActionFlagsMachinePolicy(OVERTHROTTLED_SLEEP_ACTION_FLAGS_LINE, FIELD_OFFSET(MACHINE_POWER_POLICY, OverThrottledAc), FIELD_OFFSET(MACHINE_POWER_POLICY, OverThrottledDc), &g_uiPoliciesCount[sku], sku); // // Processor Policies // GetCheckLabelToken(DYNAMIC_THROTTLE_LINE, "Dynamic Throttle", sku); for (i = 0; i < g_uiPoliciesCount[sku]; i++) { g_ppmpp[sku][i]->ProcessorPolicyAc.Revision = 1; g_ppmpp[sku][i]->ProcessorPolicyDc.Revision = 1; g_ppmpp[sku][i]->ProcessorPolicyAc.DynamicThrottle = g_pupp[sku][i]->ThrottlePolicyAc = (UCHAR)GetThrottleToken(); g_ppmpp[sku][i]->ProcessorPolicyDc.DynamicThrottle = g_pupp[sku][i]->ThrottlePolicyDc = (UCHAR)GetThrottleToken(); } GetCStateThresholds(C1_THRESHOLDS_LINE, 1, &g_uiPoliciesCount[sku], sku); GetCStateThresholds(C2_THRESHOLDS_LINE, 2, &g_uiPoliciesCount[sku], sku); GetCStateThresholds(C3_THRESHOLDS_LINE, 3, &g_uiPoliciesCount[sku], sku); printf(" Parsed CPU Policies\n"); } bRet = TRUE; printf("Parsing power policies success!\n\n"); gp_leave: if (!bRet) { printf("GetPolicies failed, Last Error: %d\n", GetLastError()); } return bRet; }