# CStruct Examples
require 'windows/system_info'
require 'win32struct'
include Windows::SystemInfo

# SYSTEM_INFO in VC6 's SDK
# typedef struct _SYSTEM_INFO {
#     union {
#         DWORD dwOemId;          // Obsolete field...do not use
#         struct {
#             WORD wProcessorArchitecture;
#             WORD wReserved;
#         };
#     };
#     DWORD dwPageSize;
#     LPVOID lpMinimumApplicationAddress;
#     LPVOID lpMaximumApplicationAddress;
#     DWORD dwActiveProcessorMask;
#     DWORD dwNumberOfProcessors;
#     DWORD dwProcessorType;
#     DWORD dwAllocationGranularity;
#     WORD wProcessorLevel;
#     WORD wProcessorRevision;
# } SYSTEM_INFO, *LPSYSTEM_INFO;

# SYSTEM_INFO in Ruby
class SYSTEM_INFO < Win32Struct
    union:u do
        DWORD:dwOemId
        struct:x do
            WORD:wProcessorArchitecture
            WORD:wReserved        
        end
    end
    DWORD  :dwPageSize
    LPVOID :lpMinimumApplicationAddress
    LPVOID :lpMaximumApplicationAddress
    DWORD  :dwActiveProcessorMask
    DWORD  :dwNumberOfProcessors
    DWORD  :dwProcessorType
    DWORD  :dwAllocationGranularity
    WORD   :wProcessorLevel
    WORD   :wProcessorRevision
end

# call GetSystemInfo
sys_info = SYSTEM_INFO.new
GetSystemInfo(sys_info.__data__) # __data__ is an alias for method 'data'        
        
#output
puts "<System Infomation>" 
puts        "Processor Architecture:#{sys_info.u.x.wProcessorArchitecture}"        # 'u' and 'x' can not be omitted
puts        "Page Size:#{sys_info.dwPageSize}"
puts        "Minimum Application Address:0x#{sys_info.lpMinimumApplicationAddress.to_s 16}"
puts        "Maximum Application Address:0x#{sys_info.lpMaximumApplicationAddress.to_s 16}"
puts        "Active Processor Mask:#{sys_info.dwActiveProcessorMask}"
puts        "Number Of Processors:#{sys_info.dwNumberOfProcessors}"
puts        "Processor Type:#{sys_info.dwProcessorType}"
puts        "Allocation Granularity:0x#{sys_info.dwAllocationGranularity.to_s 16}"
puts        "Processor Level:#{sys_info.wProcessorLevel}"
puts        "Processor Revision:#{sys_info.wProcessorRevision}"