青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-22  文章-0  trackbacks-0

下面是訪問 USB 口必備的函數:  

#include <vcl.h>
#include 
<dir.h>
#include 
<setupapi.h>
#include 
"C:/WINDDK/3790/inc/ddk/w2k/usbdi.h"
#include 
"C:/WINDDK/3790/inc/ddk/w2k/devioctl.h"
#include 
<initguid.h>
//---------------------------------------------------------------------------
// 下面必須為驅動程序的 GUID 值, 這里我亂寫的數
DEFINE_GUID(USB_DRIVER_GUID, 0x12345678,0xabcd,0x1122,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00);
//---------------------------------------------------------------------------
HANDLE OpenOneDevice(HDEVINFO hDvcInfo, PSP_INTERFACE_DEVICE_DATA DvcInfoData, char *sDevNameBuf)
{
  HANDLE hOut 
= INVALID_HANDLE_VALUE;

  ULONG  iReqLen 
= 0;
  SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, NULL, 
0&iReqLen, NULL);

  ULONG iDevDataLen 
= iReqLen; //sizeof(SP_FNCLASS_DEVICE_DATA) + 512;
  PSP_INTERFACE_DEVICE_DETAIL_DATA pDevData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(iDevDataLen);

  pDevData
->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
  
if(SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, pDevData, iDevDataLen, &iReqLen, NULL))
   
{
     strcpy(sDevNameBuf, pDevData
->DevicePath);
     hOut 
= CreateFile(pDevData->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
   }


  free(pDevData);
  
return hOut;
}

//---------------------------------------------------------------------------
HANDLE OpenUsbDevice(const GUID *pGuid, char *sDevNameBuf)
{
  HANDLE hOut 
= INVALID_HANDLE_VALUE;

  HDEVINFO hDevInfo 
= SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);

  SP_INTERFACE_DEVICE_DATA deviceInfoData;
  deviceInfoData.cbSize 
= sizeof (SP_INTERFACE_DEVICE_DATA);

  ULONG nGuessCount 
= MAXLONG;
  
for(ULONG iDevIndex=0; iDevIndex<nGuessCount; iDevIndex++)
   
{
     
if(SetupDiEnumDeviceInterfaces(hDevInfo, 0, pGuid, iDevIndex, &deviceInfoData))
      
{
        
if((hOut=OpenOneDevice(hDevInfo, &deviceInfoData, sDevNameBuf)) != INVALID_HANDLE_VALUE)
          
break;
      }

     
else if(GetLastError() == ERROR_NO_MORE_ITEMS) //No more items
      {
        
break;
      }

   }

  SetupDiDestroyDeviceInfoList(hDevInfo);
  
return hOut;
}

//---------------------------------------------------------------------------
bool GetUsbDeviceFileName(const GUID *pGuid, char *sDevNameBuf)
{
  HANDLE hDev 
= OpenUsbDevice(pGuid, sDevNameBuf);
  
if(hDev != INVALID_HANDLE_VALUE)
   
{
     CloseHandle(hDev);
     
return true;
   }

  
return false;
}

//---------------------------------------------------------------------------
HANDLE OpenMyDevice()
{
  
char DeviceName[MAXPATH] = "";
  
return OpenUsbDevice(&USB_DRIVER_GUID, DeviceName);
}

