WDK开发USB驱动如何加devive interface?

JQ123 2010-12-29 02:58:35
我手上有一个usb驱动的inf里好像没有加interface,但代码里有,驱动加载的代码如下:
DEFINE_GUID (GUID_DEVINTERFACE_TOASTER,
0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x71);

NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
NTSTATUS status = STATUS_SUCCESS;
WDF_DRIVER_CONFIG config;

WDF_DRIVER_CONFIG_INIT(
&config,
ToasterEvtDeviceAdd);

status = WdfDriverCreate(
DriverObject,
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES, // Driver Attributes
&config, // Driver Config Info
WDF_NO_HANDLE);

return status;
}


NTSTATUS
ToasterEvtDeviceAdd(
IN WDFDRIVER Driver,
IN PWDFDEVICE_INIT DeviceInit
)
{
NTSTATUS status = STATUS_SUCCESS;
PFDO_DATA fdoData;
WDF_IO_QUEUE_CONFIG queueConfig;
WDF_OBJECT_ATTRIBUTES fdoAttributes;
WDF_OBJECT_ATTRIBUTES reqAttributes;
WDFDEVICE hDevice;
WDFQUEUE queue;
WCHAR wszBuffer[MAX_PATH];
UNICODE_STRING SymbolicLinkName;

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&reqAttributes, REQUEST_CONTEXT);

WdfDeviceInitSetRequestAttributes(DeviceInit, &reqAttributes);

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&fdoAttributes, FDO_DATA);

status = WdfDeviceCreate(&DeviceInit, &fdoAttributes, &hDevice);

fdoData = ToasterFdoGetData(hDevice);

status = WdfDeviceCreateDeviceInterface(
hDevice,
(LPGUID) &GUID_DEVINTERFACE_TOASTER,
NULL // ReferenceString
);


SymbolicLinkName.Buffer = wszBuffer;
SymbolicLinkName.Length = MAX_PATH;
SymbolicLinkName.MaximumLength = MAX_PATH;

status = IoRegisterDeviceInterface(
hDevice,
(LPGUID) &GUID_DEVINTERFACE_TOASTER,
NULL,
&SymbolicLinkName);

status = IoSetDeviceInterfaceState(
&SymbolicLinkName,
TRUE);

WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchParallel);

queueConfig.EvtIoRead = ToasterEvtIoRead;
queueConfig.EvtIoWrite = ToasterEvtIoWrite;
queueConfig.EvtIoDeviceControl = ToasterEvtIoDeviceControl;

status = WdfIoQueueCreate(
hDevice,
&queueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
&queue);

return status;
}
这个驱动能成功加载,但我调用SetupDiEnumDeviceInterfaces时总返回ERROR_NO_MORE_ITEMS:

hDeviceInfo = SetupDiGetClassDevs(
&GUID_DEVINTERFACE_TOASTER,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

for (dwIndex = 0; ; dwIndex++)
{
ZeroMemory(&deviceInterfaceData, sizeof(deviceInterfaceData));
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

fRet = SetupDiEnumDeviceInterfaces(
hDeviceInfo,
NULL,
&GUID_DEVINTERFACE_TOASTER,
dwIndex,
&deviceInterfaceData);
if (!fRet)
{
if (ERROR_NO_MORE_ITEMS == GetLastError()) // 总是出这个错
{
// no more items
break;
}

从驱动代码看,GUID_DEVINTERFACE_TOASTER应该是devive interface GUID,但我在inf文件并没有找到这个GUID,如何在inf里加上呢?直接在INF这么写对吗?
[XXX.Device.Interfaces]
AddInterface=%GUID_DEVINTERFACE_TOASTER%
[Strings]
GUID_DEVINTERFACE_TOASTER = "{781EF630, 72B2, 11d2, B852, 00C04FAD5171}"
...全文
303 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
曹大夯 2010-12-29
  • 打赏
  • 举报
回复
对了, EvtDeviceFileCreate回调函数没有返回值.里面应该有WdfRequestComplete(Request, status);来表明对应的Request成功处理了.

空函数好像不太对.

http://msdn.microsoft.com/en-us/library/ff540868(v=VS.85).aspx
曹大夯 2010-12-29
  • 打赏
  • 举报
回复
0#楼的ToasterEvtDeviceAdd代码里面还有WdfDeviceCreateDeviceInterface相关的函数。
3#楼的代码,相关的函数没有了。

建议用打印信息的方式,看看Toaster_EvtDeviceFileCreate函数到底被调用了没有。
JQ123 2010-12-29
  • 打赏
  • 举报
回复
更新一下驱动代码,其中Toaster_EvtDeviceFileCreate和Toaster_EvtDeviceFileClose都是直接返回STATUS_SUCCESS的空函数,所以不可能是这两个函数出问题的
NTSTATUS
ToasterEvtDeviceAdd(
IN WDFDRIVER Driver,
IN PWDFDEVICE_INIT DeviceInit
)
{
WDF_FILEOBJECT_CONFIG fileConfig;
NTSTATUS status = STATUS_SUCCESS;
PFDO_DATA fdoData;
WDF_IO_QUEUE_CONFIG queueConfig;
WDF_OBJECT_ATTRIBUTES fdoAttributes;
WDF_OBJECT_ATTRIBUTES reqAttributes;
WDFDEVICE hDevice;
WDFQUEUE queue;

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&reqAttributes, REQUEST_CONTEXT);

WdfDeviceInitSetRequestAttributes(DeviceInit, &reqAttributes);

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&fdoAttributes, FDO_DATA);

WDF_FILEOBJECT_CONFIG_INIT(
&fileConfig,
Toaster_EvtDeviceFileCreate,
Toaster_EvtDeviceFileClose,
WDF_NO_EVENT_CALLBACK
);


WdfDeviceInitSetFileObjectConfig(DeviceInit,
&fileConfig,
WDF_NO_OBJECT_ATTRIBUTES);

status = WdfDeviceCreate(&DeviceInit, &fdoAttributes, &hDevice);

fdoData = ToasterFdoGetData(hDevice);

WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchParallel);

queueConfig.EvtIoRead = ToasterEvtIoRead;
queueConfig.EvtIoWrite = ToasterEvtIoWrite;
queueConfig.EvtIoDeviceControl = ToasterEvtIoDeviceControl;

status = WdfIoQueueCreate(
hDevice,
&queueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
&queue);


status = WdfDeviceCreateDeviceInterface(
hDevice,
(LPGUID) &GUID_DEVINTERFACE_TOASTER,
NULL // ReferenceString
);

return status;
}
曹大夯 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 jq123 的回复:]
但是接下来调用SetupDiGetDeviceInterfaceDetail返回的device path长达250个字符,传给CreateFile后返回INVALID_HANDLE_VALUE,GetLastError()返回2。。不解?
[/Quote]

CreateFile/INVALID_HANDLE_VALUE/GetLastError/ERROR_FILE_NOT_FOUND = 2
CreateFile失败了。跟踪一下驱动里面IRP_MJ_CREATE相关的代码,或者是相关的回调函数。
JQ123 2010-12-29
  • 打赏
  • 举报
回复
问题解决了,把GUID_DEVINTERFACE_TOASTER = "{781EF630, 72B2, 11d2, B852, 00C04FAD5171}"改为GUID_DEVINTERFACE_TOASTER = "{781EF630-72B2-11d2-B852-00C04FAD5171}"就不出错了。。

但是接下来调用SetupDiGetDeviceInterfaceDetail返回的device path长达250个字符,传给CreateFile后返回INVALID_HANDLE_VALUE,GetLastError()返回2。。不解?

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