全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4388
推到 Plurk!
推到 Facebook!

請問如何確定PIPE NAME?

尚未結案
jewelz03
一般會員


發表:1
回覆:1
積分:0
註冊:2012-06-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-06-14 18:02:36 IP:120.127.xxx.xxx 訂閱
各位大大好
不好意思 事先我已經有爬過文了
但我仍然不是很懂有關windows下有關USB PIPE NAME的問題
目前我手邊有一塊USB Composite Device
我想要對它做普通讀寫的動作
目前我的問題點出在
我已經取得裝置的Path 並引用到CreateFile下去取得裝置的handle
但在Read.Write時取得error87,我認為應該是handle的問題
之後有讀過Mass Storage Class是要對Endpoint做Read.Write
所以必須在USB Path後面再加上"// PIPExx"
之後再用CreateFile取得正確的handle
但由於書上或網路都沒有對PIPE Name有詳細的說明
有書上通稱PIPE Name就是"PIPE" 請問這樣對嗎?
而我有用Bus Hound去看過裝置的Interface Descriptor說有3個Endpoint
分別如下:
Endpoint 0: Type=CTL Class=08 SubClass=06 Protocol=50 MaxPacket=8
Endpoint 2 OUT: Type=BULK Class=08 SubClass=06 Protocol=50 MaxPacket=40
Endpoint 1 IN: Type=BULK Class=08 SubClass=06 Protocol=50 MaxPacket=40

我想問的是 那我要加在PATH後面的PIPE Name
是否就是device.path "//PIPE01" 取得handle 用在ReadFile()
而device.path "//PIPE02" 取得handle用在WriteFile()呢?
如果真是如此 其實我也已經試過 得到的結果也是Error87
所以我想請教一下 PIPE Name是否真是如此??
如果真確 那我又是哪裡不正確呢?
以下是我的原始碼:
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Win32.SafeHandles;
using System.IO.Ports;
 
public class Form
    {
        public string Mass_Storage_GUID = //USB Interface Guid
        
        const internal Int32 DIGCF_DEVICEINTERFACE = 0x10;
        SafeFileHandle deviceHandle;
        SetupAPI.new devInfo();
                
        void button1_Click(EventArgs e)
        {            
            System.new System.IntPtr deviceInfoSet;
            deviceInfoSet = ref myGuid,IntPtr.Zero,DIGCF_PRSENT|DIGCF_DEVICEINTERFACE);
 
            SetupAPI.new SP_Devcie_INTERFACE_DATA();
            false;
            "";
            
            
            MyDeviceInterfaceData.cbSize = do
            {
                success = IntPtr.Zero, ref MyDeviceInterfaceData);
 
                IntPtr detailDataBuffer;
                false;
                success2 = ref MyDeviceInterfaceData, ref bufferSize, Marshal.AllocHGlobal(bufferSize);
                IntPtr.Size == 4) ? (4   SetupAPI.SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref bufferSize, IntPtr pDevicepathName = IntPtr(detailDataBuffer.ToInt32()   4);
                devicePathName = Marshal.FreeHGlobal(detailDataBuffer);
                memberIndex  ;
            } "\\\\?\\usb#vid_0402&pid_5668#00101000100000000436#{a5dcbf10-6530-11d2-901f-00c04fb951ed}");//因為先前已得知裝置路徑
            //SetupAPI.SetupDiDestroyDeviceInfoList(deviceInfoSet);
 
            SafeFileHandle DeviceHandle;
            "//PIPE2"; SetupAPI.CreateFile(devicePathName, SetupAPI.GENERIC_WRITE, SetupAPI.FILE_SHARE_WRITE, SetupAPI.OPEN_EXISTING, 0, 0);
            
           SetupAPI.WinUsb_Initialize(DeviceHandle,int r = Byte[] buffer = Byte[13];
                      
            Byte[] Write_buffer = { 0x55, 0x53, 0x42, 0x43, 0xd0, 0xba, 0x5e, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
            false;
            SetupAPI.WriteFile(DeviceHandle, Write_buffer, Write_buffer.Length, IntPtr.Zero);
                Marshal.GetLastWin32Error();while (success3 == int j = MessageBox.Show(j.ToString());
                      
            success3 = ref i,int q = MessageBox.Show(q.ToString());            
          
            
        }
    }
}
編輯記錄
jewelz03 重新編輯於 2012-06-14 04:07:44, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-06-15 14:39:28 IP:114.32.xxx.xxx 訂閱
試試
devicePathName = devicePathName 改成
devicePathName = devicePathName
若我沒記錯的話應該是跟driver一致

jewelz03
一般會員


發表:1
回覆:1
積分:0
註冊:2012-06-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-06-15 17:58:39 IP:120.127.xxx.xxx 訂閱
謝謝大大指教
而我剛剛試過 結果依舊是Error87
以下是我用usbview看的結果
Device Descriptor:
bcdUSB: 0x0200
bDeviceClass: 0x00
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x40 (64)
idVendor: 0x0402 (Acer Labs Inc.)
idProduct: 0x5668
bcdDevice: 0x0002
iManufacturer: 0x03
iProduct: 0x01
iSerialNumber: 0x02
bNumConfigurations: 0x01
ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed: Full
Device Address: 0x02
Open Pipes: 2
Endpoint Descriptor:
bEndpointAddress: 0x81
Transfer Type: Bulk
wMaxPacketSize: 0x0200 (512)
bInterval: 0x00
Endpoint Descriptor:
bEndpointAddress: 0x02
Transfer Type: Bulk
wMaxPacketSize: 0x0200 (512)
bInterval: 0x00

不知道有沒有幫助 我知道看bEndpointAddress的0-3bit就是pipe number
所以照常理來講寫入就是PIPE02 讀取就是PIPE01
應該也沒錯才對吧?!
另外想請問一下 如果我改用DeviceIoControl()去讀寫
是否也要取得PIPE的handle呢??
系統時間:2024-04-18 21:41:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!