Jump to content

Recommended Posts

Posted

Get system information and Create reports in HTML and CSV format:

;#NoTrayIcon
;Opt("MustDeclareVars", 1)

Global $oMyError = ObjEvent("AutoIt.Error", "__PCinfo_ObjErrorFunc")
Global Const $cI_CompName = @ComputerName, $sBlankMAC = "00:00:00:00:00:00", $ERR_NO_INFO = "Array contains no information", $ERR_NOT_OBJ = "$colItems isnt an object"
Global $isWin64 = False, $softCount = 0, $sAdapterInfo
If StringInStr(@OSArch, "64") Then $isWin64 = True
Global $Report_SaveDir = @ScriptDir
If Not __PCinfo_Singleton("PC_Scan_Info") Then Exit
If Not FileExists($Report_SaveDir) Then DirCreate($Report_SaveDir)
Global $sHTML_Content, $sFilePath_SaveHTML = $Report_SaveDir & "\" & @ComputerName & "_HTML.htm"
Global $sLogs_Content, $sFilePath_SaveLog = $Report_SaveDir & "\" & @ComputerName & "_Csv.log"

_Get_PCinformation()


Func _Get_PCinformation()
    ToolTip('System Info Getting...', (@DesktopWidth / 2) - 20, 10)
    __PCinfo_HTML_AddHeader(@ComputerName & " System Information")
    Local $error, $extended, $sPC_Info
    $sPC_Info &= @CRLF
    Local $__PCinfo_Get_SysOverview = __PCinfo_Get_SysOverview()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_SysOverview')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_SysOverview')
        EndSwitch
    Else
        __Write_PCinfo($__PCinfo_Get_SysOverview, 'System_Overview', @ComputerName & ',System Infomation')
    EndIf
    Local $Network_Adapters = __PCinfo_Get_AdaptersInfo()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_AdaptersInfo')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_AdaptersInfo')
        EndSwitch
    Else
        __Write_PCinfo($Network_Adapters, 'Network_Adapters', 'Index,Network_Adapters,Name,Status,IPType,IP,SubNetIP,MAC,GetwayIP,MAC,Speed,DNS1,DNS2,DNS3,DNS4,DNS5,DNS6,DNS7,DNS8,DNS_Num')
    EndIf
    $sPC_Info &= @CRLF
    Local $Drives = __PCinfo_Get_Drives()
    If @error Then
        $error = @error
        $extended = @extended
        __PCinfo_DebugMsg("DriveGetDrive Error!", '__PCinfo_Get_Drives')
    Else
        __Write_PCinfo($Drives, 'Drives', 'Drive,DriveType,DriveStatus,FileSystem,Label,Serial,SpaceFree(GB),SpaceTotal(GB),DriveBusType,MapTo,IsSSD')
    EndIf
    $sPC_Info &= @CRLF
    Local $SystemProduct = __PCinfo_Get_SystemProduct()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_SystemProduct')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_SystemProduct')
        EndSwitch
    Else
        __Write_PCinfo($SystemProduct, 'SystemProduct', 'Name,IdentifyingNumber,SKUNumber,UUID,Description,Vendor,Version')
    EndIf
    $sPC_Info &= @CRLF
    Local $OSs = __PCinfo_Get_OSs()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_OSs')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_OSs')
        EndSwitch
    Else
        __Write_PCinfo($OSs, 'OS', 'Name,BootDevice,BuildNumber,BuildType,Description,CodeSet,CountryCode,CreationClassName,CSCreationClassName,CSDVersion,CSName,CurrentTimeZone,DataExecutionPrevention_32BitApplications,DataExecutionPrevention_Available,DataExecutionPrevention_Drivers,DataExecutionPrevention_SupportPolicy,Debug,Distributed,EncryptionLevel,ForegroundApplicationBoost,FreePhysicalMemory,FreeSpaceInPagingFiles,FreeVirtualMemory,InstALLDate,LargeSystemCache,LastBootUpTime,LocalDateTime,Locale,Manufacturer,MaxNumberOfProcesses,MaxProcessMemorySize,NumberOfLicensedUsers,NumberOfProcesses,NumberOfUsers,Organization,OSLanguage,OSProductSuite,OSType,OtherTypeDescription,PlusProductID,PlusVersionNumber,Primary,ProductType,QuantumLength,QuantumType,RegisteredUser,SerialNumber,ServicePackMajorVersion,ServicePackMinorVersion,SizeStoredInPagingFiles,Status,SuiteMask,SystemDevice,SystemDirectory,SystemDrive,TotalSwapSpaceSize,TotalVirtualMemorySize,TotalVisibleMemorySize,Version,WindowsDirectory')
    EndIf
    $sPC_Info &= @CRLF
    Local $Users = __PCinfo_Get_Users()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Users')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Users')
        EndSwitch
    Else
        __Write_PCinfo($Users, 'Users', 'Name,Domain,Status,LocalAccount,SID,SIDType,Description,FullName,Disabled,Lockout,PasswordChangeable,PasswordExpires,PasswordRequired,AccountType')
    EndIf
    $sPC_Info &= @CRLF
    Local $Groups = __PCinfo_Get_Groups()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Groups')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Groups')
        EndSwitch
    Else
        __Write_PCinfo($Groups, 'Groups', 'Name,Domain,Status,LocalAccount,SID,SIDType,Description')

    EndIf
    $sPC_Info &= @CRLF
    Local $sFilePath_SaveHTMLgedOnUser = __PCinfo_Get_LoggedOnUsers()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_LoggedOnUsers')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_LoggedOnUsers')
        EndSwitch
    Else
        __Write_PCinfo($sFilePath_SaveHTMLgedOnUser, 'Logged Users', 'DomainName,UserName,LogonID')
    EndIf
    Local $Desktop = __PCinfo_Get_Desktops()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Desktops')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Desktops')
        EndSwitch
    Else
        __Write_PCinfo($Desktop, 'Desktops', 'Name,BorderWidth,CoolSwitch,CursorBlinkRate,Description,DragFullWindows,GridGranularity,IconSpacing,IconTitleFaceName,IconTitleSize,IconTitleWrap,Pattern,ScreenSaverActive,ScreenSaverExecutable,ScreenSaverSecure,ScreenSaverTimeout,SettingID,WALLpaper,WALLpaperStretched,WALLpaperTiled')
    EndIf
    $sPC_Info &= @CRLF
    Local $Shares = __PCinfo_Get_Shares()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Shares')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Shares')
        EndSwitch
    Else
        __Write_PCinfo($Shares, 'Shares', 'Name,AccessMask,ALLowMaximum,MaximumALLowed,Description,Path,Status,Type')
    EndIf
    $sPC_Info &= @CRLF
    Local $Startup = __PCinfo_Get_Startup()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Startup')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Startup')
        EndSwitch
    Else
        __Write_PCinfo($Startup, 'Startup', 'Name,User,Location,Command,Description,SettingID')
    EndIf
    $sPC_Info &= @CRLF
    Local $System = __PCinfo_Get_System()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_System')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_System')
        EndSwitch
    Else
        __Write_PCinfo($System, 'System', 'Name,AdminPasswordStatus,AutomaticResetBootOption,AutomaticResetCapability,Description,BootOptionOnLimit,BootOptionOnWatchDog,BootROMSupported,BootupState,ChassisBootupState,CreationClassName,CurrentTimeZone,DaylightInEffect,Domain,DomainRole,EnableDaylightSavingsTime,FrontPanelResetStatus,InfraredSupported,InitiALLoadInfo,KeyboardPasswordStatus,LastLoadInfo,Manufacturer,Model,NameFormat,NetworkServerModeEnabled,NumberOfProcessors,OEMLogoBitmap,OEMStringArray,PartOfDomain,PauseAfterReset,PowerManagementCapabilities,PowerManagementSupported,PowerOnPasswordStatus,PowerState,PowerSupplyState,PrimaryOwnerContact,PrimaryOwnerName,ResetCapability,ResetCount,ResetLimit,Roles,Status,SupportContactDescription,SystemStartupDelay,SystemStartupOptions,SystemStartupSetting,SystemType,ThermalState,TotalPhysicalMemory,UserName,WakeUpType,Workgroup')
    EndIf
    $sPC_Info &= @CRLF
    Local $BIOS = __PCinfo_Get_BIOS()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_BIOS')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_BIOS')
        EndSwitch
    Else
        __Write_PCinfo($BIOS, 'BIOS', 'Name,Status,BIOSCharacteristics,BIOSVersion,Description,BuildNumber,CodeSet,CurrentLanguage,IdentificationCode,InstALLableLanguages,LanguageEdition,ListofLanguages,Manufacturer,OtherTargetOS,PrimaryBIOS,ReleaseDate,SerialNumber,SMBIOSBIOSVersion,SMBIOSMajorVersion,SMBIOSMinorVersion,SMBIOSPresent,SoftwareElementID,SoftwareElementState,TargetOperatingSystem,Version')
    EndIf
    $sPC_Info &= @CRLF
    Local $Keyboard = __PCinfo_Get_Keyboard()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Keyboard')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Keyboard')
        EndSwitch
    Else
        __Write_PCinfo($Keyboard, 'Keyboard', 'Name,Availability,ConfigManagerErrorCode,ConfigManagerUserConfig,Description,CreationClassName,DeviceID,ErrorCleared,ErrorDescription,IsLocked,LastErrorCode,Layout,NumberofFunctionKeys,Password,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,Status,StatusInfo,SystemCreationClassName,SystemName')
    EndIf
    $sPC_Info &= @CRLF
    Local $Memory = __PCinfo_Get_Memory()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Memory')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Memory')
        EndSwitch
    Else
        __Write_PCinfo($Memory, 'Memory', 'Name,BankLabel,Capacity,CreationClassName,Description,DataWidth,DeviceLocator,FormFactor,HotSwappable,InterleaveDataDepth,InterleavePosition,Manufacturer,MemoryType,Model,OtherIdentifyingInfo,PartNumber,PositionInRow,PoweredOn,Removable,Replaceable,SerialNumber,SKU,Speed,Status,Tag,TotalWidth,TypeDetail,Version')
    EndIf
    $sPC_Info &= @CRLF
    Local $Monitor = __PCinfo_Get_Monitors()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Monitors')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Monitors')
        EndSwitch
    Else
        __Write_PCinfo($Monitor, 'Monitor', 'Name,Availability,Bandwidth,ConfigManagerErrorCode,Description,ConfigManagerUserConfig,CreationClassName,DeviceID,DisplayType,ErrorCleared,ErrorDescription,IsLocked,LastErrorCode,MonitorManufacturer,MonitorType,PixelsPerXLogicalInch,PixelsPerYLogicalInch,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,ScreenHeight,ScreenWidth,Status,StatusInfo,SystemCreationClassName,SystemName')
    EndIf
    $sPC_Info &= @CRLF
    Local $Motherboard = __PCinfo_Get_Motherboard()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Motherboard')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Motherboard')
        EndSwitch
    Else
        __Write_PCinfo($Motherboard, 'Motherboard', 'Name,Availability,ConfigManagerErrorCode,ConfigManagerUserConfig,Description,CreationClassName,DeviceID,ErrorCleared,ErrorDescription,LastErrorCode,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,PrimaryBusType,RevisionNumber,SecondaryBusType,Status,StatusInfo,SystemCreationClassName,SystemName')
    EndIf
    $sPC_Info &= @CRLF
    Local $Mouse = __PCinfo_Get_Mouse()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Mouse')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Mouse')
        EndSwitch
    Else
        __Write_PCinfo($Mouse, 'Mouse', 'Name,Availability,ConfigManagerErrorCode,ConfigManagerUserConfig,Description,CreationClassName,DeviceID,DeviceInterface,DoubleSpeedThreshold,ErrorCleared,ErrorDescription,Handedness,HardwareType,InfFileName,InfSection,IsLocked,LastErrorCode,Manufacturer,NumberOfButtons,PNPDeviceID,PointingType,PowerManagementCapabilities,PowerManagementSupported,QuadSpeedThreshold,Resolution,SampleRate,Status,StatusInfo,Synch,SystemCreationClassName,SystemName')
    EndIf
    $sPC_Info &= @CRLF
    Local $NetworkCards = __PCinfo_Get_NetworkCards()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_NetworkCards')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_NetworkCards')
        EndSwitch
    Else
        __Write_PCinfo($NetworkCards, 'NetworkCards', 'Name,AdapterType,AdapterTypeID,AutoSense,Description,Availability,ConfigManagerErrorCode,ConfigManagerUserConfig,CreationClassName,DeviceID,ErrorCleared,ErrorDescription,Index,InstALLed,LastErrorCode,MACAddress,Manufacturer,MaxNumberControlled,MaxSpeed,NetConnectionID,NetConnectionStatus,NetworkAddresses,PermanentAddress,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,ProductName,ServiceName,Speed,Status,StatusInfo,SystemCreationClassName,SystemName,TimeOfLastReset')
    EndIf
    $sPC_Info &= @CRLF
    Local $Print = __PCinfo_Get_Printers()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Printers')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Printers')
        EndSwitch
    Else
        __Write_PCinfo($Print, 'Print', 'Name,Attributes,Availability,AvailableJobSheets,Description,AveragePagesPerMinute,Capabilities,CapabilityDescriptions,CharSetsSupported,Comment,ConfigManagerErrorCode,ConfigManagerUserConfig,CreationClassName,CurrentCapabilities,CurrentCharSet,CurrentLanguage,CurrentMimeType,CurrentNaturALLanguage,CurrentPaperType,Default,DefaultCapabilities,DefaultCopies,DefaultLanguage,DefaultMimeType,DefaultNumberUp,DefaultPaperType,DefaultPriority,DetectedErrorState,DeviceID,Direct,DoCompleteFirst,DriverName,EnableBIDI,EnableDevQueryPrint,ErrorCleared,ErrorDescription,ErrorInformation,ExtendedDetectedErrorState,ExtendedPrinttatus,Hidden,HorizontalResolution,JobCountSinceLastReset,KeepPrintedJobs,LanguagesSupported,LastErrorCode,Local,Location,MarkingTechnology,MaxCopies,MaxNumberUp,MaxSizeSupported,MimeTypesSupported,NaturALLanguagesSupported,Network,PaperSizesSupported,PaperTypesAvailable,Parameters,PNPDeviceID,PortName,PowerManagementCapabilities,PowerManagementSupported,PrinterPaperNames,Printtate,Printtatus,PrintJobDataType,PrintProcessor,Priority,Published,Queued,RawOnly,SeparatorFile,ServerName,Shared,ShareName,SpoolEnabled,Status,StatusInfo,SystemCreationClassName,SystemName,VerticalResolution,WorkOffline')
    EndIf
    $sPC_Info &= @CRLF
    Local $Processors = __PCinfo_Get_Processors()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Processors')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Processors')
        EndSwitch
    Else
        __Write_PCinfo($Processors, 'Processors', 'Name,AddressWidth,Architecture,Availability,Description,ConfigManagerErrorCode,ConfigManagerUserConfig,CPUStatus,CreationClassName,CurrentClockSpeed,CurrentVoltage,DataWidth,DeviceID,ErrorCleared,ErrorDescription,ExtClock,Family,L2CacheSize,L2CacheSpeed,LastErrorCode,Level,LoadPercentage,Manufacturer,MaxClockSpeed,OtherFamilyDescription,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,ProcessorID,ProcessorType,Revision,Role,SocketDesignation,Status,StatusInfo,Stepping,SystemCreationClassName,SystemName,UniqueID,UpgradeMethod,Version,VoltageCaps')
    EndIf
    $sPC_Info &= @CRLF
    Local $SoundCards = __PCinfo_Get_SoundCards()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_SoundCards')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_SoundCards')
        EndSwitch
    Else
        __Write_PCinfo($SoundCards, 'SoundCards', 'Name,Availability,ConfigManagerErrorCode,ConfigManagerUserConfig,Description,CreationClassName,DeviceID,DMABufferSize,ErrorCleared,ErrorDescription,LastErrorCode,Manufacturer,MPU401Address,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,ProductName,Status,StatusInfo,SystemCreationClassName,SystemName')
    EndIf
    $sPC_Info &= @CRLF
    Local $VideoCards = __PCinfo_Get_VideoCards()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_VideoCards')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_VideoCards')
        EndSwitch
    Else
        __Write_PCinfo($VideoCards, 'VideoCards', 'Name,AcceleratorCapabilities,AdapterCompatibility,AdapterDACType,Description,AdapterRAM,Availability,CapabilityDescriptions,ColorTableEntries,ConfigManagerErrorCode,ConfigManagerUserConfig,CreationClassName,CurrentBitsPerPixel,CurrentHorizontalResolution,CurrentNumberOfColors,CurrentNumberOfColumns,CurrentNumberOfRows,CurrentRefreshRate,CurrentScanMode,CurrentVerticalResolution,DeviceID,DeviceSpecificPens,DitherType,DriverDate,DriverVersion,ErrorCleared,ErrorDescription,ICMIntent,ICMMethod,InfFilename,InfSection,InstALLedDisplayDrivers,LastErrorCode,MaxMemorySupported,MaxNumberControlled,MaxRefreshRate,MinRefreshRate,Monochrome,NumberOfColorPlanes,NumberOfVideoPages,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,ProtocolSupported,ReservedSystemPaletteEntries,SpecificationVersion,Status,StatusInfo,SystemCreationClassName,SystemName,SystemPaletteEntries,TimeOfLastReset,VideoArchitecture,VideoMemoryType,VideoMode,VideoModeDescription,VideoProcessor')
    EndIf
    $sPC_Info &= @CRLF
    Local $Software = __PCinfo_Get_Software()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Software')
        EndSwitch
    Else
        __Write_PCinfo($Software, 'Software', 'DisplayName,DisplayVersion,Publisher,InstALLDate,EstimatedSize,NoElevateOnModify,NoModify,NoRemove,NoRepair,InstALLLocation,UninstALLString')
    EndIf
    $sPC_Info &= @CRLF
    Local $Services = __PCinfo_Get_Services("ALL")
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Services')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Services')
        EndSwitch
    Else
        __Write_PCinfo($Services, 'Services', 'Name,State,Status,AcceptPause,AcceptStop,CheckPoint,CreationClassName,DesktopInteract,DisplayName,ErrorControl,ExitCode,PathName,ProcessId,ServiceSpecificExitCode,ServiceType,Started,StartMode,StartName,SystemCreationClassName,SystemName,TagId,WaitHint,Descriptiont')
    EndIf
    $sPC_Info &= @CRLF
    Local $Battery = __PCinfo_Get_Battery()
    If @error Then
        $error = @error
        $extended = @extended
        Switch $extended
            Case 1
                __PCinfo_DebugMsg($ERR_NO_INFO, '__PCinfo_Get_Battery')
            Case 2
                __PCinfo_DebugMsg($ERR_NOT_OBJ, '__PCinfo_Get_Battery')
        EndSwitch
    Else
        __Write_PCinfo($Battery, 'Battery', 'Name,Availability,BatteryRechargeTime,BatteryStatus,Description,Chemistry,ConfigManagerErrorCode,ConfigManagerUserConfig,CreationClassName,DesignCapacity,DesignVoltage,DeviceID,ErrorCleared,ErrorDescription,EstimatedChargeRemaining,EstimatedRunTime,ExpectedBatteryLife,ExpectedLife,FullChargeCapacity,LastErrorCode,MaxRechargeTime,PNPDeviceID,PowerManagementCapabilities,PowerManagementSupported,SmartBatteryVersion,Status,StatusInfo,SystemCreationClassName,SystemName,TimeOnBattery,TimeToFullCharge')
    EndIf
    __PCinfo_HTML_AddFooter()
    Global $hO_HTML = FileOpen($sFilePath_SaveHTML, 2 + 8 + 128)
    FileWrite($hO_HTML, $sHTML_Content)
    FileClose($hO_HTML)
    ShellExecute($sFilePath_SaveHTML)
    Global $hO_Logs = FileOpen($sFilePath_SaveLog, 2 + 8 + 128)
    FileWrite($hO_Logs, $sLogs_Content)
    FileClose($hO_Logs)
    ShellExecute($sFilePath_SaveLog)
    ToolTip('')
    Return $sPC_Info
