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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usbio.cpp

?? reference about wireless design which is helpful to everyone
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
/************************************************************************
 *
 *  Module:       UsbIo.cpp
 *  Long name:    CUsbIo class
 *  Description:  CUsbIo base device class implementation
 *
 *  Runtime Env.: Win32, Part of UsbioLib
 *  Author(s):    Guenter Hildebrandt, Udo Eberhardt
 *  Company:      Thesycon GmbH, Ilmenau
 ************************************************************************/

// for shorter and faster windows.h
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN 1
#endif
// unicode is not supported by USBIOLIB
#ifdef UNICODE
#undef UNICODE
#endif

#include <windows.h>
#include <stdio.h>
#include "usbio.h"


// static members
CSetupApiDll CUsbIo::smSetupApi;



// standard constructor
CUsbIo::CUsbIo()
{
  FileHandle = NULL;
  ZeroMemory(&Overlapped,sizeof(Overlapped));
  InitializeCriticalSection(&CritSect);
  CheckedBuildDetected = FALSE;
  DemoVersionDetected = FALSE;
  LightVersionDetected = FALSE;
  mDevDetail = NULL;
}


// destructor
CUsbIo::~CUsbIo()
{
  // close file handle
  Close();
  // free resources
  DeleteCriticalSection(&CritSect);

}


HDEVINFO 
CUsbIo::CreateDeviceList(const GUID *InterfaceGuid)
{
  HDEVINFO h;

  // make sure the setupapi dll is loaded
  if ( !smSetupApi.Load() ) {
    return NULL;
  }

  h = (smSetupApi.SetupDiGetClassDevs)(
        (GUID*)InterfaceGuid,                 // LPGUID ClassGuid, 
        NULL,                                 // PCTSTR Enumerator, 
        NULL,                                 // HWND hwndParent, 
        DIGCF_DEVICEINTERFACE | DIGCF_PRESENT // DWORD Flags
        );
  return ( (h==INVALID_HANDLE_VALUE) ? NULL : h );
}


void 
CUsbIo::DestroyDeviceList(HDEVINFO DeviceList)
{
  // make sure the setupapi dll is loaded
  if ( !smSetupApi.Load() ) {
    return;
  }

  if ( DeviceList!=NULL ) {
    (smSetupApi.SetupDiDestroyDeviceInfoList)(DeviceList);
  }
}



DWORD CUsbIo::Open(int DeviceNumber, HDEVINFO DeviceList, const GUID* InterfaceGuid)
{
  DWORD Status;
  HANDLE h;
  char NameBuffer[80];
  const char* Name;

  if ( FileHandle != NULL ) {
    // already open
    return USBIO_ERR_SUCCESS;
  } 
  
  if ( DeviceList == NULL ) {
    // use the old way, using a well-known device name
    // build device name
    sprintf(NameBuffer,"\\\\.\\" USBIO_DEVICE_NAME "%d",DeviceNumber);
    Name = NameBuffer;
  } else {
    // use the device interface identified by InterfaceGuid
    // a GUID must be provided in this case
		Status = GetDeviceInstanceDetails(DeviceNumber, DeviceList, InterfaceGuid);
    if ( Status != USBIO_ERR_SUCCESS ) {
			return Status;
		}
    // get name
    Name = GetDevicePathName();
  }

  // try to open the device driver
  h = ::CreateFile(
            Name,
            GENERIC_READ | GENERIC_WRITE,       // access mode
            FILE_SHARE_WRITE | FILE_SHARE_READ, // share mode
            NULL,                               // security desc.
            OPEN_EXISTING,                      // how to create
            FILE_FLAG_OVERLAPPED,               // file attributes
            NULL                                // template file
            );
  if ( h == INVALID_HANDLE_VALUE ) {
    Status = USBIO_ERR_DEVICE_NOT_FOUND;
  } else {
    // save handle
    FileHandle = h;
    // init the event with auto reset, not signaled
    Overlapped.hEvent = CreateEvent(NULL ,FALSE ,FALSE ,NULL); 
    if ( Overlapped.hEvent == NULL ) {
      Status = USBIO_ERR_NO_MEMORY;
      Close();
    } else {
      
      // now get version info
      USBIO_DRIVER_INFO info;
      Status = GetDriverInfo(&info);
      if ( Status != USBIO_ERR_SUCCESS ) {
        // failed
        Close();
      } else {

        CheckedBuildDetected = (info.Flags&USBIO_INFOFLAG_CHECKED_BUILD) ? TRUE : FALSE;
        DemoVersionDetected = (info.Flags&USBIO_INFOFLAG_DEMO_VERSION) ? TRUE : FALSE;
        LightVersionDetected = (info.Flags&USBIO_INFOFLAG_LIGHT_VERSION) ? TRUE : FALSE;

        // now check the API version
        // currently used version must match to the driver installed
        if ( info.APIVersion != USBIO_API_VERSION ) {
          // wrong version
          Status = USBIO_ERR_VERSION_MISMATCH;
          Close();
        } else {
          
          // success
          Status = USBIO_ERR_SUCCESS;
        }
      }
    }
  }
  return Status;
}



