From b6256418e9e291d5c1d1e52c36ebb0517c32d0c5 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 13 Apr 2011 04:33:14 +0000 Subject: [PATCH 01/10] [USB\USBEHCI] - Fix linking of QueueHeads. Implement LinkQueueHeadToCompletedList and CleanupAsyncList. These functions are used to software link the completed queueheads to a completed list. Only after the driver handshakes with the controller can this memory be freed. Fix a few incorrect values for QueueHead. - EhciDefferedRoutine: Implement handling of completed QueueHeads by removing them from the AnsycList and setting any errors for failure. - Reserved a QueueHead that will always be in the AsyncList Address Register. By setting it as the Head of Reclamation the controller can know when it has reached the end of the QueueHead list. - Remove all code from FdoDispatchInternalDeviceControl. This should never be called by upper level drivers. Change 1 of 3. svn path=/trunk/; revision=51325 --- reactos/drivers/usb/usbehci/fdo.c | 628 +++++++++---------------- reactos/drivers/usb/usbehci/hardware.h | 30 +- reactos/drivers/usb/usbehci/hwiface.c | 103 +++- reactos/drivers/usb/usbehci/hwiface.h | 9 +- 4 files changed, 341 insertions(+), 429 deletions(-) diff --git a/reactos/drivers/usb/usbehci/fdo.c b/reactos/drivers/usb/usbehci/fdo.c index 645f4cb6e24..805d43ebd2a 100644 --- a/reactos/drivers/usb/usbehci/fdo.c +++ b/reactos/drivers/usb/usbehci/fdo.c @@ -21,10 +21,11 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO ULONG tmp; ULONG OpRegisters; PEHCI_HOST_CONTROLLER hcd; - LONG i; + int i; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeferredContext; + /* Nothing is valid if the Pdo is NULL */ if (!FdoDeviceExtension->Pdo) { DPRINT1("PDO not set yet!\n"); @@ -36,127 +37,183 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO OpRegisters = (ULONG)FdoDeviceExtension->hcd.OpRegisters; hcd = &FdoDeviceExtension->hcd; - + CStatus = (ULONG) SystemArgument2; - - /* TD retired or Error */ - if (CStatus & (EHCI_STS_INT | EHCI_ERROR_INT)) + /* If Reclamation (The QueueHead list has been transveresed twice), + look through the queuehead list and find queue heads that have been + 1. Halted due to error + 2. Transfer completion. + Move these QueueHeads to a temporary list that is used to pend memory release. + Either an Event is signalled or an Irp is completed depending on what was set during transfer request + setup. Next software issue a "DoorBell" that informs the controller the Asynchronous List is about to + be modified. + After the controller acks this with interrupt, the memory for queueheads are released. */ + + if (CStatus & (EHCI_STS_RECL| EHCI_STS_INT | EHCI_ERROR_INT)) { - DPRINT("Asyn Complete!\n"); - ULONG CurrentAddr, OffSet; - PQUEUE_HEAD CompletedQH, NextQH; - PQUEUE_TRANSFER_DESCRIPTOR CompletedTD, NextTD; - - /* AsyncListAddr Register will have the next QueueHead to execute */ - CurrentAddr = GetAsyncListQueueRegister(hcd); + PQUEUE_HEAD CurrentQH; + PQUEUE_TRANSFER_DESCRIPTOR CurrentTD; + BOOLEAN QueueHeadCompleted; - /* Calculate the VA for the next QueueHead */ - OffSet = CurrentAddr - (ULONG)FdoDeviceExtension->hcd.CommonBufferPA.LowPart; - NextQH = (PQUEUE_HEAD)((ULONG)FdoDeviceExtension->hcd.CommonBufferVA + OffSet); + /* Go through the list and delink completed (not active) QueueHeads */ + CurrentQH = hcd->AsyncListQueue; + CurrentQH = CurrentQH->NextQueueHead; - /* Get the previous QueueHead which is the QueueHead just completed */ - CompletedQH = NextQH->PreviousQueueHead; - ASSERT(CompletedQH); - DPRINT("CompletedQH %x\n", CompletedQH); - - //DumpQueueHead(CompletedQH); - - /* Free memory for the Descriptors */ - CompletedTD = CompletedQH->TransferDescriptor; - NextTD = CompletedTD; - while (NextTD) + while ((CurrentQH) && (CurrentQH != hcd->AsyncListQueue)) { - CompletedTD = NextTD; - NextTD = NextTD->NextDescriptor; - FreeDescriptor(CompletedTD); - } - - /* If the Event is set then release waiter */ - if (CompletedQH->Event) - { - KeSetEvent(CompletedQH->Event, IO_NO_INCREMENT, FALSE); - } + DPRINT1("Checking QueueHead %x, Next %x\n", CurrentQH, CurrentQH->NextQueueHead); + DPRINT1("Active %d, Halted %d\n", CurrentQH->Token.Bits.Active, CurrentQH->Token.Bits.Halted); - /* Free the Mdl if there was one */ - if(CompletedQH->MdlToFree) - IoFreeMdl(CompletedQH->MdlToFree); - - /* Is there an IRP that needs to be completed */ - if (CompletedQH->IrpToComplete) - { - PIRP Irp; - PIO_STACK_LOCATION Stack; - PURB Urb; - - Irp = CompletedQH->IrpToComplete; - Stack = IoGetCurrentIrpStackLocation(Irp); - ASSERT(Stack); - Urb = (PURB) Stack->Parameters.Others.Argument1; - - /* Check for error */ - if (CStatus & EHCI_ERROR_INT) + /* if the QueueHead has completed */ + if (!CurrentQH->Token.Bits.Active) { - /* Haled bit should be set */ - if (CompletedQH->Token.Bits.Halted) + /* Assume success */ + USBD_STATUS UrbStatus = USBD_STATUS_SUCCESS; + + QueueHeadCompleted = TRUE; + + /* Check the Status of the QueueHead */ + if (CurrentQH->Token.Bits.Halted) { - if (CompletedQH->Token.Bits.DataBufferError) + if (CurrentQH->Token.Bits.DataBufferError) { DPRINT1("Data buffer error\n"); - Urb->UrbHeader.Status = USBD_STATUS_DATA_BUFFER_ERROR; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; + UrbStatus = USBD_STATUS_DATA_BUFFER_ERROR; } - else if (CompletedQH->Token.Bits.BabbleDetected) + else if (CurrentQH->Token.Bits.BabbleDetected) { DPRINT1("Babble Detected\n"); - Urb->UrbHeader.Status = USBD_STATUS_BABBLE_DETECTED; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; + UrbStatus = USBD_STATUS_BABBLE_DETECTED; } else { DPRINT1("Stall PID\n"); - Urb->UrbHeader.Status = USBD_STATUS_STALL_PID; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Information = 0; + UrbStatus = USBD_STATUS_STALL_PID; } } - } - else - { - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - DPRINT1("Completing Irp\n"); + + /* Check the Descriptors */ + CurrentTD = CurrentQH->FirstTransferDescriptor; + while (CurrentTD) + { + /* FIXME: What needs to happen if the QueueHead was marked as complete but descriptors was not */ + if ((CurrentTD->Token.Bits.Active) || (CurrentTD->Token.Bits.Halted)) + { + /* The descriptor was not completed */ + QueueHeadCompleted = FALSE; + DPRINT1("QueueHead was marked as completed but contains descriptors that were not completed\n"); + ASSERT(FALSE); + break; + } + CurrentTD = CurrentTD->NextDescriptor; + } + if ((QueueHeadCompleted) || (CurrentQH->Token.Bits.Halted)) + { + PQUEUE_HEAD FreeQH; + + FreeQH = CurrentQH; + CurrentQH = CurrentQH->NextQueueHead; + DPRINT1("QueueHead %x has completed. Removing\n", FreeQH); + /* Move it into the completed list */ + UnlinkQueueHead(hcd, FreeQH); + LinkQueueHeadToCompletedList(hcd, FreeQH); + DPRINT1("Remove done\n"); + + /* If the Event is set then the caller is waiting on completion */ + if (FreeQH->Event) + { + KeSetEvent(FreeQH->Event, IO_NO_INCREMENT, FALSE); + } + + /* If there is an IrpToComplete then the caller did not wait on completion + and the IRP was marked as PENDING. Complete it now. */ + if (FreeQH->IrpToComplete) + { + PIRP Irp; + PIO_STACK_LOCATION Stack; + PURB Urb; + + Irp = FreeQH->IrpToComplete; + Stack = IoGetCurrentIrpStackLocation(Irp); + ASSERT(Stack); + Urb = (PURB) Stack->Parameters.Others.Argument1; + ASSERT(Urb); + + /* Check for error */ + if (CStatus & EHCI_ERROR_INT) + { + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; + /* Set BufferLength to 0 as there was error */ + if (Urb->UrbHeader.Function == URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = 0; + } + DPRINT1("There was an Error, TransferBufferLength set to 0\n"); + } + else + { + if (Urb->UrbHeader.Function == URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE) + { + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= + ((PUSB_COMMON_DESCRIPTOR)(Urb->UrbControlDescriptorRequest.TransferBuffer))->bLength) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = + ((PUSB_COMMON_DESCRIPTOR)(Urb->UrbControlDescriptorRequest.TransferBuffer))->bLength; + } + } + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + DPRINT1("Completing Irp\n"); + } + Urb->UrbHeader.Status = UrbStatus; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + /* FIXME: Move to static function */ + PEHCI_USBCMD_CONTENT UsbCmd; + /* Ring the DoorBell so that host controller knows a QueueHead was removed */ + DPRINT1("Ringing Doorbell\n"); + tmp = READ_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD)); + UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; + UsbCmd->DoorBell = TRUE; + WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD), tmp); + continue; + } } - IoCompleteRequest(Irp, IO_NO_INCREMENT); + + CurrentQH = CurrentQH->NextQueueHead; } - - /* Unlink QueueHead */ - UnlinkQueueHead(hcd, CompletedQH); - /* Wait for a complete AsnycList tranversal before deleting? */ - DeleteQueueHead(CompletedQH); } - /* Port Change */ + + /* Port Change. */ + /* FIXME: Use EnumControllerPorts instead */ if (CStatus & EHCI_STS_PCD) { /* Loop through the ports */ - for (i = 0; i < FdoDeviceExtension->hcd.ECHICaps.HCSParams.PortCount; i++) + for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) { tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i))); /* Check for port change on this port */ if (tmp & 0x02) { + /* Clear status change */ + tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); + tmp |= 0x02; + WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp); + /* Connect or Disconnect? */ if (tmp & 0x01) { DPRINT1("Device connected on port %d\n", i); /* Check if a companion host controller exists */ - if (FdoDeviceExtension->hcd.ECHICaps.HCSParams.CHCCount) + if (hcd->ECHICaps.HCSParams.CHCCount) { tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); @@ -178,6 +235,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO KeStallExecutionProcessor(30); + /* FIXME: Hub driver does this also, is it needed here? */ /* As per USB 2.0 Specs, 9.1.2. Reset the port and clear the status change */ //tmp |= 0x100 | 0x02; /* Sanity, Disable port */ @@ -190,21 +248,16 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); PdoDeviceExtension->ChildDeviceCount++; - PdoDeviceExtension->Ports[i].PortStatus &= ~0x8000; - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED; - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT; - PdoDeviceExtension->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; + hcd->Ports[i].PortStatus &= ~0x8000; + hcd->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED; + hcd->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT; + hcd->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; DPRINT1("Completing URB\n"); CompletePendingURBRequest(PdoDeviceExtension); } else { DPRINT1("Device disconnected on port %d\n", i); - - /* Clear status change */ - tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); - tmp |= 0x02; - WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp); } } } @@ -214,6 +267,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO if (CStatus & EHCI_STS_IAA) { DPRINT1("Async Advance!\n"); + CleanupAsyncList(hcd); } } @@ -232,7 +286,7 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext) /* Read device status */ CStatus = ReadControllerStatus(hcd); - CStatus &= (EHCI_ERROR_INT | EHCI_STS_INT | EHCI_STS_IAA | EHCI_STS_PCD | EHCI_STS_FLR); + CStatus &= (EHCI_ERROR_INT | EHCI_STS_INT | EHCI_STS_IAA | EHCI_STS_PCD | EHCI_STS_FLR | EHCI_STS_RECL); if ((!CStatus) || (FdoDeviceExtension->DeviceState == 0)) { @@ -243,9 +297,22 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext) /* Clear status */ ClearControllerStatus(hcd, CStatus); + if (CStatus & EHCI_STS_RECL) + { + DPRINT("Reclamation\n"); + } + if (CStatus & EHCI_ERROR_INT) { DPRINT1("EHCI Status=0x%x\n", CStatus); + /* This check added in case the NT USB Driver is still loading. + It will cause this error condition at every device connect. */ + if(CStatus & EHCI_STS_PCD) + { + DPRINT1("EHCI Error: Another driver may be interfering with proper operation of this driver\n"); + DPRINT1(" Hint: Ensure that the old NT Usb Driver has been removed!\n"); + ASSERT(FALSE); + } } if (CStatus & EHCI_STS_FATAL) @@ -270,6 +337,7 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART PFDO_DEVICE_EXTENSION FdoDeviceExtension; PCM_PARTIAL_RESOURCE_DESCRIPTOR resource; DEVICE_DESCRIPTION DeviceDescription; + PEHCI_HOST_CONTROLLER hcd; ULONG NumberResources; ULONG iCount; ULONG DeviceAddress; @@ -278,26 +346,21 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART NTSTATUS Status; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + hcd = &FdoDeviceExtension->hcd; + /* Sanity Checks */ Status = IoGetDeviceProperty(FdoDeviceExtension->LowerDevice, DevicePropertyAddress, sizeof(ULONG), &DeviceAddress, &PropertySize); - if (NT_SUCCESS(Status)) - { - DPRINT1("--->DeviceAddress: %x\n", DeviceAddress); - } Status = IoGetDeviceProperty(FdoDeviceExtension->LowerDevice, DevicePropertyBusNumber, sizeof(ULONG), &BusNumber, &PropertySize); - if (NT_SUCCESS(Status)) - { - DPRINT1("--->BusNumber: %x\n", BusNumber); - } + /* Get the resources the PNP Manager gave */ NumberResources = translated->Count; @@ -364,11 +427,21 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART } } + for (iCount = 0; iCount < hcd->ECHICaps.HCSParams.PortCount; iCount++) + { + hcd->Ports[iCount].PortStatus = 0x8000; + hcd->Ports[iCount].PortChange = 0; + + if (hcd->ECHICaps.HCSParams.PortPowerControl) + hcd->Ports[iCount].PortStatus |= USB_PORT_STATUS_POWER; + } + KeInitializeDpc(&FdoDeviceExtension->DpcObject, EhciDefferedRoutine, FdoDeviceExtension); RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION)); + DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; DeviceDescription.Master = TRUE; DeviceDescription.ScatterGather = TRUE; @@ -377,20 +450,24 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART DeviceDescription.InterfaceType = PCIBus; DeviceDescription.MaximumLength = EHCI_MAX_SIZE_TRANSFER; - FdoDeviceExtension->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice, - &DeviceDescription, - &FdoDeviceExtension->MapRegisters); + hcd->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice, + &DeviceDescription, + &hcd->MapRegisters); - if (FdoDeviceExtension->pDmaAdapter == NULL) + if (hcd->pDmaAdapter == NULL) { DPRINT1("Ehci: IoGetDmaAdapter failed!\n"); ASSERT(FALSE); } + DPRINT1("MapRegisters %x\n", hcd->MapRegisters); + /* Allocate Common Buffer for Periodic Frame List */ FdoDeviceExtension->PeriodicFrameList.VirtualAddr = - FdoDeviceExtension->pDmaAdapter->DmaOperations->AllocateCommonBuffer(FdoDeviceExtension->pDmaAdapter, - sizeof(ULONG) * 1024, &FdoDeviceExtension->PeriodicFrameList.PhysicalAddr, FALSE); + hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter, + sizeof(ULONG) * 1024, + &FdoDeviceExtension->PeriodicFrameList.PhysicalAddr, + FALSE); if (FdoDeviceExtension->PeriodicFrameList.VirtualAddr == NULL) { @@ -403,36 +480,53 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART ExInitializeFastMutex(&FdoDeviceExtension->FrameListMutex); - /* Allocate pages for queueheads and descriptors */ - FdoDeviceExtension->hcd.CommonBufferVA = - FdoDeviceExtension->pDmaAdapter->DmaOperations->AllocateCommonBuffer(FdoDeviceExtension->pDmaAdapter, - PAGE_SIZE * 16, - &FdoDeviceExtension->hcd.CommonBufferPA, - FALSE); + /* Allocate initial page for queueheads and descriptors */ + FdoDeviceExtension->hcd.CommonBufferVA[0] = + hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter, + PAGE_SIZE, + &FdoDeviceExtension->hcd.CommonBufferPA[0], + FALSE); - if (FdoDeviceExtension->hcd.CommonBufferVA == 0) + if (FdoDeviceExtension->hcd.CommonBufferVA[0] == 0) { DPRINT1("Ehci: Failed to allocate common buffer!\n"); return STATUS_UNSUCCESSFUL; } - FdoDeviceExtension->hcd.CommonBufferSize = PAGE_SIZE * 16; + hcd->CommonBufferSize = PAGE_SIZE * 16; /* Zeroize it */ - RtlZeroMemory(FdoDeviceExtension->hcd.CommonBufferVA, - PAGE_SIZE * 16); + RtlZeroMemory(FdoDeviceExtension->hcd.CommonBufferVA[0], + PAGE_SIZE); /* Init SpinLock for host controller device lock */ - KeInitializeSpinLock(&FdoDeviceExtension->hcd.Lock); + KeInitializeSpinLock(&hcd->Lock); - /* Reserved a Queue Head that will always be in the AsyncList Address Register */ - FdoDeviceExtension->hcd.AsyncListQueue = CreateQueueHead(&FdoDeviceExtension->hcd); - FdoDeviceExtension->hcd.AsyncListQueue->HorizontalLinkPointer = FdoDeviceExtension->hcd.AsyncListQueue->PhysicalAddr | QH_TYPE_QH; - FdoDeviceExtension->hcd.AsyncListQueue->EndPointCharacteristics.QEDTDataToggleControl = FALSE; - FdoDeviceExtension->hcd.AsyncListQueue->Token.Bits.InterruptOnComplete = FALSE; + /* Reserved a Queue Head that will always be in the AsyncList Address Register. By setting it as the Head of Reclamation + the controller can know when it has reached the end of the QueueHead list */ + hcd->AsyncListQueue = CreateQueueHead(hcd); + hcd->AsyncListQueue->HorizontalLinkPointer = hcd->AsyncListQueue->PhysicalAddr | QH_TYPE_QH; + hcd->AsyncListQueue->EndPointCharacteristics.QEDTDataToggleControl = FALSE; + hcd->AsyncListQueue->Token.Bits.InterruptOnComplete = FALSE; + hcd->AsyncListQueue->EndPointCharacteristics.HeadOfReclamation = TRUE; + hcd->AsyncListQueue->Token.Bits.Halted = TRUE; + hcd->AsyncListQueue->NextQueueHead = hcd->AsyncListQueue; + hcd->AsyncListQueue->PreviousQueueHead = hcd->AsyncListQueue; + + /* Reserve a Queue Head thats only purpose is for linking completed Queue Heads. + Completed QueueHeads are moved to this temporary. As the memory must still be valid + up until the controllers doorbell is rang to let it know info has been removed from QueueHead list */ + hcd->CompletedListQueue = CreateQueueHead(hcd); + hcd->CompletedListQueue->NextQueueHead = hcd->CompletedListQueue; + hcd->CompletedListQueue->PreviousQueueHead = hcd->CompletedListQueue; + /* Ensure the controller is stopped */ - StopEhci(&FdoDeviceExtension->hcd); + StopEhci(hcd); + + SetAsyncListQueueRegister(hcd, hcd->AsyncListQueue->PhysicalAddr); + + /* FIXME: Implement Periodic Frame List */ Status = IoConnectInterrupt(&FdoDeviceExtension->EhciInterrupt, InterruptService, @@ -446,10 +540,8 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART FdoDeviceExtension->Affinity, FALSE); - StartEhci(&FdoDeviceExtension->hcd); - DPRINT1("AsycnAddr %x\n", GetAsyncListQueueRegister(&FdoDeviceExtension->hcd)); + StartEhci(hcd); FdoDeviceExtension->DeviceState = DEVICESTARTED; - return STATUS_SUCCESS; } @@ -472,6 +564,10 @@ FdoQueryBusRelations( DPRINT1("Ehci: QueryBusRelations\n"); + /* FIXME: Currently only support for one ehci controller */ + if (DeviceExtension->Pdo) + goto Done; + /* Create the PDO with the next available number */ while (TRUE) { @@ -513,9 +609,10 @@ FdoQueryBusRelations( PdoDeviceExtension->ControllerFdo = DeviceObject; PdoDeviceExtension->DeviceObject = Pdo; - PdoDeviceExtension->NumberOfPorts = DeviceExtension->hcd.ECHICaps.HCSParams.PortCount; + //PdoDeviceExtension->NumberOfPorts = DeviceExtension->hcd.ECHICaps.HCSParams.PortCount; InitializeListHead(&PdoDeviceExtension->IrpQueue); + KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock); KeInitializeEvent(&PdoDeviceExtension->QueueDrainedEvent, SynchronizationEvent, TRUE); @@ -525,7 +622,7 @@ FdoQueryBusRelations( Pdo->Flags &= ~DO_DEVICE_INITIALIZING; DeviceExtension->Pdo = Pdo; - +Done: DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); if (!DeviceRelations) @@ -534,8 +631,8 @@ FdoQueryBusRelations( } DeviceRelations->Count = 1; - DeviceRelations->Objects[0] = Pdo; - ObReferenceObject(Pdo); + DeviceRelations->Objects[0] = DeviceExtension->Pdo; + ObReferenceObject(DeviceExtension->Pdo); *pDeviceRelations = DeviceRelations; return STATUS_SUCCESS; @@ -705,6 +802,7 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) ASSERT(FdoDeviceExtension->LowerDevice == Pdo); + /* Get the EHCI Device ID and Vendor ID */ Status = GetBusInterface(FdoDeviceExtension->LowerDevice, &FdoDeviceExtension->BusInterface); if (!NT_SUCCESS(Status)) @@ -772,270 +870,8 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) NTSTATUS NTAPI FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { - PFDO_DEVICE_EXTENSION FdoDeviceExtension; - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PIO_STACK_LOCATION Stack = NULL; - NTSTATUS Status = STATUS_UNSUCCESSFUL; - ULONG_PTR Information = 0; - PUSB_DEVICE UsbDevice = NULL; - URB *Urb; - - /*FIXME: This should never be called by upper drivers as they should only be dealing with the pdo */ - - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension; - - ASSERT(FdoDeviceExtension->Common.IsFdo == TRUE); - - Stack = IoGetCurrentIrpStackLocation(Irp); - - ASSERT(Stack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_SUBMIT_URB); - - Urb = (PURB) Stack->Parameters.Others.Argument1; - DPRINT("Header Length %d\n", Urb->UrbHeader.Length); - DPRINT("Header Function %d\n", Urb->UrbHeader.Function); - - UsbDevice = DeviceHandleToUsbDevice(PdoDeviceExtension, Urb->UrbHeader.UsbdDeviceHandle); - - if (!UsbDevice) - { - DPRINT1("Ehci: Invalid DeviceHandle or device not connected\n"); - return STATUS_DEVICE_NOT_CONNECTED; - } - switch (Urb->UrbHeader.Function) - { - case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: - { - DPRINT1("Ehci: URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); - break; - } - case URB_FUNCTION_GET_STATUS_FROM_DEVICE: - { - DPRINT1("Ehci: URB_FUNCTION_GET_STATUS_FROM_DEVICE\n"); - break; - } - case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: - { - DPRINT1("Ehci: URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n"); - switch(Urb->UrbControlDescriptorRequest.DescriptorType) - { - case USB_DEVICE_DESCRIPTOR_TYPE: - { - DPRINT1("USB DEVICE DESC\n"); - break; - } - case USB_CONFIGURATION_DESCRIPTOR_TYPE: - DPRINT1("USB CONFIG DESC\n"); - //break; - case USB_STRING_DESCRIPTOR_TYPE: - { - DPRINT1("Usb String Descriptor\n"); - break; - } - default: - { - DPRINT1("Ehci: Descriptor Type %x not supported!\n", Urb->UrbControlDescriptorRequest.DescriptorType); - } - } - break; - } - case URB_FUNCTION_SELECT_CONFIGURATION: - { - DPRINT1("Ehci: URB_FUNCTION_SELECT_CONFIGURATION\n"); - DPRINT1("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); - break; - } - case URB_FUNCTION_CLASS_DEVICE: - { - DPRINT1("Ehci: URB_FUNCTION_CLASS_DEVICE %x\n",Urb->UrbControlVendorClassRequest.Request); - switch (Urb->UrbControlVendorClassRequest.Request) - { - case USB_REQUEST_GET_DESCRIPTOR: - { - DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); - DPRINT1("Urb->UrbControlVendorClassRequest.Value %x\n", Urb->UrbControlVendorClassRequest.Value); - - switch (Urb->UrbControlVendorClassRequest.Value >> 8) - { - case USB_DEVICE_CLASS_AUDIO: - { - DPRINT1("USB_DEVICE_CLASS_AUDIO\n"); - break; - } - case USB_DEVICE_CLASS_COMMUNICATIONS: - { - DPRINT1("USB_DEVICE_CLASS_COMMUNICATIONS\n"); - break; - } - case USB_DEVICE_CLASS_HUMAN_INTERFACE: - { - DPRINT1("USB_DEVICE_CLASS_HUMAN_INTERFACE\n"); - break; - } - case USB_DEVICE_CLASS_MONITOR: - { - DPRINT1("USB_DEVICE_CLASS_MONITOR\n"); - break; - } - case USB_DEVICE_CLASS_PHYSICAL_INTERFACE: - { - DPRINT1("USB_DEVICE_CLASS_PHYSICAL_INTERFACE\n"); - break; - } - case USB_DEVICE_CLASS_POWER: - { - DPRINT1("USB_DEVICE_CLASS_POWER\n"); - break; - } - case USB_DEVICE_CLASS_PRINTER: - { - DPRINT1("USB_DEVICE_CLASS_PRINTER\n"); - break; - } - case USB_DEVICE_CLASS_STORAGE: - { - DPRINT1("USB_DEVICE_CLASS_STORAGE\n"); - break; - } - case USB_DEVICE_CLASS_RESERVED: - DPRINT1("Reserved!!!\n"); - case USB_DEVICE_CLASS_HUB: - { - DPRINT1("USB_DEVICE_CLASS_HUB request\n"); - break; - } - default: - { - DPRINT1("Unknown UrbControlVendorClassRequest Value\n"); - } - } - break; - } - case USB_REQUEST_GET_STATUS: - { - DPRINT1("DEVICE: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); - break; - } - default: - { - DPRINT1("Unhandled URB request for class device\n"); - //Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; - } - } - break; - } - case URB_FUNCTION_CLASS_OTHER: - { - DPRINT1("Ehci: URB_FUNCTION_CLASS_OTHER\n"); - switch (Urb->UrbControlVendorClassRequest.Request) - { - case USB_REQUEST_GET_STATUS: - { - DPRINT1("OTHER: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); - break; - } - case USB_REQUEST_CLEAR_FEATURE: - { - DPRINT1("USB_REQUEST_CLEAR_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, - Urb->UrbControlVendorClassRequest.Value); - switch (Urb->UrbControlVendorClassRequest.Value) - { - case C_PORT_CONNECTION: - DPRINT1("Clearing Connect\n"); - break; - case C_PORT_RESET: - DPRINT1("Clearing Reset\n"); - break; - default: - DPRINT1("Unknown Value for Clear Feature %x \n", Urb->UrbControlVendorClassRequest.Value); - break; - } - break; - } - case USB_REQUEST_SET_FEATURE: - { - DPRINT1("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, - Urb->UrbControlVendorClassRequest.Value); - - switch(Urb->UrbControlVendorClassRequest.Value) - { - case PORT_RESET: - { - DPRINT1("Port reset\n"); - break; - } - case PORT_ENABLE: - { - DPRINT1("Unhandled Set Feature\n"); - break; - } - default: - { - DPRINT1("Unknown Set Feature!\n"); - break; - } - } - break; - } - case USB_REQUEST_SET_ADDRESS: - { - DPRINT1("USB_REQUEST_SET_ADDRESS\n"); - break; - } - case USB_REQUEST_GET_DESCRIPTOR: - { - DPRINT1("USB_REQUEST_GET_DESCRIPTOR\n"); - break; - } - case USB_REQUEST_SET_DESCRIPTOR: - { - DPRINT1("USB_REQUEST_SET_DESCRIPTOR\n"); - break; - } - case USB_REQUEST_GET_CONFIGURATION: - { - DPRINT1("USB_REQUEST_GET_CONFIGURATION\n"); - break; - } - case USB_REQUEST_SET_CONFIGURATION: - { - DPRINT1("USB_REQUEST_SET_CONFIGURATION\n"); - break; - } - case USB_REQUEST_GET_INTERFACE: - { - DPRINT1("USB_REQUEST_GET_INTERFACE\n"); - break; - } - case USB_REQUEST_SET_INTERFACE: - { - DPRINT1("USB_REQUEST_SET_INTERFACE\n"); - break; - } - case USB_REQUEST_SYNC_FRAME: - { - DPRINT1("USB_REQUEST_SYNC_FRAME\n"); - break; - } - default: - { - DPRINT1("Unknown Function Class Unknown request\n"); - break; - } - } - break; - } - default: - { - DPRINT1("Ehci: Unhandled URB %x\n", Urb->UrbHeader.Function); - //Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; - } - } - - Irp->IoStatus.Information = Information; - - if (Status != STATUS_PENDING) - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return Status; + /*FIXME: This should never be called by upper drivers as they should only be dealing with the pdo. */ + DPRINT1("Upper Level Device Object shouldnt be calling this!!!!!!!!!!!!\n"); + ASSERT(FALSE); + return STATUS_UNSUCCESSFUL; } diff --git a/reactos/drivers/usb/usbehci/hardware.h b/reactos/drivers/usb/usbehci/hardware.h index bc9d1d3e9f1..211c578ae93 100644 --- a/reactos/drivers/usb/usbehci/hardware.h +++ b/reactos/drivers/usb/usbehci/hardware.h @@ -1,6 +1,7 @@ #pragma once #include +#include /* USB Command Register */ #define EHCI_USBCMD 0x00 @@ -98,8 +99,9 @@ typedef struct _QUEUE_TRANSFER_DESCRIPTOR ULONG DWord; } Token; ULONG BufferPointer[5]; - + //Software + ULONG BufferPointerVA[5]; ULONG PhysicalAddr; struct _QUEUE_TRANSFER_DESCRIPTOR *PreviousDescriptor; struct _QUEUE_TRANSFER_DESCRIPTOR *NextDescriptor; @@ -167,10 +169,13 @@ typedef struct _QUEUE_HEAD ULONG PhysicalAddr; struct _QUEUE_HEAD *PreviousQueueHead; struct _QUEUE_HEAD *NextQueueHead; - PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor; + ULONG NumberOfTransferDescriptors; + PQUEUE_TRANSFER_DESCRIPTOR FirstTransferDescriptor; + PQUEUE_TRANSFER_DESCRIPTOR DeadDescriptor; PIRP IrpToComplete; - PMDL MdlToFree; PKEVENT Event; + PMDL Mdl; + BOOLEAN FreeMdl; } QUEUE_HEAD, *PQUEUE_HEAD; /* USBCMD register 32 bits */ @@ -264,14 +269,27 @@ typedef struct _EHCI_CAPS { UCHAR PortRoute [8]; } EHCI_CAPS, *PEHCI_CAPS; +typedef struct _EHCIPORTS +{ + ULONG PortNumber; + ULONG PortType; + USHORT PortStatus; + USHORT PortChange; +} EHCIPORTS, *PEHCIPORTS; + typedef struct _EHCI_HOST_CONTROLLER { + PDMA_ADAPTER pDmaAdapter; + ULONG MapRegisters; ULONG OpRegisters; EHCI_CAPS ECHICaps; - PVOID CommonBufferVA; - PHYSICAL_ADDRESS CommonBufferPA; + ULONG NumberOfPorts; + EHCIPORTS Ports[127]; + PVOID CommonBufferVA[16]; + PHYSICAL_ADDRESS CommonBufferPA[16]; ULONG CommonBufferSize; PQUEUE_HEAD AsyncListQueue; + PQUEUE_HEAD CompletedListQueue; KSPIN_LOCK Lock; } EHCI_HOST_CONTROLLER, *PEHCI_HOST_CONTROLLER; @@ -305,3 +323,5 @@ SetPeriodicFrameListRegister(PEHCI_HOST_CONTROLLER hcd, ULONG PhysicalAddr); ULONG GetPeriodicFrameListRegister(PEHCI_HOST_CONTROLLER hcd); +BOOLEAN +EnumControllerPorts(PEHCI_HOST_CONTROLLER hcd); diff --git a/reactos/drivers/usb/usbehci/hwiface.c b/reactos/drivers/usb/usbehci/hwiface.c index 92313ee13aa..aae5157f116 100644 --- a/reactos/drivers/usb/usbehci/hwiface.c +++ b/reactos/drivers/usb/usbehci/hwiface.c @@ -32,7 +32,6 @@ CreateDescriptor(PEHCI_HOST_CONTROLLER hcd, UCHAR PIDCode, ULONG TotalBytesToTra Descriptor->NextPointer = TERMINATE_POINTER; Descriptor->AlternateNextPointer = TERMINATE_POINTER; Descriptor->Token.Bits.DataToggle = TRUE; - Descriptor->Token.Bits.InterruptOnComplete = TRUE; Descriptor->Token.Bits.ErrorCounter = 0x03; Descriptor->Token.Bits.Active = TRUE; Descriptor->Token.Bits.PIDCode = PIDCode; @@ -47,9 +46,9 @@ CreateDescriptor(PEHCI_HOST_CONTROLLER hcd, UCHAR PIDCode, ULONG TotalBytesToTra } VOID -FreeDescriptor(PQUEUE_TRANSFER_DESCRIPTOR Descriptor) +FreeDescriptor(PEHCI_HOST_CONTROLLER hcd, PQUEUE_TRANSFER_DESCRIPTOR Descriptor) { - ReleaseMemory((ULONG)Descriptor); + ReleaseMemory(hcd, (ULONG)Descriptor); } /* Queue Head */ @@ -87,14 +86,12 @@ CreateQueueHead(PEHCI_HOST_CONTROLLER hcd) KIRQL OldIrql; KeAcquireSpinLock(&hcd->Lock, &OldIrql); - CurrentQH = (PQUEUE_HEAD)AllocateMemory(hcd, sizeof(QUEUE_HEAD), &PhysicalAddress); RtlZeroMemory(CurrentQH, sizeof(QUEUE_HEAD)); ASSERT(CurrentQH); CurrentQH->PhysicalAddr = PhysicalAddress; CurrentQH->HorizontalLinkPointer = TERMINATE_POINTER; - CurrentQH->CurrentLinkPointer = TERMINATE_POINTER; CurrentQH->AlternateNextPointer = TERMINATE_POINTER; CurrentQH->NextPointer = TERMINATE_POINTER; @@ -107,7 +104,7 @@ CreateQueueHead(PEHCI_HOST_CONTROLLER hcd) CurrentQH->EndPointCharacteristics.NakCountReload = 0xF; /* Get the Initial Data Toggle from the QEDT */ - CurrentQH->EndPointCharacteristics.QEDTDataToggleControl = TRUE; + CurrentQH->EndPointCharacteristics.QEDTDataToggleControl = FALSE; /* High Speed Device */ CurrentQH->EndPointCharacteristics.EndPointSpeed = QH_ENDPOINT_HIGHSPEED; @@ -120,7 +117,7 @@ CreateQueueHead(PEHCI_HOST_CONTROLLER hcd) for (i=0; i<5; i++) CurrentQH->BufferPointer[i] = 0; - CurrentQH->Token.Bits.InterruptOnComplete = TRUE; + CurrentQH->Token.Bits.InterruptOnComplete = FALSE; KeReleaseSpinLock(&hcd->Lock, OldIrql); return CurrentQH; @@ -131,19 +128,17 @@ LinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead) { KIRQL OldIrql; PQUEUE_HEAD CurrentHead = (PQUEUE_HEAD)hcd->AsyncListQueue; - PQUEUE_HEAD PreviousHead = CurrentHead->PreviousQueueHead; + PQUEUE_HEAD PreviousHead; KeAcquireSpinLock(&hcd->Lock, &OldIrql); - - QueueHead->HorizontalLinkPointer = (CurrentHead->HorizontalLinkPointer | QH_TYPE_QH) & ~TERMINATE_POINTER; + PreviousHead = CurrentHead->PreviousQueueHead; QueueHead->NextQueueHead = CurrentHead; QueueHead->PreviousQueueHead = PreviousHead; - + PreviousHead->NextQueueHead = QueueHead; CurrentHead->PreviousQueueHead = QueueHead; - if (PreviousHead) - PreviousHead->NextQueueHead = QueueHead; - - CurrentHead->HorizontalLinkPointer = QueueHead->PhysicalAddr | QH_TYPE_QH; + + QueueHead->HorizontalLinkPointer = (CurrentHead->HorizontalLinkPointer | QH_TYPE_QH) & ~TERMINATE_POINTER; + PreviousHead->HorizontalLinkPointer = QueueHead->PhysicalAddr| QH_TYPE_QH; KeReleaseSpinLock(&hcd->Lock, OldIrql); } @@ -152,24 +147,80 @@ VOID UnlinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead) { KIRQL OldIrql; - PQUEUE_HEAD PreviousHead = QueueHead->PreviousQueueHead; - PQUEUE_HEAD NextHead = QueueHead->NextQueueHead; + PQUEUE_HEAD PreviousHead; + PQUEUE_HEAD NextHead; KeAcquireSpinLock(&hcd->Lock, &OldIrql); - if (PreviousHead) - { - PreviousHead->NextQueueHead = NextHead; - PreviousHead->HorizontalLinkPointer = QueueHead->HorizontalLinkPointer; - } - if (NextHead) - NextHead->PreviousQueueHead = PreviousHead; + PreviousHead = QueueHead->PreviousQueueHead; + NextHead = QueueHead->NextQueueHead; + PreviousHead->NextQueueHead = NextHead; + NextHead->PreviousQueueHead = PreviousHead; + + PreviousHead->HorizontalLinkPointer = NextHead->HorizontalLinkPointer; KeReleaseSpinLock(&hcd->Lock, OldIrql); } VOID -DeleteQueueHead(PQUEUE_HEAD QueueHead) +LinkQueueHeadToCompletedList(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead) { - ReleaseMemory((ULONG)QueueHead); + KIRQL OldIrql; + PQUEUE_HEAD CurrentHead = (PQUEUE_HEAD)hcd->CompletedListQueue; + PQUEUE_HEAD PreviousHead; + + KeAcquireSpinLock(&hcd->Lock, &OldIrql); + + PreviousHead = CurrentHead->PreviousQueueHead; + QueueHead->NextQueueHead = CurrentHead; + QueueHead->PreviousQueueHead = PreviousHead; + PreviousHead->NextQueueHead = QueueHead; + CurrentHead->PreviousQueueHead = QueueHead; + + KeReleaseSpinLock(&hcd->Lock, OldIrql); + +} + +VOID +DeleteQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead) +{ + ReleaseMemory(hcd, (ULONG)QueueHead); +} + +VOID +CleanupAsyncList(PEHCI_HOST_CONTROLLER hcd) +{ + PQUEUE_TRANSFER_DESCRIPTOR Descriptor; + PQUEUE_HEAD QueueHead; + KIRQL OldIrql; + + KeAcquireSpinLock(&hcd->Lock, &OldIrql); + + QueueHead = hcd->CompletedListQueue; + QueueHead = QueueHead->NextQueueHead; + + while (QueueHead != hcd->CompletedListQueue) + { + Descriptor = QueueHead->FirstTransferDescriptor; + while (Descriptor) + { + if (Descriptor->Token.Bits.PIDCode == PID_CODE_SETUP_TOKEN) + ReleaseMemory(hcd, Descriptor->BufferPointerVA[0]); + FreeDescriptor(hcd, Descriptor); + Descriptor = Descriptor->NextDescriptor; + } + + if (QueueHead->FreeMdl) + { + DPRINT("Freeing Mdl %x, StartVA %x\n", QueueHead->Mdl, QueueHead->Mdl->StartVa); + IoFreeMdl(QueueHead->Mdl); + } + + QueueHead = QueueHead->NextQueueHead; + } + + hcd->CompletedListQueue->NextQueueHead = hcd->CompletedListQueue; + hcd->CompletedListQueue->PreviousQueueHead = hcd->CompletedListQueue; + + KeReleaseSpinLock(&hcd->Lock, OldIrql); } diff --git a/reactos/drivers/usb/usbehci/hwiface.h b/reactos/drivers/usb/usbehci/hwiface.h index 4fbf22dea96..aa961e6f80e 100644 --- a/reactos/drivers/usb/usbehci/hwiface.h +++ b/reactos/drivers/usb/usbehci/hwiface.h @@ -5,7 +5,7 @@ PQUEUE_TRANSFER_DESCRIPTOR CreateDescriptor(PEHCI_HOST_CONTROLLER hcd, UCHAR PIDCode, ULONG TotalBytesToTransfer); VOID -FreeDescriptor(PQUEUE_TRANSFER_DESCRIPTOR Descriptor); +FreeDescriptor(PEHCI_HOST_CONTROLLER hcd, PQUEUE_TRANSFER_DESCRIPTOR Descriptor); VOID DumpQueueHeadList(PEHCI_HOST_CONTROLLER hcd); @@ -20,5 +20,10 @@ VOID UnlinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead); VOID -DeleteQueueHead(PQUEUE_HEAD QueueHead); +DeleteQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead); +VOID +LinkQueueHeadToCompletedList(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead); + +VOID +CleanupAsyncList(PEHCI_HOST_CONTROLLER hcd); From fe97558adf0e7d93cc73ee43f4fab72ff0469225 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 13 Apr 2011 04:43:25 +0000 Subject: [PATCH 02/10] [USB\USBEHCI] - For common buffer memory, only allocate one page and allocate more as needed. This implementation will most likely be replaced with janderwalds. - Use a safecount while attempting to stop and start the controller, so that an error can be displayed vice doing endless loop for controllers that are misbehaving. - Reorganize a few structuers and remove members of structures that are not used. - Add comments for some of the DirectCall Interface Functions. Change 2 of 3. svn path=/trunk/; revision=51326 --- reactos/drivers/usb/usbehci/common.c | 2 +- reactos/drivers/usb/usbehci/hardware.c | 113 ++++++++++-- reactos/drivers/usb/usbehci/physmem.c | 57 ++++++- reactos/drivers/usb/usbehci/physmem.h | 3 +- reactos/drivers/usb/usbehci/usbehci.c | 4 +- reactos/drivers/usb/usbehci/usbehci.h | 17 -- reactos/drivers/usb/usbehci/usbiffn.c | 227 ++++++++++++++++++------- 7 files changed, 321 insertions(+), 102 deletions(-) diff --git a/reactos/drivers/usb/usbehci/common.c b/reactos/drivers/usb/usbehci/common.c index 5fb0cc6fe08..f31eb9be50f 100644 --- a/reactos/drivers/usb/usbehci/common.c +++ b/reactos/drivers/usb/usbehci/common.c @@ -98,7 +98,7 @@ DumpQueueHead(PQUEUE_HEAD QueueHead) DPRINT1(" PingState %x\n", QueueHead->Token.Bits.PingState); DPRINT1(" SplitTransactionState %x\n", QueueHead->Token.Bits.SplitTransactionState); DPRINT1(" ErrorCounter %x\n", QueueHead->Token.Bits.ErrorCounter); - DPRINT1(" First TransferDescriptor %x\n", QueueHead->TransferDescriptor); + DPRINT1(" First TransferDescriptor %x\n", QueueHead->FirstTransferDescriptor); } VOID diff --git a/reactos/drivers/usb/usbehci/hardware.c b/reactos/drivers/usb/usbehci/hardware.c index 0adf59e5e3b..8e9c6d58e2b 100644 --- a/reactos/drivers/usb/usbehci/hardware.c +++ b/reactos/drivers/usb/usbehci/hardware.c @@ -64,7 +64,7 @@ ResetPort(PEHCI_HOST_CONTROLLER hcd, UCHAR Port) { ULONG tmp; ULONG OpRegisters = hcd->OpRegisters; - DPRINT1("Reset Port %x\n", Port); + DPRINT("Reset Port %x\n", Port); tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * Port))); if (tmp & 0x400) @@ -95,7 +95,9 @@ ResetPort(PEHCI_HOST_CONTROLLER hcd, UCHAR Port) if (tmp & 0x100) { DPRINT1("EHCI ERROR: Port Reset did not complete!\n"); + ASSERT(FALSE); } + DPRINT("Reset complete\n"); } VOID @@ -107,7 +109,7 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd) LONG FailSafe; LONG tmp; - DPRINT1("Stopping Ehci controller\n"); + DPRINT("Stopping Ehci controller\n"); WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBINTR), 0); @@ -117,7 +119,7 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd) WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD), tmp); /* Wait for the device to stop */ - for (FailSafe = 100; FailSafe > 1; FailSafe++) + for (FailSafe = 0; FailSafe < 1000; FailSafe++) { KeStallExecutionProcessor(10); tmp = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBSTS)); @@ -129,7 +131,10 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd) } } if (!UsbSts->HCHalted) + { DPRINT1("EHCI ERROR: Controller is not responding to Stop request!\n"); + ASSERT(FALSE); + } } VOID @@ -138,7 +143,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) ULONG OpRegisters = hcd->OpRegisters; PEHCI_USBCMD_CONTENT UsbCmd; PEHCI_USBSTS_CONTEXT UsbSts; - LONG FailSafe; + LONG failSafe; LONG tmp; LONG tmp2; @@ -160,7 +165,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) WRITE_REGISTER_ULONG ((PULONG)(OpRegisters + EHCI_USBCMD), tmp); /* Wait for the device to reset */ - for (FailSafe = 100; FailSafe > 1; FailSafe++) + for (failSafe = 0; failSafe < 1000; failSafe++) { KeStallExecutionProcessor(10); tmp = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBCMD)); @@ -176,6 +181,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) if (UsbCmd->HCReset) { DPRINT1("EHCI ERROR: Controller failed to reset! Will attempt to continue.\n"); + ASSERT(FALSE); } UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; @@ -209,7 +215,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) WRITE_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBCMD), tmp); /* Wait for the device to start */ - for (;;) + for (failSafe = 0; failSafe < 1000; failSafe++) { KeStallExecutionProcessor(10); tmp2 = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBSTS)); @@ -222,10 +228,95 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd) DPRINT("Waiting for start, USBSTS: %x\n", READ_REGISTER_ULONG ((PULONG)(OpRegisters + EHCI_USBSTS))); } + if (UsbSts->HCHalted) + { + DPRINT1("EHCI ERROR: Controller failed to start!!!\n"); + ASSERT(FALSE); + } /* Set all port routing to ECHI controller */ WRITE_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_CONFIGFLAG), 1); } +BOOLEAN +EnumControllerPorts(PEHCI_HOST_CONTROLLER hcd) +{ + ULONG tmp, i, OpRegisters, ChildDeviceCount = 0; + BOOLEAN PortChange = FALSE; + + OpRegisters = (ULONG)hcd->OpRegisters; + /* Loop through the ports */ + for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) + { + tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i))); + + /* Check for port change on this port */ + if (tmp & 0x02) + { + DPRINT1("Port Change\n"); + + /* Clear status change */ + tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); + tmp |= 0x02; + WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp); + + PortChange = TRUE; + /* Connect or Disconnect? */ + if (tmp & 0x01) + { + DPRINT1("Device connected on port %d\n", i); + + /* Check if a companion host controller exists */ + if (hcd->ECHICaps.HCSParams.CHCCount) + { + tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); + + /* Port should be in disabled state, as per USB 2.0 specs */ + if (tmp & 0x04) + { + DPRINT1("Warning: The port the device has just connected to is not disabled!\n"); + } + + /* Is this non high speed device */ + if (tmp & 0x400) + { + DPRINT1("Non HighSpeed device connected. Releasing ownership.\n"); + /* Release ownership to companion host controller */ + WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), 0x2000); + continue; + } + } + + KeStallExecutionProcessor(30); + + /* As per USB 2.0 Specs, 9.1.2. Reset the port and clear the status change */ + //tmp |= 0x100 | 0x02; + /* Sanity, Disable port */ + //tmp &= ~0x04; + + //WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), tmp); + + //KeStallExecutionProcessor(20); + + tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i))); + + ChildDeviceCount++; + hcd->Ports[i].PortStatus &= ~0x8000; + DPRINT1("Removed 0x8000\n"); + ASSERT(FALSE); + hcd->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED; + hcd->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT; + hcd->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; + } + else + { + DPRINT1("Device disconnected on port %d\n", i); + ChildDeviceCount--; + } + } + } + return PortChange; +} + VOID GetCapabilities(PEHCI_CAPS PCap, ULONG CapRegister) { @@ -241,11 +332,11 @@ GetCapabilities(PEHCI_CAPS PCap, ULONG CapRegister) PCap->HCSParamsLong = READ_REGISTER_ULONG((PULONG)(CapRegister + 4)); PCap->HCCParams = READ_REGISTER_ULONG((PULONG)(CapRegister + 8)); - DPRINT1("Length %d\n", PCap->Length); - DPRINT1("Reserved %d\n", PCap->Reserved); - DPRINT1("HCIVersion %x\n", PCap->HCIVersion); - DPRINT1("HCSParams %x\n", PCap->HCSParamsLong); - DPRINT1("HCCParams %x\n", PCap->HCCParams); + DPRINT("Length %d\n", PCap->Length); + DPRINT("Reserved %d\n", PCap->Reserved); + DPRINT("HCIVersion %x\n", PCap->HCIVersion); + DPRINT("HCSParams %x\n", PCap->HCSParamsLong); + DPRINT("HCCParams %x\n", PCap->HCCParams); if (PCap->HCCParams & 0x02) DPRINT1("Frame list size is configurable\n"); diff --git a/reactos/drivers/usb/usbehci/physmem.c b/reactos/drivers/usb/usbehci/physmem.c index eb696da9f09..09a964ff32e 100644 --- a/reactos/drivers/usb/usbehci/physmem.c +++ b/reactos/drivers/usb/usbehci/physmem.c @@ -22,21 +22,32 @@ DumpPages() ULONG AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress) { - PMEM_HEADER MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA; + PMEM_HEADER MemoryPage = NULL; ULONG PageCount = 0; ULONG NumberOfPages = hcd->CommonBufferSize / PAGE_SIZE; - ULONG BlocksNeeded; + ULONG BlocksNeeded = 0; ULONG i,j, freeCount; ULONG RetAddr = 0; + MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[0]; Size = ((Size + SMALL_ALLOCATION_SIZE - 1) / SMALL_ALLOCATION_SIZE) * SMALL_ALLOCATION_SIZE; BlocksNeeded = Size / SMALL_ALLOCATION_SIZE; + do { if (MemoryPage->IsFull) { PageCount++; - MemoryPage = (PMEM_HEADER)((ULONG)MemoryPage + PAGE_SIZE); + + if (!(PMEM_HEADER)hcd->CommonBufferVA[PageCount]) + { + hcd->CommonBufferVA[PageCount] = + hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter, + PAGE_SIZE, + &hcd->CommonBufferPA[PageCount], + FALSE); + } + MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[PageCount]; continue; } freeCount = 0; @@ -54,8 +65,9 @@ AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress) if ((i-freeCount+1 + BlocksNeeded) > sizeof(MemoryPage->Entry)) { freeCount = 0; - continue; + break; } + if (freeCount == BlocksNeeded) { for (j = 0; j < freeCount; j++) @@ -68,20 +80,35 @@ AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress) RetAddr = (ULONG)MemoryPage + (SMALL_ALLOCATION_SIZE * (i - freeCount + 1)) + sizeof(MEM_HEADER); - *PhysicalAddress = (ULONG)hcd->CommonBufferPA.LowPart + (RetAddr - (ULONG)hcd->CommonBufferVA); + *(ULONG*)PhysicalAddress = (ULONG)hcd->CommonBufferPA[PageCount].LowPart + (RetAddr - (ULONG)hcd->CommonBufferVA[PageCount]); + return RetAddr; } } PageCount++; - MemoryPage = (PMEM_HEADER)((ULONG)MemoryPage + PAGE_SIZE); + if (!(PMEM_HEADER)hcd->CommonBufferVA[PageCount]) + { + + hcd->CommonBufferVA[PageCount] = + hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter, + PAGE_SIZE, + &hcd->CommonBufferPA[PageCount], + FALSE); + DPRINT1("Allocated CommonBuffer VA %x, PA %x\n", hcd->CommonBufferVA[PageCount], hcd->CommonBufferPA[PageCount]); + } + MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[PageCount]; + } while (PageCount < NumberOfPages); + if (PageCount == NumberOfPages) + ASSERT(FALSE); + return 0; } VOID -ReleaseMemory(ULONG Address) +ReleaseMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Address) { PMEM_HEADER MemoryPage; ULONG Index, i, BlockSize; @@ -90,9 +117,25 @@ ReleaseMemory(ULONG Address) Index = (Address - ((ULONG)MemoryPage + sizeof(MEM_HEADER))) / SMALL_ALLOCATION_SIZE; BlockSize = MemoryPage->Entry[Index].Blocks; + for (i = 0; i < BlockSize; i++) { MemoryPage->Entry[Index + i].InUse = 0; MemoryPage->Entry[Index + i].Blocks = 0; } + + if (MemoryPage != (PMEM_HEADER)hcd->CommonBufferVA[0]) + { + for (i=0; i < sizeof(MemoryPage->Entry) / 2; i++) + { + if ((MemoryPage->Entry[i].InUse) || (MemoryPage->Entry[sizeof(MemoryPage->Entry) - i].InUse)) + return; + } + DPRINT1("Freeing CommonBuffer VA %x, PA %x\n", MemoryPage, MmGetPhysicalAddress(MemoryPage)); + hcd->pDmaAdapter->DmaOperations->FreeCommonBuffer(hcd->pDmaAdapter, + PAGE_SIZE, + MmGetPhysicalAddress(MemoryPage), + MemoryPage, + FALSE); + } } diff --git a/reactos/drivers/usb/usbehci/physmem.h b/reactos/drivers/usb/usbehci/physmem.h index a49f1bbda6d..b88f702ba0b 100644 --- a/reactos/drivers/usb/usbehci/physmem.h +++ b/reactos/drivers/usb/usbehci/physmem.h @@ -22,5 +22,4 @@ ULONG AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress); VOID -ReleaseMemory(ULONG Address); - +ReleaseMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Address); diff --git a/reactos/drivers/usb/usbehci/usbehci.c b/reactos/drivers/usb/usbehci/usbehci.c index f88cde8b886..d4e85be245a 100644 --- a/reactos/drivers/usb/usbehci/usbehci.c +++ b/reactos/drivers/usb/usbehci/usbehci.c @@ -69,7 +69,7 @@ UsbEhciClose(PDEVICE_OBJECT DeviceObject, PIRP Irp) VOID NTAPI DriverUnload(PDRIVER_OBJECT DriverObject) { - DPRINT1("Unloading Driver\n"); + DPRINT("Unloading Driver\n"); /* FIXME: Clean up */ } @@ -94,7 +94,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl; DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = DispatchInternalDeviceControl; DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp; - + DriverObject->DriverUnload = DriverUnload; DPRINT1("Driver entry done\n"); diff --git a/reactos/drivers/usb/usbehci/usbehci.h b/reactos/drivers/usb/usbehci/usbehci.h index 210d9194d57..09e29479111 100644 --- a/reactos/drivers/usb/usbehci/usbehci.h +++ b/reactos/drivers/usb/usbehci/usbehci.h @@ -93,14 +93,6 @@ typedef struct _COMMON_DEVICE_EXTENSION PDEVICE_OBJECT DeviceObject; } COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION; -typedef struct _EHCIPORTS -{ - ULONG PortNumber; - ULONG PortType; - USHORT PortStatus; - USHORT PortChange; -} EHCIPORTS, *PEHCIPORTS; - typedef struct _FDO_DEVICE_EXTENSION { COMMON_DEVICE_EXTENSION Common; @@ -109,10 +101,7 @@ typedef struct _FDO_DEVICE_EXTENSION PDEVICE_OBJECT LowerDevice; PDEVICE_OBJECT Pdo; ULONG DeviceState; - PVOID RootHubDeviceHandle; - PDMA_ADAPTER pDmaAdapter; - ULONG Vector; KIRQL Irql; @@ -125,8 +114,6 @@ typedef struct _FDO_DEVICE_EXTENSION KAFFINITY Affinity; - ULONG MapRegisters; - ULONG BusNumber; ULONG BusAddress; ULONG PCIAddress; @@ -148,8 +135,6 @@ typedef struct _FDO_DEVICE_EXTENSION BOOLEAN AsyncComplete; - //PULONG ResourceBase; - //ULONG Size; } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; typedef struct _PDO_DEVICE_EXTENSION @@ -168,8 +153,6 @@ typedef struct _PDO_DEVICE_EXTENSION RH_INIT_CALLBACK *CallbackRoutine; USB_IDLE_CALLBACK IdleCallback; PVOID IdleContext; - ULONG NumberOfPorts; - EHCIPORTS Ports[32]; KTIMER Timer; KEVENT QueueDrainedEvent; FAST_MUTEX ListLock; diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c index 6f4932091fd..1bc74d6878f 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.c +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -7,12 +7,15 @@ * Michael Martin (michael.martin@reactos.org) */ +/* Many of these direct calls are documented on http://www.osronline.com */ + #include "usbehci.h" #include #include +#include "hardware.h" #include "transfer.h" -PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) +PVOID InternalCreateUsbDevice(ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) { PUSB_DEVICE UsbDevicePointer = NULL; @@ -31,7 +34,6 @@ PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent DPRINT1("This is the root hub\n"); } - UsbDevicePointer->Address = 0;//DeviceNumber; UsbDevicePointer->Port = Port - 1; UsbDevicePointer->ParentDevice = Parent; @@ -57,6 +59,11 @@ InterfaceDereference(PVOID BusContext) /* Bus Interface Hub V5 Functions */ +/* Hub Driver calls this routine for each new device it is informed about on USB Bus + osronline documents that this is where the device address is assigned. It also + states the same for InitializeUsbDevice. This function only gets the device descriptor + from the device and checks that the members for device are correct. */ + NTSTATUS USB_BUSIFFN CreateUsbDevice(PVOID BusContext, @@ -65,11 +72,18 @@ CreateUsbDevice(PVOID BusContext, USHORT PortStatus, USHORT PortNumber) { PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + PEHCI_HOST_CONTROLLER hcd; PUSB_DEVICE UsbDevice; - LONG i = 0; + LONG i; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; DPRINT1("Ehci: CreateUsbDevice: HubDeviceHandle %x, PortStatus %x, PortNumber %x\n", HubDeviceHandle, PortStatus, PortNumber); + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + + hcd = &FdoDeviceExtension->hcd; if (PdoDeviceExtension->UsbDevices[0] != HubDeviceHandle) { @@ -77,29 +91,62 @@ CreateUsbDevice(PVOID BusContext, return STATUS_DEVICE_NOT_CONNECTED; } - UsbDevice = InternalCreateUsbDevice(PdoDeviceExtension->ChildDeviceCount, PortNumber, HubDeviceHandle, FALSE); - - if (!UsbDevice) - return STATUS_INSUFFICIENT_RESOURCES; - + UsbDevice = NULL; /* Add it to the list */ - while (TRUE) + for (i=0; i < MAX_USB_DEVICES; i++) { if (PdoDeviceExtension->UsbDevices[i] == NULL) { - PdoDeviceExtension->UsbDevices[i] = (PUSB_DEVICE)UsbDevice; + PdoDeviceExtension->UsbDevices[i] = InternalCreateUsbDevice(PortNumber, HubDeviceHandle, FALSE); + + if (!PdoDeviceExtension->UsbDevices[i]) + return STATUS_INSUFFICIENT_RESOURCES; + UsbDevice = PdoDeviceExtension->UsbDevices[i]; break; } - i++; } - PdoDeviceExtension->Ports[PortNumber - 1].PortStatus = PortStatus; + /* Check that a device was created */ + if (!UsbDevice) + { + DPRINT1("Too many usb devices attached. Max is %d\n", MAX_USB_DEVICES); + return STATUS_UNSUCCESSFUL; + } + + hcd->Ports[PortNumber - 1].PortStatus = PortStatus; + + /* Get the device descriptor */ + CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; + CtrlSetup.wValue.LowByte = 0; + CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR); + CtrlSetup.bmRequestType.B = 0x80; + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + &UsbDevice->DeviceDescriptor, + sizeof(USB_DEVICE_DESCRIPTOR), + NULL); + + /* Check status and bLength and bDescriptor members */ + if ((UsbDevice->DeviceDescriptor.bLength != 0x12) || (UsbDevice->DeviceDescriptor.bDescriptorType != 0x1)) + { + return STATUS_DEVICE_DATA_ERROR; + } + + DumpDeviceDescriptor(&UsbDevice->DeviceDescriptor); /* Return it */ *NewDevice = UsbDevice; return STATUS_SUCCESS; } +/* Assigns the device an address, gets the configuration, interface, and endpoint descriptors + from the device. All this data is saved as part of this driver */ + NTSTATUS USB_BUSIFFN InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) @@ -107,13 +154,16 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) PPDO_DEVICE_EXTENSION PdoDeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExtension; USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + USB_DEVICE_DESCRIPTOR DeviceDesc; PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc; PUSB_INTERFACE_DESCRIPTOR InterfaceDesc; PUSB_ENDPOINT_DESCRIPTOR EndpointDesc; PUSB_DEVICE UsbDevice; PVOID Buffer; PUCHAR Ptr; - LONG i, j, k; + UCHAR NewAddress = 0; + + LONG i, j, k, InitAttept; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; @@ -126,30 +176,90 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) return STATUS_DEVICE_NOT_CONNECTED; } - CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; - CtrlSetup.wValue.LowByte = 0; - CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE; - CtrlSetup.wIndex.W = 0; - CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR); - CtrlSetup.bmRequestType.B = 0x80; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - &UsbDevice->DeviceDescriptor, - sizeof(USB_DEVICE_DESCRIPTOR), - NULL); - - //DumpDeviceDescriptor(&UsbDevice->DeviceDescriptor); - - if (UsbDevice->DeviceDescriptor.bLength != 0x12) + for (i=0; i<127; i++) { - DPRINT1("Failed to get Device Descriptor from device connected on port %d\n", UsbDevice->Port); + if (UsbDevice == PdoDeviceExtension->UsbDevices[i]) + { + NewAddress = i; + break; + } + } + + ASSERT(NewAddress); + + /* Linux drivers make 3 attemps to set the device address because of problems with some devices. Do the same */ + InitAttept = 0; + while (InitAttept < 3) + { + /* Set the device address */ + CtrlSetup.bmRequestType.B = 0x00; + CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS; + CtrlSetup.wValue.W = NewAddress; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = 0; + + DPRINT1("Setting Address to %x\n", NewAddress); + ExecuteTransfer(PdoDeviceExtension->ControllerFdo, + UsbDevice, + 0, + &CtrlSetup, + 0, + NULL, + 0, + NULL); + + KeStallExecutionProcessor(300 * InitAttept); + + /* Send 0 length packet to endpoint 0 for ack */ +/* + ExecuteTransfer(PdoDeviceExtension->ControllerFdo, + UsbDevice, + 0, + NULL, + 0, + NULL, + 0, + NULL); +*/ + + CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; + CtrlSetup.wValue.LowByte = 0; + CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE; + CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR); + CtrlSetup.bmRequestType.B = 0x80; + + UsbDevice->Address = NewAddress; + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + &DeviceDesc, + sizeof(USB_DEVICE_DESCRIPTOR), + NULL); + + DPRINT1("Length %d, DescriptorType %d\n", DeviceDesc.bLength, DeviceDesc.bDescriptorType); + if ((DeviceDesc.bLength == 0x12) && (DeviceDesc.bDescriptorType == 0x01)) + break; + + /* If the descriptor was not gotten */ + UsbDevice->Address = 0; + InitAttept++; + } + + if (InitAttept == 3) + { + DPRINT1("Unable to initialize usb device connected on port %d!\n", UsbDevice->Port); + /* FIXME: Should the memory allocated for this device be deleted? */ return STATUS_DEVICE_DATA_ERROR; } + DumpDeviceDescriptor(&DeviceDesc); if (UsbDevice->DeviceDescriptor.bNumConfigurations == 0) { DPRINT1("Device on port %d has no configurations!\n", UsbDevice->Port); + /* FIXME: Should the memory allocated for this device be deleted? */ return STATUS_DEVICE_DATA_ERROR; } UsbDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, @@ -159,6 +269,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) if (!UsbDevice->Configs) { DPRINT1("Out of memory\n"); + /* FIXME: Should the memory allocated for this device be deleted? */ return STATUS_NO_MEMORY; } @@ -167,6 +278,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) if (!Buffer) { DPRINT1("Out of memory\n"); + /* FIXME: Should the memory allocated for this device be deleted? */ return STATUS_NO_MEMORY; } @@ -184,16 +296,18 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) CtrlSetup.wValue.HiByte = USB_CONFIGURATION_DESCRIPTOR_TYPE; CtrlSetup.wIndex.W = 0; CtrlSetup.wLength = PAGE_SIZE; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - Buffer, - PAGE_SIZE, - NULL); + ExecuteTransfer(PdoDeviceExtension->ControllerFdo, + UsbDevice, + 0, + &CtrlSetup, + 0, + Buffer, + PAGE_SIZE, + NULL); ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)Ptr; - //DumpFullConfigurationDescriptor(ConfigDesc); + DumpFullConfigurationDescriptor(ConfigDesc); ASSERT(ConfigDesc->wTotalLength <= PAGE_SIZE); UsbDevice->Configs[i] = ExAllocatePoolWithTag(NonPagedPool, @@ -230,30 +344,13 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) UsbDevice->ActiveConfig = UsbDevice->Configs[0]; UsbDevice->ActiveInterface = UsbDevice->Configs[0]->Interfaces[0]; - return STATUS_SUCCESS; - /* Set the device address */ - CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; - CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; - CtrlSetup.bmRequestType._BM.Reserved = 0; - CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_HOST_TO_DEVICE; - CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS; - CtrlSetup.wValue.W = UsbDevice->Address; - CtrlSetup.wIndex.W = 0; - CtrlSetup.wLength = 0; + UsbDevice->DeviceState = DEVICEINTIALIZED; - DPRINT1("Setting Address to %x\n", UsbDevice->Address); - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - NULL, - 0, - NULL); - - PdoDeviceExtension->UsbDevices[i]->DeviceState = DEVICEINTIALIZED; return STATUS_SUCCESS; } +/* Return the descriptors that will fit. Descriptors were saved when the InitializeUsbDevice function was called */ NTSTATUS USB_BUSIFFN GetUsbDescriptors(PVOID BusContext, @@ -290,6 +387,7 @@ GetUsbDescriptors(PVOID BusContext, return STATUS_SUCCESS; } +/* Documented http://www.osronline.com/ddkx/buses/usbinterkr_1m7m.htm */ NTSTATUS USB_BUSIFFN RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags) @@ -347,15 +445,18 @@ RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags) return STATUS_SUCCESS; } +/* Documented at http://www.osronline.com/ddkx/buses/usbinterkr_01te.htm */ NTSTATUS USB_BUSIFFN RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle) { PUSB_DEVICE OldUsbDevice; PUSB_DEVICE NewUsbDevice; + PUSB_CONFIGURATION ConfigToDelete; + int i; DPRINT1("Ehci: RestoreUsbDevice %x, %x, %x\n", BusContext, OldDeviceHandle, NewDeviceHandle); - +ASSERT(FALSE); OldUsbDevice = DeviceHandleToUsbDevice(BusContext, OldDeviceHandle); NewUsbDevice = DeviceHandleToUsbDevice(BusContext, NewDeviceHandle); @@ -380,9 +481,6 @@ RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVI if ((OldUsbDevice->DeviceDescriptor.idVendor == NewUsbDevice->DeviceDescriptor.idVendor) && (OldUsbDevice->DeviceDescriptor.idProduct == NewUsbDevice->DeviceDescriptor.idProduct)) { - PUSB_CONFIGURATION ConfigToDelete; - int i; - NewUsbDevice->DeviceState &= ~DEVICEBUSY; NewUsbDevice->DeviceState &= ~DEVICEREMOVED; @@ -407,6 +505,7 @@ RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVI } } +/* FIXME: Research this */ NTSTATUS USB_BUSIFFN GetPortHackFlags(PVOID BusContext, PULONG Flags) @@ -497,6 +596,9 @@ GetControllerInformation(PVOID BusContext, DPRINT1("Ehci: GetControllerInformation called\n"); + if (!LengthReturned) + return STATUS_INVALID_PARAMETER; + ControllerInfo = ControllerInformationBuffer; if (ControllerInformationBufferLength < sizeof(USB_CONTROLLER_INFORMATION_0)) @@ -653,7 +755,7 @@ FlushTransfers(PVOID BusContext, PVOID DeviceHandle) DPRINT1("Invalid DeviceHandle or device not connected\n"); } - DPRINT1("FlushTransfers\n"); + DPRINT1("FlushTransfers not implemented.\n"); } VOID @@ -725,5 +827,6 @@ USB_BUSIFFN EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2) { DPRINT1("Ehci: EnumLogEntry called %x, %x, %x, %x\n", DriverTag, EnumTag, P1, P2); + return STATUS_SUCCESS; } From 35e6c5fe822bafea844aff8fa74ce7bc7c7c2f82 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Wed, 13 Apr 2011 04:48:50 +0000 Subject: [PATCH 03/10] [USB\USBEHCI] - Implement ExecuteTransfer to replace SubmitTransfer. - Start implentation for BulkTransfers and needed DMA. This needs much more work to be done correctly. We will get to it. - Implement URB_FUNCTION_CLASS_INTERFACE. - Add comments. Change 3 of 3. svn path=/trunk/; revision=51327 --- reactos/drivers/usb/usbehci/irp.c | 221 +++++++++---- reactos/drivers/usb/usbehci/pdo.c | 85 +++-- reactos/drivers/usb/usbehci/transfer.c | 416 +++++++++++++++++++++---- reactos/drivers/usb/usbehci/transfer.h | 31 +- 4 files changed, 592 insertions(+), 161 deletions(-) diff --git a/reactos/drivers/usb/usbehci/irp.c b/reactos/drivers/usb/usbehci/irp.c index fa77f1cdd48..605041fa502 100644 --- a/reactos/drivers/usb/usbehci/irp.c +++ b/reactos/drivers/usb/usbehci/irp.c @@ -70,13 +70,17 @@ QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) { NTSTATUS Status = STATUS_UNSUCCESSFUL; + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; ULONG_PTR Information = 0; PIO_STACK_LOCATION Stack; PUSB_DEVICE UsbDevice = NULL; + PEHCI_HOST_CONTROLLER hcd; URB *Urb; PFDO_DEVICE_EXTENSION FdoDeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; + hcd = &FdoDeviceExtension->hcd; + Stack = IoGetCurrentIrpStackLocation(Irp); ASSERT(Stack); @@ -105,16 +109,62 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) { case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: { - DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER UsbDevice %x\n", UsbDevice); + PUSB_ENDPOINT_DESCRIPTOR EndPointDesc; + int i; + + for (i = 0; i < UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints; i++) + { + EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)&UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor; + DPRINT("EndPoint %d Handle %x\n", i, &UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor); + DPRINT("bmAttributes %x\n", EndPointDesc->bmAttributes); + DPRINT("EndPoint is transfer type %x\n", EndPointDesc->bmAttributes & 0x0F); + } + DPRINT("UsbDevice %x, Handle %x\n", UsbDevice, Urb->UrbBulkOrInterruptTransfer.PipeHandle); if (&UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor != Urb->UrbBulkOrInterruptTransfer.PipeHandle) { - DPRINT1("Invalid Parameter, Expected EndPointDescriptor of %x, but got %x\n", &UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor, Urb->UrbBulkOrInterruptTransfer.PipeHandle); - Status = STATUS_INVALID_PARAMETER; + DPRINT("HubDevice %x, UsbDevice %x\n", PdoDeviceExtension->UsbDevices[0], UsbDevice); + if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN) + DPRINT1("USBD_TRANSFER_DIRECTION_IN\n"); + if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_OUT) + DPRINT1("USBD_TRANSFER_DIRECTION_OUT\n"); + if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_SHORT_TRANSFER_OK) + DPRINT1("USBD_SHORT_TRANSFER_OK\n"); + EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbBulkOrInterruptTransfer.PipeHandle; + DPRINT("EndPoint is transfer type %x\n", EndPointDesc->bmAttributes & 0x0F); + DPRINT("Endpoint Address %x\n", EndPointDesc->bEndpointAddress & 0x0F); + if ((EndPointDesc->bmAttributes & 0x0F) == USB_ENDPOINT_TYPE_BULK) + { + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; + + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + Urb->UrbBulkOrInterruptTransfer.PipeHandle, + NULL, + Urb->UrbBulkOrInterruptTransfer.TransferFlags, + Urb->UrbBulkOrInterruptTransfer.TransferBuffer ? + Urb->UrbBulkOrInterruptTransfer.TransferBuffer : + (PVOID)Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL, + Urb->UrbBulkOrInterruptTransfer.TransferBuffer ? + Urb->UrbBulkOrInterruptTransfer.TransferBufferLength : 0, + Irp); + } + else + { + DPRINT1("Transfer Type not implemented yet!\n"); + /* FAKE IT */ + Status = STATUS_SUCCESS; + } + + break; + } + if (!Urb->UrbBulkOrInterruptTransfer.TransferBuffer) + { + DPRINT1("TransferBuffer is NULL!\n"); ASSERT(FALSE); break; } - ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL); RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); if (UsbDevice == PdoDeviceExtension->UsbDevices[0]) @@ -122,9 +172,9 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK)) { LONG i; - for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++) + for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) { - if (PdoDeviceExtension->Ports[i].PortChange) + if (hcd->Ports[i].PortChange) { DPRINT1("Inform hub driver that port %d has changed\n", i+1); ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7); @@ -177,11 +227,8 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } if (UsbDevice == PdoDeviceExtension->UsbDevices[0]) { - DPRINT1("ROOTHUB!\n"); BufPtr = (PUCHAR)Urb->UrbControlDescriptorRequest.TransferBuffer; - DPRINT1("Length %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); - /* Copy the Device Descriptor */ RtlCopyMemory(BufPtr, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); DumpDeviceDescriptor((PUSB_DEVICE_DESCRIPTOR)Urb->UrbControlDescriptorRequest.TransferBuffer); @@ -193,11 +240,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); IoMarkIrpPending(Irp); Status = STATUS_PENDING; - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - Urb->UrbControlDescriptorRequest.TransferBuffer, - Urb->UrbControlDescriptorRequest.TransferBufferLength, - Irp); + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + Urb->UrbControlDescriptorRequest.TransferBuffer ? + Urb->UrbControlDescriptorRequest.TransferBuffer : + (PVOID)Urb->UrbControlDescriptorRequest.TransferBufferMDL, + Urb->UrbControlDescriptorRequest.TransferBuffer ? + Urb->UrbControlDescriptorRequest.TransferBufferLength : 0, + Irp); break; } case USB_CONFIGURATION_DESCRIPTOR_TYPE: @@ -270,12 +323,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); IoMarkIrpPending(Irp); Status = STATUS_PENDING; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - Urb->UrbControlDescriptorRequest.TransferBuffer, - Urb->UrbControlDescriptorRequest.TransferBufferLength, - Irp); + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + Urb->UrbControlDescriptorRequest.TransferBuffer ? + Urb->UrbControlDescriptorRequest.TransferBuffer : + (PVOID)Urb->UrbControlDescriptorRequest.TransferBufferMDL, + Urb->UrbControlDescriptorRequest.TransferBuffer ? + Urb->UrbControlDescriptorRequest.TransferBufferLength : 0, + Irp); break; } default: @@ -290,17 +348,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) PUSBD_INTERFACE_INFORMATION InterfaceInfo; LONG iCount, pCount; - DPRINT1("Selecting Configuration\n"); - DPRINT1("ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); + DPRINT("Selecting Configuration\n"); + DPRINT("ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); + if (Urb->UrbSelectConfiguration.ConfigurationDescriptor) { Urb->UrbSelectConfiguration.ConfigurationHandle = &UsbDevice->ActiveConfig->ConfigurationDescriptor; - DPRINT1("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); - ASSERT(FALSE); + DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); InterfaceInfo = &Urb->UrbSelectConfiguration.Interface; - DPRINT1("Length %x\n", InterfaceInfo->Length); - DPRINT1("NumberOfPipes %x\n", InterfaceInfo->NumberOfPipes); + DPRINT("Length %x\n", InterfaceInfo->Length); + DPRINT("NumberOfPipes %x\n", InterfaceInfo->NumberOfPipes); for (iCount = 0; iCount < Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces; iCount++) { @@ -324,6 +382,29 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)((PUCHAR)InterfaceInfo + InterfaceInfo->Length); if (InterfaceInfo->Length == 0) break; } + + if (UsbDevice != PdoDeviceExtension->UsbDevices[0]) + { + DPRINT("Setting Configuration!\n"); + BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; + DPRINT1("Input Buffer %x, MDL %x\n", Urb->UrbBulkOrInterruptTransfer.TransferBuffer, (PVOID)Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL); + + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + NULL, + 0, + Irp); + break; + } + else + { + DPRINT1("Hub only has one configuration.\n"); + } } else { @@ -334,7 +415,6 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } case URB_FUNCTION_SELECT_INTERFACE: { - USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; PUSBD_INTERFACE_INFORMATION InterfaceInfo; int i; @@ -353,12 +433,14 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup); IoMarkIrpPending(Irp); Status = STATUS_PENDING; - - SubmitControlTransfer(&FdoDeviceExtension->hcd, - &CtrlSetup, - NULL, - 0, - Irp); + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + NULL, + 0, + Irp); break; } case URB_FUNCTION_CLASS_DEVICE: @@ -425,7 +507,6 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } else { - /* FIXME: Handle this correctly */ UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); UsbHubDescr->bDescriptorType = 0x29; break; @@ -433,7 +514,7 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) DPRINT1("USB_DEVICE_CLASS_HUB request\n"); UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); UsbHubDescr->bDescriptorType = 0x29; - UsbHubDescr->bNumberOfPorts = PdoDeviceExtension->NumberOfPorts; + UsbHubDescr->bNumberOfPorts = hcd->ECHICaps.HCSParams.PortCount; UsbHubDescr->wHubCharacteristics = 0x0012; UsbHubDescr->bPowerOnToPowerGood = 0x01; UsbHubDescr->bHubControlCurrent = 0x00; @@ -480,10 +561,10 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) DPRINT("USB_REQUEST_GET_STATUS Port %d\n", Urb->UrbControlVendorClassRequest.Index); ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); - DPRINT("PortStatus %x\n", PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); - DPRINT("PortChange %x\n", PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange); - ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; - ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; + DPRINT("PortStatus %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); + DPRINT("PortChange %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange); + ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; + ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; break; } case USB_REQUEST_CLEAR_FEATURE: @@ -492,12 +573,12 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) { case C_PORT_CONNECTION: DPRINT("C_PORT_CONNECTION\n"); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_CONNECT; + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_CONNECT; break; case C_PORT_RESET: DPRINT("C_PORT_RESET\n"); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_RESET; - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus |= USB_PORT_STATUS_ENABLE; + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_RESET; + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus |= USB_PORT_STATUS_ENABLE; break; default: DPRINT("Unknown Value for Clear Feature %x \n", Urb->UrbControlVendorClassRequest.Value); @@ -507,46 +588,49 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } case USB_REQUEST_SET_FEATURE: { - DPRINT("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, + DPRINT1("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index, Urb->UrbControlVendorClassRequest.Value); switch(Urb->UrbControlVendorClassRequest.Value) { case PORT_RESET: { - DPRINT("Port Reset %d\n", Urb->UrbControlVendorClassRequest.Index-1); - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange |= USB_PORT_STATUS_RESET; - PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus &= ~USB_PORT_STATUS_ENABLE; - ResetPort(&FdoDeviceExtension->hcd, Urb->UrbControlVendorClassRequest.Index-1); + DPRINT1("Port Reset %d\n", Urb->UrbControlVendorClassRequest.Index-1); + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange |= USB_PORT_STATUS_RESET; + hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus &= ~USB_PORT_STATUS_ENABLE; + ResetPort(hcd, Urb->UrbControlVendorClassRequest.Index-1); break; } case PORT_ENABLE: { - DPRINT("PORT_ENABLE not implemented\n"); + DPRINT1("PORT_ENABLE not implemented\n"); break; } case PORT_POWER: { - DPRINT("PORT_POWER not implemented\n"); + DPRINT1("PORT_POWER not implemented\n"); break; } default: { - DPRINT("Unknown Set Feature!\n"); + DPRINT1("Unknown Set Feature!\n"); break; } } - if (!(PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus & 0x8000)) + if (!(hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus & 0x8000)) + { + DPRINT1("------ PortStatus %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); + DPRINT1("Calling CompletePendingURBRequest\n"); + CompletePendingURBRequest(PdoDeviceExtension); - + } break; } case USB_REQUEST_SET_ADDRESS: { DPRINT1("USB_REQUEST_SET_ADDRESS\n"); - ASSERT(FALSE); break; } case USB_REQUEST_GET_DESCRIPTOR: @@ -606,7 +690,35 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp) } case URB_FUNCTION_CLASS_INTERFACE: { + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; DPRINT1("URB_FUNCTION_CLASS_INTERFACE\n"); + DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); + DPRINT1("TransferBufferLength %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); + DPRINT1("TransferBuffer %x\n", Urb->UrbControlVendorClassRequest.TransferBuffer); + DPRINT1("TransferBufferMDL %x\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); + DPRINT1("RequestTypeReservedBits %x\n", Urb->UrbControlVendorClassRequest.RequestTypeReservedBits); + DPRINT1("Request %x\n", Urb->UrbControlVendorClassRequest.Request); + DPRINT1("Value %x\n", Urb->UrbControlVendorClassRequest.Value); + DPRINT1("Index %x\n", Urb->UrbControlVendorClassRequest.Index); + CtrlSetup.bmRequestType.B = 0xa1; //FIXME: Const. + CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request; + CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value; + CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index; + CtrlSetup.wLength = Urb->UrbControlVendorClassRequest.TransferBufferLength; + + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; + ExecuteTransfer(FdoDeviceExtension->DeviceObject, + UsbDevice, + 0, + &CtrlSetup, + 0, + Urb->UrbControlVendorClassRequest.TransferBuffer ? + Urb->UrbControlVendorClassRequest.TransferBuffer : + (PVOID)Urb->UrbControlVendorClassRequest.TransferBufferMDL, + Urb->UrbControlVendorClassRequest.TransferBuffer ? + Urb->UrbControlVendorClassRequest.TransferBufferLength : 0, + Irp); break; } default: @@ -632,8 +744,9 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) if (IsListEmpty(&DeviceExtension->IrpQueue)) { - DPRINT1("There should have been one SCE request pending\n"); + DPRINT1("There should have been one SCE request pending. Did the usbhub driver load?\n"); KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); + ASSERT(FALSE); return; } NextIrp = RemoveHeadList(&DeviceExtension->IrpQueue); diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index 0254fcc8204..0181628c952 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -47,12 +47,8 @@ const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] = 0x01, /* bNumInterfaces; (1) */ 0x23, /* bConfigurationValue; */ 0x00, /* iConfiguration; */ - 0x40, /* bmAttributes; - Bit 7: must be set, - 6: Self-powered, - 5: Remote wakeup, - 4..0: reserved */ - 0x00 /* MaxPower; */ + 0x40, /* bmAttributes; */ + 0x00 /* MaxPower; */ }; const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] = @@ -66,7 +62,7 @@ const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] = 0x09, /* bInterfaceClass; HUB_CLASSCODE */ 0x01, /* bInterfaceSubClass; */ 0x00, /* bInterfaceProtocol: */ - 0x00 /* iInterface; */ + 0x00 /* iInterface; */ }; const UCHAR ROOTHUB2_ENDPOINT_DESCRIPTOR [] = @@ -88,12 +84,14 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) PIO_STACK_LOCATION Stack = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; ULONG_PTR Information = 0; + PEHCI_HOST_CONTROLLER hcd; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; ASSERT(PdoDeviceExtension->Common.IsFdo == FALSE); + hcd = &FdoDeviceExtension->hcd; Stack = IoGetCurrentIrpStackLocation(Irp); switch(Stack->Parameters.DeviceIoControl.IoControlCode) @@ -108,13 +106,18 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) UsbDevice = Urb->UrbHeader.UsbdDeviceHandle; + /* If there was no device passed then this URB is for the RootHub */ if (UsbDevice == NULL) UsbDevice = PdoDeviceExtension->UsbDevices[0]; + /* Check if it is a Status Change Endpoint (SCE). The Hub Driver sends this request and miniports mark the IRP pending + if there is no changes on any of the ports. When the DPC of miniport routine detects changes this IRP will be completed. + Based on XEN PV Usb Drivers */ + if ((Urb->UrbHeader.Function == URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER) && (UsbDevice == PdoDeviceExtension->UsbDevices[0])) { - DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER on SCE\n"); + DPRINT("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER on SCE\n"); if (Urb->UrbBulkOrInterruptTransfer.PipeHandle != &UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor) { DPRINT1("PipeHandle doesnt match SCE PipeHandle\n"); @@ -123,12 +126,23 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) /* Queue the Irp first */ QueueURBRequest(PdoDeviceExtension, Irp); - /* Check if there is any connected devices */ - for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++) + /* Check for port changes */ + if (EnumControllerPorts(hcd) == FALSE) { - if (PdoDeviceExtension->Ports[i].PortChange == 0x01) + DPRINT("No port change\n"); + Status = STATUS_PENDING; + IoMarkIrpPending(Irp); + break; + } + + /* If we reached this point then port status has changed, so check + which port */ + for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++) + { + if (hcd->Ports[i].PortChange == 0x01) { - DPRINT1("Inform hub driver that port %d has changed\n", i+1); + DPRINT1("On SCE request: Inform hub driver that port %d has changed\n", i+1); + ASSERT(FALSE); ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7); Information = 0; Status = STATUS_SUCCESS; @@ -143,15 +157,11 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } } if (Status == STATUS_SUCCESS) break; - DPRINT1("Queueing IRP\n"); + IoMarkIrpPending(Irp); Status = STATUS_PENDING; break; } - else - { - DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB send to device %x\n", UsbDevice); - } Status = HandleUrbRequest(PdoDeviceExtension, Irp); @@ -186,7 +196,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE: { - DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE %x\n", Stack->Parameters.Others.Argument2); + DPRINT1("Ehci: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE %x\n", Stack->Parameters.Others.Argument2); if (Stack->Parameters.Others.Argument1) { /* Return the root hubs devicehandle */ @@ -202,12 +212,12 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_HUB_COUNT: { - DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT); + DPRINT1("Ehci: IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT); ASSERT(Stack->Parameters.Others.Argument1 != NULL); if (Stack->Parameters.Others.Argument1) { - /* FIXME: Determine the number of hubs between the usb device and root hub */ - DPRINT1("RootHubCount %x\n", *(PULONG)Stack->Parameters.Others.Argument1); + /* FIXME: Determine the number of hubs between the usb device and root hub. + For now we have at least one. */ *(PULONG)Stack->Parameters.Others.Argument1 = 1; } Status = STATUS_SUCCESS; @@ -235,15 +245,14 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO: { - DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO Arg1 %x, Arg2 %x\n", Stack->Parameters.Others.Argument1, Stack->Parameters.Others.Argument2); + DPRINT("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n"); + /* DDK documents that both the PDO and FDO are returned. However, while writing the UsbHub driver it was determine + that this was not the case. Windows usbehci driver gives the Pdo in both Arguments. Which makes sense as upper level + drivers should not be communicating with FDO. */ if (Stack->Parameters.Others.Argument1) *(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo; - - /* Windows usbehci driver gives the Pdo in both Arguments. */ if (Stack->Parameters.Others.Argument2) - //*(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDeviceReference(FdoDeviceExtension->DeviceObject); *(PVOID *)Stack->Parameters.Others.Argument2 = FdoDeviceExtension->Pdo; - Information = 0; Status = STATUS_SUCCESS; break; @@ -254,8 +263,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) DPRINT1("Ehci: IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); /* FIXME: Set Callback for safe power down */ CallBackInfo = Stack->Parameters.DeviceIoControl.Type3InputBuffer; - DPRINT1("IdleCallback %x\n", CallBackInfo->IdleCallback); - DPRINT1("IdleContext %x\n", CallBackInfo->IdleContext); PdoDeviceExtension->IdleCallback = CallBackInfo->IdleCallback; PdoDeviceExtension->IdleContext = CallBackInfo->IdleContext; @@ -300,6 +307,7 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) } case BusQueryHardwareIDs: { + /* FIXME: Build from Device Vendor and Device ID */ Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C&REV0000") + 1; Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C") + 1; Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20") + 1; @@ -388,7 +396,6 @@ PdoDispatchPnp( PPDO_DEVICE_EXTENSION PdoDeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExtension; UNICODE_STRING InterfaceSymLinkName; - LONG i; DPRINT1("Ehci: PDO StartDevice\n"); PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -397,15 +404,6 @@ PdoDispatchPnp( /* Create the root hub */ RootHubDevice = InternalCreateUsbDevice(1, 0, NULL, TRUE); - for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++) - { - PdoDeviceExtension->Ports[i].PortStatus = 0x8000; - PdoDeviceExtension->Ports[i].PortChange = 0; - - if (!FdoDeviceExtension->hcd.ECHICaps.HCSParams.PortPowerControl) - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_POWER; - } - RtlCopyMemory(&RootHubDevice->DeviceDescriptor, ROOTHUB2_DEVICE_DESCRIPTOR, sizeof(ROOTHUB2_DEVICE_DESCRIPTOR)); @@ -413,7 +411,8 @@ PdoDispatchPnp( RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId; RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId; - /* FIXME: Do something better below */ + /* Here config, interfaces and descriptors are stored. This was duplicated from XEN PV Usb Drivers implementation. + Not sure that it is really needed as the information can be queueried from the device. */ RootHubDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, sizeof(PVOID) * RootHubDevice->DeviceDescriptor.bNumConfigurations, @@ -483,11 +482,11 @@ PdoDispatchPnp( PPDO_DEVICE_EXTENSION PdoDeviceExtension; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - DPRINT1("BusRelations!!!!!\n"); + DPRINT("BusRelations!!!!!\n"); /* The hub driver has created the new device object and reported to pnp, as a result the pnp manager - has resent this IRP and type, so leave the next SCE request pending until a new device arrives. - Is there a better way to do this */ + has sent this IRP and type, so leave the next SCE request pending until a new device arrives. + Is there a better way to do this? */ ExAcquireFastMutex(&PdoDeviceExtension->ListLock); PdoDeviceExtension->HaltQueue = TRUE; ExReleaseFastMutex(&PdoDeviceExtension->ListLock); @@ -531,7 +530,7 @@ PdoDispatchPnp( DeviceCapabilities->UINumber = 0; DeviceCapabilities->DeviceD2 = 1; - /* FIXME */ + /* FIXME: Verify these settings are correct */ DeviceCapabilities->HardwareDisabled = FALSE; //DeviceCapabilities->NoDisplayInUI = FALSE; DeviceCapabilities->DeviceState[0] = PowerDeviceD0; diff --git a/reactos/drivers/usb/usbehci/transfer.c b/reactos/drivers/usb/usbehci/transfer.c index d129b0073cf..0f94a133875 100644 --- a/reactos/drivers/usb/usbehci/transfer.c +++ b/reactos/drivers/usb/usbehci/transfer.c @@ -7,9 +7,20 @@ * Michael Martin (michael.martin@reactos.org) */ +/* All QueueHeads, Descriptors and pipe setup packets used by control transfers are allocated from common buffer. + The routines in physmem manages this buffer. Each allocation is aligned to 32bits, which is requirement of USB 2.0. */ + #include "transfer.h" #include + +typedef struct _MAPREGISTERCALLBACKINFO +{ + PVOID MapRegisterBase; + KEVENT Event; +}MAPREGISTERCALLBACKINFO, *PMAPREGISTERCALLBACKINFO; + +/* Fills CtrlSetup parameter with values based on Urb */ VOID BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup) { @@ -76,6 +87,7 @@ BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_S /* SET CONFIG */ case URB_FUNCTION_SELECT_CONFIGURATION: + DPRINT1("Bulding data for Select Config\n"); CtrlSetup->bRequest = USB_REQUEST_SET_CONFIGURATION; CtrlSetup->wValue.W = Urb->UrbSelectConfiguration.ConfigurationDescriptor->bConfigurationValue; CtrlSetup->wIndex.W = 0; @@ -131,18 +143,86 @@ BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_S } } -BOOLEAN -SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd, - PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, - PVOID TransferBuffer, - ULONG TransferBufferLength, - PIRP IrpToComplete) +/* Build a Bulk Transfer with a max transfer of 3 descriptors which each has 5 pointers to one page of memory, paged align of course */ +PQUEUE_HEAD +BuildBulkTransfer(PEHCI_HOST_CONTROLLER hcd, + ULONG DeviceAddress, + USBD_PIPE_HANDLE PipeHandle, + UCHAR PidDirection, + PMDL pMdl, + BOOLEAN FreeMdl) +{ + PQUEUE_HEAD QueueHead; + PQUEUE_TRANSFER_DESCRIPTOR Descriptor[3]; + ULONG MdlByteCount = MmGetMdlByteCount(pMdl); + ULONG NeededDescriptorCount = 1; + int i; + + QueueHead = CreateQueueHead(hcd); + QueueHead->EndPointCharacteristics.DeviceAddress = DeviceAddress; + + if (PipeHandle) + { + QueueHead->EndPointCharacteristics.EndPointNumber = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->bEndpointAddress & 0x0F; + QueueHead->EndPointCharacteristics.MaximumPacketLength = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->wMaxPacketSize; + } + + QueueHead->FreeMdl = FreeMdl; + QueueHead->Mdl = pMdl; + + /* FIXME: This is totally screwed */ + /* Calculate how many descriptors would be needed to transfer this buffer */ + if (pMdl) + { + if (MdlByteCount < (PAGE_SIZE * 5)) + NeededDescriptorCount = 1; + else if (MdlByteCount < (PAGE_SIZE * 10)) + NeededDescriptorCount = 2; + else if (MdlByteCount < (PAGE_SIZE * 15)) + NeededDescriptorCount = 3; + else + ASSERT(FALSE); + } + /* Limiter Transfers to PAGE_SIZE * 5 * 3, Three Descriptors */ + + QueueHead->NumberOfTransferDescriptors = NeededDescriptorCount; + for (i=0; i< NeededDescriptorCount;i++) + { + Descriptor[i] = CreateDescriptor(hcd, + PidDirection, + 0); + Descriptor[i]->AlternateNextPointer = QueueHead->DeadDescriptor->PhysicalAddr; + + if (i > 0) + { + Descriptor[i-1]->NextDescriptor = Descriptor[i]; + Descriptor[i]->PreviousDescriptor = Descriptor[i-1]; + Descriptor[i-1]->NextPointer = Descriptor[i]->PhysicalAddr; + } + } + + Descriptor[0]->Token.Bits.InterruptOnComplete = TRUE; + + /* Save the first descriptor in the QueueHead */ + QueueHead->FirstTransferDescriptor = Descriptor[0]; + QueueHead->NextPointer = Descriptor[0]->PhysicalAddr; + + return QueueHead; +} + + +/* Builds a QueueHead with 2 to 3 descriptors needed for control transfer + 2 descriptors used for and control request that doesnt return data, such as SetAddress */ +PQUEUE_HEAD +BuildControlTransfer(PEHCI_HOST_CONTROLLER hcd, + ULONG DeviceAddress, + USBD_PIPE_HANDLE PipeHandle, + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, + PMDL pMdl, + BOOLEAN FreeMdl) { PQUEUE_HEAD QueueHead; PQUEUE_TRANSFER_DESCRIPTOR Descriptor[3]; - ULONG MdlPhysicalAddr; - PKEVENT Event = NULL; - PMDL pMdl = NULL; PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetupVA, CtrlPhysicalPA; CtrlSetupVA = (PUSB_DEFAULT_PIPE_SETUP_PACKET)AllocateMemory(hcd, @@ -150,57 +230,45 @@ SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd, (ULONG*)&CtrlPhysicalPA); RtlCopyMemory(CtrlSetupVA, CtrlSetup, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET)); - /* If no Irp then wait on completion */ - if (IrpToComplete == NULL) - { - Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT)); - KeInitializeEvent(Event, NotificationEvent, FALSE); - } - - if (TransferBuffer) - { - /* Allocate Mdl for Buffer */ - pMdl = IoAllocateMdl(TransferBuffer, - TransferBufferLength, - FALSE, - FALSE, - NULL); - - /* Lock Physical Pages */ - MmBuildMdlForNonPagedPool(pMdl); - //MmProbeAndLockPages(pMdl, KernelMode, IoReadAccess); - - MdlPhysicalAddr = MmGetPhysicalAddress((PVOID)TransferBuffer).LowPart; - } QueueHead = CreateQueueHead(hcd); + QueueHead->EndPointCharacteristics.DeviceAddress = DeviceAddress; + if (PipeHandle) + QueueHead->EndPointCharacteristics.EndPointNumber = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->bEndpointAddress & 0x0F; + + QueueHead->Token.Bits.DataToggle = TRUE; + QueueHead->FreeMdl = FreeMdl; + QueueHead->Mdl = pMdl; Descriptor[0] = CreateDescriptor(hcd, PID_CODE_SETUP_TOKEN, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET)); - Descriptor[0]->Token.Bits.InterruptOnComplete = FALSE; Descriptor[0]->Token.Bits.DataToggle = FALSE; - /* Save the first descriptor */ - QueueHead->TransferDescriptor = Descriptor[0]; + QueueHead->FirstTransferDescriptor = Descriptor[0]; - if (TransferBuffer) + if (pMdl) { Descriptor[1] = CreateDescriptor(hcd, PID_CODE_IN_TOKEN, - TransferBufferLength); + MmGetMdlByteCount(pMdl)); + + Descriptor[2] = CreateDescriptor(hcd, + PID_CODE_OUT_TOKEN, + 0); + } + else + { + Descriptor[2] = CreateDescriptor(hcd, + PID_CODE_IN_TOKEN, + 0); } - Descriptor[2] = CreateDescriptor(hcd, - PID_CODE_OUT_TOKEN, - 0); - - Descriptor[1]->Token.Bits.InterruptOnComplete = FALSE; + Descriptor[2]->Token.Bits.InterruptOnComplete = TRUE; /* Link the descriptors */ - - if (TransferBuffer) + if (pMdl) { Descriptor[0]->NextDescriptor = Descriptor[1]; Descriptor[1]->NextDescriptor = Descriptor[2]; @@ -213,35 +281,267 @@ SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd, Descriptor[2]->PreviousDescriptor = Descriptor[0]; } - /* Assign the descritors buffers */ + /* Assign the descriptor buffers */ Descriptor[0]->BufferPointer[0] = (ULONG)CtrlPhysicalPA; - - if (TransferBuffer) - { - Descriptor[1]->BufferPointer[0] = MdlPhysicalAddr; + Descriptor[0]->BufferPointerVA[0] = (ULONG)CtrlSetupVA; + + if (pMdl) + { Descriptor[0]->NextPointer = Descriptor[1]->PhysicalAddr; - Descriptor[1]->NextPointer = Descriptor[2]->PhysicalAddr; + Descriptor[0]->AlternateNextPointer = Descriptor[2]->PhysicalAddr; + Descriptor[1]->NextPointer = Descriptor[2]->PhysicalAddr; + Descriptor[1]->AlternateNextPointer = Descriptor[2]->PhysicalAddr; } else { Descriptor[0]->NextPointer = Descriptor[2]->PhysicalAddr; + Descriptor[0]->AlternateNextPointer = Descriptor[2]->PhysicalAddr; } QueueHead->NextPointer = Descriptor[0]->PhysicalAddr; + if (pMdl) + QueueHead->NumberOfTransferDescriptors = 3; + else + QueueHead->NumberOfTransferDescriptors = 2; + return QueueHead; +} - QueueHead->IrpToComplete = IrpToComplete; - QueueHead->MdlToFree = pMdl; - QueueHead->Event = Event; - /* Link in the QueueHead */ - LinkQueueHead(hcd, QueueHead); +IO_ALLOCATION_ACTION NTAPI MapRegisterCallBack(PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID MapRegisterBase, + PVOID Context) +{ + PMAPREGISTERCALLBACKINFO CallBackInfo = (PMAPREGISTERCALLBACKINFO)Context; + + CallBackInfo->MapRegisterBase = MapRegisterBase; + + KeSetEvent(&CallBackInfo->Event, IO_NO_INCREMENT, FALSE); + return KeepObject; +} + +NTSTATUS +ExecuteTransfer(PDEVICE_OBJECT DeviceObject, + PUSB_DEVICE UsbDevice, + USBD_PIPE_HANDLE PipeHandle, + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, + ULONG TransferFlags, + PVOID TransferBufferOrMdl, + ULONG TransferBufferLength, + PIRP IrpToComplete) +{ + PUSB_ENDPOINT_DESCRIPTOR EndPointDesc = NULL; + PEHCI_HOST_CONTROLLER hcd; + PQUEUE_HEAD QueueHead; + PKEVENT CompleteEvent = NULL; + PMAPREGISTERCALLBACKINFO CallBackInfo; + LARGE_INTEGER TimeOut; + PMDL pMdl = NULL; + BOOLEAN FreeMdl = FALSE; + PVOID VirtualAddressOfMdl; + ULONG NumberOfMapRegisters; + KIRQL OldIrql; + NTSTATUS Status = STATUS_SUCCESS; + UCHAR EndPointType, PidDirection; + BOOLEAN IsReadOp = TRUE; + ULONG TransferBtyesOffset, CurrentTransferBytes; + PQUEUE_TRANSFER_DESCRIPTOR Descriptor; + PHYSICAL_ADDRESS PhysicalAddr; + int i,j; + + hcd = &((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->hcd; + + /* If no Irp then we will need to wait on completion */ if (IrpToComplete == NULL) { - DPRINT1("Waiting For Completion %x!\n", Event); - KeWaitForSingleObject(Event, Suspended, KernelMode, FALSE, NULL); - ExFreePool(Event); + CompleteEvent = ExAllocatePool(NonPagedPool, sizeof(KEVENT)); + KeInitializeEvent(CompleteEvent, NotificationEvent, FALSE); } - return TRUE; + CallBackInfo = ExAllocatePool(NonPagedPool, sizeof(MAPREGISTERCALLBACKINFO)); + CallBackInfo->MapRegisterBase = 0; + + KeInitializeEvent(&CallBackInfo->Event, NotificationEvent, FALSE); + + /* Determine EndPoint Type */ + if (!PipeHandle) + { + EndPointType = USB_ENDPOINT_TYPE_CONTROL; + } + else + { + EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)PipeHandle; + EndPointType = EndPointDesc->bmAttributes & 0x0F; + } + + if (TransferBufferOrMdl) + { + /* Create MDL for Buffer */ + if (TransferBufferLength) + { + pMdl = IoAllocateMdl(TransferBufferOrMdl, + TransferBufferLength, + FALSE, + FALSE, + NULL); + /* UEHCI created the MDL so it needs to free it */ + FreeMdl = TRUE; + } + else + { + pMdl = TransferBufferOrMdl; + } + MmBuildMdlForNonPagedPool(pMdl); + } + + switch (EndPointType) + { + case USB_ENDPOINT_TYPE_CONTROL: + { + QueueHead = BuildControlTransfer(hcd, + UsbDevice->Address, + PipeHandle, + CtrlSetup, + pMdl, + FreeMdl); + IsReadOp = TRUE; + break; + } + case USB_ENDPOINT_TYPE_BULK: + { + PidDirection = EndPointDesc->bEndpointAddress >> 7; + if (PidDirection) + IsReadOp = FALSE; + + QueueHead = BuildBulkTransfer(hcd, + UsbDevice->Address, + PipeHandle, + PidDirection, + pMdl, + FreeMdl); + + break; + } + case USB_ENDPOINT_TYPE_INTERRUPT: + { + DPRINT1("Interrupt Endpoints not implemented yet!\n"); + break; + } + case USB_ENDPOINT_TYPE_ISOCHRONOUS: + { + DPRINT1("Isochronous Endpoints not implemented yet!\n"); + break; + } + default: + { + DPRINT1("Unknown Endpoint type!!\n"); + break; + } + } + + QueueHead->IrpToComplete = IrpToComplete; + QueueHead->Event = CompleteEvent; + + if (!pMdl) + { + ASSERT(QueueHead->NumberOfTransferDescriptors == 2); + LinkQueueHead(hcd, QueueHead); + if (IrpToComplete == NULL) + { + DPRINT1("Waiting For Completion %x!\n", CompleteEvent); + TimeOut.QuadPart = -10000000; + KeWaitForSingleObject(CompleteEvent, Suspended, KernelMode, FALSE, NULL);//&TimeOut); + DPRINT1("Request Completed\n"); + ExFreePool(CompleteEvent); + } + return Status; + } + //ASSERT(FALSE); + + KeFlushIoBuffers(pMdl, IsReadOp, TRUE); + NumberOfMapRegisters = 15; + + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + hcd->pDmaAdapter->DmaOperations->AllocateAdapterChannel(hcd->pDmaAdapter, + ((PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->ControllerFdo, + NumberOfMapRegisters, + MapRegisterCallBack, + (PVOID)CallBackInfo); + KeLowerIrql(OldIrql); + DPRINT1("Waiting for AdapterChannel\n"); + KeWaitForSingleObject(&CallBackInfo->Event, Suspended, KernelMode, FALSE, NULL); + DPRINT1("Dma controller ready!\n"); + DPRINT1("Getting address for MDL %x\n", pMdl); + + VirtualAddressOfMdl = MmGetMdlVirtualAddress(pMdl); + + TransferBtyesOffset = 0; + while (TransferBtyesOffset < MmGetMdlByteCount(pMdl)) + { + CurrentTransferBytes = MmGetMdlByteCount(pMdl); + Descriptor = QueueHead->FirstTransferDescriptor; + if ((Descriptor->Token.Bits.PIDCode == PID_CODE_SETUP_TOKEN) && (QueueHead->NumberOfTransferDescriptors == 3)) + { + DPRINT1("QueueHead is for endpoint 0\n"); + DPRINT1("MapRegisterBase %x\n", CallBackInfo->MapRegisterBase); + DPRINT1("VirtualAddressOfMdl %x, TransferBytesOffset %x\n", VirtualAddressOfMdl, TransferBtyesOffset); + Descriptor = Descriptor->NextDescriptor; + PhysicalAddr = hcd->pDmaAdapter->DmaOperations->MapTransfer(hcd->pDmaAdapter, + pMdl, + CallBackInfo->MapRegisterBase, + (PVOID)((ULONG_PTR)VirtualAddressOfMdl + TransferBtyesOffset), + &CurrentTransferBytes, + !IsReadOp); + DPRINT1("BufferPointer[0] = %x\n", PhysicalAddr.LowPart); + Descriptor->BufferPointer[0] = PhysicalAddr.LowPart; + DPRINT1("CurrentTransferBytes %x\n", CurrentTransferBytes); + TransferBtyesOffset += CurrentTransferBytes; + LinkQueueHead(hcd, QueueHead); + break; + } + DPRINT1("PID_CODE_SETUP_TOKEN %x, PidDirection %x, NumDesc %x\n", PID_CODE_SETUP_TOKEN, PidDirection, QueueHead->NumberOfTransferDescriptors); + for (i=0; iNumberOfTransferDescriptors; i++) + { + if (Descriptor->Token.Bits.PIDCode != PID_CODE_SETUP_TOKEN) + { + for (j=0; j<5; j++) + { + PhysicalAddr = hcd->pDmaAdapter->DmaOperations->MapTransfer(hcd->pDmaAdapter, + pMdl, + CallBackInfo->MapRegisterBase, + (PVOID)((ULONG_PTR)VirtualAddressOfMdl + TransferBtyesOffset), + &CurrentTransferBytes, + !IsReadOp); + DPRINT1("BufferPointer[%d] = %x\n", j, PhysicalAddr.LowPart); + Descriptor->BufferPointer[j] = PhysicalAddr.LowPart; + TransferBtyesOffset += CurrentTransferBytes; + if (TransferBtyesOffset >= MmGetMdlByteCount(pMdl)) + break; + } + } + Descriptor = Descriptor->NextDescriptor; + } + LinkQueueHead(hcd, QueueHead); + break; + } + + if (TransferBtyesOffset < MmGetMdlByteCount(pMdl)) ASSERT(FALSE); + if (IrpToComplete == NULL) + { + DPRINT1("Waiting For Completion %x!\n", CompleteEvent); + TimeOut.QuadPart = -10000000; + KeWaitForSingleObject(CompleteEvent, Suspended, KernelMode, FALSE, NULL);//&TimeOut); + DPRINT1("Request Completed\n"); + ExFreePool(CompleteEvent); + } + + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + hcd->pDmaAdapter->DmaOperations->FreeMapRegisters(hcd->pDmaAdapter, + CallBackInfo->MapRegisterBase, + NumberOfMapRegisters); + + hcd->pDmaAdapter->DmaOperations->FreeAdapterChannel (hcd->pDmaAdapter); + KeLowerIrql(OldIrql); + return Status; } diff --git a/reactos/drivers/usb/usbehci/transfer.h b/reactos/drivers/usb/usbehci/transfer.h index eebffd921fa..a7d6f40d87b 100644 --- a/reactos/drivers/usb/usbehci/transfer.h +++ b/reactos/drivers/usb/usbehci/transfer.h @@ -3,18 +3,37 @@ #include "hardware.h" #include "hwiface.h" #include "physmem.h" +#include "usbehci.h" #include #include -BOOLEAN -SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd, - PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, - PVOID TransferBuffer, - ULONG TransferBufferLength, - PIRP IrpToComplete); +PQUEUE_HEAD +BuildControlTransfer(PEHCI_HOST_CONTROLLER hcd, + ULONG DeviceAddress, + USBD_PIPE_HANDLE PipeHandle, + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, + PMDL pMdl, + BOOLEAN FreeMdl); + +PQUEUE_HEAD +BuildBulkTransfer(PEHCI_HOST_CONTROLLER hcd, + ULONG DeviceAddress, + USBD_PIPE_HANDLE PipeHandle, + UCHAR PidDirection, + PMDL pMdl, + BOOLEAN FreeMdl); VOID BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup); +NTSTATUS +ExecuteTransfer(PDEVICE_OBJECT DeviceObject, + PUSB_DEVICE UsbDevice, + USBD_PIPE_HANDLE PipeHandle, + PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup, + ULONG TransferFlags, + PVOID TransferBufferOrMdl, + ULONG TransferBufferLength, + PIRP IrpToComplete); From b69fae78dbcf8795c66e705eefa5a64956e2d553 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Wed, 13 Apr 2011 08:14:37 +0000 Subject: [PATCH 04/10] [GDI32] * DPtoLP/LPtoDP functions should return TRUE even if they get 0 or less points or if pointer to points is invalid. See gdi32:DPtoLP apitest. * Fixes 24 gdi32:DPtoLP apitests. svn path=/trunk/; revision=51328 --- .../subsystems/win32/win32k/objects/coord.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/coord.c b/reactos/subsystems/win32/win32k/objects/coord.c index 634320a1600..67b57b366eb 100644 --- a/reactos/subsystems/win32/win32k/objects/coord.c +++ b/reactos/subsystems/win32/win32k/objects/coord.c @@ -256,18 +256,14 @@ NtGdiTransformPoints( PDC pdc; LPPOINT Points; ULONG Size; - BOOL ret; + BOOL ret = TRUE; + + if (Count <= 0) + return TRUE; pdc = DC_LockDc(hDC); if (!pdc) { - EngSetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - - if (!UnsafePtsIn || !UnsafePtOut || Count <= 0) - { - DC_UnlockDc(pdc); EngSetLastError(ERROR_INVALID_PARAMETER); return FALSE; } @@ -291,8 +287,7 @@ NtGdiTransformPoints( } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - SetLastNtError(_SEH2_GetExceptionCode()); - ret = FALSE; + /* Do not set last error */ _SEH2_YIELD(goto leave;) } _SEH2_END; @@ -323,8 +318,7 @@ NtGdiTransformPoints( } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - SetLastNtError(_SEH2_GetExceptionCode()); - ret = FALSE; + /* Do not set last error */ } _SEH2_END; From 45fc0e0951fbc3c79ef5e4002a55b5dfb0d6e88f Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Wed, 13 Apr 2011 18:25:58 +0000 Subject: [PATCH 05/10] [explorer] - Use the shell default auto-arrangement positioning. Aloow using custom positioning when configured. This fixes the positioning of icons of the desktop to look like windows svn path=/trunk/; revision=51330 --- reactos/base/shell/explorer/desktop/desktop.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/base/shell/explorer/desktop/desktop.cpp b/reactos/base/shell/explorer/desktop/desktop.cpp index 99b990bec39..e7787055b8d 100644 --- a/reactos/base/shell/explorer/desktop/desktop.cpp +++ b/reactos/base/shell/explorer/desktop/desktop.cpp @@ -496,8 +496,6 @@ DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView) { _hwndListView = GetNextWindow(hwnd, GW_CHILD); - SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE); - // work around for Windows NT, Win 98, ... // Without this the desktop has mysteriously only a size of 800x600 pixels. ClientRect rect(hwnd); @@ -506,9 +504,8 @@ DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView) // subclass background window new BackgroundWindow(_hwndListView); - _icon_algo = 1; // default icon arrangement + _icon_algo = 0; // default icon arrangement - PositionIcons(); InitDragDrop(); } @@ -737,6 +734,9 @@ void DesktopShellView::PositionIcons(int dir) RECT work_area; SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0); + /* disable default allignment */ + SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE); + const POINTS& dir1 = s_align_dir1[_icon_algo]; const POINTS& dir2 = s_align_dir2[_icon_algo]; const POINTS& start_pos = s_align_start[_icon_algo]; From 1968375672f90beb9211ab0bcdb8c1406101f46a Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Wed, 13 Apr 2011 20:20:16 +0000 Subject: [PATCH 06/10] remove obsolete object handling svn path=/trunk/; revision=51331 --- reactos/base/applications/taskmgr/trayicon.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/base/applications/taskmgr/trayicon.c b/reactos/base/applications/taskmgr/trayicon.c index c48222dd6fd..92617e6556d 100644 --- a/reactos/base/applications/taskmgr/trayicon.c +++ b/reactos/base/applications/taskmgr/trayicon.c @@ -113,8 +113,6 @@ done: */ if (hScreenDC) ReleaseDC(NULL, hScreenDC); - if (hOldBitmap) - hBitmap = SelectObject(hDC, hOldBitmap); if (hDC) DeleteDC(hDC); if (hBitmapBrush) From 3203ddd6e15bbe66b18615d31b1248256fbb13e4 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Thu, 14 Apr 2011 01:21:38 +0000 Subject: [PATCH 07/10] [Win32k] - Fix implementation of message callbacks, now callbacks can be called across processes. - Fix some comments. svn path=/trunk/; revision=51332 --- .../subsystems/win32/win32k/ntuser/message.c | 24 ++++-- .../subsystems/win32/win32k/ntuser/msgqueue.c | 76 +++++++++++++++---- 2 files changed, 79 insertions(+), 21 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index ed7c718eea8..2a2097f6703 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1425,8 +1425,8 @@ co_IntSendMessageWithCallBack( HWND hWnd, RETURN( FALSE); } - /* If this is not a callback and it can be sent now, then send it. */ - if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) + /* If it can be sent now, then send it. */ + if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue) { if (Win32Thread->TIF_flags & TIF_INCLEANUP) { @@ -1452,11 +1452,20 @@ co_IntSendMessageWithCallBack( HWND hWnd, ObDereferenceObject(Win32Thread->pEThread); IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); + + if (CompletionCallback) + { + co_IntCallSentMessageCallback(CompletionCallback, + hWnd, + Msg, + CompletionCallbackContext, + Result); + } } - if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) + if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue) { if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE))) { @@ -1471,6 +1480,12 @@ co_IntSendMessageWithCallBack( HWND hWnd, RETURN( FALSE); } + IntReferenceMessageQueue(Window->head.pti->MessageQueue); + /* Take reference on this MessageQueue if its a callback. It will be released + when message is processed or removed from target hwnd MessageQueue */ + if (CompletionCallback) + IntReferenceMessageQueue(Win32Thread->MessageQueue); + Message->Msg.hwnd = hWnd; Message->Msg.message = Msg; Message->Msg.wParam = wParam; @@ -1482,8 +1497,6 @@ co_IntSendMessageWithCallBack( HWND hWnd, Message->SenderQueue = NULL; // mjmartin, you are right! This is null. Message->CallBackSenderQueue = Win32Thread->MessageQueue; Message->DispatchingListEntry.Flink = NULL; - - IntReferenceMessageQueue(Window->head.pti->MessageQueue); Message->CompletionCallback = CompletionCallback; Message->CompletionCallbackContext = CompletionCallbackContext; Message->HookMessage = MSQ_NORMAL; @@ -1492,7 +1505,6 @@ co_IntSendMessageWithCallBack( HWND hWnd, InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, TRUE); - IntDereferenceMessageQueue(Window->head.pti->MessageQueue); RETURN(TRUE); diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 8c036a415e1..f5f678d3120 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -588,6 +588,28 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) Message->Msg.wParam, Message->Msg.lParam); } + else if ((Message->CompletionCallback) + && (Message->CallBackSenderQueue == MessageQueue)) + { /* Call the callback routine */ + if (Message->QS_Flags & QS_SMRESULT) + { + co_IntCallSentMessageCallback(Message->CompletionCallback, + Message->Msg.hwnd, + Message->Msg.message, + Message->CompletionCallbackContext, + Message->lResult); + /* Set callback to NULL to prevent reentry */ + Message->CompletionCallback = NULL; + } + else + { + /* The message has not been processed yet, reinsert it. */ + RemoveEntryList(&Message->ListEntry); + InsertTailList(&Message->CallBackSenderQueue->SentMessagesListHead, &Message->ListEntry); + DPRINT("Callback Message not processed yet. Requeuing the message\n"); + return (FALSE); + } + } else { /* Call the window procedure. */ Result = co_IntSendMessage( Message->Msg.hwnd, @@ -600,6 +622,22 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) to be cleaned up on thread termination anymore */ RemoveEntryList(&Message->ListEntry); + /* If the message is a callback, insert it in the callback senders MessageQueue */ + if (Message->CompletionCallback) + { + if (Message->CallBackSenderQueue) + { + Message->lResult = Result; + Message->QS_Flags |= QS_SMRESULT; + + /* insert it in the callers message queue */ + InsertTailList(&Message->CallBackSenderQueue->SentMessagesListHead, &Message->ListEntry); + MsqWakeQueue(Message->CallBackSenderQueue, QS_SENDMESSAGE, TRUE); + IntDereferenceMessageQueue(Message->CallBackSenderQueue); + } + return (TRUE); + } + /* remove the message from the dispatching list if needed, so lock the sender's message queue */ if (Message->SenderQueue) { @@ -635,19 +673,10 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE); } - /* Call the callback if the message was sent with SendMessageCallback */ - if (Message->CompletionCallback != NULL) - { - co_IntCallSentMessageCallback(Message->CompletionCallback, - Message->Msg.hwnd, - Message->Msg.message, - Message->CompletionCallbackContext, - Result); - } - - /* Only if the message has a sender was the queue referenced */ + /* if the message has a sender */ if (Message->SenderQueue) { + /* dereference our and the sender's message queue */ IntDereferenceMessageQueue(Message->SenderQueue); IntDereferenceMessageQueue(MessageQueue); } @@ -710,6 +739,11 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) RemoveEntryList(&SentMessage->ListEntry); ClearMsgBitsMask(MessageQueue, SentMessage->QS_Flags); + /* if it is a callback and this queue is not the sender queue, dereference queue */ + if ((SentMessage->CompletionCallback) && (SentMessage->CallBackSenderQueue != MessageQueue)) + { + IntDereferenceMessageQueue(SentMessage->CallBackSenderQueue); + } /* Only if the message has a sender was the queue referenced */ if ((SentMessage->SenderQueue) && (SentMessage->DispatchingListEntry.Flink != NULL)) @@ -729,7 +763,7 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) ExFreePool((PVOID)SentMessage->Msg.lParam); } - /* Only if the message has a sender was the queue referenced */ + /* if the message has a sender */ if (SentMessage->SenderQueue) { /* dereference our and the sender's message queue */ @@ -1573,8 +1607,14 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, ListEntry); + /* if it is a callback and this queue is not the sender queue, dereference queue */ + if ((CurrentSentMessage->CompletionCallback) && (CurrentSentMessage->CallBackSenderQueue != MessageQueue)) + { + IntDereferenceMessageQueue(CurrentSentMessage->CallBackSenderQueue); + } + DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); - /* Only if the message has a sender was the queue referenced */ + /* Only if the message has a sender was the message in the DispatchingList */ if ((CurrentSentMessage->SenderQueue) && (CurrentSentMessage->DispatchingListEntry.Flink != NULL)) { @@ -1593,7 +1633,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* Only if the message has a sender was the queue referenced */ + /* if the message has a sender */ if (CurrentSentMessage->SenderQueue) { /* dereference our and the sender's message queue */ @@ -1613,6 +1653,12 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, ListEntry); + /* if it is a callback and this queue is not the sender queue, dereference queue */ + if ((CurrentSentMessage->CompletionCallback) && (CurrentSentMessage->CallBackSenderQueue != MessageQueue)) + { + IntDereferenceMessageQueue(CurrentSentMessage->CallBackSenderQueue); + } + /* remove the message from the dispatching list */ if(CurrentSentMessage->DispatchingListEntry.Flink != NULL) { @@ -1633,7 +1679,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue) ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); } - /* Only if the message has a sender was the queue referenced */ + /* if the message has a sender */ if (CurrentSentMessage->SenderQueue) { /* dereference our and the sender's message queue */ From 95618801634b8924ea4d15d8e039b61571d66710 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 14 Apr 2011 09:57:08 +0000 Subject: [PATCH 08/10] [RTL] - Properly check parameters in RtlFindActivationContextSectionString. Almost the same as Wine did, but factored out into a standalone function, improved undocumented flags checks and allowing null data pointer in certain cases. svn path=/trunk/; revision=51333 --- reactos/lib/rtl/actctx.c | 52 +++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index 1a6dc569178..562240c2b61 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -2667,30 +2667,48 @@ RtlQueryInformationActivationContext( ULONG flags, HANDLE handle, PVOID subinst, return STATUS_SUCCESS; } +#define FIND_ACTCTX_RETURN_FLAGS 0x00000002 +#define FIND_ACTCTX_RETURN_ASSEMBLY_METADATA 0x00000004 +#define FIND_ACTCTX_VALID_MASK (FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX | FIND_ACTCTX_RETURN_FLAGS | FIND_ACTCTX_RETURN_ASSEMBLY_METADATA) + +NTSTATUS +NTAPI +RtlpFindActivationContextSection_CheckParameters( ULONG flags, const GUID *guid, ULONG section_kind, + UNICODE_STRING *section_name, PACTCTX_SECTION_KEYED_DATA data ) +{ + /* Check general parameter combinations */ + if (!section_name || + (flags & ~FIND_ACTCTX_VALID_MASK) || + ((flags & FIND_ACTCTX_VALID_MASK) && !data) || + (data && data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex))) + { + DPRINT1("invalid parameter\n"); + return STATUS_INVALID_PARAMETER; + } + + /* TODO */ + if (flags & FIND_ACTCTX_RETURN_FLAGS || + flags & FIND_ACTCTX_RETURN_ASSEMBLY_METADATA) + { + DPRINT1("unknown flags %08x\n", flags); + return STATUS_INVALID_PARAMETER; + } + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG section_kind, UNICODE_STRING *section_name, PVOID ptr ) { PACTCTX_SECTION_KEYED_DATA data = ptr; - NTSTATUS status = STATUS_SXS_KEY_NOT_FOUND; + NTSTATUS status; - if (guid) - { - DPRINT1("expected guid == NULL\n"); - return STATUS_INVALID_PARAMETER; - } - if (flags & ~FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX) - { - DPRINT1("unknown flags %08x\n", flags); - return STATUS_INVALID_PARAMETER; - } - if (!data || data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) || - !section_name || !section_name->Buffer) - { - DPRINT1("invalid parameter\n"); - return STATUS_INVALID_PARAMETER; - } + status = RtlpFindActivationContextSection_CheckParameters(flags, guid, section_kind, section_name, data); + if (!NT_SUCCESS(status)) return status; + + status = STATUS_SXS_KEY_NOT_FOUND; ASSERT(NtCurrentTeb()); ASSERT(NtCurrentTeb()->ActivationContextStackPointer); From 4ae88bb7a4b83f998715a50aa2fcdad9dd2d4927 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 14 Apr 2011 11:55:40 +0000 Subject: [PATCH 09/10] [CMAKE] - Reflect the recent user32_apitest changes. Please consider updating the cmake files when you alter the rbuild files in the future. svn path=/trunk/; revision=51336 --- rostests/apitests/user32/CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rostests/apitests/user32/CMakeLists.txt b/rostests/apitests/user32/CMakeLists.txt index 9fc9374db52..4be297e2f49 100644 --- a/rostests/apitests/user32/CMakeLists.txt +++ b/rostests/apitests/user32/CMakeLists.txt @@ -2,14 +2,16 @@ add_definitions(-D_DLL -D__USE_CRTIMP) list(APPEND SOURCE + DeferWindowPos.c + GetIconInfo.c + GetKeyState.c + GetPeekMessage.c + GetSystemMetrics.c InitializeLpkHooks.c RealGetWindowClass.c ScrollDC.c ScrollWindowEx.c - GetSystemMetrics.c - GetIconInfo.c - GetPeekMessage.c - DeferWindowPos.c + SetCursorPos.c testlist.c user32_apitest.rc) From c512ea5c43861a7dd5980beeb8f250eee9ec5992 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 14 Apr 2011 12:13:38 +0000 Subject: [PATCH 10/10] [TRANSLATIONS] Igor Paliychuk (mansonigor at gmail dot com): * Update Ukrainian localization. * Leftover from r51055: Update reactos.exe strings and resource sizes. * Fix displaying of doskey localizations. svn path=/trunk/; revision=51338 --- .../applications/cmdutils/doskey/doskey.c | 3 + .../cmdutils/doskey/lang/uk-UA.rc | 32 +-- .../applications/cmdutils/more/lang/uk-UA.rc | 12 +- .../base/applications/dxdiag/lang/ua-UA.rc | 4 +- .../base/applications/fontview/lang/uk-UA.rc | 2 +- reactos/base/applications/mmc/lang/uk-UA.rc | 2 +- .../applications/network/ping/lang/uk-UA.rc | 6 +- .../base/applications/sndvol32/lang/uk-UA.rc | 8 +- reactos/base/setup/reactos/lang/bg-BG.rc | 13 +- reactos/base/setup/reactos/lang/cs-CZ.rc | 8 +- reactos/base/setup/reactos/lang/de-DE.rc | 8 +- reactos/base/setup/reactos/lang/el-GR.rc | 13 +- reactos/base/setup/reactos/lang/en-US.rc | 8 +- reactos/base/setup/reactos/lang/es-ES.rc | 13 +- reactos/base/setup/reactos/lang/et-EE.rc | 13 +- reactos/base/setup/reactos/lang/fi-FI.rc | 13 +- reactos/base/setup/reactos/lang/fr-FR.rc | 8 +- reactos/base/setup/reactos/lang/hu-HU.rc | 13 +- reactos/base/setup/reactos/lang/it-IT.rc | 13 +- reactos/base/setup/reactos/lang/no-NO.rc | 13 +- reactos/base/setup/reactos/lang/pl-PL.rc | 10 +- reactos/base/setup/reactos/lang/pt-BR.rc | 13 +- reactos/base/setup/reactos/lang/ro-RO.rc | 13 +- reactos/base/setup/reactos/lang/ru-RU.rc | 13 +- reactos/base/setup/reactos/lang/sk-SK.rc | 8 +- reactos/base/setup/reactos/lang/uk-UA.rc | 25 +- reactos/base/setup/vmwinst/lang/uk-UA.rc | 54 ++--- reactos/base/shell/explorer-new/lang/uk-UA.rc | 2 +- reactos/base/shell/explorer/explorer-uk.rc | 22 +- reactos/base/system/format/lang/uk-UA.rc | 2 +- reactos/dll/cpl/usrmgr/lang/uk-UA.rc | 223 ++++++++++++++++++ reactos/dll/cpl/usrmgr/rsrc.rc | 1 + .../win32/csrss/win32csr/lang/uk-UA.rc | 2 +- 33 files changed, 417 insertions(+), 176 deletions(-) create mode 100644 reactos/dll/cpl/usrmgr/lang/uk-UA.rc diff --git a/reactos/base/applications/cmdutils/doskey/doskey.c b/reactos/base/applications/cmdutils/doskey/doskey.c index 1f1b86370da..14237f90f16 100644 --- a/reactos/base/applications/cmdutils/doskey/doskey.c +++ b/reactos/base/applications/cmdutils/doskey/doskey.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "doskey.h" #define MAX_STRING 2000 @@ -190,6 +191,8 @@ static LPWSTR RemoveQuotes(LPWSTR str) int wmain(VOID) { + setlocale(LC_ALL, ""); + /* Get the full command line using GetCommandLine(). We can't just use argv, * because then a parameter like "gotoroot=cd \" wouldn't be passed completely. */ WCHAR *pArgStart; diff --git a/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc b/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc index 259f63b7db5..3655d47f57d 100644 --- a/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc +++ b/reactos/base/applications/cmdutils/doskey/lang/uk-UA.rc @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: base/applications/cmdutils/doskey/lang/uk-UA.rc * PURPOSE: Ukraianian Language File for ReactOS DOSKey - * TRANSLATOR: Sakara Yevhen + * TRANSLATOR: Sakara Yevhen, Igor Paliychuk */ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT @@ -11,25 +11,25 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE BEGIN -IDS_HELP, "Менеджер командного рядка для редагування налаштувань, історії та макросів.\n\ +IDS_HELP, "Менеджер командного рядка для редагування налаштувань, iсторiї та макросiв.\n\ \n\ DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\ \n\ - /INSERT Дозвіл включення режиму.\n\ - /OVERSTRIKE Заборона включення режиму.\n\ - /EXENAME=exename Встановлення ім'я програми для перегляду/зміни історії\n\ - і макросів. Значення за замовчуванням cmd.exe.\n\ - /HISTORY Відображення історії команд.\n\ - /LISTSIZE=size Встановлення кількості команд за історію буфера.\n\ - /REINSTALL Очищення історії команд.\n\ - /MACROS Відображення макросі визначень.\n\ - /MACROS:exename Відображення макросі визначень для конкретної програми.\n\ - /MACROS:ALL Відображення макросі визначень для всіх програм.\n\ - /MACROFILE=filename Завантаження макросі визначень з файлу.\n\ - macroname Визначення ім'я макросу для створення.\n\ - text Визначення заміни тексту в макросі.\n" + /INSERT Включає режим вставки.\n\ + /OVERSTRIKE Вiдключає режим вставки.\n\ + /EXENAME=exename Встановлення назви програми для перегляду/змiни iсторiї\n\ + i макросiв. Значення за замовчуванням cmd.exe.\n\ + /HISTORY Вiдображення iсторiї команд.\n\ + /LISTSIZE=size Встановлення кiлькостi команд в буфері iсторiї.\n\ + /REINSTALL Очищення iсторiї команд.\n\ + /MACROS Вiдображення визначень макросiв.\n\ + /MACROS:exename Вiдображення визначень макросiв для конкретної програми.\n\ + /MACROS:ALL Вiдображення визначень макросiв для всiх програм.\n\ + /MACROFILE=filename Завантаження визначень макросiв з файлу.\n\ + macroname Визначення iменi макросу для створення.\n\ + text Визначення замiни тексту в макросi.\n" -IDS_INVALID_MACRO_DEF, "Недійсний макрос визначення: %s\n" +IDS_INVALID_MACRO_DEF, "Недiйсний макрос визначення: %s\n" END diff --git a/reactos/base/applications/cmdutils/more/lang/uk-UA.rc b/reactos/base/applications/cmdutils/more/lang/uk-UA.rc index 918fafb5528..5a930bb8449 100644 --- a/reactos/base/applications/cmdutils/more/lang/uk-UA.rc +++ b/reactos/base/applications/cmdutils/more/lang/uk-UA.rc @@ -9,15 +9,15 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE BEGIN - IDS_USAGE, "Виводить інфрмацію поекранно. Використання:\n\n\ - MORE < [Drive:][Path]Ім'я_файлу\n\ + IDS_USAGE, "Виводить iнфрмацію поекранно. Використання:\n\n\ + MORE < [Диск:][Шлях]Iм'я_файлу\n\ Command | MORE \n\ - MORE [Drive:][Path]Ім'я_файлу\n\n\ + MORE [Диск:][Шлях]Iм'я_файлу\n\n\ Де: \n\ - [Drive:][Path]Ім'я_файлу Файл, вміст якого треба вивести на екран.\n\ + [Диск:][Шлях]Ім'я_файлу Файл, вмiст якого треба вивести на екран.\n\ Command\t\t Команда, результат роботи якої треба вивести на екран.\n\n\ - На запрошення ""-- Далі --"" Ви можете натиснути будь-яку клавішу щоб побачити наступну сторінку.\n" + На запрошення ""-- Далi --"" Ви можете натиснути будь-яку клавiшу щоб побачити наступну сторiнку.\n" - IDS_CONTINUE, " -- Далі (100%) -- " + IDS_CONTINUE, " -- Далi (100%) -- " IDS_FILE_ACCESS, "Не можу отримати доступ до файла %s." END diff --git a/reactos/base/applications/dxdiag/lang/ua-UA.rc b/reactos/base/applications/dxdiag/lang/ua-UA.rc index 4acffc0173d..0cd5c0aa74c 100644 --- a/reactos/base/applications/dxdiag/lang/ua-UA.rc +++ b/reactos/base/applications/dxdiag/lang/ua-UA.rc @@ -219,7 +219,7 @@ BEGIN IDS_REG_SUCCESS "Так" IDS_REG_FAIL "Помилка" IDS_DDTEST_ERROR "Збій у перевірці!" - IDS_DDTEST_DESCRIPTION "Буде виконана перевірка DirecDraw на цей пристрій. Продовжити?" + IDS_DDTEST_DESCRIPTION "Буде виконана перевірка інтерфейсу DirecDraw. Продовжити?" IDS_DDPRIMARY_DESCRIPTION "Цей тест буде використовувати DirectDraw для малювання на первинній поверхні. Будуть виводитись чорні та білі прямокутники. Продовжити?" IDS_DDPRIMARY_RESULT "Ви бачили чорні та білі прямокутники?" IDS_DDOFFSCREEN_DESCRIPTION "Цей тест буде використовувати DirectDraw для малювання в закадровий буфер. Повинен рухатись білий прямокутник. Продовжити?" @@ -229,4 +229,6 @@ BEGIN IDS_FORMAT_ADAPTER_MEM "%u Мб" IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u біт)(%uГц)" IDS_OPTION_NO "Ні" + IDS_D3DTEST_DESCRIPTION "Буде виконана перевірка інтерфейсу Direct3D. Продовжити?" + IDS_D3DTEST_D3Dx "Цей тест використає апаратно-прискорений Direct3D інтерфейс %u." END diff --git a/reactos/base/applications/fontview/lang/uk-UA.rc b/reactos/base/applications/fontview/lang/uk-UA.rc index 3290c0010db..5ba42fa40eb 100644 --- a/reactos/base/applications/fontview/lang/uk-UA.rc +++ b/reactos/base/applications/fontview/lang/uk-UA.rc @@ -14,7 +14,7 @@ BEGIN IDS_PRINT, "Друк" IDS_STRING, "Jackdaws love my big sphinx of quartz. 1234567890" IDS_ERROR, "Помилка" - IDS_ERROR_NOMEM, "Недостатньо пам'яті для завершення операцію." + IDS_ERROR_NOMEM, "Недостатньо пам'яті для завершення операції." IDS_ERROR_NOFONT, "Файл %1 не є коректним файлом шрифту." IDS_ERROR_NOCLASS, "Неможливо ініціалізувати віконний клас." IDS_ERROR_BADCMD, "Не вказаний файл шрифту.\nСинтаксис:\n fontview.exe <файл шрифту>" diff --git a/reactos/base/applications/mmc/lang/uk-UA.rc b/reactos/base/applications/mmc/lang/uk-UA.rc index d13444a7973..1e8190b78d4 100644 --- a/reactos/base/applications/mmc/lang/uk-UA.rc +++ b/reactos/base/applications/mmc/lang/uk-UA.rc @@ -25,5 +25,5 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_APPTITLE "Консоль керування ReactOS" - IDS_CONSOLETITLE "Console%1!u!" + IDS_CONSOLETITLE "Консоль%1!u!" END diff --git a/reactos/base/applications/network/ping/lang/uk-UA.rc b/reactos/base/applications/network/ping/lang/uk-UA.rc index eb0523a771f..95ef509d7a5 100644 --- a/reactos/base/applications/network/ping/lang/uk-UA.rc +++ b/reactos/base/applications/network/ping/lang/uk-UA.rc @@ -12,9 +12,9 @@ STRINGTABLE DISCARDABLE BEGIN IDS_USAGE "\nВикористання: ping [-t] [-n count] [-l size] [-w timeout] хост\n\n\ Опції:\n\ - -t Пінг вказаного вузла поки не буде здійстена ручна зупинка.\n\ + -t Пінг вказаного вузла поки не буде здійснена ручна зупинка.\n\ Для зупинки натисніть Control-C.\n\ - -n count Число запитів, які будуть підправлені.\n\ + -n count Кількість запитів, які будуть підправлені.\n\ -l size Розмір буфера відправки.\n\ -w timeout Час очікування кожної відповіді в мілісекундах.\n\n\0" @@ -28,7 +28,7 @@ BEGIN IDS_SETSOCKOPT_FAILED "setsockopt невдалий (%1!d!).\n\0" IDS_COULD_NOT_CREATE_SOCKET "Не вдалося створити сокет (#%1!d!).\n\0" IDS_COULD_NOT_INIT_WINSOCK "Не вдалося ініціалізувати winsock dll.\n\0" - IDS_DEST_MUST_BE_SPECIFIED "Ім'я або IP-адреса хосту повинне бути вказане.\n\0" + IDS_DEST_MUST_BE_SPECIFIED "Ім'я або IP-адреса хосту повинні бути вказані.\n\0" IDS_BAD_PARAMETER "Поганий параметр %1.\n\0" IDS_BAD_OPTION_FORMAT "Невірний формат опції %1.\n\0" IDS_BAD_OPTION "Погана опція %1.\n\0" diff --git a/reactos/base/applications/sndvol32/lang/uk-UA.rc b/reactos/base/applications/sndvol32/lang/uk-UA.rc index 8683013dab2..c993a77a357 100644 --- a/reactos/base/applications/sndvol32/lang/uk-UA.rc +++ b/reactos/base/applications/sndvol32/lang/uk-UA.rc @@ -54,12 +54,12 @@ IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + LTEXT "Головна", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 - LTEXT "Balance", -1, 4, 35, 80, 42 - LTEXT "Volume", -1, 4, 100, 77, 108 + LTEXT "Баланс", -1, 4, 35, 80, 42 + LTEXT "Гучність", -1, 4, 100, 77, 108 CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 - CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CHECKBOX "&Тиша", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 END diff --git a/reactos/base/setup/reactos/lang/bg-BG.rc b/reactos/base/setup/reactos/lang/bg-BG.rc index 7854b217ec1..8bd5990ad93 100644 --- a/reactos/base/setup/reactos/lang/bg-BG.rc +++ b/reactos/base/setup/reactos/lang/bg-BG.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&Отказ",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Разширени дялови настройски" FONT 8, "MS Shell Dlg" @@ -89,12 +89,13 @@ BEGIN CONTROL "Папка за слагане", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Слагане на зареждач", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Слагане на зареждач", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Слагане на начален зареждач (MBR) на твърдия диск", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Без слагане на начален зареждач", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&Добре", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Отказ", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Слагане на начален зареждач (MBR и VBR) на твърдия диск", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Слагане на начален зареждач (само VBR) на твърдия диск", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Без слагане на начален зареждач", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&Добре", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Отказ", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/cs-CZ.rc b/reactos/base/setup/reactos/lang/cs-CZ.rc index 7ba1456c1a3..b5d6d723611 100644 --- a/reactos/base/setup/reactos/lang/cs-CZ.rc +++ b/reactos/base/setup/reactos/lang/cs-CZ.rc @@ -85,7 +85,7 @@ BEGIN PUSHBUTTON "&Storno",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Pokroиilб nastavenн oddнlu" FONT 8, "MS Shell Dlg" @@ -93,13 +93,13 @@ BEGIN CONTROL "Instalaиnн sloћka", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Instalace zavadмиe", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalace zavadмиe", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Nainstalovat zavadми na pevnэ disk (MBR a VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Nainstalovat zavadми na pevnэ disk (jen VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "Zavadми neinstalovat", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Storno", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Storno", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/de-DE.rc b/reactos/base/setup/reactos/lang/de-DE.rc index 1c8a1f4fb0e..500a03f810e 100644 --- a/reactos/base/setup/reactos/lang/de-DE.rc +++ b/reactos/base/setup/reactos/lang/de-DE.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&Abbrechen",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Erweiterte Partitionseinstellungen" FONT 8, "MS Shell Dlg" @@ -89,13 +89,13 @@ BEGIN CONTROL "Installationsverzeichnis", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Bootloader-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Bootloader-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Installiere Bootloader auf Festplatte (MBR und VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Installiere Bootloader auf Festplatte (VBR nur)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "Keine Bootloader-Installation", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Abbrechen", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Abbrechen", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/el-GR.rc b/reactos/base/setup/reactos/lang/el-GR.rc index fde44aed901..1f32e36947a 100644 --- a/reactos/base/setup/reactos/lang/el-GR.rc +++ b/reactos/base/setup/reactos/lang/el-GR.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&ўкхсп",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "СхимЯуейт Partition гйб рспчщсзмЭнпхт" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "ЦЬкелпт егкбфЬуфбузт", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "ЕгкбфЬуфбуз Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "ЕгкбфЬуфбуз Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "ЕгкбфЬуфбуз boot loader уфп уклзсь дЯукп (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Нб мз гЯней егкбфЬуфбуз фпх bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&ўкхсп", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "ЕгкбфЬуфбуз boot loader уфп уклзсь дЯукп (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "ЕгкбфЬуфбуз boot loader уфп уклзсь дЯукп (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Нб мз гЯней егкбфЬуфбуз фпх bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&ўкхсп", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/en-US.rc b/reactos/base/setup/reactos/lang/en-US.rc index e0f4eccf865..036ec468700 100644 --- a/reactos/base/setup/reactos/lang/en-US.rc +++ b/reactos/base/setup/reactos/lang/en-US.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -89,13 +89,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/es-ES.rc b/reactos/base/setup/reactos/lang/es-ES.rc index 91f685c6447..cc440ed16eb 100644 --- a/reactos/base/setup/reactos/lang/es-ES.rc +++ b/reactos/base/setup/reactos/lang/es-ES.rc @@ -83,7 +83,7 @@ BEGIN PUSHBUTTON "&Cancelar",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Ajustes avanzados de la particiуn" FONT 8, "MS Shell Dlg" @@ -91,12 +91,13 @@ BEGIN CONTROL "Carpeta de instalaciуn", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Instalaciуn del cargador de arranque", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalaciуn del cargador de arranque", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Instalar el cargador de arranque en el disco duro (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "No instalar el cargador de arranque", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&Aceptar", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancelar", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Instalar el cargador de arranque en el disco duro (MBR y VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Instalar el cargador de arranque en el disco duro (solo VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "No instalar el cargador de arranque", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&Aceptar", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancelar", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/et-EE.rc b/reactos/base/setup/reactos/lang/et-EE.rc index 938f67989ba..e7d446a8dd5 100644 --- a/reactos/base/setup/reactos/lang/et-EE.rc +++ b/reactos/base/setup/reactos/lang/et-EE.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Tьhista",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Tдpsemad vormindamise seaded" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Paigaldamise kaust", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Alglaaduri paigaldamine", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Alglaaduri paigaldamine", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Paigalda alglaadur kхvakettale (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Дra paigalda alglaadurit", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&Olgu", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Tьhista", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Paigalda alglaadur kхvakettale (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Paigalda alglaadur kхvakettale (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Дra paigalda alglaadurit", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&Olgu", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Tьhista", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/fi-FI.rc b/reactos/base/setup/reactos/lang/fi-FI.rc index 3581e1f4b0c..e30ec8ddc8d 100644 --- a/reactos/base/setup/reactos/lang/fi-FI.rc +++ b/reactos/base/setup/reactos/lang/fi-FI.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/fr-FR.rc b/reactos/base/setup/reactos/lang/fr-FR.rc index 68e3cc1a41a..5a8019096d5 100644 --- a/reactos/base/setup/reactos/lang/fr-FR.rc +++ b/reactos/base/setup/reactos/lang/fr-FR.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -87,13 +87,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/hu-HU.rc b/reactos/base/setup/reactos/lang/hu-HU.rc index 573cb8f9fb9..cf13733d859 100644 --- a/reactos/base/setup/reactos/lang/hu-HU.rc +++ b/reactos/base/setup/reactos/lang/hu-HU.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -89,12 +89,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/it-IT.rc b/reactos/base/setup/reactos/lang/it-IT.rc index 6337058194e..bdcd461daf7 100644 --- a/reactos/base/setup/reactos/lang/it-IT.rc +++ b/reactos/base/setup/reactos/lang/it-IT.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Annulla",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Impostazioni avanzate delle partizioni" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Cartella di installazione", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Installazione del Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Installazione del Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Installazione del Boot loader sul disco fisso (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Non installare il Boot loader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Annulla", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Installazione del Boot loader sul disco fisso (MBR e VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Installazione del Boot loader sul disco fisso (solo VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Non installare il Boot loader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Annulla", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/no-NO.rc b/reactos/base/setup/reactos/lang/no-NO.rc index cad018c8e25..a152f312bb0 100644 --- a/reactos/base/setup/reactos/lang/no-NO.rc +++ b/reactos/base/setup/reactos/lang/no-NO.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Avbryt",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Avansert partisjon innstillinger" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Installasjon mappe", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Oppstartslaster installasjon", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Oppstartslaster installasjon", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Installer oppstartslaster pе harddiskens (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Ikke installer oppstartslaster", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Avbryt", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Installer oppstartslaster pе harddiskens (MBR og VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Installer oppstartslaster pе harddiskens (bare VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Ikke installer oppstartslaster", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Avbryt", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/pl-PL.rc b/reactos/base/setup/reactos/lang/pl-PL.rc index 2a3a4ea6bad..dbb342a0167 100644 --- a/reactos/base/setup/reactos/lang/pl-PL.rc +++ b/reactos/base/setup/reactos/lang/pl-PL.rc @@ -88,7 +88,7 @@ BEGIN PUSHBUTTON "&Anuluj",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Zaawansowane ustawienia partycji" FONT 8, "MS Shell Dlg" @@ -96,13 +96,13 @@ BEGIN CONTROL "Folder instalacji", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Instalacja bootloadera", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalacja bootloadera", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Wgraj bootloader na dysk twardy (MBR i VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Wgraj bootloader na dysk twardy (tylko VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 - CONTROL "Pomiс wgrywanie bootloadera", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Anuluj", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Pomiс wgrywanie bootloadera", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Anuluj", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/pt-BR.rc b/reactos/base/setup/reactos/lang/pt-BR.rc index 3ed304ce173..22d7a649e89 100644 --- a/reactos/base/setup/reactos/lang/pt-BR.rc +++ b/reactos/base/setup/reactos/lang/pt-BR.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Advanced Partition Settings" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/ro-RO.rc b/reactos/base/setup/reactos/lang/ro-RO.rc index c1ffceded5f..2006d93c172 100644 --- a/reactos/base/setup/reactos/lang/ro-RO.rc +++ b/reactos/base/setup/reactos/lang/ro-RO.rc @@ -79,7 +79,7 @@ BEGIN PUSHBUTTON "&Revocare",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Setari avansate partitie" FONT 8, "MS Shell Dlg" @@ -87,12 +87,13 @@ BEGIN CONTROL "Folder instalare", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Instalare incarcator", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Instalare incarcator", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Instalare incarcator pe hard disc (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Nu se instaleaza incarcator", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Revocare", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Instalare incarcator pe hard disc (MBR si VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Instalare incarcator pe hard disc (numai VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Nu se instaleaza incarcator", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Revocare", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/ru-RU.rc b/reactos/base/setup/reactos/lang/ru-RU.rc index 2e49613fb87..c50cc7392f8 100644 --- a/reactos/base/setup/reactos/lang/ru-RU.rc +++ b/reactos/base/setup/reactos/lang/ru-RU.rc @@ -81,7 +81,7 @@ BEGIN PUSHBUTTON "&Отставить",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Дополнительные параметры установки" FONT 8, "MS Shell Dlg" @@ -89,12 +89,13 @@ BEGIN CONTROL "Базовый каталог", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,12,283,14, WS_VISIBLE - CONTROL "Установка загрузчика", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Установка загрузчика", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Установить загрузчик на диск (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,49,278,11 - CONTROL "Не устанавливать загрузчик", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,60,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Отмена", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Установить загрузчик на диск (MBR и VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,49,278,11 + CONTROL "Установить загрузчик на диск (только VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Не устанавливать загрузчик", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Отмена", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/sk-SK.rc b/reactos/base/setup/reactos/lang/sk-SK.rc index 6cbeb134664..d28bba3ebfe 100644 --- a/reactos/base/setup/reactos/lang/sk-SK.rc +++ b/reactos/base/setup/reactos/lang/sk-SK.rc @@ -84,7 +84,7 @@ BEGIN PUSHBUTTON "&Zruљiќ",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME CAPTION "Rozљнrenй nastavenia partнcie" FONT 8, "MS Shell Dlg" @@ -92,13 +92,13 @@ BEGIN CONTROL "Inљtalaиnэ prieиinok", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Inљtalбcia zavбdzaиa systйmu", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Inљtalбcia zavбdzaиa systйmu", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 CONTROL "Nainљtalovaќ zavбdzaи systйmu na pevnэ disk (MBR a VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 CONTROL "Nainљtalovaќ zavбdzaи systйmu na pevnэ disk (iba VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 CONTROL "Nenainљtalovaќ zavбdzaи systйmu", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Zruљiќ", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Zruљiќ", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 diff --git a/reactos/base/setup/reactos/lang/uk-UA.rc b/reactos/base/setup/reactos/lang/uk-UA.rc index 0a5c407f4d1..7e52e71b499 100644 --- a/reactos/base/setup/reactos/lang/uk-UA.rc +++ b/reactos/base/setup/reactos/lang/uk-UA.rc @@ -67,7 +67,7 @@ BEGIN PUSHBUTTON "&Створити", IDC_PARTCREATE, 20,155,50,15 PUSHBUTTON "&Видалити", IDC_PARTDELETE, 76,155,50,15 PUSHBUTTON "Д&райвер", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED - PUSHBUTTON "&Додаткові параметри...", IDC_PARTMOREOPTS, 218,155,80,15 + PUSHBUTTON "&Додаткові Опції...", IDC_PARTMOREOPTS, 218,155,80,15 LTEXT "Для початку встановлення натисніть Далі", IDC_STATIC, 10, 180 ,277, 20 END @@ -87,20 +87,21 @@ BEGIN PUSHBUTTON "&Скасувати",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END -IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 +IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME -CAPTION "Додаткові параметри встановлення" +CAPTION "Розширені параметри розділу" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Базовий каталог", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 + CONTROL "Тека встановлення", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30 EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE - CONTROL "Встановлення завантажувача", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41 + CONTROL "Встановлення завантажувача", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52 - CONTROL "Встановити завантажувач на диск (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 - CONTROL "Не встановлювати завантажувач", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11 - PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE - PUSHBUTTON "&Скасувати", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE + CONTROL "Встановити завантажувач на жосткий диск (MBR та VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11 + CONTROL "Встановити завантажувач на жосткий диск (лише VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11 + CONTROL "Не встановлювати завантажувач", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11 + PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE + PUSHBUTTON "&Скасувати", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 @@ -108,7 +109,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS CAPTION "Встановлення ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Встановлення Акаунта", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 + CONTROL "Інформація про Встановлення", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 LTEXT "Для початку встановлення натисніть Далі.", IDC_STATIC, 10, 180 ,277, 20 END @@ -151,8 +152,8 @@ BEGIN IDS_PROCESSSUBTITLE "Створення розділу на диску, копіювання файлів, встановлення завантажувача" IDS_RESTARTTITLE "Перший етап встановлення завершено" IDS_RESTARTSUBTITLE "Перший етап завершено, для продовження потрібне перезавантаження" - IDS_SUMMARYTITLE "Встановлення Акаунта" - IDS_SUMMARYSUBTITLE "Список встановлення властивостей для перевірки, перш ніж звернутися при встановленні пристроїв" + IDS_SUMMARYTITLE "Інформація про Встановлення" + IDS_SUMMARYSUBTITLE "Перевірте список властивостей встановлення, перш ніж почати встановлення системи" IDS_ABORTSETUP "ReactOS встановлений на комп'ютер не повністю. Якщо ви закриєте програму встановлення зараз, в подальшому вам доведеться повторити встановлення ReactOS. Ви впевнені, що необхідно перервати встановлення?" IDS_ABORTSETUP2 "Перервати встановлення?" END diff --git a/reactos/base/setup/vmwinst/lang/uk-UA.rc b/reactos/base/setup/vmwinst/lang/uk-UA.rc index 9f8ffceaacd..f7178e79aa7 100644 --- a/reactos/base/setup/vmwinst/lang/uk-UA.rc +++ b/reactos/base/setup/vmwinst/lang/uk-UA.rc @@ -10,24 +10,24 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT IDD_WELCOMEPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Установка відеодрайвера" +CAPTION "Встановлення відеодрайвера" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Програма установки ReactOS виявила, що Ви запустили ReactOS всередені VMware(r).", -1, 117, 8, 140, 24 - LTEXT "Якщо Ви бажаєте встановити SVGA драйвер VMware(r), натисніть ""Далі"", інакше натисніть ""Скасувати"".", -1, 117, 140, 140, 17 + LTEXT "Програма встановлення ReactOS виявила, що Ви запустили ReactOS всередені VMware(r).", -1, 117, 8, 140, 24 + LTEXT "Якщо Ви бажаєте встановити SVGA драйвер VMware(r), натисніть ""Далі"", інакше натисніть ""Скасувати"".", -1, 117, 140, 140, 24 END IDD_INSERT_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Установка відеодрайвера" +CAPTION "Встановлення відеодрайвера" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Програма установки ReactOS не включає SVGA драйвер VMware(r).\n\nТому йдіть до меню ""VM"" у VMware(r) workstation і виберіть ""Install VMware tools...""\n\n\nНатисніть ""Далі"" для продовження або ""Скасувати"", щоб пропустити установку SVGA драйвера.",-1,25,25,225,85 + LTEXT "Програма встановлення ReactOS не включає SVGA драйвер VMware(r).\n\nТому йдіть до меню ""VM"" у VMware(r) workstation і виберіть ""Install VMware tools...""\n\n\nНатисніть ""Далі"" для продовження або ""Скасувати"", щоб пропустити встановлення SVGA драйвера.",-1,25,25,225,85 END IDD_INSTALLING_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Установка відеодрайвера" +CAPTION "Встановлення відеодрайвера" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "{STATUS}",IDC_INSTALLINGSTATUS,25,68,225,8 @@ -36,10 +36,10 @@ END IDD_CONFIG DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Установка відеодрайвера" +CAPTION "Встановлення відеодрайвера" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Установку SVGA драйвера VMware(r) завершено успішно. Оберіть переважну роздільну здатність екрану:",-1,25,5,225,20 + LTEXT "Встановлення SVGA драйвера VMware(r) завершено успішно. Оберіть потрібну роздільну здатність екрану:",-1,25,5,225,20 PUSHBUTTON "640x480", 1120, 25, 30, 65, 15, BS_AUTORADIOBUTTON PUSHBUTTON "800x600", 1400, 25, 45, 65, 15, BS_AUTORADIOBUTTON PUSHBUTTON "1024x768", 1792, 25, 60, 65, 15, BS_AUTORADIOBUTTON @@ -57,48 +57,48 @@ END IDD_INSTALLATION_FAILED DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Установка відеодрайвера" +CAPTION "Встановлення відеодрайвера" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Програма установки ReactOS не змогла встановити SVGA драйвер VMware(r).\n\n\nНатисніть ""Завершити"" для продовження процесу установки.",-1,25,25,225,85 + LTEXT "Програма встановлення ReactOS не змогла встановити SVGA драйвер VMware(r).\n\n\nНатисніть ""Завершити"" для продовження процесу встановлення.",-1,25,25,225,85 END IDD_CHOOSEACTION DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Установка відеодрайвера" +CAPTION "Встановлення відеодрайвера" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "SVGA драйвер VMware(r) SVGA вже встановлений.\n\nОберіть, що Ви хочете зробити:",-1,25,5,225,30 PUSHBUTTON "Налаштувати параметри екрану", IDC_CONFIGSETTINGS, 25, 40, 200, 15, BS_AUTORADIOBUTTON PUSHBUTTON "Скористатися іншим графічним драйвером", IDC_USEOTHERDRIVER, 25, 55, 200, 15, BS_AUTORADIOBUTTON PUSHBUTTON "Видалити SVGA драйвер VMware(r)", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON - LTEXT "Натисніть ""Далі"" для продовження або ""Скасувати"" для виходу з майстра.", -1, 25, 93, 225, 12 + LTEXT "Натисніть ""Далі"" для продовження або ""Скасувати"" для виходу з майстра.", -1, 25, 93, 225, 17 END IDD_SELECTDRIVER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Установка відеодрайвера" +CAPTION "Встановлення відеодрайвера" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Будь ласка оберіть графічний драйвер, який Ви хотіли б використовувати:",-1,25,25,225,15 PUSHBUTTON "ReactOS VGA драйвер", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON PUSHBUTTON "ReactOS VBE драйвер (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON - LTEXT "Натисніть ""Завершити"" для завершення операції або ""Скасувати"" для виходу з програми установки без збереження змін.", -1, 25, 93, 225, 20 + LTEXT "Натисніть ""Завершити"" для завершення операції або ""Скасувати"" для виходу з програми встановлення без збереження змін.", -1, 25, 93, 225, 20 END IDD_DOUNINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Установка відеодрайвера" +CAPTION "Встановлення відеодрайвера" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Програма установки ReactOS готова видалити SVGA драйвер VMWare(r)!!!\n\n\nНатисніть ""Завершити"" для видалення драйвера або ""Скасувати"" щоб залишити його як є.",-1,25,25,225,85 + LTEXT "Програма встановлення ReactOS готова видалити SVGA драйвер VMWare(r)!!!\n\n\nНатисніть ""Завершити"" для видалення драйвера або ""Скасувати"" щоб залишити його як є.",-1,25,25,225,85 END STRINGTABLE BEGIN IDS_WIZARD_NAME "Виявлений VMware(r)" - IDS_FAILEDTOLOCATEDRIVERS "Програма установки ReactOS не змогла знайти необхідні файли.\nПереконайтеся, що CD-ROM VMware(r) tools вставлений." - IDS_FAILEDTOCOPYFILES "Програма установки ReactOS не змогла скопіювати необхідні файли.\nПереконайтеся, що CD-ROM VMware(r) tools вставлений.\n" + IDS_FAILEDTOLOCATEDRIVERS "Програма встановлення ReactOS не змогла знайти необхідні файли.\nПереконайтеся, що CD-ROM VMware(r) tools вставлений." + IDS_FAILEDTOCOPYFILES "Програма встановлення ReactOS не змогла скопіювати необхідні файли.\nПереконайтеся, що CD-ROM VMware(r) tools вставлений.\n" IDS_FAILEDTOACTIVATEDRIVER "Не вдалося запустити SVGA драйвер VMware(r)!" IDS_FAILEDTOSELVGADRIVER "Не вдалося запустити ReactOS VGA драйвер!" IDS_FAILEDTOSELVBEDRIVER "Не вдалося запустити ReactOS VBE драйвер!" @@ -122,18 +122,18 @@ END STRINGTABLE BEGIN - IDD_INSERT_VMWARE_TOOLSTITLE "Майстер установки SVGA драйвера VMware (r)" + IDD_INSERT_VMWARE_TOOLSTITLE "Майстер встановлення SVGA драйвера VMware (r)" IDD_INSERT_VMWARE_TOOLSSUBTITLE "Будь ласка вставте диск VMware tools." - IDD_INSTALLING_VMWARE_TOOLSTITLE "Майстер установки SVGA драйвера VMware (r)" + IDD_INSTALLING_VMWARE_TOOLSTITLE "Майстер встановлення SVGA драйвера VMware (r)" IDD_INSTALLING_VMWARE_TOOLSSUBTITLE "Пошук і копіювання SVGA драйвера VMware (r)." - IDD_CONFIGTITLE "Майстер установки SVGA драйвера VMware (r)" - IDD_CONFIGSUBTITLE "Оберіть Вашу улюблену роздільну здатність екрану." - IDD_INSTALLATION_FAILEDTITLE "Майстер установки SVGA драйвера VMware (r)" - IDD_INSTALLATION_FAILEDSUBTITLE "Установка SVGA драйвера VMware (r) не вдалася." - IDD_CHOOSEACTIONTITLE "Майстер установки SVGA драйвера VMware (r)" + IDD_CONFIGTITLE "Майстер встановлення SVGA драйвера VMware (r)" + IDD_CONFIGSUBTITLE "Оберіть потрібну Вам роздільну здатність екрану." + IDD_INSTALLATION_FAILEDTITLE "Майстер встановлення SVGA драйвера VMware (r)" + IDD_INSTALLATION_FAILEDSUBTITLE "Встановлення SVGA драйвера VMware (r) не вдалася." + IDD_CHOOSEACTIONTITLE "Майстер встановлення SVGA драйвера VMware (r)" IDD_CHOOSEACTIONSUBTITLE "Виберіть, що Ви хочете зробити." - IDD_SELECTDRIVERTITLE "Майстер установки SVGA драйвера VMware (r)" + IDD_SELECTDRIVERTITLE "Майстер встановлення SVGA драйвера VMware (r)" IDD_SELECTDRIVERSUBTITLE "Обрати драйвер." - IDD_DOUNINSTALLTITLE "Майстер установки SVGA драйвера VMware (r)" + IDD_DOUNINSTALLTITLE "Майстер встановлення SVGA драйвера VMware (r)" IDD_DOUNINSTALLSUBTITLE "Видалити драйвер." END diff --git a/reactos/base/shell/explorer-new/lang/uk-UA.rc b/reactos/base/shell/explorer-new/lang/uk-UA.rc index 65462be70a4..71e96fe477a 100644 --- a/reactos/base/shell/explorer-new/lang/uk-UA.rc +++ b/reactos/base/shell/explorer-new/lang/uk-UA.rc @@ -128,7 +128,7 @@ BEGIN IDS_PROPERTIES "В&ластивості" IDS_OPEN_ALL_USERS "&Всі користувачі" IDS_EXPLORE_ALL_USERS "&Огляд всіх користувачів" - IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable." + IDS_STARTUP_ERROR "Система не може стартувати explorer, оскільки реєстр пошкоджений або відсутній." END STRINGTABLE DISCARDABLE diff --git a/reactos/base/shell/explorer/explorer-uk.rc b/reactos/base/shell/explorer/explorer-uk.rc index 271ba94ccfd..1d3f8ae757e 100644 --- a/reactos/base/shell/explorer/explorer-uk.rc +++ b/reactos/base/shell/explorer/explorer-uk.rc @@ -174,27 +174,27 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "Оберіть найбільш зручний для вас алгоритм вирівнювання значків:", IDC_STATIC,7,7,166,16 - CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + CONTROL "лів/верх низ",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,25,46,44 - CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + CONTROL "лів/верх прв",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,25,46,44 - CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + CONTROL "прв/верх лів",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,25,46,44 - CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + CONTROL "прв/верх низ",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,25,46,44 - CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + CONTROL "лів/низ верх",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,73,46,44 - CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + CONTROL "лів/низ прав",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,73,46,44 - CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + CONTROL "прав/низ лів",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,73,46,44 - CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + CONTROL "прв/низ верх",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,73,46,44 - CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + CONTROL "по краях",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,121,46,44 - CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + CONTROL "верхні кути",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,121,46,44 - CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + CONTROL "навколо",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,121,46,44 CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,121,46,44 diff --git a/reactos/base/system/format/lang/uk-UA.rc b/reactos/base/system/format/lang/uk-UA.rc index eac761efea2..d54b4a00f10 100644 --- a/reactos/base/system/format/lang/uk-UA.rc +++ b/reactos/base/system/format/lang/uk-UA.rc @@ -69,7 +69,7 @@ STRING_ENTER_LABEL "Мі STRING_NO_LABEL "Не можу встановити мітку диску" -STRING_FREE_SPACE "\n%I64d байтів на диску.\n%I64d байтів наявно на диску.\n" +STRING_FREE_SPACE "\n%I64d байтів на диску.\n%I64d байтів доступно на диску.\n" STRING_SERIAL_NUMBER "\nСерійний номер диску - %04X-%04X\n" END diff --git a/reactos/dll/cpl/usrmgr/lang/uk-UA.rc b/reactos/dll/cpl/usrmgr/lang/uk-UA.rc new file mode 100644 index 00000000000..36c118c9b1d --- /dev/null +++ b/reactos/dll/cpl/usrmgr/lang/uk-UA.rc @@ -0,0 +1,223 @@ +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +/* + * Attention Translators: + * DO NOT TRANSLATE THESE RESOURCES YET! + */ + +/* Dialogs */ + +IDD_USERS DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Користувачі" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 7, 238, 85, WS_EX_CLIENTEDGE +END + + +IDD_GROUPS DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Групи" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 7, 238, 85, WS_EX_CLIENTEDGE +END + + +IDD_EXTRA DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Додатково" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Це місце навмисно залишене порожнім", IDC_STATIC, 66, 90, 112, 8 +END + + +IDD_USER_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Загальні" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_USER_GENERAL_NAME, 7, 12, 112, 8 + LTEXT "Повне Ім'я:", -1, 7, 46, 63, 8 + EDITTEXT IDC_USER_GENERAL_FULL_NAME,77,43,168,13,ES_AUTOHSCROLL + LTEXT "Опис:", -1, 7, 64, 63, 8 + EDITTEXT IDC_USER_GENERAL_DESCRIPTION,77,61,168,13,ES_AUTOHSCROLL + AUTOCHECKBOX "Користувач має змінити пароль при першому вході",IDC_USER_GENERAL_FORCE_CHANGE,7,82,210,10 + AUTOCHECKBOX "Користувач не може змінювати пароль",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10 + AUTOCHECKBOX "Термін дії паролю необмежений",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10 + AUTOCHECKBOX "Обліковий запис вимкнено",IDC_USER_GENERAL_DISABLED,7,121,210,10 + AUTOCHECKBOX "Обліковий запис заблоковано",IDC_USER_GENERAL_LOCKED,7,134,210,10 +END + + +IDD_USER_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Членство" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Член Групи:", -1, 7, 7, 56, 8 + CONTROL "", IDC_USER_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 18, 238, 173, WS_EX_CLIENTEDGE + PUSHBUTTON "Додати...", IDC_USER_MEMBERSHIP_ADD, 7, 197, 50, 14 + PUSHBUTTON "Вилучити", IDC_USER_MEMBERSHIP_REMOVE, 61, 197, 50, 14, WS_DISABLED +END + + +IDD_USER_PROFILE DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Профіль" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Профіль Користувача", -1, 7, 7, 238, 54 + LTEXT "Шлях до Профілю:", -1, 16, 22, 55, 8 + EDITTEXT IDC_USER_PROFILE_PATH, 78, 19, 160, 13, ES_AUTOHSCROLL + LTEXT "Сценарій входу:", -1, 16, 40, 55, 8 + EDITTEXT IDC_USER_PROFILE_SCRIPT, 78, 37, 160, 13, ES_AUTOHSCROLL + + GROUPBOX "Домашня тека", -1, 7, 68, 238, 54 + AUTORADIOBUTTON "Локальний шлях:", IDC_USER_PROFILE_LOCAL, 16, 83, 60, 10 + AUTORADIOBUTTON "Під'єднати:", IDC_USER_PROFILE_REMOTE, 16, 100, 60, 10 + EDITTEXT IDC_USER_PROFILE_LOCAL_PATH, 78, 81, 160, 13, ES_AUTOHSCROLL + COMBOBOX IDC_USER_PROFILE_DRIVE, 78, 99, 26, 160, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL + LTEXT "до:", -1, 112, 101, 12, 8 + EDITTEXT IDC_USER_PROFILE_REMOTE_PATH, 130, 99, 108, 13, ES_AUTOHSCROLL +END + + +IDD_GROUP_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Загальні" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_GROUP_GENERAL_NAME, 7, 12, 112, 8 + LTEXT "Опис:", -1, 7, 45, 46, 8 + EDITTEXT IDC_GROUP_GENERAL_DESCRIPTION,65,42,180,13,ES_AUTOHSCROLL + LTEXT "Члени:", -1, 7, 63, 45, 8 + CONTROL "", IDC_GROUP_GENERAL_MEMBERS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 74, 238, 117, WS_EX_CLIENTEDGE + PUSHBUTTON "Додати...", IDC_GROUP_GENERAL_ADD, 7, 197, 50, 14 + PUSHBUTTON "Вилучити", IDC_GROUP_GENERAL_REMOVE, 61, 197, 50, 14, WS_DISABLED +END + + +IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE 0, 0, 267, 74 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION "Зміна Паролю" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Новий Пароль:", -1,7,10,96,8 + EDITTEXT IDC_EDIT_PASSWORD2,107,25,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Повтор Паролю:", -1,7,28,96,8 + DEFPUSHBUTTON "OK",IDOK,156,53,50,14 + PUSHBUTTON "Скасувати",IDCANCEL,210,53,50,14 +END + + +IDD_USER_NEW DIALOGEX DISCARDABLE 0, 0, 267, 200 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION "Новий Користувач" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_USER_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL + RTEXT "Ім'я Користувача:", -1,7,10,96,8 + EDITTEXT IDC_USER_NEW_FULL_NAME,107,25,153,14,ES_AUTOHSCROLL + RTEXT "Повне Ім'я Користувача:", -1,7,28,96,8 + EDITTEXT IDC_USER_NEW_DESCRIPTION,107,43,153,14,ES_AUTOHSCROLL + RTEXT "Опис:", -1,7,46,96,8 + EDITTEXT IDC_USER_NEW_PASSWORD1,107,67,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Пароль:", -1,7,70,96,8 + EDITTEXT IDC_USER_NEW_PASSWORD2,107,85,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Повтор Паролю:", -1,7,88,96,8 + AUTOCHECKBOX "Користувач має змінити пароль при першому вході",IDC_USER_NEW_FORCE_CHANGE,7,109,200,10 + AUTOCHECKBOX "Користувач не може змінювати пароль",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED + AUTOCHECKBOX "Термін дії паролю необмежений",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED + AUTOCHECKBOX "Обліковий запис вимкнено",IDC_USER_NEW_DISABLED,7,151,200,10 + DEFPUSHBUTTON "OK",IDOK,156,179,50,14,WS_DISABLED + PUSHBUTTON "Скасувати",IDCANCEL,210,179,50,14 +END + + +IDD_GROUP_NEW DIALOGEX DISCARDABLE 0, 0, 267, 74 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION "Нова Група" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_GROUP_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL + RTEXT "Назва Групи:", -1,7,10,96,8 + EDITTEXT IDC_GROUP_NEW_DESCRIPTION,107,25,153,14,ES_AUTOHSCROLL + RTEXT "Опис:", -1,7,28,96,8 + DEFPUSHBUTTON "OK",IDOK,156,53,50,14,WS_DISABLED + PUSHBUTTON "Скасувати",IDCANCEL,210,53,50,14 +END + + +IDD_USER_ADD_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT +CAPTION "Членство в Групах" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Член Групи:", -1, 7, 7, 56, 8 + CONTROL "", IDC_USER_ADD_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, + 7, 18, 238, 173, WS_EX_CLIENTEDGE + DEFPUSHBUTTON "OK",IDOK,141,197,50,14 + PUSHBUTTON "Скасувати",IDCANCEL,195,197,50,14 +END + + +/* Menus */ + +IDM_POPUP_GROUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Створити Групу...", IDM_GROUP_NEW + END + POPUP "" + BEGIN + MENUITEM "Додати в Групу", IDM_GROUP_ADD_MEMBER, GRAYED + MENUITEM SEPARATOR + MENUITEM "Видалити", IDM_GROUP_DELETE + MENUITEM "Перейменувати", IDM_GROUP_RENAME + MENUITEM SEPARATOR + MENUITEM "Властивості", IDM_GROUP_PROPERTIES + END +END + + +IDM_POPUP_USER MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Новий Користувач...", IDM_USER_NEW + END + POPUP "" + BEGIN + MENUITEM "Змінити Пароль", IDM_USER_CHANGE_PASSWORD + MENUITEM SEPARATOR + MENUITEM "Видалити", IDM_USER_DELETE + MENUITEM "Перейменувати", IDM_USER_RENAME + MENUITEM SEPARATOR + MENUITEM "Властивості", IDM_USER_PROPERTIES + END +END + + +/* Strings */ + +STRINGTABLE +BEGIN + IDS_CPLNAME "Облікові записи користувачів" + IDS_CPLDESCRIPTION "Керування Користувачами та Групами." +END + +STRINGTABLE +BEGIN + IDS_NAME "Ім'я" + IDS_FULLNAME "Повне Ім'я" + IDS_DESCRIPTION "Опис" +END diff --git a/reactos/dll/cpl/usrmgr/rsrc.rc b/reactos/dll/cpl/usrmgr/rsrc.rc index 7f2108c7e81..42a24ad3303 100644 --- a/reactos/dll/cpl/usrmgr/rsrc.rc +++ b/reactos/dll/cpl/usrmgr/rsrc.rc @@ -7,3 +7,4 @@ #include "lang/fr-FR.rc" #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" +#include "lang/uk-UA.rc" diff --git a/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc b/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc index 213de546b40..f419341da73 100644 --- a/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc +++ b/reactos/subsystems/win32/csrss/win32csr/lang/uk-UA.rc @@ -62,5 +62,5 @@ BEGIN IDS_SCROLLUP "Прокрутити догори" IDS_SCROLLDOWN "Прокрутити донизу" - IDS_COMMAND_PROMPT "Command Prompt" + IDS_COMMAND_PROMPT "Командний рядок" END