EndFunc   ;==>_Get_PCinformation
Func __Write_PCinfo(ByRef $iArray, $sTitle, $iHeader)
    __PCinfo_Write_Array2HTML($iArray, $sTitle, $iHeader)
    __PCinfo_Write_Array2CSVlog($iArray, $sTitle, $iHeader)
EndFunc   ;==>__Write_PCinfo
Func __PCinfo_DebugMsg($message, $time = 0)
    ConsoleWrite("! Error: " & $message & ' - Time: ' & $time & @CRLF)
EndFunc   ;==>__PCinfo_DebugMsg
Func __PCinfo_Get_Drives($sDriveType = "ALL")
    Local $cDrive
    Local $aArray = DriveGetDrive($sDriveType)
    If @error Then
        Return
    Else
        Dim $aDriveInfo[UBound($aArray)][11]
        $aDriveInfo[0][0] = $aArray[0]
        For $i = 1 To $aArray[0]
            $cDrive = StringUpper($aArray[$i])
            $aDriveInfo[$i][0] = $cDrive & '\'
            $sDriveType = DriveGetType($cDrive)
            $aDriveInfo[$i][1] = $sDriveType
            $aDriveInfo[$i][2] = DriveStatus($cDrive)
            $aDriveInfo[$i][3] = DriveGetFileSystem($cDrive)
            $aDriveInfo[$i][4] = DriveGetLabel($cDrive)
            $aDriveInfo[$i][5] = DriveGetSerial($cDrive)
            $aDriveInfo[$i][6] = Round(DriveSpaceFree($cDrive) / 1024, 2)
            $aDriveInfo[$i][7] = Round(DriveSpaceTotal($cDrive) / 1024, 2)
            $aDriveInfo[$i][8] = DriveGetType($cDrive, 3)
            Switch $sDriveType
                Case "Network"
                    $aDriveInfo[$i][9] = DriveMapGet($cDrive)
                    $aDriveInfo[$i][8] = 'SMB'
                Case "Fixed"
                    $aDriveInfo[$i][10] = (StringUpper(DriveGetType($cDrive, 2)) == 'SSD') ? True : False
            EndSwitch
            $sDriveType = ''
        Next
        Return $aDriveInfo
    EndIf
    Return SetError(1, 0, 0)
