Windows System Software -- Consulting, Training, Development -- Unique Expertise, Guaranteed Results
The free OSR Learning Library has more than 50 articles on a wide variety of topics about writing and debugging device drivers and Minifilters. From introductory level to advanced. All the articles have been recently reviewed and updated, and are written using the clear and definitive style you've come to expect from OSR over the years.
Check out The OSR Learning Library at: https://www.osr.com/osr-learning-library/
I had a WMI provider class working fine with user space such that it could read and write members of the provider class. I then needed to add a couple members of type string
. Once I added these new members to the class my EvtWmiInstanceQueryInstance
callback still works fine, but my EvtWmiInstanceSetInstance
callback doesn't get called any more. If I set a breakpoint on the call to this callback it never gets hit.
What would cause this behavior? And better yet, how do I resolve it?
Here's how I'm attempting to modify my WMI object:
$ci = get-ciminstance My_WMIClass -Namespace "root/wmi" $ci.NormalMember= 10 Set-CimInstance -CimInstance $ci -PassThru
This works just fine if my class doesn't have any members of type string
. When I add a string
member I get the following error when I call Set-CimInstance -CimInstance $ci -PassThru
:
Set-CimInstance : Generic failure At line:5 char:1 + Set-CimInstance -CimInstance $ci -PassThru + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (My_WMIClass...5&7047288&8...):CimInstance) [Set-CimInsta nce], CimException + FullyQualifiedErrorId : HRESULT 0x80041001,Microsoft.Management.Infrastructure.CimCmdlets.SetCimIns tanceCommand
Upcoming OSR Seminars | ||
---|---|---|
OSR has suspended in-person seminars due to the Covid-19 outbreak. But, don't miss your training! Attend via the internet instead! | ||
Writing WDF Drivers | 7 Dec 2020 | LIVE ONLINE |
Internals & Software Drivers | 25 Jan 2021 | LIVE ONLINE |
Developing Minifilters | 8 March 2021 | LIVE ONLINE |
Comments
How are you providing the string data to WMI ?
See: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdfwmi/nf-wdfwmi-wdf_wmi_buffer_append_string.
My query call is working fine. The strings have the read attribute set in the .mof like so:
I can set my description in my driver and read it in PowerShell with this command just fine:
The problem I'm facing now is that I can't write to ANY members of my class. For example I have another member defined in the .mof as:
If I don't add
Description
to my class I can read/writescratch
from PowerShell just fine. If I addDescription
to my class I can readscratch
fine, but I can no longer write a newscratch
value. It results in the error I have shown in my previous post.From my understanding, if your WMI class contains a read-only item, then you will have to set a single item everytime, when modifying a field, instead of setting the entire instance.
Please setup a EvtWmiInstanceSetItem function and try again.
I have other read only items in the class that are of type uint32 and I am still able to set the entire instance. It's only since I added the
string
members that things fell apart. I suppose I can try that though.Any idea how to set a single item from PowerShell? No matter what I do it seems to call the
EvtWmiInstanceSetInstance
callback.You might want to share some code that is related to your issue, otherwise it is going to be like your last post in March asking about the same issue.
It is a problem with your code (obviously). We can't do anything without knowing even the most basics parts of your wmi config structure setup.
https://community.osr.com/discussion/291918/use-powershell-to-call-wmi-evtwmiinstancesetitem
Here's the .mof
Here's the header:
Here's the registration:
If I remove the
Description
property, the following PowerShell works:As stated previously, as soon as I add the
Description
property any attempt to update the instance fails. I have tried changingproviderConfig.MinInstanceBufferSize
and that doesn't change the observed behavior.I still haven't figured out how to use PowerShell such that it calls my
EvtWmiInstanceSetItem
callback.Have you tried playing with the Toaster and WMI? It has read/write members with descriptions. If you get the same problems there you'll at least know it's not you.
https://github.com/microsoft/Windows-driver-samples/tree/master/general/toaster/toastDrv/kmdf/func/featured
-scott
OSR