kernel32.dll and GetSystemPowerStatus

Technical support and scripting issues

Moderators: Dorian (MJT support), JRL

Post Reply
User avatar
Grovkillen
Automation Wizard
Posts: 1009
Joined: Fri Aug 10, 2012 2:38 pm
Location: Bräcke, Sweden
Contact:

kernel32.dll and GetSystemPowerStatus

Post by Grovkillen » Thu Apr 23, 2020 6:59 am

Code: Select all

LibFunc>kernel32,GetSystemPowerStatus,Test,powerStatus
Gives a weird string in return. Could someone guide me to how to interpret it?

BTW, this only return the array "TEST_1=powerStatus":

Code: Select all

LibFuncW>kernel32,GetSystemPowerStatus,Test,powerStatus
I found the syntax here: https://docs.microsoft.com/sv-se/window ... owerstatus
Let>ME=%Script%

Running: 15.0.24
version history

User avatar
Grovkillen
Automation Wizard
Posts: 1009
Joined: Fri Aug 10, 2012 2:38 pm
Location: Bräcke, Sweden
Contact:

Re: kernel32.dll and GetSystemPowerStatus

Post by Grovkillen » Thu Apr 23, 2020 7:42 am

Code: Select all

LibFunc>kernel32,GetSystemPowerStatus,DecimalOfBinary,REF:0
This gives me the byte wise data as a decimal, unassigned meaning I need to first convert it into ones and zeros and then pad it with leading zeroes accordingly.
Let>ME=%Script%

Running: 15.0.24
version history

User avatar
Grovkillen
Automation Wizard
Posts: 1009
Joined: Fri Aug 10, 2012 2:38 pm
Location: Bräcke, Sweden
Contact:

Re: kernel32.dll and GetSystemPowerStatus

Post by Grovkillen » Thu Apr 23, 2020 10:13 am

I found out that this is possible with a bit of head banging... not completely accurate with the bit wise lookup but I post this as a work in progress to document my progress and perhaps someone else will pitch in.

Code: Select all

LibFunc>kernel32,GetSystemPowerStatus,DECIMAL_VALUE,REF:0

//Format> command doesn't have a base conversion for binary...
//https://stackoverflow.com/questions/32416311/base-conversion-function-in-vbscript
VBSTART
Function ToBase(ByVal n, b)
  ' Handle everything from binary to base 36...
  If b < 2 Or b > 36 Then Exit Function

  Const SYMBOLS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

  Do
      ToBase = Mid(SYMBOLS, n Mod b + 1, 1) & ToBase
      n = Int(n / b)
  Loop While n > 0
End Function
VBEND

VBEval>ToBase(%DECIMAL_VALUE_1%,2),BINARY_VALUE

//This didn't work to pad the binary into a signed binary...
//Format>%.32d,BINARY_VALUE,SIGNED_BINARY_VALUE

Length>BINARY_VALUE,BINARY_VALUE_length

If>BINARY_VALUE_length<32
  Let>DIFFERENCE=32-BINARY_VALUE_length
  Let>PAD_ZEROS=
  Let>pad=0
  Repeat>pad
    ConCat>PAD_ZEROS,0
    Let>pad=pad+1
  Until>pad=DIFFERENCE
  Let>SIGNED_BINARY_VALUE=%PAD_ZEROS%%BINARY_VALUE%
Else>
  Let>SIGNED_BINARY_VALUE=BINARY_VALUE
Endif>

Let>BATTERY_INFO_BYTES=ACLineStatus|BatteryFlag|BatteryLifePercent|SystemStatusFlag
Let>BATTERY_INFO_ACLINESTATUS=0,Offline|1,Online|255,Unknown
Let>BATTERY_INFO_BATTERYFLAG=1,High|2,Low|4,Critical|8,Charging|128,No battery|255,Unknown
Let>BATTERY_INFO_BATTERYLIFEPERCENT=255,Unknown
Let>BATTERY_INFO_SYSTEMSTATUSFLAG=0,Battery saver off|1,Battery saver on