EndFunc   ;==>__PCinfo_Get_Drives
Func __PCinfo_Get_Desktops()
    Local $colItems, $objWMIService, $objItem
    Dim $aDesktopInfo[1][20], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Desktop", "WQL", 0x10 + 0x20)
    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aDesktopInfo[UBound($aDesktopInfo) + 1][20]
            $aDesktopInfo[$i][0] = $objItem.Name
            $aDesktopInfo[$i][1] = $objItem.BorderWidth
            $aDesktopInfo[$i][2] = $objItem.CoolSwitch
            $aDesktopInfo[$i][3] = $objItem.CursorBlinkRate
            $aDesktopInfo[$i][4] = $objItem.Description
            $aDesktopInfo[$i][5] = $objItem.DragFullWindows
            $aDesktopInfo[$i][6] = $objItem.GridGranularity
            $aDesktopInfo[$i][7] = $objItem.IconSpacing
            $aDesktopInfo[$i][8] = $objItem.IconTitleFaceName
            $aDesktopInfo[$i][9] = $objItem.IconTitleSize
            $aDesktopInfo[$i][10] = $objItem.IconTitleWrap
            $aDesktopInfo[$i][11] = $objItem.Pattern
            $aDesktopInfo[$i][12] = $objItem.ScreenSaverActive
            $aDesktopInfo[$i][13] = $objItem.ScreenSaverExecutable
            $aDesktopInfo[$i][14] = $objItem.ScreenSaverSecure
            $aDesktopInfo[$i][15] = $objItem.ScreenSaverTimeout
            $aDesktopInfo[$i][16] = $objItem.SettingID
            $aDesktopInfo[$i][17] = $objItem.WALLpaper
            $aDesktopInfo[$i][18] = $objItem.WALLpaperStretched
            $aDesktopInfo[$i][19] = $objItem.WALLpaperTiled
            $i += 1
        Next
        $aDesktopInfo[0][0] = UBound($aDesktopInfo) - 1
        If $aDesktopInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aDesktopInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Desktops
Func __PCinfo_Get_Groups()
    Local $colItems, $objWMIService, $objItem
    Dim $aGroupInfo[1][7], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Group", "WQL", 0x10 + 0x20)
    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aGroupInfo[UBound($aGroupInfo) + 1][7]
            $aGroupInfo[$i][0] = $objItem.Name
            $aGroupInfo[$i][1] = $objItem.Domain
            $aGroupInfo[$i][2] = $objItem.Status
            $aGroupInfo[$i][3] = $objItem.LocalAccount
            $aGroupInfo[$i][4] = $objItem.Description
            $aGroupInfo[$i][5] = $objItem.SID
            $aGroupInfo[$i][6] = $objItem.SIDType
            $i += 1
        Next
        $aGroupInfo[0][0] = UBound($aGroupInfo) - 1
        If $aGroupInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aGroupInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Groups
Func __PCinfo_Get_LoggedOnUsers()
    Local $colItems, $objWMIService, $objItem
    Local $sFilePath_SaveHTMLgedOnUserInfo, $linePattern, $aExpRet
    Dim $aLoggedOnUserInfo[1][3], $i = 1
    $linePattern = '(?i)(?:=")([^"]*)'
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_LoggedOnUser", "WQL", 0x10 + 0x20)
    If IsObj($colItems) Then
        For $objItem In $colItems
            $sFilePath_SaveHTMLgedOnUserInfo &= $objItem.Antecedent
            $sFilePath_SaveHTMLgedOnUserInfo &= $objItem.Dependent
        Next
        $aExpRet = StringRegExp($sFilePath_SaveHTMLgedOnUserInfo, $linePattern, 3)
        ReDim $aLoggedOnUserInfo[UBound($aExpRet) / 3 + 1][3]
        Local $j = 0
        For $i = 1 To UBound($aLoggedOnUserInfo) - 1 Step 1
            $aLoggedOnUserInfo[$i][0] = $aExpRet[$j]
            $aLoggedOnUserInfo[$i][1] = $aExpRet[$j + 1]
            $aLoggedOnUserInfo[$i][2] = $aExpRet[$j + 2]
            $j += 3
        Next
        $aLoggedOnUserInfo[0][0] = UBound($aLoggedOnUserInfo) - 1
        If $aLoggedOnUserInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aLoggedOnUserInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_LoggedOnUsers