//---------------------------------------------------------------------------
HANDLE OpenMyDevPipe(const char *PipeName)
{
  
char DeviceName[MAXPATH] = "";
  
if(GetUsbDeviceFileName(&USB_DRIVER_GUID, DeviceName))
   
{
     strcat(DeviceName,
"\\");
     strcat(DeviceName,PipeName);
     
return CreateFile(DeviceName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
   }

  
return INVALID_HANDLE_VALUE;
}

//--------------------------------------------------------------------------- 
 

//有了上面的函數就可以訪問 USB 口了: 
//打開 USB 口讀寫, 由驅動程序的 Pipe 名確定 

HANDLE hPipe 
= OpenMyDevPipe("MyPipe1"); //驅動程序里面的 Pipe 名, 對應訪問某個端點的 I/O, 這里我亂寫的, 需要與驅動一致
if(hPipe != INVALID_HANDLE_VALUE) //打開 Pipe 成功
 {
   ReadFile(hPipe, Buffer, BufSize, 
&nBytesRead, NULL); //從 hPipe 里讀取數據到 Buffer 里
   
//WriteFile(hPipe, Buffer, BytesToWrite, &nBytesWritten, NULL); //把 Buffer 里面的 BytesToWrite 字節寫入 hPipe
   CloseHandle(hPipe);
 }


//使用 DeviceIoControl 訪問 USB 設備

HANDLE hDevice 
= OpenMyDevice();
if(hDevice != INVALID_HANDLE_VALUE) //打開設備成功
 {
   
//這些 DeviceIoControl 功能都是由設備定義的, 具體看設備和驅動的資料
   if(DeviceIoControl(hDevice, IOCTL_READ_xxxx, &IOBlock, sizeof(IOBLOCK), &c, 1&nBytes, NULL))
    
{
      
//成功
    }

   CloseHandle(hDevice);
}
 

 

USB 設備、USB 驅動、USB 應用程序

1.USB 設備硬件部分
  a.這個硬件的標識是用的 Vender ID 和 Product ID, 即“廠家標識”和“產品標識”
  b.這個硬件規定了各個 End Point (端點) 的性質, 讀/寫 及 類型 (Control/Interrupt/Bulk/Isochronous)
  c.這個硬件的固件里面有 DeviceIoControl 的實現部分, 規定了這個函數的具體參數和動作
2.USB 設備驅動
 ①硬件接口
  a.需要識別 Vender ID 和 Product ID
  b.對每個 EndPoint 的每個 I/O 分配一個 Pipe, 并且起一個名字作為軟件接口
  c.做 DeviceIoControl 的接口
 ②軟件接口
  a.GUID, 驅動程序的標識, 每個驅動程序使用不同的 GUID, GUID 是識別驅動的, 與硬件無關 (驅動程序升級版本 GUID 不能修改)
  b.硬件接口里面的 b: Pipe 名字是軟件接口, 這個 Pipe 名字純粹由驅動定義的, 和硬件無關, 升級驅動不能改 Pipe 的名字
  c.硬件接口里面的 c 的各個參數也是軟件的接口, 這些參數是由硬件帶來的, 不是驅動規定的, 當然也可以在驅動里面轉義, 隱藏設備的真實情況
 ③這個驅動程序是用 WinDDK 編譯的, 可以用文本編輯器或其他開發工具的編輯器編程序代碼, 然后調用 WinDDK 編譯

3.讀寫 USB 口的程序
 ①與驅動的接口
  a.利用驅動程序里面的 GUID 找出設備的文件名, 用 CreateFile 函數打開設備。我前面的程序里面的 OpenUsbDevice 就是這個作用
  b.通過 a.得到的設備文件名和驅動程序里面的 Pipe 名打開 Pipe, 訪問這個 Pipe 對應的 USB 端點 (讀寫數據)
  c.使用 a.的 CreateFile 得到的句柄, 通過 DeviceIoControl 實現設備規定的動作
 ②有關需要的資料
  a.Vender ID, Product ID 和 GUID 一般在驅動程序的 .inf 文件里面能看到, 如果找不到就需要和廠家聯系
  b.Pipe 的名字是驅動程序規定的, 需要有驅動程序的資料才能知道
  c.DeviceIoControl 的參數需要有驅動程序的資料或者硬件資料才能知道
 ③這個程序一般用 C/C++ 直接編寫, 如果使用其他語言(VB/PB等)需要調用 C/C++ 編的 DLL


其他相關內容:

USB 驅動程序可以到注冊表里面找到:
"HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\USB\\Vid_廠家標識&Pid_產品標識\\驅動程序"

里面的 ClassGUID 就是驅動程序的 GUID 標識, 例如 {36FC9E60-C465-11CF-8056-444553540000}
相當于程序的: DEFINE_GUID(USB_DRIVER_GUID, 0x36FC9E60,0xC465,0x11CF,0x80,0x56,0x44,0x45,0x53,0x54,0x00,0x00);
另外在這個注冊表鍵里面還可找到有關設備的其他描述, 例如 DeviceDesc = "USB Mass Storage Device" 等

posted on 2009-08-07 17:43 Bluesea 閱讀(884) 評論(0)  編輯 收藏 引用 所屬分類: 嵌入式開發
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线综合亚洲欧美在线视频| 欧美大尺度在线| 最新日韩欧美| 国产精品爽黄69| 亚洲精品永久免费| 亚洲欧洲在线视频| 午夜精品理论片| 久久久激情视频| 国产一区二区三区不卡在线观看| 亚洲国产欧美一区| 亚洲激情视频网站| 欧美国产日韩精品免费观看| 亚洲第一主播视频| 亚洲精品久久久一区二区三区| 久久噜噜亚洲综合| 亚洲电影在线观看| 一本色道久久综合精品竹菊| 欧美色视频一区| 一区二区三区视频在线看| 亚洲免费在线看| 国产精品国产a级| 午夜精品久久久久久| 麻豆九一精品爱看视频在线观看免费| 亚洲二区在线视频| 麻豆精品精华液| 亚洲精品亚洲人成人网| 亚洲在线视频观看| 欧美视频一区二区| 尤物在线观看一区| 久久精品视频va| 在线观看日韩av| 欧美日韩成人一区| 先锋影音国产一区| 久久综合电影| 亚洲一区二区三区免费在线观看| 久久一区二区三区国产精品| 国产亚洲欧美一级| 欧美国内亚洲| 久久成人精品无人区| 亚洲日韩欧美视频| 久久久久久久一区二区| 亚洲一区二区三区乱码aⅴ蜜桃女| 在线成人av.com| 欧美特黄视频| 欧美激情影音先锋| 蜜臀99久久精品久久久久久软件| 亚洲免费观看在线观看| 毛片一区二区| 日韩亚洲欧美一区| 亚洲国产精品久久久| 欧美日韩和欧美的一区二区| 欧美亚洲免费在线| 亚洲免费在线视频| 亚洲精品免费观看| 亚洲二区视频| 久久天天躁狠狠躁夜夜av| 一本色道久久综合一区| 1000部精品久久久久久久久| 国产日韩欧美高清免费| 欧美性猛交xxxx免费看久久久 | 亚洲电影免费观看高清完整版在线 | 久久婷婷久久一区二区三区| 欧美99在线视频观看| 午夜精品美女久久久久av福利| 亚洲国产精品123| 国产亚洲激情视频在线| 欧美日韩一区二区在线视频| 久久久久久电影| 久久这里有精品15一区二区三区 | 久久精品日产第一区二区三区 | 久久永久免费| 国产精品爽黄69| 亚洲视频综合在线| 亚洲天堂av综合网| 欧美一区久久| 日韩亚洲欧美精品| 亚洲电影免费| 韩曰欧美视频免费观看| 国产一区二区久久久| 国产精品色一区二区三区| 欧美日韩亚洲国产精品| 欧美成人精品| 欧美日韩精品欧美日韩精品| 欧美黄色影院| 欧美日韩免费观看一区=区三区| 欧美激情第4页| 欧美日韩国产色综合一二三四| 欧美日韩黄色大片| 欧美日韩免费看| 欧美午夜一区二区| 久久人人爽爽爽人久久久| 亚洲色图制服丝袜| 性久久久久久久| 久久大香伊蕉在人线观看热2| 久久成人精品视频| 裸体丰满少妇做受久久99精品| 欧美成人亚洲成人日韩成人| 亚洲欧洲一区二区天堂久久| 一区二区日韩免费看| 亚洲一区二区精品在线| 亚洲女人av| 美女图片一区二区| 欧美性jizz18性欧美| 国产欧美一区二区精品仙草咪| 韩国在线视频一区| 亚洲视频一二区| 欧美专区第一页| 欧美高清视频| 亚洲欧美在线高清| 美女露胸一区二区三区| 国产精品亚洲美女av网站| 亚洲高清免费视频| 亚洲欧美中文在线视频| 另类尿喷潮videofree| 夜夜爽99久久国产综合精品女不卡 | 日韩一级片网址| 久久久精品国产一区二区三区| 欧美伦理影院| 国产一区二区三区的电影 | 国产精品99久久久久久久久久久久 | 日韩亚洲欧美一区二区三区| 这里只有精品视频在线| 久久久久久高潮国产精品视| 欧美三级在线视频| 亚洲国产精品久久人人爱蜜臀| 午夜精品美女久久久久av福利| 亚洲电影在线免费观看| 久久精品国产一区二区三| 欧美日韩另类视频| 日韩视频久久| 欧美国产一区二区在线观看| 久久精品日产第一区二区| 国产三级欧美三级日产三级99| 中日韩高清电影网| 亚洲国产一区二区三区在线播 | 久久综合久久综合久久| 亚洲一区图片| 国产精品国产三级国产aⅴ浪潮| 99riav国产精品| 欧美视频在线观看| 亚洲九九精品| 亚洲电影在线免费观看| 免费欧美在线视频| 亚洲精品一二| 亚洲第一在线综合网站| 免费成人在线观看视频| 91久久亚洲| 亚洲精品无人区| 欧美日韩国产在线播放| 亚洲午夜视频在线观看| 亚洲欧美日韩直播| 午夜精品视频网站| 欧美国产大片| 免费久久久一本精品久久区| 国产资源精品在线观看| 欧美主播一区二区三区| 欧美在线不卡视频| 国产欧美日韩中文字幕在线| 欧美一区二区三区四区在线| 一本久道久久久| 亚洲自拍三区| 国产在线拍偷自揄拍精品| 亚洲激情不卡| 亚洲特黄一级片| 欧美日韩午夜激情| 一区二区三区精品视频在线观看| 久久久久欧美| 久久香蕉国产线看观看网| 国产精品亚发布| 欧美一区深夜视频| 亚洲综合电影| 日韩性生活视频| 亚洲人成77777在线观看网| 久久综合狠狠综合久久激情| 亚洲国产精品久久91精品| 亚洲精品欧美在线| 欧美色道久久88综合亚洲精品| 亚洲日本黄色| 亚洲卡通欧美制服中文| 欧美日韩一区高清| 久久久水蜜桃av免费网站| 久久男人资源视频| 亚洲黄色免费| 亚洲欧洲在线免费| 国产精品黄色在线观看| 美女爽到呻吟久久久久| 欧美日韩精品二区| 久久精品一级爱片| 欧美另类一区二区三区| 午夜激情综合网| 欧美主播一区二区三区美女 久久精品人 | 亚洲视频一区二区| 老鸭窝91久久精品色噜噜导演| 亚洲在线视频网站| 狼狼综合久久久久综合网| 欧美在线观看天堂一区二区三区| 欧美成人一区在线| 免费久久99精品国产自在现线| 国产精品萝li| 亚洲精品美女91|