亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? testdispatch.c

?? usb2.0開發與工程應用
?? C
?? 第 1 頁 / 共 2 頁
字號:
                              irpStack->Parameters.DeviceIoControl.OutputBufferLength;
   ULONG                      packetSize = 0;
   PUSBD_INTERFACE_INFORMATION interfaceInfo = NULL;
   PUSBD_PIPE_INFORMATION     pipeInfo = NULL;
   USBD_PIPE_HANDLE           pipeHandle = NULL;
   PISO_STREAM_OBJECT         streamObject;
   ULONG                      i;

   interfaceInfo = pdx->Interface;

   if (!interfaceInfo)
   {
      return STATUS_UNSUCCESSFUL;
   }
   
   if (isoControl->PipeNum > interfaceInfo->NumberOfPipes)
   {
      return STATUS_INVALID_PARAMETER;
   }

   pipeInfo = &(interfaceInfo->Pipes[isoControl->PipeNum]);

   if (!(pipeInfo->PipeType == UsbdPipeTypeIsochronous))
   {
      return STATUS_INVALID_PARAMETER;
   }

   pipeHandle = pipeInfo->PipeHandle;

   if (!pipeHandle)
   {
      return STATUS_UNSUCCESSFUL;
   }

   if (isoControl->PacketCount % (isoControl->FramesPerBuffer * isoControl->BufferCount))
   {
      return STATUS_INVALID_PARAMETER;
   }

   packetSize = isoControl->PacketSize;

   if (bufferLength < (isoControl->PacketCount * (packetSize + sizeof(USBD_ISO_PACKET_DESCRIPTOR))))
   {
      return STATUS_UNSUCCESSFUL;
   }

   streamObject = ExAllocatePool(NonPagedPool, sizeof(ISO_STREAM_OBJECT));

   if (!streamObject)
   {
      return STATUS_NO_MEMORY;
   }

   streamObject->FramesPerBuffer = isoControl->FramesPerBuffer;

   streamObject->BufferCount = isoControl->BufferCount;

   streamObject->DeviceObject = fdo;
   streamObject->PipeInfo = pipeInfo;
   streamObject->PacketSize = packetSize;
   streamObject->NumPackets = isoControl->PacketCount;
   streamObject->TransferBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
   streamObject->TransferBufferLength = streamObject->PacketSize * streamObject->NumPackets;
   streamObject->IsoDescriptorBuffer = (PUCHAR) streamObject->TransferBuffer + streamObject->TransferBufferLength;
   
   streamObject->TransferObject = ExAllocatePool(NonPagedPool,
                            sizeof(ISO_TRANSFER_OBJECT) * streamObject->BufferCount);

   if (!streamObject->TransferObject)
   {
      return STATUS_NO_MEMORY;
   }

   for (i=0; i < streamObject->BufferCount; i++)
   {
      InitTransferObject(streamObject,i);
   }

   for (i=0; i < streamObject->BufferCount; i++)
   {
      IoCallDriver(pdx->LowerDeviceObject,
                  streamObject->TransferObject[i].Irp);
   }

   for (i=0; i < streamObject->BufferCount; i++)
   {
      KeWaitForSingleObject(
                    &streamObject->TransferObject[i].Done,
                    Suspended,
                    KernelMode,
                    FALSE,
                    NULL);
   }

   ExFreePool(streamObject->TransferObject);
   ExFreePool(streamObject);

   return STATUS_SUCCESS;
}
//
NTSTATUS InitTransferObject(IN OUT PISO_STREAM_OBJECT streamObject,IN ULONG index)
{
   PISO_TRANSFER_OBJECT transferObject = &streamObject->TransferObject[index];
   PUSBD_PIPE_INFORMATION pipeInfo = streamObject->PipeInfo;
   USHORT urbSize = 0;
   CCHAR stackSize;
   PIO_STACK_LOCATION nextStack = NULL;
   PURB urb = NULL;
   PIRP irp = NULL;
   PDEVICE_EXTENSION pdx =
      (PDEVICE_EXTENSION) streamObject->DeviceObject->DeviceExtension;
   ULONG i;

   urbSize = GET_ISO_URB_SIZE(streamObject->FramesPerBuffer);

   urb = ExAllocatePool(NonPagedPool, urbSize);
   RtlZeroMemory(urb,urbSize);

   urb->UrbHeader.Length = urbSize;
   urb->UrbHeader.Function = URB_FUNCTION_ISOCH_TRANSFER;
   urb->UrbIsochronousTransfer.PipeHandle = pipeInfo->PipeHandle;
   urb->UrbIsochronousTransfer.TransferFlags =
      USB_ENDPOINT_DIRECTION_IN(pipeInfo->EndpointAddress) ? USBD_TRANSFER_DIRECTION_IN : 0;
   urb->UrbIsochronousTransfer.TransferFlags |=
      USBD_START_ISO_TRANSFER_ASAP;
   urb->UrbIsochronousTransfer.TransferFlags |=
      USBD_SHORT_TRANSFER_OK;
   urb->UrbIsochronousTransfer.TransferBufferLength =
      streamObject->PacketSize * streamObject->FramesPerBuffer;
   urb->UrbIsochronousTransfer.TransferBuffer =
      ((PUCHAR) streamObject->TransferBuffer) +  (index * streamObject->PacketSize * streamObject->FramesPerBuffer);

   urb->UrbIsochronousTransfer.NumberOfPackets = streamObject->FramesPerBuffer;

   for (i=0; i<streamObject->FramesPerBuffer; i++)
   {
      urb->UrbIsochronousTransfer.IsoPacket[i].Offset = i * streamObject->PacketSize;
      urb->UrbIsochronousTransfer.IsoPacket[i].Length = streamObject->PacketSize;
   }

   stackSize = (CCHAR) (pdx->LowerDeviceObject->StackSize + 1);

   irp = IoAllocateIrp(stackSize, FALSE);
   IoInitializeIrp(irp, irp->Size, stackSize);

   nextStack = IoGetNextIrpStackLocation(irp);

   nextStack->Parameters.Others.Argument1 = urb;
   nextStack->Parameters.DeviceIoControl.IoControlCode = 
      IOCTL_INTERNAL_USB_SUBMIT_URB;                    
   nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;

   IoSetCompletionRoutine(irp,
                          IsoTransferComplete,
                          transferObject,
                          TRUE,
                          TRUE,
                          TRUE);

   transferObject->Frame = index * streamObject->FramesPerBuffer;
   transferObject->Urb = urb;
   transferObject->Irp = irp;
   transferObject->StreamObject = streamObject;
   KeInitializeEvent(&transferObject->Done, NotificationEvent, FALSE);

   return STATUS_SUCCESS;
}
//
NTSTATUS IsoTransferComplete(IN PDEVICE_OBJECT bunkfdo,IN PIRP Irp,IN PVOID Context)
{
   NTSTATUS ntStatus,status;
   PISO_TRANSFER_OBJECT transferObject = (PISO_TRANSFER_OBJECT) Context;
   PISO_STREAM_OBJECT streamObject = transferObject->StreamObject;
   PDEVICE_OBJECT fdo = streamObject->DeviceObject;
   PDEVICE_EXTENSION          pdx = fdo->DeviceExtension;
   PIO_STACK_LOCATION nextStack;
   PURB urb = transferObject->Urb;
   USHORT urbSize = 0;
   ULONG i;

   RtlCopyMemory((PUCHAR) streamObject->IsoDescriptorBuffer + (transferObject->Frame * sizeof(USBD_ISO_PACKET_DESCRIPTOR)),
                 urb->UrbIsochronousTransfer.IsoPacket,
                 (streamObject->FramesPerBuffer * sizeof(USBD_ISO_PACKET_DESCRIPTOR)));

   transferObject->Frame += (streamObject->FramesPerBuffer * streamObject->BufferCount);

   if (transferObject->Frame < streamObject->NumPackets)
   {
      urbSize = GET_ISO_URB_SIZE(streamObject->FramesPerBuffer);
      RtlZeroMemory(urb,urbSize);

      urb->UrbHeader.Length = urbSize;
      urb->UrbHeader.Function = URB_FUNCTION_ISOCH_TRANSFER;
      urb->UrbIsochronousTransfer.PipeHandle = streamObject->PipeInfo->PipeHandle;
      urb->UrbIsochronousTransfer.TransferFlags =
         USB_ENDPOINT_DIRECTION_IN(streamObject->PipeInfo->EndpointAddress) ? USBD_TRANSFER_DIRECTION_IN : 0;
      urb->UrbIsochronousTransfer.TransferFlags |=
         USBD_START_ISO_TRANSFER_ASAP;
      urb->UrbIsochronousTransfer.TransferFlags |=
         USBD_SHORT_TRANSFER_OK;
      urb->UrbIsochronousTransfer.TransferBufferLength =
         streamObject->PacketSize * streamObject->FramesPerBuffer;
      urb->UrbIsochronousTransfer.TransferBuffer =
         ((PUCHAR) streamObject->TransferBuffer) +  (transferObject->Frame * streamObject->PacketSize);
      urb->UrbIsochronousTransfer.NumberOfPackets = streamObject->FramesPerBuffer;

      for (i=0; i<streamObject->FramesPerBuffer; i++)
      {
         urb->UrbIsochronousTransfer.IsoPacket[i].Offset = i * streamObject->PacketSize;
         urb->UrbIsochronousTransfer.IsoPacket[i].Length = streamObject->PacketSize;
      }

      IoInitializeIrp(Irp,
                     IoSizeOfIrp((pdx->LowerDeviceObject->StackSize + 1)),
                     (CCHAR)(pdx->LowerDeviceObject->StackSize + 1));

      nextStack = IoGetNextIrpStackLocation(Irp);

      nextStack->Parameters.Others.Argument1 = transferObject->Urb;
      nextStack->Parameters.DeviceIoControl.IoControlCode = 
         IOCTL_INTERNAL_USB_SUBMIT_URB;                    
      nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;

      IoSetCompletionRoutine(Irp,
             IsoTransferComplete,
             transferObject,
             TRUE,
             TRUE,
             TRUE);

      status = IoCallDriver(pdx->LowerDeviceObject,Irp);
      ntStatus = STATUS_MORE_PROCESSING_REQUIRED;
   }
   else
   {

      IoFreeIrp(Irp);
      ExFreePool(urb);

      KeSetEvent(&transferObject->Done,1,FALSE);

      ntStatus = STATUS_MORE_PROCESSING_REQUIRED;
   }

   return ntStatus;
}
//
NTSTATUS UsbResetPipe(IN PDEVICE_OBJECT fdo,ULONG PipeNum)
{
   NTSTATUS ntStatus;
   PDEVICE_EXTENSION             pdx = fdo->DeviceExtension;
   PUSBD_INTERFACE_INFORMATION   interfaceInfo = NULL;
   USBD_PIPE_HANDLE              pipeHandle = NULL;
   PURB urb;
   USBD_VERSION_INFORMATION VersionInformation;

   interfaceInfo = pdx->Interface;

   if (!interfaceInfo)
   {
      return STATUS_UNSUCCESSFUL;
   }
   
   if (PipeNum > interfaceInfo->NumberOfPipes)
   {
      return STATUS_INVALID_PARAMETER;
   }

   pipeHandle = interfaceInfo->Pipes[PipeNum].PipeHandle;

   urb = ExAllocatePool(NonPagedPool,
                      sizeof(struct _URB_PIPE_REQUEST));

   if (urb)
   {
      urb->UrbHeader.Length = (USHORT) sizeof (struct _URB_PIPE_REQUEST);
      urb->UrbHeader.Function = URB_FUNCTION_RESET_PIPE;
      urb->UrbPipeRequest.PipeHandle = pipeHandle;

      USBD_GetUSBDIVersion(&VersionInformation);
      if (VersionInformation.USBDI_Version < 0x101) 
      {
         urb->UrbHeader.Length -= sizeof(ULONG);
      }

      ntStatus = UsbCallUSBDI(fdo, urb);

      ExFreePool(urb);
   }
   else
   {
      ntStatus = STATUS_INSUFFICIENT_RESOURCES;
   }

   return ntStatus;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费看欧美女人艹b| 欧美tickling挠脚心丨vk| 久久99久久精品| 亚洲成人免费视| 一区二区成人在线观看| 一区二区国产盗摄色噜噜| 亚洲精品国产一区二区精华液| 中文字幕不卡一区| 亚洲欧美综合另类在线卡通| 国产精品萝li| 伊人夜夜躁av伊人久久| 亚洲永久精品国产| 偷偷要91色婷婷| 老司机精品视频线观看86| 亚洲二区在线视频| 久久精品国产99国产| 国产精品123| 91亚洲精品一区二区乱码| 色综合天天性综合| 欧美一区二区网站| 久久久久久久久免费| 亚洲免费观看高清在线观看| 亚洲第一综合色| 久久99国内精品| jvid福利写真一区二区三区| 欧美三级视频在线| 久久丝袜美腿综合| 亚洲精品老司机| 经典三级视频一区| 国产精品一区二区久激情瑜伽 | 国产精品无人区| 久久这里只有精品首页| 久久久精品黄色| 91在线看国产| 久久99国产精品久久| 国产精品污www在线观看| 午夜精品在线看| 亚洲美女淫视频| 亚洲一区二区五区| 91黄色免费版| 亚洲自拍偷拍麻豆| 亚洲成在人线在线播放| 亚洲一卡二卡三卡四卡五卡| 亚洲精品亚洲人成人网在线播放| 中文在线免费一区三区高中清不卡| 精品久久久久久最新网址| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 北岛玲一区二区三区四区| 粗大黑人巨茎大战欧美成人| 成人高清视频免费观看| 色综合天天狠狠| 欧美三级一区二区| 精品福利二区三区| 中文字幕欧美激情一区| 色综合中文综合网| 婷婷国产v国产偷v亚洲高清| 亚洲婷婷综合久久一本伊一区| 26uuu成人网一区二区三区| 日韩美女主播在线视频一区二区三区| 韩国av一区二区三区| 亚洲午夜免费电影| 日韩电影在线一区二区三区| 成人免费不卡视频| 欧美日韩一区二区欧美激情| 欧美一级精品在线| 国产免费成人在线视频| 亚洲综合在线五月| 国产一区激情在线| 91原创在线视频| 欧美一区二区三区成人| 国产精品二三区| 蜜乳av一区二区三区| 成人激情电影免费在线观看| 欧美日韩国产精品自在自线| 久久久综合精品| 午夜精品福利一区二区三区蜜桃| 国产suv精品一区二区三区| 欧美中文字幕一区二区三区亚洲| 2024国产精品| 亚洲风情在线资源站| 成人国产精品免费观看视频| 日韩精品一区国产麻豆| 亚洲欧洲韩国日本视频| 国产盗摄一区二区| 欧美一区二区不卡视频| 亚洲另类在线视频| www.av亚洲| 国产午夜精品福利| 久久99国产精品久久99果冻传媒| 欧美日韩另类一区| 亚洲伦在线观看| 国产成人av自拍| 精品国精品自拍自在线| 日韩午夜电影av| 亚洲国产视频在线| 在线影院国内精品| 日韩一区二区三区三四区视频在线观看| 久久久无码精品亚洲日韩按摩| 性感美女极品91精品| 色婷婷av一区| 国产精品久久久久桃色tv| 波多野结衣在线一区| 国产香蕉久久精品综合网| 欧美aaaaaa午夜精品| 在线不卡一区二区| 亚洲成人av一区二区| 色妞www精品视频| 一区二区三区欧美在线观看| 91蜜桃免费观看视频| 亚洲人成网站精品片在线观看 | 九九九精品视频| 精品裸体舞一区二区三区| 久久久高清一区二区三区| 国产精品综合一区二区三区| 欧美一区二区三区四区视频 | 国产一区二区三区精品视频| 日韩欧美亚洲国产精品字幕久久久| 欧美96一区二区免费视频| 欧美一区二区三区视频在线观看| 蜜臀av性久久久久蜜臀av麻豆| 91精品国产乱码久久蜜臀| 久久精品国产第一区二区三区| 99久久国产综合精品麻豆| 欧美日韩国产系列| 亚洲一区成人在线| 91精品免费在线| 国产一区在线视频| 久久精品欧美日韩精品| 成人av免费网站| 亚洲精品视频免费看| 正在播放亚洲一区| 韩国v欧美v日本v亚洲v| 亚洲天堂av老司机| 在线成人午夜影院| 国产一区二区三区美女| 亚洲精品va在线观看| 成人美女在线观看| 国产精品久久夜| 久久久久久久久久久久久女国产乱| 高清视频一区二区| 午夜精品久久久久久久久久| 26uuu国产电影一区二区| 91小视频在线观看| 男女男精品视频网| 亚洲欧洲一区二区三区| 日韩亚洲欧美综合| 99精品视频中文字幕| 蜜臀av一区二区在线观看 | 精品日韩99亚洲| 色悠悠亚洲一区二区| 精品一二线国产| 亚洲午夜一二三区视频| 国产拍揄自揄精品视频麻豆| 在线播放欧美女士性生活| 国产成人亚洲综合a∨婷婷图片| 一区二区三区在线播| 久久久精品天堂| 欧美日高清视频| 国产91清纯白嫩初高中在线观看 | 最新不卡av在线| 欧美精品一区在线观看| 欧美视频一区二区三区| 99视频精品免费视频| 国产老妇另类xxxxx| 国产欧美一区二区精品性| 97精品视频在线观看自产线路二| 久久久亚洲国产美女国产盗摄| 欧美肥妇bbw| 91国产丝袜在线播放| 波多野结衣中文一区| 国产精品一区二区视频| 久久成人免费日本黄色| 午夜精品久久久久久| 亚洲午夜久久久久久久久电影院| 国产精品色眯眯| 久久精品视频一区二区三区| 精品欧美一区二区久久| 欧美一级生活片| 日本高清无吗v一区| 亚洲成人福利片| 亚洲日本在线天堂| 亚洲免费av高清| 伊人婷婷欧美激情| 一区二区高清视频在线观看| 亚洲精品成人精品456| 亚洲视频一区二区在线观看| 国产亚洲一区二区在线观看| 欧美精品一区视频| 成人av资源站| 成人国产精品免费网站| 91一区二区三区在线播放| 99re亚洲国产精品| 白白色亚洲国产精品| 91香蕉国产在线观看软件| 日本韩国一区二区三区| 日本大香伊一区二区三区| 欧美精品 国产精品| 成人高清在线视频| 国产二区国产一区在线观看| 成人aaaa免费全部观看|