Func __PCinfo_Get_OSs()
    Local $colItems, $objWMIService, $objItem
    Dim $aOSInfo[1][60], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem", "WQL", 0x10 + 0x20)
    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][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
        Return $aOSInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_OSs
Func __PCinfo_Get_Services($sState = "ALL")
    Local $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20
    Local $colItems, $objWMIService, $objItem
    Dim $aServicesInfo[1][23], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Service", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) Then
        For $objItem In $colItems
            If $sState <> "ALL" Then
                If $sState = "Stopped" And $objItem.State <> "Stopped" Then ContinueLoop
                If $sState = "Running" And $objItem.State <> "Running" Then ContinueLoop
            EndIf
            ReDim $aServicesInfo[UBound($aServicesInfo) + 1][23]
            $aServicesInfo[$i][0] = $objItem.Name
            $aServicesInfo[$i][1] = $objItem.State
            $aServicesInfo[$i][2] = $objItem.Status
            $aServicesInfo[$i][3] = $objItem.AcceptPause
            $aServicesInfo[$i][4] = $objItem.AcceptStop
            $aServicesInfo[$i][5] = $objItem.CheckPoint
            $aServicesInfo[$i][6] = $objItem.CreationClassName
            $aServicesInfo[$i][7] = $objItem.DesktopInteract
            $aServicesInfo[$i][8] = $objItem.DisplayName
            $aServicesInfo[$i][9] = $objItem.ErrorControl
            $aServicesInfo[$i][10] = $objItem.ExitCode
            $aServicesInfo[$i][11] = $objItem.PathName
            $aServicesInfo[$i][12] = $objItem.ProcessId
            $aServicesInfo[$i][13] = $objItem.ServiceSpecificExitCode
            $aServicesInfo[$i][14] = $objItem.ServiceType
            $aServicesInfo[$i][15] = $objItem.Started
            $aServicesInfo[$i][16] = $objItem.StartMode
            $aServicesInfo[$i][17] = $objItem.StartName
            $aServicesInfo[$i][18] = $objItem.SystemCreationClassName
            $aServicesInfo[$i][19] = $objItem.SystemName
            $aServicesInfo[$i][20] = $objItem.TagId
            $aServicesInfo[$i][21] = $objItem.WaitHint
            $aServicesInfo[$i][22] = $objItem.Description
            $i += 1
        Next
        $aServicesInfo[0][0] = UBound($aServicesInfo) - 1
        If $aServicesInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aServicesInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Services
Func __PCinfo_Get_Shares()
    Local $colItems, $objWMIService, $objItem
    Dim $aShareInfo[1][8], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Share", "WQL", 0x10 + 0x20)
    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aShareInfo[UBound($aShareInfo) + 1][8]
            $aShareInfo[$i][0] = $objItem.Name
            $aShareInfo[$i][1] = $objItem.AccessMask
            $aShareInfo[$i][2] = $objItem.ALLowMaximum
            $aShareInfo[$i][3] = $objItem.MaximumALLowed
            $aShareInfo[$i][4] = $objItem.Description
            $aShareInfo[$i][5] = $objItem.Path
            $aShareInfo[$i][6] = $objItem.Status
            $aShareInfo[$i][7] = $objItem.Type
            $i += 1
        Next
        $aShareInfo[0][0] = UBound($aShareInfo) - 1
        If $aShareInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aShareInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Shares
Func __PCinfo_Get_Software()
    Local Const $UnInstKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstALL"
    Local $i = 1, $SoftName, $Count = 1, $AppKey
    Dim $aSoftwareInfo[1][11]
    While 1
        $AppKey = RegEnumKey($UnInstKey, $i)
        If @error <> 0 Then ExitLoop
        $SoftName = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), "(remove only)", ""), 3)
        $i += 1
        If ($SoftName == '') Then ContinueLoop
        ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][11]
        $aSoftwareInfo[$Count][0] = $SoftName
        $aSoftwareInfo[$Count][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3)
        $aSoftwareInfo[$Count][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3)
        $aSoftwareInfo[$Count][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "InstALLDate"), 3)
        $aSoftwareInfo[$Count][4] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "EstimatedSize"), 3)
        $aSoftwareInfo[$Count][5] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "NoElevateOnModify"), 3)
        $aSoftwareInfo[$Count][6] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "NoModify"), 3)
        $aSoftwareInfo[$Count][7] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "NoRemove"), 3)
        $aSoftwareInfo[$Count][8] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "NoRepair"), 3)
        $aSoftwareInfo[$Count][9] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "InstALLLocation"), 3)
        $aSoftwareInfo[$Count][10] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstALLString"), 3)
        $Count += 1
        $AppKey = ''
        $SoftName = ''
    WEnd
    $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
    If $aSoftwareInfo[0][0] < 1 Then
        SetError(1, 1, 0)
    EndIf
    Return $aSoftwareInfo
EndFunc   ;==>__PCinfo_Get_Software
Func __PCinfo_Get_Startup()
    Local $colItems, $objWMIService, $objItem
    Dim $aStartupInfo[1][6], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_StartupCommand", "WQL", 0x10 + 0x20)
    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aStartupInfo[UBound($aStartupInfo) + 1][6]
            $aStartupInfo[$i][0] = $objItem.Name
            $aStartupInfo[$i][1] = $objItem.User
            $aStartupInfo[$i][2] = $objItem.Location
            $aStartupInfo[$i][3] = $objItem.Command
            $aStartupInfo[$i][4] = $objItem.Description
            $aStartupInfo[$i][5] = $objItem.SettingID
            $i += 1
        Next
        $aStartupInfo[0][0] = UBound($aStartupInfo) - 1
        If $aStartupInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aStartupInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Startup
Func __PCinfo_Get_Users()
    Local $colItems, $objWMIService, $objItem
    Dim $aUserInfo[1][14], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", "WQL", 0x10 + 0x20)
    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aUserInfo[UBound($aUserInfo) + 1][14]
            $aUserInfo[$i][0] = $objItem.Name
            $aUserInfo[$i][1] = $objItem.Domain
            $aUserInfo[$i][2] = $objItem.Status
            $aUserInfo[$i][3] = $objItem.LocalAccount
            $aUserInfo[$i][4] = $objItem.Description
            $aUserInfo[$i][5] = $objItem.SIDType
            $aUserInfo[$i][6] = $objItem.SID
            $aUserInfo[$i][7] = $objItem.FullName
            $aUserInfo[$i][8] = $objItem.Disabled
            $aUserInfo[$i][9] = $objItem.Lockout
            $aUserInfo[$i][10] = $objItem.PasswordChangeable
            $aUserInfo[$i][11] = $objItem.PasswordExpires
            $aUserInfo[$i][12] = $objItem.PasswordRequired
            $aUserInfo[$i][13] = $objItem.AccountType
            $i += 1
        Next
        $aUserInfo[0][0] = UBound($aUserInfo) - 1
        If $aUserInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aUserInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Users
Func __PCinfo_Get_Battery()
    Local $colItems, $objWMIService, $objItem
    Dim $aBatteryInfo[1][31], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Battery", "WQL", 0x10 + 0x20)
    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
        Return $aBatteryInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Battery
Func __PCinfo_Get_BIOS()
    Local $colItems, $objWMIService, $objItem
    Dim $aBIOSInfo[1][25], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", 0x10 + 0x20)
    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][15] = __StringToDate($objItem.ReleaseDate)
            $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
        Return $aBIOSInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_BIOS
Func __PCinfo_Get_Keyboard()
    Local $colItems, $objWMIService, $objItem
    Dim $aKeyboardInfo[1][21], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Keyboard", "WQL", 0x10 + 0x20)
    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
        Return $aKeyboardInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Keyboard
Func __PCinfo_Get_Memory()
    Local $colItems, $objWMIService, $objItem
    Dim $aMemoryInfo[1][28], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMemory", "WQL", 0x10 + 0x20)
    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
        Return $aMemoryInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Memory
Func __PCinfo_Get_Monitors()
    Local $colItems, $objWMIService, $objItem
    Dim $aMonitorInfo[1][26], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DesktopMonitor", "WQL", 0x10 + 0x20)
    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
        Return $aMonitorInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Monitors
Func __PCinfo_Get_Motherboard()
    Local $colItems, $objWMIService, $objItem
    Dim $aMotherboardInfo[1][20], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_MotherboardDevice", "WQL", 0x10 + 0x20)
    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
        Return $aMotherboardInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Motherboard
Func __PCinfo_Get_Mouse()
    Local $colItems, $objWMIService, $objItem
    Dim $aMouseInfo[1][31], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PointingDevice", "WQL", 0x10 + 0x20)
    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
        Return $aMouseInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Mouse
Func __PCinfo_Get_NetworkCards()
    Local $colItems, $objWMIService, $objItem
    Dim $aNetworkInfo[1][34], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL", 0x10 + 0x20)
    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
        Return $aNetworkInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_NetworkCards
