#define NDEBUG
#include <debug.h>
-VOID StatusChangeEndpointCallBack(
+VOID NTAPI StatusChangeEndpointCallBack(
PVOID Context);
class CHubController : public IHubController,
virtual NTSTATUS HandlePnp(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp);
virtual NTSTATUS HandlePower(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp);
virtual NTSTATUS HandleDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp);
+ virtual NTSTATUS HandleSystemControl(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp);
// local functions
NTSTATUS HandleQueryInterface(PIO_STACK_LOCATION IoStack);
NTSTATUS HandleSyncResetAndClearStall(IN OUT PIRP Irp, PURB Urb);
NTSTATUS HandleAbortPipe(IN OUT PIRP Irp, PURB Urb);
- friend VOID StatusChangeEndpointCallBack(PVOID Context);
+ friend VOID NTAPI StatusChangeEndpointCallBack(PVOID Context);
// constructor / destructor
CHubController(IUnknown *OuterUnknown){}
//Internal Functions
- BOOLEAN QueryStatusChageEndpoint(PIRP Irp);
+ BOOLEAN QueryStatusChangeEndpoint(PIRP Irp);
};
typedef struct
// Queries the ports to see if there has been a device connected or removed.
//
BOOLEAN
-CHubController::QueryStatusChageEndpoint(
+CHubController::QueryStatusChangeEndpoint(
PIRP Irp)
{
ULONG PortCount, PortId;
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp)
{
- UNIMPLEMENTED
- Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+ Status = Irp->IoStatus.Status;
+ PoStartNextPowerIrp(Irp);
IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_NOT_IMPLEMENTED;
+ return Status;
+}
+
+//-----------------------------------------------------------------------------------------
+NTSTATUS
+CHubController::HandleSystemControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PIRP Irp)
+{
+ NTSTATUS Status;
+ Status = Irp->IoStatus.Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
}
//-----------------------------------------------------------------------------------------
if (Urb->UrbHeader.UsbdDeviceHandle == PVOID(this) || Urb->UrbHeader.UsbdDeviceHandle == NULL)
{
ASSERT(m_PendingSCEIrp == NULL);
- if (QueryStatusChageEndpoint(Irp))
+ if (QueryStatusChangeEndpoint(Irp))
{
- StatusChangeEndpointCallBack(this);
+ //
+ // We've seen a change already, so return immediately
+ //
return STATUS_SUCCESS;
}
// select configuration
//
Status = UsbDevice->SelectConfiguration(Urb->UrbSelectConfiguration.ConfigurationDescriptor, &Urb->UrbSelectConfiguration.Interface, &Urb->UrbSelectConfiguration.ConfigurationHandle);
- if (NT_SUCCESS(Status))
+ if (NT_SUCCESS(Status))
{
// successfully configured device
Urb->UrbSelectConfiguration.Hdr.Status = USBD_STATUS_SUCCESS;
Length = BufferLength > sizeof(USB_CONFIGURATION_DESCRIPTOR) ?
sizeof(USB_CONFIGURATION_DESCRIPTOR) : BufferLength;
RtlCopyMemory(Buffer, &ROOTHUB2_CONFIGURATION_DESCRIPTOR, Length);
-
+
//
// Check if we still have some space left
//
Length = BufferLength > sizeof(USB_INTERFACE_DESCRIPTOR) ?
sizeof(USB_INTERFACE_DESCRIPTOR) : BufferLength;
RtlCopyMemory(Buffer, &ROOTHUB2_INTERFACE_DESCRIPTOR, Length);
-
+
//
// Check if we still have some space left
//
//
Buffer += Length;
BufferLength -= Length;
-
-
+
+
//
// copy end point descriptor template
//
// get device
//
UsbDevice = PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle);
-
+
//
// Allocate temporary buffer
//
// perform work in IUSBDevice
//
UsbDevice->GetConfigurationDescriptors((PUSB_CONFIGURATION_DESCRIPTOR)Buffer, BufferLength, &Length);
-
+
//
// Copy what we can
//
- Length = Urb->UrbControlDescriptorRequest.TransferBufferLength > Length ?
+ Length = Urb->UrbControlDescriptorRequest.TransferBufferLength > Length ?
Length : Urb->UrbControlDescriptorRequest.TransferBufferLength;
RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, Buffer, Length);
-
+
//
// Free temporary buffer
//
return STATUS_SUCCESS;
}
-VOID StatusChangeEndpointCallBack(PVOID Context)
+VOID NTAPI StatusChangeEndpointCallBack(PVOID Context)
{
CHubController* This;
PIRP Irp;
}
This->m_PendingSCEIrp = NULL;
- This->QueryStatusChageEndpoint(Irp);
+ This->QueryStatusChangeEndpoint(Irp);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;