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

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

?? libusb_driver.c

?? Libusb-win32 is a library that allows userspace application to access USB devices on Windows opera
?? C
字號:
/* LIBUSB-WIN32, Generic Windows USB Library * Copyright (c) 2002-2005 Stephan Meyer <ste_meyer@web.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#define __LIBUSB_DRIVER_C__#include "libusb_driver.h"extern int debug_level;static void DDKAPI unload(DRIVER_OBJECT *driver_object);static NTSTATUS DDKAPI on_usbd_complete(DEVICE_OBJECT *device_object,                                         IRP *irp,                                         void *context);NTSTATUS DDKAPI DriverEntry(DRIVER_OBJECT *driver_object,                            UNICODE_STRING *registry_path){  int i;  DEBUG_MESSAGE("DriverEntry(): loading driver");  /* initialize global variables */  debug_level = LIBUSB_DEBUG_MSG;  /* initialize the driver object's dispatch table */  for(i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)     {      driver_object->MajorFunction[i] = dispatch;    }    driver_object->DriverExtension->AddDevice = add_device;  driver_object->DriverUnload = unload;  return STATUS_SUCCESS;}NTSTATUS DDKAPI add_device(DRIVER_OBJECT *driver_object,                            DEVICE_OBJECT *physical_device_object){  NTSTATUS status;  DEVICE_OBJECT *device_object = NULL;  libusb_device_t *dev;  ULONG device_type;  UNICODE_STRING nt_device_name;  UNICODE_STRING symbolic_link_name;  WCHAR tmp_name_0[128];  WCHAR tmp_name_1[128];  char id[256];  int i;  /* get the hardware ID from the registry */  if(!reg_get_hardware_id(physical_device_object, id, sizeof(id)))    {      DEBUG_ERROR("add_device(): unable to read registry");      return STATUS_SUCCESS;    }  /* only attach the (filter) driver to USB devices, skip hubs */  /* and interfaces of composite devices */  if(!strstr(id, "usb\\") || strstr(id, "hub") || strstr(id, "&mi_"))    {      return STATUS_SUCCESS;    }  /* retrieve the type of the lower device object */  device_object = IoGetAttachedDeviceReference(physical_device_object);  if(device_object)    {      device_type = device_object->DeviceType;      ObDereferenceObject(device_object);    }  else    {      device_type = FILE_DEVICE_UNKNOWN;    }  /* try to create a new device object */  for(i = 1; i < LIBUSB_MAX_NUMBER_OF_DEVICES; i++)    {      /* initialize some unicode strings */      _snwprintf(tmp_name_0, sizeof(tmp_name_0)/sizeof(WCHAR), L"%s%04d",                  LIBUSB_NT_DEVICE_NAME, i);      _snwprintf(tmp_name_1, sizeof(tmp_name_1)/sizeof(WCHAR), L"%s%04d",                  LIBUSB_SYMBOLIC_LINK_NAME, i);      RtlInitUnicodeString(&nt_device_name, tmp_name_0);        RtlInitUnicodeString(&symbolic_link_name, tmp_name_1);      /* create the object */      status = IoCreateDevice(driver_object,                               sizeof(libusb_device_t),                               &nt_device_name, device_type, 0, FALSE,                               &device_object);      if(NT_SUCCESS(status))        {          DEBUG_MESSAGE("add_device(): device #%d created", i);          break;        }      device_object = NULL;      /* continue until an unused device name is found */    }  if(!device_object)    {      DEBUG_ERROR("add_device(): creating device failed");      return status;    }        status = IoCreateSymbolicLink(&symbolic_link_name, &nt_device_name);    if(!NT_SUCCESS(status))    {      DEBUG_ERROR("add_device(): creating symbolic link failed");      IoDeleteDevice(device_object);      return status;    }  /* setup the "device object" */  dev = device_object->DeviceExtension;  memset(dev, 0, sizeof(libusb_device_t));  /* attach the newly created device object to the stack */  dev->next_stack_device =     IoAttachDeviceToDeviceStack(device_object, physical_device_object);  if(!dev->next_stack_device)    {      DEBUG_ERROR("add_device(): attaching to device stack failed");      IoDeleteSymbolicLink(&symbolic_link_name);      IoDeleteDevice(device_object);      return STATUS_NO_SUCH_DEVICE;    }  dev->self = device_object;  dev->physical_device_object = physical_device_object;  dev->id = i;  /* set initial power states */  dev->power_state.DeviceState = PowerDeviceD0;  dev->power_state.SystemState = PowerSystemWorking;  /* get device properties from the registry */  reg_get_properties(dev);  if(dev->is_filter)    {      /* send all USB requests to the PDO in filter driver mode */      dev->target_device = dev->physical_device_object;      /* use the same flags as the underlying object */      device_object->Flags |= dev->next_stack_device->Flags         & (DO_BUFFERED_IO | DO_DIRECT_IO | DO_POWER_PAGABLE);    }  else    {      /* send all USB requests to the lower object in device driver mode */      dev->target_device = dev->next_stack_device;      device_object->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;    }  clear_pipe_info(dev);  remove_lock_initialize(dev);  device_object->Flags &= ~DO_DEVICE_INITIALIZING;  return status;}VOID DDKAPI unload(DRIVER_OBJECT *driver_object){  DEBUG_MESSAGE("unload(): unloading driver");}NTSTATUS complete_irp(IRP *irp, NTSTATUS status, ULONG info){  irp->IoStatus.Status = status;  irp->IoStatus.Information = info;  IoCompleteRequest(irp, IO_NO_INCREMENT);    return status;}NTSTATUS call_usbd(libusb_device_t *dev, void *urb, ULONG control_code,                     int timeout){  KEVENT event;  NTSTATUS status;  IRP *irp;  IO_STACK_LOCATION *next_irp_stack;  LARGE_INTEGER _timeout;  IO_STATUS_BLOCK io_status;  if(timeout > LIBUSB_MAX_CONTROL_TRANSFER_TIMEOUT)    {      timeout = LIBUSB_MAX_CONTROL_TRANSFER_TIMEOUT;    }  KeInitializeEvent(&event, NotificationEvent, FALSE);  irp = IoBuildDeviceIoControlRequest(control_code, dev->target_device,                                      NULL, 0, NULL, 0, TRUE,                                      NULL, &io_status);  if(!irp)    {      return STATUS_NO_MEMORY;    }  next_irp_stack = IoGetNextIrpStackLocation(irp);  next_irp_stack->Parameters.Others.Argument1 = urb;  next_irp_stack->Parameters.Others.Argument2 = NULL;  IoSetCompletionRoutine(irp, on_usbd_complete, &event, TRUE, TRUE, TRUE);   status = IoCallDriver(dev->target_device, irp);      if(status == STATUS_PENDING)    {      _timeout.QuadPart = -(timeout * 10000);            if(KeWaitForSingleObject(&event, Executive, KernelMode,                               FALSE, &_timeout) == STATUS_TIMEOUT)        {          DEBUG_ERROR("call_usbd(): request timed out");          IoCancelIrp(irp);        }    }  /* wait until completion routine is called */  KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);  status = irp->IoStatus.Status;    /* complete the request */  IoCompleteRequest(irp, IO_NO_INCREMENT);  return status;}static NTSTATUS DDKAPI on_usbd_complete(DEVICE_OBJECT *device_object,                                         IRP *irp, void *context){  KeSetEvent((KEVENT *) context, IO_NO_INCREMENT, FALSE);  return STATUS_MORE_PROCESSING_REQUIRED;}NTSTATUS pass_irp_down(libusb_device_t *dev, IRP *irp,                        PIO_COMPLETION_ROUTINE completion_routine,                        void *context){  if(completion_routine)    {      IoCopyCurrentIrpStackLocationToNext(irp);      IoSetCompletionRoutine(irp, completion_routine, context,                             TRUE, TRUE, TRUE);    }  else    {      IoSkipCurrentIrpStackLocation(irp);    }  return IoCallDriver(dev->next_stack_device, irp);}bool_t accept_irp(libusb_device_t *dev, IRP *irp){  /* check if the IRP is sent to libusb's device object or to */  /* the lower one. This check is neccassary since the device object */  /* might be a filter */  if(irp->Tail.Overlay.OriginalFileObject)    {     return irp->Tail.Overlay.OriginalFileObject->DeviceObject         == dev->self ? TRUE : FALSE;    }  return FALSE;}bool_t get_pipe_handle(libusb_device_t *dev, int endpoint_address,                        USBD_PIPE_HANDLE *pipe_handle){  int i, j;  *pipe_handle = NULL;  for(i = 0; i < LIBUSB_MAX_NUMBER_OF_INTERFACES; i++)    {      if(dev->config.interfaces[i].valid)        {          for(j = 0; j < LIBUSB_MAX_NUMBER_OF_ENDPOINTS; j++)            {              if(dev->config.interfaces[i].endpoints[j].address                  == endpoint_address)                {                  *pipe_handle = dev->config.interfaces[i].endpoints[j].handle;                                    return !*pipe_handle ? FALSE : TRUE;                }            }        }    }  return FALSE;}void clear_pipe_info(libusb_device_t *dev){  memset(dev->config.interfaces, 0 , sizeof(dev->config.interfaces));}bool_t update_pipe_info(libusb_device_t *dev,                        USBD_INTERFACE_INFORMATION *interface_info){  int i;  int number;  if(!interface_info)    {      return FALSE;    }  number = interface_info->InterfaceNumber;  if(interface_info->InterfaceNumber >= LIBUSB_MAX_NUMBER_OF_INTERFACES)    {      return FALSE;    }  DEBUG_MESSAGE("update_pipe_info(): interface %d", number);  dev->config.interfaces[number].valid = TRUE;  for(i = 0; i < LIBUSB_MAX_NUMBER_OF_ENDPOINTS; i++)    {      dev->config.interfaces[number].endpoints[i].address = 0;      dev->config.interfaces[number].endpoints[i].handle = NULL;    }   if(interface_info)    {      for(i = 0; i < (int)interface_info->NumberOfPipes            && i < LIBUSB_MAX_NUMBER_OF_ENDPOINTS; i++)         {          DEBUG_MESSAGE("update_pipe_info(): endpoint address 0x%02x",                        interface_info->Pipes[i].EndpointAddress);	            dev->config.interfaces[number].endpoints[i].handle            = interface_info->Pipes[i].PipeHandle;	          dev->config.interfaces[number].endpoints[i].address =             interface_info->Pipes[i].EndpointAddress;        }    }  return TRUE;}void remove_lock_initialize(libusb_device_t *dev){  KeInitializeEvent(&dev->remove_lock.event, NotificationEvent, FALSE);  dev->remove_lock.usage_count = 1;  dev->remove_lock.remove_pending = FALSE;}NTSTATUS remove_lock_acquire(libusb_device_t *dev){  InterlockedIncrement(&dev->remove_lock.usage_count);  if(dev->remove_lock.remove_pending)    {      if(InterlockedDecrement(&dev->remove_lock.usage_count) == 0)        {          KeSetEvent(&dev->remove_lock.event, 0, FALSE);        }            return STATUS_DELETE_PENDING;    }  return STATUS_SUCCESS;}void remove_lock_release(libusb_device_t *dev){  if(InterlockedDecrement(&dev->remove_lock.usage_count) == 0)    {      KeSetEvent(&dev->remove_lock.event, 0, FALSE);    }}void remove_lock_release_and_wait(libusb_device_t *dev){  dev->remove_lock.remove_pending = TRUE;  remove_lock_release(dev);  remove_lock_release(dev);  KeWaitForSingleObject(&dev->remove_lock.event, Executive, KernelMode,                        FALSE, NULL);}USB_INTERFACE_DESCRIPTOR *find_interface_desc(USB_CONFIGURATION_DESCRIPTOR *config_desc,                    unsigned int size, int interface_number, int altsetting){  usb_descriptor_header_t *desc = (usb_descriptor_header_t *)config_desc;  char *p = (char *)desc;  USB_INTERFACE_DESCRIPTOR *if_desc = NULL;  if(!config_desc || (size < config_desc->wTotalLength))    return NULL;  while(size && desc->length <= size)    {      if(desc->type == USB_INTERFACE_DESCRIPTOR_TYPE)        {          if_desc = (USB_INTERFACE_DESCRIPTOR *)desc;          if((if_desc->bInterfaceNumber == (UCHAR)interface_number)             && (if_desc->bAlternateSetting == (UCHAR)altsetting))          {            return if_desc;          }        }      size -= desc->length;      p += desc->length;      desc = (usb_descriptor_header_t *)p;    }  return NULL;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看亚洲精品视频| 日韩久久久精品| 91精品国产手机| 国产精品久久久久一区二区三区 | 在线观看日韩电影| 久久亚洲精精品中文字幕早川悠里 | 成人av电影在线网| 欧美一区二区在线观看| 亚洲精品美腿丝袜| 床上的激情91.| 精品国产麻豆免费人成网站| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲综合丁香婷婷六月香| 国产真实乱偷精品视频免| 欧美久久婷婷综合色| 亚洲欧美综合色| 国产高清精品在线| 精品国产免费久久 | 亚洲色欲色欲www在线观看| 国产成人午夜99999| 精品欧美一区二区在线观看| 五月天欧美精品| 欧美亚洲国产一区在线观看网站 | 欧美变态凌虐bdsm| 五月开心婷婷久久| 欧美伦理影视网| 亚洲电影激情视频网站| 在线观看免费视频综合| 亚洲美女免费在线| 在线观看区一区二| 亚洲图片欧美色图| 欧美日韩国产综合草草| 亚洲一区二区在线播放相泽| 欧美最新大片在线看| 亚洲免费av观看| 欧洲一区在线电影| 亚洲成人av在线电影| 91.xcao| 久久超碰97中文字幕| www国产精品av| 国产精品一区二区视频| 亚洲国产精品传媒在线观看| 成人精品视频一区二区三区尤物| 国产精品青草久久| 在线影院国内精品| 日韩av中文在线观看| 欧美一级在线观看| 国产伦精品一区二区三区免费迷| 国产偷v国产偷v亚洲高清| 99久久伊人精品| 亚洲成人av中文| 精品国产乱码久久久久久1区2区| 韩国v欧美v日本v亚洲v| 国产精品区一区二区三| 欧美性大战久久久| 麻豆91精品91久久久的内涵| 久久久亚洲精品石原莉奈 | 在线中文字幕不卡| 蜜臀av性久久久久av蜜臀妖精| 精品国产免费视频| 色天使色偷偷av一区二区| 日韩激情一二三区| 日本一区二区三区电影| 欧美在线啊v一区| 国产制服丝袜一区| 亚洲国产日韩一级| 国产亚洲一区字幕| 欧美久久一区二区| 91在线国产观看| 麻豆国产欧美日韩综合精品二区| 中文字幕欧美日韩一区| 欧美片网站yy| 97精品电影院| 国内精品视频666| 亚洲综合在线电影| 久久久久国产免费免费 | 亚洲综合男人的天堂| 久久久国产午夜精品 | 日韩精品专区在线影院重磅| 成人国产精品免费网站| 免费观看30秒视频久久| 亚洲视频免费观看| 久久久久久久性| 欧美一区二区三区影视| 91视频www| 国产成人免费在线| 日韩精品免费专区| 亚洲国产人成综合网站| 中文字幕在线不卡| 国产亚洲欧美日韩日本| 欧美电视剧在线观看完整版| 欧洲一区二区av| 色综合中文字幕| 不卡的电影网站| 国产精品亚洲а∨天堂免在线| 免费成人美女在线观看| 亚洲电影在线免费观看| 最新高清无码专区| 国产精品久久看| 国产婷婷一区二区| 久久综合色之久久综合| 日韩欧美国产综合一区 | 日本伊人精品一区二区三区观看方式| 自拍偷拍亚洲综合| 国产精品素人一区二区| 久久久亚洲午夜电影| 欧美精品一区男女天堂| 日韩女优制服丝袜电影| 91精品国产91热久久久做人人| 在线看日韩精品电影| 日本道在线观看一区二区| 91丝袜美腿高跟国产极品老师| eeuss鲁片一区二区三区| 成人免费看黄yyy456| 99久久99久久久精品齐齐| jizz一区二区| 91豆麻精品91久久久久久| 欧洲国内综合视频| 欧美日韩激情一区二区三区| 欧美猛男gaygay网站| 8x福利精品第一导航| 91麻豆精品国产91久久久久久| 欧美高清你懂得| 精品卡一卡二卡三卡四在线| 精品91自产拍在线观看一区| 久久九九影视网| 中文字幕在线免费不卡| 一区二区三区国产精华| 日韩国产成人精品| 久久99精品一区二区三区三区| 精品亚洲porn| 成人激情av网| 欧美无乱码久久久免费午夜一区 | 一区二区在线电影| 亚洲线精品一区二区三区 | 国产精品中文字幕日韩精品| 国产精品一级在线| 91网上在线视频| 欧美丰满美乳xxx高潮www| 精品久久一区二区| 亚洲色欲色欲www| 免费在线一区观看| 成人爽a毛片一区二区免费| 一本一道久久a久久精品| 欧美高清视频在线高清观看mv色露露十八| 欧美成人性福生活免费看| 久久久精品综合| 一区二区在线电影| 黄页网站大全一区二区| 色网综合在线观看| 欧美不卡123| 一区二区三区视频在线看| 麻豆91精品91久久久的内涵| jiyouzz国产精品久久| 欧美一区二区精品| 亚洲欧美日韩人成在线播放| 日韩成人免费在线| 91麻豆国产福利在线观看| 日韩午夜av一区| 亚洲男同性视频| 国产一二三精品| 欧美视频日韩视频| 国产精品精品国产色婷婷| 日韩高清在线电影| 91小视频在线免费看| 2020国产精品自拍| 天天色图综合网| 99久久精品久久久久久清纯| 日韩一区二区影院| 亚洲一区二区在线免费观看视频| 国产黄色精品视频| 日韩视频免费观看高清完整版在线观看 | 精品一区二区精品| 欧美午夜精品久久久久久超碰| 久久美女艺术照精彩视频福利播放 | 午夜视频一区在线观看| 成人av在线播放网址| 欧美成人vps| 日韩精品免费专区| 91久久国产综合久久| 欧美韩国日本一区| 激情深爱一区二区| 欧美一区二区国产| 亚洲高清免费视频| 色噜噜狠狠成人中文综合| 中文字幕高清不卡| 国产成人午夜高潮毛片| 精品国产自在久精品国产| 天天综合网 天天综合色| 欧美性生活久久| 亚洲最新视频在线观看| 色综合视频一区二区三区高清| 国产精品丝袜一区| 成人免费福利片| 国产亚洲精品超碰| 国产91精品一区二区麻豆亚洲| 精品嫩草影院久久| 黑人巨大精品欧美一区| 日韩精品一区二区三区中文精品| 日本aⅴ亚洲精品中文乱码|