luorui110120
驱动牛犊
驱动牛犊
  • 注册日期2012-02-20
  • 最后登录2012-02-29
  • 粉丝3
  • 关注3
  • 积分3分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1499回复:1

camera upper filter driver

楼主#
更多 发布于:2012-02-23 11:49
想挂上usbvideo来截获stream,现可以获得数据,但是数据貌似不对。
获得数据是在完成例程里完成的!
这个是在deviceiocontrol里判断IOCTL_KS_READ_STREAM
 
代码:
  }else if (IOCTL_KS_READ_STREAM  ==  _lngCode)
    {
      status = IoAcquireRemoveLock (&deviceExtension->RemoveLock, Irp);
      if (!NT_SUCCESS (status)) {
        Irp->IoStatus.Status = status;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        return status;
      }
      IoCopyCurrentIrpStackLocationToNext(Irp);
      IoSetCompletionRoutine(
        Irp,
        FilterFidoDeviceIoCompletionRoutineReadStream,
        deviceExtension,
        TRUE,
        TRUE,
        TRUE
        );
 
      status = IoCallDriver(deviceExtension->NextLowerDriver, Irp);
      Irp->IoStatus.Status  =  status;
      IoReleaseRemoveLock(&deviceExtension->RemoveLock  ,Irp);
      return status;
完成例程的代码是这样的:
 
代码:
NTSTATUS
FilterFidoDeviceIoCompletionRoutineReadStream(
       IN PDEVICE_OBJECT  DeviceObject,
       IN PIRP  Irp,
       IN PVOID  Context
       )
{
  PDEVICE_EXTENSION             event;
  PVOID  _LpMdlAddress;
  PIO_STACK_LOCATION    _IrpStack;
  ULONG    _lngLength;
  ULONG    _trueLength;
  ULONG    _lngOutLength;
  ULONG    _i;
  PKSSTREAM_HEADER  _Stream_Header=NULL;
  _IrpStack  =  IoGetCurrentIrpStackLocation(Irp);
  event  =  (PDEVICE_EXTENSION)Context;
  _lngLength  =_IrpStack->Parameters.DeviceIoControl.InputBufferLength;
  _trueLength  =Irp->IoStatus.Information;
  _lngOutLength  =  _IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
 
  if (NULL  !=  Irp->AssociatedIrp.SystemBuffer)
  {
    //DbgPrint("SystemBuffer Many!!!\n");
    //for (_i  =  0;  _i  <_trueLength  ;++_i)
    //{
    //  if (_i  %  10  ==  0)
    //  {
    //  ((UCHAR*)Irp->AssociatedIrp.SystemBuffer)[_i]  =  0;
    //  }
    //}
  //  _asm
  //  {
 
  //    int 3
  //  }
  }
 
  if (NULL  !=  Irp->UserBuffer)
  {
    //DbgPrint("UserBuffer Many!!!\n");
 
  //  _try
  //  {
    //  ProbeForRead(Irp->UserBuffer  ,_trueLength  ,4);
    //  _Stream_Header  =  (PKSSTREAM_HEADER)Irp->UserBuffer;
    //  DbgPrint("%d  ,%p  ",_Stream_Header->Size  ,_Stream_Header->Data);
      //for (_i  =  0;  _i  <_trueLength  ;++_i)
    //  {
        //if (_i  %  10  ==  0)
        //{
      //  ((UCHAR*)Irp->UserBuffer)[_i]  =  0;
        //}
    //  }  
  //  }
  //  _except(EXCEPTION_EXECUTE_HANDLER)
  //  {
  //    DbgPrint("UserBuffer is Error!!!\n");
  //  }
  }
  if (NULL  !=  Irp->MdlAddress)
  {
    _LpMdlAddress  =  MmGetSystemAddressForMdlSafe(Irp->MdlAddress  ,NormalPagePriority);
    DbgPrint("Length of:%d\n"  ,_trueLength);
    if (NULL  !=  _LpMdlAddress  &&  _trueLength  !=  0)
    {
      _Stream_Header  =  (PKSSTREAM_HEADER)_LpMdlAddress;
      DbgPrint("%d  ,%p  ",_Stream_Header->Size  ,_Stream_Header->Data);
      //DBG_Dump((UCHAR*)_LpMdlAddress  ,10);
      //DbgPrint("Modify!!!!\n");
      //for (_i  =  0;  _i  <_trueLength  ;++_i)
      //{
        //if (_i  %  10  ==  0)
        //{
        //  ((UCHAR*)_LpMdlAddress)[_i]  =  0;
        //}
      //}
    }
  }else
  {
    DbgPrint("Other Buffer!!!");
  }
 
  if (Irp->PendingReturned  ==TRUE)
  {
    IoMarkIrpPending(Irp);
  }
    return STATUS_CONTINUE_COMPLETION;
}
在网络上的资料里看到MdlBuffer里的结构就是KSSTREAM_HEADER
但是调试发现我获得的是错误的KSSTREAM_HEADER
不知道哪位大牛是否知道这个KSSTREAM_HEADER结构到底在哪里?或者怎样去获得?
谢谢!!!
zzq191
驱动中牛
驱动中牛
  • 注册日期2001-08-09
  • 最后登录2018-05-29
  • 粉丝17
  • 关注0
  • 积分1041分
  • 威望716点
  • 贡献值0点
  • 好评度318点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2012-03-27 16:13
好像你获取数据的buffer不对吧,你看看其他地方的数据
QQ:416331891,承接windows下应用和驱动的开发,雅虎通:zzq191, Email:zzq191@21cn.com
游客

返回顶部