[WDK] DeviceIoControl plötzlich fehlerhaft

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Ich versuche momentan geleitet von diesem Code (der in einem Test ohne den nachfolgenden Fehler funktionierte, der in meiner "Reproduktion" auftritt) zu schauen, welche USB-Geräte sich an meiner Maschine befinden: http://www.intel.com/intelpress/usb/examples/DUSBVC.PDF

Und zwar habe ich nun folgenden Ausschnitt:
Code:
void CDeviceEnum::EnumerateRootDevices(HANDLE hRoot, NODE_INFORMATION& info)
{
	USB_DESCRIPTOR_REQUEST req;
	DWORD dwBytes = 0;
	for(int index = 1; index < info.HubDesc.bNumPorts + 1; ++index)
	{
		memset(&req, NULL, sizeof(req));
		USB_NODE_CONNECTION_INFORMATION ci;
		ci.ConnectionIndex = index;
		DeviceIoControl(hRoot, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION, &ci, sizeof(ci), &ci, sizeof(ci), &dwBytes, 0);
		if(ci.ConnectionStatus != DeviceConnected)
			continue;
		if(ci.DeviceIsHub)
			continue;
		
		req.ConnectionIndex = index;
		req.SetupPacket.bmRequest = 0x80;
		req.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR;
		req.SetupPacket.wValue = USB_STRING_DESCRIPTOR_TYPE << 8;
		req.SetupPacket.wLength = 4;

		if(!DeviceIoControl(hRoot, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
			&req, sizeof(req), &req, sizeof(req), &dwBytes, NULL))
		{
			std::cout << "-> GetLangId: " << GetLastError() << std::endl;
			continue;
		}

		USHORT langId = req.Data[2] + ((USHORT)req.Data[3] << 8);
		memset(&req, NULL, sizeof(req));
		req.ConnectionIndex = index;
		req.SetupPacket.bmRequest = 0x80;
		req.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR;
		req.SetupPacket.wValue = ci.DeviceDescriptor.iProduct | (USB_STRING_DESCRIPTOR_TYPE << 8);
		req.SetupPacket.wValue = USB_STRING_DESCRIPTOR_TYPE;
		req.SetupPacket.wIndex = langId;
		req.SetupPacket.wLength = 255;

		if(!DeviceIoControl(hRoot, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
			&req, sizeof(req), &req, sizeof(req), &dwBytes, NULL))
		{
			std::cout << "-> GetString: " << GetLastError() << std::endl;
			continue;
		}
	}
}


Hierbei funktioniert soweit alles perfekt bis auf die Tatsache, dass ab dem ersten geprüften DeviceIoControl mit dem Request der ErrorCode 2 auftritt. USB_CONNECTION_INFORMATION ci beinhält jedoch genau die richtigen Werte, das habe ich dann auch mit der Ausgabe des funktionierenden Intel-Codes abegeglichen. Allerdings erzeugt mein Code da den FILE_NOT_FOUND-Fehler, während derjenige von Intel dieses Problem nicht zu kennen scheint.

Übersehe ich auf Grund der fortgeschrittenen Uhrzeit etwas?

Besten Dank und Gruss
Cromon
 

Neue Beiträge

Zurück