Func __PCinfo_Get_Printers()
    Local $colItems, $objWMIService, $objItem
    Dim $aPrinterInfo[1][85], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer", "WQL", 0x10 + 0x20)
    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aPrinterInfo[UBound($aPrinterInfo) + 1][85]
            $aPrinterInfo[$i][0] = $objItem.Name
            $aPrinterInfo[$i][1] = $objItem.Attributes
            $aPrinterInfo[$i][2] = $objItem.Availability
            $aPrinterInfo[$i][3] = $objItem.AvailableJobSheets(0)
            $aPrinterInfo[$i][4] = $objItem.Description
            $aPrinterInfo[$i][5] = $objItem.AveragePagesPerMinute
            $aPrinterInfo[$i][6] = $objItem.Capabilities(0)
            $aPrinterInfo[$i][7] = $objItem.CapabilityDescriptions(0)
            $aPrinterInfo[$i][8] = $objItem.CharSetsSupported(0)
            $aPrinterInfo[$i][9] = $objItem.Comment
            $aPrinterInfo[$i][10] = $objItem.ConfigManagerErrorCode
            $aPrinterInfo[$i][11] = $objItem.ConfigManagerUserConfig
            $aPrinterInfo[$i][12] = $objItem.CreationClassName
            $aPrinterInfo[$i][13] = $objItem.CurrentCapabilities(0)
            $aPrinterInfo[$i][14] = $objItem.CurrentCharSet
            $aPrinterInfo[$i][15] = $objItem.CurrentLanguage
            $aPrinterInfo[$i][16] = $objItem.CurrentMimeType
            $aPrinterInfo[$i][17] = $objItem.CurrentNaturALLanguage
            $aPrinterInfo[$i][18] = $objItem.CurrentPaperType
            $aPrinterInfo[$i][19] = $objItem.Default
            $aPrinterInfo[$i][20] = $objItem.DefaultCapabilities(0)
            $aPrinterInfo[$i][21] = $objItem.DefaultCopies
            $aPrinterInfo[$i][22] = $objItem.DefaultLanguage
            $aPrinterInfo[$i][23] = $objItem.DefaultMimeType
            $aPrinterInfo[$i][24] = $objItem.DefaultNumberUp
            $aPrinterInfo[$i][25] = $objItem.DefaultPaperType
            $aPrinterInfo[$i][26] = $objItem.DefaultPriority
            $aPrinterInfo[$i][27] = $objItem.DetectedErrorState
            $aPrinterInfo[$i][28] = $objItem.DeviceID
            $aPrinterInfo[$i][29] = $objItem.Direct
            $aPrinterInfo[$i][30] = $objItem.DoCompleteFirst
            $aPrinterInfo[$i][31] = $objItem.DriverName
            $aPrinterInfo[$i][32] = $objItem.EnableBIDI
            $aPrinterInfo[$i][33] = $objItem.EnableDevQueryPrint
            $aPrinterInfo[$i][34] = $objItem.ErrorCleared
            $aPrinterInfo[$i][35] = $objItem.ErrorDescription
            $aPrinterInfo[$i][36] = $objItem.ErrorInformation(0)
            $aPrinterInfo[$i][37] = $objItem.ExtendedDetectedErrorState
            $aPrinterInfo[$i][38] = $objItem.ExtendedPrinterStatus
            $aPrinterInfo[$i][39] = $objItem.Hidden
            $aPrinterInfo[$i][40] = $objItem.HorizontalResolution
            $aPrinterInfo[$i][41] = __StringToDate($objItem.InstALLDate)
            $aPrinterInfo[$i][42] = $objItem.JobCountSinceLastReset
            $aPrinterInfo[$i][43] = $objItem.KeepPrintedJobs
            $aPrinterInfo[$i][44] = $objItem.LanguagesSupported(0)
            $aPrinterInfo[$i][45] = $objItem.LastErrorCode
            $aPrinterInfo[$i][46] = $objItem.Local
            $aPrinterInfo[$i][47] = $objItem.Location
            $aPrinterInfo[$i][48] = $objItem.MarkingTechnology
            $aPrinterInfo[$i][49] = $objItem.MaxCopies
            $aPrinterInfo[$i][50] = $objItem.MaxNumberUp
            $aPrinterInfo[$i][51] = $objItem.MaxSizeSupported
            $aPrinterInfo[$i][52] = $objItem.MimeTypesSupported(0)
            $aPrinterInfo[$i][53] = $objItem.NaturALLanguagesSupported(0)
            $aPrinterInfo[$i][54] = $objItem.Network
            $aPrinterInfo[$i][55] = $objItem.PaperSizesSupported(0)
            $aPrinterInfo[$i][56] = $objItem.PaperTypesAvailable(0)
            $aPrinterInfo[$i][57] = $objItem.Parameters
            $aPrinterInfo[$i][58] = $objItem.PNPDeviceID
            $aPrinterInfo[$i][59] = $objItem.PortName
            $aPrinterInfo[$i][60] = $objItem.PowerManagementCapabilities(0)
            $aPrinterInfo[$i][61] = $objItem.PowerManagementSupported
            $aPrinterInfo[$i][62] = $objItem.PrinterPaperNames(0)
            $aPrinterInfo[$i][63] = $objItem.PrinterState
            $aPrinterInfo[$i][64] = $objItem.PrinterStatus
            $aPrinterInfo[$i][65] = $objItem.PrintJobDataType
            $aPrinterInfo[$i][66] = $objItem.PrintProcessor
            $aPrinterInfo[$i][67] = $objItem.Priority
            $aPrinterInfo[$i][68] = $objItem.Published
            $aPrinterInfo[$i][69] = $objItem.Queued
            $aPrinterInfo[$i][70] = $objItem.RawOnly
            $aPrinterInfo[$i][71] = $objItem.SeparatorFile
            $aPrinterInfo[$i][72] = $objItem.ServerName
            $aPrinterInfo[$i][73] = $objItem.Shared
            $aPrinterInfo[$i][74] = $objItem.ShareName
            $aPrinterInfo[$i][75] = $objItem.SpoolEnabled
            $aPrinterInfo[$i][76] = __StringToDate($objItem.StartTime)
            $aPrinterInfo[$i][77] = $objItem.Status
            $aPrinterInfo[$i][78] = $objItem.StatusInfo
            $aPrinterInfo[$i][79] = $objItem.SystemCreationClassName
            $aPrinterInfo[$i][80] = $objItem.SystemName
            $aPrinterInfo[$i][81] = __StringToDate($objItem.TimeOfLastReset)
            $aPrinterInfo[$i][82] = __StringToDate($objItem.UntilTime)
            $aPrinterInfo[$i][83] = $objItem.VerticalResolution
            $aPrinterInfo[$i][84] = $objItem.WorkOffline
            $i += 1
        Next
        $aPrinterInfo[0][0] = UBound($aPrinterInfo) - 1
        If $aPrinterInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aPrinterInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Printers
Func __PCinfo_Get_Processors()
    Local $colItems, $objWMIService, $objItem
    Dim $aProcessorInfo[1][42], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", 0x10 + 0x20)
    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
        Return $aProcessorInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_Processors
Func __PCinfo_Get_SoundCards()
    Local $colItems, $objWMIService, $objItem
    Dim $aSoundCardInfo[1][21], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_SoundDevice", "WQL", 0x10 + 0x20)
    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
        Return $aSoundCardInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_SoundCards
Func __PCinfo_Get_System()
    Local $colItems, $objWMIService, $objItem
    Dim $aSystemInfo[1][52], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem", "WQL", 0x10 + 0x20)
    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
        Return $aSystemInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_System
Func __PCinfo_Get_SystemProduct()
    Local $colItems, $objWMIService, $objItem
    Dim $aSysProductInfo[1][7], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystemProduct", "WQL", 0x10 + 0x20)
    If IsObj($colItems) Then
        For $objItem In $colItems
            ReDim $aSysProductInfo[UBound($aSysProductInfo) + 1][7]
            $aSysProductInfo[$i][0] = $objItem.Name
            $aSysProductInfo[$i][1] = $objItem.IdentifyingNumber
            $aSysProductInfo[$i][2] = $objItem.SKUNumber
            $aSysProductInfo[$i][3] = $objItem.UUID
            $aSysProductInfo[$i][4] = $objItem.Description
            $aSysProductInfo[$i][5] = $objItem.Vendor
            $aSysProductInfo[$i][6] = $objItem.Version
            $i += 1
        Next
        $aSysProductInfo[0][0] = UBound($aSysProductInfo) - 1
        If $aSysProductInfo[0][0] < 1 Then
            SetError(1, 1, 0)
        EndIf
        Return $aSysProductInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_SystemProduct
Func __PCinfo_Get_VideoCards()
    Local $colItems, $objWMIService, $objItem
    Dim $aVideoInfo[1][59], $i = 1
    $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_VideoController", "WQL", 0x10 + 0x20)
    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
        Return $aVideoInfo
    Else
        SetError(1, 2, 0)
    EndIf
EndFunc   ;==>__PCinfo_Get_VideoCards
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 __PCinfo_Write_Array2HTML($iArray, $sTitle = '', $TableHeader = '')
    Local $varRowColorValue, $xDim = UBound($iArray, 1) - 1
    Local $yDim = UBound($iArray, 2) - 1
    $sHTML_Content &= "<div class=""container""><h3><a href='#" & StringReplace($sTitle, " ", "_") & "' data-toggle='collapse'>" & $sTitle & "</a></h3>" & @CRLF
    $sHTML_Content &= "<div id='" & StringReplace($sTitle, " ", "_") & "' class='collapse'><table border='0'>" & @CRLF
    If ($TableHeader <> "") And ($TableHeader <> Default) Then
        If StringInStr($TableHeader, ',') Then
            Local $aHeader = StringSplit($TableHeader, ',', 1)
            If IsArray($aHeader) Then
                $sHTML_Content &= '<tr bgcolor="#C4E1FF">' & @CRLF
                For $h = 1 To $aHeader[0]
                    If ($h == 1) Then
                        $sHTML_Content &= "<td><center>" & $aHeader[$h] & "</center></td>" & @CRLF
                    Else
                        $sHTML_Content &= "<td>" & $aHeader[$h] & "</td>" & @CRLF
                    EndIf
                Next
                $sHTML_Content &= "</tr>" & @CRLF
            EndIf
        EndIf
    EndIf
    Local $varRowColor = 0
    For $x = 0 To $xDim
        If $varRowColor = 0 Then
            $varRowColor = 1
            $varRowColorValue = "#9BCDFF"
        Else
            $varRowColor = 0
            $varRowColorValue = "#C4E1FF"
        EndIf
        $sHTML_Content &= "<tr bgcolor='" & $varRowColorValue & "'>" & @CRLF
        For $y = 0 To $yDim
            If ($y == 0) Then
                $sHTML_Content &= "<td><center>" & StringReplace($iArray[$x][$y], '|', @CRLF) & "</center></td>" & @CRLF
            Else
                $sHTML_Content &= "<td>" & StringReplace($iArray[$x][$y], '|', @CRLF) & "</td>" & @CRLF
            EndIf
        Next
        $sHTML_Content &= "</tr>" & @CRLF
    Next
    $sHTML_Content &= "</table></div></div></br>" & @CRLF & @CRLF
EndFunc   ;==>__PCinfo_Write_Array2HTML
Func __PCinfo_Write_Array2CSVlog($iArray, $sTitle = '', $LogHeader = '')
    Local $xDim = UBound($iArray, 1) - 1
    Local $yDim = UBound($iArray, 2) - 1
    $sLogs_Content &= @CRLF & '# ' & $sTitle & ' :---------------------------------------------\' & @CRLF
    If ($LogHeader <> "") And ($LogHeader <> Default) Then $sLogs_Content &= $LogHeader & @CRLF
    For $x = 0 To $xDim
        For $y = 0 To $yDim
            If (StringStripWS($iArray[$x][$y], 8) == '') Then ContinueLoop
            $sLogs_Content &= '"' & $iArray[$x][$y] & '"'
            If $y < $yDim Then
                $sLogs_Content &= ","
            Else
                $sLogs_Content &= @CRLF
            EndIf
        Next
    Next
    $sLogs_Content &= @CRLF & '# ' & $sTitle & ' :---------------------------------------------/' & @CRLF & @CRLF
