-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWMI.bi
301 lines (254 loc) · 9.29 KB
/
WMI.bi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
'WMI
' Copyright (c) 2025 CM.Wang
' Freeware. Use at your own risk.
#include once "vbcompat.bi"
#include once "win/wbemcli.bi"
#include once "mff/TextBox.bi"
#include once "mff/ComboBoxEdit.bi"
'Com
Const sCLSID_WbemLocator = "{4590F811-1D3A-11D0-891F-00AA004B2E24}"
Const sIID_IWbemLocator = "{DC12A687-737F-11CF-884D-00AA004B2E24}"
Using My.Sys.Forms
Private Function WStrArrayAdd(pstra() As WString Ptr, addstr As WString) As Integer
Dim i As Integer = UBound(pstra) + 1
ReDim Preserve pstra(i)
WLet(pstra(i), addstr)
Return i
End Function
Private Function VARIANT2Str(vResult As VARIANT, pType As CIMTYPE, pFlag As Long) As String
If vResult.vt And CIM_FLAG_ARRAY Then
Dim As SAFEARRAY Ptr pSafeArray = vResult.parray
Dim As Long lowerBound, upperBound
SafeArrayGetLBound(pSafeArray, 1, @lowerBound)
SafeArrayGetUBound(pSafeArray, 1, @upperBound)
Dim As WString Ptr wstrrtn()
ReDim wstrrtn(lowerBound To upperBound)
Dim As Long i
Select Case vResult.vt And &h1fff
Case CIM_STRING
Dim As BSTR bstrName
For i = lowerBound To upperBound
SafeArrayGetElement(pSafeArray, @i, @bstrName)
WLet(wstrrtn(i), *Cast(WString Ptr, bstrName))
SysFreeString(bstrName)
Next
Case CIM_SINT32 ' VT_I4
Dim As Long longvalue
For i = lowerBound To upperBound
SafeArrayGetElement(pSafeArray, @i, @longvalue)
WLet(wstrrtn(i), Hex(longvalue, 2))
Next
'Case VT_BOOL
Case Else
Print "CIM_FLAG_ARRAY-" & Hex(vResult.vt)
End Select
Dim As WString Ptr rtnwstr
JoinWStr(wstrrtn(), ", ", rtnwstr)
Dim As String rtn = *rtnwstr
ArrayDeallocate(wstrrtn())
Deallocate(rtnwstr)
Return "" & rtn & ", " & lowerBound & ", " & upperBound
Else
Select Case vResult.vt And &h1fff
Case VT_NULL
Return "(NULL)"
Case CIM_BOOLEAN
Return "" & IIf(vResult.boolVal, "True", "False")
Case CIM_CHAR16
Return "" & vResult.uiVal
Case CIM_DATETIME
Return "" & vResult.date
Case CIM_EMPTY
Return "(EMPTY)"
Case CIM_ILLEGAL
Return "(ILLEGAL)"
Case CIM_OBJECT
Return "(OBJECT)"
Case CIM_REAL32
Return "" & vResult.fltVal
Case CIM_REAL64
Return "" & vResult.dblVal
Case CIM_REFERENCE
Return "" & *vResult.plVal
Case CIM_SINT16
Return "" & vResult.iVal
Case CIM_SINT32
Return "" & vResult.lVal
Case CIM_SINT64
Return "" & vResult.llVal
Case CIM_SINT8
Return "" & vResult.llVal
Case CIM_STRING
Return "" & *Cast(WString Ptr, vResult.pbstrVal)
Case CIM_UINT16
Return "" & vResult.iVal
Case CIM_UINT32
Return "" & vResult.ulVal
Case CIM_UINT64
Return "" & vResult.ullVal
Case CIM_UINT8
Return "" & vResult.bVal
Case Else
Return "(Invalid type)"
End Select
End If
End Function
Private Function GetIWbemServices(server As WString, ByRef pService As IWbemServices Ptr) As Integer
Dim As IWbemLocator Ptr pLocator
Dim As GUID pCLSID_WbemLocator
Dim As GUID pIID_IWbemLocator
CLSIDFromString(sCLSID_WbemLocator, @pCLSID_WbemLocator)
IIDFromString(sIID_IWbemLocator, @pIID_IWbemLocator)
CoCreateInstance(@pCLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, @pIID_IWbemLocator, @pLocator)
If pLocator Then
pLocator->lpVtbl->ConnectServer(pLocator, @server, NULL, NULL, 0, NULL, 0, 0, @pService)
If pService Then
CoSetProxyBlanket(Cast(IUnknown Ptr, pService), RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE)
End If
pLocator->lpVtbl->Release(pLocator)
End If
Return pService
End Function
Private Function ExecQuery(sql As WString, pService As IWbemServices Ptr, ByRef pEnum As IEnumWbemClassObject Ptr) As Integer
If pService Then pService->lpVtbl->ExecQuery(pService, @"WQL", @sql, WBEM_FLAG_FORWARD_ONLY Or WBEM_FLAG_RETURN_IMMEDIATELY, NULL, @pEnum)
Return pEnum
End Function
Private Function EnumNameSpace(server As WString, sql As WString, rtnwstra() As WString Ptr) As Integer
Dim As IWbemServices Ptr pService
Dim As IEnumWbemClassObject Ptr pEnum
Dim As IWbemClassObject Ptr pItem
Dim As VARIANT vResult
Dim As Long hr
ArrayDeallocate(rtnwstra())
If GetIWbemServices(server, pService) = 0 Then Return 0
If ExecQuery(sql, pService, pEnum) = 0 Then Return 0
Dim As ULong uReturn = 0
Dim cItem As Long = 0
Do
hr = pEnum->lpVtbl->Next(pEnum, WBEM_INFINITE, 1, @pItem, @uReturn)
If uReturn = 0 Then Exit Do
hr = pItem->lpVtbl->Get(pItem, @"Name", 0, @vResult, NULL, NULL)
If hr <> 0 Then Return 0
cItem += 1
WStrArrayAdd(rtnwstra(), server & "\" & *Cast(WString Ptr, vResult.pbstrVal))
If pItem Then pItem->lpVtbl->Release(pItem)
Loop While True
If pEnum Then pEnum->lpVtbl->Release(pEnum)
If pService Then pService->lpVtbl->Release(pService)
Return cItem
End Function
Private Function EnumClasses(wminame As WString, sql As WString, rtnwstra() As WString Ptr) As Integer
Dim As IWbemServices Ptr pService
Dim As IEnumWbemClassObject Ptr pEnum
Dim As IWbemClassObject Ptr pItem
Dim As VARIANT vResult
Dim As Long hr
ArrayDeallocate(rtnwstra())
If GetIWbemServices(wminame, pService) = 0 Then Return 0
If ExecQuery(sql, pService, pEnum) = 0 Then Return 0
Dim As ULong uReturn = 0
Dim cItem As Long = 0
Do
hr = pEnum->lpVtbl->Next(pEnum, WBEM_INFINITE, 1, @pItem, @uReturn)
If uReturn = 0 Then Exit Do
hr = pItem->lpVtbl->Get(pItem, @"__CLASS", 0, @vResult, NULL, NULL)
If hr <> 0 Then Return 0
cItem += 1
WStrArrayAdd(rtnwstra(), *Cast(WString Ptr, vResult.pbstrVal))
If pItem Then pItem->lpVtbl->Release(pItem)
Loop While True
If pEnum Then pEnum->lpVtbl->Release(pEnum)
If pService Then pService->lpVtbl->Release(pService)
Return cItem
End Function
Private Function EnumPropreties(wminame As WString, classname As WString, rtnwstra() As WString Ptr) As Integer
Dim As IWbemServices Ptr pService
Dim As IEnumWbemClassObject Ptr pEnum
Dim As IWbemClassObject Ptr pItem
Dim As VARIANT vResult
Dim As Long hr
Dim As WString Ptr a
ArrayDeallocate(rtnwstra())
If GetIWbemServices(wminame, pService) = 0 Then Return 0
WLet(a, "SELECT * FROM " & classname)
hr = pService->lpVtbl->ExecQuery(pService, @"WQL", a, WBEM_FLAG_FORWARD_ONLY Or WBEM_FLAG_RETURN_IMMEDIATELY, NULL, @pEnum)
If a Then Deallocate(a)
If hr <> 0 Then Return 0
Dim As ULong uReturn = 0
hr = pEnum->lpVtbl->Next(pEnum, WBEM_INFINITE, 1, @pItem, @uReturn)
If uReturn = 0 Then Return 0
Dim As SAFEARRAY Ptr pNames
hr = pItem->lpVtbl->GetNames(pItem, NULL, WBEM_FLAG_NONSYSTEM_ONLY, NULL, @pNames)
If hr <> 0 Then Return 0
Dim As Long lLBound, lUBound
SafeArrayGetLBound(pNames, 1, @lLBound)
SafeArrayGetUBound(pNames, 1, @lUBound)
Dim As Long i
Dim As BSTR bstrName
Dim As Long pFlag
Dim As CIMTYPE pType
ReDim rtnwstra(lLBound To lUBound)
For i = lLBound To lUBound
hr = SafeArrayGetElement(pNames, @i, @bstrName)
If hr <> 0 Then Exit For
WLet(rtnwstra(i), *Cast(WString Ptr, bstrName))
SysFreeString(bstrName)
Next
SafeArrayDestroy(pNames)
If pItem Then pItem->lpVtbl->Release(pItem)
If pEnum Then pEnum->lpVtbl->Release(pEnum)
If pService Then pService->lpVtbl->Release(pService)
Return lUBound - lLBound
End Function
Private Function EnumPropretiesValues(wminame As WString, classname As WString, ByRef txt As WString Ptr) As Integer
Dim As IWbemServices Ptr pService
Dim As IEnumWbemClassObject Ptr pEnum = NULL
Dim As IWbemClassObject Ptr pItem = NULL
Dim As VARIANT vResult
Dim As Long hr
Dim As WString Ptr a
If GetIWbemServices(wminame, pService) = 0 Then Return 0
WLet(a, "SELECT * FROM " & classname)
hr = pService->lpVtbl->ExecQuery(pService, @"WQL", a, WBEM_FLAG_FORWARD_ONLY Or WBEM_FLAG_RETURN_IMMEDIATELY, NULL, @pEnum)
If a Then Deallocate(a)
If hr <> 0 Or pEnum = NULL Then Return 0
Dim As WString Ptr txts()
Dim As ULong uReturn = 0
Dim cItem As Long = 0
Do
hr = pEnum->lpVtbl->Next(pEnum, WBEM_INFINITE, 1, @pItem, @uReturn)
If uReturn = 0 Or pItem = NULL Then Exit Do
Dim As SAFEARRAY Ptr pNames = NULL
hr = pItem->lpVtbl->GetNames(pItem, NULL, WBEM_FLAG_NONSYSTEM_ONLY, NULL, @pNames)
If hr <> 0 Then Exit Do
Dim As Long lLBound, lUBound
hr = SafeArrayGetLBound(pNames, 1, @lLBound)
hr = SafeArrayGetUBound(pNames, 1, @lUBound)
Dim As Long i
Dim As BSTR bstrName
Dim As Long pFlag
Dim As CIMTYPE pType
cItem += 1
WStrArrayAdd(txts(), cItem & ". " & classname)
For i = lLBound To lUBound
hr = SafeArrayGetElement(pNames, @i, @bstrName)
If hr = 0 Then
WLet(a, *Cast(WString Ptr, bstrName))
hr = pItem->lpVtbl->Get(pItem, a, WBEM_FLAG_ALWAYS, @vResult, @pType, @pFlag)
If hr = 0 Then
WStrArrayAdd(txts(), !"\t" & i + 1 & !".\t" & *a & " = " & VARIANT2Str(vResult, pType, pFlag)) '& " (0x" & Hex(pType) & ", " & pType & ", 0x" & Hex(vResult.vt) & ")")
Else
WStrArrayAdd(txts(), !"\t" & i + 1 & !".\t" & *a & " = Invalid")
End If
SysFreeString(bstrName)
End If
Next
hr = SafeArrayDestroy(pNames)
If pItem Then pItem->lpVtbl->Release(pItem)
Loop While True
If pEnum Then pEnum->lpVtbl->Release(pEnum)
If pService Then pService->lpVtbl->Release(pService)
JoinWStr(txts(), vbCrLf, txt)
ArrayDeallocate(txts())
Return cItem
End Function