Skip to content

Commit 60ebedd

Browse files
authored
Merge pull request #2646 from laozc/bump-wmi
cleanup: Remove the microsoft/wmi workaround for InvokeCimMethod
2 parents 47e8e1f + ce5ca48 commit 60ebedd

File tree

1 file changed

+1
-101
lines changed

1 file changed

+1
-101
lines changed

pkg/os/cim/wmi.go

Lines changed: 1 addition & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"runtime"
2626

2727
"github.com/go-ole/go-ole"
28-
"github.com/go-ole/go-ole/oleutil"
2928
"github.com/microsoft/wmi/pkg/base/query"
3029
wmierrors "github.com/microsoft/wmi/pkg/errors"
3130
cim "github.com/microsoft/wmi/pkg/wmiinstance"
@@ -107,105 +106,6 @@ func QueryInstances(namespace string, query *query.WmiQuery) ([]*cim.WmiInstance
107106
return instances, err
108107
}
109108

110-
// TODO: fix the panic in microsoft/wmi library and remove this workaround
111-
// Refer to https://github.com/microsoft/wmi/issues/167
112-
func executeClassMethodParam(classInst *cim.WmiInstance, method *cim.WmiMethod, inParam, outParam cim.WmiMethodParamCollection) (result *cim.WmiMethodResult, err error) {
113-
klog.V(6).Infof("[WMI] - Executing Method [%s]\n", method.Name)
114-
115-
iDispatchInstance := classInst.GetIDispatch()
116-
if iDispatchInstance == nil {
117-
return nil, wmierrors.Wrapf(wmierrors.InvalidInput, "InvalidInstance")
118-
}
119-
rawResult, err := iDispatchInstance.GetProperty("Methods_")
120-
if err != nil {
121-
return nil, err
122-
}
123-
defer rawResult.Clear()
124-
// Retrieve the method
125-
rawMethod, err := rawResult.ToIDispatch().CallMethod("Item", method.Name)
126-
if err != nil {
127-
return nil, err
128-
}
129-
defer rawMethod.Clear()
130-
131-
addInParam := func(inparamVariant *ole.VARIANT, paramName string, paramValue interface{}) error {
132-
rawProperties, err := inparamVariant.ToIDispatch().GetProperty("Properties_")
133-
if err != nil {
134-
return err
135-
}
136-
defer rawProperties.Clear()
137-
rawProperty, err := rawProperties.ToIDispatch().CallMethod("Item", paramName)
138-
if err != nil {
139-
return err
140-
}
141-
defer rawProperty.Clear()
142-
143-
p, err := rawProperty.ToIDispatch().PutProperty("Value", paramValue)
144-
if err != nil {
145-
return err
146-
}
147-
defer p.Clear()
148-
return nil
149-
}
150-
151-
params := []interface{}{method.Name}
152-
if len(inParam) > 0 {
153-
inparamsRaw, err := rawMethod.ToIDispatch().GetProperty("InParameters")
154-
if err != nil {
155-
return nil, err
156-
}
157-
defer inparamsRaw.Clear()
158-
159-
inparams, err := oleutil.CallMethod(inparamsRaw.ToIDispatch(), "SpawnInstance_")
160-
if err != nil {
161-
return nil, err
162-
}
163-
defer inparams.Clear()
164-
165-
for _, inp := range inParam {
166-
addInParam(inparams, inp.Name, inp.Value)
167-
}
168-
169-
params = append(params, inparams)
170-
}
171-
172-
result = &cim.WmiMethodResult{
173-
OutMethodParams: map[string]*cim.WmiMethodParam{},
174-
}
175-
outparams, err := classInst.GetIDispatch().CallMethod("ExecMethod_", params...)
176-
if err != nil {
177-
return
178-
}
179-
defer outparams.Clear()
180-
returnRaw, err := outparams.ToIDispatch().GetProperty("ReturnValue")
181-
if err != nil {
182-
return
183-
}
184-
defer returnRaw.Clear()
185-
if returnRaw.Value() != nil {
186-
result.ReturnValue = returnRaw.Value().(int32)
187-
klog.V(6).Infof("[WMI] - Return [%d] ", result.ReturnValue)
188-
}
189-
190-
for _, outp := range outParam {
191-
returnRawIn, err1 := outparams.ToIDispatch().GetProperty(outp.Name)
192-
if err1 != nil {
193-
err = err1
194-
return
195-
}
196-
defer returnRawIn.Clear()
197-
198-
value, err1 := cim.GetVariantValue(returnRawIn)
199-
if err1 != nil {
200-
err = err1
201-
return
202-
}
203-
204-
result.OutMethodParams[outp.Name] = cim.NewWmiMethodParam(outp.Name, value)
205-
}
206-
return
207-
}
208-
209109
// InvokeCimMethod calls a static method on a specific WMI class with given input parameters,
210110
// returning the method's return value, output parameters, and any error encountered.
211111
func InvokeCimMethod(namespace, class, methodName string, inputParameters map[string]interface{}) (int, map[string]interface{}, error) {
@@ -241,7 +141,7 @@ func InvokeCimMethod(namespace, class, methodName string, inputParameters map[st
241141

242142
var outParam cim.WmiMethodParamCollection
243143
var result *cim.WmiMethodResult
244-
result, err = executeClassMethodParam(classInst, method, inParam, outParam)
144+
result, err = method.Execute(inParam, outParam)
245145
if err != nil {
246146
return -1, nil, err
247147
}

0 commit comments

Comments
 (0)