WinUSBのサンプルコード更新.

http://d.hatena.ne.jp/Waroe/20090220/1235124086
2/20版はこちら↑
http://d.hatena.ne.jp/Waroe/20090311/1236761835

3/11 通信完了完成品はこちら↑
#include<stdio.h>
#include<windows.h>
#include<WINUSB.H>
#include<usb100.h>
#include<setupapi.h>
#include<strsafe.h>

BOOL GetDevicePath(LPGUID InterfaceGuid, PCHAR DevicePath, size_t BufLen)
{
  BOOL bResult = FALSE;
  HDEVINFO deviceInfo;
  SP_DEVICE_INTERFACE_DATA interfaceData;
  PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL;
  ULONG length;
  ULONG requiredLength=0;
  HRESULT hr;

  deviceInfo = SetupDiGetClassDevs(InterfaceGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
  interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
  bResult = SetupDiEnumDeviceInterfaces(deviceInfo, NULL, InterfaceGuid, 0, &interfaceData);  
  SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, NULL, 0, &requiredLength, NULL);
  detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_FIXED, requiredLength);

  if(NULL == detailData)
  {
    SetupDiDestroyDeviceInfoList(deviceInfo);
    return FALSE;
  }

  detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  length = requiredLength;
  bResult = SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, detailData, length, &requiredLength, NULL);

  if(FALSE == bResult)
  {
    LocalFree(detailData);
    return FALSE;
  }
  hr = StringCchCopy(DevicePath, BufLen, detailData->DevicePath);
  if(FAILED(hr))
  {
    SetupDiDestroyDeviceInfoList(deviceInfo);
    LocalFree(detailData);
  }
  LocalFree(detailData);
  return bResult;
}

//デバイスのファイルハンドルの取得
HANDLE OpenDevice(BOOL bSync)
{
  HANDLE hDev = NULL;
  char path[512];
  BOOL retVal;

//[Dev_AddReg]で指定したGUID
  GUID guid = {
    0x1F1F1F1F,
    0x1F1F,
    0x1F1F,
    { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F}
  };

  retVal = GetDevicePath(&guid, path, 512); 
  hDev = CreateFile(path,
                    GENERIC_WRITE | GENERIC_READ,
                    FILE_SHARE_WRITE | FILE_SHARE_READ,
                    NULL,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
                    NULL);
  return hDev;
}

//WinUSBの初期化とFx2用デバイスの構成

//devInfo構造体を作ってみる.new!
struct devInfo
{
  HANDLE deviceHandle;  
  WINUSB_INTERFACE_HANDLE winUSBHandle;
  unsigned char bulkInPipe;
  unsigned char bulkOutPipe;
  unsigned char interruptPipe;
  int deviceSpeed;
};
  
BOOL Initialize_Device()
{
  BOOL bResult;
  WINUSB_INTERFACE_HANDLE usbHandle;
  USB_INTERFACE_DESCRIPTOR ifaceDescriptor;
  WINUSB_PIPE_INFORMATION pipeInfo;

  UCHAR speed;
  ULONG length;

  HANDLE deviceHandle;
  struct devInfo devInfo;

//WinUSB初期化
  deviceHandle = OpenDevice(TRUE);
  bResult = WinUsb_Initialize(deviceHandle, &usbHandle);

  //[1]
  if(bResult)
  {
    devInfo.winUSBHandle = usbHandle;
    length = sizeof(UCHAR);
    bResult = WinUsb_QueryDeviceInformation(devInfo.winUSBHandle,
                                            DEVICE_SPEED,
                                            &length,
                                            &speed);
  }

//[2]
  if(bResult)
  {
    devInfo.deviceSpeed = speed;
    bResult = WinUsb_QueryInterfaceSettings(devInfo.winUSBHandle,
                                            0,
                                            &ifaceDescriptor);
  }
  if(bResult)
  {
    int i;
    for(i=0;i<ifaceDescriptor.bNumEndpoints;i++)
    {

//[3]
      bResult = WinUsb_QueryPipe(devInfo.winUSBHandle,
                                 0,
                                 (UCHAR) i,
                                 &pipeInfo);
//[4]
      if(pipeInfo.PipeType == UsbdPipeTypeBulk &&
                  USB_ENDPOINT_DIRECTION_IN(pipeInfo.PipeId))
      {
        devInfo.bulkInPipe = pipeInfo.PipeId;
      }
      else if(pipeInfo.PipeType == UsbdPipeTypeBulk &&
                  USB_ENDPOINT_DIRECTION_OUT(pipeInfo.PipeId))
      {
        devInfo.bulkOutPipe = pipeInfo.PipeId;
      }
      else if(pipeInfo.PipeType == UsbdPipeTypeInterrupt)
      {
        devInfo.interruptPipe = pipeInfo.PipeId;
      }
      else
      {
        bResult = FALSE;
        break;
      }
    }
  }
  return bResult;
}
            
void main(void){
  GUID guid = {
    0x1F1F1F1F,
    0x1F1F,
    0x1F1F,
    { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F}
  }; //[Dev_AddReg]で指定したGUID
  char path[512];
  GetDevicePath( &guid, path, 512);
  printf("Hello, world!\n");
}

devInfo構造体を追加した.
こちらもビルド通るのでWinUSBの初期化はできているであろう.
ここから先は独自のものになりそう.
Fx2デバイスの構成あたりをオリジナルのデバイス用に書き直す.