Win2000通用USB主机控制器库usbd.sys
2026-05-06
本文链接为:http://www.usbzh.com/article/detail-1645.html ,欢迎转载,转载请附上本文链接。
usbd简介
Win2000支持的主uhci和ohci,两都都支持usb1.1,只是实现方式不同而已。但是对于不同的主机控制器实现方式,肯定会有很多通用的代码,微软将其其静态库的方式存入内核,这样无论是开发uhci还是ohci主机USB控制器程序,只需要链接usbd通用代码即可。
- 对于uhci,其完整的主机控制驱动程序为uhci mini小端口驱动和usbd.sys
- 对于ohci,其完整的主机控制驱动程序为ohci mini小端口驱动和usbd.sys
所以usbd.sys类似disk.sys,是类驱动程序
usb导出库
由于usbd是类驱动程序,所以其就和应用层的dll一样,负责导出通用库函数。
LIBRARY USBD.SYS
EXPORTS
USBD_AllocateDeviceName
USBD_CalculateUsbBandwidth
USBD_CompleteRequest
USBD_CreateConfigurationRequest
USBD_CreateDevice
USBD_Debug_GetHeap
USBD_Debug_LogEntry
USBD_Debug_RetHeap
USBD_Dispatch
USBD_FreeDeviceMutex
USBD_FreeDeviceName
USBD_GetDeviceInformation
USBD_GetInterfaceLength
USBD_GetPdoRegistryParameter
USBD_GetSuspendPowerState
USBD_GetUSBDIVersion
USBD_InitializeDevice
USBD_MakePdoName
USBD_ParseConfigurationDescriptor
USBD_QueryBusTime
USBD_RegisterHcDeviceCapabilities
USBD_RegisterHcFilter
USBD_RegisterHostController
USBD_RemoveDevice
USBD_RestoreDevice
USBD_SetSuspendPowerState
USBD_WaitDeviceMutex
#if defined(_X86_) && !defined(NO_DEF_ALIAS)
_USBD_CreateConfigurationRequestEx@8 //导出原始 stdcall 符号
_USBD_ParseConfigurationDescriptorEx@28
_USBD_ParseDescriptors@16
USBD_CreateConfigurationRequestEx=_USBD_CreateConfigurationRequestEx@8 //创建别名映射
USBD_ParseConfigurationDescriptorEx=_USBD_ParseConfigurationDescriptorEx@28
USBD_ParseDescriptors=_USBD_ParseDescriptors@16
#else
USBD_CreateConfigurationRequestEx
USBD_ParseConfigurationDescriptorEx
USBD_ParseDescriptors
#endif
DllInitialize PRIVATE
DllUnload PRIVATE
可以看到,有三个函数会根据宏的不同,导出的名字不一样,带stdcall的别名或者和其它函数一样,不带别名。
这三个函数之所以有所不同,完全是因为调用者身份不同而因起的。
在 x86 的stdcall调用约定中:编译器自动添加_FunctionName@N后缀,N 为参数字节数
- 当仅为该模块内部使用时,不需要stdcall的别名
- 当被其它模块如驱动链接进入时,需要stdcall别名。这里其实使用了Ex扩展别名映射,
| 部分 | 功能 | 说明 |
|---|---|---|
_USBD_CreateConfigurationRequestEx@8 |
导出原始 stdcall 符号 | @8 表示参数占 8 字节(2 个指针) |
USBD_CreateConfigurationRequestEx=... |
创建别名映射 | 将简洁名称指向带后缀的实际符号 |
| 别名名称 | 实际指向 | 作用 |
|---|---|---|
USBD_CreateConfigurationRequestEx |
_USBD_CreateConfigurationRequestEx@8 |
提供简洁的调用接口 |
调用者视角:
// 用户代码可以使用简洁的函数名
PURB urb = USBD_CreateConfigurationRequestEx(configDesc, ifaceList);
链接器视角:
USBD_CreateConfigurationRequestEx → _USBD_CreateConfigurationRequestEx@8
这些导出的函数功能如下:
| 序号 | 函数名 | 功能分类 | 说明 |
|---|---|---|---|
| 1 | USBD_AllocateDeviceName | 设备管理 | 分配设备名称 |
| 2 | USBD_CalculateUsbBandwidth | 带宽管理 | 计算 USB 带宽 |
| 3 | USBD_CompleteRequest | 请求处理 | 完成请求 |
| 4 | USBD_CreateConfigurationRequest | 配置管理 | 创建配置请求 |
| 5 | USBD_CreateDevice | 设备管理 | 创建设备 |
| 6 | USBD_Debug_GetHeap | 调试支持 | 获取调试堆 |
| 7 | USBD_Debug_LogEntry | 调试支持 | 调试日志记录 |
| 8 | USBD_Debug_RetHeap | 调试支持 | 返回调试堆 |
| 9 | USBD_Dispatch | 请求分发 | 分发 IRP 请求 |
| 10 | USBD_FreeDeviceMutex | 同步管理 | 释放设备互斥锁 |
| 11 | USBD_FreeDeviceName | 设备管理 | 释放设备名称 |
| 12 | USBD_GetDeviceInformation | 信息查询 | 获取设备信息 |
| 13 | USBD_GetInterfaceLength | 接口管理 | 获取接口长度 |
| 14 | USBD_GetPdoRegistryParameter | 注册表 | 获取 PDO 注册表参数 |
| 15 | USBD_GetSuspendPowerState | 电源管理 | 获取挂起电源状态 |
| 16 | USBD_GetUSBDIVersion | 版本查询 | 获取 USBDI 版本 |
| 17 | USBD_InitializeDevice | 设备管理 | 初始化设备 |
| 18 | USBD_MakePdoName | 设备管理 | 生成 PDO 名称 |
| 19 | USBD_ParseConfigurationDescriptor | 配置解析 | 解析配置描述符 |
| 20 | USBD_QueryBusTime | 时间查询 | 查询总线时间 |
| 21 | USBD_RegisterHcDeviceCapabilities | HC 注册 | 注册主机控制器设备能力 |
| 22 | USBD_RegisterHcFilter | HC 注册 | 注册主机控制器过滤器 |
| 23 | USBD_RegisterHostController | HC 注册 | 注册主机控制器 |
| 24 | USBD_RemoveDevice | 设备管理 | 移除设备 |
| 25 | USBD_RestoreDevice | 设备管理 | 恢复设备 |
| 26 | USBD_SetSuspendPowerState | 电源管理 | 设置挂起电源状态 |
| 27 | USBD_WaitDeviceMutex | 同步管理 | 等待设备互斥锁 |
| 28 | USBD_CreateConfigurationRequestEx | 配置管理 | 创建配置请求(扩展) |
| 29 | USBD_ParseConfigurationDescriptorEx | 配置解析 | 解析配置描述符(扩展) |
| 30 | USBD_ParseDescriptors | 描述符解析 | 解析描述符 |
| 31 | DllInitialize | 内部 | DLL 初始化(私有) |
| 32 | DllUnload | 内部 | DLL 卸载(私有) |
函数分类统计
| 分类 | 函数数量 |
|---|---|
| 设备管理 | 6 |
| 配置管理 | 3 |
| HC 注册 | 3 |
| 调试支持 | 3 |
| 电源管理 | 2 |
| 同步管理 | 2 |
| 描述符解析 | 3 |
| 其他 | 5 |
| 内部函数 | 2 |
Windows XP下usbport