void CUsbIo::Close()
{
  if ( FileHandle != NULL ) {
    ::CloseHandle(FileHandle);
    FileHandle = NULL;
  }
  if ( Overlapped.hEvent != NULL ) {
    ::CloseHandle(Overlapped.hEvent);
    Overlapped.hEvent = NULL;
  }
  if ( mDevDetail != NULL ) {
    delete [] (char*)mDevDetail;
    mDevDetail = NULL;
  }
}


DWORD
CUsbIo::GetDeviceInstanceDetails(int DeviceNumber, HDEVINFO DeviceList, const GUID* InterfaceGuid)
{
	DWORD Status;
  BOOL succ;

  // check parameters
	if ( DeviceList==NULL || InterfaceGuid==NULL ) {
    return USBIO_ERR_INVALID_FUNCTION_PARAM;
	}

  // make sure the setupapi dll is loaded
  if ( !smSetupApi.Load() ) {
    return USBIO_ERR_LOAD_SETUP_API_FAILED;
  }

  // delete old detail data if any
  if ( mDevDetail!=NULL ) {
    delete [] (char*)mDevDetail;
    mDevDetail = NULL;
  }

  // enumerate the interface
  // get the device information for the given device number
  SP_DEVICE_INTERFACE_DATA DevData;
  ZeroMemory(&DevData,sizeof(DevData));
  DevData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
  succ = (smSetupApi.SetupDiEnumDeviceInterfaces)(DeviceList, NULL, (GUID*)InterfaceGuid, DeviceNumber, &DevData );
  if ( !succ ) {
    Status = GetLastError();
    if ( Status==ERROR_NO_MORE_ITEMS ) {
			Status = USBIO_ERR_NO_SUCH_DEVICE_INSTANCE;
		}
    return Status;
  }

  // get length of the detailed information, allocate buffer
  DWORD ReqLen = 0;
  (smSetupApi.SetupDiGetDeviceInterfaceDetail)(DeviceList, &DevData, NULL, 0, &ReqLen, NULL);
	if ( ReqLen==0 ) {
    return USBIO_ERR_FAILED;
	}
	mDevDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA*) new char[ReqLen];
  if ( mDevDetail==NULL ) {
    return USBIO_ERR_NO_MEMORY;
  }

  // now get the  detailed device information
  ZeroMemory(mDevDetail,ReqLen);
  mDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  succ = (smSetupApi.SetupDiGetDeviceInterfaceDetail)(DeviceList, &DevData, mDevDetail, ReqLen, &ReqLen, NULL);
  if ( !succ ) {
    Status = GetLastError();
    return Status;
  }

	// success, mDevDetail contains the device instance details now
	return USBIO_ERR_SUCCESS;
}


const char*
CUsbIo::GetDevicePathName()
{
  if ( mDevDetail!=NULL ) {
    return mDevDetail->DevicePath;
  } else {
    return NULL;
  }
}


DWORD CUsbIo::GetDriverInfo(USBIO_DRIVER_INFO *DriverInfo)
{
  DWORD Status;

  Status = IoctlSync(
              IOCTL_USBIO_GET_DRIVER_INFO,
              NULL,
              0,
              DriverInfo,
              sizeof(USBIO_DRIVER_INFO),
              NULL
              );

  return Status;
}



BOOL
CUsbIo::IsOperatingAtHighSpeed()
{
	USBIO_DEVICE_INFO info;
	ZeroMemory(&info,sizeof(info));

  DWORD Status = GetDeviceInfo(&info);
	if ( Status==USBIO_ERR_SUCCESS ) {
		return (info.Flags&USBIO_DEVICE_INFOFLAG_HIGH_SPEED) ? TRUE : FALSE;
	} else {
		// query failed
		return FALSE;
	}
}