EndFunc   ;==>__PCinfo_Write_Array2CSVlog
Func __PCinfo_HTML_AddHeader($sTitle = @ComputerName & " System Info")
    $sHTML_Content &= '<html>' & @CRLF
    $sHTML_Content &= '<head><meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" /><title>' & $sTitle & '</title>' & @CRLF
    $sHTML_Content &= '<!--<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">' & @CRLF
    $sHTML_Content &= '<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>' & @CRLF
    $sHTML_Content &= '<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>' & @CRLF
    $sHTML_Content &= '<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>-->' & @CRLF
    $sHTML_Content &= '</head>' & @CRLF
    $sHTML_Content &= "<body><title>" & $sTitle & "</title>" & @CRLF & "<div class=""jumbotron jumbotron-fluid""><div class=""container""><center><h1>" & $sTitle & "</h1></div></div>" & "<div class=""container"">Scan Initiated: " & @MON & "/" & @MDAY & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & "</br></br></br></div>" & @CRLF
EndFunc   ;==>__PCinfo_HTML_AddHeader
Func __PCinfo_HTML_AddFooter()
    $sHTML_Content &= "</div></br><div class=""container"">Scan Complete: " & @MON & "/" & @MDAY & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & "</div>" & @CRLF
    $sHTML_Content &= '</body></html>' & @CRLF
