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}"