DWORD CUsbIo::GetDeviceInfo(USBIO_DEVICE_INFO* DeviceInfo)
{
  return IoctlSync(
              IOCTL_USBIO_GET_DEVICE_INFO,
              NULL,
              0,
              DeviceInfo,
              sizeof(USBIO_DEVICE_INFO),
              NULL
              );
}


DWORD CUsbIo::GetBandwidthInfo(USBIO_BANDWIDTH_INFO* BandwidthInfo)
{
  return IoctlSync(
              IOCTL_USBIO_GET_BANDWIDTH_INFO,
              NULL,
              0,
              BandwidthInfo,
              sizeof(USBIO_BANDWIDTH_INFO),
              NULL
              );
}


DWORD CUsbIo::GetDescriptor(
        void* Buffer,
        DWORD& ByteCount,
        USBIO_REQUEST_RECIPIENT Recipient,
        UCHAR DescriptorType,
        UCHAR DescriptorIndex/*=0*/,
        USHORT LanguageId/*=0*/ 
        )
{
  DWORD Status;
  USBIO_DESCRIPTOR_REQUEST req;

  // zero the struct if any fields are added...
  ZeroMemory(&req,sizeof(req));
  req.Recipient = Recipient;
  req.DescriptorType = DescriptorType;
  req.DescriptorIndex = DescriptorIndex;
  req.LanguageId = LanguageId;
  
  Status = IoctlSync(
              IOCTL_USBIO_GET_DESCRIPTOR,
              &req,
              sizeof(req),
              Buffer,
              ByteCount,
              &ByteCount
              );

  return Status;
}



DWORD CUsbIo::SetDescriptor(
        const void* Buffer,
        DWORD& ByteCount,
        USBIO_REQUEST_RECIPIENT Recipient,
        UCHAR DescriptorType,
        UCHAR DescriptorIndex/*=0*/,
        USHORT LanguageId/*=0*/ 
        )
{
  DWORD Status;
  USBIO_DESCRIPTOR_REQUEST req;

  // zero the struct if any fields are added...
  ZeroMemory(&req,sizeof(req));
  req.Recipient = Recipient;
  req.DescriptorType = DescriptorType;
  req.DescriptorIndex = DescriptorIndex;
  req.LanguageId = LanguageId;
  
  Status = IoctlSync(
              IOCTL_USBIO_SET_DESCRIPTOR,
              &req,
              sizeof(req),
              (void*)Buffer,
              ByteCount,
              &ByteCount
              );

  return Status;
}



DWORD CUsbIo::SetFeature(
        USBIO_REQUEST_RECIPIENT Recipient,
        USHORT FeatureSelector,
        USHORT Index/*=0*/ 
        )
{
  DWORD Status;
  USBIO_FEATURE_REQUEST req;

  // zero the struct if any fields are added...
  ZeroMemory(&req,sizeof(req));
  req.Recipient = Recipient;
  req.FeatureSelector = FeatureSelector;
  req.Index = Index;
  
  Status = IoctlSync(
              IOCTL_USBIO_SET_FEATURE,
              &req,
              sizeof(req),
              NULL,
              0,
              NULL
              );

  return Status;
}



DWORD CUsbIo::ClearFeature(
        USBIO_REQUEST_RECIPIENT Recipient,
        USHORT FeatureSelector,
        USHORT Index/*=0*/ 
        )
{
  DWORD Status;
  USBIO_FEATURE_REQUEST req;

  // zero the struct if any fields are added...
  ZeroMemory(&req,sizeof(req));
  req.Recipient = Recipient;
  req.FeatureSelector = FeatureSelector;
  req.Index = Index;
  
  Status = IoctlSync(
              IOCTL_USBIO_CLEAR_FEATURE,
              &req,
              sizeof(req),
              NULL,
              0,
              NULL
              );

  return Status;
}



DWORD CUsbIo::GetStatus(
        USHORT& StatusValue,
        USBIO_REQUEST_RECIPIENT Recipient,
        USHORT Index/*=0*/ )
{
  DWORD Status;
  USBIO_STATUS_REQUEST req;
  USBIO_STATUS_REQUEST_DATA data;

  // zero the structs if any fields are added...
  ZeroMemory(&req,sizeof(req));
  ZeroMemory(&data,sizeof(data));
  req.Recipient = Recipient;
  req.Index = Index;
  
  Status = IoctlSync(
              IOCTL_USBIO_GET_STATUS,
              &req,
              sizeof(req),
              &data,
              sizeof(data),
              NULL
              );

  StatusValue = data.Status;

  return Status;
}



