Advertisement
Guest User

GetSystemPowerStatus disassembly (Win7 x64)

a guest
Mar 9th, 2016
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 0000000077087DC0 | push rbx                                              | ;Prolog
  2. 0000000077087DC2 | sub rsp,60                                            |  
  3.  
  4. 0000000077087DC6 | mov rax,qword ptr ds:[7718B3D0]                       | ;Canary
  5. 0000000077087DCD | xor rax,rsp                                           |
  6. 0000000077087DD0 | mov qword ptr ss:[rsp+50],rax                         |
  7.  
  8. 0000000077087DD5 | xor edx,edx                                           | ;InputBuffer = 0
  9. 0000000077087DD7 | mov rbx,rcx                                           | ;RBX = lpSystemPowerStatus
  10. 0000000077087DDA | lea r9,qword ptr ss:[rsp+30]                          | ;OutputBuffer = rsp+30h
  11. 0000000077087DDF | lea ecx,dword ptr ds:[rdx+5]                          | ;InformationLevel = 5 = SystemBatteryState
  12. 0000000077087DE2 | xor r8d,r8d                                           | ;InputBufferLength = 0
  13. 0000000077087DE5 | mov dword ptr ss:[rsp+20],20                          | ;OutputBufferLength = 20h
  14. 0000000077087DED | call qword ptr ds:[<&NtPowerInformation>]             | ;NtPowerInformation(SystemBatteryState, NULL, 0, &out, 32)
  15.  
  16. 0000000077087DF3 | test eax,eax                                          |
  17. 0000000077087DF5 | js kernel32.770B26DE                                  | ;Check return and set last error if failed
  18.  
  19. 0000000077087DFB | xor eax,eax                                           | ;Zero out SYSTEM_POWER_STATUS
  20. 0000000077087DFD | mov dword ptr ds:[rbx],eax                            |
  21. 0000000077087DFF | mov dword ptr ds:[rbx+4],eax                          |
  22. 0000000077087E02 | mov dword ptr ds:[rbx+8],eax                          |
  23.  
  24. 0000000077087E05 | movzx eax,byte ptr ss:[rsp+31]                        | ;EAX = PSYSTEM_BATTERY_STATE.BatteryPresent
  25. 0000000077087E0A | mov byte ptr ds:[rbx],1                               | ;SYSTEM_POWER_STATUS.ACLineStatus = PSYSTEM_BATTERY_STATE.BatteryPresent
  26.  
  27. 0000000077087E0D | test al,al                                            | ;Battery present
  28. 0000000077087E0F | jnz _BatteryPresent                                   |
  29.  
  30. ;NO BATTERY
  31.  
  32. _BatteryPresent.AcOnLine:
  33. 0000000077087E15 | cmp byte ptr ss:[rsp+32],0                            | ;Battery charging?
  34. 0000000077087E1A | jnz _BatteryCharging                                  |
  35.  
  36. _BatteryPresent.Charging:
  37. 0000000077087E20 | test al,al                                            | ;BatteryPresent?
  38. 0000000077087E22 | jnz _BatteryPresent.Charging2                         |
  39.  
  40. ;NO CHARGING
  41.  
  42. 0000000077087E24 | or byte ptr ds:[rbx+1],80                             | Set bit7 (No battery) in BatteryFlag
  43.  
  44. _BatteryPresent.Charging2:
  45. 0000000077087E28 | mov r8d,dword ptr ss:[rsp+38]                         | ;r8d = PSYSTEM_BATTERY_STATE.MaxCapacity
  46. 0000000077087E2D | mov byte ptr ds:[rbx+2],FF                            | ;SYSTEM_POWER_STATUS.BatteryLife = UNKNOWN
  47.  
  48. 0000000077087E31 | test r8d,r8d                                          | ;MaxCapacity != 0?
  49. 0000000077087E34 | jnz _MaxCapacityPresent                               |
  50.  
  51. ;NO MAXCAPACITY
  52.  
  53. _BatteryPresent.MaxCapacity:
  54. 0000000077087E3A | mov eax,dword ptr ss:[rsp+44]                         | ;eax = PSYSTEM_BATTERY_STATE.EstimatedTime
  55. 0000000077087E3E | mov dword ptr ds:[rbx+4],FFFFFFFF                     | ;BatteryLife = -1 (Unknown)
  56. 0000000077087E45 | mov dword ptr ds:[rbx+8],FFFFFFFF                     | ;BatteryLifePercent = -1 (Unknown)
  57.  
  58. 0000000077087E4C | test eax,eax                                          | ;EstimatedTime != 0?
  59. 0000000077087E4E | jnz _Times                                 | ;To 770B2746 if Yes
  60.  
  61. _TimesDone:
  62. 0000000077087E54 | mov eax,1                                             | ;Return value
  63.  
  64. 0000000077087E59 | mov rcx,qword ptr ss:[rsp+50]                         | ;Canary check
  65. 0000000077087E5E | xor rcx,rsp                                           |
  66. 0000000077087E61 | call kernel32.770A17A0                                |
  67.  
  68. 0000000077087E66 | add rsp,60                                            | ;Epilog
  69. 0000000077087E6A | pop rbx                                               |
  70. 0000000077087E6B | ret                                                   |
  71.  
  72. _BatteryPresent:
  73.  
  74. 00000000770B26EC | cmp byte ptr ss:[rsp+30],0                            | ;PSYSTEM_BATTERY_STATE.AcOnLine ?
  75. 00000000770B26F1 | jnz _BatteryPresent.AcOnLine                          |
  76.  
  77. 00000000770B26F7 | mov byte ptr ds:[rbx],0                               | ;SYSTEM_POWER_STATUS.AcLineStatus = 0
  78. 00000000770B26FA | jmp _BatteryPresent.AcOnLine                          |
  79.  
  80. _BatteryCharging:
  81. 00000000770B26FF | or byte ptr ds:[rbx+1],8                              | ;PSYSTEM_BATTERY_STATE.BatteryFlags |= Charging
  82. 00000000770B2703 | jmp _BatteryPresent.Charging                          |
  83.  
  84. _MaxCapacityPresent:
  85. 00000000770B2708 | mov eax,dword ptr ss:[rsp+3C]                         | ;EAX = PSYSTEM_BATTERY_STATE.RemainingCapacity
  86. 00000000770B270C | cmp eax,r8d                                           | ;PSYSTEM_BATTERY_STATE.RemainingCapacity <= PSYSTEM_BATTERY_STATE.MaxCapacity
  87. 00000000770B270F | jbe kernel32.770B2717                                 |
  88.  
  89. 00000000770B2711 | mov byte ptr ds:[rbx+2],64                            | ;SYSTEM_POWER_STATUS.BatteryLifePercent = 100
  90. 00000000770B2715 | jmp _BatteryLifeDone                                  |
  91.  
  92. 00000000770B2717 | imul eax,eax,64                                       | ;EAX = PSYSTEM_BATTERY_STATE.RemainingCapacity*100
  93. 00000000770B271A | mov ecx,r8d                                           | ;RCX = PSYSTEM_BATTERY_STATE.MaxCapacity
  94. 00000000770B271D | xor edx,edx                                           | ;RDX = 0
  95. 00000000770B271F | shr ecx,1                                             | ;ECX = PSYSTEM_BATTERY_STATE.MaxCapacity/2
  96. 00000000770B2721 | add eax,ecx                                           | ;EAX = PSYSTEM_BATTERY_STATE.RemainingCapacity*100 + PSYSTEM_BATTERY_STATE.MaxCapacity/2
  97. 00000000770B2723 | div r8d                                               | ;EAX = Ceil(PSYSTEM_BATTERY_STATE.RemainingCapacity*100 / PSYSTEM_BATTERY_STATE.MaxCapacity)
  98. 00000000770B2726 | mov byte ptr ds:[rbx+2],al                            | ;SYSTEM_POWER_STATUS.BatteryLifePercent = AL
  99.  
  100. _BatteryLifeDone :
  101. 00000000770B2729 | movzx eax,byte ptr ds:[rbx+2]                         | ;EAX = SYSTEM_POWER_STATUS.BatteryLifePercent
  102. 00000000770B272D | cmp al,42                                             | ;SYSTEM_POWER_STATUS.BatteryLifePercent <= 66?
  103. 00000000770B272F | jbe _BatteryLife_below66                              |
  104.  
  105. 00000000770B2731 | or byte ptr ds:[rbx+1],1                              | ;SYSTEM_POWER_STATUS.BatteryFlags |= 1 (High)
  106.  
  107. _BatteryLife_below66:
  108. 00000000770B2735 | cmp al,21                                             | ;SYSTEM_POWER_STATUS.BatteryLifePercent > 33?
  109. 00000000770B2737 | jnb _BatteryPresent.MaxCapacity                       |
  110.  
  111. 00000000770B273D | or byte ptr ds:[rbx+1],2                              | ;SYSTEM_POWER_STATUS.BatteryFlags |= 2 (Low)
  112. 00000000770B2741 | jmp _BatteryPresent.MaxCapacity                       |
  113.  
  114. _Times:
  115. 00000000770B2746 | mov dword ptr ds:[rbx+4],eax                          | ;SYSTEM_POWER_STATUS.BatteryLife = PSYSTEM_BATTERY_STATE.RemainingCapacity
  116.  
  117. 00000000770B2749 | jmp _Times_Done                                       |
  118.  
  119. 00000000770B274E | xor eax,eax                                           |
  120. 00000000770B2750 | mov dword ptr ss:[rsp+30],10                          |
  121. 00000000770B2758 | mov r9,r10                                            |
  122. 00000000770B275B | mov qword ptr ss:[rsp+28],rax                         |
  123. 00000000770B2760 | mov qword ptr ss:[rsp+20],rax                         |
  124. 00000000770B2765 | call qword ptr ds:[<&LdrResFindResourceDirectory>]    |
  125. 00000000770B276B | add rsp,78                                            |
  126. 00000000770B276F | ret                                                   |
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement