这里建的工程是MFC的smart device,选择ARMV4I的指令集,不一样的设备可能会有轻微的不一样,不过大致实现是同样滴。还有,这里选的应用类型是dialog base。函数
1.应用监测内核动向post
内核经过postmessage广播给全部的窗口,好比发送的数据是“hello ce”,即PostMessage(HWND_BROADCAST, RegisterWindowMessage(L"hello ce"), 0, 0);而后就是应用部分监测消息,先在对话框类里面声明一个消息处理PreTranslateMessage,手动添加或者在vs的资源视图的dialog里面添加消息也是能够的,我这里用手动添加,另外一种好像找不着这个消息。而后在PreTranslateMessage这个函数里面添加一个判断if(pMsg->message == ::RegisterWindowMessage(L"hello ce"))blog
{内存
应用处理内容资源
} postmessage
2.应用和内核流式驱动的双向通讯变量
首先,假设流式驱动若是注册的名字为LED,index是0。(数值零不是字母O)扩展
而后,应用和驱动中共同分别都要定义一个宏,名为IOCTL_WRITE_LED,即#define IOCTL_WRITE_LED 10086 。im
接着就是几个关键的函数,CreateFile和DeviceIoControl。先用HANDLE hread = CreateFile(L"LED0:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 通信
FILE_ATTRIBUTE_NORMAL, NULL);建立一个句柄hread定义 BYTE bTemp[128]用来存放数据,而后DeviceIoControl(hread, IOCTL_WRITE_LED, NULL, 0, bTemp, 128, 0, (LPOVERLAPPED) NULL);就可以把数据写入到bTemp里面,这样就能读取驱动中的数据。一样,要写数据进驱动,DeviceIoControl(hread, IOCTL_READ_LED, (char *)(LPCTSTR)c_str, sizeof(c_str), NULL, 0, 0, (LPOVERLAPPED) NULL);IOCTL_READ_LED这个宏自行定义,这里面的格式转换花费了我一点时间,如今就能完成应用层主动读取和写数据进内核了。
3.扩展
若是应用要读写内核的全部数据,能够经过读写一个流式驱动,而后这个流式驱动用共享内存或者全局变量的方式传值。可能还有更好的办法,目前我就只能用这种比较挫的方式。
界面比较简单,加几个按钮,控制led开关。