DWORD CUsbIo::ClassOrVendorInRequest(
        void* Buffer,
        DWORD& ByteCount,
        const USBIO_CLASS_OR_VENDOR_REQUEST* Request 
        )
{
  DWORD Status;

  Status = IoctlSync(
              IOCTL_USBIO_CLASS_OR_VENDOR_IN_REQUEST,
              Request,
              sizeof(USBIO_CLASS_OR_VENDOR_REQUEST),
              Buffer,
              ByteCount,
              &ByteCount
              );

  return Status;
}



DWORD CUsbIo::ClassOrVendorOutRequest(
        const void* Buffer,
        DWORD& ByteCount,
        const USBIO_CLASS_OR_VENDOR_REQUEST* Request
        )
{
  DWORD Status;

  Status = IoctlSync(
              IOCTL_USBIO_CLASS_OR_VENDOR_OUT_REQUEST,
              Request,
              sizeof(USBIO_CLASS_OR_VENDOR_REQUEST),
              (void*)Buffer,
              ByteCount,
              &ByteCount
              );

  return Status;
}



DWORD CUsbIo::SetConfiguration(const USBIO_SET_CONFIGURATION* Conf)
{
  DWORD Status;

  Status = IoctlSync(
              IOCTL_USBIO_SET_CONFIGURATION,
              Conf,
              sizeof(USBIO_SET_CONFIGURATION),
              NULL,
              0,
              NULL
              );

  return Status;
}


