Implement IOCTL_USB_GET_NODE_CONNECTION_NAME,
IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME
Fix indices in IOCTL_USB_GET_NODE_CONNECTION_INFORMATION
Modified: trunk/reactos/drivers/usb/cromwell/hub/fdo.c
Modified: trunk/reactos/drivers/usb/cromwell/hub/pdo.c
Modified: trunk/reactos/drivers/usb/cromwell/hub/usbhub.h
_____
Modified: trunk/reactos/drivers/usb/cromwell/hub/fdo.c
--- trunk/reactos/drivers/usb/cromwell/hub/fdo.c 2005-06-20
05:36:32 UTC (rev 16138)
+++ trunk/reactos/drivers/usb/cromwell/hub/fdo.c 2005-06-20
05:54:19 UTC (rev 16139)
@@ -7,6 +7,7 @@
* PROGRAMMERS: HervÚ Poussineau (hpoussin(a)reactos.com)
*/
+#define INITGUID
#define NDEBUG
#include "usbhub.h"
@@ -117,7 +118,7 @@
sprintf(Buffer[0], "USB\\Vid_%04x&Pid_%04x&Rev_%04x",
PdoExtension->dev->descriptor.idVendor,
PdoExtension->dev->descriptor.idProduct,
- 0 /* FIXME: need to put the revision */);
+ PdoExtension->dev->descriptor.bcdDevice);
sprintf(Buffer[1], "USB\\Vid_%04x&Pid_%04x",
PdoExtension->dev->descriptor.idVendor,
PdoExtension->dev->descriptor.idProduct);
@@ -293,19 +294,47 @@
}
case IOCTL_USB_GET_NODE_CONNECTION_NAME:
{
+ PHUB_DEVICE_EXTENSION DeviceExtension;
PUSB_NODE_CONNECTION_NAME ConnectionName;
+ DeviceExtension =
(PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ ConnectionName =
(PUSB_NODE_CONNECTION_NAME)BufferOut;
DPRINT("Usbhub:
IOCTL_USB_GET_NODE_CONNECTION_NAME\n");
if (LengthOut <
sizeof(USB_NODE_CONNECTION_NAME))
Status = STATUS_BUFFER_TOO_SMALL;
+ else if (BufferOut == NULL)
+ Status = STATUS_INVALID_PARAMETER;
+ else if (ConnectionName->ConnectionIndex < 1
+ || ConnectionName->ConnectionIndex >
USB_MAXCHILDREN)
+ Status = STATUS_INVALID_PARAMETER;
+ else if
(DeviceExtension->Children[ConnectionName->ConnectionIndex - 1] == NULL)
+ Status = STATUS_INVALID_PARAMETER;
else
{
- ConnectionName =
(PUSB_NODE_CONNECTION_NAME)BufferOut;
- DPRINT1("Usbhub:
IOCTL_USB_GET_NODE_CONNECTION_NAME unimplemented\n");
- ConnectionName->ActualLength = 0;
- ConnectionName->NodeName[0] =
UNICODE_NULL;
- Information =
sizeof(USB_NODE_CONNECTION_NAME);
- Status = STATUS_SUCCESS;
+ ULONG NeededStructureSize;
+ DeviceExtension =
(PHUB_DEVICE_EXTENSION)DeviceExtension->Children[ConnectionName->Connect
ionIndex - 1]->DeviceExtension;
+ NeededStructureSize =
DeviceExtension->SymbolicLinkName.Length + sizeof(UNICODE_NULL) +
FIELD_OFFSET(USB_NODE_CONNECTION_NAME, NodeName);
+ if (ConnectionName->ActualLength <
NeededStructureSize / sizeof(WCHAR)
+ || LengthOut <
NeededStructureSize)
+ {
+ /* Buffer too small */
+ ConnectionName->ActualLength =
NeededStructureSize / sizeof(WCHAR);
+ Information =
sizeof(USB_NODE_CONNECTION_NAME);
+ Status =
STATUS_BUFFER_TOO_SMALL;
+ }
+ else
+ {
+ RtlCopyMemory(
+
ConnectionName->NodeName,
+
DeviceExtension->SymbolicLinkName.Buffer,
+
DeviceExtension->SymbolicLinkName.Length);
+
ConnectionName->NodeName[DeviceExtension->SymbolicLinkName.Length /
sizeof(WCHAR)] = UNICODE_NULL;
+ DPRINT("Usbhub:
IOCTL_USB_GET_NODE_CONNECTION_NAME returns '%S'\n",
ConnectionName->NodeName);
+ ConnectionName->ActualLength =
NeededStructureSize / sizeof(WCHAR);
+ Information =
NeededStructureSize;
+ Status = STATUS_SUCCESS;
+ }
+ Information = LengthOut;
}
break;
}
@@ -313,23 +342,29 @@
{
PUSB_NODE_CONNECTION_INFORMATION
ConnectionInformation;
struct usb_device* dev;
- //ULONG i;
+ ConnectionInformation =
(PUSB_NODE_CONNECTION_INFORMATION)BufferOut;
DPRINT("Usbhub:
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION\n");
if (LengthOut <
sizeof(USB_NODE_CONNECTION_INFORMATION))
Status = STATUS_BUFFER_TOO_SMALL;
else if (BufferOut == NULL)
Status = STATUS_INVALID_PARAMETER;
+ else if (ConnectionInformation->ConnectionIndex
< 1
+ ||
ConnectionInformation->ConnectionIndex > USB_MAXCHILDREN)
+ Status = STATUS_INVALID_PARAMETER;
else
{
- ConnectionInformation =
(PUSB_NODE_CONNECTION_INFORMATION)BufferOut;
DPRINT1("Usbhub:
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION partially implemented\n");
dev =
((PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->dev;
- dev =
dev->children[ConnectionInformation->ConnectionIndex = 0];
+ dev =
dev->children[ConnectionInformation->ConnectionIndex - 1];
if (dev == NULL)
{
/* No device connected to this
port */
-
RtlZeroMemory(ConnectionInformation,
sizeof(USB_NODE_CONNECTION_INFORMATION));
+ RtlZeroMemory(
+
&ConnectionInformation->DeviceDescriptor,
+
sizeof(USB_NODE_CONNECTION_INFORMATION) -
FIELD_OFFSET(USB_NODE_CONNECTION_INFORMATION, DeviceDescriptor));
+
ConnectionInformation->ConnectionStatus = NoDeviceConnected;
+ Information =
sizeof(USB_NODE_CONNECTION_INFORMATION);
Status = STATUS_SUCCESS;
break;
}
@@ -366,6 +401,41 @@
Status = STATUS_NOT_IMPLEMENTED;
break;
}
+ case IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME:
+ {
+ PHUB_DEVICE_EXTENSION DeviceExtension;
+ PUSB_NODE_CONNECTION_DRIVERKEY_NAME
StringDescriptor;
+ DPRINT("Usbhub:
IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME\n");
+ DeviceExtension =
(PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ StringDescriptor =
(PUSB_NODE_CONNECTION_DRIVERKEY_NAME)BufferOut;
+ if (LengthOut <
sizeof(USB_NODE_CONNECTION_DRIVERKEY_NAME))
+ Status = STATUS_BUFFER_TOO_SMALL;
+ else if (StringDescriptor == NULL)
+ Status = STATUS_INVALID_PARAMETER;
+ else if (StringDescriptor->ConnectionIndex < 1
+ || StringDescriptor->ConnectionIndex >
USB_MAXCHILDREN)
+ Status = STATUS_INVALID_PARAMETER;
+ else if
(DeviceExtension->Children[StringDescriptor->ConnectionIndex - 1] ==
NULL)
+ Status = STATUS_INVALID_PARAMETER;
+ else
+ {
+ ULONG StringSize;
+ Status = IoGetDeviceProperty(
+
DeviceExtension->Children[StringDescriptor->ConnectionIndex - 1],
+ DevicePropertyDriverKeyName,
+ LengthOut -
FIELD_OFFSET(USB_NODE_CONNECTION_DRIVERKEY_NAME, DriverKeyName),
+ StringDescriptor->DriverKeyName,
+ &StringSize);
+ if (NT_SUCCESS(Status) || Status ==
STATUS_BUFFER_TOO_SMALL)
+ {
+ DPRINT("Usbhub:
IOCTL_GET_HCD_DRIVERKEY_NAME returns '%S'\n",
StringDescriptor->DriverKeyName);
+ StringDescriptor->ActualLength =
StringSize + FIELD_OFFSET(USB_NODE_CONNECTION_DRIVERKEY_NAME,
DriverKeyName);
+ Information = LengthOut;
+ Status = STATUS_SUCCESS;
+ }
+ }
+ break;
+ }
default:
{
/* Pass Irp to lower driver */
_____
Modified: trunk/reactos/drivers/usb/cromwell/hub/pdo.c
--- trunk/reactos/drivers/usb/cromwell/hub/pdo.c 2005-06-20
05:36:32 UTC (rev 16138)
+++ trunk/reactos/drivers/usb/cromwell/hub/pdo.c 2005-06-20
05:54:19 UTC (rev 16139)
@@ -7,7 +7,7 @@
* PROGRAMMERS: HervÚ Poussineau (hpoussin(a)reactos.com)
*/
-//#define NDEBUG
+#define NDEBUG
#include <stdio.h>
#include "usbhub.h"
@@ -44,6 +44,42 @@
}
static NTSTATUS
+UsbhubPdoStartDevice(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PHUB_DEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
+
+ DeviceExtension =
(PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ DbgBreakPoint();
+
+ /* Register device interface */
+ /* FIXME: when should we activate this interface? */
+ Status = IoRegisterDeviceInterface(
+ DeviceObject,
+ DeviceExtension->dev->descriptor.bDeviceClass ==
USB_CLASS_HUB ?
+ &GUID_DEVINTERFACE_USB_HUB :
+ &GUID_DEVINTERFACE_USB_DEVICE,
+ NULL, /* Reference string */
+ &DeviceExtension->SymbolicLinkName);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("Usbhub: IoRegisterDeviceInterface() failed with
status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ Status =
IoSetDeviceInterfaceState(&DeviceExtension->SymbolicLinkName, TRUE);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("Usbhub: IoSetDeviceInterfaceState() failed with
status 0x%08lx\n", Status);
+ return Status;
+ }
+
+ return STATUS_SUCCESS;
+}
+
+static NTSTATUS
UsbhubPdoQueryId(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
@@ -111,6 +147,12 @@
switch (MinorFunction)
{
+ case IRP_MN_START_DEVICE: /* 0x0 */
+ {
+ DPRINT("Usbhub: IRP_MJ_PNP /
IRP_MN_START_DEVICE\n");
+ Status = UsbhubPdoStartDevice(DeviceObject,
Irp);
+ break;
+ }
case IRP_MN_QUERY_ID: /* 0x13 */
{
Status = UsbhubPdoQueryId(DeviceObject, Irp,
&Information);
_____
Modified: trunk/reactos/drivers/usb/cromwell/hub/usbhub.h
--- trunk/reactos/drivers/usb/cromwell/hub/usbhub.h 2005-06-20
05:36:32 UTC (rev 16138)
+++ trunk/reactos/drivers/usb/cromwell/hub/usbhub.h 2005-06-20
05:54:19 UTC (rev 16139)
@@ -28,6 +28,7 @@
UNICODE_STRING InstanceId; // REG_SZ
UNICODE_STRING HardwareIds; // REG_MULTI_SZ
UNICODE_STRING CompatibleIds; // REG_MULTI_SZ
+ UNICODE_STRING SymbolicLinkName;
} HUB_DEVICE_EXTENSION, *PHUB_DEVICE_EXTENSION;
/* createclose.c */