action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
阅读:5439回复:15

如何使用IOCTL_KS_READ_STREAM

楼主#
更多 发布于:2008-03-20 18:19
在写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'
......
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-03-20 18:54
另外在截获IOCTL_KS_READ_STREAM设置完成例程后,在完成例程里要如何得到Buffer pointer,我使用 pHeader= (KSSTREAM_HEADER*)Irp->UserBuffer;直接导致电脑重启。用AssociatedIrp.SystemBuffer也是。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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搜一下。
Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-03-21 13:00
在完成例程里面
pData=(PUCHAR) MmGetSystemAddressForMdlSafe(Irp->MdlAddress,NormalPagePriority);
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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摄像头将导致电脑重启!
Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-03-21 13:49
完成例程里面最后要 IoCompleteRequest (Irp, IO_NO_INCREMENT);
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-03-21 14:06
但是在完成例程里面最后加 IoCompleteRequest (Irp, IO_NO_INCREMENT);后电脑直接重启
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-03-21 14:15
status返回成功时,是程序启动视频,电脑重启。

完成例程增加:
    status = Irp->IoStatus.Status;
然后:
    IoCompleteRequest (Irp, IO_NO_INCREMENT);
    return status;    
插入视频设备后,设备管理器在视频设备标签上有个感叹号显示设备未安装好。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2008-03-21 14:32
不用完成有没有问题??如果没有,完成里什么都不做有没有问题??依此类推,加上SOFTICE的调试,应该很好解决.
可惜没玩过那么高级的东西,残念.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
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;

    }                              
                                      
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-03-21 15:54
多谢,我现在已经可以捕获修改ClassStream驱动的摄像头视频了,但是UVC的摄像头还是不行。只要一启动UVC摄像头,电脑就会重启,请问UVC摄像头是不是有另外的IOCTL?
另外我现在只是能在driver中修改视频数据,但是这样就不能使用很多C运行库跟win32 API,请问有什么方法可以在User Mode修改视频而不明显损失效率?
UserBuffer不是装的输出虚拟地址吗,在这里是否只能供Proxy使用?其他用户进程能够如何直接修改视频数据吗?
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-03-21 15:55
另外在Vista下情况是否又会有所不同?
Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-03-21 16:23
sorry, 上面的代码没有 IoCompleteRequest (Irp, IO_NO_INCREMENT); 才对
适用于uvc的
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-03-21 16:50
没有 IoCompleteRequest (Irp, IO_NO_INCREMENT); 才对适用于uvc的?这个语句应该是表示完成IRP吧?
去掉以后普通摄像头黑色视频,UVC还是直接重启电脑。
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-03-21 17:11
另外通过IOCTL_KS_PROPERTY如何得到媒体格式?
fqjp
驱动牛犊
驱动牛犊
  • 注册日期2002-05-16
  • 最后登录2011-04-25
  • 粉丝1
  • 关注1
  • 积分19分
  • 威望73点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2011-04-25 11:10
顶楼编译的问题原因是在ks.h之前要include windef.h
游客

返回顶部