Author: janderwald
Date: Mon Jan 30 12:42:05 2012
New Revision: 55326
URL:
http://svn.reactos.org/svn/reactos?rev=55326&view=rev
Log:
[USBCCGP]
- Add function to append interface number
- Append function number to BusQueryDeviceId / BusQueryInstanceId
- USBCCGP is now properly enumerated and its child device start to get installed
Modified:
branches/usb-bringup-trunk/drivers/usb/usbccgp/pdo.c
Modified: branches/usb-bringup-trunk/drivers/usb/usbccgp/pdo.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbccgp/pdo.c [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbccgp/pdo.c [iso-8859-1] Mon Jan 30 12:42:05
2012
@@ -122,6 +122,64 @@
//
return STATUS_SUCCESS;
}
+
+NTSTATUS
+USBCCGP_PdoAppendInterfaceNumber(
+ IN LPWSTR DeviceId,
+ IN ULONG InterfaceNumber,
+ OUT LPWSTR *OutString)
+{
+ ULONG Length = 0, StringLength;
+ LPWSTR String;
+
+ //
+ // count length of string
+ //
+ String = DeviceId;
+ while(*String)
+ {
+ StringLength = wcslen(String) + 1;
+ Length += StringLength;
+ Length += 6; //&MI_XX
+ String += StringLength;
+ }
+
+ //
+ // now allocate the buffer
+ //
+ String = AllocateItem(NonPagedPool, (Length + 2) * sizeof(WCHAR));
+ if (!String)
+ {
+ //
+ // no memory
+ //
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ //
+ // store result
+ //
+ *OutString = String;
+
+ while(*DeviceId)
+ {
+ StringLength = swprintf(String, L"%s&MI_%02x", DeviceId) + 1;
+ Length = wcslen(DeviceId) + 1;
+ DPRINT1("String %p\n", String);
+
+ //
+ // next string
+ //
+ String += StringLength;
+ DeviceId += Length;
+ }
+
+ //
+ // success
+ //
+ return STATUS_SUCCESS;
+}
+
NTSTATUS
USBCCGP_PdoHandleQueryId(
@@ -152,11 +210,32 @@
// handle query device id
//
Status = USBCCGP_SyncForwardIrp(PDODeviceExtension->NextDeviceObject, Irp);
-
- //
- // FIXME append interface id
- //
- UNIMPLEMENTED
+ if (NT_SUCCESS(Status))
+ {
+ //
+ // allocate buffer
+ //
+ Buffer = AllocateItem(NonPagedPool,
(wcslen((LPWSTR)Irp->IoStatus.Information) + 7) * sizeof(WCHAR));
+ if (Buffer)
+ {
+ //
+ // append interface number
+ //
+ ASSERT(Irp->IoStatus.Information);
+ swprintf(Buffer, L"%s&MI_%02x",
(LPWSTR)Irp->IoStatus.Information,
PDODeviceExtension->FunctionDescriptor->FunctionNumber);
+ DPRINT1("BusQueryDeviceID %S\n", Buffer);
+
+ ExFreePool((PVOID)Irp->IoStatus.Information);
+ Irp->IoStatus .Information = (ULONG_PTR)Buffer;
+ }
+ else
+ {
+ //
+ // no memory
+ //
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ }
+ }
return Status;
}
else if (IoStack->Parameters.QueryId.IdType == BusQueryHardwareIDs)
@@ -171,8 +250,21 @@
//
// handle instance id
//
- RtlInitUnicodeString(&TempString, L"0000");
- DeviceString = &TempString;
+ Buffer = AllocateItem(NonPagedPool, 5 * sizeof(WCHAR));
+ if (!Buffer)
+ {
+ //
+ // no memory
+ //
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ //
+ // use function number
+ //
+ swprintf(Buffer, L"%04x",
PDODeviceExtension->FunctionDescriptor->FunctionNumber);
+ Irp->IoStatus.Information = (ULONG_PTR)Buffer;
+ return STATUS_SUCCESS;
}
else if (IoStack->Parameters.QueryId.IdType == BusQueryCompatibleIDs)
{
@@ -202,8 +294,9 @@
//
// copy buffer
//
+ RtlCopyMemory(Buffer, DeviceString->Buffer, DeviceString->Length);
Irp->IoStatus.Information = (ULONG_PTR)Buffer;
- RtlCopyMemory(Buffer, DeviceString->Buffer, DeviceString->Length);
+
return STATUS_SUCCESS;
}