EndFunc   ;==>__PCinfo_HTML_AddFooter
Func __PCinfo_Get_SysOverview()
    Dim $aWin_Info[13][2]
    $aWin_Info[0][0] = 12
    $aWin_Info[1][0] = '' & 'ComputerName'
    $aWin_Info[1][1] = '' & @ComputerName
    $aWin_Info[2][0] = 'UserName'
    $aWin_Info[2][1] = @UserName
    Local $_winver = FileGetVersion(@SystemDir & "\ntoskrnl.exe")
    If @error Then $_winver = FileGetVersion(@SystemDir & "\winver.exe")
    If $isWin64 Then
        $aWin_Info[3][0] = '' & 'ProductName'
        $aWin_Info[3][1] = RegRead('HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName') & ' ' & RegRead('HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'DisplayVersion') & ' ' & $_winver & ' ' & @CPUArch & ((@OSServicePack <> '') ? ' ' & @OSServicePack : '')
    Else
        $aWin_Info[3][0] = '' & 'ProductName'
        $aWin_Info[3][1] = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName') & ' ' & RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'DisplayVersion') & ' ' & $_winver & ' ' & @CPUArch & ((@OSServicePack <> '') ? ' ' & @OSServicePack : '')
    EndIf
    Local $cpu_ProcessorName = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0', "ProcessorNameString")
    Local $cpu_Identifier = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0', "Identifier")
    If $cpu_ProcessorName = '' Then $cpu_ProcessorName = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\1', "ProcessorNameString")
    If $cpu_Identifier = '' Then $cpu_Identifier = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\1', "Identifier")
    Local $main_Manufacturer = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS', "BaseBoardManufacturer")
    If $main_Manufacturer <> '' Then $main_Manufacturer = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS', "BIOSVendor")
    If $main_Manufacturer <> '' Then $main_Manufacturer = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS', "SystemManufacturer")
    Local $main_Family = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS', "SystemFamily")
    If $main_Family = '' Then $main_Family = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS', "SystemVersion")
    Local $main_ProductName = RegRead('HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS', "SystemProductName")
    If $cpu_ProcessorName <> '' Then
        If $cpu_Identifier <> '' Then
            $aWin_Info[4][0] = '' & 'ProcessorName'
            $aWin_Info[4][1] = '' & $cpu_ProcessorName & ' / ' & $cpu_Identifier
        Else
            $aWin_Info[4][0] = '' & 'ProcessorName'
            $aWin_Info[4][1] = '' & $cpu_ProcessorName
        EndIf
    EndIf
    Local $aMemStats = MemGetStats()
    If IsArray($aMemStats) Then
        If UBound($aMemStats) = 7 Then
            $aWin_Info[5][0] = '' & 'RAM'
            $aWin_Info[5][1] = 'Physical: ' & Round($aMemStats[1] / 1024 / 1024, 2) & ' GB (Free: ' & Round($aMemStats[2] / 1024 / 1024, 2) & ' GB) / Page Size: ' & Round($aMemStats[3] / 1024 / 1024, 2) & ' GB (Free: ' & Round($aMemStats[4] / 1024 / 1024, 2) & ' GB)'
        EndIf
    EndIf
    Local $sManufacturer
    If $main_Manufacturer <> '' Then
        If $main_Family <> '' Then
            $sManufacturer &= '' & $main_Manufacturer & ' / ' & $main_Family
        EndIf
        If $main_ProductName <> '' Then
            $sManufacturer &= '' & $main_Manufacturer & ' / ' & $main_Family & ' / ' & $main_ProductName
        EndIf
        $aWin_Info[6][0] = '' & 'Manufacturer'
        $aWin_Info[6][1] = $sManufacturer
    EndIf
    Local $tzinfo = __PCinfo_dtGetTimeZoneInformation()
    If IsArray($tzinfo) Then
        If $tzinfo[2] <> '' Then
            $aWin_Info[7][0] = 'TimeZone'
            $aWin_Info[7][1] = '' & $tzinfo[2]
        EndIf
    EndIf
    $aWin_Info[8][0] = '' & 'OS'
    $aWin_Info[8][1] = 'OSVersion: ' & @OSVersion & ' / OSArch: ' & @OSArch & ' / OSLang: ' & @OSLang & ' / OSType: ' & @OSType & ' / OSBuild: ' & @OSBuild & ' / MUILang: ' & @MUILang & ' / Keyboard Layout: ' & @KBLayout
    $aWin_Info[9][0] = '' & 'Desktop'
    $aWin_Info[9][1] = 'Width x Height: ' & @DesktopWidth & ' x ' & @DesktopHeight & ' / ColorDepth: ' & @DesktopDepth & ' / Refresh: ' & @DesktopRefresh
    $aWin_Info[10][0] = '' & 'Environment [Path]'
    $aWin_Info[10][1] = '' & EnvGet("Path")
    $aWin_Info[11][0] = '' & 'Home'
    $aWin_Info[11][1] = '[HomeDrive: ' & @HomeDrive & '] [HomePath: ' & @HomePath & '] [HomeShare: ' & @HomeShare & ']'
    $aWin_Info[12][0] = '' & 'Logon'
    $aWin_Info[12][1] = '[Domain: ' & @LogonDomain & '] [Server: ' & @LogonServer & '] [DNS: ' & @LogonDNSDomain & ']'
    Return $aWin_Info
EndFunc   ;==>__PCinfo_Get_SysOverview
Func __PCinfo_StringStripCRWS($String, $removeSpace = 0)
    $String = StringStripCR($String)
    $String = StringStripWS($String, 7)
    $String = StringReplace($String, @LF, ' ')
    $String = StringReplace($String, @CRLF, ' ')
    $String = StringReplace($String, @CR, ' ')
    While StringInStr($String, ' ' & ' ')
        $String = StringReplace($String, ' ' & ' ', ' ')
    WEnd
    If $removeSpace > 0 Then Return StringStripWS($String, 8)
    If StringStripWS($String, 8) == '' Then Return ''
    Return $String
EndFunc   ;==>__PCinfo_StringStripCRWS
Func __PCinfo_Get_AdaptersInfo($sComputer = ".")
    Local $Cols = 20, $strIndex, $objVAR, $objVARx, $zAdapter, $zAdapterName, $zSpeed, $zIndex, $zInterfaceIndex, $zGetIPType, $zAdapterStatus, $zIP, $zMAC, $zSubNetIP, $zGetwayIP, $zGetwayMAC
    Local $aReturn[1][$Cols] = [[0, $Cols]]
    If $sComputer = Default Then $sComputer = @ComputerName
    Local $sListIndexInterfaceName = __PCinfo_Get_ListIndexInterfaceName()
    Local $objwmi = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
    Local $objWQLx = $objwmi.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionID != NULL", "WQL", 0x30)
    If Not @error And IsObj($objWQLx) Then
        For $objVARx In $objWQLx
            $zAdapterName = $objVARx.NetConnectionID
            If (__PCinfo_StringStripCRWS($zAdapterName) = "") Then ContinueLoop
            $zSpeed = __PCinfo_ByteSuffixRound($objVARx.Speed)
            If Int($zSpeed) <= 0 Then
                For $z = 0 To UBound($sListIndexInterfaceName) - 1
                    If $sListIndexInterfaceName[$z][1] = $zAdapterName Then $zSpeed = __PCinfo_ByteSuffixRound(__PCinfo_Get_InterfaceIndexSpeed($sListIndexInterfaceName[$z][0]))
                Next
            EndIf
            $zAdapterStatus = $objVARx.NetConnectionStatus
            Switch $zAdapterStatus
                Case 0, 3
                    $zAdapterStatus = "Disable"
                Case 1, 2
                    $zAdapterStatus = "Connected"
                Case $zAdapterStatus = 7
                    $zAdapterStatus = "unPlugged"
                Case Else
                    $zAdapterStatus = "N/A"
            EndSwitch
            $strIndex = $objVARx.Index
            Local $objWQL = $objwmi.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration WHERE Index=' & $strIndex, "WQL", 0x30)
            If Not @error And IsObj($objWQL) Then
                For $objVAR In $objWQL
                    $zAdapter = $objVAR.Description
                    $aReturn[0][0] += 1
                    $zIndex = $aReturn[0][0]
                    ReDim $aReturn[$zIndex * 2][$aReturn[0][1]]
                    $zInterfaceIndex = $objVAR.InterfaceIndex
                    If Int($zInterfaceIndex) <= 0 Then
                        For $z = 0 To UBound($sListIndexInterfaceName) - 1
                            If $sListIndexInterfaceName[$z][1] = $zAdapterName Then $zInterfaceIndex = $sListIndexInterfaceName[$z][0]
                        Next
                    EndIf
                    $aReturn[$zIndex][0] = $zInterfaceIndex
                    $aReturn[$zIndex][1] = $zAdapter
                    $aReturn[$zIndex][2] = $zAdapterName
                    $aReturn[$zIndex][3] = $zAdapterStatus
                    $zGetIPType = $objVAR.DHCPEnabled
                    If $zGetIPType Then
                        $zGetIPType = "DHCP"
                    Else
                        $zGetIPType = "StaticIP"
                    EndIf
                    $aReturn[$zIndex][4] = $zGetIPType
                    $zIP = $objVAR.IPAddress(0)
                    If __PCinfo_StringStripCRWS($zIP) = "" Then $zIP = "N/A"
                    $aReturn[$zIndex][5] = $zIP
                    $zSubNetIP = $objVAR.IPSubnet(0)
                    If __PCinfo_StringStripCRWS($zSubNetIP) = "" Then $zSubNetIP = "N/A"
                    $aReturn[$zIndex][6] = $zSubNetIP
                    $zMAC = $objVAR.MACAddress
                    If __PCinfo_StringStripCRWS($zMAC) = "" Then $zMAC = "N/A"
                    $aReturn[$zIndex][7] = $zMAC
                    $zGetwayIP = $objVAR.DefaultIPGateway(0)
                    If __PCinfo_StringStripCRWS($zGetwayIP) = "" Then $zGetwayIP = "N/A"
                    $aReturn[$zIndex][8] = $zGetwayIP
                    $zGetwayMAC = "N/A"
                    If __PCinfo_StringStripCRWS($zGetwayIP) <> "N/A" Then $zGetwayMAC = __PCinfo_Get_MACFromIP($zGetwayIP)
                    $aReturn[$zIndex][9] = $zGetwayMAC
                    If Number($zSpeed) = 0 Then $zSpeed = "N/A"
                    $aReturn[$zIndex][10] = $zSpeed
                    $aReturn[$zIndex][11] = "N/A"
                    $aReturn[$zIndex][12] = "N/A"
                    $aReturn[$zIndex][13] = "N/A"
                    $aReturn[$zIndex][14] = "N/A"
                    $aReturn[$zIndex][15] = "N/A"
                    $aReturn[$zIndex][16] = "N/A"
                    $aReturn[$zIndex][17] = "N/A"
                    $aReturn[$zIndex][18] = "N/A"
                    Local $zDNS = $objVAR.DNSServerSearchOrder()
                    Local $dnsCount = UBound($zDNS)
                    $aReturn[$zIndex][19] = $dnsCount
                    If IsArray($zDNS) Then
                        Switch $dnsCount
                            Case 1
                                $aReturn[$zIndex][11] = $zDNS[0]
                            Case 2
                                $aReturn[$zIndex][11] = $zDNS[0]
                                $aReturn[$zIndex][12] = $zDNS[1]
                            Case 3
                                $aReturn[$zIndex][11] = $zDNS[0]
                                $aReturn[$zIndex][12] = $zDNS[1]
                                $aReturn[$zIndex][13] = $zDNS[2]
                            Case 4
                                $aReturn[$zIndex][11] = $zDNS[0]
                                $aReturn[$zIndex][12] = $zDNS[1]
                                $aReturn[$zIndex][13] = $zDNS[2]
                                $aReturn[$zIndex][14] = $zDNS[3]
                            Case 5
                                $aReturn[$zIndex][11] = $zDNS[0]
                                $aReturn[$zIndex][12] = $zDNS[1]
                                $aReturn[$zIndex][13] = $zDNS[2]
                                $aReturn[$zIndex][14] = $zDNS[3]
                                $aReturn[$zIndex][15] = $zDNS[4]
                            Case 6
                                $aReturn[$zIndex][11] = $zDNS[0]
                                $aReturn[$zIndex][12] = $zDNS[1]
                                $aReturn[$zIndex][13] = $zDNS[2]
                                $aReturn[$zIndex][14] = $zDNS[3]
                                $aReturn[$zIndex][15] = $zDNS[4]
                                $aReturn[$zIndex][16] = $zDNS[5]
                            Case 7
                                $aReturn[$zIndex][11] = $zDNS[0]
                                $aReturn[$zIndex][12] = $zDNS[1]
                                $aReturn[$zIndex][13] = $zDNS[2]
                                $aReturn[$zIndex][14] = $zDNS[3]
                                $aReturn[$zIndex][15] = $zDNS[4]
                                $aReturn[$zIndex][16] = $zDNS[5]
                                $aReturn[$zIndex][17] = $zDNS[6]
                            Case 8
                                $aReturn[$zIndex][11] = $zDNS[0]
                                $aReturn[$zIndex][12] = $zDNS[1]
                                $aReturn[$zIndex][13] = $zDNS[2]
                                $aReturn[$zIndex][14] = $zDNS[3]
                                $aReturn[$zIndex][15] = $zDNS[4]
                                $aReturn[$zIndex][16] = $zDNS[5]
                                $aReturn[$zIndex][17] = $zDNS[6]
                                $aReturn[$zIndex][18] = $zDNS[7]
                            Case Else
                                $aReturn[$zIndex][11] = $zDNS[0]
                        EndSwitch
                    EndIf
                Next
            EndIf
        Next
        Return $aReturn
    EndIf
    Return SetError(1, 0, "")
EndFunc   ;==>__PCinfo_Get_AdaptersInfo
Func __PCinfo_Get_ListIndexInterfaceName()
    Local Const $tagIP_ADAPTER_ADDRESSES = "ulong Length;dword IfIndex;ptr Next;ptr AdapterName;ptr FirstUnicastAddress;" & "ptr FirstAnycastAddress;ptr FirstMulticastAddress;ptr FirstDnsServerAddress;ptr DnsSuffix;ptr Description;" & "ptr FriendlyName;byte PhysicalAddress[8];dword PhysicalAddressLength;dword Flags;dword Mtu;dword IfType;int OperStatus;" & "dword Ipv6IfIndex;dword ZoneIndices[16];ptr FirstPrefix;" & "uint64 TransmitLinkSpeed;uint64 ReceiveLinkSpeed;ptr FirstWinsServerAddress;ptr FirstGatewayAddress;" & "ulong Ipv4Metric;ulong Ipv6Metric;uint64 Luid;STRUCT;ptr Dhcpv4ServerSockAddr;int Dhcpv4ServerSockAddrLen;ENDSTRUCT;" & "ulong CompartmentId;STRUCT;ulong NetworkGuidData1;word NetworkGuidData2;word NetworkGuidData3;byte NetworkGuidData4[8];ENDSTRUCT;" & "int ConnectionType;int TunnelType;STRUCT;ptr Dhcpv6ServerSockAddr;int Dhcpv6ServerSockAddrLen;ENDSTRUCT;byte Dhcpv6ClientDuid[130];" & "ulong Dhcpv6ClientDuidLength;ulong Dhcpv6Iaid;ptr FirstDnsSuffix;"
    Local $aret, $nBufSize, $stBuffer, $stIP_ADAPTER_ADDRESSES, $pIPAAStruct, $nIPAAStSize
    Local $pTemp, $nTemp, $nEntries, $aIndexEntries
    $aret = DllCall("iphlpapi.dll", "ulong", "GetAdaptersAddresses", "ulong", 0, "ulong", 0x86, "ptr", 0, "ptr", 0, "ulong*", 0)
    If @error Then Return SetError(1, @error, "")
    If $aret[0] Then
        If $aret[0] <> 111 Or Not $aret[5] Then Return SetError(2, $aret[0], "")
    EndIf
    $nBufSize = $aret[5]
    $stBuffer = DllStructCreate("int64;byte [" & $nBufSize & "];")
    $aret = DllCall("iphlpapi.dll", "ulong", "GetAdaptersAddresses", "ulong", 0, "ulong", 0x86, "ptr", 0, "ptr", DllStructGetPtr($stBuffer), "ulong*", $nBufSize)
    If @error Then Return SetError(1, @error, "")
    If $aret[0] Then Return SetError(2, $aret[0], "")
    Dim $aIndexEntries[Floor($nBufSize / 72)][2]
    $nEntries = 0
    $pIPAAStruct = DllStructGetPtr($stBuffer)
    While $pIPAAStruct <> 0
        $stIP_ADAPTER_ADDRESSES = DllStructCreate($tagIP_ADAPTER_ADDRESSES, $pIPAAStruct)
        $nIPAAStSize = DllStructGetData($stIP_ADAPTER_ADDRESSES, "Length")
        $nTemp = DllStructGetData($stIP_ADAPTER_ADDRESSES, "OperStatus")
        If ($nTemp = 2 And Not False) Or DllStructGetData($stIP_ADAPTER_ADDRESSES, "IfType") = 24 Then
        Else
            $pTemp = DllStructGetData($stIP_ADAPTER_ADDRESSES, "FirstUnicastAddress")
            If $pTemp <> 0 Then
                $aIndexEntries[$nEntries][0] = DllStructGetData($stIP_ADAPTER_ADDRESSES, "IfIndex")
                $aIndexEntries[$nEntries][1] = __PCinfo_Get_StringWFromPtr(DllStructGetData($stIP_ADAPTER_ADDRESSES, "FriendlyName"))
                $nEntries += 1
            EndIf
        EndIf
        $pIPAAStruct = DllStructGetData($stIP_ADAPTER_ADDRESSES, "Next")
    WEnd
    If $nEntries = 0 Then Return SetError(-1, 0, "")
    ReDim $aIndexEntries[$nEntries][2]
    Return SetExtended($nEntries, $aIndexEntries)
EndFunc   ;==>__PCinfo_Get_ListIndexInterfaceName
Func __PCinfo_Get_InterfaceIndexSpeed($IfIndex)
    Local $tBuffer, $pBuffer, $iResult, $iSpeed
    $tBuffer = DllStructCreate("wchar[256];dword[5];byte[8];dword[16];char[256]")
    $pBuffer = DllStructGetPtr($tBuffer)
    DllStructSetData($tBuffer, 2, $IfIndex, 1)
    $iResult = DllCall("iphlpapi.dll", "long", "GetIfEntry", "ptr", $pBuffer)
    If @error Then Return SetError(@error, @extended, 0)
    $iSpeed = DllStructGetData($tBuffer, 2, 4)
    $tBuffer = 0
    Return SetError($iResult[0], $iSpeed / 1000 / 1000, $iSpeed)
EndFunc   ;==>__PCinfo_Get_InterfaceIndexSpeed
Func __PCinfo_Get_StringWFromPtr($pStr)
    If Not IsPtr($pStr) Or $pStr = 0 Then Return SetError(1, 0, "")
    Local $aret = DllCall("kernel32.dll", "ptr", "lstrcpynW", "wstr", "", "ptr", $pStr, "int", 32767)
    If @error Or Not $aret[0] Then Return SetError(@error, 0, "")
    Return $aret[1]
EndFunc   ;==>__PCinfo_Get_StringWFromPtr
Func __PCinfo_Get_MACFromIP($rMAC)
    If ($rMAC = "") Or ($rMAC = "N/A") Then Return "N/A"
    Local $sbMAC = DllStructCreate("byte[6]")
    Local $siMAC = DllStructCreate("int")
    DllStructSetData($siMAC, 1, 6)
    Local $rHexMAC = DllCall("Ws2_32.dll", "int", "inet_addr", "str", $rMAC)
    $rMAC = $rHexMAC[0]
    $rHexMAC = DllCall("iphlpapi.dll", "int", "SendARP", "int", $rMAC, "int", 0, "ptr", DllStructGetPtr($sbMAC), "ptr", DllStructGetPtr($siMAC))
    $rMAC = ""
    For $i = 0 To 5
        If $i Then $rMAC &= ":"
        $rMAC = $rMAC & Hex(DllStructGetData($sbMAC, 1, $i + 1), 2)
    Next
    If ($rMAC = "") Or ($rMAC = $sBlankMAC) Or ($rMAC = "N/A") Then Return "N/A"
    Return $rMAC
EndFunc   ;==>__PCinfo_Get_MACFromIP
Func __PCinfo_ByteSuffixRound($iBytes, $iRound = 2)
    $iBytes = Number($iBytes)
    If $iBytes > 1000000000 Then Return "N/A"
    Local $a, $aArray[5] = ["Bps", "Kbps", "Mbps", "Gbps", "Tbps"]
    While $iBytes > 999
        $a += 1
        If $a > 3 Then ExitLoop
        $iBytes /= 1000
    WEnd
    Return Round($iBytes, $iRound) & " " & $aArray[$a]
EndFunc   ;==>__PCinfo_ByteSuffixRound
Func __PCinfo_Singleton($sOccurrenceName, $iFlag = 0)
    Local Const $ERROR_ALREADY_EXISTS = 183
    Local Const $SECURITY_DESCRIPTOR_REVISION = 1
    Local $tSecurityAttributes = 0
    If BitAND($iFlag, 2) Then
        Local $tSecurityDescriptor = DllStructCreate("byte;byte;word;ptr[4]")
        Local $aCALL = DllCall("advapi32.dll", "bool", "InitializeSecurityDescriptor", "struct*", $tSecurityDescriptor, "dword", $SECURITY_DESCRIPTOR_REVISION)
        If @error Then Return SetError(@error, @extended, 0)
        If $aCALL[0] Then
            $aCALL = DllCall("advapi32.dll", "bool", "SetSecurityDescriptorDacl", "struct*", $tSecurityDescriptor, "bool", 1, "ptr", 0, "bool", 0)
            If @error Then Return SetError(@error, @extended, 0)
            If $aCALL[0] Then
                $tSecurityAttributes = DllStructCreate("dword Length;ptr Descriptor;bool InheritHandle")
                DllStructSetData($tSecurityAttributes, 1, DllStructGetSize($tSecurityAttributes))
                DllStructSetData($tSecurityAttributes, 2, DllStructGetPtr($tSecurityDescriptor))
                DllStructSetData($tSecurityAttributes, 3, 0)
            EndIf
        EndIf
    EndIf
    Local $aHandle = DllCall("kernel32.dll", "handle", "CreateMutexW", "struct*", $tSecurityAttributes, "bool", 1, "wstr", $sOccurrenceName)
    If @error Then Return SetError(@error, @extended, 0)
    Local $aLastError = DllCall("kernel32.dll", "dword", "GetLastError")
    If @error Then Return SetError(@error, @extended, 0)
    If $aLastError[0] = $ERROR_ALREADY_EXISTS Then
        If BitAND($iFlag, 1) Then
            DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $aHandle[0])
            If @error Then Return SetError(@error, @extended, 0)
            Return SetError($aLastError[0], $aLastError[0], 0)
        Else
            Exit -1
        EndIf
    EndIf
    Return $aHandle[0]
