Using Process related API calls in VB.NET

I’m working on an app that will monitor the number of GDI Objects of another process (in this case, the spooler)

To do this in VB.NET requires an API call to GetGuiResources. While testing, I was using Process.GetProcesses to get a list of all the available processes, passed the handle of each process to the API function, and writing the result to a textbox.

Problem was, all process that I did not own throw security errors, even when I set the app to run with elevated privs. The internet once again failed me, and I stumbled across the solution while browsing the system.diagnostics.process documentation on MSDN.

The solution is to call Process.EnterDebugMode() before getting your process list and calling the API, then calling Process.LeaveDebugMode() when you are done.

MSDN EnterDebugMode Documentation

Here is an example. remember to run with elevate privs, and create a multiline textbox called txtOut.

[sourcecode language=”vbnet” wraplines=”false”]Public Class Form1
Declare Function GetGuiResources Lib "user32" (ByVal hProcess As Long, ByVal uiFlags As Long) As Long
‘ uiFlags: 0 – Count of GDI objects
‘ uiFlags: 1 – Count of USER objects

Private Sub btnGo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGo.Click
Dim procList As Process()

Dim TYPE_GDI As UInteger = 0

Process.EnterDebugMode()
procList = Process.GetProcesses

For Each proc As Process In procList
Dim objCnt As Long
Try
objCnt = GetGuiResources(proc.Handle, TYPE_GDI)
Catch ex As Exception
objCnt = -1
End Try

txOut.AppendText(proc.ProcessName & vbTab & "GDI: " & objCnt.ToString & vbNewLine)
Next proc

Process.LeaveDebugMode()

End Sub
End Class
[/sourcecode]

Leave a Comment

Your email address will not be published. Required fields are marked *