---------------------
|       应用程序      |
---------------------
|usb client driver  |    (层一)
---------------------
|        usbd.dll     |    (层二)
---------------------
|        ohci.dll       |    (层三)
---------------------

wince的USB驱动分为三层,如上图所示.从上到下,姑且将其称为层一,层二,层三。层一通过gc_usbFuncs来调用层二所提供的功能,而层二通过gc_hcdFuncs来调用层三实现的功能,而应用程序则与层一打交道。

HCD初始化时,会创建一个线程,CHub::HubStatusChangeThead().在此线程中,会监视USB口的状态,如果有设备插入,则有如下的调用步骤:
AttachDevice()->CFunction::EnterOperationalState()->HcdDeviceAttached()->LoadDeviceDrivers()->LoadUsbClientDriver()->LoadGroupDriver()->LoadRegisteredClientDriver().
CDevice::AttachDevie()处理设备的初始化,如读设备描述符,配置地址,加载Client Driver等。
在LoadRegisteredClientDriver()内,会根据不同的Class,来调用相应的UsbDeviceAttach().而它的第一个参数就是gc_usbFuncs.在IssueVendorTransfer()之类的函数中,有一参数LPCUSB_FUNCS,该指针就是指向gc_usbFuncs.