EndFunc   ;==>__PCinfo_Singleton
Func __PCinfo_dtCloneSystemTime($pSystemTime)
    Local $tagSYSTEMTIME = "struct;word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds;endstruct"
    Local $tSystemTime1 = DllStructCreate($tagSYSTEMTIME, $pSystemTime)
    Local $tSystemTime2 = DllStructCreate($tagSYSTEMTIME)
    DllStructSetData($tSystemTime2, "Month", DllStructGetData($tSystemTime1, "Month"))
    DllStructSetData($tSystemTime2, "Day", DllStructGetData($tSystemTime1, "Day"))
    DllStructSetData($tSystemTime2, "Year", DllStructGetData($tSystemTime1, "Year"))
    DllStructSetData($tSystemTime2, "Hour", DllStructGetData($tSystemTime1, "Hour"))
    DllStructSetData($tSystemTime2, "Minute", DllStructGetData($tSystemTime1, "Minute"))
    DllStructSetData($tSystemTime2, "Second", DllStructGetData($tSystemTime1, "Second"))
    DllStructSetData($tSystemTime2, "MSeconds", DllStructGetData($tSystemTime1, "MSeconds"))
    DllStructSetData($tSystemTime2, "DOW", DllStructGetData($tSystemTime1, "DOW"))
    Return $tSystemTime2
EndFunc   ;==>__PCinfo_dtCloneSystemTime
Func __PCinfo_dtGetTimeZoneInformation()
    Local $tagTIME_ZONE_INFORMATION = "struct;long Bias;wchar StdName[32];word StdDate[8];long StdBias;wchar DayName[32];word DayDate[8];long DayBias;endstruct"
    Local $tTimeZone = DllStructCreate($tagTIME_ZONE_INFORMATION)
    Local $aCALL = DllCall("kernel32.dll", "dword", "GetTimeZoneInformation", "struct*", $tTimeZone)
    If @error Then Return SetError(@error, @extended, 0)
    If $aCALL[0] = -1 Then Return SetError(10, 0, 0)
    Local $aInfo[8]
    $aInfo[0] = $aCALL[0]
    $aInfo[1] = DllStructGetData($tTimeZone, "Bias")
    $aInfo[2] = DllStructGetData($tTimeZone, "StdName")
    $aInfo[3] = __PCinfo_dtCloneSystemTime(DllStructGetPtr($tTimeZone, "StdDate"))
    $aInfo[4] = DllStructGetData($tTimeZone, "StdBias")
    $aInfo[5] = DllStructGetData($tTimeZone, "DayName")
    $aInfo[6] = __PCinfo_dtCloneSystemTime(DllStructGetPtr($tTimeZone, "DayDate"))
    $aInfo[7] = DllStructGetData($tTimeZone, "DayBias")
    Return $aInfo
EndFunc   ;==>__PCinfo_dtGetTimeZoneInformation
Func __PCinfo_ObjErrorFunc()
    ConsoleWrite("! AutoItCOM Test - We intercepted a COM Error !" & @CRLF & @CRLF & "! Error.description is: " & @TAB & $oMyError.description & @CRLF & "! Error.windescription:" & @TAB & $oMyError.windescription & @CRLF & "! Error.number is: " & @TAB & Hex($oMyError.number, 8) & @CRLF & "! Error.lastdllError is: " & @TAB & $oMyError.lastdllError & @CRLF & "! Error.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & "! Error.source is: " & @TAB & $oMyError.source & @CRLF & "! Error.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & "! Error.helpcontext is: " & @TAB & $oMyError.helpcontext & @CRLF & @CRLF)
EndFunc   ;==>__PCinfo_ObjErrorFunc


#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=iCon.ico
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Res_Comment=Dao Van Trong - TRONG.PRO
#AutoIt3Wrapper_Res_Description=Get PC Information by Dao Van Trong - TRONG.PRO
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_ProductName=Get PC Information
#AutoIt3Wrapper_Res_ProductVersion=1.0.0.0
#AutoIt3Wrapper_Res_CompanyName=TRONG.PRO
#AutoIt3Wrapper_Res_LegalCopyright=Dao Van Trong - TRONG.PRO
#AutoIt3Wrapper_Res_LegalTradeMarks=Dao Van Trong - TRONG.PRO
#AutoIt3Wrapper_Res_SaveSource=y
#AutoIt3Wrapper_Res_Language=1066
#AutoIt3Wrapper_Res_requestedExecutionLevel=highestAvailable
#AutoIt3Wrapper_Add_Constants=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

 

Regards,
 

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
  • Recently Browsing   0 members

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