阅读:5439回复:15
如何使用IOCTL_KS_READ_STREAM
在写filter driver时碰到这个问题,在外国网站也看到这个问题,没人回答,贴在这里问问大家
http://www.techtalkz.com/microsoft-device-drivers/287524-problem-ioctl_ks_read_stream.html problem with IOCTL_KS_READ_STREAM Hi All, In my project i want use define IOCTL_KS_READ_STREAM so i include ks.h, but when i build project then it have alot of error following: I have not know why, anybody can help me how to use IOCTL_KS_READ_STREAM, Thanks very much. David, C:\WINDDK\3790~1.183>d: D:\>cd D:\WORKSPACE\DriverFilter\USBCameraFilter\usbcamer afilter D:\WORKSPACE\DriverFilter\USBCameraFilter\usbcamer afilter>build -zc BUILD: Adding /Y to COPYCMD so xcopy ops won't hang. BUILD: Using 2 child processes BUILD: Object root set to: ==> objfre_wxp_x86 BUILD: Compile and Link for i386 BUILD: Examining d:\workspace\driverfilter\usbcamerafilter\usbcamer afilter direc tory for files to compile. BUILD: Compiling (NoSync) d:\workspace\driverfilter\usbcamerafilter\usbcamer afil ter directory 1>Compiling - usbcamerafilter.c for i386 1>errors in directory d:\workspace\driverfilter\usbcamerafilter\usbcamer afilter 1>c:\winddk\3790.1830\inc\wxp\ks.h(50) : error C2054: expected '(' to follow 'EX TERN_C' 1>c:\winddk\3790.1830\inc\wxp\ks.h(50) : error C2085: 'CDECL' : not in formal pa rameter list 1>c:\winddk\3790.1830\inc\wxp\ks.h(50) : error C2146: syntax error : missing ',' before identifier 'GUID' 1>c:\winddk\3790.1830\inc\wxp\ks.h(50) : error C2146: syntax error : missing ',' before identifier 'GUID_NULL' ...... |
|
沙发#
发布于:2008-03-20 18:54
另外在截获IOCTL_KS_READ_STREAM设置完成例程后,在完成例程里要如何得到Buffer pointer,我使用 pHeader= (KSSTREAM_HEADER*)Irp->UserBuffer;直接导致电脑重启。用AssociatedIrp.SystemBuffer也是。
|
|
板凳#
发布于:2008-03-20 21:45
编译的问题建议还是自己解决,国外的论坛对提问要求很严格的,你的问题我想最可能得到的回答就是:Do your homework。
#define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS) 这个IOCTL是METHOD_NEITHER的方式,所以数据应该在UserBuffer里面,这个内存是应用层的地址,只在该进程上下文中有效,所以完成例程里面是不能直接操作的。如何操作这个地址,建议你用google搜一下。 |
|
地板#
发布于:2008-03-21 13:00
在完成例程里面
pData=(PUCHAR) MmGetSystemAddressForMdlSafe(Irp->MdlAddress,NormalPagePriority); |
|
地下室#
发布于:2008-03-21 13:42
通过pData=(PUCHAR) MmGetSystemAddressForMdlSafe(Irp->MdlAddress,NormalPagePriority);是可以取得数据并修改,只是不用UserBuffer吗?
我在捕获IOCTL_KS_READ_STREAM后设置完成例程,然后调用IoCallDriver返回。当用程序打开普通摄像头时窗口是黑的,没有图象。一段时间后显示stopping capture (device lost). select new capture device。完成例程里只是得到pData后修改几个象素的值。如果去处完成例程的动作返回成功,窗口也是黑的。用UVC摄像头将导致电脑重启! |
|
5楼#
发布于:2008-03-21 13:49
完成例程里面最后要 IoCompleteRequest (Irp, IO_NO_INCREMENT);
|
|
6楼#
发布于:2008-03-21 14:06
但是在完成例程里面最后加 IoCompleteRequest (Irp, IO_NO_INCREMENT);后电脑直接重启
|
|
7楼#
发布于:2008-03-21 14:15
status返回成功时,是程序启动视频,电脑重启。
完成例程增加: status = Irp->IoStatus.Status; 然后: IoCompleteRequest (Irp, IO_NO_INCREMENT); return status; 插入视频设备后,设备管理器在视频设备标签上有个感叹号显示设备未安装好。 |
|
8楼#
发布于:2008-03-21 14:32
不用完成有没有问题??如果没有,完成里什么都不做有没有问题??依此类推,加上SOFTICE的调试,应该很好解决.
可惜没玩过那么高级的东西,残念. |
|
|
9楼#
发布于:2008-03-21 14:42
IoMarkIrpPending(Irp);
IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) IrpReadStreamComplete, deviceExtension, TRUE, TRUE, TRUE); status = IoCallDriver(deviceExtension->NextLowerDriver, Irp); //------------------------------------------------------------------------------------- NTSTATUS IrpReadStreamComplete (PDEVICE_OBJECT DeviceObject, PIRP Irp, IN PVOID Context) { PDEVICE_EXTENSION deviceExtension; if (Irp->PendingReturned) { IoMarkIrpPending(Irp); } //add your code here .......................... //===================== IoCompleteRequest (Irp, IO_NO_INCREMENT); return STATUS_MORE_PROCESSING_REQUIRED; } |
|
10楼#
发布于:2008-03-21 15:54
多谢,我现在已经可以捕获修改ClassStream驱动的摄像头视频了,但是UVC的摄像头还是不行。只要一启动UVC摄像头,电脑就会重启,请问UVC摄像头是不是有另外的IOCTL?
另外我现在只是能在driver中修改视频数据,但是这样就不能使用很多C运行库跟win32 API,请问有什么方法可以在User Mode修改视频而不明显损失效率? UserBuffer不是装的输出虚拟地址吗,在这里是否只能供Proxy使用?其他用户进程能够如何直接修改视频数据吗? |
|
11楼#
发布于:2008-03-21 15:55
另外在Vista下情况是否又会有所不同?
|
|
12楼#
发布于:2008-03-21 16:23
sorry, 上面的代码没有 IoCompleteRequest (Irp, IO_NO_INCREMENT); 才对
适用于uvc的 |
|
13楼#
发布于:2008-03-21 16:50
没有 IoCompleteRequest (Irp, IO_NO_INCREMENT); 才对适用于uvc的?这个语句应该是表示完成IRP吧?
去掉以后普通摄像头黑色视频,UVC还是直接重启电脑。 |
|
14楼#
发布于:2008-03-21 17:11
另外通过IOCTL_KS_PROPERTY如何得到媒体格式?
|
|
15楼#
发布于:2011-04-25 11:10
顶楼编译的问题原因是在ks.h之前要include windef.h
|
|