如何通过应用程序动态的设置改变串口过滤程序中要过滤的串口号的符号连接?
有这样一段串口监视过滤驱动程序的代码如下:
RtlInitUnicodeString(&usDeviceToFilter, L"\\??\\COM1");
NtStatus = IoGetDeviceObjectPointer(
IN &usDeviceToFilter,
IN FILE_ALL_ACCESS,
OUT &pTargetFileObject,
OUT &pTargetDeviceObject
);
if( !NT_SUCCESS(NtStatus) )
{
DbgPrint(("ComSpy.SYS:: Couldn't Get the Device Object\n"));
pTargetFileObject = NULL;
pTargetDeviceObject = NULL;
return( NtStatus );
}
DbgPrint("IoGetDeviceObjectPointer ok!\n");
//////////////////////////////////////////////////////////////////////////
NtStatus = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL,
pTargetDeviceObject->DeviceType,
pTargetDeviceObject->Characteristics,
FALSE, &pDeviceObject);
问题是这样的我现在已能通过动态加载过滤驱动监视“串口1”中的数据。同时改变
RtlInitUnicodeString(&usDeviceToFilter, L"\\??\\COM1");这句中的COM2,COM3,再编译就可以监视串口2,3等。
我现在想得到这样的结果,怎么实现通过应用程序中设置要监视的串口后,再动态加载驱动后,驱动程序就能自动监视相应的串口,也就是能动态的改变RtlInitUnicodeString(&usDeviceToFilter, L"\\??\\COM1");这句中的com号,怎么将参数传进来!
驱动程序初始化时创建一个设备及符号连接,应用程序通过DeviceIoControl与驱动程序通讯,告知要监视哪个串口。建议在初始化时直接挂上所有串口,定义一个全局数组来表示要监视哪些,在IRP_MJ_DEVICE_CONTROL例程中只需要改变对应的数组元素即可。
楼上,能否告知如何“在初始化时直接挂上所有串口”。刚接触驱动开发,多指教。
1.问题同楼上.
2.如全挂上后,如何区分数据来至哪个串
3.通知要监视的串口后要如何改变才能监视此口.
1挂载一个设备你会了 挂载8个不就是循环下吗?
2来自那个就更简单了 假设我是b 下层是c【n】 上层是a【n】 那么没有我以前就是a1-c1 a2-c2……
有了我以后就变为a1-b-c1 a2-b-c2
所以获得数据的时候还是串口的原始设备对象处获得啊 根据这个就可以标定串口了
3你都监视了 你上层设置监视这个的时候 你显示内容就可以了 选择不监视的时候 你不显示这些内容照常监视不就可以了。
我想思路大概如下:
1 驱动加载的时候挂载所有已经存在的串口
2 串口改变的时候 挂载新生成的串口
3 串口撤销的时候 卸载已经存在的mount
4 将所有的监视内容放在几个队列中 形成队列与串口号相关
5 接受上层deviceio显示指定的队列的内容
你的问题很简单的!请参考寒江独钓的《Windows内核安全编程》第三章,串口的过滤。本章详细的说明了你的问题,并带有源代码和说明!!网上也可以看的!
PDEVICE_OBJECT ccpOpenCom(ULONG id,NTSTATUS *status)//id为串口号
{
UNICODE_STRING name_str;
static WCHAR name[32] = { 0 };
PFILE_OBJECT fileobj = NULL;
PDEVICE_OBJECT devobj = NULL;
// 输入字符串。
memset(name,0,sizeof(WCHAR)*32);
RtlStringCchPrintfW(
name,32,
L"\\Device\\Serial%d",id);//确定设备名称
RtlInitUnicodeString(&name_str,name);
// 打开设备对象
*status = IoGetDeviceObjectPointer(&name_str, FILE_ALL_ACCESS, &fileobj, &devobj);//在知道设备名字的情况下,使用函数,可以获得这个设备对象的指针。
if (*status == STATUS_SUCCESS)
ObDereferenceObject(fileobj);//对文件对象解除引用,以免引起内存泄露。
return devobj;
}
// 这个函数绑定所有的串口。
void ccpAttachAllComs(PDRIVER_OBJECT driver)
{
ULONG i;
PDEVICE_OBJECT com_ob;
NTSTATUS status;
for(i = 0;i
{
// 获得object引用。
com_ob = ccpOpenCom(i,&status);//查看一下绑定结果。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
if(com_ob == NULL)
continue;
// 在这里绑定。并不管绑定是否成功。
ccpAttachDevice(driver,com_ob,&s_fltobj,&s_nextobj);
// 取消object引用。
}
}