Jump to content

Set an Array variable with unknown number


Rogue5099
 Share

Recommended Posts

  • Moderators

Rogue5099,

If you are going to add the items to the array one by one then you can use the little trick I explain at the end of the Recursion tutorial in the Wiki to correctly size the array as you go along. :)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

Use Global $var[1]

This makes $var an array, and then you can use ReDim to add more "rows" once you know how many you actually need.

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

Ok getting off subject cause I'm getting stumped, I broke down a script I've been messing with and it works fine broken down but put into main script it only works partly.  I'm creating a button for each drive that is on the computer (eventually going to show info but for now just msgbox).

Here is working on each drive I have:

#include <GuiConstantsEx.au3>
Dim $DriveButton[100], $DriveTypeLabel[100], $DriveFreePos[100], $DriveFree[100], $DriveType[100]
Global $aDrive = DriveGetDrive("ALL")
DriveInfo()
GUICreate("Test", 400, 455, -1, -1)
GUISetFont(8, 400, 0, "Lucida Console")

For $i = 1 To $aDrive[0]
    If Not $DriveType[$i] = "" Then
        $DriveButton[$i] = GUICtrlCreateButton(StringUpper($aDrive[$i]) & "\", 5, 25 + (($i - 1) * 15), 30, 15)
        $DriveTypeLabel[$i] = GUICtrlCreateLabel($DriveType[$i], 45, 25 + (($i - 1) * 15), 75, 15, 0x1201)
        $DriveFreePos[$i] = GUICtrlCreateProgress(125, 25 + (($i - 1) * 15), 125, 15, 0x01)
        GUICtrlSetData($DriveFreePos[$i], $DriveFree[$i])
        If ($DriveType[$i] = "Fixed" Or $DriveType[$i] = "Removable") And ($DriveFree[$i] > 0) Then GUICtrlCreateLabel(Round((DriveSpaceTotal(StringUpper($aDrive[$i]) & "\") - DriveSpaceFree(StringUpper($aDrive[$i]) & "\")) / 1024, 1) & "/" &  Round((DriveSpaceTotal(StringUpper($aDrive[$i]) & "\") / 1024), 1) & " GB (" & $DriveFree[$i] & "%)", 255, 30 + (($i - 1) * 15))
    EndIf
Next
GUISetState(@SW_SHOW)

While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $DriveButton[1] To UBound($DriveButton)
            MsgBox(0, "", GUICtrlRead($iMsg))
    EndSwitch
WEnd

Func DriveInfo()
    For $i = 1 To $aDrive[0]
        $DriveType[$i] = DriveGetType(StringUpper($aDrive[$i]) & "\")
        $DriveFree[$i] = Round((DriveSpaceTotal(StringUpper($aDrive[$i]) & "\") - DriveSpaceFree(StringUpper($aDrive[$i]) & "\")) / DriveSpaceTotal(StringUpper($aDrive[$i]) & "\") * 100, 0)
        GUICtrlSetData($DriveFreePos[$i], $DriveFree[$i])
        GUICtrlSetData($DriveTypeLabel[$i], $DriveType[$i])
    Next
EndFunc   ;==>DriveInfo 

Here is not working on each drive but just on 3-4 of them:

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=icon.ico
#AutoIt3Wrapper_Res_Comment=Freeware, If you paid for this software you should get your money back!
#AutoIt3Wrapper_Res_Description=Computer Stats
#AutoIt3Wrapper_Res_Fileversion=2.0.2.0
#AutoIt3Wrapper_Res_LegalCopyright=GNU FreeSoftware
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_requestedExecutionLevel=None
#AutoIt3Wrapper_UseX64=N
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------

    AutoIt Version: 3.3.8.1

    Author :       Rogue5099

    Credits:       JSThePatriot, Melba23, Beege, ApudAngelorum, AZJIO, EXIT
                    JFX, bcording

    And thanks to anyone else and the AutoIt Team
    that has helped and I have forgotten.

    Script Function: Gather System Information and display it easily.

#ce ----------------------------------------------------------------------------
#region - Includes -
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <GuiListView.au3>
#include <Date.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <SendMessage.au3>
#include <IE.au3>
#endregion - Includes -
Global Const $Buisness = "Computer Stats", $Ver = "2.0.2.0"
Global Const $Phone = "555-555-5555"
#region - Globals -
Opt('GUICloseOnESC', 0)
Global Const $MIB_IF_TYPE_OTHER = 1
Global Const $MIB_IF_TYPE_ETHERNET_CSMACD = 6
Global Const $MIB_IF_TYPE_ISO88025_TOKENRING = 9
Global Const $MIB_IF_TYPE_PPP = 23
Global Const $MIB_IF_TYPE_SOFTWARE_LOOPBACK = 24
Global Const $MIB_IF_TYPE_ATM = 37
Global Const $MIB_IF_TYPE_IEEE80211 = 71
Global Const $MIB_IF_TYPE_TUNNEL = 131
Global Const $MIB_IF_TYPE_IEEE1394 = 144
Global Const $wbemFlagReturnImmediately = 0x10
Global Const $wbemFlagForwardOnly = 0x20
Global Const $tagMIB_IFROW = 'wchar Name[256];dword Index;dword Type;dword Mtu;dword Speed;dword PhysAddrLen;byte PhysAddr[8];dword AdminStatus;dword OperStatus;' & _
        'dword LastChange;dword InOctets;dword InUcastPkts;dword InNUcastPkts;dword InDiscards;dword InErrors;dword InUnknownProtos;dword OutOctets;dword OutUcastPkts;' & _
        'dword OutNUcastPkts;dword OutDiscards;dword OutErrors;dword OutQLen;dword DescrLen;char Descr[256]'
Global $iMarquee_Loop = 0
Global $sMarquee_Move = "scroll"
Global $sMarquee_Direction = "left"
Global $iMarquee_Scroll = 6
Global $iMarquee_Delay = 85
Global $iMarquee_Border = 0
Global $vMarquee_TxtCol = Default
Global $sMarquee_BkCol = Default
Global $sMarquee_FontFamily = "Tahoma"
Global $iMarquee_FontSize = 12
Global $Date, $Time, $AvgCPU, $Collected, $CPUTotal, $RAMCollected, $RAMTotal
Global $CPU[8], $CPULabel[8]
Global $oDict, $ProcessList2, $l = 0
Global $colItems, $strReserved, $strVendorSpecific, $strVendorSpecific4, $Output
Global $DriveInfo, $DriveInfoLoad, $DriveLabel, $DriveInfoType, $DriveFileSystem, $DriveSize, $DriveSerial, $DriveTemp, $DriveProgress, $DriveLetter, $DriveStatus, $Memory
Global $ip = "localhost"
Global $RAMUsage = MemGetStats()
Global $RefreshTimerA = TimerInit()
Global $RefreshTimerB = TimerInit()
Global $aDrive = DriveGetDrive("ALL")
Global $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394084(v=vs.85).aspx"
Global $BIOS, $aSystemInfo, $DriveTypeLabel[100], $DriveFreePos[100], $DriveFree[100], $DriveType[100], $DriveButton[100]
Global $hUpdate, $aStart_Values
Global $sBmpFilePath = @TempDir & '\bg.bmp'
Global $_PDH_hDLLHandle = -1, $_PDH_bInit = False, $_PDH_iLastError = 0
Global $_PDH_REG_MODIFIED, $_PDH_RESTORE_REG
Global $_PDH_iCPUCount
Global $PDH_DEBUGLOG = 1
Global $hPDHQuery, $aCPUCounters, $iTotalCPUs, $iCounterValue, $sPCName = ""
#endregion - Globals -
#region - Loading GUI with Infomation
If @OSServicePack = "" Then $OSServicePack = "Original Version"
If Not @OSServicePack = "" Then $OSServicePack = @OSServicePack
Switch @OSVersion
    Case "WIN_8"
        $OSVersion = "Windows 8"
    Case "WIN_7"
        $OSVersion = "Windows 7"
    Case "WIN_VISTA"
        $OSVersion = "Windows Vista"
    Case "WIN_2008R2"
        $OSVersion = "Windows 2008 R2"
    Case "WIN_2008"
        $OSVersion = "Windows 2008"
    Case "WIN_XP"
        $OSVersion = "Windows XP"
    Case "WIN_2003"
        $OSVersion = "Windows 2003"
    Case "WIN_2000"
        $OSVersion = "Windows 2000"
    Case Else
        $OSVersion = "Unknown"
EndSwitch
$Language = _GLI()
$CPUInfo = _CPURegistryInfo()
$IPDetail = _IPDetails()
_ComputerGetSystem($aSystemInfo)
_ComputerGetBIOS($BIOS)
DateTime()
DriveInfo()
_ComputerGetMemory($Memory)
Switch $Memory[1][12]
    Case 11
        $MemoryType = "Flash"
    Case 16
        $MemoryType = "3DRAM"
    Case 17
        $MemoryType = "SDRAM"
    Case 20
        $MemoryType = "DDR"
    Case 21
        $MemoryType = "DDR2"
    Case Else
        $MemoryType = "DDR3"
EndSwitch
$MainGUI = GUICreate($Buisness & " Utility - Version " & $Ver, 400, 455, -1, -1, 0x00CA0080, $WS_EX_ACCEPTFILES)
GUISetFont(8, 400, 0, "Lucida Console")
$ToolsMenu = GUICtrlCreateMenu("Tools")
$PixalFinder = GUICtrlCreateMenuItem("Pixel Finder", $ToolsMenu)
$RecycleItem = GUICtrlCreateMenuItem("Clean Temp Files", $ToolsMenu)
$DriveInfoItem = GUICtrlCreateMenuItem("Details on Drive...", $ToolsMenu)
$RemoteRepair = GUICtrlCreateMenuItem("Remote Repair (Team Viewer)", $ToolsMenu)
GUICtrlCreateMenuItem("", $ToolsMenu)
$RefreshNet = GUICtrlCreateMenuItem("Refresh Connection", $ToolsMenu)
$ClearIEHistory = GUICtrlCreateMenuItem("Delete IE History", $ToolsMenu)
$ResetIE = GUICtrlCreateMenuItem("Reset IE to Default Settings", $ToolsMenu)
GUICtrlCreateMenuItem("", $ToolsMenu)
$Filters = GUICtrlCreateMenuItem("CD Drive Read/Write FIX", $ToolsMenu)
$SFC = GUICtrlCreateMenuItem("System File FIX", $ToolsMenu)
$USBHijack = GUICtrlCreateMenuItem("Remove USB Hijack Risks", $ToolsMenu)
$HardwareMenu = GUICtrlCreateMenu("Information")
$AboutCPU = GUICtrlCreateMenuItem("Processor", $HardwareMenu)
$AboutRAM = GUICtrlCreateMenuItem("RAM (Memory)", $HardwareMenu)
$AboutHDD = GUICtrlCreateMenuItem("Hard Drive", $HardwareMenu)
$AboutMotherboard = GUICtrlCreateMenuItem("Motherboard", $HardwareMenu)
$AboutGraphics = GUICtrlCreateMenuItem("Graphics Card", $HardwareMenu)
$AboutSoundCard = GUICtrlCreateMenuItem("Sound Card", $HardwareMenu)
$AboutNetwork = GUICtrlCreateMenuItem("Network", $HardwareMenu)
GUICtrlCreateMenuItem("", $HardwareMenu)
$AboutOS = GUICtrlCreateMenuItem("Operating System", $HardwareMenu)
$AboutBios = GUICtrlCreateMenuItem("BIOS", $HardwareMenu)
$AboutSystem = GUICtrlCreateMenuItem("System", $HardwareMenu)
GUICtrlCreateMenuItem("", $HardwareMenu)
$AboutBattery = GUICtrlCreateMenuItem("Battery", $HardwareMenu)
$AboutMonitor = GUICtrlCreateMenuItem("Monitor", $HardwareMenu)
$AboutKeyboard = GUICtrlCreateMenuItem("Keyboard", $HardwareMenu)
$AboutMouse = GUICtrlCreateMenuItem("Mouse", $HardwareMenu)
$AccessMenu = GUICtrlCreateMenu("System")
$TaskMGR = GUICtrlCreateMenuItem("Task Manager", $AccessMenu)
$DeviceManager = GUICtrlCreateMenuItem("Device Manager", $AccessMenu)
$Services = GUICtrlCreateMenuItem("Services", $AccessMenu)
GUICtrlCreateMenuItem("", $AccessMenu)
$SystemProperties = GUICtrlCreateMenuItem("System Properties", $AccessMenu)
$FolderProperties = GUICtrlCreateMenuItem("Folder Properties", $AccessMenu)
GUICtrlCreateMenuItem("", $AccessMenu)
$InternetOptions = GUICtrlCreateMenuItem("IE Internet Options", $AccessMenu)
GUICtrlCreateMenuItem("", $AccessMenu)
$Registry = GUICtrlCreateMenuItem("Open Registry", $AccessMenu)
GUICtrlCreateMenuItem("", $AccessMenu)
$FindProductKeys = GUICtrlCreateMenuItem("Product Keys", $AccessMenu)
$GetMenu = GUICtrlCreateMenu("Downloads")
$Adobe = GUICtrlCreateMenuItem("Adobe Flash/Reader", $GetMenu)
$Java = GUICtrlCreateMenuItem("Java", $GetMenu)
GUICtrlCreateMenuItem("", $GetMenu)
$CCleaner = GUICtrlCreateMenuItem("Piriform Tools", $GetMenu)
$HelpMenu = GUICtrlCreateMenu("About")
$CreditsItem = GUICtrlCreateMenuItem("Credits", $HelpMenu)
$Website = GUICtrlCreateMenuItem("Website", $HelpMenu)
GUICtrlCreateLabel($Buisness & " Info Tool", 0, 420, 350, 15, 0x1000)
$TimeLabel = GUICtrlCreateLabel($Date & "  " & $Time, 250, 420, 150, 15, 0x1001)
GUICtrlCreateTab(0, 0, 400, 419, 0x0148)
$MainTab = GUICtrlCreateTabItem("Main")
GUICtrlCreateLabel("User Name:", 10, 25, 250, 25)
GUICtrlCreateInput(@UserName, 175, 25, 215, 20, 0x0801)
GUICtrlCreateLabel("Computer Name:", 10, 50, -1, -1)
GUICtrlCreateInput(@ComputerName, 175, 50, 215, 20, 0x0801)
GUICtrlCreateLabel("OS Language:", 10, 75, -1, -1)
GUICtrlCreateInput($Language, 175, 75, 215, 20, 0x0801)
GUICtrlCreateLabel("Current OS:", 10, 100, -1, -1)
GUICtrlCreateInput($OSVersion & " " & @OSArch, 175, 100, 215, 20, 0x0801)
GUICtrlCreateLabel("Service Pack:", 10, 125, -1, -1)
GUICtrlCreateInput($OSServicePack, 175, 125, 215, 20, 0x0801)
GUICtrlCreateLabel("Manufacturer:", 10, 150, -1, -1)
GUICtrlCreateInput(StringStripWS($aSystemInfo[1][21], 3), 175, 150, 215, 20, 0x0801)
GUICtrlCreateLabel("Model:", 10, 175, -1, -1)
GUICtrlCreateInput(StringStripWS($aSystemInfo[1][22], 3), 175, 175, 215, 20, 0x0801)
GUICtrlCreateLabel("Serial Number:", 10, 200, -1, -1)
GUICtrlCreateInput(StringStripWS($BIOS[1][16], 3), 175, 200, 215, 20, 0x0801)
GUICtrlCreateLabel("Memory Type:", 10, 225, -1, -1)
GUICtrlCreateInput($MemoryType, 175, 225, 215, 20, 0x0801)
GUICtrlCreateLabel("Total Physical Memory:", 10, 250, -1, -1)
GUICtrlCreateInput(Round($aSystemInfo[1][48] / 1073741824, 2) & " GB", 175, 250, 215, 20, 0x0801)
GUICtrlCreateLabel("CPU Speed:", 10, 275, -1, -1)
GUICtrlCreateInput(StringFormat('%.2f', ($CPUInfo[1] / 1000)) & " GHz", 175, 275, 215, 20, 0x0801)
GUICtrlCreateLabel("Display WxH @ Refresh:", 10, 300, -1, -1)
$DisplaysLabel = GUICtrlCreateInput(@DesktopWidth & " x " & @DesktopHeight & " @ " & @DesktopRefresh & " Hz", 175, 300, 215, 20, 0x0801)
GUICtrlCreateLabel("Display Depth:", 10, 325, -1, -1)
$DisplayDLabel = GUICtrlCreateInput(@DesktopDepth & " Bits", 175, 325, 215, 20, 0x0801)
GUICtrlCreateLabel("OS Install Path:", 10, 350, -1, -1)
$DisplayDLabel = GUICtrlCreateInput(@WindowsDir & "\", 175, 350, 215, 20, 0x0801)
GUICtrlCreateTab(-1, -1, 400, 419)
GUICtrlCreateTabItem("Drives")
For $i = 1 To $aDrive[0]
    If Not $DriveType[$i] = "" Then
        $DriveButton[$i] = GUICtrlCreateButton(StringUpper($aDrive[$i]) & "\", 5, 25 + (($i - 1) * 15), 30, 15)
        $DriveTypeLabel[$i] = GUICtrlCreateLabel($DriveType[$i], 45, 25 + (($i - 1) * 15), 75, 15, 0x1201)
        $DriveFreePos[$i] = GUICtrlCreateProgress(125, 25 + (($i - 1) * 15), 125, 15, 0x01)
        GUICtrlSetData($DriveFreePos[$i], $DriveFree[$i])
        If ($DriveType[$i] = "Fixed" Or $DriveType[$i] = "Removable") And ($DriveFree[$i] > 0) Then GUICtrlCreateLabel(Round((DriveSpaceTotal(StringUpper($aDrive[$i]) & "\") - DriveSpaceFree(StringUpper($aDrive[$i]) & "\")) / 1024, 1) & "/" &  Round((DriveSpaceTotal(StringUpper($aDrive[$i]) & "\") / 1024), 1) & " GB (" & $DriveFree[$i] & "%)", 255, 30 + (($i - 1) * 15))
    EndIf
Next
GUICtrlCreateTab(-1, -1, 400, 419)
GUICtrlCreateTabItem("CPU")
GUICtrlCreateLabel("CPU Arch:", 10, 25, 270, 15)
GUICtrlCreateInput(@CPUArch, 105, 25, 290, 20, 0x0801)
GUICtrlCreateLabel("CPU Name:", 10, 50, -1, -1)
GUICtrlCreateInput(StringStripWS($CPUInfo[2], 7), 105, 50, 290, 20, 0x0801)
GUICtrlCreateLabel("Vendor:", 10, 75, -1, -1)
GUICtrlCreateInput($CPUInfo[4], 105, 75, 290, 20, 0x0801)
GUICtrlCreateLabel("Cores:", 10, 100, -1, -1)
GUICtrlCreateInput($CPUInfo[0], 105, 100, 290, 20, 0x0801)
GUICtrlCreateLabel("Speed:", 10, 125, -1, -1)
GUICtrlCreateInput(StringFormat('%.2f', ($CPUInfo[1] / 1000)) & " GHz", 105, 125, 290, 20, 0x0801)
GUICtrlCreateLabel("Identifier:", 10, 150, -1, -1)
GUICtrlCreateInput($CPUInfo[3], 105, 150, 290, 20, 0x0801)
$hPDHQuery = _PDH_GetNewQueryHandle()
$aCPUCounters = _PDH_GetCPUCounters($hPDHQuery, $sPCName)
$iTotalCPUs = @extended
_PDH_CollectQueryData($hPDHQuery)
Sleep(250)
For $i = 0 To $CPUInfo[0] - 1
    GUICtrlCreateLabel("CPU #" & $i + 1 & ":", 10, $i * 25 + 175, 265, 15)
    $CPU[$i] = GUICtrlCreateProgress(120, $i * 25 + 175, 245, -1, 0x01)
    $CPULabel[$i] = GUICtrlCreateLabel("", 370, $i * 25 + 180, 30, 15)
Next
GUICtrlCreateLabel("CPU Total Usage:", 10, $CPUInfo[0] * 25 + 175, 265, 15)
$AvgCPUBar = GUICtrlCreateProgress(120, $CPUInfo[0] * 25 + 175, 245, -1, 0x01)
$AvgCPUBarLabel = GUICtrlCreateLabel("", 370, $CPUInfo[0] * 25 + 180, 30, 15)
_CPU()
GUICtrlCreateTab(-1, -1, 400, 419)
GUICtrlCreateTabItem("RAM")
GUICtrlCreateLabel("Memory Type:", 10, 25, 270, 15)
GUICtrlCreateInput($MemoryType, 105, 25, 290, 20, 0x0801)
GUICtrlCreateLabel("Total RAM:", 10, 50, 270, 15)
GUICtrlCreateInput(Round($RAMUsage[1] / 1048576, 2) & " GB", 105, 50, 290, 20, 0x0801)
GUICtrlCreateLabel("Total Virtual:", 10, 75, 270, 15)
GUICtrlCreateInput(Round($RAMUsage[3] / 1048576, 2) & " GB", 105, 75, 290, 20, 0x0801)
GUICtrlCreateLabel("RAM Usage:", 10, 100, 270, 15)
$RAM = GUICtrlCreateProgress(120, 100, 245, -1, 0x01)
$RAMLabel = GUICtrlCreateLabel("", 370, 105, 30, 15)
GUICtrlCreateLabel("Avg. RAM Usage:", 10, 125, 270, 15)
$AvgRAMBar = GUICtrlCreateProgress(120, 125, 245, -1, 0x01)
$AvgRAMLabel = GUICtrlCreateLabel("", 370, 130, 30, 15)
GUICtrlCreateTab(-1, -1, 400, 419)
GUICtrlCreateTabItem("Network")
If $CmdLine[0] > 0 Then $ip = $CmdLine[1]
$objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $ip & "\root\cimv2")
GUICtrlCreateLabel("Public IP:", 10, 25, -1, -1)
GUICtrlCreateLabel("Local IP 1:", 10, 50, -1, -1)
GUICtrlCreateLabel("Local IP 2:", 10, 75, -1, -1)
GUICtrlCreateLabel("Local IP 3:", 10, 100, -1, -1)
GUICtrlCreateLabel("Local IP 4:", 10, 125, -1, -1)
GUICtrlCreateLabel("MAC Address:", 10, 150, -1, -1)
GUICtrlCreateLabel("Default Gateway:", 10, 175, -1, -1)
GUICtrlCreateLabel("DNS Domain:", 10, 200, -1, -1)
GUICtrlCreateLabel("Domain:", 10, 225, -1, -1)
GUICtrlCreateLabel("Server:", 10, 250, -1, -1)
GUICtrlCreateLabel("Network Adapter:", 10, 275, -1, -1)
GUICtrlCreateLabel("Network Activity:", 10, 300, -1, -1)
GUICtrlCreateLabel("Network Speed:", 10, 325, -1, -1)
$PublicIP = _GetPublicIP()
If $PublicIP = -1 Then $PublicIP = "Not Connected Online"
GUICtrlCreateInput($PublicIP, 145, 25, 250, 20, 0x0801)
$IP1 = GUICtrlCreateInput(@IPAddress1, 145, 50, 250, 20, 0x0801)
$IP2 = GUICtrlCreateInput(@IPAddress2, 145, 75, 250, 20, 0x0801)
$IP3 = GUICtrlCreateInput(@IPAddress3, 145, 100, 250, 20, 0x0801)
$IP4 = GUICtrlCreateInput(@IPAddress4, 145, 125, 250, 20, 0x0801)
GUICtrlCreateInput($IPDetail[1], 145, 150, 250, 20, 0x0801)
GUICtrlCreateInput($IPDetail[2], 145, 175, 250, 20, 0x0801)
$DNSDomain = GUICtrlCreateInput(@LogonDNSDomain, 145, 200, 250, 20, 0x0801)
$Domain = GUICtrlCreateInput(@LogonDomain, 145, 225, 250, 20, 0x0801)
$Server = GUICtrlCreateInput(@LogonServer, 145, 250, 250, 20, 0x0801)
$Adaptor = GUICtrlCreateInput(GetWMI($ip), 145, 275, 250, 20, 0x0801)
$NetSpeed = GUICtrlCreateInput("DL: 0 kB/sec  UL: 0 kB/sec", 145, 300, 250, 20, 0x0801)
$NetTest = GUICtrlCreateInput("DL: 0 Mbps  UL: 0 Mbps", 145, 325, 200, 20, 0x0801)
$TestNetSpeed = GUICtrlCreateButton("Test", 345, 325, 50, 20)
GUICtrlCreateTab(-1, -1, 400, 419)
GUICtrlCreateTabItem("Etc")
GUICtrlCreateLabel("Run:", 10, 25)
$RUN = GUICtrlCreateInput("", 90, 25, 200, 20, 0x1080)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$Browse = GUICtrlCreateButton("...", 295, 25, 50, 20)
$Submit = GUICtrlCreateButton("Run", 345, 25, 50, 20)
GUICtrlCreateLabel("Edit:", 10, 50)
$Edit = GUICtrlCreateInput("", 90, 50, 200, 20, 0x1080)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$EditBrowse = GUICtrlCreateButton("...", 295, 50, 50, 20)
$EditSubmit = GUICtrlCreateButton("Edit", 345, 50, 50, 20)
GUICtrlCreateLabel("Kill PID:", 10, 75)
$KillPID = GUICtrlCreateInput("", 90, 75, 250, 20, 0x3000)
GUICtrlSetLimit($KillPID, 4)
$ExecKillPID = GUICtrlCreateButton("Kill", 345, 75, 50, 20)
GUICtrlCreateLabel("Kill Task:", 10, 100)
$Kill = GUICtrlCreateInput("", 90, 100, 250, 20, 0x1080)
$ExecKill = GUICtrlCreateButton("Kill", 345, 100, 50, 20)
GUICtrlCreateLabel("Delete File:", 10, 125)
$Delete = GUICtrlCreateInput("", 90, 125, 200, 20, 0x1080)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$DeleteBrowse = GUICtrlCreateButton("...", 295, 125, 50, 20)
$DeleteSubmit = GUICtrlCreateButton("Delete", 345, 125, 50, 20)
$ProcessList = GUICtrlCreateButton("List Processes", 155, 385, 100, 20)
GUICtrlSetState($MainTab, $GUI_FOCUS)
GUICtrlSetState($MainTab, $GUI_DEFBUTTON)
GUICtrlSetState($MainTab, $GUI_ENABLE)
GUICtrlSetState($MainTab, $GUI_SHOW)
$RAMUsage = MemGetStats()
$RAMCollected = $RAMCollected + 1
$RAMTotal = Round($RAMUsage[0] + $RAMTotal)
$AvgRAM = Round($RAMTotal / $RAMCollected)
GUICtrlSetData($AvgRAMBar, $AvgRAM)
GUICtrlSetData($RAM, Round($RAMUsage[0], 0))
GUICtrlSetData($RAMLabel, Round($RAMUsage[0], 0) & "%")
$CPUUsage = Round(StringTrimRight(StringTrimLeft(FileReadLine(@TempDir & "\cpu.csv", -1), 27), 1), 0)
$Collected = $Collected + 1
$CPUTotal = Round($CPUUsage + $CPUTotal)
$AvgCPU = Round($CPUTotal / $Collected)
GUICtrlSetData($CPU, $CPUUsage)
GUICtrlSetData($CPULabel, $CPUUsage & "%")
GUICtrlSetData($AvgCPUBar, $AvgCPU)
GUICtrlCreateTab(-1, -1, 400, 419)
Global $IPHlpApi_Dll = DllOpen('IPHlpApi.dll')
Global $sLast_Label
Global $Global_IF_Count = _GetNumberofInterfaces()
Global $Table_Data = _WinAPI_GetIfTable()
If IsArray($Table_Data) Then
    $hUpdate = DllCallbackRegister('_UpdateStats', 'none', '')
    DllCall('user32.dll', 'int', 'SetTimer', 'hwnd', 0, 'int', 0, 'int', 1000, 'ptr', DllCallbackGetPtr($hUpdate))
    $aStart_Values = _GetAllTraffic()
Else
    GUICtrlSetData($NetSpeed, "Error reading Adapters")
EndIf
GUISetState(@SW_SHOW)
#endregion - Loading GUI with Infomation

#region - Main Loop -
While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case $GUI_EVENT_CLOSE
            _PDH_FreeQueryHandle($hPDHQuery)
            _PDH_UnInit()
            Exit
        Case $DriveButton[1] To UBound($DriveButton)
            MsgBox(0, "", GUICtrlRead($iMsg))
        Case $PixalFinder
            PixelColor()
        Case $CreditsItem
            GUISetState(@SW_HIDE, $MainGUI)
            _Bgbmp ( "bg.bmp", @TempDir & "\", 1 )
            $Credits = '<b><center>About:<br>' & $Buisness & ' Utility<br><br>Creator: rogue5099<br>' & _
                    '<br>Phone: ' & $Phone & '<br><br>' & _
                    '<a href="http://www.google.com/"  target="_blank">Google</a><br><br>' & _
                    '<a href="http://www.autoitscript.com/forum/topic/29404-computer-info-udfs/page__view__findpost__p__209498"  target="_blank">CompInfo UDF: JSThePatriot</a><br>' & _
                    '<a href="http://www.autoitscript.com/forum/topic/103904-info-bar-like-tickertape/page__p__735769#entry735769"  target="_blank">Marquee UDF: Melba23</a><br>' & _
                    '<a href="http://www.autoitscript.com/forum/topic/105319-uploaddownload-meter/page__view__findpost__p__744592"  target="_blank">Network Meter: Beege</a><br>' & _
                    '<a href="http://www.autoitscript.com/forum/topic/148126-get-month-and-day-names-in-national-language-get-lcid-informations/?p=1052001" target="_blank">Language UDF: EXIT</a><br>' & _
                    '<a href="http://www.autoitscript.com/forum/topic/154510-computer-stats/?p=1116005" target="_blank">Language Function: AZJIO</a><br>' & _
                    '<a href="http://www.autoitscript.com/forum/topic/131797-windows-and-office-key/?p=917840" target="_blank">Product Keys: JFX/bcording</a><br>' & _
                    '<a href="http://www.autoitscript.com/forum/topic/90736-performance-counters-in-windows-measure-process-cpu-network-disk-usage/" target="_blank">Processor Usage: Ascend4nt</a><br>' & _
                    'TakeOwn UDF: ApudAngelorum<br>' & _
                    '<a href="http://www.autoitscript.com/"  target="_blank">Other UDFs: AutoIt Team</a></center>'
            $Credit = GUICreate("Credits", 280, 280, -1, -1, BitOR($WS_BORDER, $WS_POPUP))
            GUISetBkColor(0xFFFFFF, $Credit)
            _GUICtrlMarquee_SetScroll(0, Default, "up", 3)
            _GUICtrlMarquee_SetDisplay(0, Default, Default, 14, "times new roman")
            _GUICtrlMarquee_Create($Credits, 0, 16, 280, 264)
            $Close = GUICtrlCreateButton("X", 260, 0, 16, 16)
            GUISetState()

            While 1
                If GUIGetMsg() = $Close Then
                    GUIDelete($Credit)
                    GUISetState(@SW_SHOW, $MainGUI)
                    ExitLoop
                EndIf
            WEnd
            FileDelete(@TempDir & "\bg.bmp")
        Case $Website
            ShellExecute("http://www.autoitscript.com")
        Case $RemoteRepair
            $FileSize = InetGetSize("http://www.teamviewer.com/download/TeamViewerQS_en.exe")
            If $FileSize > 0 Then
                ProgressOn($Buisness, "Downloading: Remote Repair", "0%")
                $hInet = InetGet("http://www.teamviewer.com/download/TeamViewerQS_en.exe", @TempDir & "\TeamViewerQS_en.exe", 1, 1)

                While Not InetGetInfo($hInet, 2)
                    Sleep(500)
                    $BytesReceived = InetGetInfo($hInet, 0)
                    $Pct = Int($BytesReceived / $FileSize * 100)
                    ProgressSet($Pct, $Pct & "%")
                WEnd
                ProgressOff()
                Run(@TempDir & "\TeamViewerQS_en.exe")
                MsgBox(0, "Loading", "Loading Program...", 5)
                If WinWaitActive("TeamViewer", "", 20) = 0 Then
                    MsgBox(16, "Error", "Failed to load program.  Try re-downloading!")
                Else
                    MsgBox(64, $Buisness, 'You must give the "Your ID" and "Password" from this window to a Technician so you can be connected to.' & @CRLF & @CRLF & 'Contact Info: ' & $Phone)
                EndIf
            Else
                MsgBox(16, "Error", "Failed to download!")
            EndIf
        Case $DriveInfoItem
            DriveInfoGUI()
        Case $USBHijack
            For $i = 65 To 90
                $Exists = FileExists(Chr($i) & ":\autorun.inf")
                If $Exists = 1 Then FileSetAttrib(Chr($i) & ":\*Autorun.inf*", "-RASH")
                If $Exists = 1 Then $Del = MsgBox(0x40024, "!", "Delete Virus" & @CRLF & @CRLF & "AR.INF.RISK on " & Chr($i) & ":\ ?")
                If $Exists = 1 And $Del = 6 Then FileDelete(Chr($i) & ":\*Autorun.inf*")
            Next
        Case $RefreshNet
            ShellExecuteWait("ipconfig", "/release")
            ShellExecuteWait("ipconfig", "/flushdns")
            ShellExecute("ipconfig", "/renew")
        Case $SFC
            Send("#r")
            WinWaitActive("Run")
            Send("sfc /scannow{Enter}")
        Case $RecycleItem
            Recycle()
        Case $AboutCPU To $AboutMouse
            HardwareGUI(GUICtrlRead($iMsg, 1))
        Case $SystemProperties
            ShellExecute("sysdm.cpl")
        Case $InternetOptions
            ShellExecute("inetcpl.cpl")
        Case $Registry
            ShellExecute("regedit.exe")
        Case $TaskMGR
            ShellExecute("taskmgr.exe")
        Case $DeviceManager
            ShellExecute("devmgmt.msc")
        Case $Services
            ShellExecute("services.msc")
        Case $FolderProperties
            Send("#r")
            WinWaitActive("Run")
            Send("control folders{Enter}")
        Case $FindProductKeys
            MsgBox(0, "Product Keys", "- - - - - - - - - - - - -  W   I   N   D   O   W   S  - - - - - - - - - - - - -" & @CRLF & _
                    "Windows Key : " & @TAB & _DecodeProductKey("Windows") & @CRLF & _
                    "Windows Key 4 : " & @TAB & _DecodeProductKey("Windows_DPid4") & @CRLF & _
                    "Windows Default : " & @TAB & _DecodeProductKey("Windows_Def") & @CRLF & _
                    "Windows Default 4 : " & @TAB & _DecodeProductKey("Windows_Def_DPid4") & @CRLF & @CRLF & _
                    "- - - - - - - - - - - - - - -  O   F   F   I   C   E  - - - - - - - - - - - - - - -" & @CRLF & _
            "Office XP Key : " & @TAB & _DecodeProductKey("Office XP") & @CRLF & _
                    "Office 2003 Key : " & @TAB & _DecodeProductKey("Office 2003") & @CRLF & _
                    "Office 2007 Key : " & @TAB & _DecodeProductKey("Office 2007") & @CRLF & _
                    "Office 2010 x86 Key: " & @TAB & _DecodeProductKey("Office 2010 x86") & @CRLF & _
                    "Office 2010 x64 Key: " & @TAB & _DecodeProductKey("Office 2010 x64") & @CRLF & _
                    "Office 2013 x86 Key: " & @TAB & _DecodeProductKey("Office 2013 x86") & @CRLF & _
                    "Office 2013 x64 Key: " & @TAB & _DecodeProductKey("Office 2013 x64"))
        Case $Filters
            If MsgBox(4, "Upper/Lower Filter Fix", "This will remove Registry Entries!" & @CRLF & @CRLF & "Continue?") = 6 Then
                If RegDelete("HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}", "UpperFilters") = 2 Then MsgBox(48, "Error", "Error Deleting Upper Filter!")
                If RegDelete("HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}", "LowerFilters") = 2 Then MsgBox(48, "Error", "Error Deleting Lower Filter!")
                If MsgBox(4, "Upper/Lower Filter Fix", "Computer must be restarted to finish fix." & @CRLF & "Make sure to save any documents!" & @CRLF & @CRLF & "Restart now?") = 6 Then Shutdown(6)
            EndIf
        Case $Adobe
            ShellExecute("http://www.adobe.com/downloads/")
        Case $Java
            ShellExecute("http://www.java.com/en/download/index.jsp")
        Case $CCleaner
            ShellExecute("http://www.piriform.com/products")
        Case $TestNetSpeed
            $oIE = _IECreate("http://www.scanmyspeed.com/", 0, 0, 1)
            $oBegin = _IEGetObjById($oIE, "scanstart")
            _IEAction($oBegin, "click")
            $CountDown = 30
            $hSplash=SplashTextOn("Splash", "Testing Please wait..." & @CRLF & $CountDown, 400, 115, -1, -1, 35, -1, 14, 600)
            Do
                $CountDown -= 1
                $oDown = _IEGetObjById($oIE, "scandmbit")
                $sDown = _IEPropertyGet($oDown, "innerText")
                $oUp = _IEGetObjById($oIE, "scanumbit")
                $sUp = _IEPropertyGet($oUp, "innerText")
                GUICtrlSetData($NetTest, "DL: " & $sDown & " Mbps  UL: " & $sUp & " Mbps")
                ControlSetText($hSplash,"","[CLASS:Static; INSTANCE:1]", "Testing Please wait..." & @CRLF & $CountDown)
                Sleep(1000)
            Until $CountDown = 0
            SplashOff()
            $oDown = _IEGetObjById($oIE, "scandmbit")
            $sDown = _IEPropertyGet($oDown, "innerText")
            $oUp = _IEGetObjById($oIE, "scanumbit")
            $sUp = _IEPropertyGet($oUp, "innerText")
            GUICtrlSetData($NetTest, "DL: " & $sDown & " Mbps  UL: " & $sUp & " Mbps")
            _IEQuit($oIE)
        Case $ExecKill
            ProcessClose(GUICtrlRead($Kill))
            GUICtrlSetData($Kill, "Atempting to Kill " & GUICtrlRead($Kill) & "...")
            Sleep(250)
            GUICtrlSetData($Kill, "")
        Case $ExecKillPID
            ProcessClose(GUICtrlRead($KillPID))
            GUICtrlSetData($KillPID, "Atempting to Kill " & GUICtrlRead($KillPID) & "...")
            Sleep(250)
            GUICtrlSetData($KillPID, "")
        Case $ProcessList
            $PList = ProcessList()
            _ArrayDisplay($PList, "Running Processes", -1, 0, "", "|", "#|Process|ID")
        Case $Submit
            ShellExecute(_WinAPI_ExpandEnvironmentStrings(GUICtrlRead($RUN)), "", "", "open")
            GUICtrlSetData($RUN, "Starting " & GUICtrlRead($RUN) & "...")
            Sleep(250)
            GUICtrlSetData($RUN, "")
        Case $EditSubmit
            ShellExecute(_WinAPI_ExpandEnvironmentStrings(GUICtrlRead($Edit)), "", "", "edit")
            GUICtrlSetData($Edit, "")
        Case $Browse
            $BrowseFile = FileOpenDialog("Choose Program to Run", @ScriptDir, "Program (*.exe;*.bat;*.com;*.pif)", 1)
            If Not @error Then Run($BrowseFile)
        Case $EditBrowse
            $EditFile = FileOpenDialog("Choose File to Edit", @ScriptDir, "All Files (*.*)|Autoit Script (*.au3)|Batch File (*.bat)|Settings File (*.ini;*inf;*reg)|Text File (*.txt;*rtf;*.log)|Web Page (*.html;*.htm;*.php)|Word File (*.doc)", 1)
            If Not @error Then ShellExecute($EditFile, "", "", "edit")
        Case $DeleteBrowse
            $DeleteFile = FileOpenDialog("Choose File to Edit", @ScriptDir, "All Files (*.*)|Autoit Script (*.au3)|Batch File (*.bat)|Settings File (*.ini;*inf;*reg)|Text File (*.txt;*rtf;*.log)|Web Page (*.html;*.htm;*.php)|Word File (*.doc)", 1)
            If Not @error Then GUICtrlSetData($Delete, $DeleteFile)
        Case $DeleteSubmit
            $File = GUICtrlRead($Delete)
            If FileExists($File) Then
                If StringRight($File, 4) = ".exe" Then
                    $nCount = StringInStr($File, "\", 0, -1)
                    $sFile = StringTrimLeft($File, $nCount)
                    Do
                        ProcessClose($sFile)
                    Until Not ProcessExists($sFile)
                EndIf
                If Not AdjustPrivilege(8) Then MsgBox(0, "", "Error!")
                If Not AdjustPrivilege(9) Then MsgBox(0, "", "Error!")
                If Not AdjustPrivilege(20) Then MsgBox(0, "", "Error!")
                $hADVAPI32 = DllOpen("advapi32.dll")
                $hKERNEL32 = DllOpen("kernel32.dll")
                TakeOwn($File, 1)
                FileDelete($File)
                DllClose($hADVAPI32)
                DllClose($hKERNEL32)
                If FileExists($File) Then MsgBox(48, "Error", "Could not delete file!")
            Else
                MsgBox(48, "Error", "Could not find file/folder!")
            EndIf
            GUICtrlSetData($Delete, "")
        Case $ResetIE
            Run("rundll32.exe inetcpl.cpl ResetIEtoDefaults")
            WinWait("Reset Internet Explorer Settings")
            ControlClick("Reset Internet Explorer Settings", "", 1, "left", 1, 51, 12)
            WinWait("Reset Internet Explorer Settings", "&Close")
            Sleep(1000)
            While WinExists("Reset Internet Explorer Settings", "&Close")
                ControlClick("Reset Internet Explorer Settings", "", 6608, "left", 1, 36, 11)
            WEnd
            ShellExecute("iexplore.exe")

        Case $ClearIEHistory
            RunWait("RunDll32.exe inetcpl.cpl,ClearMyTracksByProcess 3")
    EndSwitch
    If TimerDiff($RefreshTimerA) >= 1000 Then
        $RefreshTimerA = TimerInit()
        DateTime()
        $RAMUsage = MemGetStats()
        $RAMCollected = $RAMCollected + 1
        $RAMTotal = Round($RAMUsage[0] + $RAMTotal)
        $AvgRAM = Round($RAMTotal / $RAMCollected)
        GUICtrlSetData($AvgRAMBar, $AvgRAM)
        GUICtrlSetData($RAM, Round($RAMUsage[0], 0))
        GUICtrlSetData($RAMLabel, Round($RAMUsage[0], 0) & "%")
        GUICtrlSetData($AvgRAMLabel, Round($AvgRAM, 0) & "%")
        _CPU()
        GUICtrlSetData($TimeLabel, $Date & "  " & $Time)
    EndIf
WEnd
#endregion - Main Loop -
#region - Language -
Func _GLI()
    Local $LCID = 0
    $sText = __GLI_Get($LCID, 92)
    If $sText = "" Then $sText = __GLI_Get($LCID, 89) & "-" & __GLI_Get($LCID, 90)
    $sText &= '  |  ' & __GLI_Get($LCID, 2)
    Return $sText
EndFunc   ;==>_GLI by AZJIO

Func __GLI_Get($iLCID_Dec, $iIndex)
    Local $aTemp = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', $iLCID_Dec, 'dword', $iIndex, 'wstr', '', 'int', 2048)
    Return $aTemp[3]
EndFunc   ;==>__GLI_Get by EXIT
#endregion - Language -
#region - Drive Info -
Func DriveInfo()
     For $i = 1 To $aDrive[0]
        $DriveType[$i] = DriveGetType(StringUpper($aDrive[$i]) & "\")
        $DriveFree[$i] = Round((DriveSpaceTotal(StringUpper($aDrive[$i]) & "\") - DriveSpaceFree(StringUpper($aDrive[$i]) & "\")) / DriveSpaceTotal(StringUpper($aDrive[$i]) & "\") * 100, 0)
        GUICtrlSetData($DriveFreePos[$i], $DriveFree[$i])
        GUICtrlSetData($DriveTypeLabel[$i], $DriveType[$i])
    Next
EndFunc   ;==>DriveInfo

Func DriveInfoGUI()
    Opt("GUIOnEventMode", 1)
    GUISetState(@SW_HIDE, $MainGUI)
    $DriveInfoGUI = GUICreate("Drive Info", 300, 275, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseDriveGUI")
    GUICtrlCreateLabel("Select a Drive's Drive Letter for Its Info:", 10, 10, 200, 20)
    $DriveLetter = GUICtrlCreateCombo("", 220, 10, 70, 20, 0x0003)
    GUICtrlSetOnEvent(-1, "DriveInfoLoad")
    For $i = 1 To $aDrive[0]
        GUICtrlSetData($DriveLetter, StringUpper($aDrive[$i]) & "\")
    Next
    GUICtrlCreateLabel("Label:", 10, 40, 80, 20)
    $DriveLabel = GUICtrlCreateLabel("", 100, 40, 100, 20, 0x1C01)
    GUICtrlCreateLabel("Status:", 10, 70, 80, 20)
    $DriveStatus = GUICtrlCreateLabel("", 100, 70, 100, 20, 0x1C01)
    GUICtrlCreateLabel("File System:", 10, 100, 80, 20)
    $DriveFileSystem = GUICtrlCreateLabel("", 100, 100, 100, 20, 0x1C01)
    GUICtrlCreateLabel("Type:", 10, 130, 80, 20)
    $DriveInfoType = GUICtrlCreateLabel("", 100, 130, 100, 20, 0x1C01)
    GUICtrlCreateLabel("Size:", 10, 160, 80, 20)
    $DriveSize = GUICtrlCreateLabel("", 100, 160, 100, 20, 0x1C01)
    GUICtrlCreateLabel("Serial Number:", 10, 190, 80, 20)
    $DriveSerial = GUICtrlCreateInput("", 100, 190, 100, 20, 0x0801)
    GUICtrlCreateLabel("Temperature:", 10, 220, 80, 20)
    $DriveTemp = GUICtrlCreateLabel("", 100, 220, 100, 20, 0x1C01)
    $DriveProgress = GUICtrlCreateProgress(10, 250, 280, 20)
    GUISetState(@SW_SHOW)
    While WinExists($DriveInfoGUI)
        Sleep(10)
    WEnd
EndFunc   ;==>DriveInfoGUI

Func DriveInfoLoad()
    $DriveInfoLoad = GUICtrlRead($DriveLetter)
    GUICtrlSetData($DriveProgress, Round((DriveSpaceTotal($DriveInfoLoad) - DriveSpaceFree($DriveInfoLoad)) / DriveSpaceTotal($DriveInfoLoad) * 100, 0))
    GUICtrlSetData($DriveLabel, DriveGetLabel($DriveInfoLoad))
    If DriveGetLabel($DriveInfoLoad) = "" Then GUICtrlSetData($DriveLabel, "No Label Set")
    GUICtrlSetData($DriveInfoType, DriveGetType($DriveInfoLoad) & " Device")
    GUICtrlSetData($DriveFileSystem, DriveGetFileSystem($DriveInfoLoad))
    GUICtrlSetData($DriveStatus, DriveStatus($DriveInfoLoad))
    $HDDSize = Round(DriveSpaceTotal($DriveInfoLoad), 0)
    If $HDDSize < 1024 Then
        GUICtrlSetData($DriveSize, "< 1 GB")
    Else
        GUICtrlSetData($DriveSize, Round($HDDSize / 1024) & " GB")
    EndIf
    GUICtrlSetData($DriveSerial, DriveGetSerial($DriveInfoLoad))
    If GUICtrlRead($DriveInfoType) = "Fixed Device" Then
        $tmp = _WMI_DriveTemperature()
        GUICtrlSetData($DriveTemp, $tmp & ' °C')
        If $tmp >= 40 Then GUICtrlSetBkColor($DriveTemp, 0xff0000)
        If $tmp < 40 Then GUICtrlSetBkColor($DriveTemp, 0x00ff00)
    Else
        GUICtrlSetData($DriveTemp, 'N/A')
        GUICtrlSetBkColor($DriveTemp, 0xf0f0f0)
    EndIf
    If DriveStatus($DriveInfoLoad) = "INVALID" Or $DriveInfoLoad = "" Then
        GUICtrlSetData($DriveLabel, "N/A")
        GUICtrlSetData($DriveInfoType, "N/A")
        GUICtrlSetData($DriveFileSystem, "N/A")
        GUICtrlSetData($DriveSize, "N/A")
        GUICtrlSetData($DriveSerial, "N/A")
        GUICtrlSetData($DriveProgress, 0)
    EndIf
EndFunc   ;==>DriveInfoLoad

Func CloseDriveGUI()
    GUIDelete($DriveInfo)
    GUISetState(@SW_SHOW, $MainGUI)
    Opt("GUIOnEventMode", 0)
EndFunc   ;==>CloseDriveGUI
#endregion - Drive Info -
#region - IP -
Func _IPDetails()
    Local $oWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & "." & "\root\cimv2")
    Local $oColItems = $oWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True", "WQL", 0x30), $aReturn[5] = [4]
    If IsObj($oColItems) Then
        For $oObjectItem In $oColItems
            If $oObjectItem.IPAddress(0) == @IPAddress1 Then
                $aReturn[1] = $oObjectItem.MACAddress
                $aReturn[2] = $oObjectItem.DefaultIPGateway(0)
            EndIf
        Next
        Return $aReturn
    EndIf
    Return SetError(1, 0, $aReturn)
EndFunc   ;==>_IPDetails

Func _GetPublicIP()
    Local $aReturn, $bRead, $sRead
    $bRead = InetRead("http://checkip.dyndns.org/")
    $sRead = BinaryToString($bRead)
    $aReturn = StringRegExp($sRead, '(?s)(?i)<body>Current IP Address: (.*?)</body>', 3)
    If @error = 0 Then
        Return $aReturn[0]
    EndIf

    $bRead = InetRead("http://automation.whatismyip.com/n09230945.asp") ; http://forum.whatismyip.com/f14/our-automation-rules-t241/
    $sRead = BinaryToString($bRead)
    If @error Then
        Return SetError(1, 0, -1)
    EndIf
    Return $sRead
EndFunc   ;==>_GetPublicIP
#endregion - IP -
#region - Computer Get -
Func HardwareGUI($Equip)
    Dim $Battery, $BIOS, $Keyboard, $HDDInfo, $Memory, $Monitor, $Motherboard, $Mouse, $NetworkCards, $SoundCards, $Processors, $System, $VideoCards, $OSs
    GUISetState(@SW_HIDE, $MainGUI)
    $HardwareGUI = GUICreate($Equip & " Info", 300, 295, -1, -1, BitOR($WS_BORDER, $WS_POPUP), $WS_EX_TOPMOST)
    $Close = GUICtrlCreateButton("X", 280, 0, 20, 20)
    GUICtrlSetFont(-1, 12, 800)
    $HardwareLabel = GUICtrlCreateLabel($Equip & " Info", 0, 0, 280, 20, 0x01)
    GUICtrlSetFont(-1, 12, 600)
    $AboutEditbox = GUICtrlCreateEdit("", 0, 20, 300, 255, BitOR($ES_WANTRETURN, $WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY))
    GUISetState(@SW_SHOW)
    GUICtrlSetState($AboutEditbox, @SW_DISABLE)

    Switch $Equip
        Case "Battery"
            _ComputerGetBattery($Battery)
            For $i = 1 To $Battery[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $Battery[$i][0] & @CRLF & _
                        "Availability: " & $Battery[$i][1] & @CRLF & _
                        "BatteryRechargeTime: " & $Battery[$i][2] & @CRLF & _
                        "BatteryStatus: " & $Battery[$i][3] & @CRLF & _
                        "Description: " & $Battery[$i][4] & @CRLF & _
                        "Chemistry: " & $Battery[$i][5] & @CRLF & _
                        "ConfigManagerErrorCode: " & $Battery[$i][6] & @CRLF & _
                        "ConfigManagerUserConfig: " & $Battery[$i][7] & @CRLF & _
                        "CreationClassName: " & $Battery[$i][8] & @CRLF & _
                        "DesignCapacity: " & $Battery[$i][9] & @CRLF & _
                        "DesignVoltage: " & $Battery[$i][10] & @CRLF & _
                        "DeviceID: " & $Battery[$i][11] & @CRLF & _
                        "ErrorCleared: " & $Battery[$i][12] & @CRLF & _
                        "ErrorDescription: " & $Battery[$i][13] & @CRLF & _
                        "EstimatedChargeRemaining: " & $Battery[$i][14] & @CRLF & _
                        "EstimatedRunTime: " & $Battery[$i][15] & @CRLF & _
                        "ExpectedBatteryLife: " & $Battery[$i][16] & @CRLF & _
                        "ExpectedLife: " & $Battery[$i][17] & @CRLF & _
                        "FullChargeCapacity: " & $Battery[$i][18] & @CRLF & _
                        "LastErrorCode: " & $Battery[$i][19] & @CRLF & _
                        "MaxRechargeTime: " & $Battery[$i][20] & @CRLF & _
                        "PNPDeviceID: " & $Battery[$i][21] & @CRLF & _
                        "PowerManagementCapabilities: " & $Battery[$i][22] & @CRLF & _
                        "PowerManagementSupported: " & $Battery[$i][23] & @CRLF & _
                        "SmartBatteryVersion: " & $Battery[$i][24] & @CRLF & _
                        "Status: " & $Battery[$i][25] & @CRLF & _
                        "StatusInfo: " & $Battery[$i][26] & @CRLF & _
                        "SystemCreationClassName: " & $Battery[$i][27] & @CRLF & _
                        "SystemName: " & $Battery[$i][28] & @CRLF & _
                        "TimeOnBattery: " & $Battery[$i][29] & @CRLF & _
                        "TimeToFullCharge: " & $Battery[$i][30] & @CRLF & @CRLF, 1)
            Next
        Case "BIOS"
            _ComputerGetBIOS($BIOS)
            For $i = 1 To $BIOS[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $BIOS[$i][0] & @CRLF & _
                        "Status: " & $BIOS[$i][1] & @CRLF & _
                        "BIOS Characteristics: " & $BIOS[$i][2] & @CRLF & _
                        "BIOS Version: " & $BIOS[$i][3] & @CRLF & _
                        "Description: " & $BIOS[$i][4] & @CRLF & _
                        "Build Number: " & $BIOS[$i][5] & @CRLF & _
                        "Code Set: " & $BIOS[$i][6] & @CRLF & _
                        "Current Language: " & $BIOS[$i][7] & @CRLF & _
                        "Identification Code: " & $BIOS[$i][8] & @CRLF & _
                        "Installable Languages: " & $BIOS[$i][9] & @CRLF & _
                        "Language Edition: " & $BIOS[$i][10] & @CRLF & _
                        "List of Languages: " & $BIOS[$i][11] & @CRLF & _
                        "Manufacturer: " & $BIOS[$i][12] & @CRLF & _
                        "Other Target OS: " & $BIOS[$i][13] & @CRLF & _
                        "Primary BIOS: " & $BIOS[$i][14] & @CRLF & _
                        "Release Date: " & $BIOS[$i][15] & @CRLF & _
                        "Serial Number: " & $BIOS[$i][16] & @CRLF & _
                        "SM BIOS BIOS Version: " & $BIOS[$i][17] & @CRLF & _
                        "SM BIOS Major Version: " & $BIOS[$i][18] & @CRLF & _
                        "SM BIOS Minor Version: " & $BIOS[$i][19] & @CRLF & _
                        "SM BIOS Present: " & $BIOS[$i][20] & @CRLF & _
                        "Software Element ID: " & $BIOS[$i][21] & @CRLF & _
                        "Software Element State: " & $BIOS[$i][22] & @CRLF & _
                        "Target Operating System: " & $BIOS[$i][23] & @CRLF & _
                        "Version: " & $BIOS[$i][24] & @CRLF & @CRLF, 1)
            Next
        Case "Hard Drive"
            _ComputerGetHDD($HDDInfo)
            For $i = 1 To $HDDInfo[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $HDDInfo[$i][0] & @CRLF & _
                        "Availability: " & $HDDInfo[$i][1] & @CRLF & _
                        "BytesPerSector: " & $HDDInfo[$i][2] & @CRLF & _
                        "Capabilities: " & $HDDInfo[$i][3] & @CRLF & _
                        "CapabilityDescriptions: " & $HDDInfo[$i][4] & @CRLF & _
                        "Caption: " & $HDDInfo[$i][5] & @CRLF & _
                        "CompressionMethod: " & $HDDInfo[$i][6] & @CRLF & _
                        "ConfigManagerErrorCode: " & $HDDInfo[$i][7] & @CRLF & _
                        "ConfigManagerUserConfig: " & $HDDInfo[$i][8] & @CRLF & _
                        "CreationClassName: " & $HDDInfo[$i][9] & @CRLF & _
                        "DefaultBlockSize: " & $HDDInfo[$i][10] & @CRLF & _
                        "Description: " & $HDDInfo[$i][11] & @CRLF & _
                        "DeviceID: " & $HDDInfo[$i][12] & @CRLF & _
                        "ErrorCleared: " & $HDDInfo[$i][13] & @CRLF & _
                        "ErrorDescription: " & $HDDInfo[$i][14] & @CRLF & _
                        "ErrorMethodology: " & $HDDInfo[$i][15] & @CRLF & _
                        "FirmwareRevision: " & $HDDInfo[$i][16] & @CRLF & _
                        "Index: " & $HDDInfo[$i][17] & @CRLF & _
                        "InstallDate: " & $HDDInfo[$i][18] & @CRLF & _
                        "InterfaceType: " & $HDDInfo[$i][19] & @CRLF & _
                        "LastErrorCode: " & $HDDInfo[$i][20] & @CRLF & _
                        "Manufacturer: " & $HDDInfo[$i][21] & @CRLF & _
                        "MaxBlockSize: " & $HDDInfo[$i][22] & @CRLF & _
                        "MaxMediaSize: " & $HDDInfo[$i][23] & @CRLF & _
                        "MediaLoaded: " & $HDDInfo[$i][24] & @CRLF & _
                        "MediaType: " & $HDDInfo[$i][25] & @CRLF & _
                        "MinBlockSize: " & $HDDInfo[$i][26] & @CRLF & _
                        "Model: " & $HDDInfo[$i][27] & @CRLF & _
                        "NeedsCleaning: " & $HDDInfo[$i][28] & @CRLF & _
                        "NumberOfMediaSupported: " & $HDDInfo[$i][29] & @CRLF & _
                        "Partitions: " & $HDDInfo[$i][30] & @CRLF & _
                        "PNPDeviceID: " & $HDDInfo[$i][31] & @CRLF & _
                        "PowerManagementCapabilities: " & $HDDInfo[$i][32] & @CRLF & _
                        "PowerManagementSupported: " & $HDDInfo[$i][33] & @CRLF & _
                        "SCSIBus: " & $HDDInfo[$i][34] & @CRLF & _
                        "SCSILogicalUnit: " & $HDDInfo[$i][35] & @CRLF & _
                        "SCSIPort: " & $HDDInfo[$i][36] & @CRLF & _
                        "SCSITargetId: " & $HDDInfo[$i][37] & @CRLF & _
                        "SectorsPerTrack: " & $HDDInfo[$i][38] & @CRLF & _
                        "SerialNumber: " & $HDDInfo[$i][39] & @CRLF & _
                        "Signature: " & $HDDInfo[$i][40] & @CRLF & _
                        "Size: " & $HDDInfo[$i][41] & @CRLF & _
                        "Status: " & $HDDInfo[$i][42] & @CRLF & _
                        "StatusInfo: " & $HDDInfo[$i][43] & @CRLF & _
                        "SystemCreationClassName: " & $HDDInfo[$i][44] & @CRLF & _
                        "SystemName: " & $HDDInfo[$i][45] & @CRLF & _
                        "TotalCylinders: " & $HDDInfo[$i][46] & @CRLF & _
                        "TotalHeads: " & $HDDInfo[$i][47] & @CRLF & _
                        "TotalSectors: " & $HDDInfo[$i][48] & @CRLF & _
                        "TotalTracks: " & $HDDInfo[$i][49] & @CRLF & _
                        "TracksPerCylinder: " & $HDDInfo[$i][50] & @CRLF & @CRLF, 1)
            Next
        Case "Keyboard"
            _ComputerGetKeyboard($Keyboard)
            For $i = 1 To $Keyboard[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $Keyboard[$i][0] & @CRLF & _
                        "Availability: " & $Keyboard[$i][1] & @CRLF & _
                        "Config Manager Error Code: " & $Keyboard[$i][2] & @CRLF & _
                        "Config Manager User Config: " & $Keyboard[$i][3] & @CRLF & _
                        "Description: " & $Keyboard[$i][4] & @CRLF & _
                        "Creation Class Name: " & $Keyboard[$i][5] & @CRLF & _
                        "Device ID: " & $Keyboard[$i][6] & @CRLF & _
                        "Error Cleared: " & $Keyboard[$i][7] & @CRLF & _
                        "Error Description: " & $Keyboard[$i][8] & @CRLF & _
                        "Is Locked: " & $Keyboard[$i][9] & @CRLF & _
                        "Last Error Code: " & $Keyboard[$i][10] & @CRLF & _
                        "Layout: " & $Keyboard[$i][11] & @CRLF & _
                        "Number of Function Keys: " & $Keyboard[$i][12] & @CRLF & _
                        "Password: " & $Keyboard[$i][13] & @CRLF & _
                        "PNP Device ID: " & $Keyboard[$i][14] & @CRLF & _
                        "Power Management Capabilities: " & $Keyboard[$i][15] & @CRLF & _
                        "Power Management Supported: " & $Keyboard[$i][16] & @CRLF & _
                        "Status: " & $Keyboard[$i][17] & @CRLF & _
                        "Status Info: " & $Keyboard[$i][18] & @CRLF & _
                        "System Creation Class Name: " & $Keyboard[$i][19] & @CRLF & _
                        "System Name: " & $Keyboard[$i][20] & @CRLF & @CRLF, 1)
            Next
;~      Case "RAM (Memory)"
;~          _ComputerGetMemory($Memory)
;~          For $i = 1 To $Memory[0][0] Step 1
;~              GUICtrlSetData($AboutEditbox, "Name: " & $Memory[$i][0] & @CRLF & _
;~                      "BankLabel: " & $Memory[$i][1] & @CRLF & _
;~                      "Capacity: " & $Memory[$i][2] & @CRLF & _
;~                      "CreationClassName: " & $Memory[$i][3] & @CRLF & _
;~                      "Description: " & $Memory[$i][4] & @CRLF & _
;~                      "DataWidth: " & $Memory[$i][5] & @CRLF & _
;~                      "DeviceLocator: " & $Memory[$i][6] & @CRLF & _
;~                      "FormFactor: " & $Memory[$i][7] & @CRLF & _
;~                      "HotSwappable: " & $Memory[$i][8] & @CRLF & _
;~                      "InterleaveDataDepth: " & $Memory[$i][9] & @CRLF & _
;~                      "InterleavePosition: " & $Memory[$i][10] & @CRLF & _
;~                      "Manufacturer: " & $Memory[$i][11] & @CRLF & _
;~                      "MemoryType: " & $Memory[$i][12] & @CRLF & _
;~                      "Model: " & $Memory[$i][13] & @CRLF & _
;~                      "OtherIdentifyingInfo: " & $Memory[$i][14] & @CRLF & _
;~                      "PartNumber: " & $Memory[$i][15] & @CRLF & _
;~                      "PositionInRow: " & $Memory[$i][16] & @CRLF & _
;~                      "PoweredOn: " & $Memory[$i][17] & @CRLF & _
;~                      "Removable: " & $Memory[$i][18] & @CRLF & _
;~                      "Replaceable: " & $Memory[$i][19] & @CRLF & _
;~                      "SerialNumber: " & $Memory[$i][20] & @CRLF & _
;~                      "SKU: " & $Memory[$i][21] & @CRLF & _
;~                      "Speed: " & $Memory[$i][22] & @CRLF & _
;~                      "Status: " & $Memory[$i][23] & @CRLF & _
;~                      "Tag: " & $Memory[$i][24] & @CRLF & _
;~                      "TotalWidth: " & $Memory[$i][25] & @CRLF & _
;~                      "TypeDetail: " & $Memory[$i][26] & @CRLF & _
;~                      "Version: " & $Memory[$i][27] & @CRLF & @CRLF, 1)
        Case "RAM (Memory)"
            _ComputerGetMemory($Memory)
            For $i = 1 To $Memory[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Caption: " & $Memory[$i][0] & @CRLF & _
                        "CreationClassName: " & $Memory[$i][1] & @CRLF & _
                        "Depth: " & $Memory[$i][2] & @CRLF & _
                        "Description: " & $Memory[$i][3] & @CRLF & _
                        "Height: " & $Memory[$i][4] & @CRLF & _
                        "HotSwappable: " & $Memory[$i][5] & @CRLF & _
                        "InstallDate: " & $Memory[$i][6] & @CRLF & _
                        "Location: " & $Memory[$i][7] & @CRLF & _
                        "Manufacturer: " & $Memory[$i][8] & @CRLF & _
                        "MaxCapacity: " & $Memory[$i][9] & @CRLF & _
                        "MemoryDevices: " & $Memory[$i][10] & @CRLF & _
                        "MemoryErrorCorrection: " & $Memory[$i][11] & @CRLF & _
                        "Model: " & $Memory[$i][12] & @CRLF & _
                        "Name: " & $Memory[$i][13] & @CRLF & _
                        "OtherIdentifyingInfo: " & $Memory[$i][14] & @CRLF & _
                        "PartNumber: " & $Memory[$i][15] & @CRLF & _
                        "PoweredOn: " & $Memory[$i][16] & @CRLF & _
                        "Removable: " & $Memory[$i][17] & @CRLF & _
                        "Replaceable: " & $Memory[$i][18] & @CRLF & _
                        "SerialNumber: " & $Memory[$i][19] & @CRLF & _
                        "SKU: " & $Memory[$i][20] & @CRLF & _
                        "Status: " & $Memory[$i][21] & @CRLF & _
                        "Tag: " & $Memory[$i][22] & @CRLF & _
                        "Use: " & $Memory[$i][23] & @CRLF & _
                        "Version: " & $Memory[$i][24] & @CRLF & _
                        "Weight: " & $Memory[$i][25] & @CRLF & _
                        "Width: " & $Memory[$i][26] & @CRLF & @CRLF, 1)
            Next
        Case "Monitor"
            _ComputerGetMonitors($Monitor)
            For $i = 1 To $Monitor[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $Monitor[$i][0] & @CRLF & _
                        "Availability: " & $Monitor[$i][1] & @CRLF & _
                        "Bandwidth: " & $Monitor[$i][2] & @CRLF & _
                        "ConfigManagerErrorCode: " & $Monitor[$i][3] & @CRLF & _
                        "Description: " & $Monitor[$i][4] & @CRLF & _
                        "ConfigManagerUserConfig: " & $Monitor[$i][5] & @CRLF & _
                        "CreationClassName: " & $Monitor[$i][6] & @CRLF & _
                        "DeviceID: " & $Monitor[$i][7] & @CRLF & _
                        "DisplayType: " & $Monitor[$i][8] & @CRLF & _
                        "ErrorCleared: " & $Monitor[$i][9] & @CRLF & _
                        "ErrorDescription: " & $Monitor[$i][10] & @CRLF & _
                        "IsLocked: " & $Monitor[$i][11] & @CRLF & _
                        "LastErrorCode: " & $Monitor[$i][12] & @CRLF & _
                        "MonitorManufacturer: " & $Monitor[$i][13] & @CRLF & _
                        "MonitorType: " & $Monitor[$i][14] & @CRLF & _
                        "PixelsPerXLogicalInch: " & $Monitor[$i][15] & @CRLF & _
                        "PixelsPerYLogicalInch: " & $Monitor[$i][16] & @CRLF & _
                        "PNPDeviceID: " & $Monitor[$i][17] & @CRLF & _
                        "PowerManagementCapabilities: " & $Monitor[$i][18] & @CRLF & _
                        "PowerManagementSupported: " & $Monitor[$i][19] & @CRLF & _
                        "ScreenHeight: " & $Monitor[$i][20] & @CRLF & _
                        "ScreenWidth: " & $Monitor[$i][21] & @CRLF & _
                        "Status: " & $Monitor[$i][22] & @CRLF & _
                        "StatusInfo: " & $Monitor[$i][23] & @CRLF & _
                        "SystemCreationClassName: " & $Monitor[$i][24] & @CRLF & _
                        "SystemName: " & $Monitor[$i][25] & @CRLF & @CRLF, 1)
            Next
        Case "Motherboard"
            _ComputerGetMotherboard($Motherboard)
            For $i = 1 To $Motherboard[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $Motherboard[$i][0] & @CRLF & _
                        "Availability: " & $Motherboard[$i][1] & @CRLF & _
                        "ConfigManagerErrorCode: " & $Motherboard[$i][2] & @CRLF & _
                        "ConfigManagerUserConfig: " & $Motherboard[$i][3] & @CRLF & _
                        "Description: " & $Motherboard[$i][4] & @CRLF & _
                        "CreationClassName: " & $Motherboard[$i][5] & @CRLF & _
                        "DeviceID: " & $Motherboard[$i][6] & @CRLF & _
                        "ErrorCleared: " & $Motherboard[$i][7] & @CRLF & _
                        "ErrorDescription: " & $Motherboard[$i][8] & @CRLF & _
                        "LastErrorCode: " & $Motherboard[$i][9] & @CRLF & _
                        "PNPDeviceID: " & $Motherboard[$i][10] & @CRLF & _
                        "PowerManagementCapabilities: " & $Motherboard[$i][11] & @CRLF & _
                        "PowerManagementSupported: " & $Motherboard[$i][12] & @CRLF & _
                        "PrimaryBusType: " & $Motherboard[$i][13] & @CRLF & _
                        "RevisionNumber: " & $Motherboard[$i][14] & @CRLF & _
                        "SecondaryBusType: " & $Motherboard[$i][15] & @CRLF & _
                        "Status: " & $Motherboard[$i][16] & @CRLF & _
                        "StatusInfo: " & $Motherboard[$i][17] & @CRLF & _
                        "SystemCreationClassName: " & $Motherboard[$i][18] & @CRLF & _
                        "SystemName: " & $Motherboard[$i][19] & @CRLF & @CRLF, 1)
            Next
        Case "Mouse"
            _ComputerGetMouse($Mouse)
            For $i = 1 To $Mouse[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $Mouse[$i][0] & @CRLF & _
                        "Availability: " & $Mouse[$i][1] & @CRLF & _
                        "Config Manager Error Code: " & $Mouse[$i][2] & @CRLF & _
                        "Config Manager User Config: " & $Mouse[$i][3] & @CRLF & _
                        "Description: " & $Mouse[$i][4] & @CRLF & _
                        "Creation Class Name: " & $Mouse[$i][5] & @CRLF & _
                        "Device ID: " & $Mouse[$i][6] & @CRLF & _
                        "Device Interface: " & $Mouse[$i][7] & @CRLF & _
                        "Double Speed Threshold: " & $Mouse[$i][8] & @CRLF & _
                        "Error Cleared: " & $Mouse[$i][9] & @CRLF & _
                        "Error Description: " & $Mouse[$i][10] & @CRLF & _
                        "Handedness: " & $Mouse[$i][11] & @CRLF & _
                        "Hardware Type: " & $Mouse[$i][12] & @CRLF & _
                        "Inf File Name: " & $Mouse[$i][13] & @CRLF & _
                        "Inf Section: " & $Mouse[$i][14] & @CRLF & _
                        "Is Locked: " & $Mouse[$i][15] & @CRLF & _
                        "Last Error Code: " & $Mouse[$i][16] & @CRLF & _
                        "Manufacturer: " & $Mouse[$i][17] & @CRLF & _
                        "Number Of Buttons: " & $Mouse[$i][18] & @CRLF & _
                        "PNP Device ID: " & $Mouse[$i][19] & @CRLF & _
                        "Pointing Type: " & $Mouse[$i][20] & @CRLF & _
                        "Power Management Capabilities: " & $Mouse[$i][21] & @CRLF & _
                        "Power Management Supported: " & $Mouse[$i][22] & @CRLF & _
                        "Quad Speed Threshold: " & $Mouse[$i][23] & @CRLF & _
                        "Resolution: " & $Mouse[$i][24] & @CRLF & _
                        "Sample Rate: " & $Mouse[$i][25] & @CRLF & _
                        "Status: " & $Mouse[$i][26] & @CRLF & _
                        "Status Info: " & $Mouse[$i][27] & @CRLF & _
                        "Synch: " & $Mouse[$i][28] & @CRLF & _
                        "System Creation Class Name: " & $Mouse[$i][29] & @CRLF & _
                        "System Name: " & $Mouse[$i][30] & @CRLF & @CRLF, 1)
            Next
        Case "Network"
            _ComputerGetNetworkCards($NetworkCards)
            For $i = 1 To $NetworkCards[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $NetworkCards[$i][0] & @CRLF & _
                        "Adapter Type: " & $NetworkCards[$i][1] & @CRLF & _
                        "Adapter Type ID: " & $NetworkCards[$i][2] & @CRLF & _
                        "Auto Sense: " & $NetworkCards[$i][3] & @CRLF & _
                        "Description: " & $NetworkCards[$i][4] & @CRLF & _
                        "Availability: " & $NetworkCards[$i][5] & @CRLF & _
                        "Config Manager Error Code: " & $NetworkCards[$i][6] & @CRLF & _
                        "Config Manager User Config: " & $NetworkCards[$i][7] & @CRLF & _
                        "Creation Class Name: " & $NetworkCards[$i][8] & @CRLF & _
                        "Device ID: " & $NetworkCards[$i][9] & @CRLF & _
                        "Error Cleared: " & $NetworkCards[$i][10] & @CRLF & _
                        "Error Description: " & $NetworkCards[$i][11] & @CRLF & _
                        "Index: " & $NetworkCards[$i][12] & @CRLF & _
                        "Installed: " & $NetworkCards[$i][13] & @CRLF & _
                        "Last Error Code: " & $NetworkCards[$i][14] & @CRLF & _
                        "MAC Address: " & $NetworkCards[$i][15] & @CRLF & _
                        "Manufacturer: " & $NetworkCards[$i][16] & @CRLF & _
                        "Max Number Controlled: " & $NetworkCards[$i][17] & @CRLF & _
                        "Max Speed: " & $NetworkCards[$i][18] & @CRLF & _
                        "Net Connection ID: " & $NetworkCards[$i][19] & @CRLF & _
                        "Net Connection Status: " & $NetworkCards[$i][20] & @CRLF & _
                        "Network Addresses: " & $NetworkCards[$i][21] & @CRLF & _
                        "Permanent Address: " & $NetworkCards[$i][22] & @CRLF & _
                        "PNP Device ID: " & $NetworkCards[$i][23] & @CRLF & _
                        "Power Management Capabilities: " & $NetworkCards[$i][24] & @CRLF & _
                        "Power Management Supported: " & $NetworkCards[$i][25] & @CRLF & _
                        "Product Name: " & $NetworkCards[$i][26] & @CRLF & _
                        "Service Name: " & $NetworkCards[$i][27] & @CRLF & _
                        "Speed: " & $NetworkCards[$i][28] & @CRLF & _
                        "Status: " & $NetworkCards[$i][29] & @CRLF & _
                        "Status Info: " & $NetworkCards[$i][30] & @CRLF & _
                        "System Creation Class Name: " & $NetworkCards[$i][31] & @CRLF & _
                        "System Name: " & $NetworkCards[$i][32] & @CRLF & _
                        "Time Of Last Reset: " & $NetworkCards[$i][33] & @CRLF & @CRLF, 1)
            Next
        Case "System"
            _ComputerGetSystem($System)
            For $i = 1 To $System[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $System[$i][0] & @CRLF & _
                        "Admin Password Status: " & $System[$i][1] & @CRLF & _
                        "Automatic Reset Boot Option: " & $System[$i][2] & @CRLF & _
                        "Automatic Reset Capability: " & $System[$i][3] & @CRLF & _
                        "Description: " & $System[$i][4] & @CRLF & _
                        "Boot Option On Limit: " & $System[$i][5] & @CRLF & _
                        "Boot Option On WatchDog: " & $System[$i][6] & @CRLF & _
                        "Boot ROM Supported: " & $System[$i][7] & @CRLF & _
                        "Bootup State: " & $System[$i][8] & @CRLF & _
                        "Last Load Info: " & $System[$i][20] & @CRLF & _
                        "Manufacturer: " & $System[$i][21] & @CRLF & _
                        "Model: " & $System[$i][22] & @CRLF & _
                        "Name Format: " & $System[$i][23] & @CRLF & _
                        "Network Server Mode Enabled: " & $System[$i][24] & @CRLF & _
                        "Number Of Processors: " & $System[$i][25] & @CRLF & _
                        "OEM Logo Bitmap: " & $System[$i][26] & @CRLF & _
                        "OEM String Array: " & $System[$i][27] & @CRLF & _
                        "Part Of Domain: " & $System[$i][28] & @CRLF & _
                        "Pause After Reset: " & $System[$i][29] & @CRLF & _
                        "Power Management Capabilities: " & $System[$i][30] & @CRLF & _
                        "Power Management Supported: " & $System[$i][31] & @CRLF & _
                        "Power On Password Status: " & $System[$i][32] & @CRLF & _
                        "Power State: " & $System[$i][33] & @CRLF & _
                        "Power Supply State: " & $System[$i][34] & @CRLF & _
                        "Primary Owner Contact: " & $System[$i][35] & @CRLF & _
                        "Primary Owner Name: " & $System[$i][36] & @CRLF & _
                        "Reset Capability: " & $System[$i][37] & @CRLF & _
                        "Reset Count: " & $System[$i][38] & @CRLF & _
                        "Reset Limit: " & $System[$i][39] & @CRLF & _
                        "Roles: " & $System[$i][40] & @CRLF & _
                        "Status: " & $System[$i][41] & @CRLF & _
                        "Support Contact Description: " & $System[$i][42] & @CRLF & _
                        "System Startup Delay: " & $System[$i][43] & @CRLF & _
                        "System Startup Options: " & $System[$i][44] & @CRLF & _
                        "System Startup Setting: " & $System[$i][45] & @CRLF & _
                        "System Type: " & $System[$i][46] & @CRLF & _
                        "Thermal State: " & $System[$i][47] & @CRLF & _
                        "Total Physical Memory: " & Round($System[$i][48] / 1024 / 1024 / 1024, 3) & @CRLF & _
                        "User Name: " & $System[$i][49] & @CRLF & _
                        "Wake Up Type: " & $System[$i][50] & @CRLF & _
                        "Workgroup: " & $System[$i][51] & @CRLF & @CRLF, 1)
            Next
        Case "Processor"
            _ComputerGetProcessors($Processors)
            For $i = 1 To $Processors[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $Processors[$i][0] & @CRLF & _
                        "Address Width: " & $Processors[$i][1] & @CRLF & _
                        "Architecture: " & $Processors[$i][2] & @CRLF & _
                        "Availability: " & $Processors[$i][3] & @CRLF & _
                        "Description: " & $Processors[$i][4] & @CRLF & _
                        "Config Manager Error Code: " & $Processors[$i][5] & @CRLF & _
                        "Config Manager User Config: " & $Processors[$i][6] & @CRLF & _
                        "CPU Status: " & $Processors[$i][7] & @CRLF & _
                        "Creation Class Name: " & $Processors[$i][8] & @CRLF & _
                        "Current Clock Speed: " & $Processors[$i][9] & @CRLF & _
                        "Current Voltage: " & $Processors[$i][10] & @CRLF & _
                        "Data Width: " & $Processors[$i][11] & @CRLF & _
                        "Device ID: " & $Processors[$i][12] & @CRLF & _
                        "Error Cleared: " & $Processors[$i][13] & @CRLF & _
                        "Error Description: " & $Processors[$i][14] & @CRLF & _
                        "Ext Clock: " & $Processors[$i][15] & @CRLF & _
                        "Family: " & $Processors[$i][16] & @CRLF & _
                        "L2 Cache Size: " & $Processors[$i][17] & @CRLF & _
                        "L2 Cache Speed: " & $Processors[$i][18] & @CRLF & _
                        "Last Error Code: " & $Processors[$i][19] & @CRLF & _
                        "Level: " & $Processors[$i][20] & @CRLF & _
                        "Load Percentage: " & $Processors[$i][21] & @CRLF & _
                        "Manufacturer: " & $Processors[$i][22] & @CRLF & _
                        "Max Clock Speed: " & $Processors[$i][23] & @CRLF & _
                        "Other Family Description: " & $Processors[$i][24] & @CRLF & _
                        "PNP Device ID: " & $Processors[$i][25] & @CRLF & _
                        "Power Management Capabilities: " & $Processors[$i][26] & @CRLF & _
                        "Power Management Supported: " & $Processors[$i][27] & @CRLF & _
                        "Processor ID: " & $Processors[$i][28] & @CRLF & _
                        "Processor Type: " & $Processors[$i][29] & @CRLF & _
                        "Revision: " & $Processors[$i][30] & @CRLF & _
                        "Role: " & $Processors[$i][31] & @CRLF & _
                        "Socket Designation: " & $Processors[$i][32] & @CRLF & _
                        "Status: " & $Processors[$i][33] & @CRLF & _
                        "Status Info: " & $Processors[$i][34] & @CRLF & _
                        "Stepping: " & $Processors[$i][35] & @CRLF & _
                        "System Creation Class Name: " & $Processors[$i][36] & @CRLF & _
                        "System Name: " & $Processors[$i][37] & @CRLF & _
                        "Unique ID: " & $Processors[$i][38] & @CRLF & _
                        "Upgrade Method: " & $Processors[$i][39] & @CRLF & _
                        "Version: " & $Processors[$i][40] & @CRLF & _
                        "Voltage Caps: " & $Processors[$i][41] & @CRLF & @CRLF, 1)
            Next
        Case "Sound Card"
            _ComputerGetSoundCards($SoundCards)
            For $i = 1 To $SoundCards[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $SoundCards[$i][0] & @CRLF & _
                        "Availability: " & $SoundCards[$i][1] & @CRLF & _
                        "Config Manager Error Code: " & $SoundCards[$i][2] & @CRLF & _
                        "Config Manager User Config: " & $SoundCards[$i][3] & @CRLF & _
                        "Description: " & $SoundCards[$i][4] & @CRLF & _
                        "Creation Class Name: " & $SoundCards[$i][5] & @CRLF & _
                        "Device ID: " & $SoundCards[$i][6] & @CRLF & _
                        "DMA Buffer Size: " & $SoundCards[$i][7] & @CRLF & _
                        "Error Cleared: " & $SoundCards[$i][8] & @CRLF & _
                        "Error Description: " & $SoundCards[$i][9] & @CRLF & _
                        "Last Error Code: " & $SoundCards[$i][10] & @CRLF & _
                        "Manufacturer: " & $SoundCards[$i][11] & @CRLF & _
                        "MPU 401 Address: " & $SoundCards[$i][12] & @CRLF & _
                        "PNP Device ID: " & $SoundCards[$i][13] & @CRLF & _
                        "Power Management Capabilities: " & $SoundCards[$i][14] & @CRLF & _
                        "Power Management Supported: " & $SoundCards[$i][15] & @CRLF & _
                        "Product Name: " & $SoundCards[$i][16] & @CRLF & _
                        "Status: " & $SoundCards[$i][17] & @CRLF & _
                        "Status Info: " & $SoundCards[$i][18] & @CRLF & _
                        "System Creation Class Name: " & $SoundCards[$i][19] & @CRLF & _
                        "System Name: " & $SoundCards[$i][20] & @CRLF & @CRLF, 1)
            Next
        Case "Graphics Card"
            _ComputerGetVideoCards($VideoCards)
            For $i = 1 To $VideoCards[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $VideoCards[$i][0] & @CRLF & _
                        "Accelerator Capabilities: " & $VideoCards[$i][1] & @CRLF & _
                        "Adapter Compatibility: " & $VideoCards[$i][2] & @CRLF & _
                        "Adapter DAC Type: " & $VideoCards[$i][3] & @CRLF & _
                        "Description: " & $VideoCards[$i][4] & @CRLF & _
                        "Adapter RAM: " & $VideoCards[$i][5] & @CRLF & _
                        "Availability: " & $VideoCards[$i][6] & @CRLF & _
                        "Capability Descriptions: " & $VideoCards[$i][7] & @CRLF & _
                        "Color Table Entries: " & $VideoCards[$i][8] & @CRLF & _
                        "Config Manager Error Code: " & $VideoCards[$i][9] & @CRLF & _
                        "Config Manager User Config: " & $VideoCards[$i][10] & @CRLF & _
                        "Creation Class Name: " & $VideoCards[$i][11] & @CRLF & _
                        "Current Bits Per Pixel: " & $VideoCards[$i][12] & @CRLF & _
                        "Current Horizontal Resolution: " & $VideoCards[$i][13] & @CRLF & _
                        "Current Number Of Colors: " & $VideoCards[$i][14] & @CRLF & _
                        "Current Number Of Columns: " & $VideoCards[$i][15] & @CRLF & _
                        "Current Number Of Rows: " & $VideoCards[$i][16] & @CRLF & _
                        "Current Refresh Rate: " & $VideoCards[$i][17] & @CRLF & _
                        "Current Scan Mode: " & $VideoCards[$i][18] & @CRLF & _
                        "Current Vertical Resolution: " & $VideoCards[$i][19] & @CRLF & _
                        "Device ID: " & $VideoCards[$i][20] & @CRLF & _
                        "Device Specific Pens: " & $VideoCards[$i][21] & @CRLF & _
                        "Dither Type: " & $VideoCards[$i][22] & @CRLF & _
                        "Driver Date: " & $VideoCards[$i][23] & @CRLF & _
                        "Driver Version: " & $VideoCards[$i][24] & @CRLF & _
                        "Error Cleared: " & $VideoCards[$i][25] & @CRLF & _
                        "Error Description: " & $VideoCards[$i][26] & @CRLF & _
                        "ICM Intent: " & $VideoCards[$i][27] & @CRLF & _
                        "ICM Method: " & $VideoCards[$i][28] & @CRLF & _
                        "Inf Filename: " & $VideoCards[$i][29] & @CRLF & _
                        "Inf Section: " & $VideoCards[$i][30] & @CRLF & _
                        "Installed Display Drivers: " & $VideoCards[$i][31] & @CRLF & _
                        "Last Error Code: " & $VideoCards[$i][32] & @CRLF & _
                        "Max Memory Supported: " & $VideoCards[$i][33] & @CRLF & _
                        "Max Number Controlled: " & $VideoCards[$i][34] & @CRLF & _
                        "Max Refresh Rate: " & $VideoCards[$i][35] & @CRLF & _
                        "Min Refresh Rate: " & $VideoCards[$i][36] & @CRLF & _
                        "Monochrome: " & $VideoCards[$i][37] & @CRLF & _
                        "Number Of Color Planes: " & $VideoCards[$i][38] & @CRLF & _
                        "Number Of Video Pages: " & $VideoCards[$i][39] & @CRLF & _
                        "PNP Device ID: " & $VideoCards[$i][40] & @CRLF & _
                        "Power Management Capabilities: " & $VideoCards[$i][41] & @CRLF & _
                        "Power Management Supported: " & $VideoCards[$i][42] & @CRLF & _
                        "Protocol Supported: " & $VideoCards[$i][43] & @CRLF & _
                        "Reserved System Palette Entries: " & $VideoCards[$i][44] & @CRLF & _
                        "Specification Version: " & $VideoCards[$i][45] & @CRLF & _
                        "Status: " & $VideoCards[$i][46] & @CRLF & _
                        "Status Info: " & $VideoCards[$i][47] & @CRLF & _
                        "System Creation Class Name: " & $VideoCards[$i][48] & @CRLF & _
                        "System Name: " & $VideoCards[$i][49] & @CRLF & _
                        "System Palette Entries: " & $VideoCards[$i][50] & @CRLF & _
                        "Time Of Last Reset: " & $VideoCards[$i][51] & @CRLF & _
                        "Video Architecture: " & $VideoCards[$i][52] & @CRLF & _
                        "Video Memory Type: " & $VideoCards[$i][53] & @CRLF & _
                        "Video Mode: " & $VideoCards[$i][54] & @CRLF & _
                        "Video Mode Description: " & $VideoCards[$i][55] & @CRLF & _
                        "Video Processor: " & $VideoCards[$i][56] & @CRLF & @CRLF, 1)
            Next
        Case "Operating System"
            _ComputerGetOSs($OSs)
            For $i = 1 To $OSs[0][0] Step 1
                GUICtrlSetData($AboutEditbox, "Name: " & $OSs[$i][0] & @CRLF & _
                        "Boot Device: " & $OSs[$i][1] & @CRLF & _
                        "Build Number: " & $OSs[$i][2] & @CRLF & _
                        "Build Type: " & $OSs[$i][3] & @CRLF & _
                        "Description: " & $OSs[$i][4] & @CRLF & _
                        "Code Set: " & $OSs[$i][5] & @CRLF & _
                        "Country Code: " & $OSs[$i][6] & @CRLF & _
                        "Creation Class Name: " & $OSs[$i][7] & @CRLF & _
                        "CSCreation Class Name: " & $OSs[$i][8] & @CRLF & _
                        "CSD Version: " & $OSs[$i][9] & @CRLF & _
                        "CS Name: " & $OSs[$i][10] & @CRLF & _
                        "Current Time Zone: " & $OSs[$i][11] & @CRLF & _
                        "Data Execution Prevention_32BitApplications: " & $OSs[$i][12] & @CRLF & _
                        "Data Execution Prevention_Available: " & $OSs[$i][13] & @CRLF & _
                        "Data Execution Prevention_Drivers: " & $OSs[$i][14] & @CRLF & _
                        "Data Execution Prevention_SupportPolicy: " & $OSs[$i][15] & @CRLF & _
                        "Debug: " & $OSs[$i][16] & @CRLF & _
                        "Distributed: " & $OSs[$i][17] & @CRLF & _
                        "Encryption Level: " & $OSs[$i][18] & @CRLF & _
                        "Foreground Application Boost: " & $OSs[$i][19] & @CRLF & _
                        "Free Physical Memory: " & $OSs[$i][20] & @CRLF & _
                        "Free Space In Paging Files: " & $OSs[$i][21] & @CRLF & _
                        "Free Virtual Memory: " & $OSs[$i][22] & @CRLF & _
                        "Install Date: " & $OSs[$i][23] & @CRLF & _
                        "Large System Cache: " & $OSs[$i][24] & @CRLF & _
                        "Last Boot Up Time: " & $OSs[$i][25] & @CRLF & _
                        "Local Date Time: " & $OSs[$i][26] & @CRLF & _
                        "Locale: " & $OSs[$i][27] & @CRLF & _
                        "Manufacturer: " & $OSs[$i][28] & @CRLF & _
                        "Max Number Of Processes: " & $OSs[$i][29] & @CRLF & _
                        "Max Process Memory Size: " & $OSs[$i][30] & @CRLF & _
                        "Number Of Licensed Users: " & $OSs[$i][31] & @CRLF & _
                        "Number Of Processes: " & $OSs[$i][32] & @CRLF & _
                        "Number Of Users: " & $OSs[$i][33] & @CRLF & _
                        "Organization: " & $OSs[$i][34] & @CRLF & _
                        "OS Language: " & $OSs[$i][35] & @CRLF & _
                        "OS Product Suite: " & $OSs[$i][36] & @CRLF & _
                        "OS Type: " & $OSs[$i][37] & @CRLF & _
                        "Other Type Description: " & $OSs[$i][38] & @CRLF & _
                        "Plus Product ID: " & $OSs[$i][39] & @CRLF & _
                        "Plus Version Number: " & $OSs[$i][40] & @CRLF & _
                        "Primary: " & $OSs[$i][41] & @CRLF & _
                        "Product Type: " & $OSs[$i][42] & @CRLF & _
                        "Quantum Length: " & $OSs[$i][43] & @CRLF & _
                        "Quantum Type: " & $OSs[$i][44] & @CRLF & _
                        "Registered User: " & $OSs[$i][45] & @CRLF & _
                        "Serial Number: " & $OSs[$i][46] & @CRLF & _
                        "Service Pack Major Version: " & $OSs[$i][47] & @CRLF & _
                        "Service Pack Minor Version: " & $OSs[$i][48] & @CRLF & _
                        "Size Stored In Paging Files: " & $OSs[$i][49] & @CRLF & _
                        "Status: " & $OSs[$i][50] & @CRLF & _
                        "Suite Mask: " & $OSs[$i][51] & @CRLF & _
                        "System Device: " & $OSs[$i][52] & @CRLF & _
                        "System Directory: " & $OSs[$i][53] & @CRLF & _
                        "System Drive: " & $OSs[$i][54] & @CRLF & _
                        "Total Swap Space Size: " & $OSs[$i][55] & @CRLF & _
                        "Total Virtual Memory Size: " & $OSs[$i][56] & @CRLF & _
                        "Total Visible Memory Size: " & $OSs[$i][57] & @CRLF & _
                        "Version: " & $OSs[$i][58] & @CRLF & _
                        "Windows Directory: " & $OSs[$i][59] & @CRLF & @CRLF, 1)
            Next
    EndSwitch

    $oShell = ObjCreate("Shell.Explorer.2")
    $iCtrlID = GUICtrlCreateObj($oShell, 0, 275, 300, 20)

    $oShell.navigate("about:blank")
    While $oShell.busy
        Sleep(100)
    WEnd

    With $oShell.document
        .write('<header><center><a href="'& $MSDNLink &'"  target="_blank">What does this information mean?</a></center></header>')
        .body.scroll = "no"
        .body.topmargin = 0
        .body.leftmargin = 0
        .body.bgcolor = 0xF0F0F0
        .body.style.color = 0x000000
        .body.style.fontSize = 16
    EndWith

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                GUIDelete($HardwareGUI)
                GUISetState(@SW_SHOW, $MainGUI)
                WinActivate($MainGUI)
                ExitLoop
            Case $Close
                GUIDelete($HardwareGUI)
                GUISetState(@SW_SHOW, $MainGUI)
                WinActivate($MainGUI)
                ExitLoop
            Case $GUI_EVENT_PRIMARYDOWN
                On_Drag($HardwareGUI, $HardwareLabel)
         EndSwitch
    WEnd

EndFunc   ;==>HardwareGUI
Func _ComputerGetBattery(ByRef $aBatteryInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aBatteryInfo[1][31], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Battery", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394074(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aBatteryInfo[UBound($aBatteryInfo) + 1][31]
            $aBatteryInfo[$i][0] = $objItem.Name
            $aBatteryInfo[$i][1] = $objItem.Availability
            $aBatteryInfo[$i][2] = $objItem.BatteryRechargeTime
            $aBatteryInfo[$i][3] = $objItem.BatteryStatus
            $aBatteryInfo[$i][4] = $objItem.Description
            $aBatteryInfo[$i][5] = $objItem.Chemistry
            $aBatteryInfo[$i][6] = $objItem.ConfigManagerErrorCode
            $aBatteryInfo[$i][7] = $objItem.ConfigManagerUserConfig
            $aBatteryInfo[$i][8] = $objItem.CreationClassName
            $aBatteryInfo[$i][9] = $objItem.DesignCapacity
            $aBatteryInfo[$i][10] = $objItem.DesignVoltage
            $aBatteryInfo[$i][11] = $objItem.DeviceID
            $aBatteryInfo[$i][12] = $objItem.ErrorCleared
            $aBatteryInfo[$i][13] = $objItem.ErrorDescription
            $aBatteryInfo[$i][14] = $objItem.EstimatedChargeRemaining
            $aBatteryInfo[$i][15] = $objItem.EstimatedRunTime
            $aBatteryInfo[$i][16] = $objItem.ExpectedBatteryLife
            $aBatteryInfo[$i][17] = $objItem.ExpectedLife
            $aBatteryInfo[$i][18] = $objItem.FullChargeCapacity
            $aBatteryInfo[$i][19] = $objItem.LastErrorCode
            $aBatteryInfo[$i][20] = $objItem.MaxRechargeTime
            $aBatteryInfo[$i][21] = $objItem.PNPDeviceID
            $aBatteryInfo[$i][22] = $objItem.PowerManagementCapabilities(0)
            $aBatteryInfo[$i][23] = $objItem.PowerManagementSupported
            $aBatteryInfo[$i][24] = $objItem.SmartBatteryVersion
            $aBatteryInfo[$i][25] = $objItem.Status
            $aBatteryInfo[$i][26] = $objItem.StatusInfo
            $aBatteryInfo[$i][27] = $objItem.SystemCreationClassName
            $aBatteryInfo[$i][28] = $objItem.SystemName
            $aBatteryInfo[$i][29] = $objItem.TimeOnBattery
            $aBatteryInfo[$i][30] = $objItem.TimeToFullCharge
            $i += 1
        Next
        $aBatteryInfo[0][0] = UBound($aBatteryInfo) - 1
        If $aBatteryInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetBattery

Func _ComputerGetHDD(ByRef $aHDDInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aHDDInfo[1][51], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394132(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aHDDInfo[UBound($aHDDInfo) + 1][51]
            $aHDDInfo[$i][0] = $objItem.Name
            $aHDDInfo[$i][1] = $objItem.Availability
            $aHDDInfo[$i][2] = $objItem.BytesPerSector
            $aHDDInfo[$i][3] = $objItem.Capabilities(0)
            $aHDDInfo[$i][4] = $objItem.CapabilityDescriptions(0)
            $aHDDInfo[$i][5] = $objItem.Caption
            $aHDDInfo[$i][6] = $objItem.CompressionMethod
            $aHDDInfo[$i][7] = $objItem.ConfigManagerErrorCode
            $aHDDInfo[$i][8] = $objItem.ConfigManagerUserConfig
            $aHDDInfo[$i][9] = $objItem.CreationClassName
            $aHDDInfo[$i][10] = $objItem.DefaultBlockSize
            $aHDDInfo[$i][11] = $objItem.Description
            $aHDDInfo[$i][12] = $objItem.DeviceID
            $aHDDInfo[$i][13] = $objItem.ErrorCleared
            $aHDDInfo[$i][14] = $objItem.ErrorDescription
            $aHDDInfo[$i][15] = $objItem.ErrorMethodology
            $aHDDInfo[$i][16] = $objItem.FirmwareRevision
            $aHDDInfo[$i][17] = $objItem.Index
            $aHDDInfo[$i][18] = __StringToDate($objItem.InstallDate)
            $aHDDInfo[$i][19] = $objItem.InterfaceType
            $aHDDInfo[$i][20] = $objItem.LastErrorCode
            $aHDDInfo[$i][21] = $objItem.Manufacturer
            $aHDDInfo[$i][22] = $objItem.MaxBlockSize
            $aHDDInfo[$i][23] = $objItem.MaxMediaSize
            $aHDDInfo[$i][24] = $objItem.MediaLoaded
            $aHDDInfo[$i][25] = $objItem.MediaType
            $aHDDInfo[$i][26] = $objItem.MinBlockSize
            $aHDDInfo[$i][27] = $objItem.Model
            $aHDDInfo[$i][28] = $objItem.NeedsCleaning
            $aHDDInfo[$i][29] = $objItem.NumberOfMediaSupported
            $aHDDInfo[$i][30] = $objItem.Partitions
            $aHDDInfo[$i][31] = $objItem.PNPDeviceID
            $aHDDInfo[$i][32] = $objItem.PowerManagementCapabilities
            $aHDDInfo[$i][33] = $objItem.PowerManagementSupported
            $aHDDInfo[$i][34] = $objItem.SCSIBus
            $aHDDInfo[$i][35] = $objItem.SCSILogicalUnit
            $aHDDInfo[$i][36] = $objItem.SCSIPort
            $aHDDInfo[$i][37] = $objItem.SCSITargetId
            $aHDDInfo[$i][38] = $objItem.SectorsPerTrack
            $aHDDInfo[$i][39] = $objItem.SerialNumber
            $aHDDInfo[$i][40] = $objItem.Signature
            $aHDDInfo[$i][41] = $objItem.Size
            $aHDDInfo[$i][42] = $objItem.Status
            $aHDDInfo[$i][43] = $objItem.StatusInfo
            $aHDDInfo[$i][44] = $objItem.SystemCreationClassName
            $aHDDInfo[$i][45] = $objItem.SystemName
            $aHDDInfo[$i][46] = $objItem.TotalCylinders
            $aHDDInfo[$i][47] = $objItem.TotalHeads
            $aHDDInfo[$i][48] = $objItem.TotalSectors
            $aHDDInfo[$i][49] = $objItem.TotalTracks
            $aHDDInfo[$i][50] = $objItem.TracksPerCylinder

            $i += 1
        Next
        $aHDDInfo[0][0] = UBound($aHDDInfo) - 1
        If $aHDDInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetHDD

Func _ComputerGetKeyboard(ByRef $aKeyboardInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aKeyboardInfo[1][21], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Keyboard", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394166(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aKeyboardInfo[UBound($aKeyboardInfo) + 1][21]
            $aKeyboardInfo[$i][0] = $objItem.Name
            $aKeyboardInfo[$i][1] = $objItem.Availability
            $aKeyboardInfo[$i][2] = $objItem.ConfigManagerErrorCode
            $aKeyboardInfo[$i][3] = $objItem.ConfigManagerUserConfig
            $aKeyboardInfo[$i][4] = $objItem.Description
            $aKeyboardInfo[$i][5] = $objItem.CreationClassName
            $aKeyboardInfo[$i][6] = $objItem.DeviceID
            $aKeyboardInfo[$i][7] = $objItem.ErrorCleared
            $aKeyboardInfo[$i][8] = $objItem.ErrorDescription
            $aKeyboardInfo[$i][9] = $objItem.IsLocked
            $aKeyboardInfo[$i][10] = $objItem.LastErrorCode
            $aKeyboardInfo[$i][11] = $objItem.Layout
            $aKeyboardInfo[$i][12] = $objItem.NumberOfFunctionKeys
            $aKeyboardInfo[$i][13] = $objItem.Password
            $aKeyboardInfo[$i][14] = $objItem.PNPDeviceID
            $aKeyboardInfo[$i][15] = $objItem.PowerManagementCapabilities(0)
            $aKeyboardInfo[$i][16] = $objItem.PowerManagementSupported
            $aKeyboardInfo[$i][17] = $objItem.Status
            $aKeyboardInfo[$i][18] = $objItem.StatusInfo
            $aKeyboardInfo[$i][19] = $objItem.SystemCreationClassName
            $aKeyboardInfo[$i][20] = $objItem.SystemName
            $i += 1
        Next
        $aKeyboardInfo[0][0] = UBound($aKeyboardInfo) - 1
        If $aKeyboardInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetKeyboard

;~ Func _ComputerGetMemory(ByRef $aMemoryInfo)
;~  Local $colItems, $objWMIService, $objItem
;~  Dim $aMemoryInfo[1][28], $i = 1

;~  $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
;~  $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMemory", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
;~  $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394347(v=vs.85).aspx"

;~  If IsObj($colItems) Then
;~      For $objItem In $colItems
;~          ReDim $aMemoryInfo[UBound($aMemoryInfo) + 1][28]
;~          $aMemoryInfo[$i][0] = $objItem.Name
;~          $aMemoryInfo[$i][1] = $objItem.BankLabel
;~          $aMemoryInfo[$i][2] = $objItem.Capacity
;~          $aMemoryInfo[$i][3] = $objItem.CreationClassName
;~          $aMemoryInfo[$i][4] = $objItem.Description
;~          $aMemoryInfo[$i][5] = $objItem.DataWidth
;~          $aMemoryInfo[$i][6] = $objItem.DeviceLocator
;~          $aMemoryInfo[$i][7] = $objItem.FormFactor
;~          $aMemoryInfo[$i][8] = $objItem.HotSwappable
;~          $aMemoryInfo[$i][9] = $objItem.InterleaveDataDepth
;~          $aMemoryInfo[$i][10] = $objItem.InterleavePosition
;~          $aMemoryInfo[$i][11] = $objItem.Manufacturer
;~          $aMemoryInfo[$i][12] = $objItem.MemoryType
;~          $aMemoryInfo[$i][13] = $objItem.Model
;~          $aMemoryInfo[$i][14] = $objItem.OtherIdentifyingInfo
;~          $aMemoryInfo[$i][15] = $objItem.PartNumber
;~          $aMemoryInfo[$i][16] = $objItem.PositionInRow
;~          $aMemoryInfo[$i][17] = $objItem.PoweredOn
;~          $aMemoryInfo[$i][18] = $objItem.Removable
;~          $aMemoryInfo[$i][19] = $objItem.Replaceable
;~          $aMemoryInfo[$i][20] = $objItem.SerialNumber
;~          $aMemoryInfo[$i][21] = $objItem.SKU
;~          $aMemoryInfo[$i][22] = $objItem.Speed
;~          $aMemoryInfo[$i][23] = $objItem.Status
;~          $aMemoryInfo[$i][24] = $objItem.Tag
;~          $aMemoryInfo[$i][25] = $objItem.TotalWidth
;~          $aMemoryInfo[$i][26] = $objItem.TypeDetail
;~          $aMemoryInfo[$i][27] = $objItem.Version
;~          $i += 1
;~      Next
;~      $aMemoryInfo[0][0] = UBound($aMemoryInfo) - 1
;~      If $aMemoryInfo[0][0] < 1 Then
;~          SetError(1, 1, 0)
;~      EndIf
;~  Else
;~      SetError(1, 2, 0)
;~  EndIf
;~ EndFunc   ;==>_ComputerGetMemory

Func _ComputerGetMemory(ByRef $aMemoryInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aMemoryInfo[1][27], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMemoryArray", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394347(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aMemoryInfo[UBound($aMemoryInfo) + 1][27]
            $aMemoryInfo[$i][0] = $objItem.Caption
            $aMemoryInfo[$i][1] = $objItem.CreationClassName
            $aMemoryInfo[$i][2] = $objItem.Depth
            $aMemoryInfo[$i][3] = $objItem.Description
            $aMemoryInfo[$i][4] = $objItem.Height
            $aMemoryInfo[$i][5] = $objItem.HotSwappable
            $aMemoryInfo[$i][6] = $objItem.InstallDate
            $aMemoryInfo[$i][7] = $objItem.Location
            $aMemoryInfo[$i][8] = $objItem.Manufacturer
            $aMemoryInfo[$i][9] = $objItem.MaxCapacity
            $aMemoryInfo[$i][10] = $objItem.MemoryDevices
            $aMemoryInfo[$i][11] = $objItem.MemoryErrorCorrection
            $aMemoryInfo[$i][12] = $objItem.Model
            $aMemoryInfo[$i][13] = $objItem.Name
            $aMemoryInfo[$i][14] = $objItem.OtherIdentifyingInfo
            $aMemoryInfo[$i][15] = $objItem.PartNumber
            $aMemoryInfo[$i][16] = $objItem.PoweredOn
            $aMemoryInfo[$i][17] = $objItem.Removable
            $aMemoryInfo[$i][18] = $objItem.Replaceable
            $aMemoryInfo[$i][19] = $objItem.SerialNumber
            $aMemoryInfo[$i][20] = $objItem.SKU
            $aMemoryInfo[$i][21] = $objItem.Status
            $aMemoryInfo[$i][22] = $objItem.Tag
            $aMemoryInfo[$i][23] = $objItem.Use
            $aMemoryInfo[$i][24] = $objItem.Version
            $aMemoryInfo[$i][25] = $objItem.Weight
            $aMemoryInfo[$i][26] = $objItem.Width
            $i += 1
        Next
        $aMemoryInfo[0][0] = UBound($aMemoryInfo) - 1
        If $aMemoryInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetMemory

Func _ComputerGetMonitors(ByRef $aMonitorInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aMonitorInfo[1][26], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DesktopMonitor", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394122(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aMonitorInfo[UBound($aMonitorInfo) + 1][26]
            $aMonitorInfo[$i][0] = $objItem.Name
            $aMonitorInfo[$i][1] = $objItem.Availability
            $aMonitorInfo[$i][2] = $objItem.Bandwidth
            $aMonitorInfo[$i][3] = $objItem.ConfigManagerErrorCode
            $aMonitorInfo[$i][4] = $objItem.Description
            $aMonitorInfo[$i][5] = $objItem.ConfigManagerUserConfig
            $aMonitorInfo[$i][6] = $objItem.CreationClassName
            $aMonitorInfo[$i][7] = $objItem.DeviceID
            $aMonitorInfo[$i][8] = $objItem.DisplayType
            $aMonitorInfo[$i][9] = $objItem.ErrorCleared
            $aMonitorInfo[$i][10] = $objItem.ErrorDescription
            $aMonitorInfo[$i][11] = $objItem.IsLocked
            $aMonitorInfo[$i][12] = $objItem.LastErrorCode
            $aMonitorInfo[$i][13] = $objItem.MonitorManufacturer
            $aMonitorInfo[$i][14] = $objItem.MonitorType
            $aMonitorInfo[$i][15] = $objItem.PixelsPerXLogicalInch
            $aMonitorInfo[$i][16] = $objItem.PixelsPerYLogicalInch
            $aMonitorInfo[$i][17] = $objItem.PNPDeviceID
            $aMonitorInfo[$i][18] = $objItem.PowerManagementCapabilities(0)
            $aMonitorInfo[$i][19] = $objItem.PowerManagementSupported
            $aMonitorInfo[$i][20] = $objItem.ScreenHeight
            $aMonitorInfo[$i][21] = $objItem.ScreenWidth
            $aMonitorInfo[$i][22] = $objItem.Status
            $aMonitorInfo[$i][23] = $objItem.StatusInfo
            $aMonitorInfo[$i][24] = $objItem.SystemCreationClassName
            $aMonitorInfo[$i][25] = $objItem.SystemName
            $i += 1
        Next
        $aMonitorInfo[0][0] = UBound($aMonitorInfo) - 1
        If $aMonitorInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetMonitors

Func _ComputerGetMotherboard(ByRef $aMotherboardInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aMotherboardInfo[1][20], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_MotherboardDevice", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394204(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aMotherboardInfo[UBound($aMotherboardInfo) + 1][20]
            $aMotherboardInfo[$i][0] = $objItem.Name
            $aMotherboardInfo[$i][1] = $objItem.Availability
            $aMotherboardInfo[$i][2] = $objItem.ConfigManagerErrorCode
            $aMotherboardInfo[$i][3] = $objItem.ConfigManagerUserConfig
            $aMotherboardInfo[$i][4] = $objItem.Description
            $aMotherboardInfo[$i][5] = $objItem.CreationClassName
            $aMotherboardInfo[$i][6] = $objItem.DeviceID
            $aMotherboardInfo[$i][7] = $objItem.ErrorCleared
            $aMotherboardInfo[$i][8] = $objItem.ErrorDescription
            $aMotherboardInfo[$i][9] = $objItem.LastErrorCode
            $aMotherboardInfo[$i][10] = $objItem.PNPDeviceID
            $aMotherboardInfo[$i][11] = $objItem.PowerManagementCapabilities(0)
            $aMotherboardInfo[$i][12] = $objItem.PowerManagementSupported
            $aMotherboardInfo[$i][13] = $objItem.PrimaryBusType
            $aMotherboardInfo[$i][14] = $objItem.RevisionNumber
            $aMotherboardInfo[$i][15] = $objItem.SecondaryBusType
            $aMotherboardInfo[$i][16] = $objItem.Status
            $aMotherboardInfo[$i][17] = $objItem.StatusInfo
            $aMotherboardInfo[$i][18] = $objItem.SystemCreationClassName
            $aMotherboardInfo[$i][19] = $objItem.SystemName
            $i += 1
        Next
        $aMotherboardInfo[0][0] = UBound($aMotherboardInfo) - 1
        If $aMotherboardInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetMotherboard

Func _ComputerGetMouse(ByRef $aMouseInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aMouseInfo[1][31], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PointingDevice", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394356(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aMouseInfo[UBound($aMouseInfo) + 1][31]
            $aMouseInfo[$i][0] = $objItem.Name
            $aMouseInfo[$i][1] = $objItem.Availability
            $aMouseInfo[$i][2] = $objItem.ConfigManagerErrorCode
            $aMouseInfo[$i][3] = $objItem.ConfigManagerUserConfig
            $aMouseInfo[$i][4] = $objItem.Description
            $aMouseInfo[$i][5] = $objItem.CreationClassName
            $aMouseInfo[$i][6] = $objItem.DeviceID
            $aMouseInfo[$i][7] = $objItem.DeviceInterface
            $aMouseInfo[$i][8] = $objItem.DoubleSpeedThreshold
            $aMouseInfo[$i][9] = $objItem.ErrorCleared
            $aMouseInfo[$i][10] = $objItem.ErrorDescription
            $aMouseInfo[$i][11] = $objItem.Handedness
            $aMouseInfo[$i][12] = $objItem.HardwareType
            $aMouseInfo[$i][13] = $objItem.InfFileName
            $aMouseInfo[$i][14] = $objItem.InfSection
            $aMouseInfo[$i][15] = $objItem.IsLocked
            $aMouseInfo[$i][16] = $objItem.LastErrorCode
            $aMouseInfo[$i][17] = $objItem.Manufacturer
            $aMouseInfo[$i][18] = $objItem.NumberOfButtons
            $aMouseInfo[$i][19] = $objItem.PNPDeviceID
            $aMouseInfo[$i][20] = $objItem.PointingType
            $aMouseInfo[$i][21] = $objItem.PowerManagementCapabilities(0)
            $aMouseInfo[$i][22] = $objItem.PowerManagementSupported
            $aMouseInfo[$i][23] = $objItem.QuadSpeedThreshold
            $aMouseInfo[$i][24] = $objItem.Resolution
            $aMouseInfo[$i][25] = $objItem.SampleRate
            $aMouseInfo[$i][26] = $objItem.Status
            $aMouseInfo[$i][27] = $objItem.StatusInfo
            $aMouseInfo[$i][28] = $objItem.Synch
            $aMouseInfo[$i][29] = $objItem.SystemCreationClassName
            $aMouseInfo[$i][30] = $objItem.SystemName
            $i += 1
        Next
        $aMouseInfo[0][0] = UBound($aMouseInfo) - 1
        If $aMouseInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetMouse

Func _ComputerGetNetworkCards(ByRef $aNetworkInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aNetworkInfo[1][34], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394216(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aNetworkInfo[UBound($aNetworkInfo) + 1][34]
            $aNetworkInfo[$i][0] = $objItem.Name
            $aNetworkInfo[$i][1] = $objItem.AdapterType
            $aNetworkInfo[$i][2] = $objItem.AdapterTypeId
            $aNetworkInfo[$i][3] = $objItem.AutoSense
            $aNetworkInfo[$i][4] = $objItem.Description
            $aNetworkInfo[$i][5] = $objItem.Availability
            $aNetworkInfo[$i][6] = $objItem.ConfigManagerErrorCode
            $aNetworkInfo[$i][7] = $objItem.ConfigManagerUserConfig
            $aNetworkInfo[$i][8] = $objItem.CreationClassName
            $aNetworkInfo[$i][9] = $objItem.DeviceID
            $aNetworkInfo[$i][10] = $objItem.ErrorCleared
            $aNetworkInfo[$i][11] = $objItem.ErrorDescription
            $aNetworkInfo[$i][12] = $objItem.Index
            $aNetworkInfo[$i][13] = $objItem.Installed
            $aNetworkInfo[$i][14] = $objItem.LastErrorCode
            $aNetworkInfo[$i][15] = $objItem.MACAddress
            $aNetworkInfo[$i][16] = $objItem.Manufacturer
            $aNetworkInfo[$i][17] = $objItem.MaxNumberControlled
            $aNetworkInfo[$i][18] = $objItem.MaxSpeed
            $aNetworkInfo[$i][19] = $objItem.NetConnectionID
            $aNetworkInfo[$i][20] = $objItem.NetConnectionStatus
            $aNetworkInfo[$i][21] = $objItem.NetworkAddresses(0)
            $aNetworkInfo[$i][22] = $objItem.PermanentAddress
            $aNetworkInfo[$i][23] = $objItem.PNPDeviceID
            $aNetworkInfo[$i][24] = $objItem.PowerManagementCapabilities(0)
            $aNetworkInfo[$i][25] = $objItem.PowerManagementSupported
            $aNetworkInfo[$i][26] = $objItem.ProductName
            $aNetworkInfo[$i][27] = $objItem.ServiceName
            $aNetworkInfo[$i][28] = $objItem.Speed
            $aNetworkInfo[$i][29] = $objItem.Status
            $aNetworkInfo[$i][30] = $objItem.StatusInfo
            $aNetworkInfo[$i][31] = $objItem.SystemCreationClassName
            $aNetworkInfo[$i][32] = $objItem.SystemName
            $aNetworkInfo[$i][33] = __StringToDate($objItem.TimeOfLastReset)
            $i += 1
        Next
        $aNetworkInfo[0][0] = UBound($aNetworkInfo) - 1
        If $aNetworkInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetNetworkCards

Func _ComputerGetProcessors(ByRef $aProcessorInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aProcessorInfo[1][42], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394373(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aProcessorInfo[UBound($aProcessorInfo) + 1][42]
            $aProcessorInfo[$i][0] = StringStripWS($objItem.Name, 1)
            $aProcessorInfo[$i][1] = $objItem.AddressWidth
            $aProcessorInfo[$i][2] = $objItem.Architecture
            $aProcessorInfo[$i][3] = $objItem.Availability
            $aProcessorInfo[$i][4] = $objItem.Description
            $aProcessorInfo[$i][5] = $objItem.ConfigManagerErrorCode
            $aProcessorInfo[$i][6] = $objItem.ConfigManagerUserConfig
            $aProcessorInfo[$i][7] = $objItem.CpuStatus
            $aProcessorInfo[$i][8] = $objItem.CreationClassName
            $aProcessorInfo[$i][9] = $objItem.CurrentClockSpeed
            $aProcessorInfo[$i][10] = $objItem.CurrentVoltage
            $aProcessorInfo[$i][11] = $objItem.DataWidth
            $aProcessorInfo[$i][12] = $objItem.DeviceID
            $aProcessorInfo[$i][13] = $objItem.ErrorCleared
            $aProcessorInfo[$i][14] = $objItem.ErrorDescription
            $aProcessorInfo[$i][15] = $objItem.ExtClock
            $aProcessorInfo[$i][16] = $objItem.Family
            $aProcessorInfo[$i][17] = $objItem.L2CacheSize
            $aProcessorInfo[$i][18] = $objItem.L2CacheSpeed
            $aProcessorInfo[$i][19] = $objItem.LastErrorCode
            $aProcessorInfo[$i][20] = $objItem.Level
            $aProcessorInfo[$i][21] = $objItem.LoadPercentage
            $aProcessorInfo[$i][22] = $objItem.Manufacturer
            $aProcessorInfo[$i][23] = $objItem.MaxClockSpeed
            $aProcessorInfo[$i][24] = $objItem.OtherFamilyDescription
            $aProcessorInfo[$i][25] = $objItem.PNPDeviceID
            $aProcessorInfo[$i][26] = $objItem.PowerManagementCapabilities(0)
            $aProcessorInfo[$i][27] = $objItem.PowerManagementSupported
            $aProcessorInfo[$i][28] = $objItem.ProcessorId
            $aProcessorInfo[$i][29] = $objItem.ProcessorType
            $aProcessorInfo[$i][30] = $objItem.Revision
            $aProcessorInfo[$i][31] = $objItem.Role
            $aProcessorInfo[$i][32] = $objItem.SocketDesignation
            $aProcessorInfo[$i][33] = $objItem.Status
            $aProcessorInfo[$i][34] = $objItem.StatusInfo
            $aProcessorInfo[$i][35] = $objItem.Stepping
            $aProcessorInfo[$i][36] = $objItem.SystemCreationClassName
            $aProcessorInfo[$i][37] = $objItem.SystemName
            $aProcessorInfo[$i][38] = $objItem.UniqueId
            $aProcessorInfo[$i][39] = $objItem.UpgradeMethod
            $aProcessorInfo[$i][40] = $objItem.Version
            $aProcessorInfo[$i][41] = $objItem.VoltageCaps
            $i += 1
        Next
        $aProcessorInfo[0][0] = UBound($aProcessorInfo) - 1
        If $aProcessorInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetProcessors

Func _ComputerGetSoundCards(ByRef $aSoundCardInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aSoundCardInfo[1][21], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_SoundDevice", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394463(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aSoundCardInfo[UBound($aSoundCardInfo) + 1][21]
            $aSoundCardInfo[$i][0] = $objItem.Name
            $aSoundCardInfo[$i][1] = $objItem.Availability
            $aSoundCardInfo[$i][2] = $objItem.ConfigManagerErrorCode
            $aSoundCardInfo[$i][3] = $objItem.ConfigManagerUserConfig
            $aSoundCardInfo[$i][4] = $objItem.Description
            $aSoundCardInfo[$i][5] = $objItem.CreationClassName
            $aSoundCardInfo[$i][6] = $objItem.DeviceID
            $aSoundCardInfo[$i][7] = $objItem.DMABufferSize
            $aSoundCardInfo[$i][8] = $objItem.ErrorCleared
            $aSoundCardInfo[$i][9] = $objItem.ErrorDescription
            $aSoundCardInfo[$i][10] = $objItem.LastErrorCode
            $aSoundCardInfo[$i][11] = $objItem.Manufacturer
            $aSoundCardInfo[$i][12] = $objItem.MPU401Address
            $aSoundCardInfo[$i][13] = $objItem.PNPDeviceID
            $aSoundCardInfo[$i][14] = $objItem.PowerManagementCapabilities(0)
            $aSoundCardInfo[$i][15] = $objItem.PowerManagementSupported
            $aSoundCardInfo[$i][16] = $objItem.ProductName
            $aSoundCardInfo[$i][17] = $objItem.Status
            $aSoundCardInfo[$i][18] = $objItem.StatusInfo
            $aSoundCardInfo[$i][19] = $objItem.SystemCreationClassName
            $aSoundCardInfo[$i][20] = $objItem.SystemName
            $i += 1
        Next
        $aSoundCardInfo[0][0] = UBound($aSoundCardInfo) - 1
        If $aSoundCardInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetSoundCards

Func _ComputerGetVideoCards(ByRef $aVideoInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aVideoInfo[1][59], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_VideoController", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394512(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aVideoInfo[UBound($aVideoInfo) + 1][59]
            $aVideoInfo[$i][0] = $objItem.Name
            $aVideoInfo[$i][1] = $objItem.AcceleratorCapabilities(0)
            $aVideoInfo[$i][2] = $objItem.AdapterCompatibility
            $aVideoInfo[$i][3] = $objItem.AdapterDACType
            $aVideoInfo[$i][4] = $objItem.Description
            $aVideoInfo[$i][5] = $objItem.AdapterRAM
            $aVideoInfo[$i][6] = $objItem.Availability
            $aVideoInfo[$i][7] = $objItem.CapabilityDescriptions(0)
            $aVideoInfo[$i][8] = $objItem.ColorTableEntries
            $aVideoInfo[$i][9] = $objItem.ConfigManagerErrorCode
            $aVideoInfo[$i][10] = $objItem.ConfigManagerUserConfig
            $aVideoInfo[$i][11] = $objItem.CreationClassName
            $aVideoInfo[$i][12] = $objItem.CurrentBitsPerPixel
            $aVideoInfo[$i][13] = $objItem.CurrentHorizontalResolution
            $aVideoInfo[$i][14] = $objItem.CurrentNumberOfColors
            $aVideoInfo[$i][15] = $objItem.CurrentNumberOfColumns
            $aVideoInfo[$i][16] = $objItem.CurrentNumberOfRows
            $aVideoInfo[$i][17] = $objItem.CurrentRefreshRate
            $aVideoInfo[$i][18] = $objItem.CurrentScanMode
            $aVideoInfo[$i][19] = $objItem.CurrentVerticalResolution
            $aVideoInfo[$i][20] = $objItem.DeviceID
            $aVideoInfo[$i][21] = $objItem.DeviceSpecificPens
            $aVideoInfo[$i][22] = $objItem.DitherType
            $aVideoInfo[$i][23] = __StringToDate($objItem.DriverDate)
            $aVideoInfo[$i][24] = $objItem.DriverVersion
            $aVideoInfo[$i][25] = $objItem.ErrorCleared
            $aVideoInfo[$i][26] = $objItem.ErrorDescription
            $aVideoInfo[$i][27] = $objItem.ICMIntent
            $aVideoInfo[$i][28] = $objItem.ICMMethod
            $aVideoInfo[$i][29] = $objItem.InfFilename
            $aVideoInfo[$i][30] = $objItem.InfSection
            $aVideoInfo[$i][31] = $objItem.InstalledDisplayDrivers
            $aVideoInfo[$i][32] = $objItem.LastErrorCode
            $aVideoInfo[$i][33] = $objItem.MaxMemorySupported
            $aVideoInfo[$i][34] = $objItem.MaxNumberControlled
            $aVideoInfo[$i][35] = $objItem.MaxRefreshRate
            $aVideoInfo[$i][36] = $objItem.MinRefreshRate
            $aVideoInfo[$i][37] = $objItem.Monochrome
            $aVideoInfo[$i][38] = $objItem.NumberOfColorPlanes
            $aVideoInfo[$i][39] = $objItem.NumberOfVideoPages
            $aVideoInfo[$i][40] = $objItem.PNPDeviceID
            $aVideoInfo[$i][41] = $objItem.PowerManagementCapabilities(0)
            $aVideoInfo[$i][42] = $objItem.PowerManagementSupported
            $aVideoInfo[$i][43] = $objItem.ProtocolSupported
            $aVideoInfo[$i][44] = $objItem.ReservedSystemPaletteEntries
            $aVideoInfo[$i][45] = $objItem.SpecificationVersion
            $aVideoInfo[$i][46] = $objItem.Status
            $aVideoInfo[$i][47] = $objItem.StatusInfo
            $aVideoInfo[$i][48] = $objItem.SystemCreationClassName
            $aVideoInfo[$i][49] = $objItem.SystemName
            $aVideoInfo[$i][50] = $objItem.SystemPaletteEntries
            $aVideoInfo[$i][51] = __StringToDate($objItem.TimeOfLastReset)
            $aVideoInfo[$i][52] = $objItem.VideoArchitecture
            $aVideoInfo[$i][53] = $objItem.VideoMemoryType
            $aVideoInfo[$i][54] = $objItem.VideoMode
            $aVideoInfo[$i][55] = $objItem.VideoModeDescription
            $aVideoInfo[$i][56] = $objItem.VideoProcessor
            $i += 1
        Next
        $aVideoInfo[0][0] = UBound($aVideoInfo) - 1
        If $aVideoInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetVideoCards

Func _ComputerGetBIOS(ByRef $aBIOSInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aBIOSInfo[1][25], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394077(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aBIOSInfo[UBound($aBIOSInfo) + 1][25]
            $aBIOSInfo[$i][0] = $objItem.Name
            $aBIOSInfo[$i][1] = $objItem.Status
            $aBIOSInfo[$i][2] = $objItem.BiosCharacteristics(0)
            $aBIOSInfo[$i][3] = $objItem.BIOSVersion(0)
            $aBIOSInfo[$i][4] = $objItem.Description
            $aBIOSInfo[$i][5] = $objItem.BuildNumber
            $aBIOSInfo[$i][6] = $objItem.CodeSet
            $aBIOSInfo[$i][7] = $objItem.CurrentLanguage
            $aBIOSInfo[$i][8] = $objItem.IdentificationCode
            $aBIOSInfo[$i][9] = $objItem.InstallableLanguages
            $aBIOSInfo[$i][10] = $objItem.LanguageEdition
            $aBIOSInfo[$i][11] = $objItem.ListOfLanguages(0)
            $aBIOSInfo[$i][12] = $objItem.Manufacturer
            $aBIOSInfo[$i][13] = $objItem.OtherTargetOS
            $aBIOSInfo[$i][14] = $objItem.PrimaryBIOS
            $aBIOSInfo[$i][16] = $objItem.SerialNumber
            $aBIOSInfo[$i][17] = $objItem.SMBIOSBIOSVersion
            $aBIOSInfo[$i][18] = $objItem.SMBIOSMajorVersion
            $aBIOSInfo[$i][19] = $objItem.SMBIOSMinorVersion
            $aBIOSInfo[$i][20] = $objItem.SMBIOSPresent
            $aBIOSInfo[$i][21] = $objItem.SoftwareElementID
            $aBIOSInfo[$i][22] = $objItem.SoftwareElementState
            $aBIOSInfo[$i][23] = $objItem.TargetOperatingSystem
            $aBIOSInfo[$i][24] = $objItem.Version
            $i += 1
        Next
        $aBIOSInfo[0][0] = UBound($aBIOSInfo) - 1
        If $aBIOSInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
    Return ($aBIOSInfo[1][16])
EndFunc   ;==>_ComputerGetBIOS

Func _ComputerGetSystem(ByRef $aSystemInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aSystemInfo[1][52], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394102(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aSystemInfo[UBound($aSystemInfo) + 1][52]
            $aSystemInfo[$i][0] = $objItem.Name
            $aSystemInfo[$i][1] = $objItem.AdminPasswordStatus
            $aSystemInfo[$i][2] = $objItem.AutomaticResetBootOption
            $aSystemInfo[$i][3] = $objItem.AutomaticResetCapability
            $aSystemInfo[$i][4] = $objItem.Description
            $aSystemInfo[$i][5] = $objItem.BootOptionOnLimit
            $aSystemInfo[$i][6] = $objItem.BootOptionOnWatchDog
            $aSystemInfo[$i][7] = $objItem.BootROMSupported
            $aSystemInfo[$i][8] = $objItem.BootupState
            $aSystemInfo[$i][9] = $objItem.ChassisBootupState
            $aSystemInfo[$i][10] = $objItem.CreationClassName
            $aSystemInfo[$i][11] = $objItem.CurrentTimeZone
            $aSystemInfo[$i][12] = $objItem.DaylightInEffect
            $aSystemInfo[$i][13] = $objItem.Domain
            $aSystemInfo[$i][14] = $objItem.DomainRole
            $aSystemInfo[$i][15] = $objItem.EnableDaylightSavingsTime
            $aSystemInfo[$i][16] = $objItem.FrontPanelResetStatus
            $aSystemInfo[$i][17] = $objItem.InfraredSupported
            $aSystemInfo[$i][18] = $objItem.InitialLoadInfo(0)
            $aSystemInfo[$i][19] = $objItem.KeyboardPasswordStatus
            $aSystemInfo[$i][20] = $objItem.LastLoadInfo
            $aSystemInfo[$i][21] = $objItem.Manufacturer
            $aSystemInfo[$i][22] = $objItem.Model
            $aSystemInfo[$i][23] = $objItem.NameFormat
            $aSystemInfo[$i][24] = $objItem.NetworkServerModeEnabled
            $aSystemInfo[$i][25] = $objItem.NumberOfProcessors
            $aSystemInfo[$i][26] = $objItem.OEMLogoBitmap(0)
            $aSystemInfo[$i][27] = $objItem.OEMStringArray(0)
            $aSystemInfo[$i][28] = $objItem.PartOfDomain
            $aSystemInfo[$i][29] = $objItem.PauseAfterReset
            $aSystemInfo[$i][30] = $objItem.PowerManagementCapabilities(0)
            $aSystemInfo[$i][31] = $objItem.PowerManagementSupported
            $aSystemInfo[$i][32] = $objItem.PowerOnPasswordStatus
            $aSystemInfo[$i][33] = $objItem.PowerState
            $aSystemInfo[$i][34] = $objItem.PowerSupplyState
            $aSystemInfo[$i][35] = $objItem.PrimaryOwnerContact
            $aSystemInfo[$i][36] = $objItem.PrimaryOwnerName
            $aSystemInfo[$i][37] = $objItem.ResetCapability
            $aSystemInfo[$i][38] = $objItem.ResetCount
            $aSystemInfo[$i][39] = $objItem.ResetLimit
            $aSystemInfo[$i][40] = $objItem.Roles(0)
            $aSystemInfo[$i][41] = $objItem.Status
            $aSystemInfo[$i][42] = $objItem.SupportContactDescription(0)
            $aSystemInfo[$i][43] = $objItem.SystemStartupDelay
            $aSystemInfo[$i][44] = $objItem.SystemStartupOptions(0)
            $aSystemInfo[$i][45] = $objItem.SystemStartupSetting
            $aSystemInfo[$i][46] = $objItem.SystemType
            $aSystemInfo[$i][47] = $objItem.ThermalState
            $aSystemInfo[$i][48] = $objItem.TotalPhysicalMemory
            $aSystemInfo[$i][49] = $objItem.UserName
            $aSystemInfo[$i][50] = $objItem.WakeUpType
            $aSystemInfo[$i][51] = $objItem.Workgroup
            $i += 1
        Next
        $aSystemInfo[0][0] = UBound($aSystemInfo) - 1
        If $aSystemInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetSystem

Func _ComputerGetOSs(ByRef $aOSInfo)
    Local $colItems, $objWMIService, $objItem
    Dim $aOSInfo[1][60], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    $MSDNLink = "http://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx"

    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aOSInfo[UBound($aOSInfo) + 1][60]
            $aOSInfo[$i][0] = $objItem.Name
            $aOSInfo[$i][1] = $objItem.BootDevice
            $aOSInfo[$i][2] = $objItem.BuildNumber
            $aOSInfo[$i][3] = $objItem.BuildType
            $aOSInfo[$i][4] = $objItem.Description
            $aOSInfo[$i][5] = $objItem.CodeSet
            $aOSInfo[$i][6] = $objItem.CountryCode
            $aOSInfo[$i][7] = $objItem.CreationClassName
            $aOSInfo[$i][8] = $objItem.CSCreationClassName
            $aOSInfo[$i][9] = $objItem.CSDVersion
            $aOSInfo[$i][10] = $objItem.CSName
            $aOSInfo[$i][11] = $objItem.CurrentTimeZone
            $aOSInfo[$i][12] = $objItem.DataExecutionPrevention_32BitApplications
            $aOSInfo[$i][13] = $objItem.DataExecutionPrevention_Available
            $aOSInfo[$i][14] = $objItem.DataExecutionPrevention_Drivers
            $aOSInfo[$i][15] = $objItem.DataExecutionPrevention_SupportPolicy
            $aOSInfo[$i][16] = $objItem.Debug
            $aOSInfo[$i][17] = $objItem.Distributed
            $aOSInfo[$i][18] = $objItem.EncryptionLevel
            $aOSInfo[$i][19] = $objItem.ForegroundApplicationBoost
            $aOSInfo[$i][20] = $objItem.FreePhysicalMemory
            $aOSInfo[$i][21] = $objItem.FreeSpaceInPagingFiles
            $aOSInfo[$i][22] = $objItem.FreeVirtualMemory
            $aOSInfo[$i][23] = __StringToDate($objItem.InstallDate)
            $aOSInfo[$i][24] = $objItem.LargeSystemCache
            $aOSInfo[$i][25] = __StringToDate($objItem.LastBootUpTime)
            $aOSInfo[$i][26] = __StringToDate($objItem.LocalDateTime)
            $aOSInfo[$i][27] = $objItem.Locale
            $aOSInfo[$i][28] = $objItem.Manufacturer
            $aOSInfo[$i][29] = $objItem.MaxNumberOfProcesses
            $aOSInfo[$i][30] = $objItem.MaxProcessMemorySize
            $aOSInfo[$i][31] = $objItem.NumberOfLicensedUsers
            $aOSInfo[$i][32] = $objItem.NumberOfProcesses
            $aOSInfo[$i][33] = $objItem.NumberOfUsers
            $aOSInfo[$i][34] = $objItem.Organization
            $aOSInfo[$i][35] = $objItem.OSLanguage
            $aOSInfo[$i][36] = $objItem.OSProductSuite
            $aOSInfo[$i][37] = $objItem.OSType
            $aOSInfo[$i][38] = $objItem.OtherTypeDescription
            $aOSInfo[$i][39] = $objItem.PlusProductID
            $aOSInfo[$i][40] = $objItem.PlusVersionNumber
            $aOSInfo[$i][41] = $objItem.Primary
            $aOSInfo[$i][42] = $objItem.ProductType
            $aOSInfo[$i][43] = '';$objItem.QuantumLength
            $aOSInfo[$i][44] = '';$objItem.QuantumType
            $aOSInfo[$i][45] = $objItem.RegisteredUser
            $aOSInfo[$i][46] = $objItem.SerialNumber
            $aOSInfo[$i][47] = $objItem.ServicePackMajorVersion
            $aOSInfo[$i][48] = $objItem.ServicePackMinorVersion
            $aOSInfo[$i][49] = $objItem.SizeStoredInPagingFiles
            $aOSInfo[$i][50] = $objItem.Status
            $aOSInfo[$i][51] = $objItem.SuiteMask
            $aOSInfo[$i][52] = $objItem.SystemDevice
            $aOSInfo[$i][53] = $objItem.SystemDirectory
            $aOSInfo[$i][54] = $objItem.SystemDrive
            $aOSInfo[$i][55] = $objItem.TotalSwapSpaceSize
            $aOSInfo[$i][56] = $objItem.TotalVirtualMemorySize
            $aOSInfo[$i][57] = $objItem.TotalVisibleMemorySize
            $aOSInfo[$i][58] = $objItem.Version
            $aOSInfo[$i][59] = $objItem.WindowsDirectory
            $i += 1
        Next
        $aOSInfo[0][0] = UBound($aOSInfo) - 1
        If $aOSInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>_ComputerGetOSs
#endregion - Computer Get -
#region - Network Traffic -
Func _UpdateStats()

    Local $aEnd_Values, $iRecived, $iSent, $sNew_Label, $iLargest_Value

    $aEnd_Values = _GetAllTraffic()
    $iRecived = $aEnd_Values[0] - $aStart_Values[0]
    $iSent = $aEnd_Values[1] - $aStart_Values[1]

    If Not ($iRecived + $iSent) Then ; No Activity
        Local $sZero = 'DL: 0.0 kB/sec  UL: 0.0 kB/sec'
        If $sLast_Label <> $sZero Then GUICtrlSetData($NetSpeed, $sZero)
        $aStart_Values = $aEnd_Values
        $sLast_Label = $sZero
        Return
    EndIf

    If $iRecived >= 1048576 Then
        $sDL_Label = 'DL: ' & StringFormat('%.2f', Round($iRecived / 1048576, 2)) & ' mB/sec  '
    Else
        $sDL_Label = 'DL: ' & StringFormat('%.1f', Round($iRecived / 1024, 1)) & ' kB/sec  '
    EndIf

    If $iSent >= 1048576 Then
        $sUL_Label = 'UL: ' & StringFormat('%.2f', Round($iSent / 1048576, 2)) & ' mB/sec  '
    Else
        $sUL_Label = 'UL: ' & StringFormat('%.1f', Round($iSent / 1024, 1)) & ' kB/sec  '
    EndIf

    $sNew_Label = $sDL_Label & $sUL_Label
    If $sNew_Label <> $sLast_Label Then GUICtrlSetData($NetSpeed, $sNew_Label)

    $sLast_Label = $sNew_Label
    $aStart_Values = $aEnd_Values

EndFunc   ;==>_UpdateStats

Func _GetAllTraffic()

    Local $Total_Values[2], $Adapter_Values
    Local $ifcount = _GetNumberofInterfaces()

    If $Global_IF_Count <> $ifcount Then
        $Global_IF_Count = $ifcount
        $Table_Data = _WinAPI_GetIfTable()
        $aStart_Values = _GetAllTraffic()
    EndIf

    If IsArray($Table_Data) Then
        For $i = 1 To $Table_Data[0][0]
            $Adapter_Values = _WinAPI_GetIfEntry($Table_Data[$i][1])
            If IsArray($Adapter_Values) Then
                $Total_Values[0] += $Adapter_Values[0];Recived
                $Total_Values[1] += $Adapter_Values[1];Sent
            Else
                $Table_Data = _WinAPI_GetIfTable()
            EndIf
        Next
    EndIf

    Return $Total_Values

EndFunc   ;==>_GetAllTraffic

Func _WinAPI_GetIfEntry($iIndex)

    Local $Ret, $Stats[2]
    Static $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)

    DllStructSetData($tMIB_IFROW, 2, $iIndex)

    $Ret = DllCall($IPHlpApi_Dll, 'dword', 'GetIfEntry', 'ptr', DllStructGetPtr($tMIB_IFROW))
    If (@error) Or ($Ret[0]) Then Return SetError($Ret[0], 0, 0)

    $Stats[0] = DllStructGetData($tMIB_IFROW, 'InOctets');Recived
    $Stats[1] = DllStructGetData($tMIB_IFROW, 'OutOctets');Sent

    Return $Stats

EndFunc   ;==>_WinAPI_GetIfEntry

Func _GetNumberofInterfaces()
    Local $Adaptor_Count = DllCall($IPHlpApi_Dll, 'int', 'GetNumberOfInterfaces', 'dword*', 0)
    Return $Adaptor_Count[1]
EndFunc   ;==>_GetNumberofInterfaces

Func _WinAPI_GetIfTable($iType = 0)

    Local $Ret, $Row, $Type, $Tag, $Tab, $Addr, $Count, $Lenght, $tMIB_IFTABLE
    Local $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)

    $Row = 'byte[' & DllStructGetSize($tMIB_IFROW) & ']'
    $Tag = 'dword;'
    For $i = 1 To 32
        $Tag &= $Row & ';'
    Next
    $tMIB_IFTABLE = DllStructCreate($Tag)
    $Ret = DllCall($IPHlpApi_Dll, 'dword', 'GetIfTable', 'ptr', DllStructGetPtr($tMIB_IFTABLE), 'long*', DllStructGetSize($tMIB_IFTABLE), 'int', 1)
    If (@error) Or ($Ret[0]) Then Return SetError($Ret[0], 0, 0)

    $Count = DllStructGetData($tMIB_IFTABLE, 1)
    Dim $Tab[$Count + 1][20]
    $Tab[0][0] = 0
    $Tab[0][1] = 'Index'
    $Tab[0][2] = 'Type'
    $Tab[0][3] = 'Mtu'
    $Tab[0][4] = 'Speed'
    $Tab[0][5] = 'Address'
    $Tab[0][6] = 'AdminStatus'
    $Tab[0][7] = 'OperStatus'
    $Tab[0][8] = 'InOctets'
    $Tab[0][9] = 'InUcastPkts'
    $Tab[0][10] = 'InNUcastPkts'
    $Tab[0][11] = 'InDiscards'
    $Tab[0][12] = 'InErrors'
    $Tab[0][13] = 'InUnknownProtos'
    $Tab[0][14] = 'OutOctets'
    $Tab[0][15] = 'OutUcastPkts'
    $Tab[0][16] = 'OutNUcastPkts'
    $Tab[0][17] = 'OutDiscards'
    $Tab[0][18] = 'OutErrors'

    For $i = 1 To $Count
        $tMIB_IFROW = DllStructCreate($tagMIB_IFROW, DllStructGetPtr($tMIB_IFTABLE, $i + 1))
        $Type = DllStructGetData($tMIB_IFROW, 'Type')
        If $Type <> $MIB_IF_TYPE_SOFTWARE_LOOPBACK Then
            $Tab[0][0] += 1

            $Lenght = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
            $Addr = ''
            For $j = 1 To $Lenght
                $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $j), 2) & '-'
            Next
            $Addr = StringTrimRight($Addr, 1)

            _ArraySearch($Tab, $Addr, 1, $Tab[0][0] - 1, 1, 0, 1, 5)
            If @error <> 6 Or $Addr = '' Or StringLen($Addr) > 17 Then
                $Tab[0][0] -= 1
                ContinueLoop
            EndIf

            $Tab[$Tab[0][0]][0] = DllStructGetData($tMIB_IFROW, 'Name')
            $Tab[$Tab[0][0]][1] = DllStructGetData($tMIB_IFROW, 'Index')
            $Tab[$Tab[0][0]][2] = $Type
            $Tab[$Tab[0][0]][3] = DllStructGetData($tMIB_IFROW, 'Mtu')
            $Tab[$Tab[0][0]][4] = DllStructGetData($tMIB_IFROW, 'Speed')
            $Tab[$Tab[0][0]][5] = $Addr
            $Tab[$Tab[0][0]][6] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
            $Tab[$Tab[0][0]][7] = DllStructGetData($tMIB_IFROW, 'OperStatus')
            $Tab[$Tab[0][0]][8] = DllStructGetData($tMIB_IFROW, 'InOctets')
            $Tab[$Tab[0][0]][9] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
            $Tab[$Tab[0][0]][10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
            $Tab[$Tab[0][0]][11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
            $Tab[$Tab[0][0]][12] = DllStructGetData($tMIB_IFROW, 'InErrors')
            $Tab[$Tab[0][0]][13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
            $Tab[$Tab[0][0]][14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
            $Tab[$Tab[0][0]][15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
            $Tab[$Tab[0][0]][16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
            $Tab[$Tab[0][0]][17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
            $Tab[$Tab[0][0]][18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
            $Tab[$Tab[0][0]][19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
        EndIf
    Next

    If $Tab[0][0] < $Count Then ReDim $Tab[$Tab[0][0] + 1][20]

    Return $Tab
EndFunc   ;==>_WinAPI_GetIfTable
#endregion - Network Traffic -
#region - Marquee -
Func _GUICtrlMarquee_SetScroll($iLoop = 0, $sMove = 'scroll', $sDirection = 'left', $iScroll = 6, $iDelay = 85)

    If IsNumber($iLoop) Then $iMarquee_Loop = Int(Abs($iLoop))

    Switch $sMove
        Case 'alternate', 'slide'
            $sMarquee_Move = $sMove
        Case Else
            $sMarquee_Move = 'scroll'
    EndSwitch

    Switch $sDirection
        Case 'right', 'up', 'down'
            $sMarquee_Direction = $sDirection
        Case Else
            $sMarquee_Direction = 'left'
    EndSwitch

    If IsNumber($iScroll) Then $iMarquee_Scroll = Int(Abs($iScroll))

    If IsNumber($iDelay) Then $iMarquee_Delay = Int(Abs($iDelay))

EndFunc   ;==>_GUICtrlMarquee_SetScroll

Func _GUICtrlMarquee_SetDisplay($iBorder = Default, $vTxtCol = Default, $vBkCol = Default, $iPoint = Default, $sFont = Default)
    Select
        Case $iBorder = Default
            $iMarquee_Border = 0
        Case $iBorder >= 0 And $iBorder <= 3
            $iMarquee_Border = Int(Abs($iBorder))
        Case Else
    EndSelect

    Select
        Case $vTxtCol = Default
            $vMarquee_TxtCol = _WinAPI_GetSysColor($COLOR_WINDOWTEXT)
        Case IsNumber($vTxtCol) = 1
            If $vTxtCol >= 0 And $vTxtCol <= 0xFFFFFF Then $vMarquee_TxtCol = Int($vTxtCol)
        Case Else
            $vMarquee_TxtCol = $vTxtCol
    EndSelect

    Select
        Case $vBkCol = Default
            $sMarquee_BkCol = _WinAPI_GetSysColor($COLOR_WINDOW)
        Case IsNumber($vBkCol) = 1
            If $vBkCol >= 0 And $vBkCol <= 0xFFFFFF Then $sMarquee_BkCol = Int($vBkCol)
        Case Else
            $sMarquee_BkCol = $vBkCol
    EndSelect

    Select
        Case $iPoint = Default
            $iMarquee_FontSize = 12
        Case $iPoint = -1
        Case Else
            If IsNumber($iPoint) Then $iMarquee_FontSize = Int(Abs($iPoint / .75))
    EndSelect

    Select
        Case $sFont = Default
            $sMarquee_FontFamily = "Tahoma"
        Case $sFont = ""
        Case Else
            If IsString($sFont) Then $sMarquee_FontFamily = $sFont
    EndSelect

EndFunc   ;==>_GUICtrlMarquee_SetDisplay

Func _GUICtrlMarquee_Create($sText, $iLeft, $iTop, $iWidth, $iHeight, $sTipText = "")
    Local $oShell, $iCtrlID
    Local $iMarquee_BackgroundLink = @TempDir & "\bg.bmp"

    $oShell = ObjCreate("Shell.Explorer.2")
    If Not IsObj($oShell) Then Return SetError(1, 0, -1)

    $iCtrlID = GUICtrlCreateObj($oShell, $iLeft, $iTop, $iWidth, $iHeight)

    $oShell.navigate("about:blank")
    While $oShell.busy
        Sleep(100)
    WEnd

    With $oShell.document
        .write('<style>marquee{cursor: default}></style>')
        .write('<body background=' & $iMarquee_BackgroundLink & ' onselectstart="return false" oncontextmenu="return false" ondragstart="return false" ondragover="return false">')
        .writeln('<marquee width=100% height=100%')
        .writeln("loop=" & $iMarquee_Loop)
        .writeln("behavior=" & $sMarquee_Move)
        .writeln("direction=" & $sMarquee_Direction)
        .writeln("scrollamount=" & $iMarquee_Scroll)
        .writeln("scrolldelay=" & $iMarquee_Delay)
        .write(">")
        .write($sText)
        .body.title = $sTipText
        .body.topmargin = 0
        .body.leftmargin = 0
        .body.scroll = "no"
        .body.style.color = 0x0000FF
        .body.bgcolor = $sMarquee_BkCol
        .body.style.borderWidth = $iMarquee_Border
        .body.style.fontFamily = $sMarquee_FontFamily
        .body.style.fontSize = $iMarquee_FontSize
    EndWith

    Return $iCtrlID

EndFunc   ;==>_GUICtrlMarquee_Create
#endregion - Marquee -
#region - Take Ownership -
Func TakeOwn($oName, $T)
    Local $_TRUSTEE_TYPE = 1
    Local $AccessMode
    Local $_EXPLICIT_ACCESS
    Local $GENERIC_ALL = 0x10000000
    Local $SE_FILE_OBJECT = 1
    Local $ACL_REVISION = 2
    $_EXPLICIT_ACCESS = DllStructCreate('DWORD;DWORD;DWORD;ptr;DWORD;DWORD;DWORD;ptr')
    Local $tData = DllStructCreate("byte SID[256]")
    Local $pSID = DllStructGetPtr($tData, "SID")
    Local $aResult = DllCall($hADVAPI32, "bool", "LookupAccountNameW", "wstr", '', "wstr", @UserName, "ptr", $pSID, "dword*", 256, _
            "wstr", "", "dword*", 256, "int*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Local $aResult = DllCall($hADVAPI32, "bool", "IsValidSid", "ptr", $pSID)
    If @error Or Not $aResult[0] Then Return SetError(@error, @extended, False)
    Local $aResult = DllCall($hADVAPI32, "int", "ConvertSidToStringSidW", "ptr", $pSID, "ptr*", 0)
    If @error Then Return SetError(@error, @extended, "")
    If Not $aResult[0] Then Return ""
    Local $tBuffer = DllStructCreate("wchar Text[256]", $aResult[2])
    Local $sSID = DllStructGetData($tBuffer, "Text")
    DllCall($hKERNEL32, "ptr", "LocalFree", "ptr", $aResult[2])
    Local $aResult = DllCall($hADVAPI32, "bool", "ConvertStringSidToSidW", "wstr", $sSID, "ptr*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    If Not $aResult[0] Then Return 0
    Local $aResult2 = DllCall($hADVAPI32, "dword", "GetLengthSid", "ptr", $aResult[2])
    If @error Then Return SetError(@error, @extended, 0)
    Local $iSize = $aResult2[0]
    Local $tBuffer = DllStructCreate("byte Data[" & $iSize & "]", $aResult[2])
    Local $tSID = DllStructCreate("byte Data[" & $iSize & "]")
    DllStructSetData($tSID, "Data", DllStructGetData($tBuffer, "Data"))
    DllCall($hKERNEL32, "ptr", "LocalFree", "ptr", $aResult[2])
    $UserName = $tSID
    $sUserName = DllStructGetPtr($UserName)
    DllStructSetData($_EXPLICIT_ACCESS, 1, $GENERIC_ALL);grfAccessPermissions
    If Not $T Then
        $AccessMode = 3
    Else
        $AccessMode = 2
    EndIf
    DllStructSetData($_EXPLICIT_ACCESS, 2, $AccessMode);grfAccessMode
    DllStructSetData($_EXPLICIT_ACCESS, 3, 3);grfInheritance
    DllStructSetData($_EXPLICIT_ACCESS, 6, 0);TrusteeForm = $TRUSTEE_IS_SID = 0
    Local $aCall = DllCall($hADVAPI32, 'BOOL', 'LookupAccountSid', 'ptr', 0, 'ptr', $sUserName, 'ptr*', 0, 'dword*', 32, 'ptr*', 0, 'dword*', 32, 'dword*', 0)
    If Not @error Then $_TRUSTEE_TYPE = $aCall[7]
    DllStructSetData($_EXPLICIT_ACCESS, 7, $_TRUSTEE_TYPE);TrusteeType
    DllStructSetData($_EXPLICIT_ACCESS, 8, $sUserName);Pointer to the SID
    Local $p_EXPLICIT_ACCESS = DllStructGetPtr($_EXPLICIT_ACCESS)
    $aCall = DllCall($hADVAPI32, 'DWORD', 'SetEntriesInAcl', 'ULONG', 1, 'ptr', $p_EXPLICIT_ACCESS, 'ptr', 0, 'ptr*', 0)
    If @error Or $aCall[0] Then Return SetError(1, 0, 0)
    Local $DACL = $aCall[4]
    Local $SECURITY_INFORMATION = 4, $pOwner = 0
    $SetOwner = $UserName
    $pOwner = DllStructGetPtr($SetOwner)
    Local $aResult = DllCall($hADVAPI32, "bool", "IsValidSid", "ptr", $pOwner)
    If @error Or Not $aResult[0] Then Return SetError(1, 0, 0)
    If $pOwner Then
        $SECURITY_INFORMATION = 5
    Else
        $pOwner = 0
    EndIf
    Local $Ret, $Name
    Local $Buffer = DllStructCreate('byte[32]'), $aRet
    DllCall($hADVAPI32, 'bool', 'InitializeAcl', 'Ptr', DllStructGetPtr($Buffer, 1), 'dword', DllStructGetSize($Buffer), 'dword', $ACL_REVISION)
    DllCall($hADVAPI32, 'DWORD', 'SetNamedSecurityInfo', 'str', $oName, 'dword', $SE_FILE_OBJECT, 'DWORD', 4, 'ptr', 0, 'ptr', 0, 'ptr', 0, 'ptr', 0)
    $aRet = DllCall($hADVAPI32, 'DWORD', 'SetNamedSecurityInfo', 'str', $oName, 'dword', $SE_FILE_OBJECT, 'DWORD', 4, 'ptr', 0, 'ptr', 0, 'ptr', DllStructGetPtr($Buffer, 1), 'ptr', 0)
    If @error Then Return SetError(@error, 0, 0)
    $aCall = DllCall($hADVAPI32, 'dword', 'SetNamedSecurityInfo', 'str', $oName, 'dword', $SE_FILE_OBJECT, _
            'dword', $SECURITY_INFORMATION, 'ptr', $pOwner, 'ptr', 0, 'ptr', $DACL, 'ptr', 0)
    If @error Then Return SetError(1, 0, 0)
    Return SetError(0, 0, 0)
EndFunc   ;==>TakeOwn
Func AdjustPrivilege($Type)
    Local $aReturn = DllCall("ntdll.dll", "int", "RtlAdjustPrivilege", "int", $Type, "int", 1, "int", 0, "int*", 0)
    If @error Or $aReturn[0] Then Return SetError(1, 0, 0)
    Return SetError(0, 0, 1)
EndFunc   ;==>AdjustPrivilege
#endregion - Take Ownership -
#region - Internal Functions -
Func DateTime()
    $Time = _NowTime()
    $Date = _NowDate()
EndFunc   ;==>DateTime
Func Recycle()
    $Before = DriveSpaceFree(@HomeDrive)
    $Timer = TimerInit()
    ProgressOn("Temp File Cleaner", "Deleting Temp Files")
    ProgressSet(5, "Emptying Recycle Bin")
    FileRecycleEmpty()
    ProgressSet(13, "Emptying Temp Folder")
    FileSetAttrib(@WindowsDir & "\Temp\*", "-RASHOT", 1)
    FileDelete(@WindowsDir & "\Temp\*")
    ProgressSet(28, "Clearing Windows Defender")
    FileSetAttrib(@AppDataCommonDir & "\Microsoft\Windows Defender\Scans\History\Results\Resource\*", "-RASHOT", 1)
    FileDelete(@AppDataCommonDir & "\Microsoft\Windows Defender\Scans\History\Results\Resource\*")
    FileSetAttrib(@UserProfileDir & "\Appdata\Local\Microsoft\Windows\Temporary Internet Files\*", "-RASHOT", 1)
    ProgressSet(43, "Clearing Internet Files")
    FileDelete(@UserProfileDir & "\Appdata\Local\Microsoft\Windows\Temporary Internet Files\")
    FileSetAttrib(@UserProfileDir & "\Appdata\Local\Mozilla\Firefox\Profiles\*\cache\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\Appdata\Local\Mozilla\Firefox\Profiles\*\cache\*")
    FileSetAttrib(@UserProfileDir & "\Local Settings\Temporary Internet Files\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\Local Settings\Temporary Internet Files\*")
    FileSetAttrib(@UserProfileDir & "\AppData\Local\Google\Chrome\User Data\Default\Cache\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\AppData\Local\Google\Chrome\User Data\Default\Cache\*")
    FileSetAttrib(@UserProfileDir & "\Cookies\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\Cookies\*")
    ProgressSet(54, "Clearing History")
    FileSetAttrib(@UserProfileDir & "\Local Settings\History\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\Local Settings\History\*")
    FileSetAttrib(@UserProfileDir & "\Appdata\Local\Microsoft\Windows\History\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\Appdata\Local\Microsoft\Windows\History\*")
    FileSetAttrib(@UserProfileDir & "\Appdata\index.dat", "-RASHOT")
    FileDelete(@UserProfileDir & "\Appdata\index.dat")
    FileSetAttrib(@UserProfileDir & "\AppData\Local\Temp\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\AppData\Local\Temp\*")
    ProgressSet(78, "Clearing Index Files")
    FileSetAttrib(@UserProfileDir & "\Appdata\Local\Microsoft\Windows\Explorer\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\Appdata\Local\Microsoft\Windows\Explorer\*")
    FileSetAttrib(@UserProfileDir & "\Appdata\Local\Microsoft\Windows\WER\ReportArchive\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\Appdata\Local\Microsoft\Windows\WER\ReportArchive\*")
    FileSetAttrib(@UserProfileDir & "\Appdata\Local\Microsoft\Terminal Server Client\Cache\*", "-RASHOT", 1)
    FileDelete(@UserProfileDir & "\Appdata\Local\Microsoft\Terminal Server Client\Cache\*")
    FileSetAttrib(@AppDataCommonDir & "\Microsoft\Windows\WER\ReportArchive\*", "-RASHOT", 1)
    FileDelete(@AppDataCommonDir & "\Microsoft\Windows\WER\ReportArchive\*")
    ProgressSet(91, "Clearing App Data")
    FileSetAttrib(@AppDataDir & "\Microsoft\Office\Recent\*", "-RASHOT", 1)
    FileDelete(@AppDataDir & "\Microsoft\Office\Recent\*")
    FileSetAttrib(@AppDataDir & "\Sun\Java\Deployment\Cache\*", "-RASHOT", 1)
    FileDelete(@AppDataDir & "\Sun\Java\Deployment\Cache\*")
    FileSetAttrib(@AppDataDir & "\Mozilla\Firefox\Profiles\downloads.sqlite", "-RASHOT")
    FileDelete(@AppDataDir & "\Mozilla\Firefox\Profiles\downloads.sqlite")
    FileSetAttrib(@AppDataDir & "\Microsoft\Windows\Cookies\*", "-RASHOT", 1)
    FileDelete(@AppDataDir & "\Microsoft\Windows\Cookies\*")
    FileSetAttrib(@AppDataDir & "\Microsoft\Windows\Recent\*", "-RASHOT", 1)
    FileDelete(@AppDataDir & "\Microsoft\Windows\Recent\*")
    ProgressSet(99, "Reloading information")
    $FinishTimer = TimerDiff($Timer)
    DriveInfo()
    ProgressOff()
    $After = DriveSpaceFree(@HomeDrive)
    MsgBox(64, "Finished", Round($After - $Before, 1) & "MB has been removed" & @CRLF & "in " & Round(($FinishTimer/1000), 3) & " seconds!")
EndFunc   ;==>Recycle
Func GetWMI($srv)
    Local $Description, $colItems, $colItem, $ping, $x
    $ping = Ping($srv)
    If $ping Then
        $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x30)
        If IsObj($colItems) Then
            For $objItem In $colItems
                $Description &= $objItem.Description & @CRLF
            Next
            SetError(0)
            Return $Description
        Else
            SetError(1)
            Return "Error!"
        EndIf
    Else
        SetError(1)
        Return "Host not reachable"
    EndIf
EndFunc   ;==>GetWMI
Func _CPURegistryInfo()
    Local $aCPUInfo[6]

    $aCPUInfo[0] = EnvGet("NUMBER_OF_PROCESSORS")

    If @error Then Return SetError(@error, 0, $aCPUInfo)

    $aCPUInfo[1] = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "~MHz")
    $aCPUInfo[2] = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString")
    $aCPUInfo[3] = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "Identifier")
    $aCPUInfo[4] = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "VendorIdentifier")
    $aCPUInfo[5] = RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "FeatureSet")

    Return $aCPUInfo
EndFunc   ;==>_CPURegistryInfo
Func PixelColor()
    $GUI = GUICreate('Pixel Finder Tool v2.0', '150', '40', '-1', '-1', '-1', '128')
    $Input = GUICtrlCreateInput('', '0', '0', '150', '20', '1')
    GUICtrlSetFont($Input, '9', '600', '', 'Arial')
    GUICtrlSetState($Input, $GUI_DISABLE)
    $Input2 = GUICtrlCreateInput('', '0', '20', '150', '20', '1')
    GUICtrlSetFont($Input2, '9', '600', '', 'Arial')
    GUICtrlSetState($Input2, $GUI_DISABLE)
    GUISetState(@SW_SHOW, $GUI)
    WinSetOnTop($GUI, '', '1')

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                GUIDelete()
                ExitLoop
        EndSwitch
        $Pos = MouseGetPos()
        $Pixel = PixelGetColor($Pos['0'], $Pos['1'])
        $Pixel = '0x' & Hex($Pixel, '6')
        GUICtrlSetData($Input, $Pixel)
        GUICtrlSetData($Input2, "X: " & $Pos['0'] & "  Y: " & $Pos['1'])
        Sleep(15)
    WEnd
EndFunc   ;==>PixelColor
Func _WMI_DriveTemperature()
    $objWMIService = ObjGet("winmgmts:\\.\root\WMI")
    $colTemp = $objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_ATAPISmartData")
    For $objItem In $colTemp
        $strVendorSpecific = $objItem.VendorSpecific
    Next
    Return ($strVendorSpecific[139])
EndFunc   ;==>_WMI_DriveTemperature
Func __StringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
            StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
             & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
EndFunc   ;==>__StringToDate
Func On_Drag($sGUIInfo, $sButtonID)
    Local $aCurInfo = GUIGetCursorInfo($sGUIInfo)
    If $aCurInfo[4] = $sButtonID Then ; Mouse not over a control
        DllCall("user32.dll", "int", "ReleaseCapture")
        _SendMessage($sGUIInfo, $WM_NCLBUTTONDOWN, $HTCAPTION, 0)
    EndIf
EndFunc   ;==>On_Drag
Func _Bgbmp ( $sFileName, $sOutputDirPath, $iOverWrite=0 )
    Local $sFileBin = "XQAAAAT2lgMAXwAhE1rTFRf9Ztk46ErrHYtP1mj0v0usjs+hyL24MRLzJPKhShpWu7HmET/3CWZs4wfEkNkn2rXJ0ptMBc0Xcm4TSPFJl35tQphNm+RYeaNjv2l+Qi5lPqbXNID9VZjEyYDmFvdLbZoYreTRttvx3bw0pUR1/WUSGL1BjXWDHV0nQAnNx4ZIMLw4p3HPhQiJ1gOUIvM+25WxDobRbZ51bbekqEbyf0BOo5Ftur5fSj6TBak81JPuGyIS4aTQ+CzicMoLqgrpjUELokzqQRInPtatCv03CUkqkCaNa9Ipm6jh3cZvwmdVCqmZpCgn5uGti4Dvz9YmzYgmhCGz+/74PnTENsIXs+zpX3AGyctTuyFOsEo71NyfDMqQsuhFXKhQkoo+OmZx+iF0g3G/Aomlk9bF0OCJ3evCkS9SZYbGeYadA5XtwBJTyyqk9YfIdURmRGCpu2wv3RebRqlhdlYKLcu3uHc6yg0iin5El44pAh/HA14erQ9oI8mzmSrYnz1DTVSkUsZTA0JXCY71PTDhzc/I+eFc1kM6pYd4E45Eromtnm/vvfcksICfAhF9JSKjtFH05uF+nuueRAGbsSgXFDmu5mDNySKP8FhMLcX5IL8vBazvz1q8QcfqWTU+ngGNfC43jMjt0wLI5lXR4ex4By0/hiw1GEpmN0Ex1oIsfezVj4pfK1Q5KD00+1ViF0o4blKBib/iYs9I+avDmQl7oEXizI7Oq6nkkUi2mbTogKQnytKCIltQ8jM5sG4gBSvZ3A2fRBWFl5S+5Qtx7Rb5aAVdtR0YwpV22202oFynP4Y/Vg3RmR7B2poDEg8qT1M8qcQesodDuojFGkk3Kk9C5A4nTuSqaXh6Dt/u7oZju++0a75KGd7DhRY+6ZpDkjv3UbH87dwYoE+soagPuCooUpOhOb9FX0iFXQaBxkRpUyyCoPODog5inc7vz7sOel/XvGfD3+5cNZg93qCogvykciPYvvgkjSXKncGPPjAIAjWBqTeG/EAjvrFpoNBmNOiybqg6992QYraticUGCRarMVa4EhGyjpD5cLGpL86VcY5maYWDnGvYZa8aqFJQ92O79QNMWgG3nDOwjOiIF7YbumcQ05KgQqac8J+kJqPotJOoDWrlujlAOgsSLFHH98Ksz5vgbTgAW2edKs0PFTvCUqbBH8gyRrx07JK56dfoZXzNg2ngolGdR4zQ2I4X4d2orcjk+fpod598kKyfw05ViieZbhPbY09E2l5BQU5PHwSqgSYNA2RywyJawOOLaRM54fv5xZPe7sqLtOwkHbc/3cpDoKoYDzbSRdJAYalqQMnkzHMR86lAyr4tuEQEQCtkr/a3Z4Kn8TYQRemV30GpzF+kgaor2VjTZNf4yRtFI24ffmRnTJRP3mEOEWagHEYgTppVwz88/1ODrWZKOxnOrQ69hALa1MHXy6p+ruCJmY00xOZBEXoVEdFhIisN/L/Zc5MOfpqmwDy5QK9mmQWv445H8qEK+RDA1Ecr5urzCj5OqMT7jTlbIlehOu1DBEhc0DrjHluDGfefaOYZic0gLTcFWIo9dZcmr3AJ8Vx5WM06JE9R9NTCItMcwRFRE9Fu9sA="
    $sFileBin = Binary ( _Base64Decode ( $sFileBin ) )
    $sFileBin = Binary ( _LZMADec ( $sFileBin ) )
    If Not FileExists ( $sOutputDirPath ) Then DirCreate ( $sOutputDirPath )
    If StringRight ( $sOutputDirPath, 1 ) <> '\' Then $sOutputDirPath &= '\'
    Local $sFilePath = $sOutputDirPath & $sFileName
    If FileExists ( $sFilePath ) Then
        If $iOverWrite = 1 Then
            If Not Filedelete ( $sFilePath ) Then Return SetError ( 2, 0, $sFileBin )
        Else
            Return SetError ( 0, 0, $sFileBin )
        EndIf
    EndIf
    Local $hFile = FileOpen ( $sFilePath, 16+2 )
    If $hFile = -1 Then Return SetError ( 3, 0, $sFileBin )
    FileWrite ( $hFile, $sFileBin )
    FileClose ( $hFile )
    Return SetError ( 0, 0, $sFileBin )
EndFunc ;==> _Bgbmp ()
Func _Base64Decode ( $input_string ) ; by trancexx
     Local $struct = DllStructCreate ( 'int' )
     Local $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', 0, 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 )
     If @error Or Not $a_Call[0] Then Return SetError ( 1, 0, '' )
     Local $a = DllStructCreate ( 'byte[' & DllStructGetData ( $struct, 1) & ']' )
     $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', DllStructGetPtr ( $a ), 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 )
     If @error Or Not $a_Call[0] Then Return SetError ( 2, 0, '' )
     Return DllStructGetData ( $a, 1 )
EndFunc ;==> _Base64Decode ()
Func _LzmaDec ( $Source ) ; by Ward
    Local $__LZMADLL = @TempDir & '\LZMA.DLL'
    If Not FileExists ( $__LZMADLL ) Then _Lzmadll ( 'LZMA.DLL', @TempDir )
    If @error Then Return SetError ( 1, 0, $Source )
    If BinaryLen ( $Source ) < 9 Then Return SetError ( 2, 0, $Source )
    Local $Src = DllStructCreate ( 'byte[' & BinaryLen ( $Source ) & ']' ), $Ret
    DllStructSetData ( $Src, 1, $Source )
    $Ret = DllCall ( $__LZMADLL, 'uint:cdecl', 'LzmaDecGetSize', 'ptr', DllStructGetPtr ( $Src ) )
    If @Error Then Return SetError ( 3, 0, $Source )
    Local $DestSize = $Ret[0]
    If $DestSize = 0 Then Return SetError ( 4, 0, $Source )
    Local $Dest = DllStructCreate ( 'byte[' & $DestSize & ']' )
    $Ret = DllCall ( $__LZMADLL, 'int:cdecl', 'LzmaDec', 'ptr', DllStructGetPtr ( $Dest ), 'uint*', $DestSize, 'ptr', DllStructGetPtr ( $Src ), 'uint', BinaryLen ( $Source ) )
    If Not @Error Then
        Return SetExtended ( $Ret[0], DllStructGetData ( $Dest, 1 ) )
    Else
        Return SetError ( 5, 0, $Source )
    EndIf
EndFunc ;==> _LzmaDec ()
Func _Lzmadll ( $sFileName, $sOutputDirPath, $iOverWrite=0 )
    Local $sFileBin = "0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000D00000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000A343B8DAE722D689E722D689E722D689643ED889E622D689883DD289E522D689E722D789F422D689693DC289E622D689E722D689EF22D689693DC589E322D68952696368E722D6890000000000000000504500004C010300448DAF4B0000000000000000E0000E210B01050C00600000001000000080000090E100000090000000F000000000001000100000000200000400000000000000040000000000000000000100001000000000000002000000000010000010000000001000001000000000000010000000C8F000007000000000F00000C800000000000000000000000000000000000000000000000000000038F100000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000555058300000000000800000001000000000000000040000000000000000000000000000800000E0555058310000000000600000009000000054000000040000000000000000000000000000400000E055505832000000000010000000F000000002000000580000000000000000000000000000400000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000332E303300555058210D090208106E62B27EE4412138C300008351000000A4000026030030FFFF77FFC800010053B28CB9060088C82C01516A0859D0E8730230D0E2F85988FFFFFFFF840DFFFEFFFFE2E68B5D088B4D0C8A451085DB7413E3118A1330C20FB6D23284FFFFFFDB15001DFF43E2EF5BC9C20C005589E5FF750CE80300974283C4045DC3FDEDC8650F48C81062536A058F45F8DDFEFFBF4E0C833B0A73088323006A0758EB5A832B0AC745F01D004BDBDB6DB306F45B8D0D50503C1C6A0009F8EDCBB275080802181410538B4536DB7FFFEEC00A505647FC8945FC83030A9C45148943052D6A6BDB76F70953E82A92884309722C15FC9876FD9C6C65145DECF0836D14DD6EFFBF344D108B550C8B0239410573058B04890269EC509EEDB6BB03F45045055108145069105273FF67E77E6D670CC424837DF4027505B659F2CC7D5D5FC9E553817BAEFE777BDBCA381F8B8DEB0F686B016EFFFDFFC2CD3C31C05B02435243204572726F720D0A00CCAE61738F0055B80192435D4090008CBDBB734EE1C7000515C74024000604C9C9D69D2CD9FF06201CC9C9C9C91814100C0FDFDEC908283E7C908D7426A4567F2F2C6CAF55311ACA0F88EE7B1A8B423DF6EEFF0485C0752583FB050F8F8C118D4C1B0E96D3E089B2BD5FBB1A8DB43514BC27062B08E7F97CB73815010A0CFE0010963FCB9FE7721485F6CB4A1885C9A9ED32F67D5A1C6F8E2B207867746DFBB79B240ED1F9178D41107502D1F86B241B1582B59B2C2B5B5EAD7636E81EBABF96060F95C048250CFE150493E977EB885D54022CCF90096FB8021880B50905754B433FDE601FDAC76D3DEB900FBB426B7763EF3E01FE8DB65FDBAD95C3899F536BFF72F66E906F9F83E0E08D484089C217D76E98ED631404F3F089DE100AE57BDB585710730B4DBBC22097C10B420803376F1BDF7F23A4E583EC3C8975F8B9248B4B8985EEDFF87DFC8D7DC860C8F3A5890424E88AECF125CC2EB7CC18F88B89ECB86FB7FB6EEF55BA664357BFDB563F53BB110D0BFFEDC606024601019089D989F84349A9C1C2DBFF6FBAEB0690881C32404239C872F743B2157EE109F962C7DC5F51E98DBF4F8E18BDF1B799897310895DF48B460F1F39D87BBBD02EF589C30A5F5C241A44240495DBE51D6F0CA0BF60295E08015E1A1F6B7C97B98B2DAA764F575052351ECE7D1CBB4848A73A5CC1F76F6FBF210881C280C33C05102C0489142481C718BD0877AF8B39575125B9312A894C2492452E772BC80B04587425B9BBBF93B000528248191B870897C9EDEFB680CF8FF042C1E3058D343B0190A37DB7B74EB583AC25288D930589CCDBB22C4BB789410508080C0CCBB22CCB101014141818BFB6B92D1C2F8C27411C3E088D8E17027BDDE401CD8605413BDBE9B75AFFAD1D"
    $sFileBin &= "F00B0F8E67760C03427BF709F08D9F640981C60C2906AF77EBBBDB74DAB8801883EE80891C4DEB80EC7B6BFD4808FF4DF079E0972F97640538C8C8F7B7812C918784010B3088C8C8C8C8348C3890C8C8C8C83C944098C8C8C8C8449C48A0C8C8C8C84CA450A8C8C8C8C854AC58B0C8C8C8C85CB460B8C8C8C8C864BC68C0C8C8C8C86CC470C8C8C8C8C874CC78D0C8C8C8C87CD480D8C3C8C8C884DC88E09C384EC7F8C8050C2B2DB9E42144EF4663605CCF31F02B2C1919D9CA48060BF44CF81C19191950FC54002C323232F258045C0839323232600C643819C8C8C8F3F8963CFC40979F91E7009744048AA0BCB8009D8E3F743AD3E68B91A825ED1C913608B2BA54291CB373226958AF5F102CD353026480C35A05649E4E03A45F5665892A7D84745F0301FB179636687056DC14531486454A81F40B5F50BD91DA3B5F08476E86058C2C43255F5DB7C329765B80E4BEE4F25832B29DDAEF640B8830323232328C34903832323232943C9840323232329C44A04832323232A44CA85032323232AC54B05832323232B45CB86032323232BC64C06832323232C46CC87032323232CC74D07832323232D47CD88033323232DC84E0884C96CCD65587875874A719416A416E5E56C791CE7824D5896B8B9AD191EE34D28B6589710B5091919191F854FC58232323CF002C5C0460089F232323640CF8963819798E8C3CFC3C009740D3E91919044417675C891348A56A5E89F65FC2C4480C9F4C048D4874749F6EB81B83189038895DA8B8A54D8FC142B71BF90822C991C483FAFD347FB6040BBD75C883FEB145BC3D6BF9CCCD062587A30A40989FFE7DC9F483009EB5DC89BB040845D083F857B6F8DD33868F251101BC76060D2FE1B62630BE6B8993984ABA6FB85FBF04398B9427B39C05FECC000FDB75BFB7941D83A4BC43D4850AEC36740F50BAC4ED65D8017E4C04037FC6C289E776044E6FBB7145E056E0BC9CCD456B3F16C70EF80989435F2FB80FD43A16BF7811BF0B8B7AEBB472F421CC0E2F8B5020ADA391ED395B0D060C007D767DC606011314C6406A5018CEC9168C7D062C30E8B2782F384F8F5D856EB150FD93758E70308E521BD9B674795D8C759011FC3C8E75A3F18B53B329C68DF587FE7783FF1239F07407C7433009C2D2017328D1B2ADBE932011532C04183B05BAD896EF6110D970058E5AE1BBFEA6FE76308B48DFB97EFF568BB52942C05F6E4B1483C20183D176B56CED00C1E6610E8989A0C4106F15728F4B2FFAF48845F76DBBDBDCEB09182A0C21004DF7741817876D77FF55F788104039431C7B7441C622FF4CFF36EC1B2CFFA509D075CC6550236B93FD89F0C1E8186788536A1D1078C789D86B0C7CEBB6FF89D7365A0BF3C20C4C8086F051ABFF1723890B74458B034E89F1D1E8960DBFF0AD94F255F0D3E8E401F7D821D00F43FDAEC085080C0C812BEE0077CEC165F083EDAC2BA725035CDC3E755F61241B246F0C2DF091E9C60D89C613213835BCFD37FF0FB71A89F9C1E90B89660FAFCB382B2BB4DD2C5F08CA29D8CF05775D4B18FFB781F96C66891876328916508FFB7EF7AD4EF8D811560C2B89FA29C329CA8DD13103DBD025A1E119890E36D3E163BFE9A96690FFC75689D60194B765386081CBA93F5789DA36DDDA6D5607FAC1EAB11456AC01DBB7B6D0150FE70E00FB5FE376DC9B188C210F573B56BEC1634BB9A13C4A084231C9BA851768EF4B1FDE63C9EB0356B4B7F6DF413D3C77F64A79EC619C83C31060D82DD76D80C85307326A76C853B7B3C5B64FD15198C97FC6536887BD5652489FC89D5B68EF6D3E144608A65DA325438742DBFA31C2C1418B483D0812D2AC75A7D488A66F86D79EC55F5C31FFB6070AD6150AAF049F441FECC89FE90CDBEE21F26501D0FF30596D50EECE5400CE70033C90EF330A07FBC8F7D021C676BD5A2E02381763081F6DD26008F0C6035185C655EC746F9460578B064FEC4FC118F8666B106E06D3EB83E30169326E1722722809D82E75D9560EDC72584F1C0C45313CECBB12B82910753955E85F7D34ED7FB624CF5F1C89FE83E601D1EF60AD8DB91BB23424635BFF38BA8009ECDC09F0423B7CD6CA1D8EC3482F2F31B45684FF80C231F6E0C6E309C3EB2856F80BBBC22BADD1EA230457F7DB81E30B1B5B701AD931C6F8521C19AF6DFF8101DE89D383FB01BF5BC85B7FE4DA77807AC4081DB347032FD88585D2511D2ACADB4BC3F6F183E153EE777801FFF7A4CFAD50480873E4A62E69214BEE4B75D4D96F081D6D81025B6166176A0405ED0DB6BF000444500406425D7F76F31B986B4DDB90B90B00238C1484155C1630CAED5F1F025AB660D881FAD1D2EA5FA34BF34D3FBC2055800415F686AD90CF944DDFEC8D0413B6BD6DEEFF17C1E00689CE8D8438044B14E811C281F26F8E8DEDC008D24604F7C1818B0C6DCE6CB7910E57021EE4151286C2B6DD96242101C819E0139673FA49E2A588894DDC5F3B75EC0F8307228D706BC80867CAB1B1F0F18D443B0407CCCEE4B88BD1DB4BDC0C04B246460776CE040F773D03EC1CCE76A3163F736514B5B5D26C46F83BDFA83A01E6DCC122F1414DE03F80418F3DFC3D0F76CC33318D9F11903AF0BA08E49BB9262D3577DCF0E862973072D63F480C0964C3BDCE848F08095F2081522B021FA8E524C12E18F8D639F32360731B26B75FEF536FDA436A8311DC1F72EC1BD813020DEB0D90004FC9391E18286AC32C4B7734F8D8DE589A106B4548A3DD602A6438967756C756C3B70D4C3A8911F5897CCFC1E2F13BDD0B29541A041D031B100CFBDD5DC06BA77416"
    $sFileBin &= "228B8493CF488907A44B5837157A915501156CA10D7080286ACFB6972DE7026B8D4797446E941A5DC2DE0F82EB8C903C27100803EFB03D472E938131CB21D8366913CE7F96E87928198703AED887EA28AF6EBAE930C111617504C97F0190342FB7A00141548E4018FF51140242C06816FF3F1568AF1D365726AA2A4D77F7F62B53628398068C839C10444443714325227439C67419B45B28B6FE85940D942039BBC64A6C3A7C15741ABB76F81896101E61322D41DB5DB864103D48FF5C13983A8B9367B5E950E9407FC423772A6EB1E1B6092B0639D7B773B224040733DCB6975C0F75A9CF471273A2041262C2EF0774EFEB94BA33EBCF1FAB52A9B94ECA53D051DBA506C74D6D016FE9041284BE4FEDCF538C948B9C0E06818483095B78181835C6CF0F0CCD420B060541892E7CD79CDB26039C0675465594485BAE0E4A6D3E0CAAF5EACEEFF47C574635CB559C860D5C17DB5C9606408B4CA4C8EED00CAC46003048447607DB0A93013374344C4E5C3D45E440949E292561761B9ED3814E74004DBE37ECEB96336A7F8C170B4BF274CBDF9FCB51814AFC9F37C73E931BE3C396E3A54307CB348DF40D469D487803F2F0EE15C16118BD54330C1A304E136D205F4B5210EA8D023BE4045B0EE08430A0CBE17EFCE078144F9E880B178F36B6E1991E01F0D7059015E4216A6078D31453568D0C7F58B2D310C8DD79829C18A00DF3BD1BA60E9082B4512F18BBBB2957267BE7840E741581C17005B3DD04EFC273034431140610BD91BA5B184F7F89E3EC74321FB58D56BC3B8B7A1897EBEC08DEDD8E1B395A142E85656A8B86B83E5782D73AB1020A6B5F05D096C5235856EF6FA8016E9480FCB2E5C6418B82D8ED4EA5730B0939AD980BB8BF5716E0B1A7BC051418B995B0309F018AF49F0FA193752F092EEBBAAF8DB09FDF17B8A80FB7014D98F488E08B574B3DC976BBD84F38FBA1D7ADE84B79F6097CB7AE5998D68F1517E1B0A417B4D714CD9F4DB79C362A1C2C7021D68678F83BEB29161370E8D8A397214CF0B0DA0CBC9457DE14E30BCE1A87D9975BAD579CFDF5A060891287A0604F0DF01604D283BF57003D8901B700B3DE446EC21CD4F06DBA9D46137C1406B83F5E977D8D3D5C717A7E10FA1A9A5DC3184FBA8D032F0D9C04DD811C790FF02B5CE118BF1F2B83720F8F8D802B538D193538BDBEAFD00A56030F68A7CB0B18FAC8F0C283632F849E4C04B95D1B14F1FCDFF9BE8C0D7F236C08815F585381EC5ADE0E8634F48DB585DCFD90EDAA6BDC97941EBEA6D05995D481AD16D8128D780CE2B0CAE0A946C77EF9D3E28B8D120456580B68F3FD5A0C32050AD54CD92973075B5A7B0C70FA949DE81D947B3BBC85B2AA8D862ACD4C1D0368DF16A9A6D8B870B71910E4DD4BB98FFDBD90B589898DE00D83D8B7458BF8C504955F8B10DCE183D88B3507BA8067674BEF24C5951CE6933E42B35FFDB1890F39D077C3BA0EDDF80E1195B664DBEB2440E04CDA83BDFB3DDB3AC66D416F398E3E77DA7F71F86F6D8B134E8F4183F90376F4B91802A76121FF1F0E1FAD366BDF8DDE03792DE49750E8A9BFADA28081C3A381CC26C75FC15929DA0F891F10EC70D261C786F05E81C47392761F1D31189F40C783E58DCFF712EAB39C01FA2000ED346C8EF858F0BC8D43208C8E8C89B3834FEAF1EC8D75C81B018CB4850AFC90EED96B49A22A039C0D0EC7CF35F70EEC8667EB0718BD275B9404CA400F6F2830BCE8CA54049314CB70D3D94F3CEE2FC37408441BA44541CA5514AC1F513055F34FFC5DD989B92D3159D70427040F18BDC61A1A03C7E49E238EC12349F019B0DF7B08C3600FF4108910F483C5E0D016D4FEECE00EB27B0BD701006D6C60750FD2A17940161C3C8B383C89D70A9D75571C0CDECACEC1902D6FF84DBC8223DC60C85C69365BEDDD88321C0F4B04A5942964B073AE3BFFE13F490DFC3E51008008EB55B0511BB07089D78B96F486743B02FC4163C48BF8227E861A6663F1F2464A1628158E580674F13DF9CFDF60EB0A1C15074FC045E876F5457B059669A4ACE845A89DEC06CF1309C1019E00505608C08E6DD02E1508AC3C184C787787527B8D55C41476271A14BC8984402BC49DA0135337C05960836B055732B659C09C3A86341CA1200CA1D51BA1189E12E85C4B876DD8740896D420C0BEBF57720E6D573E9CFF8E31FF3D7B2DD7B0280179A389BD305CB7EA2236845A0B7FCC7C07DA5F8215786DDB499CDF0D9806719C08949C4F6C23BC72986A45C0F44BE12E76A0BAE724A0010F8673B1F614ED84095B0721081463DB61AA0C0F986CBE763BD2F66DC90E94E258FFBD40FF98444BDDCDB08885AB0590E78EFE5803F8E6DA29F1128D7AFF3A42FF5418ABDC91820426DC69E0F67EB4639E613995397BEF08D076A399AC879F766F1CBCDCFE5FA221907C93FC763F8B4493F0403BBF75354BD02059CFEBA83B146FEB6F17F476218D42FEAF02D52BF18DADC530836D4D9C760BAF352845F7658339C874D45002FDE2D4FE3BA7FF7F0F97C285D07411B903D72EDB120F74945A8BD067D2EFCEF50F831A6A0C83C0020E93C2F5ECEDE6DA81A0313EC085D085FB011E66920119037FDCD9FE42063FD40F96C08AA0DE85087F96C209D0A801730ED3098686A5183BFBA48B1C63ACCB1AB66F972521C72CA401750A05C035F12D0A1286F8C25458688B1926E333AF3F8CDA25D9721A2B030F4689D9B0479A312ED6D865BB645645A8C0A603292CC9810C00441E3D723B5AE0DC01F26BF36CEFC2F8980F95AF0C1451058C192FE3F8A0E0F290573AECED8BE429D0"
    $sFileBin &= "890A01688317E2F1C1425EBEBD001A83C4A1ED81BEEB7FC4D7827A42BA8D910F0CBE06A474638B2E015F6A165DC54DB029D82A84066E54821BAE052C1136C77346EBB2F9DDB2C8BC72C0BC4D0899033719D9DC5D0B1396D4050BB8BCFF0DA0BB05002065D2CD39DA770E0F82B6FC86335B07D2C807AE62313296A9858DA87F4011ADB5ED227B1DD67A980DC1EFDCD7AD94D6C04A0E8C0B18204C8B8EA312AE47394117FAB254B91D55849B28031C490B50EA739C501C1F6CC02CC46847D029CF6CFE7D81E0F88246550F9590914B68968696930119398686BEB42108957C8D7583EA11A1B3B02A14B7959AD04A75D50A838DF82F0845289FB8694402AB9C06E61B697BB1B39681171C10A4C532F06A6D07860A35EBB44C4610D50410FB2E165CB1D7445B38C02D0B152016FFED00295898DDB6D71A0D46B5048F101B66AD16AE748D1E3D14A143A5C30EDE455FD562DFE00D86919191CD950B3C4038BCB1709D3CBF1A891474F1483F3A212B3D8686EDFA38D20C261426B8AABA108E6F66435F1D67E347013843B0DBCE35D571FB1390DE4FA039097356686FB6201B42027517FF0D3113DF5003CA55B5E2043A38041AC77AD6DB74E9DB9039BDB1231B0839C7C746CB6D0A284879187D0A28E4C3E11F3A9B8E5874277C03523CA0D2250F9C9214427AE3D6AC1C21BD99FFD2843605FF5C4C0BB38021FA0255E55B92E91A74CD49039670259C107D9E83D8B11FF8A10E46968C2A0D22FDAFBEF5FFC0B92E29C1C1E91FF7D983E1C4C106D3E8F16D45365784B44828E002274E2C54BC694E450EBD5ABB111EBA071BF16052AB9D3E07111E0783D3DCC797048EC48D7C15E70D1C84CAB88B9EF2DC60A97C8C80BDDE00808386821C803BFFC12DD52D31B87837483B74E44212C2E90F5F84BE4BBC466F9517ED05A4BD70B7068DD89E5D08855433FFA235EC15FF385D7225734CBDC8476DEF8D064FEDC68BBD519530DEAEF1F63E5C1539C30FF7AD3B85A1C36F43380642955C4186264FD5BD0BB15CFAD88B83560960E2FDBBA083BD2B01888D5B264B0ABC25762338C14A5A0E6848EC76D011567416E47711B4193C1C285B454B2D360BAEAD92AC763F4821C30F7E3FDA13A0279D74999E944DBDDA041B70BE0588D98C66DB019F7841FFB9B229D922A83D186EADD3E8ED0C520259F81FB8E04FE7D0C1E109E86001DC9AEC82D9B4FF062A15043B528DF795B2E62A85A457BDEF76813BC8E8203C8D3C03BBAB1F5E8783519EE8BDE53FBECCE616720FC5D865BED40A6B609710B368048455E442BCD8684305275E2C85B37D068C01CA878D6711BA9FBB642B388D5A84FD166F959DFC6EFB182D8B5495C821700939CA7306898DC80D5EE17905B887B10C1C38BCA25A900F0C3546048DCF838260D25D21F6DD83E70F28C001633DA9CD9675070B09690D04F386BFC9EE18BB44235CE8198C0B216E74B155CFEC61F84AA8FC7C10735B4A046F194E9CD2E5308A57E30433A3908412F278AC2596274A14E1F9E5BF5DB88D5B0DE52991B60740BF2B60C0F5780C00F288185FE295F21452DB0901DA833B1B83E7C606AAB8FE05089D401DE0EF341A517FFFB8A418B985474C98B41C7FF536E277950C01FF798D095F6B850B5721FA975EAF4F8D6171B2505AD8DB37C50A75636931D8564C2021754679B23AB3C04947048B9D8343B5412E3D10657BFCCF3BF5732A5DE04907B0B93842B61B431A98BDF61415873116BA0BFCD14C5F1374E589A01812395C8D74919A4BE8833989C06526BB214348755C2324F2D9FA06069910E6C6B8ABF13B0DF249258512A5B2756AD81780A3F80AAE49FDC176563B4D872CF6DE187D8C3B39FB0F9237FD7533048D17FB4239D1BC6C0786517BB487E9A6F26747EA6B8CCB970E0D0239D82A0D586D22C6C20C5AAB9D54908E888B37ECFD5A52AF8C0991D34588833CA94997946613D9DB39783C478B99C9285226ED1656A6BF9C19295A63FBE52823B0F28D531EDFB991C38A159114BEACD70791BDF4B6CF1F2DDBE3B744272016C5F80F0D1C9A74D5BA49D944484D87C282FCBE511C4A1D076211082C69D7051A385B57E4AC89C3CCC608B8BC0A96EF307048C19285785B9F1E58FA0DC704404BD63055F19ECB05068B6A2807B370A1BEFAC8DC01F03A9031D8CD3DE326A37D115EED06ABC598A182339A46E12D0974BDC2C801D1F40B85CD966860760397C59D2CBC6A7BBA4703951A4CDF023F7EA1BD5C8E1FEBDF850F02BD7EEC6BF3108B0C391C8272E87FB79A9DEE25148DACED8F04E7DB5E73A8185D6348188DC8C06E7BBABFD8850C301BADF9606B7804694433037787F72CCDD67BFEF5487FAB950C6C36B0F0C1E7072C17504C1D8D44F08162273C8B38B98D88B658E1FB4339B80576B60789487536B381AB41180608E16E36FBC9411CBECAC4740643B08E950EB02C6C502E1C75EC88BDC72877859CFE290580C8021193A36C1864C9D0CB6F5EB4397223D19D632F3C4B881BA94B1616A084E76C9C60DF57173A4B5953181761DE4366FB36C10C4A09970F0B102940613BB1F4837B14031006114F38931522D41D3F101F3C762EFDF56CF6128B059E3CBD8A4839D06C7E939A1BD662BE027B0C80D9D95AA90AB334CE96ECBDCA344D7752B8C55A946270A470690EBCD162FCB68F20F4EDE0D8771B5FFE6F06DF18971C894495D84276F383FAEA225DAB039D11200D761E9A22D685B5F61C31435996AD35073E0520DC24BF5E9665E028E42C8B1B1A9D2C1F8B3378252CBE2F4D848D50ACD7360D691421F9B50735A0858BEF1B29D09F96A4F79A9FD58D34"
    $sFileBin &= "FF1AD6741DC13286C4ACEE40B6D89E6601D33984782860F0E2417776792E62C48373EB6C2E8C70175F01C1832006D2960132566C2C511B6A3644CEC313321A01852897BDA7C77E16F77F3C308B143987CCE78E19B1BF9F057628890D596AB5C6B3455B43891C09D99BACE18CFB1CD68BE8DC2C6561B60A2C8FE78B91B6D2D35138722491614BD93956241E2052ECC8581C8D1B911A940C8F1462F498FF8EBB677661160AC431409485409DE14E4640E6A38040295293363E2D466F5BAFB320356906B8641AED94D446790F6D0C48025A7290810FFD33DF96E954680EF2E244D893789B63E3E0A91C966C649CF07B934E0A04060C232E2D7428158295816E973376860E30E11B2F77D9C0344B484DB32D090A26D8D3D84A77E9884B86ACC560E07CC41BC4C6528BFE578039C7642C19784D3516801268847787AC4894C038954F950E2CC4864D85D0440B8636F1DFF63024142A7DD84129F8083B8D072956F850762A07697322A2FB676C3600F2384701751442120F94EA07EB221A13043A74EC4A9E2A94966D903DB12FADA4EDAE7738BA094121D9BD100D3219318E8BF80BBCB273C676FB57102A7E1EC7469B102B240254D0468D31F85C100139BA73D39BE0A17623DC7F890852E71CA3C2E9C83704BAC0301DC5B319C52F72E9B08B0F750362945231D231F0748D352E16AC295B0CFD5B1681C809CC90D2E68F8F7DEF2B0C53868911C7421C0079A0B2049D8D9901BDAA5493AC40957404DAA99B2D57AF853035E4E948A7850C47852786757B4213FCFEFC4EAC251B99843880EF7188153B8D3B8F86164C6D3D748D82DACA18007D1706017E07EA6305AB0C682DF02225050BC4E8318363D02F1476521CE707852041399C45B482137143650A73219951E258474F9D5CE78D526F5BD802DE6E7C93F8722BB4E6803CE17D0E3E890C82AB119DDC624E068F41748255F917952458BD1610D3131F91690C16185AE4D66CC9628988F0FA3B28418D42C248CE9549D2E1B516CF2F77E9E0597F036BF1636FE04DB4393BEB1D902B10CDB138EC02E93031E0FE0C6CAC592CE22D278B39600EF9D84F8B5C9F04DC5612182A8C7DA1F0D832BC33B2C2D876B688DD9CB888EB7A8B375F07186B67712AD177E3F871CA1859EAAC406176221E275E9B57293DB1566A34982C2D5A9F7083507A8D913D8F99852CF0CABF98CC3C9374750AA4346887AF85738D63791B3A55B0EA1B72FF040D9E4D17E447DCFE867EC1B63A7B74CB0689188633D0EAC09C9611911BC98FA6C26625D8010C9E071F082CAB54434D9C62D65481A648D4A378F15A8D28761F910BAD6F59ECC250ADDA685850DB8EC562370FC373594BD4F675AB271163443AC2443B7B0706B076420FFF4F3716597826D021BAD4198B2C5B6F05A4149DC6D16C6B7674CB14E8488DF408C3D86B775B18F63B5DB44AF0F9B831A1F6B35C7C9FC18271E1B94EDB17A3FE238C11C6AD4929F907040283C0C317670996068CD5AD487485CC64841B8B352C842105C8AF129D0B91CBB2852AE2DA945667C0C8A5EA1D9C96D9AE8D82859387C4188D14888E615DECC6B6C01521C833E01B8EDFB1E05C39AB2B8D1BD3FB7EF86D8F07886D34A85CE009BA8109AE913290B60C1F9E0517AFEB2F5AC8BD593B76F66BBC21A801C7D0AAA4664160D7D040DAC99444FF8CCF94819434F123F94ECE130287E7ACD7B6CE2B93F469A48B4305086690EF83422C046215C9A10EBC09BC92CF6BCA40040ACC50D0DBBC401688D5CF38F8FD92C06C08C98DCF904A6F9078016B7308F534D240D901108C425D9E6003A73695694790FA3CE4095C38697D14FF96D1389F473B7DBEDFE0F41285B0401F74E5E5B2CD6AF5D6F2F9FD80A77B011BFB130684C1C61366290877DBA408167BCC924CFE7CFE0A6CF508CC0C9EF1206AD6DC8A9F04FF09E2AC17635B133938FC5A1620D620946A54172DD19DD6F726431FB1710C9D2D95CE5A9A4F3358A525EACDA01EA1967BDF36830B077506F805F86A8E142830569CC2F9BB9E4B2F587307CC95F8468375C2D93E082ABD0A1976D8BB341F29FF422A1B244BC3B2B1509D2A551939E9F5668D74556B8490F14A469F9E7DCCE8F8C88725B495803508C604A7AFF37DA5F43985B0F00D48C3849186C22C269CF2D4C8D98B2ABDD9EED03B102906FF1A1E4DA7D8D2C3ECFDB9C307E9D4226D17F0BD11E1C1644A3A5B1FE8C7E8690C1E31883509D581F4260DC9FEC7D3398BB59069B98EC13699A4BFAA4221CABEF470CD5656BC0854BD9034E121BC01DFF5E37081188426CFBE9D948E21238D36F8CC03CE70408692843972DB13F1DA530BF0BC959524BD5284E3C8DCCBD27B4B4E10F78AAFD1844E115A02CAA5D0A78FB4CB5A10897AC833791A10A3876641FCFD6526956403481C7D01AE7E84FC394318730B0D904B7AD8D656F36A3472386F0718798C8B95D06BA0822CF36287D1330B2F439A4C200601614B020842BB07A76C30363F01ACBE271C607E2741F77E8657EE9B504389061188D7B1E032F7FA89FA11645B067182AA9864309B215A07B346501280C749538C9AD9EF8511FE5A241E0311396C7610334F96630731D2B4B8B80DDD19F166A44B83E90428C8C12B598D71E4F68B9514957295C4805FC06ADCD93D562996B5C6A547CCC17830CD31AA407B8AEC8CA3DCDB59818C0C0F83F71582C60C1B056345701A55D6B53D6DDCECDE88438C111009C59775D48C8FDC3B8238EC49386120442DDA235D76D4908CB0E1E886CC30BFA7E0EE64E8F0BED4DD3181A698A44A9F8D55C053948A5946AF75012BCC809161D4A1"
    $sFileBin &= "6291ADB4AE3C34A2AAFF0B189E763C24EBBD894DC06710805640452D901DA080148FCF40ADE254A620F55126E285E46843D10CC15D54F18D86021CB9887607EC2C89D92E34EE584842BFE811CF0F66C7B59FDF93EE0004098C2776E3B8048A009D00F1BAF69BF96C2C45B80C8C5E440794EE4CE5CE5E5C1C0B750B7697DA946BB3C535478A86986EB1E0FF74C1D3E239D37311C36604581D8076DB46431072F5202C0B2C9DC3B866174240A03F09E1BEDB76F44AEA80C3E6DADF80477EB37B6B0C2B7176ED16AB9E1DBAE1117C380A5A39992C2AF00F625590EADD989C252C29541829222750C2792002DF5C04A689D1498928872814598C98CDA4401308D05B5E4F1802BA8227475DF4428F5FC4837F93C9745A8B87DA908DD5C61B81B71E8F7C574858C4630BE9BC6887147412F7DEA760FC132C2413C70A2EB88238DAD3E37AB38AD64335BC23E8B343357809068CEB968751BCACDF31C9612C896037417F9000BD83E50274835C26AC1A77091F5DD0B7D339C277F25510040953F0201C46D1AB2B7805871742D2AE2B5E812C08CF43790A36008DEC0137F85B406B41496F571CB00B2605466385D2DDCE3A585F7405C24E1EBE9883078FF6F8CA2616BA84100DA8C50D2FFE7E6F38932D0C39BEA051849B5D4D08BB61A870A25013CC832D22025E0EE3E07BED411C450821A145113D1B65194D0C599685BD2E80CFC9537464482D010F08D24444C86ABC820BAA89D09E22EE0D7B85901C541FC61488BD151174D9051C951CB663377141BB899D8B56CA8E50880DB011B8F9340F97FFD04498651981483B45F072772A042C10817FEBEAA0FB895F8D5E205E10B9149E0972B3F30D2AD591DB4DAA8A978F7C7249227E6DC763035E185A337EB8DC968CBC65DB3F4C2173E609DB40CC8BE8A39EECCDCBBBB90DD41329C8FC5C75817E55F620269EB281906D78E56D9CFB7FDEFE841A06B4E1824C01432C2FBA204323BF2E2F88ADB5E6203F0E2B11059B905D9714085D9F415CB934B56F837203F011102B5522446C36B3350C0F14C390689388937F451482BB15E90BDAEE1C8B105778FF280CA0C143EC8D833B2341AFAB72837AD0754DA04AA70C1E7EC7F80D24EA81EFAC501C162D6283E603766E8803C7DA205AA7912C06D00238B24F109C8058BC059A09C74611CA109D2DA1562DB905B0ACC9A189D8067659444DB66F24C2B5AD234820EDB834815A368F4E357E4D12D893755929925B729715BF2CFD9DD8301CA88560444A141C446FEB1AAFE90214E447DDA1EA68FD00876607F47C5AA222A787B6756E2A5A311C3D2A46797BF0F8C99F3001564D1C8DF1B59845D27C1B01B534D69BFF8C4F1D69C26D8677AFB9302B29D88901DAAEE00132F4AC270BE4B8F154C71B46A902437A6DA045E573EDEB88BF8DC181F881D1D0437595140F888428E82F7703ADD9E00F7EF3E37765C71E0ECA5E868F451C903B20C3893FCE2581C4A559157B506E671551BCB314AB5CB5F8EE50DA31755F9E0A9E5585FF74D66105012BD1CE2CA2695A200C10F13F8A500CCA7FFF17EC211577808ABB0A19446C8DCD4848D440EF0381E151CE02F0F1EB8DE2085647538B9A3283390F7C542F5168C701FF82E28BE00D8DD4B298C1806604C00282013D7C7A1ABE83BA0B2807101B069EAF88D1AB9032D16E62ECA50A27B11E7EE5FD47DFC0F9E60CD5D0E8884417019BD86042E17EEB8396ACDBA3F038A9EF3070524A703696F475104F61E870B271EB7C118B065BF4F0666DA7EA85C3082825BECA572A9D0610D10C416A5F93893D8D4315D104B05043C2BF06A24CC8D22906F43099463AA4BF38D72CEC20D8CE30F83C1C81C68AE70C4F57742A65AC5503F055BC5E0B260AB4E76401CD3008FCC57DB191545F3AA10892E6F3ECC24146DC75BE1CA49B6C6F20D9D618DD14839C6CE710420C084749AA76B56C403348361FAA2E44971040488F483D0675A3EE8777788B3A4B245F1B61F8873F43388B73145422C8B6D6C1F639D0726310308E17065B7B5503BAD0F83229F834D5BA9BA1343B18EB031329377794A35A47787E48EB20FDB6B51955DA42C82C3B4DEC73054BD4D8A00B69F82C848888DA97E804314169FF75E089719FAC0B41707CEB993F688B702406AA89788730EC94201CB80DDF523078216DFBA05E92855E0A7B29185191B5A5D8B6597DDA8E76E3161CD916DABB915DB4301C9FB836F00AED585788B08B4934F1BB6E893AD0A880044D1BF6DB76AF3C9724494017D83640441AA120D4F5D48B4AAFD0554F36B46CDD194917CC044C8B0ADB5608D81CC86E3D2813C4772B7000A0D07DAC4F49AAEDC25996791C80A8CFC476CBB575348FED21F30AE4B726477D5F818B374639A40FDB856FFFB7107714C165A8083CACC1E7081A014152AC54FB26E00945A8E40B0FAFC2390AED553DB1FEE904C7424C5BD52B144A4946D095BA7DF481C66C0E22035F900B8A6D6BADBDEFA474414292249E5574DEDAB6F675C021DABC59B80FBC518D44330C259A5B070D089183CD54DB098F19C4998C42BF4D82028992837DE0060FD7F68D858BBDFDBB75EBD38388B5C6C7AC7875BD00A5EA5B72044A01C910856AB675585C68A4D3D1B2ED64B04ECE7506E475CEEDD7DD1E72B4290429C734894F29C24C047AD66E358D4C7A4E76B11F7189AE0D6CBDC0721A426D6BBBEE6B0C555BE0FFEC49B85E015A087629A1604439BBE219D55A1508178586D30261E603925DE5C0B0BDB9059A897B1C51B0141C85F6044373181447FCAD5158004953E8120B354C868E34F3395C1A18BC6DDBB2202CD01A3C0E"
    $sFileBin &= "400B44720348558372FED872D443F5E348BC407224C37F7AB606779A7A183BF90B7E4297A5705167D2A52E3D122DB17510A90A4BF0A74822046BE90B0468F51DA1150C111AE61D5A5C1668C030E690E02F56964A701765918031687784606CEEFE0458C90C3BBF029ADE1648813FA705D6D1863D3160DE8E115619503900CA05111786F1B259E3041CCB1304657A006C63022B7966636123BA1F8242B049367ED35101CBB0395DB0734F42B09241AE9271B1B073AF5DE0713D3601294E1E0471331B5BDE98CCB03386D38AC1B747C40CF80376058653CD5AE4E4CB711DB2A1746299600D5A5A6203037330015C1BD3D239C281BEF95B620311B003205D70E082064DC307C114E2A7047301F695C9CFA604195D4A0343895D9B90964CA7AF724A1900B9AC5D9573401420AF00D90561E329E4720583EE40F303EF04D0E263A899F27A56F9ADA2148CCE0283FA0DD468C73AC6DAB89401F8E4D31D03DCADB5813644055E17627F807DD30BEB1DD16594AA5A01DB497493B10F8451D9587713AD4591C03244B3EA06D4E182A43AA75833CCB7BEFB8D5C1B016509D64975AF69D48D5E01960C38D8F4DC73C913D4725B9BD8F6D8F25DDCC9119A8B3B5ED94FB408CD1319C0D7C9540962FD6740DAD5ADBE71B002A4B83975E8F5F204F0128D582BF81239C3766E57CB5599CED729C1070DBE09032B7D45BC01C1018B2DA8356DF2191E3B0D3075B7AD18AAFBCE7EC0019FB82CABAD2D0B1A2133C67FE212F0466F1688022975F5B675CDED3F52AC247258DC6689E2652A07B75F73065C5B54838EB0C9B95746140D42F817D1E59C2A55A0EB244C6D02FF61C9AB03F7D621759CEF85DBB6D0A219690DA0479C5C9CF82D362CA06E21DE2601C88D1C424C254C5865136E6A99B0DB83814E6613EB14DD22B295F7913E0B558332BD521EFCEF16EE2A299862F53E2C5B024DBCBECC0EF04E430517CBC1315511456E954DBA5858E0BB57168ADBAE013D29D654C1EEF1168632D2196054E0B86A74948706DFC05D25C0A1A1A34C0FE800DD88CB47DB6162410B1707890D1AC7B230CBFE0B7F1331094709320025129FE2252263F7C34BA68DE0615C724D11E05102212307C00CAB0008456CAE1C8CC8554286C140D8554D2690D70148071183D5B05264CAE07372CDB0407938DCCC750275D80E0BFD64577E30E8680AED4CCE608F4F37B210D0BBA7F9E83355B7F081C1D5A92B6402D9FD15582CB4499FB0A66402E4C83BC8D839DA46D48AD86F655397617D66C8ABE017A043E95D916E3B912555D0EBBFBAE2C6269703A611410D1646801C2DD5446ABCF8D8B841D03DDBC14BE7FA453A94B96E2475BADBB23B7165AC70541B4E6D6C23E3154F99411B71850C64874E370378272E794EB8BEB01DAD0A7C919A1C221001889421D782EF3635A432217D0CC648FB6690CA55FA87426BBE2990D1EF297DA8ABB7B619F7541FF6697001218DDE82055A0D83CB15C1E60421070B0E12FE44F30E0029F7398993460FA12F96031953E4B90E49383708EA83431530023900724BE300ECC0C0D47682484A2D01D8A9737D4691524B8C909372FF711AA306E635F98FCA6D820362357159CFE30E6109735D8704E64BE4C076079F2256C61E02D3E432A67F05B9CBC877163628015390413403EC921C081A570F90317BEA694148F643F0430A890F1819CF6F3430B14075506D70A2207540894D004B081079436D22684B74531B8259B050DC0057D53C4B2C3982C6AE418821CA088D3C74061C40658B9A4B0C388142B42BAB7BEC6118695939F028EAF05A41B0CFA06500F009C78678361EA14662C139C74410C6804BD002E76C81C22D157061DA04FEC2A7DE0C8A1FBF4B04637DC00560037F0BBF43249E60096E9C4DC49903BD14B441800D1848DA2B17B8E50702D8DC837DE46B4BD0D4E1533EEB109F82C60A168E4405775424DC9A87FD9DF1C553771EBEE5045D5FE61E491CBFB872BB8D6785168554F7348648767B0B4BA8B79F0AE06C5717CA213C770F19556D731244A31A048A22C10E2A607F95C43404D34B425F565160840FF07357FB8C58804663013D3758E12E32D85CC62FD860653A7902E3DCDCC84E080F0B7721A1738ADE70C8C836598FCCDCE1B0DD115B5C020412D0674C051E260CCF4F3B970F63B0C3734243F51D089B039003612548C2C68781DD4172BEEBF0CC88C2109586B9034F5E896A941EE8AD48BDDA443527958410BB6D6BEDCCE0870D7E82253F234A5E209C40D113033B84DF1BBA848CEBB4295D3AA695B9665D5C4E3A58369423C2598AAF996B90FDA201712C5D587589D63E4B374B39C205404B28D2C056D1688DA516AA66569A70D0182208C7BDA5DE363A189008D4C1F7D2210F6A0CCEE8817DD41FB9C0D8049B30517E2B3121DA09933D2AC8D5D9486195E022793902A0C3E5D8C4EBDB6177EB9725E198CD885966523CBC91FDE266957725FF8C160F4C642DC4F965729835D78E2A4DE826EC55DD908CECB950E05C070F3DA0216B462839EE3A3C3CD76A12A1625C3CEF61AFE9CF5BDCB2594B02A88B0C33613AB3D6A21CC8C8A901089C4C1E48CF765A07795B75D919B05FF37676ED8229B21793BDEBE943A293CE41C6991F7779E3D08C9AC40CB9B6DA420E19DFFBB588D3FB47D8901D5D0075A9295CEFC2F782440CED8601EB87372A4C5F588283EA407101A600D70F42E18A8ED1D248588E3A88D9745094DED683C80270A0E8499A010B68414B8D60980D9D0B83FDFAB141C6603D5077197A8BAD381B4DD2C186BBAFCCA8E12C45F734D0FEC39266DBC1AD5A0E96FB5DE5"
    $sFileBin &= "A164AFE02D135D057B57A0DD5ED1EED2621F4821F0418B37B750FAC9B940639000FB24824FC36D4D5E24EFEDFD48B52F85C9C7404CD4068C88CFC84800587415AA55AAB32524505D2C82605B46070D8F8782070425742605B8082259BB3002BE289154B289E251705EECB6CF562253255FFD609C81E0B9F15FE23C8A1B1A2976759D1C817E5588CE66492001A03A824F7C7690CB484CD99C2BE256C696F00A6702912D24E0725058773C0FF1835017F675E5108844165C1405F702F08946587D5AC0E7D94A103B9F5676D3FBF76E2F59807A5C6B855A14840883C65C3C5E60E97656010346024F18A01009C2B04164EB0B030808344191118E45E6414C4441BB5FB46A1A7A7531F6D739507A1325FA24722C89C19BD60B8B7920667BAC236241601885F60A26BBD3354155DDEBBE758B595A823680508C5BA6106B100F14A0DC49ED9D6854F786970536070E4AA7882DE0D08C4F9F516EEE02252E9072F5378644014E4ECE4640063C383477B02ACEA25052425877CAF048C08A467DF0132B091C408DAF11FD36E806501409DA5AECAA0FB1DA21599E478956FBFD286705D4E3495C3F2E01B209E0823B7D20CF4118677033DC62069D1029CE63817A869F638BC32544CC25412005957B17800950C7069440E2102A4E16F6316C5BA18DFD13BB87C0933BB00434A0DFB72A9C0158C04BE10346872F340537EF43473688D383FB13DC26EA7DB1C0297A75E0C9C1B9CAC5136B7F5D8C84EB00BE59588D715C886116073BDB462F71C534C3756EB98D6A1F5570B9F703C452DBEE36A37FA412013E01D4295A1AADC7F769976158C3512D34AD3AB4D7CEFD04C8A0EC8FA8A37E1E83909CF2E05BB72DD557CCA56ACD0283857B748B90B9B584702B0202F7F1C35C430DFDCA6C317C857A9042D8756CFC5424968CDD7889A1EB8A6C02AE7DB3114504990D14B009373828DC623B4D272A83C05CDE90280CAFFDBCB6B5179E761C01580130458E033D7BA6574A6F966D6046000329E2750F6D816233FF38180D12839B196A0255C90B2E0A9F11B163D85FD089D34772D4DD178539F87206688D1C3EFECE51A5ADCB8DAAD70A8E6010B80C83612267EA0815525F6C946060A3B58D36011E843EEC26E06F0FB7AD582429F301D6FEB8DFE9DC29DF36320CCF015D4B084A9B7676E80149753F32ED53406BEEFF04977525298DB7B17A430624492839D6867CA559A75DAB9F9CB64CC3260B2805B0E80A8B602001AF0A930057EF5D773D736350B4D2FF52F90C4014A65AD8815B0F2F8B432D39B0142B140F118C248AFFC40720217CD6641CF690001793D1EBA396776372816FB804990456925B9FE25753DD8692D942029A4ACBF7EA9E01C10C03AC080418BD89A5289D0FEC6F894E0CD0D8FEEE422E1A80FBE0775B6608D3F62CD48003B4063C01DE622B2AC088089688C8C0B6AD7DD70D1DD100C828C306E2062695E2063079012889C2FA25778374C0EA7663460888D0C05CB4759BA1D02873C10E04FE848623D8ECB986BA1FACD305B1AF18D9A91E4244F18B328C786D347101F1794B2BB0E548C37F2984053973547427897C111CA01D613B3C2478365617891C95023EA41F107402E5C89545D056D0DF28334270F28D5DE8443F1C49089ABE57AC790A3BD743221EA16D656C22E14C7454E3AE068AD934B76CCEA3EE05F40C33E8B1322414BF386F02BB8CA0D8681475B50612C5F4FF2AD064CEDF7976E27F637FC119B4270A5E28741989FA1B64BB66708F4C252B04201D29899191672BA1D8DCE011869D91E4F4614C201CA49334B8EB667E9F72EF7B7C81ECB862B914AF9F8886446772C23EAD0CC58B589989925BAC42F1D91306763501189CED04F0288DAC0F88219F8D01BF1CFD18891485A4A0E665DC104FB38876B23D08894DF621010FD645A0223C893E1D304940D720100C210896F58E059B8D853AF2BEE904B45569BB24833A03749625FBBAC49CCB02A38EBF33F73A5AD8898F8CBBD6EBCDC09DBBB090008B2DB70333C0B58DE24D7F683CFF152310117B6427107CC31F8B4CFD89C8D09A8CD4055AFD8BB57651520301341A1C508901ECC93AD87B682C0DC35F6AFF5021275D617614C30F765F06508C2DBB7C2E8C04C38F13CCD63DD09A13F9068212446DC25F77183B07203C5EC3A99A860E2C6B09CF8FA9D84D446B149629C050519FC9205B371C1A049F02045BBEBB2D5E4C186A015119FC0C4DDB7D832DBF0091693408C32F37394A2E005CEFB6646C6C08518120EC4C2FC20A996C1F2425C5DC48481F0FEF590239CC73E8284F64ECBF770C1F33508B0251507900BFF796AD2FEFD3EF6A1CD9F91C20016A4CAF4BC0C647558BEC0E6816808FF4877704977064A1C15064892587EC085349140BF1565789651BFC7C141EB9B39F2C1096D58D7FB652332C0D5F5E5B8BE5D6C55E2C18A633220F8041B29425AFCF8D9841C74C5406C2D088250706DC3061108D316F5DB27FA338B429A60C5DB4AF8A30112B844DC13650F4FE29C83FA42985152CDB500802040CCFBAADE3B28F38D96089680659B6BF6E0D343F53043F0329D1093053DB680B5043FCD050FF169B8B7845F874395D11348463130AD7F819AF391FE6DAD66D6DF8D71E330C2E4215077E89AD1EC1083B434476B4CF8423D566D5E242EBF10F278813312F14A2EED5DA53406439827AD07BDBC92F374330720A408C16B19DEC6C034766EF4A30F23C29476F0B370A3D3B4244EE04E16BB397FF1F1BDC0D15C119DC0E392173065F5D002D017E306BACCF9E6C119E6DC7468606202C2023B70344B01B48044C1C817827"
    $sFileBin &= "5406CFDAB94049C04015FFFEFF02B076E2644AF7D281E22083B8ED31C24979EB96A58017339E6C43D300CE2F524227D51FEFE2203990202008B42F5C790374B8F6F084C06C915DED6D3C198B2C01E86780E61C908F1DBC8F1CC9D38186D0186337C452817F78F9D1E9128023C3036D0F2F98146F454194EDADF0C58D8C087A08DE5D68AD8838A38C01F21B53448D34C2AF231ABD4CD70D41733CC82DD68AF8488D7701B63FBDE04BC5915CF9026D74328D576C835CBD2B47B80206EEF7E5E40408D1EA81CA3781FA83E9EEFE96010B515328423D7607814904A149F3EC030B00010418A5D61C819E097C7BB12D50A97B8FFD603860B811B4A1B904735006020140ABD8BAD764AB02F5048E9A3A2755F1DCC1019AEA71F291C716F11EC1B73D8D0CB5B583E0BB01DDC8A639DA96008A205B28E696B8595B363B825314019A6B2493246F099BCA05D6C96DCDA6D90F3D8817773C741C5BE81D0C878622AF10016EAF237C89247FC6FE00B1EC97C5D06D6C31C95B82BBC2EF5FFA740723616E51BA37D929E6CF098E4CC212302E8C8AFF0C212816C045AD9904E8AD36E5BF4FF3F75BC239DA04DD78A9A7D38B790E414444B7412C4DF2CD0BE2094DB66123A102201D1C22DA96C00C8E10F91E78C29D61605E8B56E3667A48C5A31F014B60E132963A731AB120DFC730D4854854D14077F348D17698C62309681CF06B89CE38AD18394304DAB9229E30AC5A1ED76F8CC409D1C8EF1F100389762F855339F275731D2F4FB7CDFD049139D8770E9508421F72EF6E2979A870BFD80DEBF096FF18DA58DAD1D483786D7440466DBF5DCE2D465E042B394644742F0C183D723CB407145FF84F9F96D5599A8EFB14568F2650CC166172FE818EB5451BC2EBBCFF58588B5660F0B316167C647A4BE681E300FC5E562FD9F74620706CB46B8C25D483EC5070C02CEBB19F01682C22AF08E170D8000D5E3C8205A276D45F494E29F9828490DE535CEAAC4DE68387280C29DD5E60098FCB0F8D1487181476CC06BBD64118930C8B3A33248F5D468A4C2475B70E023803F70D76C675AD18135F452502221EB5B7FF06423B55F075EE393073898904536EB476A839073B0141FFA339FA8F26F083C204397310EE0B16D07361FF20C14F900986359F55450DE843D9724F808256FCE9B76DD18D58049EA08D98D07B0673247FE30D1AD375DFF3837DFD746E3B5D2073FB5670A66945CBBA0C1C8D3CC2D8EE9A6BB04D201B090757E429D91C758BD8A8E8E076034B77A65E2217B60C329BC73238C16DEBA8DB7465037349C775634F6CE5DCAEDC4DECE2077F04676DC8B9932DB80C6D759224D4B20D12CC07C728D114D6B5F7600F6131B27D02366CAAF6338B07B9FB726C2B0874C20BAD1D3A79883D0A74453785A5CAF62C73512E2C4B432CE0D6B9ED1683C67C06042889127449F175BB86405DA40C02351A44BFBFDD73CEBFB740474475BB5675EB9E6D10764A72B59F5D35751AC2042DF6233584C856DFD6D0A18F47620113FDAF513C2B064F4D101E4C90E35923AC7A506A51C150378A131B06638CBADC614F0629F1C78E8556C57E6A607365598E051CCB55C8546EC25741C3E1965DD809746E3BCE0E4B1B3B7BB619578845DADD9A80DB7A3806746C04733F0DB70005646B4FA64139C25D808D7D7604756A91A83DAC666975960F7BD03262C276377A02D7ED8043C05B75E8E416C7ED3D0E3BE473EE8FC66B787BA51CED751D4187AFDC49D837AC0BAA01AB02441B7691916D74E4A01C5D44743CB6A2A6846FC29640D6E2522BFDD304407AA33D8BD6E04204693E5770AC4B07F2153F387715FE61C027E80177168C74EC4E5775036A674F206427D78136031314C0D52A62D40CA9085B966E1BD9BF2420152C061C18C91F60691814CB4724895C49D107B83526F023BB7BD73D723CFF27C341FF0729C321C1FB02B74280966547470F704BE8E6DEA2C315EBE81F68854C60CF02A917BBB551025302CCD8CDA290DB6087D6CAE51000201376E7DF02141F1A63FF4C4B4610E6E0E34F40E80F86E5E83E0EC18BC834DB07C4578673103F0C71E1FF74CA4702D44D206A90C6EC310CF1776FFD56282104202B1C8A8B8C82B7B1B716B9B9A02DE4899C0F76BCDF05561C828B4E18BBF87176122E754B1CAB66C26638E7848E586A6A1EEF5C5D890C839A0F261A45F58AEFF21CC920CBC98B46467C4670885FB863135DE8E81176CBF3F5467D062229FBF5C846599646461DF44C72115AD4668BC5102D1F040B64BD70DA059468674F3B51D16F4DC3681C0F173BA9750743EBDC73BB421975F1FFCAC5AF4812DE26F7B4891A1008E30E774EBB6C72F2C5B0BE100CB7F740B8E846DF94E4B67158736673BC13B4AC0A5A16EC8B234BB29910CDD2B0045FBF7D4703B1B69A23F5011708E075282C978512C2415C97D813978D23947FC25DD8A551E208D8721B9731B7F2D7DC23A34FD32CDC584244AE89CED00557C2DB87CB57349AC675F0172BB49AC811B1ED21CF04448C06118ADBCB38A9225DE436500582DF8CB22531F63D0FA99ABA6239576BB581741BCF43ECA539C076168B9CFA015DE8A2184596D1BFA29DA0417725E72259784368A2037FCF820B4BFCE52EEE041E5CB0F862854E4EC67A212414100C0F001F742EE07447B55C1B0975251320432CB6601882EDE365786FE7607A84393629CA79AA07314696C835F0C4EC080DAF44480E09ADBE9A388C6F3C7929836E7705BB03CE4D8397C8EACBB1C1AABA1E3DAC57C8C475E4C067062CE7A4AAC775221903560990C71BD12717C66B95CFF8DC0907C50C7C"
    $sFileBin &= "9087E45AA9C46D4863B2046DC3DD12E0C3FAB04CFAF0EBB56FC8858C115F3CCB32944C059333170F915C9D7567FF931C87860E2A57D1E4AEDEC864343836971F39E99531AB857F3CC33D989047C9577B891C13198F1109B22FDA4D8E17932C4C552B35A3E102C9716CA43835C983900B3C7BAC0A89B32B8F7C132F6A16FA9696178B5F20E64800AEB5152C7BAC5485AF12EDC483317034F32EA38473C88B1C0E25B420B807050D9E096104B20807FFD283EDCC1C3BEB0AC64E74750ECBC1363101CC76EBC342010A086CE62261B3A3D8032CC7118975978B0CAA133C4E75900FDF63C860239F0E89AD3CDF6181B6A302E79C2797D050E002645CD957654B70BC67B3839223EC248090AF2CA29D01B9B1EC96949066E97E0252872C0C75B0530FAE0254795BBCAAE75794B26A8121912D27F081C9F5D100B96C4CC9ECCC362C1617CD0D5E04B285A40FDF2C3AB31C72D103E8C21138DA062498C2EE2822671B904F9B55F0CAEEECC39148129D9B21D8B42B532436F28386ED3A6BEF32B68C93F8550C932A1512E40A84581F05E8C09B900B3F380D6D8EB0203FFF0CEB7FB26C9B0A5FDF7728E81040BD9535CD4CC80FE7DF7021C9B6EBDAE220D50421F8101BBBE8B481E29406D59499D3916847E614811F3934906C129FBEDD17B44042B017D123FF724BC4A58A287F1027798DD81D66BD851575EA6116064D58E3D41FA45E99CBBF4C9FD252276D8F438915743BF2D56F60A60E3491CF918F0B98A77B8E8C1F1205B04047326088EED80DB04093BF45B850E5701A311600BE6B59059BADD9080880060C50757E506D2868077AE02F811097823E292F8B52482E741839566805A60421788023C79C19805F1275107D44478E95E00F76C07F30411503827F5FC9C9D9907B1006141881CEC9C91C2024DFA8C8570B5E10FB150DEAD96E4B495E1809EA9C6C6F0422060C08F2CDE24FBF69AC8D461CF80A1459BECD0D8C1D383015CC24C5D99E3D6A7C3397545A2CE622552F8D8D65F89F2D1D62EED70E5AFF781946202669010CC0CE3D6C48501D80907F9616006E27E07EDC5E489D74E5B6AAA5F4041D6DCF7425800F13562CA35D20C161CB0C7E6BD5CCB0A27EBB5D433B9174298D7E24EF9E2D3B1B3C898B332875E52A21C5D957040FD9649BB0FF46EC04E32DB04DBCC19A841DBFB614DBCE353E46108214B854094DB667DD28067D8269DC4D18C9205CF20A1C20388C482B6B718CC48C557136778AC786BC08604F168E0375349510689C0764B9ECD8BC7C7483C24E2821E9C106CF968CEBC2AFE06A5950BF71A22BC0CB9058F94E11C23F96B9A7930F4330BE0CFC217BD65D9C24178284AC2CBAC318E1C743286F437D7CBAD3409601D90E18C41C0EB03968B56F1220DEA2C569CE16EC9EF5A10DD876391C24188563D367B3C01472B823109D119427685C730308D98FE02672859BFF8480D88932466F180474B07C1C7585F875A3F1EB2EB489CF6280569789433BC641C72B9A8037F72B3C905138B475CD1140C70A7F4E930D56BC799775D0A3664F0CCDD1B33C4D5D40CA319EF80F9420BF0133148789DF8E4161BB131786EC43905C142161B0618D0CECBEFB5FDE480EE404485D6CEE1FC45826418B04874D680514D09682202B52EBDA12DD570783C74089091E4367B294141CB6588FCF6CD902B94971D8316400E410B58F5F35240F3C95080552C4224CC481C257AF6EC63A13A2164010DC83C25C0931762B75055810E45F10CCEA80B71436AF5E41C0A00C36C283805BC17A08B4858D3CDB3DA8E50C85D66FB078459AA321D19AB2598C86E8F547E239ECA4C548F4DC0D0A7E4CDDB013353AC37B11A029B0DE7705DD291A299A18516399C3C65A1742140DF0106C089E8C84734C65F402AE8020C8A5622AEE3A1B8E8C093DFFDF44CD229A70994E746B512D8F5EA4058AF814A96FFFF6E707C1E70F7701CFC707F7DFB6686B0C3248DB4F138D5B0181C06B00E0FBFE1FF5BB06135F6D2D2514386C138D728D18790869285C904713C251B46BBB019B1BDC068A1DFF9074011F586DA95CF4EE1EA3CDF70CDA746C65887C4F5E58B1E801B144299A588D076FD6BDA05C40505D92766E16BD60C9653E894316800F39108A424811C085A4EFB0238C595BBF93F06C40BE04285B830187871B9B8370C48B0A2ED085124B0BE00D7983FC425D24000A1A0300177AE5EF8993088D5002173881045246C36C1B04F47F40538029DF1D4060300238CAB786B5F619F1A9C301C0291F11B45534E23FC20539CB5EAB6A773E61AF7D67407432FC3D867C39BEBD6FA108ECAAA9964AC6D88BBE14D1A2D771D6964A93ABF8ADC0BB48FB8B8E1C014F4AC018F1770397895EDEE66E85221A73031F4E203F2C59EBA8F3D4161585B6A02F1AE6F9E4F7FF4E76F3DC6ED90018EB2090150E0102DC6BC39C684AA25D19A219B8DB7C0986280D34454D485E24F3016FFB07201124264ED4AAB3353E7C4C481708DCB3456CE1F947721055F0BD08B61F8B2B0C90B7406C0A42BCE26CD29FA2B2D55699EDC1BD01E0BA919A92862A13C240C361667ACCBC100F824A1AA22148803B3C8B9E30AB4F106DED843EF84946F03D8A98DBEEDC399D28E987ADCB44A02755AA964E8133B709205465FEEBAC05235C9C0A8164B64EBAA54AEB9E808A90BEC2E157C418B901F8F2FB555C88303B2872FBFD028F5A3063618B10575D9D1D888B4C41914A18D9B316DB9575DE772081D08C3F2F407504606F16BEEE377DF402470F3E3083E33FC1E31098A2D70ED201C3648A9C6AB1A29ADDB641BF87775E2B86A243C2492F"
    $sFileBin &= "580F59685991B747EBA89366C266861F5A00753D2161492989D36DC097553322D8029F292037A8083F2F8D63EA5B26487F7B408D5F2C17A66A3B3C474405288FE021874004B6ECEB2A81461385FAFC32881598C5522CEA46E1DD96ACD6AC17892908F7CF01EB8750E973488D8726E0B02D8BEC7E568F0F472B580F1F5116B19533FAAC5783C32C78822212AFAB1920E90ADF09C1BB8C9F833086205601227B80328A0987876F6F3BB4ACE7080CB74390A2DAA159674E1B08921D10F2EB943FAA428F3D8825881CC9172EA20D8C8F0E4143C133456B6F5F430E966478FE368DFC4BC01B087FC1188700EF5BAC7889A45720BA05CFA20D16782440026F3F0086D736846920D3566DD98A32366D20C603825CC48311460B442457E157FFF7050F0E7C6904C9E6706B3859577422ADBA078F30151C5E9D90BEBCC50061F86CFE857437B56C20279397441C8A3FD8007774D6A6E347398FB9F2DD7014A2A7BB40505C8DE0C5BE6450554F36008784046F2F1D8EC1E16190198BB3004E01C4C0172D3B24F192FA06088E6FFCECCE02B680792096402313502A0596E0138DC041D8B951EDD4458D89AC830E08195946961C0C481004D946B6671406101814081C0365641918202C67503029809E03DA63E12FC52C7EB3EF842209C40FE3F1501D5A7E28682039D3C1546BF081A74859C1E3A08A3FC42692F1ED793C43746696260A5A363F0EFBF44D14825C30817B10FEBF243ED110F70C345308316958C15BFC770A59661C839871A45B913CEF8F0E8260296F06125BA968587F405A6F31D8B35A4B917C159057865506BFBBB51B811CB9254932502F8DB65F7D308B5818C75024360E96DC101D9746048A8625388B0C83D0880D6E8E833BD872175DFD12B07BCA6E29DA380416EFF8132A352429EF3F17A92E531A904823232480993928254F6CCFB972148F89988948B354B76D11789140891E20561E550A5C9890234A80213EA9FC149925083D3B294C4388BC063C990EDCCDD5FB39FEBC720DAE50182AD3DB29F9AC0E7449AFF5F625CC5482B52455D1216A80CCFA37102102BA43105A2BF096EAAA6A6AC710022B0451E0005810F3FDCF41D797D01848C79B38440E0274199DDBDC8B3BFC693E086C4172A15850899003B899728D2CFA08EB84EF4A1A86165D518B57EF292A01B0F025F18B31FF4F6FC17B296A6F25320189173B178B010FCDED169A7F040309C3040C095E7829700771E5FF47C6F0FF07A126A400BF0C3F6D0168DB02574401132AB889566E4C44101147D6754F1B0FD58D398D42CD478E0F660DAB60414A84E46A84A17E8B1D1B45A22A1F94E2C6B7FD9873291D2A29C65BC1FE8FF031F2B987B9AE3453043734D0C24B081DC2CFB549FB172BB8064B0907EE0275E795102CEB74EBA29F5DA5B67DC9D733EB1BFF4B5C43498B5AA02EB4FFFB1B01CA114EA44B4B44649F3B5975E0027A81B537272F2A75D5C0215E412F175F58962D259F705D463791A569038856050F47579C0AC056105E08055D17C45B8D13FF4610D4062C8B7E03BAC53C82CB404BBC742F3B460C0AD4842E315658B4C85CF71658B6294C04342E7A76487175D18D34BEEBC427CD944DFF8F554657273D014D0B880AD1055641051C9310A502D98A469BAD21F2B68801B20C99AD0CC8612F25CF02982EAD0A12C95A9FCC95EE3855B3DCFE9080C71555D100B8069220FD5DA266FBD091F0060CE06B74342068D0AE0B98942097DB881DDCCE4954AB87B0C70508210CB0C07283250AA3B86C5D3FD0291495E0D00BB23BC49B2286901B591238F694E04C93D04F3965B625DF4028E0445064EC56F1FFFF88A050054C64646464480C0804766C2C7640CC000B3405380000005B5104031162A62007322403C80A00082403C8400B00ADB24032093FD334CD950B010203042FB0254D0506330203419EB3ED0405060207000A0040A0BB99FF056AF103F7540564290811A00A1905FEFF97675CA00152656C6561736553656D6170686F7265DBF67F5B4C0F7665437269746963616C1763076FEBA6E4B76E15456E746572443D742C00DAB62B47144C5474F66DBB3DF20D57611E460853696E672DDAB737F74F626A2514436C6F7548616E64126D6BDBE60C776146457664413D96EC8B95530A9C730B236E6E976CA727496E7675697AF634DBC880DE694866296BDBB6B95F336C6E630770274AB1FFE76C661E345F6578636570745F6888EEAEDDDC72332A606D6F711A6265672D673CD6BA6876642518637079B28F6FDBFFFF0757076DF09A17F03505F0F902F06901F0D402050B7204196DEDFFFF35F0B90261BBF00705D1F0D302ECF0B101C2181C193DFDFFFFB61F6228FE03F0B31C3522453982204733730528F08B170709FDF6DFDD011B070C05F0340D65F03F06070A0D0D090D070F4BFF63BF0210050D0D06000C06F00C0A040050453D4CCDFF43FE010300448DAF4BE0000E210B01050C0098081B699A27801110B0100B6E166C19020433070CC0CEDC92D01E341007CB66E9D906A0B3D66E8CB15040B21C24C0F01706B26EA7581E2EF9787436B0C176077C979098C40267DBF87220602E726424611B0E7317D27DFB06279C40022763939B636510B32A01FCA2CDED376527421B34B2103EC1B7000000700400240000FF00000000000000000000000000807C2408010F85B901000060BE009000108DBE0080FFFF57EB109090909090908A064688074701DB75078B1E83EEFC11DB72EDB80100000001DB75078B1E83EEFC11DB11C001DB73EF75098B1E83EEFC11DB73E431C983E803720DC1E0088A"
    $sFileBin &= "064683F0FF747489C501DB75078B1E83EEFC11DB11C901DB75078B1E83EEFC11DB11C975204101DB75078B1E83EEFC11DB11C901DB73EF75098B1E83EEFC11DB73E483C10281FD00F3FFFF83D1018D142F83FDFC760F8A02428807474975F7E963FFFFFF908B0283C204890783C70483E90477F101CFE94CFFFFFF5E89F7B9D40100008A07472CE83C0177F7803F0375F28B078A5F0466C1E808C1C01086C429F880EBE801F0890783C70588D8E2D98DBE00C000008B0709C0743C8B5F048D843000E0000001F35083C708FF963CE00000958A074708C074DC89F95748F2AE55FF9640E0000009C07407890383C304EBE16131C0C20C0083C7048D5EFC31C08A074709C074223CEF771101C38B0386C4C1C01086C401F08903EBE2240FC1E010668B0783C702EBE28BAE44E000008DBE00F0FFFFBB0010000050546A045357FFD58D87EF01000080207F8060287F585054505357FFD558618D4424806A0039C475FA83EC80E9272EFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005CF000003CF0000000000000000000000000000069F0000054F00000000000000000000000000000000000000000000074F0000082F0000092F00000A2F00000B0F0000000000000BEF00000000000004B45524E454C33322E444C4C006D73766372742E646C6C0000004C6F61644C69627261727941000047657450726F634164647265737300005669727475616C50726F7465637400005669727475616C416C6C6F6300005669727475616C46726565000000667265650000000000000000448DAF4B000000000EF10000010000000300000003000000F0F00000FCF0000008F10000E2100000411100006B10000017F100001FF100002EF100000000010002006C7A6D612E646C6C004C7A6D61446563004C7A6D6144656347657453697A65004C7A6D61456E6300000000E000000C0000009D3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
    If Not FileExists ( $sOutputDirPath ) Then DirCreate ( $sOutputDirPath )
    If StringRight ( $sOutputDirPath, 1 ) <> '\' Then $sOutputDirPath &= '\'
    Local $sFilePath = $sOutputDirPath & $sFileName
    If FileExists ( $sFilePath ) Then
        If $iOverWrite = 1 Then
            If Not Filedelete ( $sFilePath ) Then Return SetError ( 1, 0, $sFileBin )
        Else
            Return SetError ( 0, 0, $sFileBin )
        EndIf
    EndIf
    Local $hFile = FileOpen ( $sFilePath, 16+2 )
    If $hFile = -1 Then Return SetError ( 2, 0, $sFileBin )
    FileWrite ( $hFile, $sFileBin )
    FileClose ( $hFile )
    Return SetError ( 0, 0, $sFileBin )
EndFunc ;==> _Lzmadll ()
Func _DecodeProductKey($Product, $Offset = 0)
    Local $sKey[29], $Value = 0, $hi = 0, $n = 0, $i = 0, $dlen = 29, $slen = 15, $Result, $bKey, $iKeyOffset = 52, $RegKey
    Switch $Product
        Case "Windows"
            $bKey = RegRead("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "DigitalProductId")
        Case "Windows_DPid4"
            $bKey = RegRead("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "DigitalProductId4")
            $iKeyOffset = 0x328
        Case "Windows_Def"
            $bKey = RegRead("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey", "DigitalProductId")
        Case "Windows_Def_DPid4"
            $bKey = RegRead("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DefaultProductKey", "DigitalProductId4")
            $iKeyOffset = 0x328
        Case "Office XP"
            $RegKey = 'HKLM\SOFTWARE\Microsoft\Office\10.0\Registration'
            If @OSArch = 'x64' Then $RegKey = 'HKLM64\SOFTWARE\Wow6432Node\Microsoft\Office\10.0\Registration'
            For $i = 1 To 100
                $var = RegEnumKey($RegKey, $i)
                If @error <> 0 Then ExitLoop
                $bKey = RegRead($RegKey & '\' & $var, 'DigitalProductId')
                If Not @error Then ExitLoop
            Next
        Case "Office 2003"
            $RegKey = 'HKLM\SOFTWARE\Microsoft\Office\11.0\Registration'
            If @OSArch = 'x64' Then $RegKey = 'HKLM64\SOFTWARE\Wow6432Node\Microsoft\Office\11.0\Registration'
            For $i = 1 To 100
                $var = RegEnumKey($RegKey, $i)
                If @error <> 0 Then ExitLoop
                $bKey = RegRead($RegKey & '\' & $var, 'DigitalProductId')
                If Not @error Then ExitLoop
            Next
        Case "Office 2007"
            $RegKey = 'HKLM\SOFTWARE\Microsoft\Office\12.0\Registration'
            If @OSArch = 'x64' Then $RegKey = 'HKLM64\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Registration'
            For $i = 1 To 100
                $var = RegEnumKey($RegKey, $i)
                If @error <> 0 Then ExitLoop
                $bKey = RegRead($RegKey & '\' & $var, 'DigitalProductId')
                If Not @error Then ExitLoop
            Next
        Case "Office 2010 x86"
            $RegKey = 'HKLM\SOFTWARE\Microsoft\Office\14.0\Registration'
            If @OSArch = 'x64' Then $RegKey = 'HKLM64\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Registration'
            For $i = 1 To 100
                $var = RegEnumKey($RegKey, $i)
                If @error <> 0 Then ExitLoop
                $bKey = RegRead($RegKey & '\' & $var, 'DigitalProductId')
                If Not @error Then ExitLoop
            Next
            $iKeyOffset = 0x328
        Case "Office 2010 x64"
            If @OSArch <> 'x64' Then SetError(1, 0, "Product not found")
            $RegKey = 'HKLM64\SOFTWARE\Microsoft\Office\14.0\Registration'
            For $i = 1 To 100
                $var = RegEnumKey($RegKey, $i)
                If @error <> 0 Then ExitLoop
                $bKey = RegRead($RegKey & '\' & $var, 'DigitalProductId')
                If Not @error Then ExitLoop
            Next
            $iKeyOffset = 0x328
        Case "Office 2013 x86"
            $RegKey = 'HKLM\SOFTWARE\Microsoft\Office\15.0\Registration'
            If @OSArch = 'x64' Then $RegKey = "HKLM64\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Registration"
            For $i = 1 To 250
                $var = RegEnumKey($RegKey, $i)
                If @error <> 0 Then ExitLoop
                $bKey = RegRead($RegKey & '\' & $var, 'DigitalProductID')
                If Not @error Then ExitLoop
            Next
            $iKeyOffset = 0x328
        Case "Office 2013 x64"
            If @OSArch <> 'x64' Then SetError(1, 0, "Product not found")
            $RegKey = 'HKLM64\SOFTWARE\Microsoft\Office\15.0\Registration'
            For $i = 1 To 250
                $var = RegEnumKey($RegKey, $i)
                If @error <> 0 Then ExitLoop
                $bKey = RegRead($RegKey & '\' & $var, 'DigitalProductID')
                If Not @error Then ExitLoop
            Next
            $iKeyOffset = 0x328
        Case Else
            Return SetError(1, 0, "Product not supported")
    EndSwitch
    If Not BinaryLen($bKey) Then Return ""
    Local $aKeys[BinaryLen($bKey)]
    For $i = 0 To UBound($aKeys) - 1
        $aKeys[$i] = Int(BinaryMid($bKey, $i + 1, 1))
    Next
    Local Const $isWin8 = BitAND(Int($aKeys[66]) / 6, 1)
    $aKeys[66] = BitOR(BitAND($aKeys[66], 0xF7), BitAND($isWin8, 2) * 4)
    $i = 24
    Local $sChars = "BCDFGHJKMPQRTVWXY2346789", $iCur, $iX, $sKeyOutput, $iLast
    While $i > -1
        $iCur = 0
        $iX = 14
        While $iX > -1
            $iCur *= 256
            $iCur = $aKeys[$iX + $iKeyOffset] + $iCur
            $aKeys[$iX + $iKeyOffset] = Int($iCur / 24)
            $iCur = Mod($iCur, 24)
            $iX -= 1
        WEnd
        $i -= 1
        $sKeyOutput = StringMid($sChars, $iCur + 1, 1) & $sKeyOutput
        $iLast = $iCur
    WEnd
    If $isWin8 Then
        $sKeyOutput = StringMid($sKeyOutput, 2, $iLast) & "N" & StringTrimLeft($sKeyOutput, $iLast + 1)
    EndIf
    Return StringRegExpReplace($sKeyOutput, '(\w{5})(\w{5})(\w{5})(\w{5})(\w{5})', '\1-\2-\3-\4-\5')
EndFunc   ;==>_DecodeProductKey
#endregion - Internal Functions -
#region - Processors -
Func _CPU()
    If @error = 0 And IsArray($aCPUCounters) Then
        _PDH_CollectQueryData($hPDHQuery)
        For $i = 0 To $iTotalCPUs - 1
            $iCounterValue = _PDH_UpdateCounter($hPDHQuery, $aCPUCounters[$i][1], 0, True)
            If $i <> $iTotalCPUs - 1 Then
                GUICtrlSetData($CPU[$i], $iCounterValue)
                GUICtrlSetData($CPULabel[$i], $iCounterValue & "%")
            Else
                GUICtrlSetData($AvgCPUBar, $iCounterValue)
                GUICtrlSetData($AvgCPUBarLabel, $iCounterValue & "%")
            EndIf
        Next
    EndIf
EndFunc
Func _WinAPI_GetSystemInfo($iInformation = -1)
    If $iInformation <> -1 And($iInformation < 1 Or $iInformation > 10) Then Return SetError(1, 0, -1)
    Local $aRet, $stSystemInfo = DllStructCreate("ushort;short;dword;ptr;ptr;ulong_ptr;dword;dword;dword;short;short")
    If Not @AutoItX64 And @OSArch <> "X86" Then
        $aRet = DllCall("kernel32.dll", "none", "GetNativeSystemInfo", "ptr", DllStructGetPtr($stSystemInfo))
    Else
        $aRet = DllCall("kernel32.dll", "none", "GetSystemInfo", "ptr", DllStructGetPtr($stSystemInfo))
    EndIf
    If @error Then Return SetError(2, @error, -1)
    If $iInformation <> -1 Then
        If $iInformation = 1 Then Return DllStructGetData($stSystemInfo, 1)
        Return DllStructGetData($stSystemInfo, $iInformation + 1)
    EndIf
    Local $aSysInfo[10]
    $aSysInfo[0] = DllStructGetData($stSystemInfo, 1)
    For $i = 1 To 9
        $aSysInfo[$i] = DllStructGetData($stSystemInfo, $i + 2)
    Next
    Return $aSysInfo
EndFunc   ;==>_WinAPI_GetSystemInfo
Func _PDH_Init($bForceCountersOn = False, $bRestoreRegStateOnExit = False)
    If $_PDH_bInit Then Return True
    $_PDH_REG_MODIFIED = 0
    $_PDH_RESTORE_REG = 0
    If Not __PDH_RegistryToggle(-1) Then
        If Not $bForceCountersOn Or Not IsAdmin() Then Return SetError(16, 0, False)
        If Not __PDH_RegistryToggle(1) Then Return SetError(@error, @extended, False)
        $_PDH_REG_MODIFIED = 1
        If $bRestoreRegStateOnExit Then $_PDH_RESTORE_REG = 1
    EndIf
    $_PDH_hDLLHandle = DllOpen("pdh.dll")
    If $_PDH_hDLLHandle = -1 Then
        If $_PDH_RESTORE_REG Then
            If Not __PDH_RegistryToggle(0) Then Return SetError(@error, @extended, False)
        EndIf
        Return SetError(32, 0, False)
    EndIf
    Local $aRet = DllCall("kernel32.dll", "dword", "GetActiveProcessorCount", "word", 0xFFFF)
    If Not @error Then
        $_PDH_iCPUCount = $aRet[0]
    Else
        $_PDH_iCPUCount = _WinAPI_GetSystemInfo(6)
        If @error Then
            $_PDH_iCPUCount = EnvGet("NUMBER_OF_PROCESSORS")
            If $_PDH_iCPUCount = "" Then
                $_PDH_iCPUCount = 1
            Else
                $_PDH_iCPUCount = Int($_PDH_iCPUCount)
            EndIf
        EndIf
    EndIf
    _PDH_DebugWrite("CPU count result:" & $_PDH_iCPUCount)
    $_PDH_bInit = True
    OnAutoItExitRegister("_PDH_UnInit")
    Return True
EndFunc   ;==>_PDH_Init
Func _PDH_UnInit($hPDHQueryHandle = -1)
    If Not $_PDH_bInit Then Return True
    If @NumParams Then _PDH_FreeQueryHandle($hPDHQueryHandle)
    DllClose($_PDH_hDLLHandle)
    If $_PDH_RESTORE_REG Then __PDH_RegistryToggle(0)
    $_PDH_hDLLHandle = -1
    $_PDH_bInit = False
    OnAutoItExitUnRegister("_PDH_UnInit")
    Return
EndFunc   ;==>_PDH_UnInit
Func _PDH_GetCounterList($sCounterWildcardPath, $bReturnAsString = False)
    Local $aRet, $stExpandedPathList
    Local $hPDHDLL, $iBufSize, $sCounterList, $aCounterList[1] = [0]
    If Not IsString($sCounterWildcardPath) Then Return SetError(1, 0, $aCounterList)
    If Not $_PDH_bInit Then
        $hPDHDLL = "pdh.dll"
    Else
        $hPDHDLL = $_PDH_hDLLHandle
    EndIf
    _PDH_DebugWrite("_PDH_GetCounterList() call, $sCounterWildcardPath='" & $sCounterWildcardPath & "', PDH DLL 'handle' (or just 'pdh.dll'):" & $hPDHDLL)
    If StringLeft($sCounterWildcardPath, 1) = ':' Then
        $sCounterWildcardPath = __PDH_LocalizeCounter($sCounterWildcardPath)
        If @error Then Return SetError(@error, 0, "")
        _PDH_DebugWrite("Localized *wildcard* counter (from non-localized string):" & $sCounterWildcardPath)
    EndIf
    $aRet = DllCall($hPDHDLL, "long", "PdhExpandWildCardPathW", "ptr", ChrW(0), "wstr", $sCounterWildcardPath, "ptr", ChrW(0), "dword*", $iBufSize, "dword", 0)
    If @error Then Return SetError(2, @error, $aCounterList)
    If $aRet[0] <> 0x800007D2 Then
        $_PDH_iLastError = $aRet[0]
        _PDH_DebugWriteErr("PdhExpandWildCardPathW 1st call unsuccessful, return:" & Hex($_PDH_iLastError))
        Return SetError(3, $_PDH_iLastError, $aCounterList)
    EndIf
    $iBufSize = $aRet[4]
    If @OSVersion = "WIN_2000" Or StringLeft(@OSVersion, 6) = "WIN_XP" Then $iBufSize += 1
    $stExpandedPathList = DllStructCreate("byte[" & ($iBufSize * 2) & ']')
    $aRet = DllCall($hPDHDLL, "long", "PdhExpandWildCardPathW", "ptr", ChrW(0), "wstr", $sCounterWildcardPath, "ptr", DllStructGetPtr($stExpandedPathList), "dword*", $iBufSize, "dword", 0)
    If @error Then Return SetError(2, @error, $aCounterList)
    If $aRet[0] Then
        $_PDH_iLastError = $aRet[0]
        _PDH_DebugWriteErr("PdhExpandWildCardPathW 2nd call unsuccessful, return:" & Hex($_PDH_iLastError))
        If $aRet[0] = 0x800007D2 Then
            _PDH_DebugWriteErr("PdhExpandWildCardPathW 2nd call returned 'PDH_MORE_DATA'. 1st reported Bufsize:" & $iBufSize & ", 2nd call's Bufsize:" & $aRet[4])
        EndIf
        Return SetError(4, $_PDH_iLastError, $aCounterList)
    EndIf
    $sCounterList = BinaryToString(DllStructGetData($stExpandedPathList, 1), 2)
    If StringRegExp($sCounterList, "\*(\)|\\|/|$)") Then
        _PDH_DebugWriteErr("There are still * wildcards left after a call to PdhExpandWildCardPathW!" & @CRLF & "Original wildcard path:" & $sCounterWildcardPath)
        Return SetError(1, 0, $aCounterList)
    EndIf
    Local $iStrip = 0
    If StringRight($sCounterList, 1) = ChrW(0) Then $iStrip = 1
    If StringMid($sCounterList, $iBufSize - 1, 1) = ChrW(0) Then $iStrip += 1
    If $bReturnAsString Then
        Return StringTrimRight($sCounterList, $iStrip)
    Else
        $aCounterList = StringSplit(StringTrimRight($sCounterList, $iStrip), ChrW(0), 1)
        If Not @error Then
            _PDH_DebugWrite("_PDH_GetCounterList() call success, returning a " & $aCounterList[0] & "-element array")
            Return $aCounterList
        Else
            Dim $aCounterList[1]
            $aCounterList[0] = 0
            _PDH_DebugWriteErr("PdhExpandWildCardPathW data invalid")
            Return SetError(5, 0, $aCounterList)
        EndIf
    EndIf
EndFunc   ;==>_PDH_GetCounterList
Func _PDH_GetNewQueryHandle($iUserInfo = 0)
    If Not $_PDH_bInit Then
        If Not _PDH_Init() Then Return SetError(@error, 0, 0)
    EndIf
    Local $aRet = DllCall($_PDH_hDLLHandle, "long", "PdhOpenQueryW", "ptr", 0, "dword_ptr", $iUserInfo, "ptr*", Ptr(0))
    If @error Then Return SetError(2, @error, 0)
    If $aRet[0] Then
        $_PDH_iLastError = $aRet[0]
        _PDH_DebugWriteErr("_PDH_GetNewQueryHandle call returned with PDH error:" & Hex($_PDH_iLastError))
        Return SetError(3, $_PDH_iLastError, 0)
    EndIf
    _PDH_DebugWrite("_PDH_GetNewQueryHandle Call succeeded, return:" & $aRet[0] & ",param1:" & $aRet[1] & ",param2:" & $aRet[2] & ",handle:" & $aRet[3])
    Return $aRet[3]
EndFunc   ;==>_PDH_GetNewQueryHandle
Func _PDH_FreeQueryHandle(ByRef $hPDHQueryHandle)
    If Not IsPtr($hPDHQueryHandle) Then Return SetError(1, 0, False)
    If Not $_PDH_bInit Then Return SetError(16, 0, False)
    Local $aRet = DllCall($_PDH_hDLLHandle, "long", "PdhCloseQuery", "ptr", $hPDHQueryHandle)
    If @error Then Return SetError(2, @error, False)
    If $aRet[0] Then
        $_PDH_iLastError = $aRet[0]
        _PDH_DebugWriteErr("PdhCloseQuery DLL call unsuccessful for handle: " & Hex($hPDHQueryHandle) & ", return:" & Hex($_PDH_iLastError))
        Return SetError(3, $_PDH_iLastError, False)
    EndIf
    $hPDHQueryHandle = 0
    Return True
EndFunc   ;==>_PDH_FreeQueryHandle
Func _PDH_AddCounter($hPDHQueryHandle, $sCounterPath, $iUserInfo = 0)
    If Not $_PDH_bInit Then Return SetError(16, 0, 0)
    If Not IsPtr($hPDHQueryHandle) Then Return SetError(1, 0, 0)
    If StringLeft($sCounterPath, 1) = ':' Then
        $sCounterPath = __PDH_LocalizeCounter($sCounterPath)
        If @error Then Return SetError(@error, 0, "")
        _PDH_DebugWrite("Localized counter (from non-localized string):" & $sCounterPath)
    EndIf
    Local $aRet = DllCall($_PDH_hDLLHandle, "long", "PdhAddCounterW", "ptr", $hPDHQueryHandle, "wstr", $sCounterPath, "dword_ptr", $iUserInfo, "ptr*", Ptr(0))
    If @error Then Return SetError(2, @error, 0)
    If $aRet[0] Then
        $_PDH_iLastError = $aRet[0]
        _PDH_DebugWriteErr("PdhAddCounterW error [path:'" & $sCounterPath & "'], return:" & Hex($_PDH_iLastError))
        Return SetError(3, $_PDH_iLastError, 0)
    EndIf
    _PDH_DebugWrite("PdhAddCounterW success for path '" & $sCounterPath & "', handle:" & $aRet[4])
    Return $aRet[4]
EndFunc   ;==>_PDH_AddCounter
Func _PDH_AddCountersByArray($hPDHQueryHandle, Const ByRef $aCounterArray, $iStart = 0, $iEnd = -1, $iBottomRows = 0, $iColumns = 0)
    Local $iFailures = 0, $iReturnIndex, $aCountersReturn[1][2] = [[0, 0]]
    If Not $_PDH_bInit Then Return SetError(16, 0, $aCountersReturn)
    If Not IsArray($aCounterArray) Or UBound($aCounterArray, 0) > 1 Or $iBottomRows < 0 Or $iColumns < 0 Then Return SetError(1, 0, $aCountersReturn)
    If Not IsPtr($hPDHQueryHandle) Then Return SetError(1, 0, $aCountersReturn)
    If $iEnd = -1 Then $iEnd = UBound($aCounterArray) - 1
    If $iStart < 0 Or $iStart > $iEnd Or $iEnd > UBound($aCounterArray) - 1 Then Return SetError(1, 0, $aCountersReturn)
    Dim $aCountersReturn[$iEnd - $iStart + 1 + $iBottomRows][2 + $iColumns]
    If $iBottomRows Then $aCountersReturn[0][0] = $iEnd - $iStart + 1
    $iReturnIndex = $iBottomRows
    For $i = $iStart To $iEnd
        $aCountersReturn[$iReturnIndex][0] = $aCounterArray[$i]
        $aCountersReturn[$iReturnIndex][1] = _PDH_AddCounter($hPDHQueryHandle, $aCounterArray[$i])
        If @error Then $iFailures += 1
        $iReturnIndex += 1
    Next
    If $iFailures = ($iEnd - $iStart + 1) Then
        Dim $aCountersReturn[1][2]
        $aCountersReturn[0][0] = 0
        Return SetError(8, $iFailures, $aCountersReturn)
    EndIf
    Return SetExtended($iFailures, $aCountersReturn)
EndFunc   ;==>_PDH_AddCountersByArray
Func _PDH_GetCounterNameByIndex($iIndex, $sPCName = "")
    Local $hPDHDLL, $aRet, $sMachineParamType, $vMachineParam
    If Not $_PDH_bInit Then
        $hPDHDLL = "pdh.dll"
    Else
        $hPDHDLL = $_PDH_hDLLHandle
    EndIf
    _PDH_DebugWrite("_PDH_GetCounterNameByIndex() call, Index:" & $iIndex & " [optional] Machine Name:" & $sPCName & ", PDH DLL 'handle' (or just 'pdh.dll'):" & $hPDHDLL)
    $vMachineParam = StringRegExpReplace($sPCName, "(\\\\[^\\]+)?(\\?.*)", "$1")
    If $vMachineParam = "" Then
        $vMachineParam = 0
        $sMachineParamType = "ptr"
    Else
        _PDH_DebugWrite("_PDH_GetCounterNameByIndex Machine name: " & $vMachineParam)
        $sMachineParamType = "wstr"
    EndIf
    $aRet = DllCall($hPDHDLL, "long", "PdhLookupPerfNameByIndexW", $sMachineParamType, $vMachineParam, "dword", $iIndex, "wstr", "", "dword*", 65536)
    If @error Then Return SetError(2, @error, "")
    If $aRet[0] Then
        $_PDH_iLastError = $aRet[0]
        _PDH_DebugWriteErr("_PDH_GetCounterNameByIndex non-zero error code:" & Hex($_PDH_iLastError))
        Return SetError(3, $_PDH_iLastError, "")
    EndIf
    Return $aRet[3]
EndFunc   ;==>_PDH_GetCounterNameByIndex
Func _PDH_CollectQueryData($hPDHQueryHandle, $bSkipChecks = False)
    If Not $bSkipChecks Then
        If Not $_PDH_bInit Then Return SetError(16, 0, False)
        If Not IsPtr($hPDHQueryHandle) Then Return SetError(1, 0, False)
    EndIf
    Local $aRet = DllCall($_PDH_hDLLHandle, "long", "PdhCollectQueryData", "ptr", $hPDHQueryHandle)
    If @error Then Return SetError(2, @error, False)
    If $aRet[0] Then
        $_PDH_iLastError = $aRet[0]
        _PDH_DebugWriteErr("PdhCollectQueryData error, return:" & Hex($_PDH_iLastError))
        Return SetError(3, $_PDH_iLastError, False)
    EndIf
    Return True
EndFunc   ;==>_PDH_CollectQueryData
Func _PDH_UpdateCounter($hPDHQueryHandle, $hPDHCounterHandle, $sCounterPath = "", $bGrabValueOnly = False)
    If Not $_PDH_bInit Then Return SetError(16, 0, -1)
    If Not IsPtr($hPDHCounterHandle) Then Return SetError(1, 0, -1)
    If Not $bGrabValueOnly Then
        If Not IsPtr($hPDHQueryHandle) Then Return SetError(1, 0, -1)
        If Not _PDH_CollectQueryData($hPDHQueryHandle, True) Then Return SetError(@error, @extended, -1)
    EndIf
    Local $stCounterValue = DllStructCreate("long;int64")
    Local $aRet = DllCall($_PDH_hDLLHandle, "long", "PdhGetFormattedCounterValue", "ptr", $hPDHCounterHandle, "dword", 0x8400, "dword*", 0, "ptr", DllStructGetPtr($stCounterValue))
    If @error Then Return SetError(2, @error, -1)
    If $aRet[0] Then
        $_PDH_iLastError = $aRet[0]
        If $aRet[0] = 0xC0000BC6 And DllStructGetData($stCounterValue, 1) = 0x800007D1 Then
            _PDH_DebugWriteErr("Invalid Data (invalid handle) message for Handle:" & $hPDHCounterHandle & ", Path [if passed]:" & $sCounterPath)
            Return SetError(-1, $_PDH_iLastError, -1)
        EndIf
        _PDH_DebugWriteErr("Error Calling PdhGetFormattedCounterValue for Handle:" & $hPDHCounterHandle & ", Path [if passed]:" & $sCounterPath & ", Return:" & Hex($_PDH_iLastError))
        Return SetError(4, $_PDH_iLastError, -1)
    EndIf
    If $sCounterPath = -2 Or($sCounterPath <> "" And StringRegExp($sCounterPath, "(:23(0|2)\\6|(Thread|Process)\([^%]+%)", 0)) Then Return Round(DllStructGetData($stCounterValue, 2) / $_PDH_iCPUCount)
    Return DllStructGetData($stCounterValue, 2)
EndFunc   ;==>_PDH_UpdateCounter
Func _PDH_DebugWrite($sString, $bAddCRLF = True, $bErr = False)
    If $PDH_DEBUGLOG < 2 Then Return
    If $bAddCRLF Then $sString &= @CRLF
    ConsoleWrite($sString)
EndFunc   ;==>_PDH_DebugWrite
Func _PDH_DebugWriteErr($sString, $bAddCRLF = True)
    If $PDH_DEBUGLOG < 1 Then Return
    If $bAddCRLF Then $sString &= @CRLF
    ConsoleWriteError($sString)
EndFunc   ;==>_PDH_DebugWriteErr
Func __PDH_RegistryToggle($bEnable, $sPCName = '')
    If Not IsString($sPCName) Then Return SetError(1, 0, False)
    If $sPCName <> '' Then $sPCName &= '\'
    Local $PDH_RegValues[3][3] = [[$sPCName & "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib", ''],[$sPCName & "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfOS\Performance", ''],[$sPCName & "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance", '']]
    Local Const $PDH_DisableValue = "Disable Performance Counters"
    Local $iSetVal, $iErr = 0, $iChanged = 0
    If $bEnable Then
        $iSetVal = 0
    Else
        $iSetVal = 1
    EndIf
    For $i = 0 To 2
        $PDH_RegValues[$i][1] = RegRead($PDH_RegValues[$i][0], $PDH_DisableValue)
        If @error Then $PDH_RegValues[$i][1] = 0
        If($bEnable And $PDH_RegValues[$i][1] And IsInt($PDH_RegValues[$i][1])) Or($bEnable = 0 And $PDH_RegValues[$i][1] = 0) Then
            If $bEnable = -1 Then
                _PDH_DebugWriteErr("Performance Counters disabled, Registry Key: '" & $PDH_RegValues[$i][0] & "'")
                Return SetError(-1, 0, False)
            EndIf
            RegWrite($PDH_RegValues[$i][0], $PDH_DisableValue, "REG_DWORD", $iSetVal)
            $iErr = @error
            If $iErr Then ExitLoop
            $iChanged += 1
        EndIf
    Next
    If $bEnable = -1 Then Return 1
    If $iErr Then
        For $i = 0 To 2
            If($bEnable And $PDH_RegValues[$i][1] And IsInt($PDH_RegValues[$i][1])) Or($bEnable = 0 And $PDH_RegValues[$i][1] = 0) Then
                RegWrite($PDH_RegValues[$i][0], $PDH_DisableValue, "REG_DWORD", $PDH_RegValues[$i][1])
            EndIf
        Next
        Return SetError(16, $iErr, False)
    EndIf
    Return SetExtended($iChanged, True)
EndFunc   ;==>__PDH_RegistryToggle
Func __PDH_LocalizeCounter($sNonLocalizedCounter)
    Local $aSplitPath, $sPCName = ""
    $aSplitPath = StringSplit(StringTrimLeft($sNonLocalizedCounter, 1), "\", 0)
    If @error Or $aSplitPath[0] < 3 Then Return SetError(7, 0, "")
    If $aSplitPath[0] > 3 And $aSplitPath[4] <> "" Then $sPCName = '\\' & $aSplitPath[4]
    Return $sPCName & '\' & _PDH_GetCounterNameByIndex(Int($aSplitPath[1]), $sPCName) & $aSplitPath[3] & '\' & _PDH_GetCounterNameByIndex(Int($aSplitPath[2]), $sPCName)
EndFunc   ;==>__PDH_LocalizeCounter
Func _PDH_GetCPUCounters($hPDHQuery, $sPCName = "")
    If $sPCName <> "" And StringLeft($sPCName, 2) = "\\" Then $sPCName = StringTrimLeft($sPCName, 1)
    Local $aCPUsList = _PDH_GetCounterList(":238\6\(*)" & $sPCName)
    If @error Then Return SetError(@error, @extended, "")
    Local $aCPUCounters = _PDH_AddCountersByArray($hPDHQuery, $aCPUsList, 1, -1)
    If @error Then Return SetError(@error, @extended, "")
    Return SetExtended($aCPUsList[0], $aCPUCounters)
EndFunc   ;==>_PDH_GetCPUCounters
#endregion - Processors - 

Noticed it works on Drives C,D,E there is no drive F then doesn't show msgbox when I click G,H,I,J so on

Edited by Rogue5099
Link to comment
Share on other sites

noticed if I did this:

Case $DriveButton[1], $DriveButton[2], $DriveButton[3], $DriveButton[4], $DriveButton[5], $DriveButton[6], $DriveButton[7], $DriveButton[8], $DriveButton[9]
            MsgBox(0, "", GUICtrlRead($iMsg))

instead of this it works:

Case $DriveButton[1] To UBound($DriveButton)
            MsgBox(0, "", GUICtrlRead($iMsg))

Any way to cover all the buttons (being unkown) from computer to computer without listing all of them?

Link to comment
Share on other sites

First, add this line after the section of code where you create your buttons for the drive letters.

ReDim $DriveButton[$aDrive[0] + 1]

This will shrink the array down to the proper size.

then change this line in your main loop.

; from this:
Case $DriveButton[1] To UBound($DriveButton)
; to this
Case $DriveButton[1] To $DriveButton[UBound($DriveButton) - 1]

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...