DWORD CUsbIo::UnconfigureDevice()
{
  DWORD Status;

  Status = IoctlSync(
              IOCTL_USBIO_UNCONFIGURE_DEVICE,
              NULL,
              0,
              NULL,
              0,
              NULL
              );

  return Status;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产成人在线免费| 国产精品人妖ts系列视频| 亚洲综合免费观看高清在线观看| 国产一区二区不卡在线| 精品成人佐山爱一区二区| 日本强好片久久久久久aaa| 在线精品视频免费播放| 亚洲精品视频在线观看网站| 91黄色在线观看| 一区二区三区国产豹纹内裤在线| 色综合久久中文综合久久牛| 一区二区三区在线视频免费观看| 欧美亚洲一区二区在线| 亚洲第一激情av| 日韩欧美久久久| 国产成人av自拍| 亚洲欧美日韩国产成人精品影院| 在线欧美小视频| 日韩高清一区在线| 精品福利一区二区三区免费视频| av电影在线观看一区| 一区二区视频在线看| 99久久久久久99| 亚洲一区二区三区在线| 欧美一级在线观看| 北岛玲一区二区三区四区| 亚洲国产精品一区二区www| 精品久久一二三区| 色综合一个色综合| 性欧美疯狂xxxxbbbb| 国产亚洲精品7777| 欧美日韩在线不卡| 国产很黄免费观看久久| 中文字幕二三区不卡| 欧美视频第二页| 蜜臂av日日欢夜夜爽一区| 中文字幕欧美一| 日韩欧美久久久| 欧美综合一区二区三区| 国产乱码精品一区二区三区忘忧草| 亚洲青青青在线视频| 日韩精品资源二区在线| av亚洲精华国产精华精| 久久国产麻豆精品| 亚洲综合成人在线视频| 国产女同互慰高潮91漫画| 欧美夫妻性生活| 91老师片黄在线观看| 精品在线播放午夜| 亚洲大型综合色站| 中文字幕日韩av资源站| 久久精品夜色噜噜亚洲a∨| 欧美日韩国产一级二级| 91丝袜高跟美女视频| 国产一区二区女| 蜜桃精品视频在线观看| 一个色综合av| 成人欧美一区二区三区在线播放| 欧美一二区视频| 欧美日韩国产一区| 在线看不卡av| 91首页免费视频| 不卡一卡二卡三乱码免费网站| 久久国产日韩欧美精品| 蜜臀a∨国产成人精品| 亚洲国产精品一区二区尤物区| 亚洲色图欧美激情| 一区二区中文视频| 欧美高清在线视频| 日本一区二区在线不卡| 久久久久国产精品人| 337p日本欧洲亚洲大胆精品 | 91精品麻豆日日躁夜夜躁| 91丨porny丨蝌蚪视频| gogo大胆日本视频一区| 成人av动漫网站| 不卡一区二区三区四区| 成人av影视在线观看| 成人国产一区二区三区精品| 成人小视频免费在线观看| 国产精品18久久久久久久网站| 国产一区二区三区久久久 | 精品免费国产一区二区三区四区| 7777精品伊人久久久大香线蕉超级流畅| 欧美天堂亚洲电影院在线播放| 欧洲av一区二区嗯嗯嗯啊| 欧美日韩性生活| 3d动漫精品啪啪一区二区竹菊| 欧美一区二区三区小说| 欧美成va人片在线观看| 久久品道一品道久久精品| 国产日韩欧美激情| 亚洲欧洲日本在线| 一区二区三区在线观看欧美| 亚洲一区二区三区爽爽爽爽爽| 亚洲第一激情av| 精品在线免费视频| 99热这里都是精品| 欧美视频在线不卡| 欧美www视频| 亚洲国产精品国自产拍av| 亚洲色图第一区| 丝袜诱惑制服诱惑色一区在线观看| 日韩电影一区二区三区| 国产一区二区在线观看免费| 成人动漫精品一区二区| 日本高清不卡一区| 日韩无一区二区| 中文在线一区二区| 亚洲国产中文字幕在线视频综合 | 欧美v日韩v国产v| 日本一区二区视频在线| 亚洲国产精品久久久男人的天堂| 免费成人在线播放| av午夜一区麻豆| 欧美精品国产精品| 国产欧美日韩三级| 午夜精品福利久久久| 国产精品18久久久久久久久久久久| 色综合久久综合中文综合网| 91精品国产一区二区三区| 中文字幕乱码亚洲精品一区 | 91精品国产麻豆| 中文字幕欧美日韩一区| 日韩国产成人精品| 91在线观看美女| 精品不卡在线视频| 亚洲一区国产视频| 国产 日韩 欧美大片| 91精品国产综合久久婷婷香蕉 | 久久久午夜精品理论片中文字幕| 亚洲欧美色综合| 国模一区二区三区白浆| 欧美午夜精品久久久久久超碰| 久久久久久久久岛国免费| 亚洲尤物在线视频观看| 国产乱子轮精品视频| 精品视频资源站| 亚洲欧美在线视频| 国产91综合网| 精品成人在线观看| 免费的成人av| 欧美日韩国产色站一区二区三区| 中国色在线观看另类| 蜜臀av性久久久久蜜臀aⅴ四虎| 一本色道久久加勒比精品| 久久精品免费在线观看| 蜜臀av性久久久久av蜜臀妖精 | 日韩视频一区二区在线观看| 亚洲精品老司机| 不卡一区二区三区四区| 久久九九久久九九| 久久精品国产999大香线蕉| 精品视频在线视频| 亚洲一区二区精品视频| 91亚洲精品久久久蜜桃| 国产精品福利一区二区| 国产成人精品免费一区二区| 亚洲精品一线二线三线无人区| 日韩高清一区在线| 欧美一级日韩免费不卡| 日韩高清欧美激情| 91精品国产色综合久久久蜜香臀| 亚洲成人综合在线| 欧美视频一区二区三区四区 | 久久精品人人做| 国产在线视频一区二区三区| 日韩欧美国产三级电影视频| 视频精品一区二区| 日韩一级完整毛片| 精品在线免费观看| 久久一夜天堂av一区二区三区 | 波多野结衣一区二区三区| 国产精品你懂的| 91视视频在线观看入口直接观看www| 国产精品网站在线观看| 成人动漫一区二区在线| 亚洲天堂免费看| 色婷婷av一区二区三区大白胸| 樱桃国产成人精品视频| 欧美三级电影一区| 日本亚洲一区二区| 精品国产百合女同互慰| 成人性生交大片免费看中文 | 亚洲高清免费在线| 欧美一区二区三区在线观看 | 亚洲人被黑人高潮完整版| 在线国产电影不卡| 日韩电影免费在线观看网站| 日韩精品在线一区| 国产成人av福利| 亚洲男人的天堂一区二区| 欧美性大战久久久| 奇米色777欧美一区二区| 久久视频一区二区| 99re在线精品| 亚洲午夜久久久久久久久久久| 日韩欧美中文字幕一区| 成人综合在线网站| 亚洲国产精品天堂|