Let>BYTE_LENGTH=8
Separate>BATTERY_INFO_BYTES,|,BYTE
Let>k=0
Repeat>k
  Let>BYTE_START_POSITION={%k%*%BYTE_LENGTH%+1}
  Let>k=k+1
  MidStr>SIGNED_BINARY_VALUE,BYTE_START_POSITION,BYTE_LENGTH,TEMP_BYTE_VALUE
  Let>TEMP_BYTE=BYTE_%k%
  UpperCase>TEMP_BYTE,TEMP_BYTE
  Let>TEMP_BYTE_STRING=BATTERY_INFO_%TEMP_BYTE%
  Separate>%TEMP_BYTE_STRING%,|,TEMP_REPLACE
  Let>p=0
  Repeat>p
    Let>p=p+1
    Let>TEMP_REPLACE_STRING=TEMP_REPLACE_%p%
    Separate>TEMP_REPLACE_STRING,%COMMA%,TEMP_N
    Let>BATTERY_INFO_%TEMP_BYTE%_DECIMAL_VALUE_%TEMP_N_1%=%TEMP_N_2%
  Until>p=TEMP_REPLACE_count
  GoSub>BINARY_TO_DECIMAL,TEMP_BYTE_VALUE
Until>k=BYTE_count

SRT>BINARY_TO_DECIMAL
  Let>TEMP_DECIMAL_VALUE=0
  Let>n=BYTE_LENGTH
  Let>power=0
  Repeat>n
    MidStr>BINARY_TO_DECIMAL_Var_1,n,1,BIT
    If>power=0
      If>BIT=1
        Let>TO_ADD=1
      Else>
        Let>TO_ADD=0
      Endif>
    Else>
      If>BIT=1
        Let>TO_ADD={Power(2,%power%)}
      Else>
        Let>TO_ADD=0
      Endif>
    Endif>
    Add>TEMP_DECIMAL_VALUE,TO_ADD
    Let>power=power+1
    Let>n=n-1
  Until>n=0
  Let>TEMP_STRING=BATTERY_INFO_%TEMP_BYTE%_DECIMAL_VALUE_%TEMP_DECIMAL_VALUE%
  Position>_DECIMAL_VALUE_,TEMP_STRING,1,TEMP_STRING_TEST,FALSE
  If>TEMP_STRING_TEST=0
    //
    Let>BATTERY_INFO_%TEMP_BYTE%_INFO=TEMP_STRING
  Else>
    Let>BATTERY_INFO_%TEMP_BYTE%_INFO=TEMP_DECIMAL_VALUE
  Endif>
END>BINARY_TO_DECIMAL
FYI:
I want to know the computer's battery status in order to act on it. So current percentage (which I seem to get with my script so far) plus if it's charging or not is what I'm looking for.
Let>ME=%Script%

Running: 15.0.24
version history

User avatar
Grovkillen
Automation Wizard
Posts: 1009
Joined: Fri Aug 10, 2012 2:38 pm
Location: Bräcke, Sweden
Contact:

Re: kernel32.dll and GetSystemPowerStatus

Post by Grovkillen » Thu Apr 23, 2020 12:52 pm

Ok, VBScript did the trick:

Code: Select all

VBSTART
Function BatteryInfo()
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from CIM_Battery")
For Each objItem in colItems
    BatteryInfo = BatteryInfo & _
                  "BatteryStatus=" & objItem.BatteryStatus & "|"  & _
                  "Description=" & objItem.Description & "|"  & _
                  "Voltage=" & objItem.DesignVoltage & "|"  & _
                  "DeviceID=" & objItem.DeviceID & "|"  & _
                  "Percentage=" & objItem.EstimatedChargeRemaining & "|"  & _
                  "MinutesLeft=" & objItem.EstimatedRunTime & "|"  & _
                  "Status=" & objItem.Status & "||"
Next

End Function

VBEND

VBEval>BatteryInfo(),TEMP

Separate>TEMP,||,TEMP_BATTERY

Let>b=1
Repeat>b
  Let>TEMP_BAT=TEMP_BATTERY_%b%
  Separate>TEMP_BAT,|,TEMP_INFO
  Let>i=0
  Repeat>i
    Let>i=i+1
    Let>TEMP_VAR=TEMP_INFO_%i%
    Separate>TEMP_VAR,=,TEMP_VALUE
    UpperCase>TEMP_VALUE_1,TEMP_VALUE_1
    Let>BATTERY_%b%_%TEMP_VALUE_1%=TEMP_VALUE_2
  Until>i=TEMP_INFO_count
  Let>b=b+1
Until>b=TEMP_BATTERY_count
More info found here: https://docs.microsoft.com/en-us/window ... im-battery
Let>ME=%Script%

Running: 15.0.24
version history

Post Reply
Sign up to our newsletter for free automation tips, tricks & discounts