Click here to Skip to main content
15,868,141 members
Articles / Desktop Programming / MFC
Article

Communication between GUI Application and Device Driver

Rate me:
Please Sign up or sign in to vote.
4.83/5 (29 votes)
26 Mar 20022 min read 276.8K   5.7K   121   56
An article on Communication between GUI Application and Device Driver

Image 1

Background

Recently I read a good article in which the author wrote a device driver and a GUI program, and he wanted to notify the GUI App when some event happened in the device driver. In his article, when a new process was created, a callback function in his driver would be called and it would notify the GUI App and display some information about the new process immediately. In the device driver, the author create a named event and opened it in GUI App. Then when an event happened, he handled it like this:

KeSetEvent(Event, 0, FALSE);
KeClearEvent(Event);

At this time, the GUI App was waiting for the event. Between the interval of the two functions, the App must got information of the new process. It works, but I don't think it's a good solution.

Why does the author code like this? Because, if we create an event in kernel mode, we can't modify its state in user mode, we only can check its state. But normally, we want the GUI App to modify the event to to non signaled, and it can wait the event again. I think this is the eligible IPC model to deal with this question.

About my solution

Kernel mode has higher priority than user mode. In kernel mode we can modify data in user mode conveniently. So I create an event object in user mode, and refer it in kernel mode. Now both device driver and GUI App can check and modify the state of the event object.

How to integrate it into your application

In your App, you must open the device object firstly, then code like this:

  1. Create an event object and down it into driver.
    HANDLE m_hCommEvent = CreateEvent(NULL, false, false, NULL);
    //download event object to device driver, m_hCommDevice is the device object
    DeviceIoControl(m_hCommDevice,
                    IO_REFERENCE_EVENT,
                    (LPVOID) m_hCommEvent, 
                     0,
                     NULL,
                     0,
                     &dwReturn,
                     NULL);
  2. Wait the event object to be signaled.
    while(true)
    {
    	WaitForSingleObject(m_hCommEvent, INFINITE);
    	//After this function, the event is set to non signaled. 
    	//Get information and deal with it.
    }     

In the device driver the code like this:

  1. In the IRP_MJ_DEVICE_CONTROL major routine:
    case IO_REFERENCE_EVENT:
    hEvent = (HANDLE) irpStack->Parameters.DeviceIoControl.Type3InputBuffer;
    status = ObReferenceObjectByHandle(
                  hEvent,
                  GENERIC_ALL,
                  NULL,
                  KernelMode,
                  &gpEventObject,
                  &objHandleInfo);

    the gpEventObject is a PRKEVENT object, so we can use KeEventXXX and KeWaitForXXX to operate it.

  2. When the object event happened
    KeSetEvent(gpEventObject, 0, FALSE);
  3. When we don't need it, we should dereference it:
    case IO_DEREFERENCE_EVENT:
    	if(gpEventObject)
                  ObDereferenceObject(gpEventObject); 

I have tested my solution in a personal firewall product. It works well. When my IP Filter Driver got an IP packet, it checks the IP header as my security rules. If the packet will be intercepted, it reports to my GUI App.

The sample download include two projects: a GUI app and a device driver. The GUI App is a dialog based MFC application. It has a log window which can register the operations on event object. The device driver is only a very simple kernel mode device driver. It can operate the event object as the GUI App requries. I you want to run this demo, you must install and start the driver firstly.

Because there are so many tools can install and start device deriver, so I don't include the code to do this work.

If you have any problems and advices, Please notify me.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 5 Pin
CHRISTINE GREEN29-Mar-12 3:26
CHRISTINE GREEN29-Mar-12 3:26 
QuestionPersonnal Firewall Pin
tigzy3-Jul-11 19:56
tigzy3-Jul-11 19:56 
GeneralCommunication between Driver an Application Pin
dereck78_zg10-Dec-08 5:01
dereck78_zg10-Dec-08 5:01 
Questionhow to install driver Pin
romon13-May-07 1:27
romon13-May-07 1:27 
AnswerRe: how to install driver Pin
Maruf Maniruzzaman9-Jul-07 2:26
Maruf Maniruzzaman9-Jul-07 2:26 
Questionhow to build Pin
dhirendra_19803-Nov-05 18:35
dhirendra_19803-Nov-05 18:35 
GeneralUNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS Pin
ekzot6-Sep-05 4:53
ekzot6-Sep-05 4:53 
GeneralUsing DeviceIoControl Pin
Anonymous13-Jul-05 13:26
Anonymous13-Jul-05 13:26 
GeneralRe: Using DeviceIoControl Pin
gamitech25-Aug-05 5:24
gamitech25-Aug-05 5:24 
GeneralDriver installation Pin
cbt382-Mar-05 1:13
cbt382-Mar-05 1:13 
GeneralRe: Driver installation Pin
BoostedR36MK36-Sep-12 8:03
BoostedR36MK36-Sep-12 8:03 
QuestionHow about using WMI? Pin
User 21559719-Oct-04 19:30
User 21559719-Oct-04 19:30 
Generaluser mode to control device driver Pin
Horsy20-Sep-04 11:19
Horsy20-Sep-04 11:19 
I am trying to create a user mode application to talk to the devices from other vender.

What is the easiest way to find out the GUID interface for a PnP device? I tried the regedt32 but couldn't find it.

Also, I connect several of this outside vender's devices to several virtual COM port (COM3, COM5, COM7, etc). How do I talk to those devices separately (mainly stop the device so I can safely unplug it)?

Thank you for your advice.

QuestionIs there .inf for the driver? Pin
Gordon Smith27-Aug-04 0:43
Gordon Smith27-Aug-04 0:43 
GeneralHelp Required Pin
Muhammad Kamran Shakir23-Aug-04 20:41
Muhammad Kamran Shakir23-Aug-04 20:41 
GeneralIf u don't answers question don't start articles Chris must be aware to on this Pin
Member 38131314-Jun-04 0:51
Member 38131314-Jun-04 0:51 
GeneralRe: If u don't answers question don't start articles Chris must be aware to on this Pin
Tamas Karoly13-Dec-04 22:00
Tamas Karoly13-Dec-04 22:00 
QuestionCan anybody help me Pin
firstxx30-Apr-04 1:11
firstxx30-Apr-04 1:11 
General Comm. between usermode Application and Device Driver Pin
SETI5127-Mar-04 7:36
SETI5127-Mar-04 7:36 
Generaldynamic loading of dlls in kernel mode Pin
Anonymous1-Dec-03 22:19
Anonymous1-Dec-03 22:19 
GeneralRe: dynamic loading of dlls in kernel mode Pin
Ketil Jensen23-May-05 21:28
Ketil Jensen23-May-05 21:28 
GeneralI create Event in driver Pin
xenic9-Nov-03 20:44
xenic9-Nov-03 20:44 
QuestionIsn't it really slow? Pin
Tamas Karoly19-Aug-03 3:30
Tamas Karoly19-Aug-03 3:30 
AnswerRe: Isn't it really slow? Pin
DavidR_r7-Jul-04 9:04
DavidR_r7-Jul-04 9:04 
GeneralRe: Isn't it really slow? Pin
Tamas Karoly7-Jul-04 9:33
Tamas Karoly7-Jul-04 9:33 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.