-
February 24th, 2012, 07:01 AM
#1
VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
Hi Guys,
I'm writing a Windows Forms application in VB.Net 2010. The application's purpose is to recreate the Device Manager in VB.Net. The idea here is to capture the information provided by Device Manager and store it in a database. In turn this information could be used as a configuration management tool.
My device tree is coming along nicely, with one minor exception. There are hidden devices that Device Manager does not display by default. Show Hidden Devices causes Device Manager to display these devices. My Device Manager displays them by default. I want to duplicate the Device Manager behavior of being able to hide and display these devices in my appilcation. I have had some success with this task in that I am able to hide the Plug and Play devices that are marked as hidden by windows by use of the "Don't Display In DM" flag. There is the small issue of the Non Plug and Play Device Class. My question is this... Is there a similar flag for Non Plug and Play devices? I have found a reference to the PNP_DEVICE_STATE and IRP_MN_QUERY_PNP_DEVICE_STATE IRP. It contains a flag
PNP_DEVICE_DONT_DISPLAY_IN_UI. My problem is that I cannot find any guidance as to the structure of this API declare and the coding needed to use it. I'm not even sure if this API will be helpful in accomplishing my task. I want to hide the Non Plug and Play devices and device class in my tree. Can someone please assist me with the locating an API that will accomplish this and the proper coding of the API in VB?
I am using Visual Studio 2010 Ultimate and Running Windows 7 Ultimate with all Service Packs and updates applied.
-
February 26th, 2012, 03:34 PM
#2
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
It would help to know exactly how you're querying the device information, as there are a few ways to do this. Post your code if you're comfortable.
Like you said, you can look for the "LegacyDriver" device class to determine if the device is non-PnP. Assuming you are using the Driver api's or WMI, you should be able to use the same method you're already using to determine if the "Don't Display In DM" flag is set for a non-PnP driver/device.
While a non-PnP device driver can definitely register with the PnP manager, I'm not sure if it can specify the "Don't Display In DM" field. My assumption is that it can, but I can't find any literature one way or the other.
For those following, when I say "Don't Display In DM", I'm talking about one of the following fields:
1) PNP_DEVICE_DONT_DISPLAY_IN_UI of PNP_DEVICE_STATE
2) NoDisplayInUI of DEVICE_CAPABILITIES
3) DN_NO_SHOW_IN_DM in cfg.h
Last edited by Craig Gemmill; February 27th, 2012 at 09:30 AM.
Good Luck,
Craig - CRG IT Solutions - Microsoft Gold Partner
-My posts after 08/2015 = .NET 4.x and Visual Studio 2015
-My posts after 11/2011 = .NET 4.x and Visual Studio 2012
-My posts after 02/2010 = .NET 4.0 and Visual Studio 2010
-My posts after 12/2007 = .NET 3.5 and Visual Studio 2008
-My posts after 04/2007 = .NET 3.0 and Visual Studio 2005
-My posts before 04/2007 = .NET 1.1/2.0
*I do not follow all threads, so if you have a secondary question, message me.
-
February 26th, 2012, 06:33 PM
#3
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
I am using Win32 API calls to get the information about the device classes and devices. Querying the device capabilities only seems to work for the PNP devices. The Non PNP devices are a different story.
This is the API call that gets the information for a given device:
Friend Sub New(ByVal hInfoSet As IntPtr, ByVal instanceInfo As DevInfoData)
Me.ptrDeviceInfoSet = hInfoSet
Me.devInfoData = instanceInfo
Me.lstProperties = New Dictionary(Of DevicePropertyID, Object)()
If NativeMethods.CM_Get_DevNode_Status(Me.difFlags, Me.dipProblem, Me.devInfoData.InstanceID, 0) = ConfigResult.Success Then
If (Me.difFlags And DeviceInstanceFlags.HAS_PROBLEM) = 0 Then
Me.dipProblem = DeviceInstanceProblem.NO_PROBLEM
End If
Else
Me.difFlags = DeviceInstanceFlags.HAS_PROBLEM
Me.dipProblem = DeviceInstanceProblem.NO_PROBLEM
End If
End Sub
This is the Visible property I created to determine if a given device is hidden or visible:
Public ReadOnly Property Visible() As Boolean
Get
If (Me.difFlags And DeviceInstanceFlags.NO_SHOW_IN_DM) = DeviceInstanceFlags.NO_SHOW_IN_DM Then
Me.blnVisible = False
Else
Me.blnVisible = True
End If
Return Me.blnVisible
End Get
End Property
Here's the code used to get the Device Classes and display them in the Treeview:
Public Sub Display(ByRef tvwTreeView As TreeView)
Dim tvwRootNode As New TreeNode
Dim tvwDeviceClassNode As New TreeNode
tvwTreeView.BeginUpdate()
tvwTreeView.Nodes.Clear()
tvwRootNode = New TreeNode
With tvwRootNode
.Name = "[Root}"
.Text = Environment.MachineName
End With
tvwTreeView.Nodes.Add(tvwRootNode)
For Each curDeviceClass As DeviceClass In DeviceClasses
If curDeviceClass.Present Then
For Each curDevice As Device In curDeviceClass.Devices
If curDevice.Visible Then
tvwDeviceClassNode = New TreeNode
With tvwDeviceClassNode
.ImageKey = curDeviceClass.Description
.SelectedImageKey = curDeviceClass.Description
.Text = curDeviceClass.Description
.Name = "[DeviceClass][" & curDeviceClass.Description & "]"
.Tag = "[DeviceClass][" & curDeviceClass.Description & "]"
End With
tvwRootNode.Nodes.Add(tvwDeviceClassNode)
Exit For
End If
Next
curDeviceClass.Devices.Display(curDeviceClass, tvwDeviceClassNode)
End If
Next
tvwTreeView.Sort()
tvwRootNode.Expand()
tvwTreeView.EndUpdate()
End Sub
Here's the code to display the devices for a given device class:
Public Sub Display(ByRef curDeviceClass As DeviceClass, ByRef tvwDeviceClassNode As TreeNode)
Dim tvwDeviceNode As New TreeNode
For Each curDevice As Device In curDeviceClass.Devices
If curDevice.Visible Then
tvwDeviceNode = New TreeNode
With tvwDeviceNode
.ImageKey = curDeviceClass.Description
.SelectedImageKey = curDeviceClass.Description
.Text = curDevice.FriendlyName
.Name = "[Device][" & curDevice.FriendlyName & "]"
.Tag = curDevice.FriendlyName
End With
tvwDeviceClassNode.Nodes.Add(tvwDeviceNode)
End If
Next
End Sub
Let me know if you need to see more of the code. I'd rather not post the whole project here on the site but I realize that you might need to see the whole project in working order to assist me.
-
February 27th, 2012, 09:34 AM
#4
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
What happens (contrarily) when you call CM_Get_DevNode_Status on a non-pnp device?
Good Luck,
Craig - CRG IT Solutions - Microsoft Gold Partner
-My posts after 08/2015 = .NET 4.x and Visual Studio 2015
-My posts after 11/2011 = .NET 4.x and Visual Studio 2012
-My posts after 02/2010 = .NET 4.0 and Visual Studio 2010
-My posts after 12/2007 = .NET 3.5 and Visual Studio 2008
-My posts after 04/2007 = .NET 3.0 and Visual Studio 2005
-My posts before 04/2007 = .NET 1.1/2.0
*I do not follow all threads, so if you have a secondary question, message me.
-
February 27th, 2012, 09:52 AM
#5
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
Nothing happens... All Non PNP Devices as well as the Non PNP Class are still visible in my device tree. Only the PNP devices seem to be affected. If you goto Device Manager and click Show hidden devices under the view menu you'll see an new device class appear in the device tree, Non Plug and Play Devices. Under that node you'll see a bunch, and I do mean a bunch, of Non PNP devices. If you goto your Network Adapters node you'll probably see several new devices as well. You may also see another device class, Storage Volumes and it's related devices. At least this is what I see on my machice. My existing API call successfully detects that those devices have been marked as hidden and does not add them to my device tree. The Non PNP Class and it's devices are left unaffected. Hence the reason for my question. Device Manager hides this device class and it's devices somehow and I'm trying to duplicate this in my application.
-
February 27th, 2012, 12:45 PM
#6
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
Ok, so you don't have a problem with non-pnp devices, you just don't have the NO_SHOW_IN_DM flag available...
Like I mentioned before, just hide devices with the "LegacyDriver" flag on. Using the pnp config manager apis, you would just check for the following flag:
DN_LEGACY_DRIVER &H1000
If the device has this flag set, then you would exclude it from your list. You would check it exactly the same way you check for the NO_SHOW_IN_DM flag.
Good Luck,
Craig - CRG IT Solutions - Microsoft Gold Partner
-My posts after 08/2015 = .NET 4.x and Visual Studio 2015
-My posts after 11/2011 = .NET 4.x and Visual Studio 2012
-My posts after 02/2010 = .NET 4.0 and Visual Studio 2010
-My posts after 12/2007 = .NET 3.5 and Visual Studio 2008
-My posts after 04/2007 = .NET 3.0 and Visual Studio 2005
-My posts before 04/2007 = .NET 1.1/2.0
*I do not follow all threads, so if you have a secondary question, message me.
-
March 16th, 2012, 12:25 AM
#7
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
Thanks for the help. Sorry for the late reply, but I only now became aware of your reply. I didn't get notified of your reply. Your reply to my post came up in a internet search for information on another issue. It seems that my enum list is incomplete so I'll have to locate the full list and incorporate it into my project. I do appreciate your help. I'll let you know how things go after I have things updated and add this check into my code. Thanks again
-
March 16th, 2012, 11:27 PM
#8
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
I've been looking at some of the flag settings online and it seems that DN_LEGACY_DRIVER &H1000 is now called MOVED is this right? Here's my enum if this helps at all.
Public Enum DeviceInstanceFlags As Integer
ROOT_ENUMERATED = &H1
DRIVER_LOADED = &H2
ENUM_LOADED = &H4
STARTED = &H8
MANUAL = &H10
NEED_TO_ENUM = &H20
NOT_FIRST_TIME = &H40
HARDWARE_ENUM = &H80
LIAR = &H100
HAS_MARK = &H200
HAS_PROBLEM = &H400
FILTERED = &H800
MOVED = &H1000
DISABLEABLE = &H2000
REMOVABLE = &H4000
PRIVATE_PROBLEM = &H8000
MF_PARENT = &H10000
MF_CHILD = &H20000
WILL_BE_REMOVED = &H40000
NOT_FIRST_TIMEE = &H80000
STOP_FREE_RES = &H100000
REBAL_CANDIDATE = &H200000
BAD_PARTIAL = &H400000
NT_ENUMERATOR = &H800000
NT_DRIVER = &H1000000
NEEDS_LOCKING = &H2000000
ARM_WAKEUP = &H4000000
APM_ENUMERATOR = &H8000000
APM_DRIVER = &H10000000
SILENT_INSTALL = &H20000000
NO_SHOW_IN_DM = &H40000000
End Enum
-
March 20th, 2014, 01:25 AM
#9
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
hi, VSCurtis
i have the same requirement.did u solve that problem...? but i am doing it in c#
-
March 22nd, 2014, 03:28 PM
#10
Re: VB.Net 2010 API To Hide Non Plug and Play Devices In Device Manager
Three things :
1) Welcome to the Forums
2) This thread is 2 years old
3) This is the VB.NET Forum, not C#
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|