Commit d6cd8f135e7c62b68af86e98f0108224d795e41e
1 parent
78a93534
Exists in
master
Classe wmi
Showing
15 changed files
with
202 additions
and
188 deletions
Show diff stats
cacic-teste/cacic-teste.pro
@@ -29,6 +29,7 @@ SOURCES += \ | @@ -29,6 +29,7 @@ SOURCES += \ | ||
29 | ../src/vqtconvert.cpp \ | 29 | ../src/vqtconvert.cpp \ |
30 | ../src/vregistry.cpp \ | 30 | ../src/vregistry.cpp \ |
31 | ../src/ccoleta.cpp \ | 31 | ../src/ccoleta.cpp \ |
32 | + ../src/wmi.cpp \ | ||
32 | # ../src/qtservice/src/qtservice.cpp \ | 33 | # ../src/qtservice/src/qtservice.cpp \ |
33 | # ../src/qtservice/src/qtservice_unix.cpp \ | 34 | # ../src/qtservice/src/qtservice_unix.cpp \ |
34 | # ../src/qtservice/src/qtservice_win.cpp \ | 35 | # ../src/qtservice/src/qtservice_win.cpp \ |
@@ -48,6 +49,7 @@ HEADERS += \ | @@ -48,6 +49,7 @@ HEADERS += \ | ||
48 | ../src/vqtconvert.h \ | 49 | ../src/vqtconvert.h \ |
49 | ../src/vregistry.h \ | 50 | ../src/vregistry.h \ |
50 | ../src/ccoleta.h \ | 51 | ../src/ccoleta.h \ |
52 | + ../src/wmi.h \ | ||
51 | # ../src/qtservice/src/qtservice.h \ | 53 | # ../src/qtservice/src/qtservice.h \ |
52 | # ../src/qtservice/src/qtservice_p.h \ | 54 | # ../src/qtservice/src/qtservice_p.h \ |
53 | # ../src/qtservice/src/qtunixserversocket.h \ | 55 | # ../src/qtservice/src/qtunixserversocket.h \ |
cacicD/cacicD.pro
cacicD/cacicd.cpp
@@ -4,7 +4,7 @@ cacicD::cacicD(int argc, char **argv) : QtService<QCoreApplication>(argc, argv, | @@ -4,7 +4,7 @@ cacicD::cacicD(int argc, char **argv) : QtService<QCoreApplication>(argc, argv, | ||
4 | { | 4 | { |
5 | try{ | 5 | try{ |
6 | setServiceDescription("Cacic Daemon"); | 6 | setServiceDescription("Cacic Daemon"); |
7 | - setServiceFlags(QtServiceBase::CannotBeStopped); | 7 | + setServiceFlags(QtService::Default); |
8 | } catch (...){ | 8 | } catch (...){ |
9 | qCritical() << "Error desconhecido no construtor."; | 9 | qCritical() << "Error desconhecido no construtor."; |
10 | } | 10 | } |
gercols/gercols.pro
@@ -34,6 +34,7 @@ SOURCES += \ | @@ -34,6 +34,7 @@ SOURCES += \ | ||
34 | ./gercols.cpp \ | 34 | ./gercols.cpp \ |
35 | ../src/vregistry.cpp \ | 35 | ../src/vregistry.cpp \ |
36 | ../src/vqtconvert.cpp \ | 36 | ../src/vqtconvert.cpp \ |
37 | + ../src/wmi.cpp \ | ||
37 | 38 | ||
38 | HEADERS += \ | 39 | HEADERS += \ |
39 | ../src/ccacic.h \ | 40 | ../src/ccacic.h \ |
@@ -46,6 +47,7 @@ HEADERS += \ | @@ -46,6 +47,7 @@ HEADERS += \ | ||
46 | ./gercols.h \ | 47 | ./gercols.h \ |
47 | ../src/vregistry.h \ | 48 | ../src/vregistry.h \ |
48 | ../src/vqtconvert.h \ | 49 | ../src/vqtconvert.h \ |
50 | + ../src/wmi.h \ | ||
49 | 51 | ||
50 | INCLUDEPATH += ../src \ | 52 | INCLUDEPATH += ../src \ |
51 | ../src/crypto++/include/ | 53 | ../src/crypto++/include/ |
gercols/main.cpp
@@ -4,6 +4,7 @@ | @@ -4,6 +4,7 @@ | ||
4 | int main(int argc, char *argv[]) | 4 | int main(int argc, char *argv[]) |
5 | { | 5 | { |
6 | QCoreApplication a(argc, argv); | 6 | QCoreApplication a(argc, argv); |
7 | + a.setApplicationName("Gercols"); | ||
7 | 8 | ||
8 | //crio o objeto que será responsável pela execução | 9 | //crio o objeto que será responsável pela execução |
9 | Gercols *oGercols = new Gercols(&a); | 10 | Gercols *oGercols = new Gercols(&a); |
install-cacic/install-cacic.pro.user
1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | <!DOCTYPE QtCreatorProject> | 2 | <!DOCTYPE QtCreatorProject> |
3 | -<!-- Written by QtCreator 3.1.2, 2014-08-29T15:37:15. --> | 3 | +<!-- Written by QtCreator 3.1.2, 2014-09-01T17:24:48. --> |
4 | <qtcreator> | 4 | <qtcreator> |
5 | <data> | 5 | <data> |
6 | <variable>ProjectExplorer.Project.ActiveTarget</variable> | 6 | <variable>ProjectExplorer.Project.ActiveTarget</variable> |
src/cacic_computer.cpp
@@ -14,11 +14,11 @@ CACIC_Computer::CACIC_Computer() | @@ -14,11 +14,11 @@ CACIC_Computer::CACIC_Computer() | ||
14 | * | 14 | * |
15 | */ | 15 | */ |
16 | QList<QVariantMap> CACIC_Computer::networkInterfacesRunning(){ | 16 | QList<QVariantMap> CACIC_Computer::networkInterfacesRunning(){ |
17 | - QNetworkInterface interface; | 17 | + QNetworkInterface netInterface; |
18 | QVariantMap mapInterface; | 18 | QVariantMap mapInterface; |
19 | QList<QVariantMap> listaMap; | 19 | QList<QVariantMap> listaMap; |
20 | 20 | ||
21 | - foreach (QNetworkInterface in, interface.allInterfaces()) { | 21 | + foreach (QNetworkInterface in, netInterface.allInterfaces()) { |
22 | if (!(bool)(in.flags() & QNetworkInterface::IsLoopBack) && | 22 | if (!(bool)(in.flags() & QNetworkInterface::IsLoopBack) && |
23 | !(bool)(in.flags() & QNetworkInterface::IsPointToPoint) && | 23 | !(bool)(in.flags() & QNetworkInterface::IsPointToPoint) && |
24 | (bool)(in.flags() & QNetworkInterface::IsRunning)){ | 24 | (bool)(in.flags() & QNetworkInterface::IsRunning)){ |
src/cacic_hardware.cpp
@@ -16,133 +16,137 @@ QJsonObject cacic_hardware::coletaWin() | @@ -16,133 +16,137 @@ QJsonObject cacic_hardware::coletaWin() | ||
16 | { | 16 | { |
17 | QJsonObject hardware; | 17 | QJsonObject hardware; |
18 | QStringList params; | 18 | QStringList params; |
19 | - QJsonValue wmi; | 19 | + QJsonValue wmiResult; |
20 | // Win32_ComputerSystem (Caption, Description, Domain, DNSHostName, Manufacturer, | 20 | // Win32_ComputerSystem (Caption, Description, Domain, DNSHostName, Manufacturer, |
21 | // Model, Name, PrimaryOwnerName, TotalPhysicalMemory, Workgroup) | 21 | // Model, Name, PrimaryOwnerName, TotalPhysicalMemory, Workgroup) |
22 | params << "Caption" << "Description" << "Domain" << "DNSHostName" << "Manufacturer" << "Model" | 22 | params << "Caption" << "Description" << "Domain" << "DNSHostName" << "Manufacturer" << "Model" |
23 | << "Name" << "PrimaryOwnerName" << "TotalPhysicalMemory" << "Workgroup"; | 23 | << "Name" << "PrimaryOwnerName" << "TotalPhysicalMemory" << "Workgroup"; |
24 | - wmi = wmiSearch("Win32_ComputerSystem", params); | ||
25 | - if (!wmi.isNull()) | ||
26 | - hardware["ComputerSystem"] = wmi; | 24 | + wmiResult = wmi::wmiSearch("Win32_ComputerSystem", params); |
25 | + if (!wmiResult.isNull()) | ||
26 | + hardware["ComputerSystem"] = wmiResult; | ||
27 | //Win32_PortableBattery | 27 | //Win32_PortableBattery |
28 | // (Verifica se é notebook) | 28 | // (Verifica se é notebook) |
29 | params.clear(); | 29 | params.clear(); |
30 | - hardware["IsNotebook"] = QJsonValue::fromVariant(!wmiSearch("Win32_PortableBattery", params).isNull()); | 30 | + wmiResult = wmi::wmiSearch("Win32_PortableBattery", params); |
31 | + if (!wmiResult.isNull()){ | ||
32 | + hardware["IsNotebook"] = QJsonValue::fromVariant(!wmiResult.isNull()); | ||
33 | + hardware["PortableBattery"] = wmiResult; | ||
34 | + } | ||
31 | //Win32_Bios | 35 | //Win32_Bios |
32 | // (Manufacturer, SMBIOSBIOSVersion, BIOSVersion, Version, SerialNumber, ReleaseDate) | 36 | // (Manufacturer, SMBIOSBIOSVersion, BIOSVersion, Version, SerialNumber, ReleaseDate) |
33 | params.clear(); | 37 | params.clear(); |
34 | params << "Manufacturer" << "SMBIOSBIOSVersion" << "BIOSVersion" << "Version" << "SerialNumber" << "ReleaseDate"; | 38 | params << "Manufacturer" << "SMBIOSBIOSVersion" << "BIOSVersion" << "Version" << "SerialNumber" << "ReleaseDate"; |
35 | - wmi = wmiSearch("Win32_Bios", params); | ||
36 | - if (!wmi.isNull()) | ||
37 | - hardware["Bios"] = wmi; | 39 | + wmiResult = wmi::wmiSearch("Win32_Bios", params); |
40 | + if (!wmiResult.isNull()) | ||
41 | + hardware["Bios"] = wmiResult; | ||
38 | //Win32_BaseBoard | 42 | //Win32_BaseBoard |
39 | // (Manufacturer, Model, SerialNumber) | 43 | // (Manufacturer, Model, SerialNumber) |
40 | params.clear(); | 44 | params.clear(); |
41 | params << "Manufacturer" << "Model" << "SerialNumber"; | 45 | params << "Manufacturer" << "Model" << "SerialNumber"; |
42 | - wmi = wmiSearch("Win32_Baseboard", params); | ||
43 | - if (!wmi.isNull()) | ||
44 | - hardware["BaseBoard"] = wmi; | 46 | + wmiResult = wmi::wmiSearch("Win32_Baseboard", params); |
47 | + if (!wmiResult.isNull()) | ||
48 | + hardware["BaseBoard"] = wmiResult; | ||
45 | //Win32_SystemEnclosure | 49 | //Win32_SystemEnclosure |
46 | // (Manufacturer, ChassisTypes, SerialNumber, SMBIOSAssetTag) | 50 | // (Manufacturer, ChassisTypes, SerialNumber, SMBIOSAssetTag) |
47 | params.clear(); | 51 | params.clear(); |
48 | params << "Manufacturer" << "ChassisTypes" << "SerialNumber" << "SMBIOSAssetTag"; | 52 | params << "Manufacturer" << "ChassisTypes" << "SerialNumber" << "SMBIOSAssetTag"; |
49 | - wmi = wmiSearch("Win32_SystemEnclosure", params); | ||
50 | - if (!wmi.isNull()) | ||
51 | - hardware["SystemEnclosure"] = wmi; | 53 | + wmiResult = wmi::wmiSearch("Win32_SystemEnclosure", params); |
54 | + if (!wmiResult.isNull()) | ||
55 | + hardware["SystemEnclosure"] = wmiResult; | ||
52 | //Win32_FloppyDrive | 56 | //Win32_FloppyDrive |
53 | // (Manufacturer, Caption, Description, Name, MediaType, Size) | 57 | // (Manufacturer, Caption, Description, Name, MediaType, Size) |
54 | params.clear(); | 58 | params.clear(); |
55 | params << "Manufacturer" << "Caption" << "Description" << "Name"; | 59 | params << "Manufacturer" << "Caption" << "Description" << "Name"; |
56 | - wmi = wmiSearch("Win32_FloppyDrive", params); | ||
57 | - if (!wmi.isNull()) | ||
58 | - hardware["FloppyDrive"] = wmi; | 60 | + wmiResult = wmi::wmiSearch("Win32_FloppyDrive", params); |
61 | + if (!wmiResult.isNull()) | ||
62 | + hardware["FloppyDrive"] = wmiResult; | ||
59 | //Win32_DiskDrive | 63 | //Win32_DiskDrive |
60 | // (Manufacturer, Caption, Description, Name, MediaType, Size, SerialNumber, Model, FirmwareRevision) | 64 | // (Manufacturer, Caption, Description, Name, MediaType, Size, SerialNumber, Model, FirmwareRevision) |
61 | params.clear(); | 65 | params.clear(); |
62 | params << "Manufacturer" << "Caption" << "Description" << "Name" << "MediaType" << "Size" << "SerialNumber" | 66 | params << "Manufacturer" << "Caption" << "Description" << "Name" << "MediaType" << "Size" << "SerialNumber" |
63 | << "Model" << "FirmwareRevision"; | 67 | << "Model" << "FirmwareRevision"; |
64 | - wmi = wmiSearch("Win32_DiskDrive", params); | ||
65 | - if (!wmi.isNull()) | ||
66 | - hardware["DiskDrive"] = wmi; | 68 | + wmiResult = wmi::wmiSearch("Win32_DiskDrive", params); |
69 | + if (!wmiResult.isNull()) | ||
70 | + hardware["DiskDrive"] = wmiResult; | ||
67 | //Win32_CDROMDrive | 71 | //Win32_CDROMDrive |
68 | // (Manufacturer, Caption, Description, Name, MediaType, Size) | 72 | // (Manufacturer, Caption, Description, Name, MediaType, Size) |
69 | params.clear(); | 73 | params.clear(); |
70 | params << "Manufacturer" << "Caption" << "Description" << "MediaType" << "Name" << "Size"; | 74 | params << "Manufacturer" << "Caption" << "Description" << "MediaType" << "Name" << "Size"; |
71 | - wmi = wmiSearch("Win32_CDROMDrive", params); | ||
72 | - if (!wmi.isNull()) | ||
73 | - hardware["CDROMDrive"] = wmi; | 75 | + wmiResult = wmi::wmiSearch("Win32_CDROMDrive", params); |
76 | + if (!wmiResult.isNull()) | ||
77 | + hardware["CDROMDrive"] = wmiResult; | ||
74 | //Win32_FloppyController | 78 | //Win32_FloppyController |
75 | // (Manufacturer, Caption, Description, Name) | 79 | // (Manufacturer, Caption, Description, Name) |
76 | params.clear(); | 80 | params.clear(); |
77 | params << "Manufacturer" << "Caption" << "Description" << "Name"; | 81 | params << "Manufacturer" << "Caption" << "Description" << "Name"; |
78 | - wmi = wmiSearch("Win32_FloppyController", params); | ||
79 | - if (!wmi.isNull()) | ||
80 | - hardware["FloppyController"] = wmi; | 82 | + wmiResult = wmi::wmiSearch("Win32_FloppyController", params); |
83 | + if (!wmiResult.isNull()) | ||
84 | + hardware["FloppyController"] = wmiResult; | ||
81 | //Win32_SCSIController | 85 | //Win32_SCSIController |
82 | // (Manufacturer, Caption, Description, Name, HardwareVersion) | 86 | // (Manufacturer, Caption, Description, Name, HardwareVersion) |
83 | params.clear(); | 87 | params.clear(); |
84 | params << "Manufacturer" << "Caption" << "Description" << "Name" << "HardwareVersion"; | 88 | params << "Manufacturer" << "Caption" << "Description" << "Name" << "HardwareVersion"; |
85 | - wmi = wmiSearch("Win32_SCSIController", params); | ||
86 | - if (!wmi.isNull()) | ||
87 | - hardware["SCSIController"] = wmi; | 89 | + wmiResult = wmi::wmiSearch("Win32_SCSIController", params); |
90 | + if (!wmiResult.isNull()) | ||
91 | + hardware["SCSIController"] = wmiResult; | ||
88 | //Win32_InfraredDevice | 92 | //Win32_InfraredDevice |
89 | // (Manufacturer, Caption, Description, Name) | 93 | // (Manufacturer, Caption, Description, Name) |
90 | params.clear(); | 94 | params.clear(); |
91 | params << "Manufacturer" << "Caption" << "Description" << "Name"; | 95 | params << "Manufacturer" << "Caption" << "Description" << "Name"; |
92 | - wmi = wmiSearch("Win32_InfraredDevice", params); | ||
93 | - if (!wmi.isNull()) | ||
94 | - hardware["InfraredDevice"] = wmi; | 96 | + wmiResult = wmi::wmiSearch("Win32_InfraredDevice", params); |
97 | + if (!wmiResult.isNull()) | ||
98 | + hardware["InfraredDevice"] = wmiResult; | ||
95 | //Win32_USBController | 99 | //Win32_USBController |
96 | // (Manufacturer, Caption, Description, Name) | 100 | // (Manufacturer, Caption, Description, Name) |
97 | params.clear(); | 101 | params.clear(); |
98 | params << "Manufacturer" << "Caption" << "Description" << "Name"; | 102 | params << "Manufacturer" << "Caption" << "Description" << "Name"; |
99 | - wmi = wmiSearch("Win32_USBController", params); | ||
100 | - if (!wmi.isNull()) | ||
101 | - hardware["USBController"] = wmi; | 103 | + wmiResult = wmi::wmiSearch("Win32_USBController", params); |
104 | + if (!wmiResult.isNull()) | ||
105 | + hardware["USBController"] = wmiResult; | ||
102 | //Win32_PCMCIAController | 106 | //Win32_PCMCIAController |
103 | // (Manufacturer, Caption, Description, Name) | 107 | // (Manufacturer, Caption, Description, Name) |
104 | params.clear(); | 108 | params.clear(); |
105 | params << "Manufacturer" << "Caption" << "Description" << "Name"; | 109 | params << "Manufacturer" << "Caption" << "Description" << "Name"; |
106 | - wmi = wmiSearch("Win32_PCMCIAController", params); | ||
107 | - if (!wmi.isNull()) | ||
108 | - hardware["PCMCIAController"] = wmi; | 110 | + wmiResult = wmi::wmiSearch("Win32_PCMCIAController", params); |
111 | + if (!wmiResult.isNull()) | ||
112 | + hardware["PCMCIAController"] = wmiResult; | ||
109 | //Win32_VideoController | 113 | //Win32_VideoController |
110 | // (Description, VideoProcessor, AdapterRAM, CurrentHorizontalResolution, CurrentVerticalResolution, Caption, Name) | 114 | // (Description, VideoProcessor, AdapterRAM, CurrentHorizontalResolution, CurrentVerticalResolution, Caption, Name) |
111 | params.clear(); | 115 | params.clear(); |
112 | params << "VideoProcessor" << "AdapterRAM" << "Description" << "Name" << "CurrentHorizontalResolution" | 116 | params << "VideoProcessor" << "AdapterRAM" << "Description" << "Name" << "CurrentHorizontalResolution" |
113 | << "CurrentVerticalResolution" << "Caption" << "AcceleratorCapabilities"; | 117 | << "CurrentVerticalResolution" << "Caption" << "AcceleratorCapabilities"; |
114 | - wmi = wmiSearch("Win32_VideoController", params); | ||
115 | - if (!wmi.isNull()) | ||
116 | - hardware["VideoController"] = wmi; | 118 | + wmiResult = wmi::wmiSearch("Win32_VideoController", params); |
119 | + if (!wmiResult.isNull()) | ||
120 | + hardware["VideoController"] = wmiResult; | ||
117 | //Win32_DesktopMonitor | 121 | //Win32_DesktopMonitor |
118 | // (MonitorManufacturer, Caption, Description, MonitorType, Name) | 122 | // (MonitorManufacturer, Caption, Description, MonitorType, Name) |
119 | params.clear(); | 123 | params.clear(); |
120 | params << "MonitorManufacturer" << "Caption" << "Description" << "MonitorType" << "Name"; | 124 | params << "MonitorManufacturer" << "Caption" << "Description" << "MonitorType" << "Name"; |
121 | - wmi = wmiSearch("Win32_DesktopMonitor", params); | ||
122 | - if (!wmi.isNull()) | ||
123 | - hardware["DesktopMonitor"] = wmi; | 125 | + wmiResult = wmi::wmiSearch("Win32_DesktopMonitor", params); |
126 | + if (!wmiResult.isNull()) | ||
127 | + hardware["DesktopMonitor"] = wmiResult; | ||
124 | //Win32_Printer | 128 | //Win32_Printer |
125 | // (Name, DriverName, PortName, ServerName, ShareName, HorizontalResolution, VerticalResolution, Comment, Shared, Network) | 129 | // (Name, DriverName, PortName, ServerName, ShareName, HorizontalResolution, VerticalResolution, Comment, Shared, Network) |
126 | params.clear(); | 130 | params.clear(); |
127 | params << "Name" << "DriverName" << "PortName" << "ServerName" << "ShareName" << "HorizontalResolution" | 131 | params << "Name" << "DriverName" << "PortName" << "ServerName" << "ShareName" << "HorizontalResolution" |
128 | << "VerticalResolution" << "Comment" << "Shared" << "Network"; | 132 | << "VerticalResolution" << "Comment" << "Shared" << "Network"; |
129 | - wmi = wmiSearch("Win32_Printer", params); | ||
130 | - if (!wmi.isNull()) | ||
131 | - hardware["Printer"] = wmi; | 133 | + wmiResult = wmi::wmiSearch("Win32_Printer", params); |
134 | + if (!wmiResult.isNull()) | ||
135 | + hardware["Printer"] = wmiResult; | ||
132 | //Win32_PortConnector | 136 | //Win32_PortConnector |
133 | // (ExternalReferenceDesignator, PortType (verificar), ConnectorType (verificar), Manufacturer, Caption, Name) | 137 | // (ExternalReferenceDesignator, PortType (verificar), ConnectorType (verificar), Manufacturer, Caption, Name) |
134 | params.clear(); | 138 | params.clear(); |
135 | params << "ExternalReferenceDesignator" << "PortType" << "ConnectorType" << "Name" << "Caption" << "Manufacturer"; | 139 | params << "ExternalReferenceDesignator" << "PortType" << "ConnectorType" << "Name" << "Caption" << "Manufacturer"; |
136 | - wmi = wmiSearch("Win32_PortConnector", params); | ||
137 | - if (!wmi.isNull()) | ||
138 | - hardware["PortConnector"] = wmi; | 140 | + wmiResult = wmi::wmiSearch("Win32_PortConnector", params); |
141 | + if (!wmiResult.isNull()) | ||
142 | + hardware["PortConnector"] = wmiResult; | ||
139 | //Win32_SerialPort | 143 | //Win32_SerialPort |
140 | // (Name, Caption, Description, StatusInfo) | 144 | // (Name, Caption, Description, StatusInfo) |
141 | params.clear(); | 145 | params.clear(); |
142 | params << "Name" << "Caption" << "Description" << "StatusInfo"; | 146 | params << "Name" << "Caption" << "Description" << "StatusInfo"; |
143 | - wmi = wmiSearch("Win32_SerialPort", params); | ||
144 | - if (!wmi.isNull()) | ||
145 | - hardware["SerialPort"] = wmi; | 147 | + wmiResult = wmi::wmiSearch("Win32_SerialPort", params); |
148 | + if (!wmiResult.isNull()) | ||
149 | + hardware["SerialPort"] = wmiResult; | ||
146 | //Win32_Processor | 150 | //Win32_Processor |
147 | // (MaxClockSpeed, Name, Architecture, NumberOfCores, SocketDesignation, Manufacturer, Architecture, NumberOfCores | 151 | // (MaxClockSpeed, Name, Architecture, NumberOfCores, SocketDesignation, Manufacturer, Architecture, NumberOfCores |
148 | // CurrentClockSpeed, MaxClockSpeed, L2CacheSize, AddressWidth, DataWidth, VoltageCaps, CpuStatus, | 152 | // CurrentClockSpeed, MaxClockSpeed, L2CacheSize, AddressWidth, DataWidth, VoltageCaps, CpuStatus, |
@@ -151,154 +155,64 @@ QJsonObject cacic_hardware::coletaWin() | @@ -151,154 +155,64 @@ QJsonObject cacic_hardware::coletaWin() | ||
151 | params << "MaxClockSpeed" << "Name" << "Architecture" << "NumberOfCores" << "SocketDesignation" << "Manufacturer" | 155 | params << "MaxClockSpeed" << "Name" << "Architecture" << "NumberOfCores" << "SocketDesignation" << "Manufacturer" |
152 | << "Architecture" << "NumberOfCores" << "CurrentClockSpeed" << "MaxClockSpeed" << "L2CacheSize" << "AddressWidth" | 156 | << "Architecture" << "NumberOfCores" << "CurrentClockSpeed" << "MaxClockSpeed" << "L2CacheSize" << "AddressWidth" |
153 | << "DataWidth" << "VoltageCaps" << "CpuStatus" << "ProcessorId" << "UniqueId" << "AddressWidth"; | 157 | << "DataWidth" << "VoltageCaps" << "CpuStatus" << "ProcessorId" << "UniqueId" << "AddressWidth"; |
154 | - wmi = wmiSearch("Win32_Processor", params); | ||
155 | - if (!wmi.isNull()) | ||
156 | - hardware["Processor"] = wmi; | 158 | + wmiResult = wmi::wmiSearch("Win32_Processor", params); |
159 | + if (!wmiResult.isNull()) | ||
160 | + hardware["Processor"] = wmiResult; | ||
157 | //Win32_OperatingSystem | 161 | //Win32_OperatingSystem |
158 | // (Name, Version, CSDVersion, Description, InstallDate, Organization, RegisteredUser, SerialNumber) | 162 | // (Name, Version, CSDVersion, Description, InstallDate, Organization, RegisteredUser, SerialNumber) |
159 | params.clear(); | 163 | params.clear(); |
160 | params << "Name" << "Version" << "CSDVersion" << "Description" << "InstallDate" << "Organization" << "RegisteredUser" | 164 | params << "Name" << "Version" << "CSDVersion" << "Description" << "InstallDate" << "Organization" << "RegisteredUser" |
161 | << "SerialNumber"; | 165 | << "SerialNumber"; |
162 | - wmi = wmiSearch("Win32_OperatingSystem", params); | ||
163 | - if (!wmi.isNull()) | ||
164 | - hardware["OperatingSystem"] = wmi; | 166 | + wmiResult = wmi::wmiSearch("Win32_OperatingSystem", params); |
167 | + if (!wmiResult.isNull()) | ||
168 | + hardware["OperatingSystem"] = wmiResult; | ||
165 | //Win32_SystemSlot | 169 | //Win32_SystemSlot |
166 | // (Name, Description, SlotDesignation, CurrentUsage, Status, Shared) | 170 | // (Name, Description, SlotDesignation, CurrentUsage, Status, Shared) |
167 | params.clear(); | 171 | params.clear(); |
168 | params << "Name" << "Description" << "SlotDesignation" << "CurrentUsage" << "Status" << "Shared"; | 172 | params << "Name" << "Description" << "SlotDesignation" << "CurrentUsage" << "Status" << "Shared"; |
169 | - wmi = wmiSearch("Win32_SystemSlot", params); | ||
170 | - if (!wmi.isNull()) | ||
171 | - hardware["SystemSlot"] = wmi; | 173 | + wmiResult = wmi::wmiSearch("Win32_SystemSlot", params); |
174 | + if (!wmiResult.isNull()) | ||
175 | + hardware["SystemSlot"] = wmiResult; | ||
172 | //Win32_LogicalDisk | 176 | //Win32_LogicalDisk |
173 | // (Caption, DriveType, Filesystem, VolumeName, ProviderName, Filesystem, VolumeName, Size, FreeSpace) | 177 | // (Caption, DriveType, Filesystem, VolumeName, ProviderName, Filesystem, VolumeName, Size, FreeSpace) |
174 | params.clear(); | 178 | params.clear(); |
175 | params << "Caption" << "DriveType" << "Filesystem" << "VolumeName" << "ProviderName" << "Filesystem" << "VolumeName" | 179 | params << "Caption" << "DriveType" << "Filesystem" << "VolumeName" << "ProviderName" << "Filesystem" << "VolumeName" |
176 | << "Size" << "FreeSpace"; | 180 | << "Size" << "FreeSpace"; |
177 | - wmi = wmiSearch("Win32_LogicalDisk", params); | ||
178 | - if (!wmi.isNull()) | ||
179 | - hardware["LogicalDisk"] = wmi; | 181 | + wmiResult = wmi::wmiSearch("Win32_LogicalDisk", params); |
182 | + if (!wmiResult.isNull()) | ||
183 | + hardware["LogicalDisk"] = wmiResult; | ||
180 | //Win32_PhysicalMemory | 184 | //Win32_PhysicalMemory |
181 | // (Caption, Description, BankLabel, DeviceLocator, Capacity, Speed, MemoryType, SerialNumber) | 185 | // (Caption, Description, BankLabel, DeviceLocator, Capacity, Speed, MemoryType, SerialNumber) |
182 | params.clear(); | 186 | params.clear(); |
183 | params << "Caption" << "Description" << "BankLabel" << "DeviceLocator" << "Capacity" << "Speed" << "MemoryType"; | 187 | params << "Caption" << "Description" << "BankLabel" << "DeviceLocator" << "Capacity" << "Speed" << "MemoryType"; |
184 | - wmi = wmiSearch("Win32_PhysicalMemory", params); | ||
185 | - if (!wmi.isNull()) | ||
186 | - hardware["PhysicalMemory"] = wmi; | 188 | + wmiResult = wmi::wmiSearch("Win32_PhysicalMemory", params); |
189 | + if (!wmiResult.isNull()) | ||
190 | + hardware["PhysicalMemory"] = wmiResult; | ||
187 | //Win32_Keyboard | 191 | //Win32_Keyboard |
188 | // (Caption, Description, Name) | 192 | // (Caption, Description, Name) |
189 | params.clear(); | 193 | params.clear(); |
190 | params << "Caption" << "Description" << "Name" << "Layout"; | 194 | params << "Caption" << "Description" << "Name" << "Layout"; |
191 | - wmi = wmiSearch("Win32_Keyboard", params); | ||
192 | - if (!wmi.isNull()) | ||
193 | - hardware["Keyboard"] = wmi; | 195 | + wmiResult = wmi::wmiSearch("Win32_Keyboard", params); |
196 | + if (!wmiResult.isNull()) | ||
197 | + hardware["Keyboard"] = wmiResult; | ||
194 | //Win32_PointingDevice | 198 | //Win32_PointingDevice |
195 | // (Manufacturer, Caption, Description, PointingType, DeviceInterface) | 199 | // (Manufacturer, Caption, Description, PointingType, DeviceInterface) |
196 | params.clear(); | 200 | params.clear(); |
197 | params << "Manufacturer" << "Caption" << "Description" << "PointingType" << "DeviceInterface"; | 201 | params << "Manufacturer" << "Caption" << "Description" << "PointingType" << "DeviceInterface"; |
198 | - wmi = wmiSearch("Win32_PointingDevice", params); | ||
199 | - if (!wmi.isNull()) | ||
200 | - hardware["PointingDevice"] = wmi; | 202 | + wmiResult = wmi::wmiSearch("Win32_PointingDevice", params); |
203 | + if (!wmiResult.isNull()) | ||
204 | + hardware["PointingDevice"] = wmiResult; | ||
201 | //Win32_PnPSignedDriver | 205 | //Win32_PnPSignedDriver |
202 | // (Manufacturer, DeviceName, Description, Location, DeviceClass) | 206 | // (Manufacturer, DeviceName, Description, Location, DeviceClass) |
203 | params.clear(); | 207 | params.clear(); |
204 | params << "Manufacturer" << "DeviceName" << "Description" << "Location" << "DeviceClass"; | 208 | params << "Manufacturer" << "DeviceName" << "Description" << "Location" << "DeviceClass"; |
205 | - wmi = wmiSearch("Win32_PnPSignedDriver", params); | ||
206 | - if (!wmi.isNull()) | ||
207 | - hardware["PnPSignedDriver"] = wmi; | 209 | + wmiResult = wmi::wmiSearch("Win32_PnPSignedDriver", params); |
210 | + if (!wmiResult.isNull()) | ||
211 | + hardware["PnPSignedDriver"] = wmiResult; | ||
208 | // qDebug() << hardware; | 212 | // qDebug() << hardware; |
209 | return hardware; | 213 | return hardware; |
210 | } | 214 | } |
211 | 215 | ||
212 | -QJsonValue cacic_hardware::wmiSearch(QString classe, QStringList params) | ||
213 | -{ | ||
214 | - QJsonValue wmiReturn; | ||
215 | - QJsonObject itemWmi; | ||
216 | - QJsonArray arrayItens; | ||
217 | - QString paramsString; | ||
218 | - if (!params.empty()){ | ||
219 | - for(int i = 0; i!=params.size();i++) | ||
220 | - paramsString.append(params.at(i) + ((i != params.size() - 1) ? "," : "")); | ||
221 | - } | ||
222 | - QString query = "SELECT " + ((!paramsString.isEmpty()) ? paramsString : "*") + " FROM " + classe; | ||
223 | - //conecta ao script (Como já estamos usando QObject, o WbemScripting... não funciona chamando normal, | ||
224 | - // por isso deve ser usado o CoInitializeEx) | ||
225 | - ::CoInitializeEx(NULL, COINIT_MULTITHREADED); | ||
226 | - QAxObject *objIWbemLocator = new QAxObject(); | ||
227 | - objIWbemLocator->setControl("WbemScripting.SWbemLocator"); | ||
228 | - if (objIWbemLocator->isNull()) | ||
229 | - return QJsonValue(); | ||
230 | - //conecta ao wmi | ||
231 | - QAxObject *objWMIService = objIWbemLocator->querySubObject("ConnectServer(QString&,QString&)", | ||
232 | - QString("."), | ||
233 | - QString("root\\CIMV2") | ||
234 | - ); | ||
235 | -// qDebug() << ">>>>>>>>>" << objIWbemLocator->isNull() << objWMIService->isNull(); | ||
236 | - //Faz a pesquisa no wmi | ||
237 | - QAxObject* returnList = objWMIService->querySubObject("ExecQuery(QString&)", query); | ||
238 | -// qDebug() << "<<<<<<<<<<<<<<<<<<<<<<<"; | ||
239 | - QAxObject *enum1 = returnList->querySubObject("_NewEnum"); | ||
240 | - | ||
241 | - IEnumVARIANT* enumInterface = 0; | ||
242 | - | ||
243 | - enum1->queryInterface(IID_IEnumVARIANT, (void**)&enumInterface); | ||
244 | - | ||
245 | - enumInterface->Reset(); | ||
246 | - int countReturnListObj = returnList->dynamicCall("Count").toInt(); | ||
247 | - for (int i = 0; i < countReturnListObj; i++) { | ||
248 | - VARIANT *theItem = (VARIANT*)malloc(sizeof(VARIANT)); | ||
249 | - if (enumInterface->Next(1,theItem,NULL) != S_FALSE){ | ||
250 | - QAxObject *item = new QAxObject((IUnknown *)theItem->punkVal); | ||
251 | - if(item){ | ||
252 | - //pega o retorno da query | ||
253 | - QString instance = item->dynamicCall("GetObjectText_(int)", QVariant(0)).toString(); | ||
254 | - QStringList instanceList = instance.split("\n\t"); | ||
255 | - //Pra cada linha grava no json os valores com cada tag | ||
256 | - foreach(QString value, instanceList){ | ||
257 | - QStringList valueList = value.split("="); | ||
258 | - if (valueList.size() > 1){ | ||
259 | - QString tag = valueList.at(0).trimmed(); | ||
260 | - QString aux = valueList.at(1).trimmed(); | ||
261 | - aux.remove("\""); | ||
262 | - aux.remove(";"); | ||
263 | - aux.remove("\n"); | ||
264 | - //verifica se é lista | ||
265 | - if(aux.startsWith("{") && aux.endsWith("}")){ | ||
266 | - QStringList auxList = aux.split(","); | ||
267 | - QJsonArray jList; | ||
268 | - foreach(QString valueList, auxList){ | ||
269 | - if (valueList.contains("{")) | ||
270 | - valueList.remove("{"); | ||
271 | - if (valueList.contains("}")) | ||
272 | - valueList.remove("}"); | ||
273 | - jList.append(valueList.trimmed()); | ||
274 | - } | ||
275 | - itemWmi[tag] = jList; | ||
276 | - } else { | ||
277 | - //O último valor sempre volta com "}" no final. | ||
278 | - if (aux.contains("}")) | ||
279 | - aux.remove("}"); | ||
280 | - itemWmi[tag] = QJsonValue::fromVariant(aux.trimmed()); | ||
281 | - } | ||
282 | - } | ||
283 | - } // foreach(QString value, instanceList) | ||
284 | - } // if(item) | ||
285 | - } // if (enumInterface->Next(1,theItem,NULL) != S_FALSE) | ||
286 | - //Se houver mais de um objeto, grava em uma lista | ||
287 | - if (countReturnListObj > 1){ | ||
288 | - arrayItens.append(QJsonValue(itemWmi)); | ||
289 | - } | ||
290 | - } | ||
291 | - objIWbemLocator->clear(); | ||
292 | - ::CoUninitialize(); | ||
293 | - //se for mais de um objeto, retorna array. | ||
294 | - if (!arrayItens.isEmpty()) | ||
295 | - wmiReturn = QJsonValue(arrayItens); | ||
296 | - //senão, se o objeto não for vazio (se tiver coletado algo) | ||
297 | - else if (!itemWmi.isEmpty()) | ||
298 | - wmiReturn = QJsonValue(itemWmi); | ||
299 | - | ||
300 | - return wmiReturn; | ||
301 | -} | ||
302 | #elif defined(Q_OS_LINUX) | 216 | #elif defined(Q_OS_LINUX) |
303 | QJsonObject cacic_hardware::coletaLinux() | 217 | QJsonObject cacic_hardware::coletaLinux() |
304 | { | 218 | { |
src/cacic_hardware.h
@@ -8,8 +8,7 @@ | @@ -8,8 +8,7 @@ | ||
8 | #include <console.h> | 8 | #include <console.h> |
9 | #include <operatingsystem.h> | 9 | #include <operatingsystem.h> |
10 | #ifdef Q_OS_WIN | 10 | #ifdef Q_OS_WIN |
11 | - #include <windows.h> | ||
12 | - #include <ActiveQt/ActiveQt> | 11 | + #include <wmi.h> |
13 | #endif | 12 | #endif |
14 | 13 | ||
15 | class cacic_hardware | 14 | class cacic_hardware |
@@ -22,7 +21,6 @@ public: | @@ -22,7 +21,6 @@ public: | ||
22 | private: | 21 | private: |
23 | #ifdef Q_OS_WIN | 22 | #ifdef Q_OS_WIN |
24 | QJsonObject coletaWin(); | 23 | QJsonObject coletaWin(); |
25 | - QJsonValue wmiSearch(QString classe, QStringList params); | ||
26 | 24 | ||
27 | #elif defined(Q_OS_LINUX) | 25 | #elif defined(Q_OS_LINUX) |
28 | QJsonObject coletaLinux(); | 26 | QJsonObject coletaLinux(); |
src/cacic_software.h
@@ -4,7 +4,6 @@ | @@ -4,7 +4,6 @@ | ||
4 | #include <ccacic.h> | 4 | #include <ccacic.h> |
5 | #include <console.h> | 5 | #include <console.h> |
6 | #include <operatingsystem.h> | 6 | #include <operatingsystem.h> |
7 | - | ||
8 | #ifdef Q_OS_WIN | 7 | #ifdef Q_OS_WIN |
9 | #include <vqtconvert.h> | 8 | #include <vqtconvert.h> |
10 | #include <vregistry.h> | 9 | #include <vregistry.h> |
src/operatingsystem.cpp
@@ -45,16 +45,15 @@ int OperatingSystem::coletaIdOs(){ | @@ -45,16 +45,15 @@ int OperatingSystem::coletaIdOs(){ | ||
45 | QString OperatingSystem::coletaNomeOs() | 45 | QString OperatingSystem::coletaNomeOs() |
46 | { | 46 | { |
47 | #if defined(Q_OS_WIN) | 47 | #if defined(Q_OS_WIN) |
48 | - QString text; | ||
49 | - QStringList environment = QProcessEnvironment::systemEnvironment().toStringList(); | ||
50 | - foreach (text, environment) { | ||
51 | -// qDebug() << text; | ||
52 | - if (text.contains("OS=" , Qt::CaseInsensitive) ){ | ||
53 | - QStringList split = text.split("="); | ||
54 | - // qDebug() << split[1]; | ||
55 | - return split[1]; | ||
56 | - } | ||
57 | - } | 48 | + QStringList params; |
49 | + QJsonValue osName; | ||
50 | + params << "Name"; | ||
51 | + osName = wmi::wmiSearch("Win32_OperatingSystem", params); | ||
52 | + if (!osName.isNull()){ | ||
53 | + QString retorno = osName.toObject()["Name"].toString(); | ||
54 | + retorno = retorno.left(retorno.indexOf("|")); | ||
55 | + return retorno; | ||
56 | + } | ||
58 | #elif defined(Q_OS_LINUX) | 57 | #elif defined(Q_OS_LINUX) |
59 | ConsoleObject console; | 58 | ConsoleObject console; |
60 | QStringList catOutput = console("cat /etc/*release").split("\n"); | 59 | QStringList catOutput = console("cat /etc/*release").split("\n"); |
src/operatingsystem.h
@@ -5,9 +5,11 @@ | @@ -5,9 +5,11 @@ | ||
5 | #include <QString> | 5 | #include <QString> |
6 | #include <QStringList> | 6 | #include <QStringList> |
7 | #include <QSysInfo> | 7 | #include <QSysInfo> |
8 | - | ||
9 | #include "ccacic.h" | 8 | #include "ccacic.h" |
10 | #include "console.h" | 9 | #include "console.h" |
10 | +#ifdef Q_OS_WIN | ||
11 | + #include "wmi.h" | ||
12 | +#endif | ||
11 | 13 | ||
12 | class OperatingSystem | 14 | class OperatingSystem |
13 | { | 15 | { |
src/qtservice/common.pri
1 | -exists(config.pri):infile(config.pri, SOLUTIONS_LIBRARY, yes): CONFIG += qtservice-uselib | 1 | +#exists(config.pri):infile(config.pri, SOLUTIONS_LIBRARY, yes): CONFIG += qtservice-uselib |
2 | TEMPLATE += fakelib | 2 | TEMPLATE += fakelib |
3 | QTSERVICE_LIBNAME = QtSolutions_Service-head | 3 | QTSERVICE_LIBNAME = QtSolutions_Service-head |
4 | CONFIG(debug, debug|release) { | 4 | CONFIG(debug, debug|release) { |
src/wmi.cpp
@@ -3,3 +3,94 @@ | @@ -3,3 +3,94 @@ | ||
3 | wmi::wmi() | 3 | wmi::wmi() |
4 | { | 4 | { |
5 | } | 5 | } |
6 | + | ||
7 | +QJsonValue wmi::wmiSearch(QString classe, QStringList params) | ||
8 | +{ | ||
9 | + QJsonValue wmiReturn; | ||
10 | + QJsonObject itemWmi; | ||
11 | + QJsonArray arrayItens; | ||
12 | + QString paramsString; | ||
13 | + if (!params.empty()){ | ||
14 | + for(int i = 0; i!=params.size();i++) | ||
15 | + paramsString.append(params.at(i) + ((i != params.size() - 1) ? "," : "")); | ||
16 | + } | ||
17 | + QString query = "SELECT " + ((!paramsString.isEmpty()) ? paramsString : "*") + " FROM " + classe; | ||
18 | + //conecta ao script (Como já estamos usando QObject, o WbemScripting... não funciona chamando normal, | ||
19 | + // por isso deve ser usado o CoInitializeEx) | ||
20 | + ::CoInitializeEx(NULL, COINIT_MULTITHREADED); | ||
21 | + QAxObject *objIWbemLocator = new QAxObject(); | ||
22 | + objIWbemLocator->setControl("WbemScripting.SWbemLocator"); | ||
23 | + if (objIWbemLocator->isNull()) | ||
24 | + return QJsonValue(); | ||
25 | + //conecta ao wmi | ||
26 | + QAxObject *objWMIService = objIWbemLocator->querySubObject("ConnectServer(QString&,QString&)", | ||
27 | + QString("."), | ||
28 | + QString("root\\CIMV2") | ||
29 | + ); | ||
30 | +// qDebug() << ">>>>>>>>>" << objIWbemLocator->isNull() << objWMIService->isNull(); | ||
31 | + //Faz a pesquisa no wmi | ||
32 | + QAxObject* returnList = objWMIService->querySubObject("ExecQuery(QString&)", query); | ||
33 | +// qDebug() << "<<<<<<<<<<<<<<<<<<<<<<<"; | ||
34 | + QAxObject *enum1 = returnList->querySubObject("_NewEnum"); | ||
35 | + | ||
36 | + IEnumVARIANT* enumInterface = 0; | ||
37 | + | ||
38 | + enum1->queryInterface(IID_IEnumVARIANT, (void**)&enumInterface); | ||
39 | + | ||
40 | + enumInterface->Reset(); | ||
41 | + int countReturnListObj = returnList->dynamicCall("Count").toInt(); | ||
42 | + for (int i = 0; i < countReturnListObj; i++) { | ||
43 | + VARIANT *theItem = (VARIANT*)malloc(sizeof(VARIANT)); | ||
44 | + if (enumInterface->Next(1,theItem,NULL) != S_FALSE){ | ||
45 | + QAxObject *item = new QAxObject((IUnknown *)theItem->punkVal); | ||
46 | + if(item){ | ||
47 | + //pega o retorno da query | ||
48 | + QString instance = item->dynamicCall("GetObjectText_(int)", QVariant(0)).toString(); | ||
49 | + QStringList instanceList = instance.split("\n\t"); | ||
50 | + //Pra cada linha grava no json os valores com cada tag | ||
51 | + foreach(QString value, instanceList){ | ||
52 | + QStringList valueList = value.split("="); | ||
53 | + if (valueList.size() > 1){ | ||
54 | + QString tag = valueList.at(0).trimmed(); | ||
55 | + QString aux = valueList.at(1).trimmed(); | ||
56 | + aux.remove("\""); | ||
57 | + aux.remove(";"); | ||
58 | + aux.remove("\n"); | ||
59 | + //verifica se é lista | ||
60 | + if(aux.startsWith("{") && aux.endsWith("}")){ | ||
61 | + QStringList auxList = aux.split(","); | ||
62 | + QJsonArray jList; | ||
63 | + foreach(QString valueList, auxList){ | ||
64 | + if (valueList.contains("{")) | ||
65 | + valueList.remove("{"); | ||
66 | + if (valueList.contains("}")) | ||
67 | + valueList.remove("}"); | ||
68 | + jList.append(valueList.trimmed()); | ||
69 | + } | ||
70 | + itemWmi[tag] = jList; | ||
71 | + } else { | ||
72 | + //O último valor sempre volta com "}" no final. | ||
73 | + if (aux.contains("}")) | ||
74 | + aux.remove("}"); | ||
75 | + itemWmi[tag] = QJsonValue::fromVariant(aux.trimmed()); | ||
76 | + } | ||
77 | + } | ||
78 | + } // foreach(QString value, instanceList) | ||
79 | + } // if(item) | ||
80 | + } // if (enumInterface->Next(1,theItem,NULL) != S_FALSE) | ||
81 | + //Se houver mais de um objeto, grava em uma lista | ||
82 | + if (countReturnListObj > 1){ | ||
83 | + arrayItens.append(QJsonValue(itemWmi)); | ||
84 | + } | ||
85 | + } | ||
86 | + objIWbemLocator->clear(); | ||
87 | + ::CoUninitialize(); | ||
88 | + //se for mais de um objeto, retorna array. | ||
89 | + if (!arrayItens.isEmpty()) | ||
90 | + wmiReturn = QJsonValue(arrayItens); | ||
91 | + //senão, se o objeto não for vazio (se tiver coletado algo) | ||
92 | + else if (!itemWmi.isEmpty()) | ||
93 | + wmiReturn = QJsonValue(itemWmi); | ||
94 | + | ||
95 | + return wmiReturn; | ||
96 | +} |
src/wmi.h
1 | #ifndef WMI_H | 1 | #ifndef WMI_H |
2 | #define WMI_H | 2 | #define WMI_H |
3 | 3 | ||
4 | +#include <ccacic.h> | ||
5 | +#include <windows.h> | ||
6 | +#include <ActiveQt/ActiveQt> | ||
7 | + | ||
4 | class wmi | 8 | class wmi |
5 | { | 9 | { |
6 | public: | 10 | public: |
7 | wmi(); | 11 | wmi(); |
12 | + static QJsonValue wmiSearch(QString classe, QStringList params); | ||
13 | +private: | ||
8 | }; | 14 | }; |
9 | 15 | ||
10 | #endif // WMI_H | 16 | #endif // WMI_H |