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

隨筆-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 閱讀(882) 評論(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>
            久久久久久自在自线| 亚洲曰本av电影| 91久久国产精品91久久性色| 久久激情综合网| 国产一区激情| 欧美人妖在线观看| 老巨人导航500精品| 久久亚洲春色中文字幕久久久| 亚洲一区二区三区中文字幕在线| 亚洲人成在线播放网站岛国| 欧美综合国产精品久久丁香| 欧美亚洲系列| 性欧美超级视频| 免费一级欧美片在线观看| 久久国产精品72免费观看| 国产精品99一区| 欧美亚韩一区| 国产在线播放一区二区三区| 黄色一区二区三区| 亚洲精品免费在线播放| 一区二区电影免费观看| 香蕉精品999视频一区二区| 亚洲欧美日韩国产另类专区| 久久成人精品电影| 美女主播一区| 亚洲视频免费看| 欧美69wwwcom| 国产欧美一区二区三区国产幕精品| 国产欧美精品xxxx另类| 亚洲精品一区二区三| 久久久美女艺术照精彩视频福利播放 | 欧美日韩一区二区三区| 亚洲一区二区三区四区视频| 亚洲午夜精品福利| 亚洲精品黄色| 久久人人97超碰国产公开结果 | 欧美高清在线精品一区| 欧美成人午夜| 亚洲黄色毛片| 欧美xart系列在线观看| 性伦欧美刺激片在线观看| 欧美久久久久久久| 黄色成人免费网站| 久久精品视频免费| 亚洲欧洲在线免费| 欧美一级片在线播放| 一区二区不卡在线视频 午夜欧美不卡' | 国产日韩一区二区三区在线| 亚洲午夜免费视频| 这里只有精品视频在线| 欧美日韩国产精品一区二区亚洲| 国产精品a级| 亚洲在线黄色| 久久gogo国模啪啪人体图| 国产日韩欧美电影在线观看| 久久久久久亚洲精品中文字幕| 久久精品免视看| 一本色道久久加勒比88综合| 一本久久青青| 激情婷婷欧美| 亚洲精选视频免费看| 国产精品一区二区黑丝| 久久五月天婷婷| 欧美涩涩网站| 欧美第一黄色网| 欧美福利电影网| 久久久综合视频| 欧美性天天影院| 亚洲国产成人tv| 国内成+人亚洲| 99国产精品久久久久久久| 国产精品成人国产乱一区| 欧美成黄导航| 亚洲日本成人女熟在线观看| 国产精品分类| 亚洲欧洲一区二区三区久久| 影音先锋亚洲精品| 亚洲视频在线观看视频| 欧美护士18xxxxhd| 欧美亚洲日本国产| 亚洲福利久久| 国产精品自拍在线| 亚洲欧美在线磁力| 久久xxxx精品视频| 国产精品网曝门| 亚洲一区日韩在线| 欧美资源在线观看| 在线电影欧美日韩一区二区私密| 欧美一区二区三区在线观看视频| 久久不射中文字幕| 精品成人一区二区| 欧美承认网站| 亚洲午夜精品久久久久久app| 99国内精品久久| 国产精品一级在线| 欧美在线视频一区二区三区| 欧美α欧美αv大片| 中文精品在线| 国产一区二区三区日韩| 奶水喷射视频一区| 亚洲一区二区三区国产| 裸体歌舞表演一区二区| 一区二区不卡在线视频 午夜欧美不卡'| 欧美人交a欧美精品| 久久精品视频一| 一区二区三区免费在线观看| 久久精品国产亚洲a| 一区二区久久久久| 在线成人欧美| 国产免费一区二区三区香蕉精| 免费成人av在线看| 亚洲高清视频在线观看| 欧美日韩国产综合久久| 久久久久9999亚洲精品| 欧美一区二区视频在线| 亚洲影院一区| 亚洲免费一在线| 欧美一区二区国产| 欧美色欧美亚洲另类二区| 美女视频黄 久久| 久久精品日产第一区二区| 亚洲综合激情| 欧美一区二区三区另类| 亚洲一区国产一区| 午夜视频久久久| 久久精品二区| 欧美成人精品| 欧美日韩极品在线观看一区| 欧美国产日韩一区二区三区| 欧美成人精精品一区二区频| 久久久久久久欧美精品| 性色一区二区三区| 国产综合自拍| 美女福利精品视频| 久久影院午夜论| 免费日韩精品中文字幕视频在线| 欧美jizzhd精品欧美巨大免费| 欧美日韩亚洲一区| 国产精品入口福利| 亚洲激情亚洲| 欧美一区二区三区日韩| 久久久天天操| 亚洲精品孕妇| 老巨人导航500精品| 国产精品一区二区黑丝| 亚洲精品一区二区三区福利| 亚洲欧美一区二区三区久久| 免费亚洲一区| 亚洲男人av电影| 欧美性色综合| 制服诱惑一区二区| 亚洲韩国青草视频| 亚洲欧洲综合| 欧美在线亚洲在线| 亚洲男女自偷自拍| 欧美伊人精品成人久久综合97| 欧美视频专区一二在线观看| 亚洲精品久久久久久久久久久| 久久久久久久久久看片| 国产在线高清精品| 亚洲天堂激情| 亚洲毛片视频| 欧美日韩专区在线| 一区二区三区视频在线| 嫩草成人www欧美| 久久久久久久尹人综合网亚洲| 国产欧美精品一区| 亚洲欧美在线x视频| 亚洲永久免费视频| 国产伦精品一区二区三区高清| 欧美在线视频一区二区| 国产欧美日韩精品a在线观看| 久久精品中文字幕一区| 这里只有精品视频| 国产精品免费福利| 久久影音先锋| 欧美电影美腿模特1979在线看| 亚洲精品黄网在线观看| 在线一区二区视频| 激情另类综合| 欧美激情在线狂野欧美精品| 欧美高清在线视频观看不卡| 一区二区三区在线免费视频| 亚洲第一网站| 国产丝袜一区二区| 一本色道精品久久一区二区三区| 国产日韩精品一区观看| 日韩视频免费看| 精品福利免费观看| 亚洲婷婷综合色高清在线| 日韩视频在线观看| 亚洲第一中文字幕| 亚洲高清三级视频| 国产精品久久夜| 亚洲人体影院| 亚洲视频自拍偷拍| 久久在线免费观看| 免费视频一区| 日韩午夜av电影| 鲁大师成人一区二区三区 |