1284 lines
36 KiB
C
1284 lines
36 KiB
C
/*****************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1988-1991 **/
|
|
/*****************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <process.h>
|
|
#include <setjmp.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <time.h>
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <windows.h>
|
|
|
|
PROCESSOR_POWER_POLICY PAc, PDc;
|
|
SYSTEM_POWER_POLICY Ac, Dc;
|
|
SYSTEM_POWER_CAPABILITIES Cap;
|
|
SYSTEM_POWER_STATUS PS;
|
|
ADMINISTRATOR_POWER_POLICY Admin;
|
|
SYSTEM_BATTERY_STATE Batt;
|
|
|
|
typedef
|
|
VOID
|
|
(*PCUR_PRINT)(
|
|
IN PVOID Context
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(*PCUR_ASSIGN)(
|
|
PUCHAR Variable,
|
|
PUCHAR Value
|
|
);
|
|
|
|
ULONG CurType;
|
|
POWER_INFORMATION_LEVEL CurInfo;
|
|
PVOID CurContext;
|
|
ULONG CurContextSize;
|
|
PCUR_PRINT CurPrint;
|
|
PCUR_ASSIGN CurAssign;
|
|
PUCHAR CurDesc;
|
|
|
|
PUCHAR CurValue;
|
|
BOOLEAN ItemUpdated;
|
|
BOOLEAN CurValueIsNumeric;
|
|
|
|
BOOLEAN Verbose1;
|
|
BOOLEAN Verbose2;
|
|
|
|
|
|
|
|
PUCHAR szBool[] = { "FALSE", "TRUE" };
|
|
|
|
|
|
typedef struct {
|
|
ULONG Flags;
|
|
PUCHAR String;
|
|
} DEFBITS, *PDEFBITS;
|
|
|
|
DEFBITS ActFlags[] = {
|
|
POWER_ACTION_QUERY_ALLOWED, "QueryApps",
|
|
POWER_ACTION_UI_ALLOWED, "UIAllowed",
|
|
POWER_ACTION_OVERRIDE_APPS, "OverrideApps",
|
|
POWER_ACTION_DISABLE_WAKES, "DisableWakes",
|
|
POWER_ACTION_CRITICAL, "Critical",
|
|
0, NULL
|
|
};
|
|
|
|
DEFBITS PsBatteryFlagBits[] = {
|
|
BATTERY_FLAG_HIGH, "high",
|
|
BATTERY_FLAG_LOW, "low",
|
|
BATTERY_FLAG_CRITICAL, "critical",
|
|
BATTERY_FLAG_CHARGING, "charing",
|
|
0, NULL
|
|
};
|
|
|
|
|
|
|
|
|
|
PUCHAR
|
|
ActionS(
|
|
IN POWER_ACTION Act
|
|
)
|
|
{
|
|
static char line[50];
|
|
PCHAR p;
|
|
|
|
switch (Act) {
|
|
case PowerActionNone: p = "None"; break;
|
|
case PowerActionSleep: p = "Sleep"; break;
|
|
case PowerActionHibernate: p = "Hibernate"; break;
|
|
case PowerActionShutdown: p = "Shutdown"; break;
|
|
case PowerActionShutdownReset: p = "ShutdownReset"; break;
|
|
case PowerActionShutdownOff: p = "ShutdownOff"; break;
|
|
default:
|
|
sprintf(line, "Unknown action %x", Act);
|
|
p = line;
|
|
break;
|
|
}
|
|
|
|
return p;
|
|
}
|
|
|
|
PUCHAR
|
|
SysPower(
|
|
IN SYSTEM_POWER_STATE State
|
|
)
|
|
{
|
|
static char line[50];
|
|
PCHAR p;
|
|
|
|
switch (State) {
|
|
case PowerSystemUnspecified: p = "Unspecified"; break;
|
|
case PowerSystemWorking: p = "Working"; break;
|
|
case PowerSystemSleeping1: p = "S1"; break;
|
|
case PowerSystemSleeping2: p = "S2"; break;
|
|
case PowerSystemSleeping3: p = "S3"; break;
|
|
case PowerSystemHibernate: p = "S4 - hibernate"; break;
|
|
case PowerSystemShutdown: p = "Shutdown"; break;
|
|
default:
|
|
sprintf(line, "Unknown power state %x", State);
|
|
p = line;
|
|
break;
|
|
}
|
|
|
|
return p;
|
|
}
|
|
|
|
PUCHAR
|
|
DynamicThrottle(
|
|
IN UCHAR Throttle
|
|
)
|
|
{
|
|
static char line[50];
|
|
PCHAR p;
|
|
|
|
switch (Throttle) {
|
|
case PO_THROTTLE_NONE: p = "None"; break;
|
|
case PO_THROTTLE_CONSTANT: p = "Constant"; break;
|
|
case PO_THROTTLE_DEGRADE: p = "Degrade"; break;
|
|
case PO_THROTTLE_ADAPTIVE: p = "Adaptive"; break;
|
|
default:
|
|
sprintf(line,"Unknown Dynamic Throttle state %x", Throttle);
|
|
p = line;
|
|
break;
|
|
}
|
|
return p;
|
|
}
|
|
|
|
PUCHAR
|
|
MicroSeconds(
|
|
IN ULONG Time
|
|
)
|
|
{
|
|
static char line[256];
|
|
PCHAR p;
|
|
ULONG MicroSeconds;
|
|
ULONG MilliSeconds;
|
|
ULONG Seconds;
|
|
ULONG Minutes;
|
|
ULONG Hours;
|
|
ULONG Days;
|
|
|
|
MicroSeconds = Time % 1000;
|
|
MilliSeconds = Time / 1000;
|
|
|
|
Seconds = MilliSeconds / 1000;
|
|
MilliSeconds = MilliSeconds % 1000;
|
|
|
|
Minutes = Seconds / 60;
|
|
Seconds = Seconds % 60;
|
|
|
|
Hours = Minutes / 60;
|
|
Minutes = Minutes % 60;
|
|
|
|
Days = Hours / 24;
|
|
Hours = Hours % 24;
|
|
|
|
if (Hours) {
|
|
|
|
sprintf(
|
|
line,
|
|
"%d [%2d:%2d %ds %dms %dus]",
|
|
Time,
|
|
Hours,
|
|
Minutes,
|
|
Seconds,
|
|
MilliSeconds,
|
|
MicroSeconds
|
|
);
|
|
|
|
} else if (Minutes) {
|
|
|
|
sprintf(
|
|
line,
|
|
"%d [0:%2d %ds %dms %dus]",
|
|
Time,
|
|
Minutes,
|
|
Seconds,
|
|
MilliSeconds,
|
|
MicroSeconds
|
|
);
|
|
|
|
} else if (Seconds) {
|
|
|
|
sprintf(
|
|
line,
|
|
"%d [%ds %dms %dus]",
|
|
Time,
|
|
Seconds,
|
|
MilliSeconds,
|
|
MicroSeconds
|
|
);
|
|
|
|
} else if (MilliSeconds) {
|
|
|
|
sprintf(
|
|
line,
|
|
"%d [%dms %dus]",
|
|
Time,
|
|
MilliSeconds,
|
|
MicroSeconds
|
|
);
|
|
|
|
} else {
|
|
|
|
sprintf(
|
|
line,
|
|
"%d [%dus]",
|
|
Time,
|
|
MicroSeconds
|
|
);
|
|
|
|
}
|
|
p = line;
|
|
return p;
|
|
}
|
|
|
|
VOID
|
|
GetBits (
|
|
IN PUCHAR Dest,
|
|
IN ULONG Flags,
|
|
IN PDEFBITS DefBits
|
|
)
|
|
{
|
|
UCHAR c;
|
|
ULONG i;
|
|
|
|
c = 0;
|
|
|
|
*Dest = 0;
|
|
for (i=0; DefBits[i].Flags; i++) {
|
|
if (Flags & DefBits[i].Flags) {
|
|
if (c) {
|
|
*Dest = c;
|
|
Dest += 1;
|
|
}
|
|
Dest += sprintf (Dest, "%s", DefBits[i].String);
|
|
c = '|';
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID
|
|
PrintPowerStatus (
|
|
VOID
|
|
)
|
|
{
|
|
ULONG i;
|
|
PUCHAR Ls;
|
|
UCHAR Bf[200];
|
|
|
|
switch (PS.ACLineStatus) {
|
|
case AC_LINE_OFFLINE: Ls = "off line"; break;
|
|
case AC_LINE_ONLINE: Ls = "on line"; break;
|
|
case AC_LINE_BACKUP_POWER: Ls = "backup power"; break;
|
|
case AC_LINE_UNKNOWN: Ls = "unknown"; break;
|
|
default: Ls = "**invalid**"; break;
|
|
}
|
|
|
|
strcpy (Bf, "unkown");
|
|
if (PS.BatteryFlag != BATTERY_FLAG_UNKNOWN) {
|
|
GetBits(Bf, PS.BatteryFlag, PsBatteryFlagBits);
|
|
}
|
|
|
|
printf ("Win32 System power status\n");
|
|
printf ("AC line status..........: %s\n", Ls);
|
|
printf ("Battery flag............: %s\n", Bf);
|
|
printf ("Battery life percent....: %d\n", PS.BatteryLifePercent);
|
|
printf ("Battery full life time..: %d\n", PS.BatteryFullLifeTime);
|
|
printf ("\n");
|
|
}
|
|
|
|
VOID
|
|
PrintBattStatus (
|
|
VOID
|
|
)
|
|
{
|
|
ULONG i;
|
|
PUCHAR Ls;
|
|
UCHAR Bf[200];
|
|
|
|
printf ("AC on line..............: %s\n", szBool[Batt.AcOnLine]);
|
|
printf ("Battery present ........: %s\n", szBool[Batt.BatteryPresent]);
|
|
printf ("Charging................: %s\n", szBool[Batt.Charging]);
|
|
printf ("Discharging.............: %s\n", szBool[Batt.Discharging]);
|
|
printf ("Max Capacity............: %d\n", Batt.MaxCapacity);
|
|
printf ("Remaining Capacity......: %d", Batt.RemainingCapacity);
|
|
if (Batt.MaxCapacity) {
|
|
printf (" %d%%\n", Batt.RemainingCapacity * 100 / Batt.MaxCapacity);
|
|
} else {
|
|
printf (" (divide by zero)%%\n");
|
|
}
|
|
|
|
printf ("Rate....................: %d\n", Batt.Rate);
|
|
printf ("Estimated time..........: %d\n", Batt.EstimatedTime);
|
|
printf ("Default alert 1 & 2.....: %d %d\n",Batt.DefaultAlert1, Batt.DefaultAlert2);
|
|
printf ("\n");
|
|
}
|
|
|
|
BOOLEAN
|
|
streql (
|
|
PUCHAR p1,
|
|
PUCHAR p2
|
|
)
|
|
{
|
|
return strcmp(p1, p2) == 0;
|
|
}
|
|
|
|
PUCHAR
|
|
_strtok (
|
|
PUCHAR Start
|
|
)
|
|
{
|
|
static PUCHAR Location;
|
|
PUCHAR p;
|
|
|
|
|
|
if (Start) {
|
|
Location = Start;
|
|
}
|
|
|
|
for (p = Location; *p && *p <'a' && *p >'z'; p++) ;
|
|
if (!*p) {
|
|
return NULL;
|
|
}
|
|
|
|
Start = p;
|
|
for (; *p && *p >= 'a' && *p <= 'z'; p++) ;
|
|
if (*p) {
|
|
*p++ = 0;
|
|
}
|
|
Location = p;
|
|
return Start;
|
|
}
|
|
|
|
|
|
VOID
|
|
PrintCap (
|
|
PVOID Context
|
|
)
|
|
{
|
|
ULONG i;
|
|
|
|
printf ("System power capabilties\n");
|
|
printf ("Power Button Present....: %s\n", szBool[Cap.PowerButtonPresent]);
|
|
printf ("Sleep Button Present....: %s\n", szBool[Cap.SleepButtonPresent]);
|
|
printf ("Lid Present.............: %s\n", szBool[Cap.LidPresent]);
|
|
printf ("System states supported.: %s%s%s%s%s\n",
|
|
Cap.SystemS1 ? "S1 " : "",
|
|
Cap.SystemS2 ? "S2 " : "",
|
|
Cap.SystemS3 ? "S3 " : "",
|
|
Cap.SystemS4 ? "S4 " : "",
|
|
Cap.SystemS5 ? "S5 " : ""
|
|
);
|
|
printf ("Hiber file reserved.....: %s\n", szBool[Cap.HiberFilePresent]);
|
|
printf ("Thermal control.........: %s\n", szBool[Cap.ThermalControl]);
|
|
printf ("CPU Throttle control....: %s\n", szBool[Cap.ProcessorThrottle]);
|
|
printf ("Processor min throttle..: %d\n", Cap.ProcessorMinThrottle);
|
|
printf ("Processor max throttle..: %d\n", Cap.ProcessorMaxThrottle);
|
|
printf ("Some disk will spindown.: %s\n", szBool[Cap.DiskSpinDown]);
|
|
printf ("System batteries present: %s %s\n",
|
|
szBool[Cap.SystemBatteriesPresent],
|
|
Cap.BatteriesAreShortTerm ? "- short term" : ""
|
|
);
|
|
printf ("System batteries scale..: ");
|
|
for (i=0; i<3; i++) {
|
|
printf ("(G:%d C:%d) ",
|
|
Cap.BatteryScale[i].Granularity,
|
|
Cap.BatteryScale[i].Capacity
|
|
);
|
|
}
|
|
printf ("\n");
|
|
printf ("Ac on line wake ability.: %s\n", SysPower(Cap.AcOnLineWake));
|
|
printf ("Lid wake ability........: %s\n", SysPower(Cap.SoftLidWake));
|
|
printf ("RTC wake ability........: %s\n", SysPower(Cap.RtcWake));
|
|
printf ("Min device wake.........: %s\n", SysPower(Cap.MinDeviceWakeState));
|
|
printf ("Default low latency wake: %s\n", SysPower(Cap.DefaultLowLatencyWake));
|
|
printf ("\n");
|
|
}
|
|
|
|
PUCHAR
|
|
Action (
|
|
IN PBOOLEAN CapFlag,
|
|
IN PPOWER_ACTION_POLICY Act
|
|
)
|
|
{
|
|
static UCHAR text[200];
|
|
PUCHAR p;
|
|
UCHAR c;
|
|
ULONG i;
|
|
|
|
p = text;
|
|
|
|
if (CapFlag && !*CapFlag) {
|
|
p += sprintf(p, "Disabled ");
|
|
}
|
|
|
|
p += sprintf (p, "%s", ActionS(Act->Action));
|
|
if (Act->Action != PowerActionNone && Act->Flags) {
|
|
c = '(';
|
|
for (i=0; ActFlags[i].Flags; i++) {
|
|
if (Act->Flags & ActFlags[i].Flags) {
|
|
p += sprintf (p, "%c%s", c, ActFlags[i].String);
|
|
c = '|';
|
|
}
|
|
}
|
|
p += sprintf (p, ")");
|
|
}
|
|
|
|
if (Act->EventCode) {
|
|
p += sprintf (p, "-Code=%x", Act->EventCode);
|
|
}
|
|
|
|
return text;
|
|
}
|
|
|
|
VOID
|
|
SetAction (
|
|
IN PPOWER_ACTION_POLICY Action
|
|
)
|
|
{
|
|
PUCHAR p;
|
|
POWER_ACTION Act;
|
|
ULONG Flags;
|
|
|
|
|
|
Flags = 0;
|
|
p = _strtok (CurValue);
|
|
if (!p) {
|
|
printf ("Unknown power action %s.\n", CurValue);
|
|
printf ("use: doze, sleep, shutdown, shutdownreset, shutdownoff\n");
|
|
exit (1);
|
|
}
|
|
if (streql(p, "none")) { Act = PowerActionNone;
|
|
} else if (streql(p, "sleep")) { Act = PowerActionSleep;
|
|
} else if (streql(p, "hiber")) { Act = PowerActionHibernate;
|
|
} else if (streql(p, "shutdown")) { Act = PowerActionShutdown;
|
|
} else if (streql(p, "shutdownreset")) { Act = PowerActionShutdownReset;
|
|
} else if (streql(p, "shutdownoff")) { Act = PowerActionShutdownOff;
|
|
} else {
|
|
printf ("Unknown power action '%s'.\n", p);
|
|
printf ("use: doze, sleep, shutdown, shutdownreset, shutdownoff\n");
|
|
exit (1);
|
|
}
|
|
|
|
while (p = _strtok(NULL)) {
|
|
if (streql(p, "qapp")) { Flags |= POWER_ACTION_QUERY_ALLOWED;
|
|
} else if (streql(p, "ui")) { Flags |= POWER_ACTION_UI_ALLOWED;
|
|
} else if (streql(p, "override")) { Flags |= POWER_ACTION_OVERRIDE_APPS;
|
|
} else if (streql(p, "disablewake")) { Flags |= POWER_ACTION_DISABLE_WAKES;
|
|
} else if (streql(p, "critical")) { Flags |= POWER_ACTION_CRITICAL;
|
|
} else {
|
|
printf ("Unknown power action '%s'.\n", p);
|
|
printf ("use: qapp, io, override, disablewake, critical\n");
|
|
exit (1);
|
|
}
|
|
}
|
|
|
|
Action->Action = Act;
|
|
Action->Flags = Flags;
|
|
}
|
|
|
|
|
|
VOID
|
|
SetSysPower (
|
|
IN PSYSTEM_POWER_STATE SysPower
|
|
)
|
|
{
|
|
PUCHAR p;
|
|
|
|
p = CurValue;
|
|
if (streql(p, "s0")) { *SysPower = PowerSystemWorking;
|
|
} else if (streql(p, "s1")) { *SysPower = PowerSystemSleeping1;
|
|
} else if (streql(p, "s2")) { *SysPower = PowerSystemSleeping2;
|
|
} else if (streql(p, "s3")) { *SysPower = PowerSystemSleeping3;
|
|
} else if (streql(p, "s4")) { *SysPower = PowerSystemHibernate;
|
|
} else {
|
|
printf ("Unknown system power state '%s'. Use S0,S1,S2,S3 or S4\n", p);
|
|
exit (1);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
SetPolicyCount(
|
|
IN PULONG Variable
|
|
)
|
|
{
|
|
ULONG local;
|
|
if (!CurValueIsNumeric) {
|
|
printf("'%s' is not numeric\n", CurValue);
|
|
exit(1);
|
|
}
|
|
local = atol(CurValue);
|
|
if (local > 3) {
|
|
printf("PolicyCount can only be in the range 0 to 3\n");
|
|
exit(1);
|
|
}
|
|
*Variable = local;
|
|
}
|
|
|
|
VOID
|
|
SetDynamicThrottle(
|
|
IN PUCHAR Variable
|
|
)
|
|
{
|
|
ULONG local;
|
|
PUCHAR p;
|
|
|
|
p = CurValue;
|
|
if (streql(p,"none")) { *Variable = PO_THROTTLE_NONE;
|
|
} else if (streql(p,"constant")) { *Variable = PO_THROTTLE_CONSTANT;
|
|
} else if (streql(p,"degrade")) { *Variable = PO_THROTTLE_DEGRADE;
|
|
} else if (streql(p,"degraded")) { *Variable = PO_THROTTLE_DEGRADE;
|
|
} else if (streql(p,"adaptive")) { *Variable = PO_THROTTLE_ADAPTIVE;
|
|
} else {
|
|
printf("Unknown Dynamic Throttle state %s\n", CurValue);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
SetPercentage (
|
|
IN PUCHAR Variable
|
|
)
|
|
{
|
|
PUCHAR p;
|
|
|
|
if (!CurValueIsNumeric) {
|
|
|
|
for (p = CurValue; *p; p++) {
|
|
if (*p == '%') {
|
|
*p = '\0';
|
|
}
|
|
}
|
|
CurValueIsNumeric = TRUE;
|
|
for (p = CurValue; *p; p++) {
|
|
if (*p < '0' || *p > '9') {
|
|
CurValueIsNumeric = FALSE;
|
|
}
|
|
}
|
|
if (!CurValueIsNumeric) {
|
|
printf ("'%s' is not numeric\n", CurValue);
|
|
exit (1);
|
|
}
|
|
}
|
|
*Variable = (UCHAR) atol(CurValue);
|
|
}
|
|
|
|
|
|
VOID
|
|
SetValue (
|
|
IN PULONG Variable
|
|
)
|
|
{
|
|
if (!CurValueIsNumeric) {
|
|
printf ("'%s' is not numeric\n", CurValue);
|
|
exit (1);
|
|
}
|
|
|
|
*Variable = atol(CurValue);
|
|
}
|
|
|
|
VOID
|
|
SetBool (
|
|
IN PBOOLEAN Variable
|
|
)
|
|
{
|
|
BOOLEAN State;
|
|
|
|
State = 99;
|
|
if (CurValueIsNumeric) {
|
|
State = (BOOLEAN)atol(CurValue);
|
|
} else {
|
|
if (streql(CurValue, "true")) { State = TRUE;
|
|
} else if (streql(CurValue, "false")) { State = FALSE;
|
|
}
|
|
}
|
|
|
|
if (State != FALSE && State != TRUE) {
|
|
printf ("'%s' is not boolean\n");
|
|
exit (1);
|
|
}
|
|
|
|
*Variable = State;
|
|
}
|
|
|
|
VOID
|
|
SetField(
|
|
IN PPROCESSOR_POWER_POLICY Pol,
|
|
IN ULONG Index,
|
|
IN PUCHAR What
|
|
)
|
|
{
|
|
BOOLEAN State;
|
|
|
|
State = 99;
|
|
if (CurValueIsNumeric) {
|
|
|
|
State = (BOOLEAN)atol(CurValue);
|
|
|
|
} else {
|
|
|
|
if (streql(CurValue, "true")) { State = TRUE;
|
|
} else if (streql(CurValue, "false")) { State = FALSE;
|
|
}
|
|
|
|
}
|
|
|
|
if (State != FALSE && State != TRUE) {
|
|
printf ("'%s' is not boolean\n", CurValue);
|
|
exit (1);
|
|
}
|
|
|
|
if (streql(What,"allowpromotion")) { Pol->Policy[Index].AllowPromotion = State;
|
|
} else if (streql(What,"allowdemotion")) { Pol->Policy[Index].AllowDemotion = State;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
VOID
|
|
PrintPol (
|
|
IN PSYSTEM_POWER_POLICY Pol
|
|
)
|
|
{
|
|
BOOLEAN AnySleep;
|
|
ULONG i;
|
|
UCHAR text[200];
|
|
PUCHAR p;
|
|
|
|
if (Pol->Revision != 1) {
|
|
printf ("** revision not 1**\n");
|
|
}
|
|
|
|
AnySleep = Cap.SystemS1 || Cap.SystemS2 || Cap.SystemS3 || Cap.SystemS4;
|
|
|
|
printf ("Power button.........: %s\n", Action(&Cap.PowerButtonPresent, &Pol->PowerButton));
|
|
printf ("Sleep button.........: %s\n", Action(&Cap.SleepButtonPresent, &Pol->SleepButton));
|
|
printf ("Lid close............: %s\n", Action(&Cap.LidPresent, &Pol->LidClose));
|
|
printf ("Lid open wake........: %s\n", SysPower(Pol->LidOpenWake));
|
|
|
|
printf ("Idle.................: %s\n", Action(&AnySleep, &Pol->Idle));
|
|
printf ("Settings.............: Timeout=%d, Sensitivity=%d\n",
|
|
Pol->IdleTimeout,
|
|
Pol->IdleSensitivity
|
|
);
|
|
|
|
printf ("Min sleep state......: %s\n", SysPower(Pol->MinSleep));
|
|
printf ("Max sleep state......: %s\n", SysPower(Pol->MaxSleep));
|
|
printf ("Reduced latency.sleep: %s\n", SysPower(Pol->ReducedLatencySleep));
|
|
printf ("WinLogonFlags........: %x\n", Pol->WinLogonFlags);
|
|
printf ("DynamicThrottle......: %s\n", DynamicThrottle(Pol->DynamicThrottle));
|
|
printf ("Doze S4 timeout......: %d\n", Pol->DozeS4Timeout);
|
|
|
|
printf ("Battery broadcast res: %d\n", Pol->BroadcastCapacityResolution);
|
|
for (i=0; i < NUM_DISCHARGE_POLICIES; i++) {
|
|
printf ("Battery discharge %d..: ", i);
|
|
p = "Disabled";
|
|
if (!Cap.SystemBatteriesPresent && Pol->DischargePolicy[i].Enable) {
|
|
p = "No battery, but enable is set";
|
|
}
|
|
if (Cap.SystemBatteriesPresent && Pol->DischargePolicy[i].Enable) {
|
|
sprintf (text, "%d, %s, Min=%s",
|
|
Pol->DischargePolicy[i].BatteryLevel,
|
|
Action (NULL, &Pol->DischargePolicy[i].PowerPolicy),
|
|
SysPower(Pol->DischargePolicy[i].MinSystemState)
|
|
);
|
|
p = text;
|
|
}
|
|
printf ("%s\n", p);
|
|
}
|
|
|
|
printf ("Video timeout.......: %d\n", Pol->VideoTimeout);
|
|
printf ("Hard disk timeout....: %d\n", Pol->SpindownTimeout);
|
|
printf ("Optimize for power...: %s\n", szBool[Pol->OptimizeForPower]);
|
|
printf ("Fan throttle toler...: %d\n", Pol->FanThrottleTolerance);
|
|
printf ("Forced throttle......: %d%% %s\n",
|
|
Pol->ForcedThrottle,
|
|
Pol->ForcedThrottle == 100 ? "(off)" : "(on)"
|
|
);
|
|
printf ("Min throttle.........: %d%%\n", Pol->MinThrottle);
|
|
printf ("Over throttle act....: %s\n", Action (NULL, &Pol->OverThrottled));
|
|
printf ("\n");
|
|
}
|
|
|
|
|
|
VOID
|
|
PrintPPol (
|
|
IN PPROCESSOR_POWER_POLICY Pol
|
|
)
|
|
{
|
|
ULONG i;
|
|
UCHAR text[200];
|
|
PUCHAR p;
|
|
|
|
if (Pol->Revision != 1) {
|
|
|
|
printf ("** revision not 1**\n");
|
|
|
|
}
|
|
|
|
printf ("Dynamic Throttle.....: %s\n", DynamicThrottle(Pol->DynamicThrottle) );
|
|
printf ("\n");
|
|
for (i = 0; i < Pol->PolicyCount; i++) {
|
|
|
|
printf ("C%x Processor Power Policy\n", (i+1) );
|
|
printf (" Allow Demotion....: %s\n", szBool[Pol->Policy[i].AllowDemotion]);
|
|
printf (" Allow Promotion...: %s\n", szBool[Pol->Policy[i].AllowPromotion]);
|
|
printf (" Demote Percent....: %d%%\n", Pol->Policy[i].DemotePercent);
|
|
printf (" Promote Percent...: %d%%\n", Pol->Policy[i].PromotePercent);
|
|
printf (" Demote Limit......: %s\n", MicroSeconds(Pol->Policy[i].DemoteLimit) );
|
|
printf (" Promote Limit.....: %s\n", MicroSeconds(Pol->Policy[i].PromoteLimit) );
|
|
printf (" Time Check........: %s\n", MicroSeconds(Pol->Policy[i].TimeCheck) );
|
|
printf ("\n");
|
|
}
|
|
printf ("\n");
|
|
}
|
|
|
|
VOID
|
|
PrintAdmin (
|
|
PVOID Context
|
|
)
|
|
{
|
|
printf ("Min sleep state......: %s\n", SysPower(Admin.MinSleep));
|
|
printf ("Max sleep state......: %s\n", SysPower(Admin.MaxSleep));
|
|
printf ("Min video timeout....: %d\n", Admin.MinVideoTimeout);
|
|
printf ("Max video timeout....: %d\n", Admin.MaxVideoTimeout);
|
|
printf ("Min spindown timeout.: %d\n", Admin.MinSpindownTimeout);
|
|
printf ("Max spindown timeout.: %d\n", Admin.MaxSpindownTimeout);
|
|
}
|
|
|
|
VOID
|
|
AssignSetting (
|
|
PUCHAR Variable,
|
|
PUCHAR Value
|
|
)
|
|
{
|
|
PSYSTEM_POWER_POLICY Pol;
|
|
PUCHAR p;
|
|
|
|
if (!CurContext) {
|
|
printf ("must select ac, dc, pac, pdc, cap, admin to make setting in\n");
|
|
exit (1);
|
|
}
|
|
|
|
CurValue = Value;
|
|
if (!*CurValue) {
|
|
printf ("null settings not allowed\n");
|
|
exit (1);
|
|
}
|
|
|
|
CurValueIsNumeric = TRUE;
|
|
for (p = Value; *p; p++) {
|
|
if (*p < '0' || *p > '9') {
|
|
CurValueIsNumeric = FALSE;
|
|
}
|
|
}
|
|
|
|
ItemUpdated = TRUE;
|
|
CurAssign (Variable, Value);
|
|
}
|
|
|
|
VOID
|
|
AssignPolicySetting (
|
|
PUCHAR Variable,
|
|
PUCHAR Value
|
|
)
|
|
{
|
|
PSYSTEM_POWER_POLICY Pol;
|
|
|
|
Pol = (PSYSTEM_POWER_POLICY) CurContext;
|
|
|
|
// set policy
|
|
if (streql(Variable, "pbutt")) { SetAction(&Pol->PowerButton);
|
|
} else if (streql(Variable, "sbutt")) { SetAction(&Pol->SleepButton);
|
|
} else if (streql(Variable, "lidclose")) { SetAction(&Pol->LidClose);
|
|
} else if (streql(Variable, "idle")) { SetAction(&Pol->Idle);
|
|
} else if (streql(Variable, "idlesense")) { SetValue((PULONG)&Pol->IdleSensitivity);
|
|
} else if (streql(Variable, "idletimeout")) { SetValue(&Pol->IdleTimeout);
|
|
} else if (streql(Variable, "minsleep")) { SetSysPower(&Pol->MinSleep);
|
|
} else if (streql(Variable, "maxsleep")) { SetSysPower(&Pol->MaxSleep);
|
|
} else if (streql(Variable, "reducedsleep")) { SetSysPower(&Pol->ReducedLatencySleep);
|
|
} else if (streql(Variable, "s4timeout")) { SetValue(&Pol->DozeS4Timeout);
|
|
} else if (streql(Variable, "videotimeout")) { SetValue(&Pol->VideoTimeout);
|
|
} else if (streql(Variable, "disktimeout")) { SetValue(&Pol->SpindownTimeout);
|
|
} else if (streql(Variable, "optpower")) { SetBool(&Pol->OptimizeForPower);
|
|
} else if (streql(Variable, "fantol")) { SetValue((PULONG)&Pol->FanThrottleTolerance);
|
|
} else if (streql(Variable, "minthrot")) { SetValue((PULONG)&Pol->MinThrottle);
|
|
} else if (streql(Variable, "forcethrot")) { SetValue((PULONG)&Pol->ForcedThrottle);
|
|
} else if (streql(Variable, "overthrot")) { SetAction(&Pol->OverThrottled);
|
|
} else {
|
|
printf ("Variable not:\n");
|
|
printf (" pbutt, sbutt, lidclose\n");
|
|
printf (" idle, idlesense, idletime\n");
|
|
printf (" minsleep, maxsleep, reducedsleep, s4timeout\n");
|
|
printf (" videotimeout, disktimeout, optpower\n");
|
|
printf (" optpower, fantol, minthrot, forcethrot, overthrot\n");
|
|
exit (1);
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
AssignPPolicySetting (
|
|
PUCHAR Variable,
|
|
PUCHAR Value
|
|
)
|
|
{
|
|
PPROCESSOR_POWER_POLICY Pol;
|
|
|
|
Pol = (PPROCESSOR_POWER_POLICY) CurContext;
|
|
if (streql(Variable,"policycount")) { SetPolicyCount(&(Pol->PolicyCount));
|
|
} else if (streql(Variable,"dynamicthrottle")) { SetDynamicThrottle(&(Pol->DynamicThrottle));
|
|
} else if (streql(Variable,"c1allowpromotion")) { SetField(Pol,0,"allowpromotion");
|
|
} else if (streql(Variable,"c1allowdemotion")) { SetField(Pol,0,"allowdemotion");
|
|
} else if (streql(Variable,"c1demotepercent")) { SetPercentage(&(Pol->Policy[0].DemotePercent));
|
|
} else if (streql(Variable,"c1promotepercent")) { SetPercentage(&(Pol->Policy[0].PromotePercent));
|
|
} else if (streql(Variable,"c1demotelimit")) { SetValue(&(Pol->Policy[0].DemoteLimit));
|
|
} else if (streql(Variable,"c1promotelimit")) { SetValue(&(Pol->Policy[0].PromoteLimit));
|
|
} else if (streql(Variable,"c1timecheck")) { SetValue(&(Pol->Policy[0].TimeCheck));
|
|
} else if (streql(Variable,"c2allowpromotion")) { SetField(Pol,1,"allowpromotion");
|
|
} else if (streql(Variable,"c2allowdemotion")) { SetField(Pol,1,"allowdemotion");
|
|
} else if (streql(Variable,"c2demotepercent")) { SetPercentage(&(Pol->Policy[1].DemotePercent));
|
|
} else if (streql(Variable,"c2promotepercent")) { SetPercentage(&(Pol->Policy[1].PromotePercent));
|
|
} else if (streql(Variable,"c2demotelimit")) { SetValue(&(Pol->Policy[1].DemoteLimit));
|
|
} else if (streql(Variable,"c2promotelimit")) { SetValue(&(Pol->Policy[1].PromoteLimit));
|
|
} else if (streql(Variable,"c2timecheck")) { SetValue(&(Pol->Policy[1].TimeCheck));
|
|
} else if (streql(Variable,"c3allowpromotion")) { SetField(Pol,2,"allowpromotion");
|
|
} else if (streql(Variable,"c3allowdemotion")) { SetField(Pol,2,"allowdemotion");
|
|
} else if (streql(Variable,"c3demotepercent")) { SetPercentage(&(Pol->Policy[2].DemotePercent));
|
|
} else if (streql(Variable,"c3promotepercent")) { SetPercentage(&(Pol->Policy[2].PromotePercent));
|
|
} else if (streql(Variable,"c3demotelimit")) { SetValue(&(Pol->Policy[2].DemoteLimit));
|
|
} else if (streql(Variable,"c3promotelimit")) { SetValue(&(Pol->Policy[2].PromoteLimit));
|
|
} else if (streql(Variable,"c3timecheck")) { SetValue(&(Pol->Policy[2].TimeCheck));
|
|
} else {
|
|
printf("Variable not:\n");
|
|
printf(" policycount - number of elements in policy\n");
|
|
printf(" dynamicthrottle - which throttle policy to use\n");
|
|
printf(" cXallowpromotion - allow promotion from state X\n");
|
|
printf(" cXallowdemotion - allow demotion from state X\n");
|
|
printf(" cXdemotepercent - set demote percent for state X\n");
|
|
printf(" cXpromotepercent - set promote percent for state X\n");
|
|
printf(" cXdemotelimit - set demote limit for state X\n");
|
|
printf(" cXpromotelimit - set promote limit for state X\n");
|
|
printf(" cXtimecheck - set time check interval for state X\n");
|
|
printf(" where X = <1,2,3>\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
AssignAdminSetting (
|
|
PUCHAR Variable,
|
|
PUCHAR Value
|
|
)
|
|
{
|
|
if (streql(Variable, "minsleep")) { SetSysPower(&Admin.MinSleep);
|
|
} else if (streql(Variable, "maxsleep")) { SetSysPower(&Admin.MaxSleep);
|
|
} else if (streql(Variable, "minvideo")) { SetValue(&Admin.MinVideoTimeout);
|
|
} else if (streql(Variable, "maxvideo")) { SetValue(&Admin.MaxVideoTimeout);
|
|
} else if (streql(Variable, "mindisk")) { SetValue(&Admin.MinSpindownTimeout);
|
|
} else if (streql(Variable, "maxdisk")) { SetValue(&Admin.MaxSpindownTimeout);
|
|
} else {
|
|
printf ("Variable not:\n");
|
|
printf (" minsleep, maxsleep\n");
|
|
printf (" minvideo, maxvideo, mindisk, maxdisk\n");
|
|
exit (1);
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
AssignCapSetting (
|
|
PUCHAR Variable,
|
|
PUCHAR Value
|
|
)
|
|
{
|
|
// set capability
|
|
if (streql(Variable, "pbutt")) { SetBool(&Cap.PowerButtonPresent);
|
|
} else if (streql(Variable, "sbutt")) { SetBool(&Cap.SleepButtonPresent);
|
|
} else if (streql(Variable, "lid")) { SetBool(&Cap.LidPresent);
|
|
} else if (streql(Variable, "s1")) { SetBool(&Cap.SystemS1);
|
|
} else if (streql(Variable, "s2")) { SetBool(&Cap.SystemS2);
|
|
} else if (streql(Variable, "s3")) { SetBool(&Cap.SystemS3);
|
|
} else if (streql(Variable, "s4")) { SetBool(&Cap.SystemS4);
|
|
} else if (streql(Variable, "s5")) { SetBool(&Cap.SystemS5);
|
|
} else if (streql(Variable, "batt")) { SetBool(&Cap.SystemBatteriesPresent);
|
|
} else if (streql(Variable, "shortterm")) { SetBool(&Cap.BatteriesAreShortTerm);
|
|
} else if (streql(Variable, "acwake")) { SetSysPower(&Cap.AcOnLineWake);
|
|
} else if (streql(Variable, "lidwake")) { SetSysPower(&Cap.SoftLidWake);
|
|
} else if (streql(Variable, "rtcwake")) { SetSysPower(&Cap.RtcWake);
|
|
} else if (streql(Variable, "lowlat")) { SetSysPower(&Cap.DefaultLowLatencyWake);
|
|
} else {
|
|
printf ("Variable not:\n");
|
|
printf (" pbutt, sbutt, lid, s1, s2, s3, s4, s5\n");
|
|
printf (" batt, shortterm, acwake, lidwake, rtcwak, lowlat\n");
|
|
exit (1);
|
|
}
|
|
}
|
|
|
|
|
|
#define SEL_NONE 0
|
|
#define SEL_AC 1
|
|
#define SEL_DC 2
|
|
#define SEL_CAP 3
|
|
#define SEL_ADMIN 4
|
|
#define SEL_PAC 5
|
|
#define SEL_PDC 6
|
|
|
|
VOID
|
|
SelectItem(
|
|
IN ULONG Type
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
if (CurType) {
|
|
if (ItemUpdated) {
|
|
if (Verbose2) {
|
|
printf ("%s being set as:\n", CurDesc);
|
|
CurPrint (CurContext);
|
|
}
|
|
|
|
Status = NtPowerInformation (
|
|
CurInfo,
|
|
CurContext,
|
|
CurContextSize,
|
|
CurContext,
|
|
CurContextSize
|
|
);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("NtPowerInformation failed with %x\n", Status);
|
|
}
|
|
|
|
}
|
|
|
|
printf ("%s\n", CurDesc);
|
|
CurPrint (CurContext);
|
|
}
|
|
|
|
switch (Type) {
|
|
case SEL_NONE:
|
|
CurPrint = NULL;
|
|
CurAssign = NULL;
|
|
CurContext = NULL;
|
|
break;
|
|
|
|
case SEL_AC:
|
|
CurPrint = PrintPol;
|
|
CurInfo = SystemPowerPolicyAc;
|
|
CurContext = &Ac;
|
|
CurContextSize = sizeof(SYSTEM_POWER_POLICY);
|
|
CurAssign = AssignPolicySetting;
|
|
CurDesc = "AC power policy";
|
|
break;
|
|
|
|
case SEL_DC:
|
|
CurPrint = PrintPol;
|
|
CurInfo = SystemPowerPolicyDc;
|
|
CurContext = &Dc;
|
|
CurContextSize = sizeof(SYSTEM_POWER_POLICY);
|
|
CurAssign = AssignPolicySetting;
|
|
CurDesc = "DC power policy";
|
|
break;
|
|
|
|
case SEL_PAC:
|
|
CurPrint = PrintPPol;
|
|
CurInfo = ProcessorPowerPolicyAc;
|
|
CurContext = &PAc;
|
|
CurContextSize = sizeof(PROCESSOR_POWER_POLICY);
|
|
CurAssign = AssignPPolicySetting;
|
|
CurDesc = "AC processor power policy";
|
|
break;
|
|
|
|
case SEL_PDC:
|
|
CurPrint = PrintPPol;
|
|
CurInfo = ProcessorPowerPolicyDc;
|
|
CurContext = &PDc;
|
|
CurContextSize = sizeof(PROCESSOR_POWER_POLICY);
|
|
CurAssign = AssignPPolicySetting;
|
|
CurDesc = "DC processor power policy";
|
|
break;
|
|
|
|
case SEL_CAP:
|
|
CurPrint = PrintCap;
|
|
CurInfo = SystemPowerCapabilities,
|
|
CurContext = ⋒
|
|
CurContextSize = sizeof(SYSTEM_POWER_CAPABILITIES);
|
|
CurAssign = AssignCapSetting;
|
|
CurDesc = "power capabilties";
|
|
break;
|
|
|
|
case SEL_ADMIN:
|
|
CurPrint = PrintAdmin;
|
|
CurInfo = AdministratorPowerPolicy;
|
|
CurContext = &Admin;
|
|
CurContextSize = sizeof(ADMINISTRATOR_POWER_POLICY);
|
|
CurAssign = AssignAdminSetting;
|
|
CurDesc = "Admin policy overrides";
|
|
break;
|
|
}
|
|
|
|
CurType = Type;
|
|
ItemUpdated = FALSE;
|
|
}
|
|
|
|
|
|
VOID
|
|
UpdateAdmin (
|
|
VOID
|
|
)
|
|
{
|
|
ADMINISTRATOR_POWER_POLICY AdminPolicy;
|
|
NTSTATUS Status;
|
|
|
|
|
|
Status = NtPowerInformation (
|
|
AdministratorPowerPolicy,
|
|
NULL,
|
|
0,
|
|
&AdminPolicy,
|
|
sizeof (AdminPolicy)
|
|
);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("Error reading admin policy %x\n", Status);
|
|
exit (1);
|
|
}
|
|
|
|
Status = NtPowerInformation (
|
|
AdministratorPowerPolicy,
|
|
&AdminPolicy,
|
|
sizeof (AdminPolicy),
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("Error writing admin policy %x\n", Status);
|
|
exit (1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
VOID __cdecl
|
|
main (argc, argv)
|
|
int argc;
|
|
char *argv[];
|
|
{
|
|
NTSTATUS Status;
|
|
PUCHAR p, p1;
|
|
BOOLEAN Result;
|
|
HANDLE hToken;
|
|
TOKEN_PRIVILEGES tkp;
|
|
|
|
if (argc < 2) {
|
|
printf ("dumppo: cap ps bs admin ac dc pac pdc\n");
|
|
exit (1);
|
|
}
|
|
|
|
Status = NtPowerInformation (
|
|
SystemPowerCapabilities,
|
|
NULL,
|
|
0,
|
|
&Cap,
|
|
sizeof (Cap)
|
|
);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("Error reading power capabilities %x\n", Status);
|
|
exit (1);
|
|
}
|
|
|
|
Status = NtPowerInformation (
|
|
AdministratorPowerPolicy,
|
|
NULL,
|
|
0,
|
|
&Admin,
|
|
sizeof (Admin)
|
|
);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("Error reading admin power overrides %x\n", Status);
|
|
exit (1);
|
|
}
|
|
|
|
Status = NtPowerInformation (
|
|
SystemPowerPolicyAc,
|
|
NULL,
|
|
0,
|
|
&Ac,
|
|
sizeof (Ac)
|
|
);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("Error reading AC policies %x\n", Status);
|
|
exit (1);
|
|
}
|
|
|
|
Status = NtPowerInformation (
|
|
SystemPowerPolicyDc,
|
|
NULL,
|
|
0,
|
|
&Dc,
|
|
sizeof (Dc)
|
|
);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("Error reading DC policies %x\n", Status);
|
|
exit (1);
|
|
}
|
|
|
|
Result = (BOOLEAN)GetSystemPowerStatus (&PS);
|
|
if (!Result) {
|
|
printf ("False returned from GetSystemPowerStatus %x\n", GetLastError());
|
|
exit (1);
|
|
}
|
|
|
|
Status = NtPowerInformation (
|
|
SystemBatteryState,
|
|
NULL,
|
|
0,
|
|
&Batt,
|
|
sizeof (Batt)
|
|
);
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("Error reading system battery status %x\n", Status);
|
|
exit (1);
|
|
}
|
|
|
|
Status = NtPowerInformation (
|
|
ProcessorPowerPolicyAc,
|
|
NULL,
|
|
0,
|
|
&PAc,
|
|
sizeof (PAc)
|
|
);
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf ("Error reading processor AC policy %x\n", Status);
|
|
exit (1);
|
|
}
|
|
|
|
Status = NtPowerInformation(
|
|
ProcessorPowerPolicyDc,
|
|
NULL,
|
|
0,
|
|
&PDc,
|
|
sizeof (PDc)
|
|
);
|
|
if (!NT_SUCCESS(Status)) {
|
|
printf("Error reading processor DC policy %x\n", Status);
|
|
exit (1);
|
|
}
|
|
|
|
//
|
|
// Upgrade premissions
|
|
//
|
|
|
|
OpenProcessToken (
|
|
GetCurrentProcess(),
|
|
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
|
|
&hToken
|
|
);
|
|
|
|
LookupPrivilegeValue (
|
|
NULL,
|
|
SE_SHUTDOWN_NAME,
|
|
&tkp.Privileges[0].Luid
|
|
);
|
|
|
|
tkp.PrivilegeCount = 1;
|
|
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
|
|
AdjustTokenPrivileges (
|
|
hToken,
|
|
FALSE,
|
|
&tkp,
|
|
0,
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
//
|
|
// Process args
|
|
//
|
|
|
|
while (argc) {
|
|
argc--;
|
|
|
|
if (streql(*argv, "-v")) {
|
|
Verbose1 = TRUE;
|
|
}
|
|
|
|
if (streql(*argv, "-V")) {
|
|
Verbose1 = TRUE;
|
|
Verbose2 = TRUE;
|
|
}
|
|
|
|
for (p = *argv; *p; p++) {
|
|
if (*p >= 'A' && *p <= 'Z') {
|
|
*p += 'a' - 'A';
|
|
}
|
|
}
|
|
|
|
p = *argv;
|
|
argv += 1;
|
|
|
|
if (streql(p, "ac")) {
|
|
SelectItem(SEL_AC);
|
|
}
|
|
|
|
if (streql(p, "dc")) {
|
|
SelectItem(SEL_DC);
|
|
}
|
|
|
|
if (streql(p, "cap")) {
|
|
SelectItem(SEL_CAP);
|
|
}
|
|
|
|
if (streql(p, "ps")) {
|
|
SelectItem(SEL_NONE);
|
|
PrintPowerStatus ();
|
|
}
|
|
|
|
if (streql(p, "bs")) {
|
|
SelectItem(SEL_NONE);
|
|
PrintBattStatus ();
|
|
}
|
|
|
|
if (streql(p, "admin")) {
|
|
SelectItem(SEL_ADMIN);
|
|
}
|
|
|
|
if (streql(p, "pdc")) {
|
|
SelectItem(SEL_PDC);
|
|
}
|
|
|
|
if (streql(p, "pac")) {
|
|
SelectItem(SEL_PAC);
|
|
}
|
|
|
|
//
|
|
// Check if this is a assignment
|
|
//
|
|
|
|
for (p1=p; *p1; p1++) {
|
|
if (*p1 == '=') {
|
|
*p1 = 0;
|
|
AssignSetting (p, p1+1);
|
|
}
|
|
}
|
|
}
|
|
|
|
// flush
|
|
SelectItem(SEL_NONE);
|
|
}
|