From 9c621c0524a3b345d48689bbf6ebc89ec36b9a0b Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 20 Jun 2009 16:00:45 +0000 Subject: [PATCH 001/577] - Free forgotten irps - Implement PcCompleteIrp svn path=/trunk/; revision=41489 --- .../drivers/wdm/audio/backpln/portcls/irp.c | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irp.c b/reactos/drivers/wdm/audio/backpln/portcls/irp.c index 6f8dd451867..c50a86c61f8 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irp.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/irp.c @@ -143,22 +143,19 @@ PortClsPnp( case IRP_MN_QUERY_INTERFACE: DPRINT("IRP_MN_QUERY_INTERFACE\n"); Status = PcForwardIrpSynchronous(DeviceObject, Irp); - return Status; - + return PcCompleteIrp(DeviceObject, Irp, Status); case IRP_MN_QUERY_DEVICE_RELATIONS: DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n"); - Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_NOT_SUPPORTED; + Status = PcForwardIrpSynchronous(DeviceObject, Irp); + return PcCompleteIrp(DeviceObject, Irp, Status); case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS Status %x Information %p Information2 %p\n", Irp->IoStatus.Status, Irp->IoStatus.Information, IoStack->Parameters.FilterResourceRequirements.IoResourceRequirementList); - Status = Irp->IoStatus.Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); + Status = PcForwardIrpSynchronous(DeviceObject, Irp); + return PcCompleteIrp(DeviceObject, Irp, Status); case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); Status = PcForwardIrpSynchronous(DeviceObject, Irp); - return Status; + return PcCompleteIrp(DeviceObject, Irp, Status); } DPRINT1("unhandled function %u\n", IoStack->MinorFunction); @@ -289,16 +286,23 @@ PcDispatchIrp( } /* - * @unimplemented + * @implemented */ -NTSTATUS NTAPI +NTSTATUS +NTAPI PcCompleteIrp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN NTSTATUS Status) { - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + ASSERT(DeviceObject); + ASSERT(Irp); + ASSERT(Status != STATUS_PENDING); + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; } NTSTATUS From eef3e1decad568ec77bf073c1c984ddb3f17623e Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 20 Jun 2009 23:37:55 +0000 Subject: [PATCH 002/577] - Define private interface IPortWaveRTStreamInit in order to deal with PHYSICAL_ADDRESS as return value - Implement reading/writing into cyclic buffer for IPortPinWaveRT - Allocate an audio buffer when the pin is initialized. This needs to be changed once KSPROPERTY_RTAUDIO_BUFFER is implemented - Fix a bug in PcNewPort - Remove obsolete code from IPortWavePci - Return the allocated MDL from IPortWaveRTStream::AllocateContiguousPagesForMdl - Create a system thread when using IServiceGroup::RequestDelayedService - ReactOS now partly supports Vista audio driver model svn path=/trunk/; revision=41497 --- .../wdm/audio/backpln/portcls/interfaces.h | 58 ++++++++ .../wdm/audio/backpln/portcls/pin_wavert.c | 126 +++++++++++++++--- .../drivers/wdm/audio/backpln/portcls/port.c | 4 +- .../wdm/audio/backpln/portcls/port_wavepci.c | 25 ---- .../audio/backpln/portcls/port_wavertstream.c | 79 ++++++----- .../wdm/audio/backpln/portcls/private.h | 101 +++++++------- .../wdm/audio/backpln/portcls/service_group.c | 53 +++++++- 7 files changed, 316 insertions(+), 130 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h index 77d98c31616..1f6e69ab0ac 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h @@ -710,4 +710,62 @@ typedef IPortFilterTopology *PPORTFILTERTOPOLOGY; #undef INTERFACE +/***************************************************************************** + * IPortWaveRTStreamInit + ***************************************************************************** + */ + +#undef INTERFACE +#define INTERFACE IPortWaveRTStreamInit + + +DECLARE_INTERFACE_(IPortWaveRTStreamInit, IUnknown) +{ + DEFINE_ABSTRACT_UNKNOWN() + + STDMETHOD_(PMDL, AllocatePagesForMdl) + ( THIS_ + IN PHYSICAL_ADDRESS HighAddress, + IN SIZE_T TotalBytes + ) PURE; + + STDMETHOD_(PMDL, AllocateContiguousPagesForMdl) + ( THIS_ + IN PHYSICAL_ADDRESS LowAddress, + IN PHYSICAL_ADDRESS HighAddress, + IN SIZE_T TotalBytes + ) PURE; + + STDMETHOD_(PVOID, MapAllocatedPages) + ( THIS_ + IN PMDL MemoryDescriptorList, + IN MEMORY_CACHING_TYPE CacheType + ) PURE; + + STDMETHOD_(VOID, UnmapAllocatedPages) + ( THIS_ + IN PVOID BaseAddress, + IN PMDL MemoryDescriptorList + ) PURE; + + STDMETHOD_(VOID, FreePagesFromMdl) + ( THIS_ + IN PMDL MemoryDescriptorList + ) PURE; + + STDMETHOD_(ULONG, GetPhysicalPagesCount) + ( THIS_ + IN PMDL MemoryDescriptorList + ) PURE; + + STDMETHOD_(PHYSICAL_ADDRESS, GetPhysicalPageAddress) + ( THIS_ + IN PPHYSICAL_ADDRESS Address, + IN PMDL MemoryDescriptorList, + IN ULONG Index + ) PURE; +}; + +#undef INTERFACE + #endif diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c index e878ca47f3a..c6996c86bd8 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c @@ -59,6 +59,85 @@ SetStreamState( IN IPortPinWaveRTImpl * This, IN KSSTATE State); +static +VOID +UpdateCommonBuffer( + IPortPinWaveRTImpl * This, + ULONG Position) +{ + ULONG BufferLength; + ULONG BytesToCopy; + ULONG BufferSize; + PUCHAR Buffer; + NTSTATUS Status; + + BufferLength = Position - This->CommonBufferOffset; + while(BufferLength) + { + Status = This->IrpQueue->lpVtbl->GetMapping(This->IrpQueue, &Buffer, &BufferSize); + if (!NT_SUCCESS(Status)) + return; + + BytesToCopy = min(BufferLength, BufferSize); + + if (This->Capture) + { + RtlMoveMemory(Buffer, (PUCHAR)This->CommonBuffer + This->CommonBufferOffset, BytesToCopy); + } + else + { + RtlMoveMemory((PUCHAR)This->CommonBuffer + This->CommonBufferOffset, Buffer, BytesToCopy); + } + + This->IrpQueue->lpVtbl->UpdateMapping(This->IrpQueue, BytesToCopy); + This->CommonBufferOffset += BytesToCopy; + + BufferLength = Position - This->CommonBufferOffset; + } +} + +static +VOID +UpdateCommonBufferOverlap( + IPortPinWaveRTImpl * This, + ULONG Position) +{ + ULONG BufferLength; + ULONG BytesToCopy; + ULONG BufferSize; + PUCHAR Buffer; + NTSTATUS Status; + + + BufferLength = This->CommonBufferSize - This->CommonBufferOffset; + while(BufferLength) + { + Status = This->IrpQueue->lpVtbl->GetMapping(This->IrpQueue, &Buffer, &BufferSize); + if (!NT_SUCCESS(Status)) + return; + + BytesToCopy = min(BufferLength, BufferSize); + + if (This->Capture) + { + RtlMoveMemory(Buffer, (PUCHAR)This->CommonBuffer + This->CommonBufferOffset, BytesToCopy); + } + else + { + RtlMoveMemory((PUCHAR)This->CommonBuffer + This->CommonBufferOffset, Buffer, BytesToCopy); + } + + This->IrpQueue->lpVtbl->UpdateMapping(This->IrpQueue, BytesToCopy); + This->CommonBufferOffset += BytesToCopy; + + BufferLength = This->CommonBufferSize - This->CommonBufferOffset; + } + This->CommonBufferOffset = 0; + UpdateCommonBuffer(This, Position); +} + + + //================================================================================================================================== static NTSTATUS @@ -137,14 +216,16 @@ IServiceSink_fnRequestService( } Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position); - DPRINT("PlayOffset %llu WriteOffset %llu %u Buffer %p BufferSize %u\n", Position.PlayOffset, Position.WriteOffset, Buffer, This->CommonBufferSize, BufferSize); + DPRINT("PlayOffset %lu WriteOffset %lu Buffer %p BufferSize %u CommonBufferSize %u\n", Position.PlayOffset, Position.WriteOffset, Buffer, BufferSize, This->CommonBufferSize); - //FIXME - // implement writing into cyclic buffer - // - - /* reschedule the timer */ - This->ServiceGroup->lpVtbl->RequestDelayedService(This->ServiceGroup, This->Delay); + if (Position.PlayOffset < This->CommonBufferOffset) + { + UpdateCommonBufferOverlap(This, Position.PlayOffset); + } + else if (Position.PlayOffset >= This->CommonBufferOffset) + { + UpdateCommonBuffer(This, Position.PlayOffset); + } } static IServiceSinkVtbl vt_IServiceSink = @@ -962,18 +1043,25 @@ IPortPinWaveRT_fnInit( /* minimum delay of 10 milisec */ This->Delay = Int32x32To64(min(max(Latency.ChipsetDelay + Latency.CodecDelay + Latency.FifoSize, 10), 10), -10000); - Status = This->Stream->lpVtbl->AllocateAudioBuffer(This->Stream, 16384, &This->Mdl, &This->CommonBufferSize, &This->CommonBufferOffset, &This->CacheType); + Status = This->Stream->lpVtbl->AllocateAudioBuffer(This->Stream, 16384 * 11, &This->Mdl, &This->CommonBufferSize, &This->CommonBufferOffset, &This->CacheType); if (!NT_SUCCESS(Status)) { DPRINT1("AllocateAudioBuffer failed with %x\n", Status); goto cleanup; } - This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP); - This->State = KSSTATE_STOP; - This->Capture = Capture; + This->CommonBuffer = MmGetSystemAddressForMdlSafe(This->Mdl, NormalPagePriority); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to get system address %x\n", Status); + IoFreeMdl(This->Mdl); + This->Mdl = NULL; + goto cleanup; + } - This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format); + DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE)); + DPRINT1("Setting state to pause %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE)); + This->State = KSSTATE_PAUSE; return STATUS_SUCCESS; cleanup: @@ -995,12 +1083,20 @@ cleanup: This->ServiceGroup = NULL; } - if (This->PortStream) + if (This->Stream) { - This->PortStream->lpVtbl->Release(This->PortStream); - This->PortStream = NULL; + This->Stream->lpVtbl->Release(This->Stream); + This->Stream = NULL; } + else + { + if (This->PortStream) + { + This->PortStream->lpVtbl->Release(This->PortStream); + This->PortStream = NULL; + } + } return Status; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port.c b/reactos/drivers/wdm/audio/backpln/portcls/port.c index 95f72e3d83a..2fdb7c8b529 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port.c @@ -40,10 +40,8 @@ PcNewPort( Status = NewPortWaveCyclic(OutPort); else if (IsEqualGUIDAligned(ClassId, &CLSID_PortWavePci)) Status = NewPortWavePci(OutPort); -#if (NTDDI_VERSION >= NTDDI_VISTA) - else if (IsEqualGUIDAligned(ClassId, &CLSID_PortWavePci)) + else if (IsEqualGUIDAligned(ClassId, &CLSID_PortWaveRT)) Status = NewPortWaveRT(OutPort); -#endif else { diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c index f041e275ec0..d4b958ce37f 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c @@ -22,7 +22,6 @@ typedef struct PMINIPORTWAVEPCI Miniport; PDEVICE_OBJECT pDeviceObject; - KDPC Dpc; BOOL bInitialized; PRESOURCELIST pResourceList; PSERVICEGROUP ServiceGroup; @@ -331,26 +330,6 @@ IPortWavePci_fnRelease( return This->ref; } -VOID -NTAPI -ServiceNotifyRoutine( - IN struct _KDPC *Dpc, - IN PVOID DeferredContext, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2) -{ - DPRINT("ServiceNotifyRoutine entered %p %p %p\n", DeferredContext, SystemArgument1, SystemArgument2); - - IPortWavePciImpl * This = (IPortWavePciImpl*)DeferredContext; - if (This->ServiceGroup && This->bInitialized) - { - DPRINT("ServiceGroup %p\n", This->ServiceGroup); - This->ServiceGroup->lpVtbl->RequestService(This->ServiceGroup); - } -} - - - NTSTATUS NTAPI IPortWavePci_fnInit( @@ -385,16 +364,12 @@ IPortWavePci_fnInit( return STATUS_INVALID_PARAMETER; } - /* initialize the dpc */ - KeInitializeDpc(&This->Dpc, ServiceNotifyRoutine, (PVOID)This); - /* Initialize port object */ This->Miniport = Miniport; This->pDeviceObject = DeviceObject; This->bInitialized = TRUE; This->pResourceList = ResourceList; - /* increment reference on miniport adapter */ Miniport->lpVtbl->AddRef(Miniport); /* increment reference on resource list */ diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c index f9ebafba17d..45ee9a7e60b 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c @@ -10,7 +10,7 @@ typedef struct { - IPortWaveRTStreamVtbl *lpVtbl; + IPortWaveRTStreamInitVtbl *lpVtbl; LONG ref; }IPortWaveRTStreamImpl; @@ -21,8 +21,8 @@ typedef struct static NTSTATUS NTAPI -IPortWaveRTStream_fnQueryInterface( - IPortWaveRTStream* iface, +IPortWaveRTStreamInit_fnQueryInterface( + IPortWaveRTStreamInit * iface, IN REFIID refiid, OUT PVOID* Output) { @@ -46,8 +46,8 @@ IPortWaveRTStream_fnQueryInterface( static ULONG NTAPI -IPortWaveRTStream_fnAddRef( - IPortWaveRTStream* iface) +IPortWaveRTStreamInit_fnAddRef( + IPortWaveRTStreamInit * iface) { IPortWaveRTStreamImpl * This = (IPortWaveRTStreamImpl*)iface; DPRINT("IPortWaveRTStream_fnAddRef entered\n"); @@ -61,8 +61,8 @@ IPortWaveRTStream_fnAddRef( static ULONG NTAPI -IPortWaveRTStream_fnRelease( - IPortWaveRTStream* iface) +IPortWaveRTStreamInit_fnRelease( + IPortWaveRTStreamInit * iface) { IPortWaveRTStreamImpl * This = (IPortWaveRTStreamImpl*)iface; @@ -85,8 +85,8 @@ IPortWaveRTStream_fnRelease( static PMDL NTAPI -IPortWaveRTStream_fnAllocatePagesForMdl( - IN IPortWaveRTStream* iface, +IPortWaveRTStreamInit_fnAllocatePagesForMdl( + IN IPortWaveRTStreamInit * iface, IN PHYSICAL_ADDRESS HighAddress, IN SIZE_T TotalBytes) { @@ -99,8 +99,8 @@ IPortWaveRTStream_fnAllocatePagesForMdl( static PMDL NTAPI -IPortWaveRTStream_fnAllocateContiguousPagesForMdl( - IN IPortWaveRTStream* iface, +IPortWaveRTStreamInit_fnAllocateContiguousPagesForMdl( + IN IPortWaveRTStreamInit * iface, IN PHYSICAL_ADDRESS LowAddress, IN PHYSICAL_ADDRESS HighAddress, IN SIZE_T TotalBytes) @@ -129,12 +129,14 @@ IPortWaveRTStream_fnAllocateContiguousPagesForMdl( if (MmGetMdlByteCount(Mdl) < TotalBytes) { + DPRINT1("ByteCount %u Required %u\n", MmGetMdlByteCount(Mdl), TotalBytes); MmFreePagesFromMdl(Mdl); ExFreePool(Mdl); return NULL; } - return NULL; + DPRINT("Result %p\n", Mdl); + return Mdl; } /* @@ -143,8 +145,8 @@ IPortWaveRTStream_fnAllocateContiguousPagesForMdl( static PVOID NTAPI -IPortWaveRTStream_fnMapAllocatedPages( - IN IPortWaveRTStream* iface, +IPortWaveRTStreamInit_fnMapAllocatedPages( + IN IPortWaveRTStreamInit * iface, IN PMDL MemoryDescriptorList, IN MEMORY_CACHING_TYPE CacheType) { @@ -157,8 +159,8 @@ IPortWaveRTStream_fnMapAllocatedPages( static VOID NTAPI -IPortWaveRTStream_fnUnmapAllocatedPages( - IN IPortWaveRTStream* iface, +IPortWaveRTStreamInit_fnUnmapAllocatedPages( + IN IPortWaveRTStreamInit * iface, IN PVOID BaseAddress, IN PMDL MemoryDescriptorList) { @@ -171,8 +173,8 @@ IPortWaveRTStream_fnUnmapAllocatedPages( static VOID NTAPI -IPortWaveRTStream_fnFreePagesFromMdl( - IN IPortWaveRTStream* iface, +IPortWaveRTStreamInit_fnFreePagesFromMdl( + IN IPortWaveRTStreamInit * iface, IN PMDL MemoryDescriptorList) { MmFreePagesFromMdl(MemoryDescriptorList); @@ -185,8 +187,8 @@ IPortWaveRTStream_fnFreePagesFromMdl( static ULONG NTAPI -IPortWaveRTStream_fnGetPhysicalPagesCount( - IN IPortWaveRTStream* iface, +IPortWaveRTStreamInit_fnGetPhysicalPagesCount( + IN IPortWaveRTStreamInit * iface, IN PMDL MemoryDescriptorList) { return ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, MmGetMdlByteCount(MemoryDescriptorList)); @@ -198,13 +200,15 @@ IPortWaveRTStream_fnGetPhysicalPagesCount( static PHYSICAL_ADDRESS NTAPI -IPortWaveRTStream_fnGetPhysicalPageAddress( - IN IPortWaveRTStream* iface, - IN PMDL MemoryDescriptorList, +IPortWaveRTStreamInit_fnGetPhysicalPageAddress( + IN IPortWaveRTStreamInit * iface, + IN PPHYSICAL_ADDRESS Address, + IN PMDL MemoryDescriptorList, IN ULONG Index) { PVOID Buffer; ULONG Pages; + PHYSICAL_ADDRESS Result, Addr; Pages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, MmGetMdlByteCount(MemoryDescriptorList)); if (Pages <= Index) @@ -214,21 +218,26 @@ IPortWaveRTStream_fnGetPhysicalPageAddress( } Buffer = UlongToPtr(PtrToUlong(MmGetSystemAddressForMdl(MemoryDescriptorList)) + Index * PAGE_SIZE); - return MmGetPhysicalAddress(Buffer); + + Addr = MmGetPhysicalAddress(Buffer); + Address->QuadPart = Addr.QuadPart; + Result.QuadPart = (PtrToUlong(Address)); + + return Result; } -static IPortWaveRTStreamVtbl vt_PortWaveRTStream = +static IPortWaveRTStreamInitVtbl vt_PortWaveRTStream = { - IPortWaveRTStream_fnQueryInterface, - IPortWaveRTStream_fnAddRef, - IPortWaveRTStream_fnRelease, - IPortWaveRTStream_fnAllocatePagesForMdl, - IPortWaveRTStream_fnAllocateContiguousPagesForMdl, - IPortWaveRTStream_fnMapAllocatedPages, - IPortWaveRTStream_fnUnmapAllocatedPages, - IPortWaveRTStream_fnFreePagesFromMdl, - IPortWaveRTStream_fnGetPhysicalPagesCount, - IPortWaveRTStream_fnGetPhysicalPageAddress + IPortWaveRTStreamInit_fnQueryInterface, + IPortWaveRTStreamInit_fnAddRef, + IPortWaveRTStreamInit_fnRelease, + IPortWaveRTStreamInit_fnAllocatePagesForMdl, + IPortWaveRTStreamInit_fnAllocateContiguousPagesForMdl, + IPortWaveRTStreamInit_fnMapAllocatedPages, + IPortWaveRTStreamInit_fnUnmapAllocatedPages, + IPortWaveRTStreamInit_fnFreePagesFromMdl, + IPortWaveRTStreamInit_fnGetPhysicalPagesCount, + IPortWaveRTStreamInit_fnGetPhysicalPageAddress }; NTSTATUS diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h index a0dd108b646..48c1ff154a9 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h @@ -7,9 +7,11 @@ #ifndef PORTCLS_PRIVATE_H #define PORTCLS_PRIVATE_H +//#define _KS_NO_ANONYMOUS_STRUCTURES_ + #include #include -#define NDEBUG +#define YDEBUG #include #include @@ -182,24 +184,6 @@ NTAPI NewIrpQueue( IN IIrpQueue **Queue); - -typedef struct -{ - LIST_ENTRY Entry; - KSOBJECT_HEADER ObjectHeader; -}SUBDEVICE_ENTRY; - -typedef struct -{ - LIST_ENTRY Entry; - ISubdevice * FromSubDevice; - LPWSTR FromUnicodeString; - ULONG FromPin; - ISubdevice * ToSubDevice; - LPWSTR ToUnicodeString; - ULONG ToPin; -}PHYSICAL_CONNECTION; - NTSTATUS NTAPI TopologyPropertyHandler( @@ -214,37 +198,6 @@ PinPropertyHandler( IN PKSIDENTIFIER Request, IN OUT PVOID Data); -typedef struct -{ - KSDEVICE_HEADER KsDeviceHeader; - PDEVICE_OBJECT PhysicalDeviceObject; - PDEVICE_OBJECT PrevDeviceObject; - PCPFNSTARTDEVICE StartDevice; - ULONG_PTR Unused[4]; - IAdapterPowerManagement * AdapterPowerManagement; - ULONG MaxSubDevices; - KSOBJECT_CREATE_ITEM * CreateItems; - - IResourceList* resources; - LIST_ENTRY SubDeviceList; - LIST_ENTRY PhysicalConnectionList; - -} PCLASS_DEVICE_EXTENSION, *PPCLASS_DEVICE_EXTENSION; - - -typedef struct -{ - KSSTREAM_HEADER Header; - PIRP Irp; -}CONTEXT_WRITE, *PCONTEXT_WRITE; - -typedef struct -{ - PVOID Pin; - PIO_WORKITEM WorkItem; - PIRP Irp; -}CLOSESTREAM_CONTEXT, *PCLOSESTREAM_CONTEXT; - NTSTATUS NTAPI PcDmaMasterDescription( @@ -353,4 +306,52 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\ DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\ } +typedef struct +{ + LIST_ENTRY Entry; + KSOBJECT_HEADER ObjectHeader; +}SUBDEVICE_ENTRY; + +typedef struct +{ + LIST_ENTRY Entry; + ISubdevice * FromSubDevice; + LPWSTR FromUnicodeString; + ULONG FromPin; + ISubdevice * ToSubDevice; + LPWSTR ToUnicodeString; + ULONG ToPin; +}PHYSICAL_CONNECTION; + +typedef struct +{ + KSDEVICE_HEADER KsDeviceHeader; + PDEVICE_OBJECT PhysicalDeviceObject; + PDEVICE_OBJECT PrevDeviceObject; + PCPFNSTARTDEVICE StartDevice; + ULONG_PTR Unused[4]; + IAdapterPowerManagement * AdapterPowerManagement; + ULONG MaxSubDevices; + KSOBJECT_CREATE_ITEM * CreateItems; + + IResourceList* resources; + LIST_ENTRY SubDeviceList; + LIST_ENTRY PhysicalConnectionList; + +} PCLASS_DEVICE_EXTENSION, *PPCLASS_DEVICE_EXTENSION; + + +typedef struct +{ + KSSTREAM_HEADER Header; + PIRP Irp; +}CONTEXT_WRITE, *PCONTEXT_WRITE; + +typedef struct +{ + PVOID Pin; + PIO_WORKITEM WorkItem; + PIRP Irp; +}CLOSESTREAM_CONTEXT, *PCLOSESTREAM_CONTEXT; + #endif diff --git a/reactos/drivers/wdm/audio/backpln/portcls/service_group.c b/reactos/drivers/wdm/audio/backpln/portcls/service_group.c index e0f7151d8f0..0003f734937 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/service_group.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/service_group.c @@ -26,6 +26,8 @@ typedef struct BOOL TimerActive; KTIMER Timer; KDPC Dpc; + KEVENT Event; + LONG ThreadActive; }IServiceGroupImpl; @@ -94,6 +96,10 @@ IServiceGroup_fnRelease( FreeItem(Entry, TAG_PORTCLASS); } KeCancelTimer(&This->Timer); + if (This->ThreadActive) + { + KeSetEvent(&This->Event, 0, TRUE); + } FreeItem(This, TAG_PORTCLASS); return 0; } @@ -203,18 +209,60 @@ IServiceGroupDpc( } } + +VOID +NTAPI +ServiceGroupThread(IN PVOID StartContext) +{ + NTSTATUS Status; + KWAIT_BLOCK WaitBlockArray[2]; + PVOID WaitObjects[2]; + IServiceGroupImpl * This = (IServiceGroupImpl*)StartContext; + + /* Set thread state */ + InterlockedIncrement(&This->ThreadActive); + + /* Setup the wait objects */ + WaitObjects[0] = &This->Timer; + WaitObjects[1] = &This->Event; + + do + { + /* Wait on our objects */ + Status = KeWaitForMultipleObjects(2, WaitObjects, WaitAny, Executive, KernelMode, FALSE, NULL, WaitBlockArray); + + switch(Status) + { + case STATUS_WAIT_0: + IServiceGroupDpc(&This->Dpc, (PVOID)This, NULL, NULL); + break; + case STATUS_WAIT_1: + PsTerminateSystemThread(STATUS_SUCCESS); + break; + } + }while(TRUE); +} + VOID NTAPI IServiceGroup_fnSupportDelayedService( IN IServiceGroup * iface) { + NTSTATUS Status; + HANDLE ThreadHandle; IServiceGroupImpl * This = (IServiceGroupImpl*)iface; ASSERT_IRQL(DISPATCH_LEVEL); - if (!This->Initialized) + if (This->Initialized) + return; + + KeInitializeTimerEx(&This->Timer, NotificationTimer); + + Status = PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, NULL, 0, NULL, ServiceGroupThread, (PVOID)This); + if (NT_SUCCESS(Status)) { - KeInitializeTimerEx(&This->Timer, NotificationTimer); + ZwClose(ThreadHandle); This->Initialized = TRUE; } } @@ -290,6 +338,7 @@ PcNewServiceGroup( This->ref = 1; KeInitializeDpc(&This->Dpc, IServiceGroupDpc, (PVOID)This); KeSetImportanceDpc(&This->Dpc, HighImportance); + KeInitializeEvent(&This->Event, NotificationEvent, FALSE); InitializeListHead(&This->ServiceSinkHead); *OutServiceGroup = (PSERVICEGROUP)&This->lpVtbl; From 66a0e71bf519a9a57013dedd3140f5eadf51e9e0 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 21 Jun 2009 00:16:32 +0000 Subject: [PATCH 003/577] - Use interval of 10ms for the periodic timer IPortPinWaveRT - Initialize a periodic timer for IPortPinWavePci - Might fix Vortex AU8820C0 card svn path=/trunk/; revision=41498 --- .../wdm/audio/backpln/portcls/pin_wavepci.c | 16 +++++++++++++--- .../wdm/audio/backpln/portcls/pin_wavert.c | 4 ++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c index 682334e401b..53736675318 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c @@ -34,6 +34,8 @@ typedef struct ULONG PreCompleted; ULONG PostCompleted; + ULONG Delay; + }IPortPinWavePciImpl; @@ -136,8 +138,14 @@ SetStreamWorkerRoutine( { /* reset start stream */ This->IrpQueue->lpVtbl->CancelBuffers(This->IrpQueue); //FIX function name + This->ServiceGroup->lpVtbl->CancelDelayedService(This->ServiceGroup); DPRINT1("Stopping PreCompleted %u PostCompleted %u\n", This->PreCompleted, This->PostCompleted); } + if (This->State == KSSTATE_RUN) + { + /* start the notification timer */ + This->ServiceGroup->lpVtbl->RequestDelayedService(This->ServiceGroup, This->Delay); + } } } static @@ -743,6 +751,9 @@ IPortPinWavePci_fnInit( This->ServiceGroup->lpVtbl->SupportDelayedService(This->ServiceGroup); } + /* delay of 10 milisec */ + This->Delay = Int32x32To64(10, -10000); + This->IrpQueue = IPortWavePciStream_GetIrpQueue(This->WaveStream); Status = This->Stream->lpVtbl->GetAllocatorFraming(This->Stream, &AllocatorFraming); @@ -752,9 +763,8 @@ IPortPinWavePci_fnInit( return Status; } - DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n", - AllocatorFraming.OptionsFlags, AllocatorFraming.RequirementsFlags, AllocatorFraming.PoolType, AllocatorFraming.Frames, AllocatorFraming.FrameSize, AllocatorFraming.FileAlignment); - + DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n", + AllocatorFraming.OptionsFlags, AllocatorFraming.RequirementsFlags, AllocatorFraming.PoolType, AllocatorFraming.Frames, AllocatorFraming.FrameSize, AllocatorFraming.FileAlignment); Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, This->Format, DeviceObject, AllocatorFraming.FrameSize, AllocatorFraming.FileAlignment); if (!NT_SUCCESS(Status)) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c index c6996c86bd8..adfabc09186 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c @@ -1040,8 +1040,8 @@ IPortPinWaveRT_fnInit( goto cleanup; This->Stream->lpVtbl->GetHWLatency(This->Stream, &Latency); - /* minimum delay of 10 milisec */ - This->Delay = Int32x32To64(min(max(Latency.ChipsetDelay + Latency.CodecDelay + Latency.FifoSize, 10), 10), -10000); + /* delay of 10 milisec */ + This->Delay = Int32x32To64(10, -10000); Status = This->Stream->lpVtbl->AllocateAudioBuffer(This->Stream, 16384 * 11, &This->Mdl, &This->CommonBufferSize, &This->CommonBufferOffset, &This->CacheType); if (!NT_SUCCESS(Status)) From 4fbc4ba227ab26599d48c3c8b4c88503bfa44396 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 03:57:42 +0000 Subject: [PATCH 004/577] - Remove MmGetPageFlags and MmSetPageFlags, there are no consumers of these two functions. - Get rid of PHYSICAL_PAGE structure and move to WinNT MMPFN structure instead: - Define a preprocessor legacy mapping so that freelist.c receives only minimal changes: - This mapping allows the old meanings of the PHYSICAL_PAGE fields to remain, but now part of the new MMPFN structure - Other modules (balance.c and mm.h) use the new structure directly, since only 3 lines of code required changes. - The NT structure is 8 bytes smaller than the ReactOS structure, which saves about 1MB of physical memory and kernel VA space for each 512MB of RAM, or 25% less. This also enables ReactOS to support 25% more memory than before (64GB instead of 48GB). svn path=/trunk/; revision=41503 --- reactos/ntoskrnl/include/internal/mm.h | 92 +++++++++++++++++--------- reactos/ntoskrnl/mm/balance.c | 2 +- reactos/ntoskrnl/mm/freelist.c | 77 +++++++++++---------- reactos/ntoskrnl/mm/mminit.c | 2 +- 4 files changed, 99 insertions(+), 74 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index cc74b2fd7ed..e51db265fa1 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -289,30 +289,68 @@ typedef struct ULONG PagingRequestsInLastFifteenMinutes; } MM_STATS; -typedef struct _PHYSICAL_PAGE +typedef struct _MMPFNENTRY { + USHORT Modified:1; + USHORT ReadInProgress:1; // StartOfAllocation + USHORT WriteInProgress:1; // EndOfAllocation + USHORT PrototypePte:1; // Zero + USHORT PageColor:4; // LockCount + USHORT PageLocation:3; // Consumer + USHORT RemovalRequested:1; + USHORT CacheAttribute:2; // Type + USHORT Rom:1; + USHORT ParityError:1; +} MMPFNENTRY; + +typedef struct _MMPFN +{ + union + { + PFN_NUMBER Flink; // ListEntry.Flink + ULONG WsIndex; + PKEVENT Event; + NTSTATUS ReadStatus; + SINGLE_LIST_ENTRY NextStackPfn; + } u1; + PMMPTE PteAddress; // ListEntry.Blink + union + { + PFN_NUMBER Blink; + ULONG_PTR ShareCount; // MapCount + } u2; union { struct { - ULONG Type: 2; - ULONG Consumer: 3; - ULONG Zero: 1; - ULONG StartOfAllocation: 1; - ULONG EndOfAllocation: 1; - } - Flags; - ULONG AllFlags; + USHORT ReferenceCount; // ReferenceCount + MMPFNENTRY e1; + }; + struct + { + USHORT ReferenceCount; + USHORT ShortFlags; + } e2; + } u3; + union + { + MMPTE OriginalPte; + LONG AweReferenceCount; // RmapListHead }; - - LIST_ENTRY ListEntry; - ULONG ReferenceCount; - SWAPENTRY SavedSwapEntry; - ULONG LockCount; - ULONG MapCount; - struct _MM_RMAP_ENTRY* RmapListHead; -} -PHYSICAL_PAGE, *PPHYSICAL_PAGE; + union + { + ULONG_PTR EntireFrame; // SavedSwapEntry + struct + { + ULONG_PTR PteFrame:25; + ULONG_PTR InPageError:1; + ULONG_PTR VerifierAllocation:1; + ULONG_PTR AweAllocation:1; + ULONG_PTR Priority:3; + ULONG_PTR MustBeCached:1; + }; + } u4; +} MMPFN, *PMMPFN; extern MM_STATS MmStats; @@ -991,14 +1029,14 @@ MmPageOutPhysicalAddress(PFN_TYPE Page); /* freelist.c **********************************************************/ -#define ASSERT_PFN(x) ASSERT((x)->Flags.Type != 0) +#define ASSERT_PFN(x) ASSERT((x)->u3.e1.CacheAttribute != 0) FORCEINLINE -PPHYSICAL_PAGE +PMMPFN MiGetPfnEntry(IN PFN_TYPE Pfn) { - PPHYSICAL_PAGE Page; - extern PPHYSICAL_PAGE MmPageArray; + PMMPFN Page; + extern PMMPFN MmPageArray; extern ULONG MmPageArraySize; /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */ @@ -1278,16 +1316,6 @@ BOOLEAN NTAPI MmIsPageInUse(PFN_TYPE Page); -VOID -NTAPI -MmSetFlagsPage( - PFN_TYPE Page, - ULONG Flags); - -ULONG -NTAPI -MmGetFlagsPage(PFN_TYPE Page); - VOID NTAPI MmSetSavedSwapEntryPage( diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 9d05b34a2b2..c7de8152745 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.c @@ -277,7 +277,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, KeBugCheck(NO_PAGES_AVAILABLE); } /* Update the Consumer */ - MiGetPfnEntry(Page)->Flags.Consumer = Consumer; + MiGetPfnEntry(Page)->u3.e1.PageLocation = Consumer; if(Consumer == MC_USER) MmInsertLRULastUserPage(Page); *AllocatedPage = Page; (void)InterlockedDecrementUL(&MiPagesRequired); diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index bbb517cdaf4..920dc43f08d 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -27,6 +27,27 @@ /* GLOBALS ****************************************************************/ +// +// +// ReactOS to NT Physical Page Descriptor Entry Legacy Mapping Definitions +// +// REACTOS NT +// +#define Consumer PageLocation +#define Type CacheAttribute +#define Zero PrototypePte +#define LockCount u3.e1.PageColor +#define MapCount u2.ShareCount +#define RmapListHead AweReferenceCount +#define SavedSwapEntry u4.EntireFrame +#define Flags u3.e1 +#define ReferenceCount u3.ReferenceCount +#define RemoveEntryList(x) RemoveEntryList((PLIST_ENTRY)x) +#define InsertTailList(x, y) InsertTailList(x, (PLIST_ENTRY)y) +#define ListEntry u1 +#define PHYSICAL_PAGE MMPFN +#define PPHYSICAL_PAGE PMMPFN + PPHYSICAL_PAGE MmPageArray; ULONG MmPageArraySize; @@ -94,7 +115,7 @@ MmGetLRUNextUserPage(PFN_TYPE PreviousPfn) Page = MiGetPfnEntry(PreviousPfn); ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED); ASSERT(Page->Flags.Consumer == MC_USER); - NextListEntry = Page->ListEntry.Flink; + NextListEntry = (PLIST_ENTRY)Page->ListEntry.Flink; if (NextListEntry == &UserPageListHead) { KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); @@ -295,10 +316,12 @@ MmInitializePageList(VOID) NextEntry != &KeLoaderBlock->MemoryDescriptorListHead; NextEntry = NextEntry->Flink) { +#undef ListEntry /* Get the descriptor */ Md = CONTAINING_RECORD(NextEntry, MEMORY_ALLOCATION_DESCRIPTOR, ListEntry); +#define ListEntry u1 /* Skip bad memory */ if ((Md->MemoryType == LoaderFirmwarePermanent) || @@ -366,17 +389,6 @@ MmInitializePageList(VOID) MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages); } -VOID -NTAPI -MmSetFlagsPage(PFN_TYPE Pfn, ULONG Flags) -{ - KIRQL oldIrql; - - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MiGetPfnEntry(Pfn)->AllFlags = Flags; - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); -} - VOID NTAPI MmSetRmapListHeadPage(PFN_TYPE Pfn, struct _MM_RMAP_ENTRY* ListHead) @@ -384,7 +396,7 @@ MmSetRmapListHeadPage(PFN_TYPE Pfn, struct _MM_RMAP_ENTRY* ListHead) KIRQL oldIrql; oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MiGetPfnEntry(Pfn)->RmapListHead = ListHead; + MiGetPfnEntry(Pfn)->RmapListHead = (LONG)ListHead; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); } @@ -396,7 +408,7 @@ MmGetRmapListHeadPage(PFN_TYPE Pfn) struct _MM_RMAP_ENTRY* ListHead; oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - ListHead = MiGetPfnEntry(Pfn)->RmapListHead; + ListHead = (struct _MM_RMAP_ENTRY*)MiGetPfnEntry(Pfn)->RmapListHead; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); return(ListHead); @@ -451,29 +463,14 @@ MmMarkPageUnmapped(PFN_TYPE Pfn) } } -ULONG -NTAPI -MmGetFlagsPage(PFN_TYPE Pfn) -{ - KIRQL oldIrql; - ULONG Flags; - - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - Flags = MiGetPfnEntry(Pfn)->AllFlags; - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - - return(Flags); -} - - VOID NTAPI -MmSetSavedSwapEntryPage(PFN_TYPE Pfn, SWAPENTRY SavedSwapEntry) +MmSetSavedSwapEntryPage(PFN_TYPE Pfn, SWAPENTRY SwapEntry) { KIRQL oldIrql; oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MiGetPfnEntry(Pfn)->SavedSwapEntry = SavedSwapEntry; + MiGetPfnEntry(Pfn)->SavedSwapEntry = SwapEntry; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); } @@ -481,14 +478,14 @@ SWAPENTRY NTAPI MmGetSavedSwapEntryPage(PFN_TYPE Pfn) { - SWAPENTRY SavedSwapEntry; + SWAPENTRY SwapEntry; KIRQL oldIrql; oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - SavedSwapEntry = MiGetPfnEntry(Pfn)->SavedSwapEntry; + SwapEntry = MiGetPfnEntry(Pfn)->SavedSwapEntry; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return(SavedSwapEntry); + return(SwapEntry); } VOID @@ -591,7 +588,7 @@ MmDereferencePage(PFN_TYPE Pfn) MmStats.NrFreePages++; MmStats.NrSystemPages--; if (Page->Flags.Consumer == MC_USER) RemoveEntryList(&Page->ListEntry); - if (Page->RmapListHead != NULL) + if (Page->RmapListHead != (LONG)NULL) { DPRINT1("Freeing page with rmap entries.\n"); KeBugCheck(MEMORY_MANAGEMENT); @@ -636,7 +633,7 @@ NTAPI MmGetLockCountPage(PFN_TYPE Pfn) { KIRQL oldIrql; - ULONG LockCount; + ULONG CurrentLockCount; PPHYSICAL_PAGE Page; DPRINT("MmGetLockCountPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); @@ -650,10 +647,10 @@ MmGetLockCountPage(PFN_TYPE Pfn) KeBugCheck(MEMORY_MANAGEMENT); } - LockCount = Page->LockCount; + CurrentLockCount = Page->LockCount; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return(LockCount); + return(CurrentLockCount); } VOID @@ -711,7 +708,7 @@ MmUnlockPage(PFN_TYPE Pfn) PFN_TYPE NTAPI -MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry) +MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) { PFN_TYPE PfnOffset; PLIST_ENTRY ListEntry; @@ -774,7 +771,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SavedSwapEntry) PageDescriptor->ReferenceCount = 1; PageDescriptor->LockCount = 0; PageDescriptor->MapCount = 0; - PageDescriptor->SavedSwapEntry = SavedSwapEntry; + PageDescriptor->SavedSwapEntry = SwapEntry; MmStats.NrSystemPages++; MmStats.NrFreePages--; diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 684f912fdd1..4236cda457c 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -403,7 +403,7 @@ MmInit1(VOID) /* We'll put the PFN array right after the loaded modules */ MmPfnDatabase = (PVOID)MiKSeg0End; - MmPfnDatabaseEnd = (ULONG_PTR)MmPfnDatabase + (MmHighestPhysicalPage * sizeof(PHYSICAL_PAGE)); + MmPfnDatabaseEnd = (ULONG_PTR)MmPfnDatabase + (MmHighestPhysicalPage * sizeof(MMPFN)); MmPfnDatabaseEnd = PAGE_ROUND_UP(MmPfnDatabaseEnd); /* From 7f3a8dc045259cff73bd41573a90fe0983028e58 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 03:59:23 +0000 Subject: [PATCH 005/577] - Add missing flags for MmAllocatePagesForMdlEx. svn path=/trunk/; revision=41504 --- reactos/include/ddk/winddk.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index df3ca22299c..da0e82cb005 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -5182,6 +5182,9 @@ extern NTKERNELAPI ULONG_PTR MmUserProbeAddress; #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START #define MM_SYSTEM_SPACE_END 0xFFFFFFFF + +#define MM_DONT_ZERO_ALLOCATION 0x00000001 +#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 #elif defined(__x86_64__) From f7ed5bd01d3371d6b1393888bf9dbdb7641f4a9c Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 04:09:25 +0000 Subject: [PATCH 006/577] - It is very possible for MiGetPfnEntry to be called for a page above the page array size, since not all pages are represented in the array. In this scenario, MiGetPfnEntry should return NULL (and the caller should be prepared for this scenario). - Also move out the extern definitions outside of the inline, so that other functions may access them and consequently removing a needless UNREFERENCED_PARAMETER. svn path=/trunk/; revision=41505 --- reactos/ntoskrnl/include/internal/mm.h | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index e51db265fa1..e92c1dc7343 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -352,6 +352,9 @@ typedef struct _MMPFN } u4; } MMPFN, *PMMPFN; +extern PMMPFN MmPageArray; +extern ULONG MmPageArraySize; + extern MM_STATS MmStats; typedef struct _MM_PAGEOP @@ -1036,14 +1039,9 @@ PMMPFN MiGetPfnEntry(IN PFN_TYPE Pfn) { PMMPFN Page; - extern PMMPFN MmPageArray; - extern ULONG MmPageArraySize; - - /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */ - UNREFERENCED_PARAMETER(MmPageArraySize); /* Make sure the PFN number is valid */ - ASSERT(Pfn <= MmPageArraySize); + if (Pfn > MmPageArraySize) return NULL; /* Get the entry */ Page = &MmPageArray[Pfn]; From 6464056a16f4003231f51d0d388761ae497cea97 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 04:14:49 +0000 Subject: [PATCH 007/577] - Get rid of MmPageArray and MmPageArraySize since these were defined as just being ReactOS-specific clones of MmPfnDatabase and MmHighestPhysicalPage. Ergo, use the latter in relevant places. svn path=/trunk/; revision=41506 --- reactos/ntoskrnl/include/internal/mm.h | 9 ++-- reactos/ntoskrnl/mm/freelist.c | 58 +++++++++++++------------- reactos/ntoskrnl/mm/mdlsup.c | 7 ++-- reactos/ntoskrnl/mm/mminit.c | 1 - 4 files changed, 34 insertions(+), 41 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index e92c1dc7343..c74624c76ea 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -21,7 +21,6 @@ extern ULONG MmPagedPoolSize; extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor; extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg; extern ULONG MmHighestPhysicalPage; -extern PVOID MmPfnDatabase; struct _KTRAP_FRAME; struct _EPROCESS; @@ -352,9 +351,7 @@ typedef struct _MMPFN } u4; } MMPFN, *PMMPFN; -extern PMMPFN MmPageArray; -extern ULONG MmPageArraySize; - +extern PMMPFN MmPfnDatabase; extern MM_STATS MmStats; typedef struct _MM_PAGEOP @@ -1041,10 +1038,10 @@ MiGetPfnEntry(IN PFN_TYPE Pfn) PMMPFN Page; /* Make sure the PFN number is valid */ - if (Pfn > MmPageArraySize) return NULL; + if (Pfn > MmHighestPhysicalPage) return NULL; /* Get the entry */ - Page = &MmPageArray[Pfn]; + Page = &MmPfnDatabase[Pfn]; /* Make sure it's valid */ ASSERT_PFN(Page); diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 920dc43f08d..426bd57e2cf 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -48,8 +48,8 @@ #define PHYSICAL_PAGE MMPFN #define PPHYSICAL_PAGE PMMPFN -PPHYSICAL_PAGE MmPageArray; -ULONG MmPageArraySize; +PPHYSICAL_PAGE MmPfnDatabase; +ULONG MmHighestPhysicalPage; /* List of pages allocated to the MC_USER Consumer */ static LIST_ENTRY UserPageListHead; @@ -84,7 +84,7 @@ MmGetLRUFirstUserPage(VOID) PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); ASSERT_PFN(PageDescriptor); KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return PageDescriptor - MmPageArray; + return PageDescriptor - MmPfnDatabase; } VOID @@ -123,7 +123,7 @@ MmGetLRUNextUserPage(PFN_TYPE PreviousPfn) } PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return PageDescriptor - MmPageArray; + return PageDescriptor - MmPfnDatabase; } VOID @@ -152,7 +152,7 @@ MmGetContinuousPages(ULONG NumberOfBytes, oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - last = min(HighestAcceptableAddress.LowPart / PAGE_SIZE, MmPageArraySize - 1); + last = min(HighestAcceptableAddress.LowPart / PAGE_SIZE, MmHighestPhysicalPage - 1); boundary = BoundaryAddressMultiple.LowPart / PAGE_SIZE; for (j = 0; j < 2; j++) @@ -204,7 +204,7 @@ MmGetContinuousPages(ULONG NumberOfBytes, PPHYSICAL_PAGE Page; Page = MiGetPfnEntry(i); RemoveEntryList(&Page->ListEntry); - if (MmPageArray[i].Flags.Zero == 0) + if (MmPfnDatabase[i].Flags.Zero == 0) { UnzeroedPageCount--; } @@ -268,14 +268,12 @@ MmInitializePageList(VOID) InitializeListHead(&FreeZeroedPageListHead); /* Set the size and start of the PFN Database */ - MmPageArray = (PHYSICAL_PAGE *)MmPfnDatabase; - MmPageArraySize = MmHighestPhysicalPage; - Reserved = PAGE_ROUND_UP((MmPageArraySize * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE; + Reserved = PAGE_ROUND_UP((MmHighestPhysicalPage * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE; /* Loop every page required to hold the PFN database */ for (i = 0; i < Reserved; i++) { - PVOID Address = (char*)MmPageArray + (i * PAGE_SIZE); + PVOID Address = (char*)MmPfnDatabase + (i * PAGE_SIZE); /* Check if FreeLDR has already allocated it for us */ if (!MmIsPagePresent(NULL, Address)) @@ -302,7 +300,7 @@ MmInitializePageList(VOID) } /* Clear the PFN database */ - RtlZeroMemory(MmPageArray, (MmPageArraySize + 1) * sizeof(PHYSICAL_PAGE)); + RtlZeroMemory(MmPfnDatabase, (MmHighestPhysicalPage + 1) * sizeof(PHYSICAL_PAGE)); /* This is what a used page looks like */ RtlZeroMemory(&UsedPage, sizeof(UsedPage)); @@ -333,11 +331,11 @@ MmInitializePageList(VOID) for (i = 0; i < Md->PageCount; i++) { /* Skip memory we ignore completely */ - if ((Md->BasePage + i) > MmPageArraySize) break; + if ((Md->BasePage + i) > MmHighestPhysicalPage) break; /* These are pages reserved by the BIOS/ROMs */ - MmPageArray[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; - MmPageArray[Md->BasePage + i].Flags.Consumer = MC_NPPOOL; + MmPfnDatabase[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; + MmPfnDatabase[Md->BasePage + i].Flags.Consumer = MC_NPPOOL; MmStats.NrSystemPages++; } } @@ -350,9 +348,9 @@ MmInitializePageList(VOID) for (i = 0; i < Md->PageCount; i++) { /* Mark it as a free page */ - MmPageArray[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE; + MmPfnDatabase[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE; InsertTailList(&FreeUnzeroedPageListHead, - &MmPageArray[Md->BasePage + i].ListEntry); + &MmPfnDatabase[Md->BasePage + i].ListEntry); UnzeroedPageCount++; MmStats.NrFreePages++; } @@ -363,7 +361,7 @@ MmInitializePageList(VOID) for (i = 0; i < Md->PageCount; i++) { /* Everything else is used memory */ - MmPageArray[Md->BasePage + i] = UsedPage; + MmPfnDatabase[Md->BasePage + i] = UsedPage; MmStats.NrSystemPages++; } } @@ -375,10 +373,10 @@ MmInitializePageList(VOID) i++) { /* Ensure this page was not added previously */ - ASSERT(MmPageArray[i].Flags.Type == 0); + ASSERT(MmPfnDatabase[i].Flags.Type == 0); /* Mark it as used kernel memory */ - MmPageArray[i] = UsedPage; + MmPfnDatabase[i] = UsedPage; MmStats.NrSystemPages++; } @@ -421,7 +419,7 @@ MmMarkPageMapped(PFN_TYPE Pfn) KIRQL oldIrql; PPHYSICAL_PAGE Page; - if (Pfn <= MmPageArraySize) + if (Pfn <= MmHighestPhysicalPage) { oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); @@ -443,7 +441,7 @@ MmMarkPageUnmapped(PFN_TYPE Pfn) KIRQL oldIrql; PPHYSICAL_PAGE Page; - if (Pfn <= MmPageArraySize) + if (Pfn <= MmHighestPhysicalPage) { oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); @@ -497,7 +495,7 @@ MmReferencePageUnsafe(PFN_TYPE Pfn) DPRINT("MmReferencePageUnsafe(PysicalAddress %x)\n", Pfn << PAGE_SHIFT); - if (Pfn == 0 || Pfn > MmPageArraySize) + if (Pfn == 0 || Pfn > MmHighestPhysicalPage) { return; } @@ -778,7 +776,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - PfnOffset = PageDescriptor - MmPageArray; + PfnOffset = PageDescriptor - MmPfnDatabase; if (NeedClear) { MiZeroPage(PfnOffset); @@ -822,16 +820,16 @@ MmAllocPagesSpecifyRange(ULONG Consumer, if ((HighestAddress.u.LowPart % PAGE_SIZE) != 0) HighestPage++; - if (LowestPage >= MmPageArraySize) + if (LowestPage >= MmHighestPhysicalPage) { DPRINT1("MmAllocPagesSpecifyRange(): Out of memory\n"); return -1; } - if (HighestPage > MmPageArraySize) - HighestPage = MmPageArraySize; + if (HighestPage > MmHighestPhysicalPage) + HighestPage = MmHighestPhysicalPage; oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - if (LowestPage == 0 && HighestPage == MmPageArraySize) + if (LowestPage == 0 && HighestPage == MmHighestPhysicalPage) { PLIST_ENTRY ListEntry; while (NumberOfPagesFound < NumberOfPages) @@ -876,7 +874,7 @@ MmAllocPagesSpecifyRange(ULONG Consumer, MmStats.NrFreePages--; /* Remember the page */ - pfn = PageDescriptor - MmPageArray; + pfn = PageDescriptor - MmPfnDatabase; Pages[NumberOfPagesFound++] = pfn; if(Consumer == MC_USER) MmInsertLRULastUserPage(pfn); } @@ -888,7 +886,7 @@ MmAllocPagesSpecifyRange(ULONG Consumer, { for (pfn = LowestPage; pfn < HighestPage; pfn++) { - PageDescriptor = MmPageArray + pfn; + PageDescriptor = MmPfnDatabase + pfn; if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue; @@ -1000,7 +998,7 @@ MmZeroPageThreadMain(PVOID Ignored) /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */ PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - Pfn = PageDescriptor - MmPageArray; + Pfn = PageDescriptor - MmPfnDatabase; Status = MiZeroPageInternal(Pfn); oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); diff --git a/reactos/ntoskrnl/mm/mdlsup.c b/reactos/ntoskrnl/mm/mdlsup.c index 718525f69f5..22f9963d6de 100644 --- a/reactos/ntoskrnl/mm/mdlsup.c +++ b/reactos/ntoskrnl/mm/mdlsup.c @@ -26,7 +26,6 @@ PVOID MiMdlMappingRegionBase = NULL; RTL_BITMAP MiMdlMappingRegionAllocMap; ULONG MiMdlMappingRegionHint; KSPIN_LOCK MiMdlMappingRegionLock; -extern ULONG MmPageArraySize; /* PRIVATE FUNCTIONS **********************************************************/ @@ -418,7 +417,7 @@ MmProbeAndLockPages(IN PMDL Mdl, /* Check if this is an MDL in I/O Space */ if (Mdl->StartVa >= MmSystemRangeStart && - MmGetPfnForProcess(NULL, Mdl->StartVa) >= MmPageArraySize) + MmGetPfnForProcess(NULL, Mdl->StartVa) >= MmHighestPhysicalPage) { /* Just loop each page */ for (i = 0; i < NrPages; i++) @@ -521,7 +520,7 @@ MmProbeAndLockPages(IN PMDL Mdl, for (j = 0; j < i; j++) { Page = MdlPages[j]; - if (Page < MmPageArraySize) + if (Page < MmHighestPhysicalPage) { MmUnlockPage(Page); MmDereferencePage(Page); @@ -532,7 +531,7 @@ MmProbeAndLockPages(IN PMDL Mdl, } Page = MmGetPfnForProcess(NULL, Address); MdlPages[i] = Page; - if (Page >= MmPageArraySize) + if (Page >= MmHighestPhysicalPage) { Mdl->MdlFlags |= MDL_IO_SPACE; } diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 4236cda457c..3f3976c518c 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -53,7 +53,6 @@ ULONG MiNonPagedPoolLength; ULONG MmBootImageSize; ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage; ULONG_PTR MiKSeg0Start, MiKSeg0End; -PVOID MmPfnDatabase; ULONG_PTR MmPfnDatabaseEnd; PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor; MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg; From 7afb3ea904f9cb3d787526f0b73fa13b76e5f9f6 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 04:28:31 +0000 Subject: [PATCH 008/577] - Add another helper: MiGetPfnEntryIndex. This returns the page frame number (PFN) for a given MMPFN entry. - Also add MiPteToAddress to complement MiAddressToPte. This returns the VA for a given PTE. Bonus points if you can figure out the bit magic. svn path=/trunk/; revision=41507 --- reactos/ntoskrnl/include/internal/i386/mm.h | 5 +++++ reactos/ntoskrnl/include/internal/mm.h | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/reactos/ntoskrnl/include/internal/i386/mm.h b/reactos/ntoskrnl/include/internal/i386/mm.h index 67a4ddff817..2846b6993d5 100644 --- a/reactos/ntoskrnl/include/internal/i386/mm.h +++ b/reactos/ntoskrnl/include/internal/i386/mm.h @@ -23,6 +23,11 @@ PULONG MmGetPageDirectory(VOID); #define MiAddressToPteOffset(x) \ ((((ULONG)(x)) << 10) >> 22) +// +// Convert a PTE into a corresponding address +// +#define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10)) + #define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) #define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) #define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index c74624c76ea..ac776199304 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1050,6 +1050,16 @@ MiGetPfnEntry(IN PFN_TYPE Pfn) return Page; }; +FORCEINLINE +PFN_NUMBER +MiGetPfnEntryIndex(IN PMMPFN Pfn1) +{ + // + // This will return the Page Frame Number (PFN) from the MMPFN + // + return Pfn1 - MmPfnDatabase; +} + PFN_TYPE NTAPI MmGetLRUNextUserPage(PFN_TYPE PreviousPage); From ec3307ef64cf57d9133679d69921e64b69ac72ca Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 05:33:48 +0000 Subject: [PATCH 009/577] - Define a new consumer: MC_SYSTEM: - Right now, it is only used for allocating new page tables for kernel-mode mappings. - This consumer's pages are never zeroed automatically (this is a more endemic ReactOS problem -- kernel pages are zeroed when they shouldn't be). - New page tables, however, should indeed be zeroed, so now they are zeroed manually with RtlZeroMemory. - The page zero function is not called anymore, and a useless zero-space hyperspace mapping is thus saved each time this happens. - Because of this, zero-space hyperspace mappings are required much later in the Memory Manager's initialization steps than before. svn path=/trunk/; revision=41508 --- reactos/ntoskrnl/include/internal/mm.h | 3 ++- reactos/ntoskrnl/mm/freelist.c | 2 +- reactos/ntoskrnl/mm/i386/page.c | 7 +++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index ac776199304..75fd0e5ce7d 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -102,7 +102,8 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE; #define MC_USER (1) #define MC_PPOOL (2) #define MC_NPPOOL (3) -#define MC_MAXIMUM (4) +#define MC_SYSTEM (4) +#define MC_MAXIMUM (5) #define PAGED_POOL_MASK 1 #define MUST_SUCCEED_POOL_MASK 2 diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 426bd57e2cf..6ee34130982 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -777,7 +777,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); PfnOffset = PageDescriptor - MmPfnDatabase; - if (NeedClear) + if ((NeedClear) && (Consumer != MC_SYSTEM)) { MiZeroPage(PfnOffset); } diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index f5b7fe4590a..9d2509f2005 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -310,7 +310,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) { return NULL; } - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn); + Status = MmRequestPageMemoryConsumer(MC_SYSTEM, FALSE, &Pfn); if (!NT_SUCCESS(Status) || Pfn == 0) { KeBugCheck(MEMORY_MANAGEMENT); @@ -322,8 +322,11 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) } if(0 != InterlockedCompareExchangePte(&MmGlobalKernelPageDirectory[PdeOffset], Entry, 0)) { - MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn); + MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn); } + InterlockedExchangePte(PageDir, MmGlobalKernelPageDirectory[PdeOffset]); + RtlZeroMemory(MiPteToAddress(PageDir), PAGE_SIZE); + return (PULONG)MiAddressToPte(Address); } InterlockedExchangePte(PageDir, MmGlobalKernelPageDirectory[PdeOffset]); } From f29743948c5010b25b72ae23b4616c1665b95820 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 05:46:50 +0000 Subject: [PATCH 010/577] - Introduce a new MEMORY_AREA flag, MEMORY_AREA_STATIC: - MEMORY_AREA structures are typically allocated from nonpaged pool, under the assumption it exists. - However, nonpaged pool itself is described by a MEMORY_AREA. Right now, this MEMORY_AREA is created after nonpaged pool has been initialized (it is a miracle this works). - This new flag allows MEMORY_AREA structures to be allocated statically, allowing the description of certain system address space components, themselves prerequisites to nonpaged pool creation, as well as the nonpaged pool component itself, before nonpaged pool has been initialized. - This is not yet used. svn path=/trunk/; revision=41509 --- reactos/ntoskrnl/include/internal/mm.h | 3 +++ reactos/ntoskrnl/mm/marea.c | 28 +++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 75fd0e5ce7d..cf9a02ee0ae 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -29,6 +29,8 @@ struct _MM_PAGEOP; typedef ULONG SWAPENTRY; typedef ULONG PFN_TYPE, *PPFN_TYPE; +#define MI_STATIC_MEMORY_AREAS (1) + #define MEMORY_AREA_INVALID (0) #define MEMORY_AREA_SECTION_VIEW (1) #define MEMORY_AREA_CONTINUOUS_MEMORY (2) @@ -43,6 +45,7 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE; #define MEMORY_AREA_PAGED_POOL (12) #define MEMORY_AREA_NO_ACCESS (13) #define MEMORY_AREA_PEB_OR_TEB (14) +#define MEMORY_AREA_STATIC (0x80000000) #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8) diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c index 131225f0eb0..5fe30972862 100644 --- a/reactos/ntoskrnl/mm/marea.c +++ b/reactos/ntoskrnl/mm/marea.c @@ -49,6 +49,9 @@ #pragma alloc_text(INIT, MmInitMemoryAreas) #endif +MEMORY_AREA MiStaticMemoryAreas[MI_STATIC_MEMORY_AREAS]; +ULONG MiStaticMemoryAreaCount; + /* #define VALIDATE_MEMORY_AREAS */ /* FUNCTIONS *****************************************************************/ @@ -986,9 +989,28 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace, return STATUS_CONFLICTING_ADDRESSES; } } - - MemoryArea = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA), - TAG_MAREA); + + // + // Is this a static memory area? + // + if (Type & MEMORY_AREA_STATIC) + { + // + // Use the static array instead of the pool + // + ASSERT(MiStaticMemoryAreaCount < MI_STATIC_MEMORY_AREAS); + MemoryArea = &MiStaticMemoryAreas[MiStaticMemoryAreaCount++]; + } + else + { + // + // Allocate the memory area from nonpaged pool + // + MemoryArea = ExAllocatePoolWithTag(NonPagedPool, + sizeof(MEMORY_AREA), + TAG_MAREA); + } + RtlZeroMemory(MemoryArea, sizeof(MEMORY_AREA)); MemoryArea->Type = Type; MemoryArea->StartingAddress = *BaseAddress; From e7b3dac46f4c735bef9e1959db826aef0a171624 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 06:36:45 +0000 Subject: [PATCH 011/577] - Nonpaged pool MEMORY_AREA is now initialized during nonpaged pool initialization (and it is now a static MEMORY_AREA). - Paged pool MEMORY_AREA is now initialized during paged pool initialization. - Remaining MEMORY_AREAs (KPCR and KUSER_SHARED_DATA) are now created in MiInitSystemMemoryAreas (and they are also static) instead of MmInitVirtualMemory, since this is really what the function was doing. - The page table and hyperspace MEMORY_AREAs are still initialized the same, but are also now static. - The creation of these core/system memory areas is now done much earlier. For example, hyperspace memory area is now created before hyperspace is mapped. - Nonpaged pool, paged pool, and working set initialization is now done outside MiInitSystemMemoryAreas and roughly at the same time as before. - Removed MmInitVirtualMemory as it had become a kitchen sink of random Memory Manager initialization code. - I/O and Local APIC MEMORY_AREAs are not created anymore, since that should be done by the HAL, not the kernel. svn path=/trunk/; revision=41510 --- reactos/ntoskrnl/include/internal/mm.h | 2 +- reactos/ntoskrnl/mm/i386/page.c | 4 +- reactos/ntoskrnl/mm/mm.c | 3 +- reactos/ntoskrnl/mm/mminit.c | 155 ++++++++----------------- reactos/ntoskrnl/mm/npool.c | 16 +++ reactos/ntoskrnl/mm/ppool.c | 16 +++ 6 files changed, 86 insertions(+), 110 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index cf9a02ee0ae..91552e71030 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -29,7 +29,7 @@ struct _MM_PAGEOP; typedef ULONG SWAPENTRY; typedef ULONG PFN_TYPE, *PPFN_TYPE; -#define MI_STATIC_MEMORY_AREAS (1) +#define MI_STATIC_MEMORY_AREAS (6) #define MEMORY_AREA_INVALID (0) #define MEMORY_AREA_SECTION_VIEW (1) diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 9d2509f2005..51d10cf1117 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -1161,7 +1161,7 @@ MiInitPageDirectoryMap(VOID) BoundaryAddressMultiple.QuadPart = 0; BaseAddress = (PVOID)PAGETABLE_MAP; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, + MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC, &BaseAddress, 0x400000, PAGE_READWRITE, @@ -1175,7 +1175,7 @@ MiInitPageDirectoryMap(VOID) } BaseAddress = (PVOID)HYPERSPACE; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, + MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC, &BaseAddress, 0x400000, PAGE_READWRITE, diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index 6bb21351a0a..a3332916664 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.c @@ -293,7 +293,8 @@ MmNotPresentFault(KPROCESSOR_MODE Mode, break; case MEMORY_AREA_SHARED_DATA: - Pfn = MmSharedDataPagePhysicalAddress.LowPart >> PAGE_SHIFT; + Pfn = MmGetPhysicalAddress((PVOID)PCR).LowPart >> PAGE_SHIFT; + Pfn++; Status = MmCreateVirtualMapping(PsGetCurrentProcess(), (PVOID)PAGE_ROUND_DOWN(Address), diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 3f3976c518c..67fc1c25c15 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -47,7 +47,6 @@ MemType[] = BOOLEAN IsThisAnNtAsSystem = FALSE; MM_SYSTEMSIZE MmSystemSize = MmSmallSystem; -PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress; PVOID MiNonPagedPoolStart; ULONG MiNonPagedPoolLength; ULONG MmBootImageSize; @@ -107,110 +106,45 @@ MiShutdownMemoryManager(VOID) VOID INIT_FUNCTION NTAPI -MmInitVirtualMemory() +MiInitSystemMemoryAreas() { - PVOID BaseAddress; - ULONG Length; - NTSTATUS Status; - PHYSICAL_ADDRESS BoundaryAddressMultiple; - PMEMORY_AREA MArea; + PVOID BaseAddress; + PHYSICAL_ADDRESS BoundaryAddressMultiple; + PMEMORY_AREA MArea; + BoundaryAddressMultiple.QuadPart = 0; + + // + // First initialize the page table and hyperspace memory areas + // + MiInitPageDirectoryMap(); + + // + // Next, the KPCR + // + BaseAddress = (PVOID)PCR; + MmCreateMemoryArea(MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC, + &BaseAddress, + PAGE_SIZE * KeNumberProcessors, + PAGE_READWRITE, + &MArea, + TRUE, + 0, + BoundaryAddressMultiple); - BoundaryAddressMultiple.QuadPart = 0; - - DPRINT("NonPagedPool %x - %x, PagedPool %x - %x\n", MiNonPagedPoolStart, (ULONG_PTR)MiNonPagedPoolStart + MiNonPagedPoolLength - 1, - MmPagedPoolBase, (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize - 1); - - MiInitializeNonPagedPool(); - - /* - * Setup the system area descriptor list - */ - MiInitPageDirectoryMap(); - - BaseAddress = (PVOID)PCR; - MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - PAGE_SIZE * KeNumberProcessors, - PAGE_READWRITE, - &MArea, - TRUE, - 0, - BoundaryAddressMultiple); - -#if defined(_M_IX86) - /* Local APIC base */ - BaseAddress = (PVOID)0xFEE00000; - MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - PAGE_SIZE, - PAGE_READWRITE, - &MArea, - TRUE, - 0, - BoundaryAddressMultiple); - - /* i/o APIC base */ - BaseAddress = (PVOID)0xFEC00000; - MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - PAGE_SIZE, - PAGE_READWRITE, - &MArea, - TRUE, - 0, - BoundaryAddressMultiple); -#endif - - BaseAddress = MiNonPagedPoolStart; - MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - MiNonPagedPoolLength, - PAGE_READWRITE, - &MArea, - TRUE, - 0, - BoundaryAddressMultiple); - - BaseAddress = MmPagedPoolBase; - Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_PAGED_POOL, - &BaseAddress, - MmPagedPoolSize, - PAGE_READWRITE, - &MArea, - TRUE, - 0, - BoundaryAddressMultiple); - - MmInitializePagedPool(); - - /* - * Create the kernel mapping of the user/kernel shared memory. - */ - BaseAddress = (PVOID)KI_USER_SHARED_DATA; - Length = PAGE_SIZE; - MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, - &BaseAddress, - Length, - PAGE_READWRITE, - &MArea, - TRUE, - 0, - BoundaryAddressMultiple); - - /* Shared data are always located the next page after PCR */ - MmSharedDataPagePhysicalAddress = MmGetPhysicalAddress((PVOID)PCR); - MmSharedDataPagePhysicalAddress.QuadPart += PAGE_SIZE; - - /* - * - */ - MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); + // + // Now the KUSER_SHARED_DATA + // + BaseAddress = (PVOID)KI_USER_SHARED_DATA; + MmCreateMemoryArea(MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC, + &BaseAddress, + PAGE_SIZE, + PAGE_READWRITE, + &MArea, + TRUE, + 0, + BoundaryAddressMultiple); } VOID @@ -432,6 +366,9 @@ MmInit1(VOID) /* Dump kernel memory layout */ MiDbgKernelLayout(); + + /* Intialize system memory areas */ + MiInitSystemMemoryAreas(); /* Initialize hyperspace */ MiInitHyperSpace(); @@ -441,12 +378,18 @@ MmInit1(VOID) /* Unmap low memory */ MmDeletePageTable(NULL, 0); - - /* Intialize memory areas */ - MmInitVirtualMemory(); + + /* Initialize nonpaged pool */ + MiInitializeNonPagedPool(); + + /* Initialize paged pool */ + MmInitializePagedPool(); /* Initialize MDLs */ MmInitializeMdlImplementation(); + + /* Initialize working sets */ + MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); } BOOLEAN diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index 1d323de5ecc..3e35db39546 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -1699,6 +1699,22 @@ MiInitializeNonPagedPool(VOID) PVOID Address; HDR_USED* used; HDR_FREE* free; + PVOID BaseAddress; + PHYSICAL_ADDRESS BoundaryAddressMultiple; + PMEMORY_AREA MArea; + BoundaryAddressMultiple.QuadPart = 0; + + BaseAddress = MiNonPagedPoolStart; + MmCreateMemoryArea(MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC, + &BaseAddress, + MiNonPagedPoolLength, + PAGE_READWRITE, + &MArea, + TRUE, + 0, + BoundaryAddressMultiple); + #ifdef TAG_STATISTICS_TRACKING for (i = 0; i < TAG_HASH_TABLE_SIZE; i++) diff --git a/reactos/ntoskrnl/mm/ppool.c b/reactos/ntoskrnl/mm/ppool.c index 23fabcf4d14..44330702536 100644 --- a/reactos/ntoskrnl/mm/ppool.c +++ b/reactos/ntoskrnl/mm/ppool.c @@ -52,6 +52,22 @@ INIT_FUNCTION NTAPI MmInitializePagedPool(VOID) { + PVOID BaseAddress; + PHYSICAL_ADDRESS BoundaryAddressMultiple; + PMEMORY_AREA MArea; + BoundaryAddressMultiple.QuadPart = 0; + + BaseAddress = MmPagedPoolBase; + MmCreateMemoryArea(MmGetKernelAddressSpace(), + MEMORY_AREA_PAGED_POOL, + &BaseAddress, + MmPagedPoolSize, + PAGE_READWRITE, + &MArea, + TRUE, + 0, + BoundaryAddressMultiple); + /* * We are still at a high IRQL level at this point so explicitly commit * the first page of the paged pool before writing the first block header. From 88b93de202f12f5c50e2d431c64b888bf7e29361 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 21 Jun 2009 09:08:05 +0000 Subject: [PATCH 012/577] - MC_NPPOOL is special-cased in the memory balancer core to always force the allocation of a page, even in low-memory conditions (which in ReactOS, occur early-on because, in a stroke of typical ReactOS genius, the balancer core is called before the balancer initailizes its values and thresholds). Make MC_SYSTEM special-cased as well, so we never fail to allocate page tables early-on. - This fixes booting on systems which required enough page tables such that the balancer refused the allocation of new pages (around 64+16 pages for page tables of 4KB each, ie. 320MB). svn path=/trunk/; revision=41511 --- reactos/ntoskrnl/mm/balance.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index c7de8152745..184b2a23630 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.c @@ -85,6 +85,8 @@ MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages) MiMemoryConsumers[MC_PPOOL].PagesTarget = NrAvailablePages / 2; MiMemoryConsumers[MC_NPPOOL].PagesTarget = 0xFFFFFFFF; MiMemoryConsumers[MC_NPPOOL].PagesUsed = NrSystemPages; + MiMemoryConsumers[MC_SYSTEM].PagesTarget = 0xFFFFFFFF; + MiMemoryConsumers[MC_SYSTEM].PagesUsed = 0; } VOID @@ -221,7 +223,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, /* * Allocate always memory for the non paged pool and for the pager thread. */ - if (Consumer == MC_NPPOOL || MiIsBalancerThread()) + if ((Consumer == MC_NPPOOL) || (Consumer == MC_SYSTEM) || MiIsBalancerThread()) { Page = MmAllocPage(Consumer, 0); if (Page == 0) From 93a8c8a165203c702a28bd987636d22c33a22e98 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 21 Jun 2009 10:48:09 +0000 Subject: [PATCH 013/577] - Don't release object which drivers should release - Fixes a few crashes when starting another audio stream svn path=/trunk/; revision=41512 --- .../drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c | 7 ++----- .../drivers/wdm/audio/backpln/portcls/pin_wavepci.c | 10 +--------- reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c | 3 +-- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c index 2cf58e87849..97816675a33 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c @@ -692,8 +692,6 @@ CloseStreamRoutine( } This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink); - This->ServiceGroup->lpVtbl->Release(This->ServiceGroup); - This->DmaChannel->lpVtbl->Release(This->DmaChannel); Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice); if (NT_SUCCESS(Status)) @@ -735,7 +733,6 @@ CloseStreamRoutine( This->Filter->lpVtbl->FreePin(This->Filter, (IPortPinWaveCyclic*)This); DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql()); Stream->lpVtbl->Release(Stream); - /* this line is never reached */ } } @@ -1064,8 +1061,8 @@ IPortPinWaveCyclic_fnInit( Status = This->Stream->lpVtbl->SetNotificationFreq(This->Stream, 10, &This->FrameSize); //This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format); - DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE)); - DPRINT1("Setting state to pause %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE)); + DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE)); + DPRINT1("Setting state to pause %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE)); This->State = KSSTATE_PAUSE; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c index 53736675318..87ecace3869 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c @@ -391,14 +391,12 @@ CloseStreamRoutine( if (This->State != KSSTATE_STOP) { This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP); - KeStallExecutionProcessor(10); } } if (This->ServiceGroup) { This->ServiceGroup->lpVtbl->RemoveMember(This->ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink); - This->ServiceGroup->lpVtbl->Release(This->ServiceGroup); } Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice); @@ -407,9 +405,9 @@ CloseStreamRoutine( Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor); if (NT_SUCCESS(Status)) { - ISubDevice->lpVtbl->Release(ISubDevice); Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--; } + ISubDevice->lpVtbl->Release(ISubDevice); } if (This->Format) @@ -418,11 +416,6 @@ CloseStreamRoutine( This->Format = NULL; } - if (This->WaveStream) - { - This->WaveStream->lpVtbl->Release(This->WaveStream); - } - /* complete the irp */ Ctx->Irp->IoStatus.Information = 0; Ctx->Irp->IoStatus.Status = STATUS_SUCCESS; @@ -440,7 +433,6 @@ CloseStreamRoutine( This->Stream = NULL; DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql()); Stream->lpVtbl->Release(Stream); - /* this line is never reached */ } } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c index adfabc09186..aaff97fcc69 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c @@ -702,9 +702,9 @@ CloseStreamRoutine( Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor); if (NT_SUCCESS(Status)) { - ISubDevice->lpVtbl->Release(ISubDevice); Descriptor->Factory.Instances[This->ConnectDetails->PinId].CurrentPinInstanceCount--; } + ISubDevice->lpVtbl->Release(ISubDevice); } if (This->Format) @@ -735,7 +735,6 @@ CloseStreamRoutine( This->Stream = NULL; DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql()); Stream->lpVtbl->Release(Stream); - /* this line is never reached */ } } From d3421fde4bb7e591fcce50be5eb750e62373e8d8 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sun, 21 Jun 2009 17:06:34 +0000 Subject: [PATCH 014/577] - Define noreturn attribute for KeBugCheckWithTf and KiBugCheckDebugBreak in a msvc compatible way svn path=/trunk/; revision=41513 --- reactos/ntoskrnl/include/internal/ke.h | 1 + reactos/ntoskrnl/ke/bug.c | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 84f0d88fc44..28e49c835d6 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -790,6 +790,7 @@ KeTrapFrameToContext( IN OUT PCONTEXT Context ); +DECLSPEC_NORETURN VOID NTAPI KeBugCheckWithTf( diff --git a/reactos/ntoskrnl/ke/bug.c b/reactos/ntoskrnl/ke/bug.c index 5fea14bd2b7..fa1a0b61f29 100644 --- a/reactos/ntoskrnl/ke/bug.c +++ b/reactos/ntoskrnl/ke/bug.c @@ -546,9 +546,9 @@ KiDoBugCheckCallbacks(VOID) } } +DECLSPEC_NORETURN VOID NTAPI -__declspec(noreturn) KiBugCheckDebugBreak(IN ULONG StatusCode) { /* If KDBG isn't connected, freeze the CPU, otherwise, break */ @@ -751,7 +751,6 @@ KiDisplayBlueScreen(IN ULONG MessageId, VOID NTAPI -__declspec(noreturn) KeBugCheckWithTf(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, From 024b2b410c511e06351872fb354f08e389f9d5b0 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 21 Jun 2009 19:23:06 +0000 Subject: [PATCH 015/577] - Implement two helper functions to correctly set permissions for a window station and desktops. Those are unused now, but they are going to solve two problems in current winlogon. First of them being a "big HACK" in CreateWindowStationAndDesktops(), which has to do CloseDesktop / OpenDesktopW to get a non-inheritable handle with GENERIC_ALL righs. Second problem is that security attributes structure passed to CreateWindowStationW and CreateDesktopW are invalid because now lpSecurityDescriptor points to an ACL but it's supposed to point to an actual SECURITY_DESCRIPTOR structure. Information from: http://msdn.microsoft.com/en-us/library/aa379608.aspx. svn path=/trunk/; revision=41515 --- reactos/base/system/winlogon/wlx.c | 193 +++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) diff --git a/reactos/base/system/winlogon/wlx.c b/reactos/base/system/winlogon/wlx.c index 9e8bce8876f..04a7ef0c755 100644 --- a/reactos/base/system/winlogon/wlx.c +++ b/reactos/base/system/winlogon/wlx.c @@ -16,6 +16,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(winlogon); +#define DESKTOP_ALL (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | \ + DESKTOP_CREATEMENU | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | \ + DESKTOP_JOURNALPLAYBACK | DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | \ + DESKTOP_SWITCHDESKTOP | STANDARD_RIGHTS_REQUIRED) + +#define WINSTA_ALL (WINSTA_ENUMDESKTOPS | WINSTA_READATTRIBUTES | \ + WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | \ + WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | \ + WINSTA_EXITWINDOWS | WINSTA_ENUMERATE | WINSTA_READSCREEN | \ + STANDARD_RIGHTS_REQUIRED) + +#define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | \ + GENERIC_EXECUTE | GENERIC_ALL) + /* GLOBALS ******************************************************************/ static DLGPROC PreviousWindowProc; @@ -757,6 +771,185 @@ GinaInit( &Session->Gina.Context); } +BOOL +AddAceToWindowStation( + IN HWINSTA WinSta, + IN PSID Sid) +{ + DWORD AclSize; + SECURITY_INFORMATION SecurityInformation; + PACL pDefaultAcl = NULL; + PSECURITY_DESCRIPTOR WinstaSd = NULL; + PACCESS_ALLOWED_ACE Ace = NULL; + BOOL Ret = FALSE; + + /* Allocate space for an ACL */ + AclSize = sizeof(ACL) + + 2 * (FIELD_OFFSET(ACCESS_ALLOWED_ACE, SidStart) + GetLengthSid(Sid)); + pDefaultAcl = HeapAlloc(GetProcessHeap(), 0, AclSize); + if (!pDefaultAcl) + { + ERR("WL: HeapAlloc() failed\n"); + goto cleanup; + } + + /* Initialize it */ + if (!InitializeAcl(pDefaultAcl, AclSize, ACL_REVISION)) + { + ERR("WL: InitializeAcl() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Initialize new security descriptor */ + WinstaSd = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH); + if (!InitializeSecurityDescriptor(WinstaSd, SECURITY_DESCRIPTOR_REVISION)) + { + ERR("WL: InitializeSecurityDescriptor() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Allocate memory for access allowed ACE */ + Ace = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ACCESS_ALLOWED_ACE)+ + GetLengthSid(Sid) - sizeof(DWORD)); + + /* Create the first ACE for the window station */ + Ace->Header.AceType = ACCESS_ALLOWED_ACE_TYPE; + Ace->Header.AceFlags = CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE | OBJECT_INHERIT_ACE; + Ace->Header.AceSize = sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(Sid) - sizeof(DWORD); + Ace->Mask = GENERIC_ACCESS; + + /* Copy the sid */ + if (!CopySid(GetLengthSid(Sid), &Ace->SidStart, Sid)) + { + ERR("WL: CopySid() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Add the first ACE */ + if (!AddAce(pDefaultAcl, ACL_REVISION, MAXDWORD, (LPVOID)Ace, Ace->Header.AceSize)) + { + ERR("WL: AddAce() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Add the second ACE to the end of ACL */ + Ace->Header.AceFlags = NO_PROPAGATE_INHERIT_ACE; + Ace->Mask = WINSTA_ALL; + if (!AddAce(pDefaultAcl, ACL_REVISION, MAXDWORD, (LPVOID)Ace, Ace->Header.AceSize)) + { + ERR("WL: AddAce() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Add ACL to winsta's security descriptor */ + if (!SetSecurityDescriptorDacl(WinstaSd, TRUE, pDefaultAcl, FALSE)) + { + ERR("WL: SetSecurityDescriptorDacl() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Apply security to the window station */ + SecurityInformation = DACL_SECURITY_INFORMATION; + if (!SetUserObjectSecurity(WinSta, &SecurityInformation, WinstaSd)) + { + ERR("WL: SetUserObjectSecurity() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Indicate success */ + Ret = TRUE; + +cleanup: + /* Free allocated stuff */ + if (pDefaultAcl) HeapFree(GetProcessHeap(), 0, pDefaultAcl); + if (WinstaSd) HeapFree(GetProcessHeap(), 0, WinstaSd); + if (Ace) HeapFree(GetProcessHeap(), 0, Ace); + + return Ret; +} + +BOOL +AddAceToDesktop( + IN HDESK Desktop, + IN PSID WinlogonSid, + IN PSID UserSid) +{ + DWORD AclSize; + SECURITY_INFORMATION SecurityInformation; + PACL Acl = NULL; + PSECURITY_DESCRIPTOR DesktopSd = NULL; + BOOL Ret = FALSE; + + /* Allocate ACL */ + AclSize = sizeof(ACL) + + FIELD_OFFSET(ACCESS_ALLOWED_ACE, SidStart) + GetLengthSid(WinlogonSid); + + /* Take user's sid into account */ + if (UserSid) + AclSize += FIELD_OFFSET(ACCESS_ALLOWED_ACE, SidStart) + GetLengthSid(UserSid); + + Acl = HeapAlloc(GetProcessHeap(), 0, AclSize); + if (!Acl) + { + ERR("WL: HeapAlloc() failed\n"); + goto cleanup; + } + + /* Initialize ACL */ + if (!InitializeAcl(Acl, AclSize, ACL_REVISION)) + { + ERR("WL: InitializeAcl() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Add full desktop access ACE for winlogon */ + if (!AddAccessAllowedAce(Acl, ACL_REVISION, DESKTOP_ALL, WinlogonSid)) + { + ERR("WL: AddAccessAllowedAce() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Add full desktop access ACE for a user (if provided) */ + if (UserSid && !AddAccessAllowedAce(Acl, ACL_REVISION, DESKTOP_ALL, UserSid)) + { + ERR("WL: AddAccessAllowedAce() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Initialize new security descriptor */ + DesktopSd = HeapAlloc(GetProcessHeap(), 0, SECURITY_DESCRIPTOR_MIN_LENGTH); + if (!InitializeSecurityDescriptor(DesktopSd, SECURITY_DESCRIPTOR_REVISION)) + { + ERR("WL: InitializeSecurityDescriptor() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Add ACL to the security descriptor */ + if (!SetSecurityDescriptorDacl(DesktopSd, TRUE, Acl, FALSE)) + { + ERR("WL: SetSecurityDescriptorDacl() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Apply security to the window station */ + SecurityInformation = DACL_SECURITY_INFORMATION; + if (!SetUserObjectSecurity(Desktop, &SecurityInformation, DesktopSd)) + { + ERR("WL: SetUserObjectSecurity() failed (error %lu)\n", GetLastError()); + goto cleanup; + } + + /* Indicate success */ + Ret = TRUE; + +cleanup: + /* Free allocated stuff */ + if (Acl) HeapFree(GetProcessHeap(), 0, Acl); + if (DesktopSd) HeapFree(GetProcessHeap(), 0, DesktopSd); + + return Ret; +} + BOOL CreateWindowStationAndDesktops( IN OUT PWLSESSION Session) From fda2c1efd73b79c4d9302c206b90933939817755 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sun, 21 Jun 2009 20:00:00 +0000 Subject: [PATCH 016/577] Bug 4626: slovak update by Mario Kacmar svn path=/trunk/; revision=41516 --- reactos/dll/cpl/input/lang/sk-SK.rc | 10 +++++----- reactos/dll/cpl/main/lang/sk-SK.rc | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/reactos/dll/cpl/input/lang/sk-SK.rc b/reactos/dll/cpl/input/lang/sk-SK.rc index fc72c82e4e8..aeecf8745d8 100644 --- a/reactos/dll/cpl/input/lang/sk-SK.rc +++ b/reactos/dll/cpl/input/lang/sk-SK.rc @@ -1,6 +1,6 @@ /* TRANSLATOR : Mário Kaèmár /Mario Kacmar/ aka Kario (kario@szm.sk) * DATE OF TR.: 01-03-2008 - * LAST CHANGE: 17-02-2009 + * LAST CHANGE: 14-06-2009 */ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT @@ -90,14 +90,14 @@ BEGIN IDS_KEYBOARD "Klávesnica" IDS_NONE "(Nie je)" IDS_UNKNOWN "(Neznáme)" - IDS_RESTART "Do you want to restart your computer now?" + IDS_RESTART "Chcete teraz reštartova Váš poèítaè?" IDS_WHATS_THIS "Èo je toto?" IDS_LANGUAGE "Jazyk" IDS_LAYOUT "Rozloženie klávesnice" - IDS_REM_QUESTION "Do you want to remove selected keyboard layout?" + IDS_REM_QUESTION "Chcete odstráni vybrané rozloženie klávesnice?" IDS_CONFIRMATION "Potvrdenie" //Confirmation - IDS_LAYOUT_EXISTS "This layout already exists." - IDS_LAYOUT_EXISTS2 "This layout already exists and can not be added." + IDS_LAYOUT_EXISTS "Toto rozloženie už existuje." + IDS_LAYOUT_EXISTS2 "Toto rozloženie už existuje a nemôže by pridané." IDS_CTRL_SHIFT "Ctrl+Shift" IDS_LEFT_ALT_SHIFT "¼avý Alt+Shift" IDS_SWITCH_BET_INLANG "Switch between input languages" diff --git a/reactos/dll/cpl/main/lang/sk-SK.rc b/reactos/dll/cpl/main/lang/sk-SK.rc index 8c93db751d0..1e779860930 100644 --- a/reactos/dll/cpl/main/lang/sk-SK.rc +++ b/reactos/dll/cpl/main/lang/sk-SK.rc @@ -1,6 +1,6 @@ /* TRANSLATOR : Mário Kaèmár /Mario Kacmar/ aka Kario (kario@szm.sk) * DATE OF TR.: 02-02-2008 - * LAST CHANGE: 17-06-2008 + * LAST CHANGE: 14-06-2009 * ______________________________________________ * NOTE: this file is not fully translated */ @@ -12,23 +12,23 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Rýchlos" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Character repeat", -1, 5, 5, 230, 130 + GROUPBOX "Opakovanie znakov", -1, 5, 5, 230, 130 ICON IDI_REPEAT_DELAY, IDC_ICON_REPEAT_DELAY, 15, 15, 15, 15 - LTEXT "Repeat &delay", -1, 40, 15, 50, 10 - LTEXT "Long", -1, 40, 30, 20, 10 - LTEXT "Short", -1, 200, 30, 20, 10 + LTEXT "Oneskorenie pre&d opakovaním:", -1, 40, 15, 50, 10 + LTEXT "dlhé", -1, 40, 30, 20, 10 + LTEXT "krátke", -1, 200, 30, 20, 10 CONTROL "",IDC_SLIDER_REPEAT_DELAY, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 65, 30, 130, 17 ICON IDI_REPEAT_RATE, IDC_ICON_REPEAT_RATE, 15, 70, 15, 15 - LTEXT "&Repeat rate", -1, 40, 70, 50, 10 - LTEXT "Slow", -1, 40, 85, 20, 10 - LTEXT "Fast", -1, 200, 85, 20, 10 + LTEXT "&Rýchlos opakovania:", -1, 40, 70, 50, 10 + LTEXT "malá", -1, 40, 85, 20, 10 //pomaly + LTEXT "ve¾ká", -1, 200, 85, 20, 10 //rýchlo CONTROL "",IDC_SLIDER_REPEAT_RATE, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 65, 85, 130, 17 - LTEXT "Click here and hold down a key to &test repeat rate:", -1, 15, 105, 150, 10 + LTEXT "Kliknite sem a podržte kláves k o&testovaniu rýchlosti opakovania:", -1, 15, 105, 150, 10 EDITTEXT IDC_EDIT_REPEAT_RATE, 15, 115, 200, 15, WS_CHILD | WS_VISIBLE | WS_GROUP - GROUPBOX "Cursor &blink rate:", -1, 5, 145, 230, 50 + GROUPBOX "&Blikanie kurzora:", -1, 5, 145, 230, 50 LTEXT "", IDC_TEXT_CURSOR_BLINK, 20, 165, 1, 8 - LTEXT "None", -1, 40, 165, 30, 10 - LTEXT "Fast", -1, 200, 165, 30, 10 + LTEXT "žiadne", -1, 40, 165, 30, 10 + LTEXT "rýchle", -1, 200, 165, 30, 10 CONTROL "",IDC_SLIDER_CURSOR_BLINK, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 65, 165, 130, 17 END From 46ec0bb579c88cc28b14335995d53f5dfefc7d37 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 21 Jun 2009 21:35:40 +0000 Subject: [PATCH 017/577] - Fix a buffer overrun svn path=/trunk/; revision=41517 --- reactos/drivers/ksfilter/ks/irp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index 722d1e1e659..5c34c72ec8f 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -775,9 +775,9 @@ KsCreate( if (IoStack->FileObject->FileName.Buffer[0] != L'{') { RtlMoveMemory(IoStack->FileObject->FileName.Buffer, &IoStack->FileObject->FileName.Buffer[Length+1], - IoStack->FileObject->FileName.Length - Length * sizeof(WCHAR)); + IoStack->FileObject->FileName.Length - (Length + 1) * sizeof(WCHAR)); - IoStack->FileObject->FileName.Length -= Length * sizeof(WCHAR); + IoStack->FileObject->FileName.Length -= (Length + 1)* sizeof(WCHAR); } From d38eca89a36c31e92b65f0e8f9a3b8fc31148da0 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Sun, 21 Jun 2009 21:37:47 +0000 Subject: [PATCH 018/577] Don't change an std::set in the loop that enumerates it. Patch by Daniel Zimmermann See issue #3128 for more details. svn path=/trunk/; revision=41518 --- reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp b/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp index 173590bbd7c..344be126114 100644 --- a/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp +++ b/reactos/tools/rbuild/backend/msvc/vcprojmaker.cpp @@ -400,11 +400,7 @@ MSVCBackend::_generate_vcproj ( const Module& module ) fprintf ( OUT, ";" ); string unescaped = *it1; - defines.erase(unescaped); - const string& escaped = _replace_str(unescaped, "\"",""); - - defines.insert(escaped); - fprintf ( OUT, "%s", escaped.c_str() ); + fprintf ( OUT, "%s", _replace_str(unescaped, "\"","").c_str() ); } fprintf ( OUT, "\"\r\n" ); fprintf ( OUT, "\t\t\t\tForcedIncludeFiles=\"%s\"\r\n", "warning.h"); From da2965ea12e0e92e207919efc9f63bce3fa7b31c Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Sun, 21 Jun 2009 21:40:37 +0000 Subject: [PATCH 019/577] Compilers other than GCC deserve offsetof, don't they? svn path=/trunk/; revision=41519 --- reactos/include/crt/stddef.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/include/crt/stddef.h b/reactos/include/crt/stddef.h index 02b6d7a9e53..8aa692e540a 100644 --- a/reactos/include/crt/stddef.h +++ b/reactos/include/crt/stddef.h @@ -287,7 +287,7 @@ typedef long ssize_t; symbols in the _FOO_T_ family, stays defined even after its corresponding type is defined). If we define wchar_t, then we must undef _WCHAR_T_; for BSD/386 1.1 (and perhaps others), if - we undef _WCHAR_T_, then we must also define rune_t, since + we undef _WCHAR_T_, then we must also define rune_t, since headers like runetype.h assume that if machine/ansi.h is included, and _BSD_WCHAR_T_ is not defined, then rune_t is available. machine/ansi.h says, "Note that _WCHAR_T_ and _RUNE_T_ must be of @@ -390,7 +390,11 @@ typedef __WCHAR_TYPE__ wchar_t; #ifndef offsetof /* Offset of member MEMBER in a struct of type TYPE. */ +#if defined(__GNUC__) #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) +#else +#define offsetof(TYPE, MEMBER) ((size_t)&(((TYPE *)0)->MEMBER)) +#endif #endif /* !offsetof */ From 586a1d0fff616906fea6488f5a4db0954ee1e802 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Sun, 21 Jun 2009 22:13:28 +0000 Subject: [PATCH 020/577] Move gcc -g and -Wall options out of rbuild and into .rbuild files Move non-architecture-specific msc options to ReactOS-generic.rbuild svn path=/trunk/; revision=41520 --- reactos/ReactOS-arm.rbuild | 3 +++ reactos/ReactOS-generic.rbuild | 11 +++++++++-- reactos/ReactOS-i386.rbuild | 7 ++++--- reactos/ReactOS-ppc.rbuild | 2 ++ reactos/tools/rbuild/backend/mingw/mingw.cpp | 6 ------ 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/reactos/ReactOS-arm.rbuild b/reactos/ReactOS-arm.rbuild index 7172dd316c8..cdf19cbd7c8 100644 --- a/reactos/ReactOS-arm.rbuild +++ b/reactos/ReactOS-arm.rbuild @@ -14,6 +14,9 @@ + -gstabs+ + -gstabs+ + 1 diff --git a/reactos/ReactOS-generic.rbuild b/reactos/ReactOS-generic.rbuild index 65bcc4f44ea..041bd557bdb 100644 --- a/reactos/ReactOS-generic.rbuild +++ b/reactos/ReactOS-generic.rbuild @@ -126,7 +126,14 @@ - -Wno-non-virtual-dtor + + -Wall + -Wno-non-virtual-dtor + - /wd4711 + + /Zl + /Zi + /W1 + diff --git a/reactos/ReactOS-i386.rbuild b/reactos/ReactOS-i386.rbuild index c5b35f7de8d..5e2b40d0272 100644 --- a/reactos/ReactOS-i386.rbuild +++ b/reactos/ReactOS-i386.rbuild @@ -43,6 +43,8 @@ -Wno-strict-aliasing -Wpointer-arith -Wno-multichar + + -gstabs+ @@ -70,11 +72,10 @@ /GS- - /Zl - /Zi - /Wall + -gstabs+ + -disable-stdcall-fixup diff --git a/reactos/ReactOS-ppc.rbuild b/reactos/ReactOS-ppc.rbuild index 170c41717a2..1dd201e05b3 100644 --- a/reactos/ReactOS-ppc.rbuild +++ b/reactos/ReactOS-ppc.rbuild @@ -20,4 +20,6 @@ -meabi -O2 -Wno-strict-aliasing + -gstabs+ + -gstabs+ diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index dc0727d5640..1337600588b 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -455,8 +455,6 @@ MingwBackend::GenerateGlobalVariables () const if ( ProjectNode.configuration.Compiler == GnuGcc ) { - fprintf ( fMakefile, "PROJECT_CFLAGS += -Wall\n" ); - fprintf ( fMakefile, "PROJECT_CXXFLAGS += -Wall\n" ); fprintf ( fMakefile, "ifneq ($(OARCH),)\n" ); fprintf ( fMakefile, "PROJECT_CFLAGS += -march=$(OARCH)\n" ); fprintf ( fMakefile, "PROJECT_CXXFLAGS += -march=$(OARCH)\n" ); @@ -466,10 +464,6 @@ MingwBackend::GenerateGlobalVariables () const fprintf ( fMakefile, "PROJECT_CXXFLAGS += -mtune=$(TUNE)\n" ); fprintf ( fMakefile, "endif\n" ); - fprintf ( fMakefile, "PROJECT_CFLAGS += -g%s\n", Environment::GetArch() == "amd64" ? "dwarf-2" : "stabs+" ); - fprintf ( fMakefile, "PROJECT_CXXFLAGS += -g%s\n", Environment::GetArch() == "amd64" ? "dwarf-2" : "stabs+" ); - fprintf ( fMakefile, "PROJECT_ASFLAGS += -g%s\n", Environment::GetArch() == "amd64" ? "dwarf-2" : "stabs+" ); - if ( usePipe ) { fprintf ( fMakefile, "PROJECT_CFLAGS += -pipe\n" ); From 12b34a994b25e55808949d429a03779cce151569 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 22 Jun 2009 00:49:06 +0000 Subject: [PATCH 021/577] - Partial rewrite of NdisReadConfiguration - It now determines the parameter type based on the key instead of the ParameterType passed by the caller (documented on MSDN) - It also always sets (*ParameterValue)->ParameterType to NdisParameterInteger when reading an integer or hex integer value (documented on MSDN) - This will fix miniport drivers that supply a bogus ParameterType value because it is ignored by NDIS on NT svn path=/trunk/; revision=41521 --- reactos/drivers/network/ndis/ndis/config.c | 254 ++++++++------------- 1 file changed, 98 insertions(+), 156 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c index 916c59bb099..297aac6cf3c 100644 --- a/reactos/drivers/network/ndis/ndis/config.c +++ b/reactos/drivers/network/ndis/ndis/config.c @@ -323,22 +323,11 @@ NdisReadConfiguration( ULONG KeyDataLength; PMINIPORT_RESOURCE MiniportResource; PMINIPORT_CONFIGURATION_CONTEXT ConfigurationContext = (PMINIPORT_CONFIGURATION_CONTEXT)ConfigurationHandle; + PVOID Buffer; *ParameterValue = NULL; *Status = NDIS_STATUS_FAILURE; - if(ParameterType != NdisParameterInteger && - ParameterType != NdisParameterHexInteger && - ParameterType != NdisParameterString && - ParameterType != NdisParameterMultiString && - ParameterType != NdisParameterBinary - ) - { - NDIS_DbgPrint(MIN_TRACE,("unsupported parameter type\n")); - *Status = NDIS_STATUS_NOT_SUPPORTED; - return; - } - NDIS_DbgPrint(MAX_TRACE,("requested read of %wZ\n", Keyword)); if (ConfigurationContext == NULL) @@ -498,152 +487,105 @@ NdisReadConfiguration( return; } - switch(ParameterType) + *ParameterValue = ExAllocatePool(PagedPool, sizeof(NDIS_CONFIGURATION_PARAMETER)); + if (!*ParameterValue) { - case NdisParameterInteger: - case NdisParameterHexInteger: - { - UNICODE_STRING str; - - *ParameterValue = ExAllocatePool(PagedPool, sizeof(NDIS_CONFIGURATION_PARAMETER)); - if(!*ParameterValue) - { - NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n")); - ExFreePool(KeyInformation); - *Status = NDIS_STATUS_RESOURCES; - return; - } - - str.Length = str.MaximumLength = (USHORT)KeyInformation->DataLength; - str.Buffer = (PWCHAR)KeyInformation->Data; - - (*ParameterValue)->ParameterType = ParameterType; - - /* - If ParameterType is NdisParameterInteger then the base of str is decimal. - If ParameterType is NdisParameterHexInteger then the base of str is hexadecimal. - */ - if (ParameterType == NdisParameterInteger) - *Status = RtlUnicodeStringToInteger(&str, 10, &(*ParameterValue)->ParameterData.IntegerData); - else if (ParameterType == NdisParameterHexInteger) - *Status = RtlUnicodeStringToInteger(&str, 16, &(*ParameterValue)->ParameterData.IntegerData); - - - ExFreePool(KeyInformation); - - if(*Status != STATUS_SUCCESS) { - ExFreePool(*ParameterValue); - *ParameterValue = NULL; - *Status = NDIS_STATUS_FAILURE; - return; - } - - MiniportResource->ResourceType = 0; - MiniportResource->Resource = *ParameterValue; - NDIS_DbgPrint(MID_TRACE,("inserting 0x%x into the resource list\n", MiniportResource->Resource)); - ExInterlockedInsertTailList(&ConfigurationContext->ResourceListHead, &MiniportResource->ListEntry, &ConfigurationContext->ResourceLock); - - *Status = NDIS_STATUS_SUCCESS; - - return; - } - - case NdisParameterString: - case NdisParameterMultiString: - { - PWCHAR RegData = 0; - - if(KeyInformation->Type != REG_SZ && KeyInformation->Type != REG_MULTI_SZ) - { - NDIS_DbgPrint(MIN_TRACE,("requested type does not match actual value type\n")); - ExFreePool(KeyInformation); - *ParameterValue = NULL; - *Status = NDIS_STATUS_FAILURE; - return; - } - - *ParameterValue = ExAllocatePool(PagedPool, sizeof(NDIS_CONFIGURATION_PARAMETER)); - if(!*ParameterValue) - { - NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n")); - ExFreePool(KeyInformation); - *Status = NDIS_STATUS_RESOURCES; - return; - } - - RegData = ExAllocatePool(PagedPool, KeyInformation->DataLength); - if(!RegData) - { - NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n")); - ExFreePool(KeyInformation); - ExFreePool(*ParameterValue); - *ParameterValue = NULL; - *Status = NDIS_STATUS_FAILURE; - return; - } - - MiniportResource->ResourceType = 0; - MiniportResource->Resource = *ParameterValue; - NDIS_DbgPrint(MID_TRACE,("inserting 0x%x into the resource list\n", MiniportResource->Resource)); - ExInterlockedInsertTailList(&ConfigurationContext->ResourceListHead, &MiniportResource->ListEntry, &ConfigurationContext->ResourceLock); - - memcpy(RegData, KeyInformation->Data, KeyInformation->DataLength); - - (*ParameterValue)->ParameterType = ParameterType; - (*ParameterValue)->ParameterData.StringData.Length = (USHORT)KeyInformation->DataLength; - (*ParameterValue)->ParameterData.StringData.Buffer = RegData; - - ExFreePool(KeyInformation); - - *Status = NDIS_STATUS_SUCCESS; - - return; - } - - case NdisParameterBinary: - { - if(KeyInformation->Type != REG_BINARY) - { - NDIS_DbgPrint(MIN_TRACE,("requested type does not match actual value type\n")); - *Status = NDIS_STATUS_FAILURE; - ExFreePool(KeyInformation); - return; - } - - *ParameterValue = ExAllocatePool(PagedPool, sizeof(NDIS_CONFIGURATION_PARAMETER) + KeyInformation->DataLength); - if(!*ParameterValue) - { - NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n")); - ExFreePool(KeyInformation); - *Status = NDIS_STATUS_RESOURCES; - return; - } - - (*ParameterValue)->ParameterData.BinaryData.Buffer = ExAllocatePool(PagedPool, KeyInformation->DataLength); - if (!(*ParameterValue)->ParameterData.BinaryData.Buffer) - { - NDIS_DbgPrint(MIN_TRACE,("Insufficient resources.\n")); - ExFreePool(KeyInformation); - *Status = NDIS_STATUS_RESOURCES; - return; - } - - (*ParameterValue)->ParameterType = ParameterType; - (*ParameterValue)->ParameterData.BinaryData.Length = KeyInformation->DataLength; - memcpy((*ParameterValue)->ParameterData.BinaryData.Buffer, KeyInformation->Data, KeyInformation->DataLength); - - MiniportResource->ResourceType = 0; - MiniportResource->Resource = *ParameterValue; - NDIS_DbgPrint(MID_TRACE,("inserting 0x%x into the resource list\n", MiniportResource->Resource)); - ExInterlockedInsertTailList(&ConfigurationContext->ResourceListHead, &MiniportResource->ListEntry, &ConfigurationContext->ResourceLock); - - ExFreePool(KeyInformation); - - *Status = NDIS_STATUS_SUCCESS; - - return; - } + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + ExFreePool(MiniportResource); + ExFreePool(KeyInformation); + *Status = NDIS_STATUS_RESOURCES; + return; } + + RtlZeroMemory(*ParameterValue, sizeof(NDIS_CONFIGURATION_PARAMETER)); + + if (KeyInformation->Type == REG_BINARY) + { + NDIS_DbgPrint(MAX_TRACE, ("NdisParameterBinary\n")); + + (*ParameterValue)->ParameterType = NdisParameterBinary; + + Buffer = ExAllocatePool(NonPagedPool, KeyInformation->DataLength); + if (!Buffer) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + ExFreePool(MiniportResource); + ExFreePool(KeyInformation); + *Status = NDIS_STATUS_RESOURCES; + return; + } + + RtlCopyMemory(Buffer, KeyInformation->Data, KeyInformation->DataLength); + + (*ParameterValue)->ParameterData.BinaryData.Buffer = Buffer; + (*ParameterValue)->ParameterData.BinaryData.Length = KeyInformation->DataLength; + } + else if (KeyInformation->Type == REG_MULTI_SZ) + { + NDIS_DbgPrint(MAX_TRACE, ("NdisParameterMultiString\n")); + + (*ParameterValue)->ParameterType = NdisParameterMultiString; + + Buffer = ExAllocatePool(NonPagedPool, KeyInformation->DataLength); + if (!Buffer) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + ExFreePool(MiniportResource); + ExFreePool(KeyInformation); + *Status = NDIS_STATUS_RESOURCES; + return; + } + + RtlCopyMemory(Buffer, KeyInformation->Data, KeyInformation->DataLength); + + (*ParameterValue)->ParameterData.StringData.Buffer = Buffer; + (*ParameterValue)->ParameterData.StringData.Length = KeyInformation->DataLength; + } + else + { + UNICODE_STRING str; + + str.Length = str.MaximumLength = (USHORT)KeyInformation->DataLength; + str.Buffer = (PWCHAR)KeyInformation->Data; + + if ((*Status = RtlUnicodeStringToInteger(&str, 0, + &(*ParameterValue)->ParameterData.IntegerData)) == STATUS_SUCCESS) + { + NDIS_DbgPrint(MAX_TRACE, ("NdisParameterInteger\n")); + + (*ParameterValue)->ParameterType = NdisParameterInteger; + } + else + { + NDIS_DbgPrint(MAX_TRACE, ("NdisParameterString\n")); + + (*ParameterValue)->ParameterType = NdisParameterString; + + Buffer = ExAllocatePool(NonPagedPool, KeyInformation->DataLength); + if (!Buffer) + { + NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + ExFreePool(MiniportResource); + ExFreePool(KeyInformation); + *Status = NDIS_STATUS_RESOURCES; + return; + } + + RtlCopyMemory(Buffer, KeyInformation->Data, KeyInformation->DataLength); + + (*ParameterValue)->ParameterData.StringData.Buffer = Buffer; + (*ParameterValue)->ParameterData.StringData.Length = KeyInformation->DataLength; + } + } + + MiniportResource->ResourceType = MINIPORT_RESOURCE_TYPE_MEMORY; + MiniportResource->Resource = *ParameterValue; + + ExInterlockedInsertTailList(&ConfigurationContext->ResourceListHead, &MiniportResource->ListEntry, &ConfigurationContext->ResourceLock); + + ExFreePool(KeyInformation); + + *Status = NDIS_STATUS_SUCCESS; } From 55b816a7c4b945cfbe2b44c1a923c074e6930e3c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 22 Jun 2009 01:10:58 +0000 Subject: [PATCH 022/577] - Fix a bug that caused translations of NdisParameterInteger values into unicode strings to produce bad results - Fix a bug that caused NdisParameterMultiString values to be written to the registry incorrectly svn path=/trunk/; revision=41522 --- reactos/drivers/network/ndis/ndis/config.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c index 297aac6cf3c..02eabd35a5b 100644 --- a/reactos/drivers/network/ndis/ndis/config.c +++ b/reactos/drivers/network/ndis/ndis/config.c @@ -63,7 +63,7 @@ NdisWriteConfiguration( * I don't know why tho so i free everything before return. comments welcome. */ { - ULONG ParameterType = ParameterValue->ParameterType; + ULONG ParameterType; ULONG DataSize; PVOID Data; WCHAR Buff[25]; @@ -71,7 +71,7 @@ NdisWriteConfiguration( NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); /* reset parameter type to standard reg types */ - switch(ParameterType) + switch(ParameterValue->ParameterType) { case NdisParameterHexInteger: case NdisParameterInteger: @@ -85,7 +85,7 @@ NdisWriteConfiguration( ParameterType = REG_SZ; if (!NT_SUCCESS(RtlIntegerToUnicodeString( ParameterValue->ParameterData.IntegerData, - (ParameterType == NdisParameterInteger) ? 10 : 16, &Str))) + (ParameterValue->ParameterType == NdisParameterInteger) ? 10 : 16, &Str))) { *Status = NDIS_STATUS_FAILURE; return; @@ -96,7 +96,7 @@ NdisWriteConfiguration( break; case NdisParameterString: case NdisParameterMultiString: - ParameterType = REG_SZ; + ParameterType = (ParameterValue->ParameterType == NdisParameterString) ? REG_SZ : REG_MULTI_SZ; Data = ParameterValue->ParameterData.StringData.Buffer; DataSize = ParameterValue->ParameterData.StringData.Length; break; From eb4911e3e8661acfddeb5b82507ddae0b7965752 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Mon, 22 Jun 2009 04:57:21 +0000 Subject: [PATCH 023/577] =?UTF-8?q?-=20Add=20a=20directory=20for=20the=20A?= =?UTF-8?q?lternative=20ReactOS=20Memory=20Management=20Module=20(ARM?= =?UTF-8?q?=C2=B3),=20also=20called=20the=20ARM=20(port)=20Memory=20Manage?= =?UTF-8?q?r.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=41523 --- reactos/ntoskrnl/mm/ARM³/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reactos/ntoskrnl/mm/ARM³/.gitignore diff --git a/reactos/ntoskrnl/mm/ARM³/.gitignore b/reactos/ntoskrnl/mm/ARM³/.gitignore new file mode 100644 index 00000000000..e69de29bb2d From 47122e35e81ed52f9da280f8e608f9cdf64802a6 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Mon, 22 Jun 2009 06:13:23 +0000 Subject: [PATCH 024/577] - The SVN pre-commit hook is broken: /srv/svn/reactos/hooks/commit-eol-style-check.pl: `/usr/bin/svnlook proplist /srv/svn/reactos -t 41523-w6z --verbose trunk/reactos/ntoskrnl/mm/ARM?\194?\179/init.c' failed with this output: svnlook: Path 'trunk/reactos/ntoskrnl/mm/ARM?\194?\179/init.c' does not exist. svn path=/trunk/; revision=41524 --- reactos/ntoskrnl/mm/{ARM³ => ARM3}/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename reactos/ntoskrnl/mm/{ARM³ => ARM3}/.gitignore (100%) diff --git a/reactos/ntoskrnl/mm/ARM³/.gitignore b/reactos/ntoskrnl/mm/ARM3/.gitignore similarity index 100% rename from reactos/ntoskrnl/mm/ARM³/.gitignore rename to reactos/ntoskrnl/mm/ARM3/.gitignore From f2ce1cf66ff480615629c78baaacb32af597fc45 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Mon, 22 Jun 2009 06:16:57 +0000 Subject: [PATCH 025/577] =?UTF-8?q?-=20Begin=20the=20implementation=20of?= =?UTF-8?q?=20the=20ARM=20Pool=20Manager,=20a=20replacement=20for=20the=20?= =?UTF-8?q?ReactOS=20nonpaged=20pool.=20=20=20-=20Define=20the=20nonpaged?= =?UTF-8?q?=20system=20address=20space=20as=20done=20on=20Windows=20(see?= =?UTF-8?q?=20init.c=20for=20a=20brief=20introduction=20and=20source=20rea?= =?UTF-8?q?ding=20materials=20on=20this).=20=20=20-=20Size=20up=20the=20AR?= =?UTF-8?q?M=20pool=20as=20done=20on=20Windows=20(again,=20see=20init.c=20?= =?UTF-8?q?for=20documentation=20on=20this).=20=20=20-=20Create=20the=20PD?= =?UTF-8?q?Es=20for=20the=20expansion=20pool=20and=20the=20initial=20pool.?= =?UTF-8?q?=20=20=20-=20Allocate=20the=20pages=20for=20the=20initial=20poo?= =?UTF-8?q?l,=20and=20map=20them.=20=20=20=20=20-=20Unlike=20ReactOS,=20AR?= =?UTF-8?q?M=C2=B3=20does=20the=20right=20thing=20and=20uses=20physically?= =?UTF-8?q?=20continuous=20pages.=20=20=20-=20Define=20two=20new=20static?= =?UTF-8?q?=20MEMORY=5FAREAs=20for=20the=20expansion=20and=20initial=20ARM?= =?UTF-8?q?=20pool.=20=20=20-=20No=20actual=20pool=20code/implementation?= =?UTF-8?q?=20is=20available=20yet,=20we=20are=20just=20slicing=20up=20the?= =?UTF-8?q?=20address=20space=20for=20now=20(mhmm...=20cake!)*.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * There is no cake. svn path=/trunk/; revision=41525 --- reactos/ntoskrnl/include/internal/mm.h | 2 +- reactos/ntoskrnl/mm/ARM3/init.c | 373 +++++++++++++++++++++++ reactos/ntoskrnl/mm/ARM3/miarm.h | 15 + reactos/ntoskrnl/mm/mminit.c | 10 + reactos/ntoskrnl/ntoskrnl-generic.rbuild | 3 + 5 files changed, 402 insertions(+), 1 deletion(-) create mode 100644 reactos/ntoskrnl/mm/ARM3/init.c create mode 100644 reactos/ntoskrnl/mm/ARM3/miarm.h diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 91552e71030..04d2aaa33b9 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -29,7 +29,7 @@ struct _MM_PAGEOP; typedef ULONG SWAPENTRY; typedef ULONG PFN_TYPE, *PPFN_TYPE; -#define MI_STATIC_MEMORY_AREAS (6) +#define MI_STATIC_MEMORY_AREAS (8) #define MEMORY_AREA_INVALID (0) #define MEMORY_AREA_SECTION_VIEW (1) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c new file mode 100644 index 00000000000..b113b5d7e7d --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -0,0 +1,373 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/init.c + * PURPOSE: ARM Memory Manager Initialization + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::INIT" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +// +// These are all registry-configurable, but by default, the memory manager will +// figure out the most appropriate values. +// +ULONG MmMaximumNonPagedPoolPercent; +ULONG MmSizeOfNonPagedPoolInBytes; +ULONG MmMaximumNonPagedPoolInBytes; + +// +// These numbers describe the discrete equation components of the nonpaged +// pool sizing algorithm. +// +// They are described on http://support.microsoft.com/default.aspx/kb/126402/ja +// along with the algorithm that uses them, which is implemented later below. +// +ULONG MmMinimumNonPagedPoolSize = 256 * 1024; +ULONG MmMinAdditionNonPagedPoolPerMb = 32 * 1024; +ULONG MmDefaultMaximumNonPagedPool = 1024 * 1024; +ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; + +// +// The memory layout (and especially variable names) of the NT kernel mode +// components can be a bit hard to twig, especially when it comes to the non +// paged area. +// +// There are really two components to the non-paged pool: +// +// - The initial nonpaged pool, sized dynamically up to a maximum. +// - The expansion nonpaged pool, sized dynamically up to a maximum. +// +// The initial nonpaged pool is physically continuous for performance, and +// immediately follows the PFN database, typically sharing the same PDE. It is +// a very small resource (32MB on a 1GB system), and capped at 128MB. +// +// Right now, we call this the "ARM Pool" and it begins at 0xA0000000 since we +// don't want to interefere with the ReactOS memory manager PFN database (yet). +// +// The expansion nonpaged pool, on the other hand, can grow much bigger (400MB +// for a 1GB system). On ARM³ however, it is currently capped at 128MB. +// +// The address where the initial nonpaged pool starts is aptly named +// MmNonPagedPoolStart, and it describes a range of MmSizeOfNonPagedPoolInBytes +// bytes. +// +// Expansion nonpaged pool starts at an address described by the variable called +// MmNonPagedPoolExpansionStart, and it goes on for MmMaximumNonPagedPoolInBytes +// minus MmSizeOfNonPagedPoolInBytes bytes, always reaching MmNonPagedPoolEnd +// (because of the way it's calculated) at 0xFFBE0000. +// +// Initial nonpaged pool is allocated and mapped early-on during boot, but what +// about the expansion nonpaged pool? It is instead composed of special pages +// which belong to what are called System PTEs. These PTEs are the matter of a +// later discussion, but they are also considered part of the "nonpaged" OS, due +// to the fact that they are never paged out -- once an address is described by +// a System PTE, it is always valid, until the System PTE is torn down. +// +// System PTEs are actually composed of two "spaces", the system space proper, +// and the nonpaged pool expansion space. The latter, as we've already seen, +// begins at MmNonPagedPoolExpansionStart. Based on the number of System PTEs +// that the system will support, the remaining address space below this address +// is used to hold the system space PTEs. This address, in turn, is held in the +// variable named MmNonPagedSystemStart, which itself is never allowed to go +// below 0xEB000000 (thus creating an upper bound on the number of System PTEs). +// +// This means that 330MB are reserved for total nonpaged system VA, on top of +// whatever the initial nonpaged pool allocation is. +// +// The following URLs, valid as of April 23rd, 2008, support this evidence: +// +// http://www.cs.miami.edu/~burt/journal/NT/memory.html +// http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/ +// +PVOID MmNonPagedSystemStart; +PVOID MmNonPagedPoolStart; +PVOID MmNonPagedPoolExpansionStart; +PVOID MmNonPagedPoolEnd = (PVOID)0xFFBE0000; + +/* PRIVATE FUNCTIONS **********************************************************/ + +NTSTATUS +NTAPI +MmArmInitSystem(IN ULONG Phase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PMEMORY_AREA MArea; + PHYSICAL_ADDRESS BoundaryAddressMultiple, Low, High; + PFN_NUMBER PageFrameIndex; + PMMPTE StartPde, EndPde, PointerPte, LastPte; + MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte; + PVOID NonPagedPoolExpansionVa, BaseAddress; + NTSTATUS Status; + BoundaryAddressMultiple.QuadPart = Low.QuadPart = 0; + High.QuadPart = -1; + + if (Phase == 0) + { + // + // Check if this is a machine with less than 256MB of RAM, and no overide + // + if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) && + !(MmSizeOfNonPagedPoolInBytes)) + { + // + // Force the non paged pool to be 2MB so we can reduce RAM usage + // + MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024; + } + + // + // Check if the user gave a ridicuously large nonpaged pool RAM size + // + if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) > + (MmNumberOfPhysicalPages * 7 / 8)) + { + // + // More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! + // + MmSizeOfNonPagedPoolInBytes = 0; + } + + // + // Check if no registry setting was set, or if the setting was too low + // + if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize) + { + // + // Start with the minimum (256 KB) and add 32 KB for each MB above 4 + // + MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize; + MmSizeOfNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / + 256 * MmMinAdditionNonPagedPoolPerMb; + } + + // + // Check if the registy setting or our dynamic calculation was too high + // + if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE) + { + // + // Set it to the maximum + // + MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE; + } + + // + // Check if a percentage cap was set through the registry + // + if (MmMaximumNonPagedPoolPercent) + { + // + // Don't feel like supporting this right now + // + UNIMPLEMENTED; + } + + // + // Page-align the nonpaged pool size + // + MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); + + // + // Now, check if there was a registry size for the maximum size + // + if (!MmMaximumNonPagedPoolInBytes) + { + // + // Start with the default (1MB) and add 400 KB for each MB above 4 + // + MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool; + MmMaximumNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / + 256 * MmMaxAdditionNonPagedPoolPerMb; + } + + // + // Don't let the maximum go too high + // + if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) + { + // + // Set it to the upper limit + // + MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE; + } + + // + // Now calculate the nonpaged pool expansion VA region + // + MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - + MmMaximumNonPagedPoolInBytes + + MmSizeOfNonPagedPoolInBytes); + MmNonPagedPoolStart = (PVOID)PAGE_ALIGN(MmNonPagedPoolStart); + NonPagedPoolExpansionVa = MmNonPagedPoolStart; + DPRINT1("NP Pool has been tuned to: %d bytes and %d bytes\n", + MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes); + DPRINT1("NP Expansion VA begins at: %p and ends at: %p\n", + MmNonPagedPoolStart, MmNonPagedPoolEnd); + + // + // Now calculate the nonpaged system VA region + // This includes nonpaged pool expansion (above) and the system PTEs + // Since there are no system PTEs yet, this is (for now) the same + // + MmNonPagedSystemStart = MmNonPagedPoolStart; + DPRINT1("NP System VA (later will be System PTEs) start at: %p\n", + MmNonPagedSystemStart); + + // + // Non paged pool should come after the PFN database, but since we are + // co-existing with the ReactOS NP pool, our "ARM Pool" will instead + // start at this arbitrarly chosen base address. + // When ARM pool becomes non paged pool, this needs to be changed. + // + MmNonPagedPoolStart = (PVOID)0xA0000000; + DPRINT1("NP VA begins at: %p and ends at: %p\n", + MmNonPagedPoolStart, + (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes); + + // + // Now we actually need to get these many physical pages. Nonpaged pool + // is actually also physically contiguous (but not the expansion) + // + PageFrameIndex = MmGetContinuousPages(MmSizeOfNonPagedPoolInBytes, + Low, + High, + BoundaryAddressMultiple); + ASSERT(PageFrameIndex != 0); + DPRINT1("NP PA PFN begins at: %lx\n", PageFrameIndex); + + // + // Now we need some pages to create the page tables for the NP system VA + // which would normally include system PTEs and expansion NP + // + StartPde = MiAddressToPde(MmNonPagedSystemStart); + EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); + while (StartPde <= EndPde) + { + // + // Sanity check + // + ASSERT(StartPde->u.Hard.Valid == 0); + + // + // Get a page + // + TempPde.u.Hard.PageFrameNumber = MmAllocPage(MC_SYSTEM, 0); + ASSERT(TempPde.u.Hard.Valid == 1); + *StartPde = TempPde; + + // + // Zero out the page table + // + PointerPte = MiPteToAddress(StartPde); + RtlZeroMemory(PointerPte, PAGE_SIZE); + + // + // Next + // + StartPde++; + } + + // + // Now we need pages for the page tables which will map initial NP + // + StartPde = MiAddressToPde(MmNonPagedPoolStart); + EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes - 1)); + while (StartPde <= EndPde) + { + // + // Sanity check + // + ASSERT(StartPde->u.Hard.Valid == 0); + + // + // Get a page + // + TempPde.u.Hard.PageFrameNumber = MmAllocPage(MC_SYSTEM, 0); + ASSERT(TempPde.u.Hard.Valid == 1); + *StartPde = TempPde; + + // + // Zero out the page table + // + PointerPte = MiPteToAddress(StartPde); + RtlZeroMemory(PointerPte, PAGE_SIZE); + + // + // Next + // + StartPde++; + } + + // + // Now rememeber where the expansion starts + // + MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa; + + // + // Last step is to actually map the nonpaged pool + // + PointerPte = MiAddressToPte(MmNonPagedPoolStart); + LastPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes - 1)); + while (PointerPte <= LastPte) + { + // + // Use one of our contigous pages + // + TempPte.u.Hard.PageFrameNumber = PageFrameIndex++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte++ = TempPte; + } + + // + // ReactOS requires a memory area to keep the initial NP area off-bounds + // + BaseAddress = MmNonPagedPoolStart; + Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC, + &BaseAddress, + MmSizeOfNonPagedPoolInBytes, + PAGE_READWRITE, + &MArea, + TRUE, + 0, + BoundaryAddressMultiple); + ASSERT(Status == STATUS_SUCCESS); + + // + // And we need one more for the system NP (expansion NP only for now) + // + BaseAddress = MmNonPagedSystemStart; + Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), + MEMORY_AREA_SYSTEM | MEMORY_AREA_STATIC, + &BaseAddress, + (ULONG_PTR)MmNonPagedPoolEnd - + (ULONG_PTR)MmNonPagedSystemStart, + PAGE_READWRITE, + &MArea, + TRUE, + 0, + BoundaryAddressMultiple); + ASSERT(Status == STATUS_SUCCESS); + } + + // + // Always return success for now + // + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h new file mode 100644 index 00000000000..7011adfee2e --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -0,0 +1,15 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/miarm.h + * PURPOSE: ARM Memory Manager Header + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +#define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT) +#define MI_MAX_INIT_NONPAGED_POOL_SIZE (128 * 1024 * 1024) +#define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024) + +extern MMPTE HyperTemplatePte; + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 67fc1c25c15..960e056637e 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -289,6 +289,11 @@ VOID NTAPI MiInitHyperSpace(VOID); +NTSTATUS +NTAPI +MmArmInitSystem(IN ULONG Phase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock); + VOID INIT_FUNCTION NTAPI @@ -379,6 +384,11 @@ MmInit1(VOID) /* Unmap low memory */ MmDeletePageTable(NULL, 0); + // + // Initialize ARM³ + // + MmArmInitSystem(0, KeLoaderBlock); + /* Initialize nonpaged pool */ MiInitializeNonPagedPool(); diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index c1cbe6887ab..78d6e5dd15b 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -359,6 +359,9 @@ page.c + + init.c + anonmem.c balance.c cont.c From 773786eb4c9f2c63e7c01b6ffa5bfd634a876ee1 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 22 Jun 2009 06:45:21 +0000 Subject: [PATCH 026/577] - Revert wininet back to pre-41059 - Fixes random corruption of downloads svn path=/trunk/; revision=41526 --- reactos/dll/win32/wininet/cookie.c | 182 +-- reactos/dll/win32/wininet/dialogs.c | 4 - reactos/dll/win32/wininet/ftp.c | 441 +++---- reactos/dll/win32/wininet/http.c | 1293 +++++++++------------ reactos/dll/win32/wininet/internet.c | 211 +--- reactos/dll/win32/wininet/internet.h | 40 +- reactos/dll/win32/wininet/netconnection.c | 185 ++- reactos/dll/win32/wininet/urlcache.c | 32 +- reactos/dll/win32/wininet/utility.c | 37 +- reactos/dll/win32/wininet/wininet.rbuild | 1 - reactos/dll/win32/wininet/wininet.spec | 12 +- 11 files changed, 979 insertions(+), 1459 deletions(-) diff --git a/reactos/dll/win32/wininet/cookie.c b/reactos/dll/win32/wininet/cookie.c index dc77b17265b..12d841bc7b9 100644 --- a/reactos/dll/win32/wininet/cookie.c +++ b/reactos/dll/win32/wininet/cookie.c @@ -23,10 +23,6 @@ #include "config.h" #include "wine/port.h" -#if defined(__MINGW32__) || defined (_MSC_VER) -#include -#endif - #include #include #include @@ -52,6 +48,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet); * Cookies are currently memory only. * Cookies are NOT THREAD SAFE * Cookies could use A LOT OF MEMORY. We need some kind of memory management here! + * Cookies should care about the expiry time */ typedef struct _cookie_domain cookie_domain; @@ -65,7 +62,7 @@ struct _cookie LPWSTR lpCookieName; LPWSTR lpCookieData; - FILETIME expiry; + time_t expiry; /* FIXME: not used */ }; struct _cookie_domain @@ -79,7 +76,7 @@ struct _cookie_domain static struct list domain_list = LIST_INIT(domain_list); -static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name, LPCWSTR data, FILETIME expiry); +static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name, LPCWSTR data); static cookie *COOKIE_findCookie(cookie_domain *domain, LPCWSTR lpszCookieName); static void COOKIE_deleteCookie(cookie *deadCookie, BOOL deleteDomain); static cookie_domain *COOKIE_addDomain(LPCWSTR domain, LPCWSTR path); @@ -87,14 +84,13 @@ static void COOKIE_deleteDomain(cookie_domain *deadDomain); /* adds a cookie to the domain */ -static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name, LPCWSTR data, FILETIME expiry) +static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name, LPCWSTR data) { cookie *newCookie = HeapAlloc(GetProcessHeap(), 0, sizeof(cookie)); list_init(&newCookie->entry); newCookie->lpCookieName = NULL; newCookie->lpCookieData = NULL; - newCookie->expiry = expiry; if (name) { @@ -181,7 +177,6 @@ static cookie_domain *COOKIE_addDomain(LPCWSTR domain, LPCWSTR path) static BOOL COOKIE_crackUrlSimple(LPCWSTR lpszUrl, LPWSTR hostName, int hostNameLen, LPWSTR path, int pathLen) { URL_COMPONENTSW UrlComponents; - BOOL rc; UrlComponents.lpszExtraInfo = NULL; UrlComponents.lpszPassword = NULL; @@ -196,22 +191,7 @@ static BOOL COOKIE_crackUrlSimple(LPCWSTR lpszUrl, LPWSTR hostName, int hostName UrlComponents.dwHostNameLength = hostNameLen; UrlComponents.dwUrlPathLength = pathLen; - rc = InternetCrackUrlW(lpszUrl, 0, 0, &UrlComponents); - - /* discard the webpage off the end of the path */ - if (pathLen > 0 && path[pathLen-1] != '/') - { - LPWSTR ptr; - ptr = strrchrW(path,'/'); - if (ptr) - *(++ptr) = 0; - else - { - path[0] = '/'; - path[1] = 0; - } - } - return rc; + return InternetCrackUrlW(lpszUrl, 0, 0, &UrlComponents); } /* match a domain. domain must match if the domain is not NULL. path must match if the path is not NULL */ @@ -235,22 +215,11 @@ static BOOL COOKIE_matchDomain(LPCWSTR lpszCookieDomain, LPCWSTR lpszCookiePath, } if (lpszCookiePath) { - INT len; TRACE("comparing paths: %s with %s\n", debugstr_w(lpszCookiePath), debugstr_w(searchDomain->lpCookiePath)); - /* paths match at the beginning. so a path of /foo would match - * /foobar and /foo/bar - */ if (!searchDomain->lpCookiePath) return FALSE; - if (allow_partial) - { - len = lstrlenW(searchDomain->lpCookiePath); - if (strncmpiW(searchDomain->lpCookiePath, lpszCookiePath, len)!=0) - return FALSE; - } - else if (strcmpW(lpszCookiePath, searchDomain->lpCookiePath)) + if (strcmpW(lpszCookiePath, searchDomain->lpCookiePath)) return FALSE; - } return TRUE; } @@ -293,7 +262,6 @@ BOOL WINAPI InternetGetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName, struct list * cursor; unsigned int cnt = 0, domain_count = 0, cookie_count = 0; WCHAR hostName[2048], path[2048]; - FILETIME tm; TRACE("(%s, %s, %p, %p)\n", debugstr_w(lpszUrl),debugstr_w(lpszCookieName), lpCookieData, lpdwSize); @@ -308,12 +276,10 @@ BOOL WINAPI InternetGetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName, ret = COOKIE_crackUrlSimple(lpszUrl, hostName, sizeof(hostName)/sizeof(hostName[0]), path, sizeof(path)/sizeof(path[0])); if (!ret || !hostName[0]) return FALSE; - GetSystemTimeAsFileTime(&tm); - LIST_FOR_EACH(cursor, &domain_list) { cookie_domain *cookiesDomain = LIST_ENTRY(cursor, cookie_domain, entry); - if (COOKIE_matchDomain(hostName, path, cookiesDomain, TRUE)) + if (COOKIE_matchDomain(hostName, NULL /* FIXME: path */, cookiesDomain, TRUE)) { struct list * cursor; domain_count++; @@ -322,14 +288,6 @@ BOOL WINAPI InternetGetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName, LIST_FOR_EACH(cursor, &cookiesDomain->cookie_list) { cookie *thisCookie = LIST_ENTRY(cursor, cookie, entry); - /* check for expiry */ - if ((thisCookie->expiry.dwLowDateTime != 0 || thisCookie->expiry.dwHighDateTime != 0) && CompareFileTime(&tm,&thisCookie->expiry) > 0) - { - TRACE("Found expired cookie. deleting\n"); - COOKIE_deleteCookie(thisCookie, FALSE); - continue; - } - if (lpCookieData == NULL) /* return the size of the buffer required to lpdwSize */ { unsigned int len; @@ -447,116 +405,27 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST cookie_domain *thisCookieDomain = NULL; cookie *thisCookie; struct list *cursor; - LPWSTR data, value; - WCHAR *ptr; - FILETIME expiry; - BOOL expired = FALSE; - - value = data = HeapAlloc(GetProcessHeap(), 0, (strlenW(cookie_data) + 1) * sizeof(WCHAR)); - strcpyW(data,cookie_data); - memset(&expiry,0,sizeof(expiry)); - - /* lots of information can be parsed out of the cookie value */ - - ptr = data; - for (;;) - { - static const WCHAR szDomain[] = {'d','o','m','a','i','n','=',0}; - static const WCHAR szPath[] = {'p','a','t','h','=',0}; - static const WCHAR szExpires[] = {'e','x','p','i','r','e','s','=',0}; - static const WCHAR szSecure[] = {'s','e','c','u','r','e',0}; - static const WCHAR szHttpOnly[] = {'h','t','t','p','o','n','l','y',0}; - - if (!(ptr = strchrW(ptr,';'))) break; - *ptr++ = 0; - - value = HeapAlloc(GetProcessHeap(), 0, (ptr - data) * sizeof(WCHAR)); - strcpyW(value, data); - - while (*ptr == ' ') ptr++; /* whitespace */ - - if (strncmpiW(ptr, szDomain, 7) == 0) - { - ptr+=strlenW(szDomain); - domain = ptr; - TRACE("Parsing new domain %s\n",debugstr_w(domain)); - } - else if (strncmpiW(ptr, szPath, 5) == 0) - { - ptr+=strlenW(szPath); - path = ptr; - TRACE("Parsing new path %s\n",debugstr_w(path)); - } - else if (strncmpiW(ptr, szExpires, 8) == 0) - { - FILETIME ft; - SYSTEMTIME st; - FIXME("persistent cookies not handled (%s)\n",debugstr_w(ptr)); - ptr+=strlenW(szExpires); - if (InternetTimeToSystemTimeW(ptr, &st, 0)) - { - SystemTimeToFileTime(&st, &expiry); - GetSystemTimeAsFileTime(&ft); - - if (CompareFileTime(&ft,&expiry) > 0) - { - TRACE("Cookie already expired.\n"); - expired = TRUE; - } - } - } - else if (strncmpiW(ptr, szSecure, 6) == 0) - { - FIXME("secure not handled (%s)\n",debugstr_w(ptr)); - ptr += strlenW(szSecure); - } - else if (strncmpiW(ptr, szHttpOnly, 8) == 0) - { - FIXME("httponly not handled (%s)\n",debugstr_w(ptr)); - ptr += strlenW(szHttpOnly); - } - else if (*ptr) - { - FIXME("Unknown additional option %s\n",debugstr_w(ptr)); - break; - } - } LIST_FOR_EACH(cursor, &domain_list) { thisCookieDomain = LIST_ENTRY(cursor, cookie_domain, entry); - if (COOKIE_matchDomain(domain, path, thisCookieDomain, FALSE)) + if (COOKIE_matchDomain(domain, NULL /* FIXME: path */, thisCookieDomain, FALSE)) break; thisCookieDomain = NULL; } if (!thisCookieDomain) - { - if (!expired) - thisCookieDomain = COOKIE_addDomain(domain, path); - else - { - HeapFree(GetProcessHeap(),0,data); - if (value != data) HeapFree(GetProcessHeap(), 0, value); - return TRUE; - } - } + thisCookieDomain = COOKIE_addDomain(domain, path); if ((thisCookie = COOKIE_findCookie(thisCookieDomain, cookie_name))) COOKIE_deleteCookie(thisCookie, FALSE); - TRACE("setting cookie %s=%s for domain %s path %s\n", debugstr_w(cookie_name), - debugstr_w(value), debugstr_w(thisCookieDomain->lpCookieDomain),debugstr_w(thisCookieDomain->lpCookiePath)); + TRACE("setting cookie %s=%s for domain %s\n", debugstr_w(cookie_name), + debugstr_w(cookie_data), debugstr_w(thisCookieDomain->lpCookieDomain)); - if (!expired && !COOKIE_addCookie(thisCookieDomain, cookie_name, value, expiry)) - { - HeapFree(GetProcessHeap(),0,data); - if (value != data) HeapFree(GetProcessHeap(), 0, value); + if (!COOKIE_addCookie(thisCookieDomain, cookie_name, cookie_data)) return FALSE; - } - HeapFree(GetProcessHeap(),0,data); - if (value != data) HeapFree(GetProcessHeap(), 0, value); return TRUE; } @@ -606,7 +475,7 @@ BOOL WINAPI InternetSetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName, * the cookie data in the form of name[=data]. */ if (!(data = strchrW(cookie, '='))) data = cookie + len; - else *data++ = 0; + else data++; ret = set_cookie(hostName, path, cookie, data); @@ -823,28 +692,3 @@ BOOL WINAPI InternetSetPerSiteCookieDecisionW( LPCWSTR pchHostName, DWORD dwDeci FIXME("(%s, 0x%08x) stub\n", debugstr_w(pchHostName), dwDecision); return FALSE; } - -/*********************************************************************** - * IsDomainLegalCookieDomainW (WININET.@) - */ -BOOL WINAPI IsDomainLegalCookieDomainW( LPCWSTR s1, LPCWSTR s2 ) -{ - const WCHAR *p; - - FIXME("(%s, %s)\n", debugstr_w(s1), debugstr_w(s2)); - - if (!s1 || !s2) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - if (s1[0] == '.' || !s1[0] || s2[0] == '.' || !s2[0]) - { - SetLastError(ERROR_INVALID_NAME); - return FALSE; - } - if (!(p = strchrW(s2, '.'))) return FALSE; - if (strchrW(p + 1, '.') && !strcmpW(p + 1, s1)) return TRUE; - else if (!strcmpW(s1, s2)) return TRUE; - return FALSE; -} diff --git a/reactos/dll/win32/wininet/dialogs.c b/reactos/dll/win32/wininet/dialogs.c index 41494a67509..dd5aa315a63 100644 --- a/reactos/dll/win32/wininet/dialogs.c +++ b/reactos/dll/win32/wininet/dialogs.c @@ -21,10 +21,6 @@ #include "config.h" #include "wine/port.h" -#if defined(__MINGW32__) || defined (_MSC_VER) -#include -#endif - #include #include "windef.h" diff --git a/reactos/dll/win32/wininet/ftp.c b/reactos/dll/win32/wininet/ftp.c index db0bf569ebc..cb24782fa4b 100644 --- a/reactos/dll/win32/wininet/ftp.c +++ b/reactos/dll/win32/wininet/ftp.c @@ -30,10 +30,6 @@ #include "config.h" #include "wine/port.h" -#if defined(__MINGW32__) || defined (_MSC_VER) -#include -#endif - #include #include #include @@ -46,9 +42,6 @@ #ifdef HAVE_UNISTD_H # include #endif -#ifdef HAVE_SYS_IOCTL_H -# include -#endif #include #include @@ -97,7 +90,7 @@ typedef struct BOOL bIsDirectory; LPWSTR lpszName; DWORD nSize; - SYSTEMTIME tmLastModified; + struct tm tmLastModified; unsigned short permissions; } FILEPROPERTIESW, *LPFILEPROPERTIESW; @@ -206,6 +199,8 @@ static BOOL FTP_FtpGetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPWSTR lpszC static BOOL FTP_FtpRenameFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszSrc, LPCWSTR lpszDest); static BOOL FTP_FtpRemoveDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory); static BOOL FTP_FtpDeleteFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName); +static HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName, + DWORD fdwAccess, DWORD dwFlags, DWORD_PTR dwContext); static BOOL FTP_FtpGetFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD_PTR dwContext); @@ -859,13 +854,13 @@ lend: if (hFindNext) { - iar.dwResult = (DWORD_PTR)hFindNext; + iar.dwResult = (DWORD)hFindNext; iar.dwError = ERROR_SUCCESS; SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, INTERNET_STATUS_HANDLE_CREATED, &iar, sizeof(INTERNET_ASYNC_RESULT)); } - iar.dwResult = (DWORD_PTR)hFindNext; + iar.dwResult = (DWORD)hFindNext; iar.dwError = hFindNext ? ERROR_SUCCESS : INTERNET_GetLastError(); SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar, sizeof(INTERNET_ASYNC_RESULT)); @@ -1076,6 +1071,118 @@ lend: return bSuccess; } +/*********************************************************************** + * FtpOpenFileA (WININET.@) + * + * Open a remote file for writing or reading + * + * RETURNS + * HINTERNET handle on success + * NULL on failure + * + */ +HINTERNET WINAPI FtpOpenFileA(HINTERNET hFtpSession, + LPCSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, + DWORD_PTR dwContext) +{ + LPWSTR lpwzFileName; + HINTERNET ret; + + lpwzFileName = lpszFileName?WININET_strdup_AtoW(lpszFileName):NULL; + ret = FtpOpenFileW(hFtpSession, lpwzFileName, fdwAccess, dwFlags, dwContext); + HeapFree(GetProcessHeap(), 0, lpwzFileName); + return ret; +} + + +static void AsyncFtpOpenFileProc(WORKREQUEST *workRequest) +{ + struct WORKREQ_FTPOPENFILEW const *req = &workRequest->u.FtpOpenFileW; + LPWININETFTPSESSIONW lpwfs = (LPWININETFTPSESSIONW) workRequest->hdr; + + TRACE("%p\n", lpwfs); + + FTP_FtpOpenFileW(lpwfs, req->lpszFilename, + req->dwAccess, req->dwFlags, req->dwContext); + HeapFree(GetProcessHeap(), 0, req->lpszFilename); +} + +/*********************************************************************** + * FtpOpenFileW (WININET.@) + * + * Open a remote file for writing or reading + * + * RETURNS + * HINTERNET handle on success + * NULL on failure + * + */ +HINTERNET WINAPI FtpOpenFileW(HINTERNET hFtpSession, + LPCWSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, + DWORD_PTR dwContext) +{ + LPWININETFTPSESSIONW lpwfs; + LPWININETAPPINFOW hIC = NULL; + HINTERNET r = NULL; + + TRACE("(%p,%s,0x%08x,0x%08x,0x%08lx)\n", hFtpSession, + debugstr_w(lpszFileName), fdwAccess, dwFlags, dwContext); + + lpwfs = (LPWININETFTPSESSIONW) WININET_GetObject( hFtpSession ); + if (!lpwfs) + { + INTERNET_SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + if (WH_HFTPSESSION != lpwfs->hdr.htype) + { + INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE); + goto lend; + } + + if ((!lpszFileName) || + ((fdwAccess != GENERIC_READ) && (fdwAccess != GENERIC_WRITE)) || + ((dwFlags & FTP_CONDITION_MASK) > FTP_TRANSFER_TYPE_BINARY)) + { + INTERNET_SetLastError(ERROR_INVALID_PARAMETER); + goto lend; + } + + if (lpwfs->download_in_progress != NULL) + { + INTERNET_SetLastError(ERROR_FTP_TRANSFER_IN_PROGRESS); + goto lend; + } + + hIC = lpwfs->lpAppInfo; + if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC) + { + WORKREQUEST workRequest; + struct WORKREQ_FTPOPENFILEW *req; + + workRequest.asyncproc = AsyncFtpOpenFileProc; + workRequest.hdr = WININET_AddRef( &lpwfs->hdr ); + req = &workRequest.u.FtpOpenFileW; + req->lpszFilename = WININET_strdupW(lpszFileName); + req->dwAccess = fdwAccess; + req->dwFlags = dwFlags; + req->dwContext = dwContext; + + INTERNET_AsyncCall(&workRequest); + r = NULL; + } + else + { + r = FTP_FtpOpenFileW(lpwfs, lpszFileName, fdwAccess, dwFlags, dwContext); + } + +lend: + WININET_Release( &lpwfs->hdr ); + + return r; +} + /*********************************************************************** * FTPFILE_Destroy(internal) @@ -1092,6 +1199,8 @@ static void FTPFILE_Destroy(WININETHANDLEHEADER *hdr) TRACE("\n"); + WININET_Release(&lpwh->lpFtpSession->hdr); + if (!lpwh->session_deleted) lpwfs->download_in_progress = NULL; @@ -1101,8 +1210,6 @@ static void FTPFILE_Destroy(WININETHANDLEHEADER *hdr) nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext); if (nResCode > 0 && nResCode != 226) WARN("server reports failed transfer\n"); - WININET_Release(&lpwh->lpFtpSession->hdr); - HeapFree(GetProcessHeap(), 0, lpwh); } @@ -1138,18 +1245,6 @@ static DWORD FTPFILE_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size return res>=0 ? ERROR_SUCCESS : INTERNET_ERROR_BASE; /* FIXME*/ } -static DWORD FTPFILE_ReadFileExA(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSA *buffers, - DWORD flags, DWORD_PTR context) -{ - return FTPFILE_ReadFile(hdr, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength); -} - -static DWORD FTPFILE_ReadFileExW(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSW *buffers, - DWORD flags, DWORD_PTR context) -{ - return FTPFILE_ReadFile(hdr, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength); -} - static BOOL FTPFILE_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written) { LPWININETFTPFILE lpwh = (LPWININETFTPFILE) hdr; @@ -1161,85 +1256,15 @@ static BOOL FTPFILE_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWOR return res >= 0; } -static void FTP_ReceiveRequestData(WININETFTPFILE *file, BOOL first_notif) -{ - INTERNET_ASYNC_RESULT iar; - BYTE buffer[4096]; - int available; - - TRACE("%p\n", file); - - available = recv(file->nDataSocket, buffer, sizeof(buffer), MSG_PEEK); - - if(available != -1) { - iar.dwResult = (DWORD_PTR)file->hdr.hInternet; - iar.dwError = first_notif ? 0 : available; - }else { - iar.dwResult = 0; - iar.dwError = INTERNET_GetLastError(); - } - - INTERNET_SendCallback(&file->hdr, file->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar, - sizeof(INTERNET_ASYNC_RESULT)); -} - -static void FTPFILE_AsyncQueryDataAvailableProc(WORKREQUEST *workRequest) -{ - WININETFTPFILE *file = (WININETFTPFILE*)workRequest->hdr; - - FTP_ReceiveRequestData(file, FALSE); -} - -static DWORD FTPFILE_QueryDataAvailable(WININETHANDLEHEADER *hdr, DWORD *available, DWORD flags, DWORD_PTR ctx) -{ - LPWININETFTPFILE file = (LPWININETFTPFILE) hdr; - int retval, unread = 0; - - TRACE("(%p %p %x %lx)\n", file, available, flags, ctx); - -#ifdef FIONREAD - retval = ioctlsocket(file->nDataSocket, FIONREAD, &unread); - if (!retval) - TRACE("%d bytes of queued, but unread data\n", unread); -#else - FIXME("FIONREAD not available\n"); -#endif - - *available = unread; - - if(!unread) { - BYTE byte; - - *available = 0; - - retval = recv(file->nDataSocket, &byte, 1, MSG_PEEK); - if(retval > 0) { - WORKREQUEST workRequest; - - *available = 0; - workRequest.asyncproc = FTPFILE_AsyncQueryDataAvailableProc; - workRequest.hdr = WININET_AddRef( &file->hdr ); - - INTERNET_AsyncCall(&workRequest); - - return ERROR_IO_PENDING; - } - } - - return ERROR_SUCCESS; -} - - static const HANDLEHEADERVtbl FTPFILEVtbl = { FTPFILE_Destroy, NULL, FTPFILE_QueryOption, NULL, FTPFILE_ReadFile, - FTPFILE_ReadFileExA, - FTPFILE_ReadFileExW, + NULL, FTPFILE_WriteFile, - FTPFILE_QueryDataAvailable, + NULL, NULL }; @@ -1314,20 +1339,16 @@ HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs, if (lpwh) { - iar.dwResult = (DWORD_PTR)handle; + iar.dwResult = (DWORD)handle; iar.dwError = ERROR_SUCCESS; SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, INTERNET_STATUS_HANDLE_CREATED, &iar, sizeof(INTERNET_ASYNC_RESULT)); } - if(bSuccess) { - FTP_ReceiveRequestData(lpwh, TRUE); - }else { - iar.dwResult = 0; - iar.dwError = INTERNET_GetLastError(); - SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, - &iar, sizeof(INTERNET_ASYNC_RESULT)); - } + iar.dwResult = (DWORD)bSuccess; + iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError(); + SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, + &iar, sizeof(INTERNET_ASYNC_RESULT)); } lend: @@ -1338,119 +1359,6 @@ lend: } -/*********************************************************************** - * FtpOpenFileA (WININET.@) - * - * Open a remote file for writing or reading - * - * RETURNS - * HINTERNET handle on success - * NULL on failure - * - */ -HINTERNET WINAPI FtpOpenFileA(HINTERNET hFtpSession, - LPCSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, - DWORD_PTR dwContext) -{ - LPWSTR lpwzFileName; - HINTERNET ret; - - lpwzFileName = lpszFileName?WININET_strdup_AtoW(lpszFileName):NULL; - ret = FtpOpenFileW(hFtpSession, lpwzFileName, fdwAccess, dwFlags, dwContext); - HeapFree(GetProcessHeap(), 0, lpwzFileName); - return ret; -} - - -static void AsyncFtpOpenFileProc(WORKREQUEST *workRequest) -{ - struct WORKREQ_FTPOPENFILEW const *req = &workRequest->u.FtpOpenFileW; - LPWININETFTPSESSIONW lpwfs = (LPWININETFTPSESSIONW) workRequest->hdr; - - TRACE("%p\n", lpwfs); - - FTP_FtpOpenFileW(lpwfs, req->lpszFilename, - req->dwAccess, req->dwFlags, req->dwContext); - HeapFree(GetProcessHeap(), 0, req->lpszFilename); -} - -/*********************************************************************** - * FtpOpenFileW (WININET.@) - * - * Open a remote file for writing or reading - * - * RETURNS - * HINTERNET handle on success - * NULL on failure - * - */ -HINTERNET WINAPI FtpOpenFileW(HINTERNET hFtpSession, - LPCWSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, - DWORD_PTR dwContext) -{ - LPWININETFTPSESSIONW lpwfs; - LPWININETAPPINFOW hIC = NULL; - HINTERNET r = NULL; - - TRACE("(%p,%s,0x%08x,0x%08x,0x%08lx)\n", hFtpSession, - debugstr_w(lpszFileName), fdwAccess, dwFlags, dwContext); - - lpwfs = (LPWININETFTPSESSIONW) WININET_GetObject( hFtpSession ); - if (!lpwfs) - { - INTERNET_SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - - if (WH_HFTPSESSION != lpwfs->hdr.htype) - { - INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE); - goto lend; - } - - if ((!lpszFileName) || - ((fdwAccess != GENERIC_READ) && (fdwAccess != GENERIC_WRITE)) || - ((dwFlags & FTP_CONDITION_MASK) > FTP_TRANSFER_TYPE_BINARY)) - { - INTERNET_SetLastError(ERROR_INVALID_PARAMETER); - goto lend; - } - - if (lpwfs->download_in_progress != NULL) - { - INTERNET_SetLastError(ERROR_FTP_TRANSFER_IN_PROGRESS); - goto lend; - } - - hIC = lpwfs->lpAppInfo; - if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC) - { - WORKREQUEST workRequest; - struct WORKREQ_FTPOPENFILEW *req; - - workRequest.asyncproc = AsyncFtpOpenFileProc; - workRequest.hdr = WININET_AddRef( &lpwfs->hdr ); - req = &workRequest.u.FtpOpenFileW; - req->lpszFilename = WININET_strdupW(lpszFileName); - req->dwAccess = fdwAccess; - req->dwFlags = dwFlags; - req->dwContext = dwContext; - - INTERNET_AsyncCall(&workRequest); - r = NULL; - } - else - { - r = FTP_FtpOpenFileW(lpwfs, lpszFileName, fdwAccess, dwFlags, dwContext); - } - -lend: - WININET_Release( &lpwfs->hdr ); - - return r; -} - - /*********************************************************************** * FtpGetFileA (WININET.@) * @@ -2348,7 +2256,7 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName, assert( hIC->hdr.htype == WH_HINIT ); - if ((!lpszUserName || !*lpszUserName) && lpszPassword && *lpszPassword) + if (NULL == lpszUserName && NULL != lpszPassword) { INTERNET_SetLastError(ERROR_INVALID_PARAMETER); goto lerror; @@ -2394,7 +2302,7 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName, if(hIC->lpszProxyBypass) FIXME("Proxy bypass is ignored.\n"); } - if (!lpszUserName || !strlenW(lpszUserName)) { + if ( !lpszUserName) { HKEY key; WCHAR szPassword[MAX_PATH]; DWORD len = sizeof(szPassword); @@ -2428,7 +2336,7 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName, { INTERNET_ASYNC_RESULT iar; - iar.dwResult = (DWORD_PTR)handle; + iar.dwResult = (DWORD)handle; iar.dwError = ERROR_SUCCESS; SendAsyncCallback(&hIC->hdr, dwContext, @@ -2489,6 +2397,16 @@ lerror: handle = NULL; } + if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC) + { + INTERNET_ASYNC_RESULT iar; + + iar.dwResult = bSuccess ? (DWORD_PTR)lpwfs : 0; + iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError(); + SendAsyncCallback(&hIC->hdr, dwContext, INTERNET_STATUS_REQUEST_COMPLETE, + &iar, sizeof(INTERNET_ASYNC_RESULT)); + } + return handle; } @@ -2819,7 +2737,7 @@ static BOOL FTP_InitListenSocket(LPWININETFTPSESSIONW lpwfs) lpwfs->lstnSocketAddress = lpwfs->socketAddress; /* and get the system to assign us a port */ - lpwfs->lstnSocketAddress.sin_port = htons(0); + lpwfs->lstnSocketAddress.sin_port = htons((u_short) 0); if (bind(lpwfs->lstnSocket,(struct sockaddr *) &lpwfs->lstnSocketAddress, sizeof(struct sockaddr_in)) == -1) { @@ -3302,7 +3220,7 @@ static void FTPFINDNEXT_Destroy(WININETHANDLEHEADER *hdr) HeapFree(GetProcessHeap(), 0, lpwfn); } -static DWORD FTPFINDNEXT_FindNextFileProc(WININETFTPFINDNEXTW *find, LPVOID data) +static DWORD WINAPI FTPFINDNEXT_FindNextFileProc(WININETFTPFINDNEXTW *find, LPVOID data) { WIN32_FIND_DATAW *find_data = data; DWORD res = ERROR_SUCCESS; @@ -3390,7 +3308,6 @@ static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = { NULL, NULL, NULL, - NULL, FTPFINDNEXT_FindNextFileW }; @@ -3465,7 +3382,9 @@ static BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFi if (lpafp) { - SystemTimeToFileTime( &lpafp->tmLastModified, &lpFindFileData->ftLastAccessTime ); + /* Convert 'Unix' time to Windows time */ + RtlSecondsSince1970ToTime(mktime(&lpafp->tmLastModified), + (LARGE_INTEGER *) &(lpFindFileData->ftLastAccessTime)); lpFindFileData->ftLastWriteTime = lpFindFileData->ftLastAccessTime; lpFindFileData->ftCreationTime = lpFindFileData->ftLastAccessTime; @@ -3533,12 +3452,12 @@ static BOOL FTP_ParseNextFile(INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERT lpfp->nSize = atol(pszToken); } - lpfp->tmLastModified.wSecond = 0; - lpfp->tmLastModified.wMinute = 0; - lpfp->tmLastModified.wHour = 0; - lpfp->tmLastModified.wDay = 0; - lpfp->tmLastModified.wMonth = 0; - lpfp->tmLastModified.wYear = 0; + lpfp->tmLastModified.tm_sec = 0; + lpfp->tmLastModified.tm_min = 0; + lpfp->tmLastModified.tm_hour = 0; + lpfp->tmLastModified.tm_mday = 0; + lpfp->tmLastModified.tm_mon = 0; + lpfp->tmLastModified.tm_year = 0; /* Determine month */ pszToken = strtok(NULL, szSpace); @@ -3546,31 +3465,34 @@ static BOOL FTP_ParseNextFile(INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERT if(strlen(pszToken) >= 3) { pszToken[3] = 0; if((pszTmp = StrStrIA(szMonths, pszToken))) - lpfp->tmLastModified.wMonth = ((pszTmp - szMonths) / 3)+1; + lpfp->tmLastModified.tm_mon = ((pszTmp - szMonths) / 3)+1; } /* Determine day */ pszToken = strtok(NULL, szSpace); if(!pszToken) continue; - lpfp->tmLastModified.wDay = atoi(pszToken); + lpfp->tmLastModified.tm_mday = atoi(pszToken); /* Determine time or year */ pszToken = strtok(NULL, szSpace); if(!pszToken) continue; if((pszTmp = strchr(pszToken, ':'))) { - SYSTEMTIME curr_time; + struct tm* apTM; + time_t aTime; *pszTmp = 0; pszTmp++; - lpfp->tmLastModified.wMinute = atoi(pszTmp); - lpfp->tmLastModified.wHour = atoi(pszToken); - GetLocalTime( &curr_time ); - lpfp->tmLastModified.wYear = curr_time.wYear; + lpfp->tmLastModified.tm_min = atoi(pszTmp); + lpfp->tmLastModified.tm_hour = atoi(pszToken); + time(&aTime); + apTM = localtime(&aTime); + lpfp->tmLastModified.tm_year = apTM->tm_year; } else { - lpfp->tmLastModified.wYear = atoi(pszToken); - lpfp->tmLastModified.wHour = 12; + lpfp->tmLastModified.tm_year = atoi(pszToken) - 1900; + lpfp->tmLastModified.tm_hour = 12; } - TRACE("Mod time: %02d:%02d:%02d %04d/%02d/%02d\n", - lpfp->tmLastModified.wHour, lpfp->tmLastModified.wMinute, lpfp->tmLastModified.wSecond, - lpfp->tmLastModified.wYear, lpfp->tmLastModified.wMonth, lpfp->tmLastModified.wDay); + TRACE("Mod time: %02d:%02d:%02d %02d/%02d/%02d\n", + lpfp->tmLastModified.tm_hour, lpfp->tmLastModified.tm_min, lpfp->tmLastModified.tm_sec, + (lpfp->tmLastModified.tm_year >= 100) ? lpfp->tmLastModified.tm_year - 100 : lpfp->tmLastModified.tm_year, + lpfp->tmLastModified.tm_mon, lpfp->tmLastModified.tm_mday); pszToken = strtok(NULL, szSpace); if(!pszToken) continue; @@ -3583,31 +3505,32 @@ static BOOL FTP_ParseNextFile(INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERT 05-09-03 06:02PM 12656686 2003-04-21bgm_cmd_e.rgz */ else if(isdigit(pszToken[0]) && 8 == strlen(pszToken)) { - int mon, mday, year, hour, min; lpfp->permissions = 0xFFFF; /* No idea, put full permission :-) */ - sscanf(pszToken, "%d-%d-%d", &mon, &mday, &year); - lpfp->tmLastModified.wDay = mday; - lpfp->tmLastModified.wMonth = mon; - lpfp->tmLastModified.wYear = year; + sscanf(pszToken, "%d-%d-%d", + &lpfp->tmLastModified.tm_mon, + &lpfp->tmLastModified.tm_mday, + &lpfp->tmLastModified.tm_year); /* Hacky and bad Y2K protection :-) */ - if (lpfp->tmLastModified.wYear < 70) lpfp->tmLastModified.wYear += 2000; - + if (lpfp->tmLastModified.tm_year < 70) + lpfp->tmLastModified.tm_year += 100; + pszToken = strtok(NULL, szSpace); if(!pszToken) continue; - sscanf(pszToken, "%d:%d", &hour, &min); - lpfp->tmLastModified.wHour = hour; - lpfp->tmLastModified.wMinute = min; + sscanf(pszToken, "%d:%d", + &lpfp->tmLastModified.tm_hour, + &lpfp->tmLastModified.tm_min); if((pszToken[5] == 'P') && (pszToken[6] == 'M')) { - lpfp->tmLastModified.wHour += 12; + lpfp->tmLastModified.tm_hour += 12; } - lpfp->tmLastModified.wSecond = 0; - - TRACE("Mod time: %02d:%02d:%02d %04d/%02d/%02d\n", - lpfp->tmLastModified.wHour, lpfp->tmLastModified.wMinute, lpfp->tmLastModified.wSecond, - lpfp->tmLastModified.wYear, lpfp->tmLastModified.wMonth, lpfp->tmLastModified.wDay); + lpfp->tmLastModified.tm_sec = 0; + TRACE("Mod time: %02d:%02d:%02d %02d/%02d/%02d\n", + lpfp->tmLastModified.tm_hour, lpfp->tmLastModified.tm_min, lpfp->tmLastModified.tm_sec, + (lpfp->tmLastModified.tm_year >= 100) ? lpfp->tmLastModified.tm_year - 100 : lpfp->tmLastModified.tm_year, + lpfp->tmLastModified.tm_mon, lpfp->tmLastModified.tm_mday); + pszToken = strtok(NULL, szSpace); if(!pszToken) continue; if(!strcasecmp(pszToken, "")) { diff --git a/reactos/dll/win32/wininet/http.c b/reactos/dll/win32/wininet/http.c index 6e699ff3437..f0ad6beddc1 100644 --- a/reactos/dll/win32/wininet/http.c +++ b/reactos/dll/win32/wininet/http.c @@ -29,10 +29,6 @@ #include "config.h" #include "wine/port.h" -#if defined(__MINGW32__) || defined (_MSC_VER) -#include -#endif - #include #ifdef HAVE_SYS_SOCKET_H # include @@ -63,7 +59,6 @@ #include "internet.h" #include "wine/debug.h" -#include "wine/exception.h" #include "wine/unicode.h" #include "inet_ntop.c" @@ -81,7 +76,6 @@ static const WCHAR szProxy_Authorization[] = { 'P','r','o','x','y','-','A','u',' static const WCHAR szStatus[] = { 'S','t','a','t','u','s',0 }; static const WCHAR szKeepAlive[] = {'K','e','e','p','-','A','l','i','v','e',0}; static const WCHAR szGET[] = { 'G','E','T', 0 }; -static const WCHAR szCrLf[] = {'\r','\n', 0}; #define MAXHOSTNAME 100 #define MAX_FIELD_VALUE_LEN 256 @@ -122,15 +116,15 @@ static BOOL HTTP_InsertCustomHeader(LPWININETHTTPREQW lpwhr, LPHTTPHEADERW lpHdr static INT HTTP_GetCustomHeaderIndex(LPWININETHTTPREQW lpwhr, LPCWSTR lpszField, INT index, BOOL Request); static BOOL HTTP_DeleteCustomHeader(LPWININETHTTPREQW lpwhr, DWORD index); static LPWSTR HTTP_build_req( LPCWSTR *list, int len ); -static BOOL HTTP_HttpQueryInfoW(LPWININETHTTPREQW, DWORD, LPVOID, LPDWORD, LPDWORD); -static LPWSTR HTTP_GetRedirectURL(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl); +static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD + dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD + lpdwIndex); static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl); static UINT HTTP_DecodeBase64(LPCWSTR base64, LPSTR bin); static BOOL HTTP_VerifyValidHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field); static void HTTP_DrainContent(WININETHTTPREQW *req); -static BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr); -static LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW req, LPCWSTR head) +LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW req, LPCWSTR head) { int HeaderIndex = 0; HeaderIndex = HTTP_GetCustomHeaderIndex(req, head, 0, TRUE); @@ -140,29 +134,6 @@ static LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW req, LPCWSTR head) return &req->pCustHeaders[HeaderIndex]; } -/* set the request content length based on the headers */ -static DWORD set_content_length( LPWININETHTTPREQW lpwhr ) -{ - static const WCHAR szChunked[] = {'c','h','u','n','k','e','d',0}; - WCHAR encoding[20]; - DWORD size; - - size = sizeof(lpwhr->dwContentLength); - if (!HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH, - &lpwhr->dwContentLength, &size, NULL)) - lpwhr->dwContentLength = ~0u; - - size = sizeof(encoding); - if (HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_TRANSFER_ENCODING, encoding, &size, NULL) && - !strcmpiW(encoding, szChunked)) - { - lpwhr->dwContentLength = ~0u; - lpwhr->read_chunked = TRUE; - } - - return lpwhr->dwContentLength; -} - /*********************************************************************** * HTTP_Tokenize (internal) * @@ -175,26 +146,21 @@ static LPWSTR * HTTP_Tokenize(LPCWSTR string, LPCWSTR token_string) int i; LPCWSTR next_token; - if (string) - { - /* empty string has no tokens */ - if (*string) - tokens++; - /* count tokens */ - for (i = 0; string[i]; i++) + /* empty string has no tokens */ + if (*string) + tokens++; + /* count tokens */ + for (i = 0; string[i]; i++) + if (!strncmpW(string+i, token_string, strlenW(token_string))) { - if (!strncmpW(string+i, token_string, strlenW(token_string))) - { - DWORD j; - tokens++; - /* we want to skip over separators, but not the null terminator */ - for (j = 0; j < strlenW(token_string) - 1; j++) - if (!string[i+j]) - break; - i += j; - } + DWORD j; + tokens++; + /* we want to skip over separators, but not the null terminator */ + for (j = 0; j < strlenW(token_string) - 1; j++) + if (!string[i+j]) + break; + i += j; } - } /* add 1 for terminating NULL */ token_array = HeapAlloc(GetProcessHeap(), 0, (tokens+1) * sizeof(*token_array)); @@ -292,6 +258,7 @@ static LPWSTR HTTP_BuildHeaderRequestString( LPWININETHTTPREQW lpwhr, LPCWSTR ve LPWSTR p; static const WCHAR szSpace[] = { ' ',0 }; + static const WCHAR szcrlf[] = {'\r','\n', 0}; static const WCHAR szColon[] = { ':',' ',0 }; static const WCHAR sztwocrlf[] = {'\r','\n','\r','\n', 0}; @@ -312,7 +279,7 @@ static LPWSTR HTTP_BuildHeaderRequestString( LPWININETHTTPREQW lpwhr, LPCWSTR ve { if (lpwhr->pCustHeaders[i].wFlags & HDR_ISREQUEST) { - req[n++] = szCrLf; + req[n++] = szcrlf; req[n++] = lpwhr->pCustHeaders[i].lpszField; req[n++] = szColon; req[n++] = lpwhr->pCustHeaders[i].lpszValue; @@ -346,29 +313,82 @@ static void HTTP_ProcessCookies( LPWININETHTTPREQW lpwhr ) { static const WCHAR szSet_Cookie[] = { 'S','e','t','-','C','o','o','k','i','e',0 }; int HeaderIndex; - int numCookies = 0; LPHTTPHEADERW setCookieHeader; - while((HeaderIndex = HTTP_GetCustomHeaderIndex(lpwhr, szSet_Cookie, numCookies, FALSE)) != -1) - { - setCookieHeader = &lpwhr->pCustHeaders[HeaderIndex]; + HeaderIndex = HTTP_GetCustomHeaderIndex(lpwhr, szSet_Cookie, 0, FALSE); + if (HeaderIndex == -1) + return; + setCookieHeader = &lpwhr->pCustHeaders[HeaderIndex]; - if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_COOKIES) && setCookieHeader->lpszValue) + if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_COOKIES) && setCookieHeader->lpszValue) + { + int nPosStart = 0, nPosEnd = 0, len; + static const WCHAR szFmt[] = { 'h','t','t','p',':','/','/','%','s','/',0}; + + while (setCookieHeader->lpszValue[nPosEnd] != '\0') { - int len; - static const WCHAR szFmt[] = { 'h','t','t','p',':','/','/','%','s','%','s',0}; + LPWSTR buf_cookie, cookie_name, cookie_data; LPWSTR buf_url; + LPWSTR domain = NULL; LPHTTPHEADERW Host; + int nEqualPos = 0; + while (setCookieHeader->lpszValue[nPosEnd] != ';' && setCookieHeader->lpszValue[nPosEnd] != ',' && + setCookieHeader->lpszValue[nPosEnd] != '\0') + { + nPosEnd++; + } + if (setCookieHeader->lpszValue[nPosEnd] == ';') + { + /* fixme: not case sensitive, strcasestr is gnu only */ + int nDomainPosEnd = 0; + int nDomainPosStart = 0, nDomainLength = 0; + static const WCHAR szDomain[] = {'d','o','m','a','i','n','=',0}; + LPWSTR lpszDomain = strstrW(&setCookieHeader->lpszValue[nPosEnd], szDomain); + if (lpszDomain) + { /* they have specified their own domain, lets use it */ + while (lpszDomain[nDomainPosEnd] != ';' && lpszDomain[nDomainPosEnd] != ',' && + lpszDomain[nDomainPosEnd] != '\0') + { + nDomainPosEnd++; + } + nDomainPosStart = strlenW(szDomain); + nDomainLength = (nDomainPosEnd - nDomainPosStart) + 1; + domain = HeapAlloc(GetProcessHeap(), 0, (nDomainLength + 1)*sizeof(WCHAR)); + lstrcpynW(domain, &lpszDomain[nDomainPosStart], nDomainLength + 1); + } + } + if (setCookieHeader->lpszValue[nPosEnd] == '\0') break; + buf_cookie = HeapAlloc(GetProcessHeap(), 0, ((nPosEnd - nPosStart) + 1)*sizeof(WCHAR)); + lstrcpynW(buf_cookie, &setCookieHeader->lpszValue[nPosStart], (nPosEnd - nPosStart) + 1); + TRACE("%s\n", debugstr_w(buf_cookie)); + while (buf_cookie[nEqualPos] != '=' && buf_cookie[nEqualPos] != '\0') + { + nEqualPos++; + } + if (buf_cookie[nEqualPos] == '\0' || buf_cookie[nEqualPos + 1] == '\0') + { + HeapFree(GetProcessHeap(), 0, buf_cookie); + break; + } + + cookie_name = HeapAlloc(GetProcessHeap(), 0, (nEqualPos + 1)*sizeof(WCHAR)); + lstrcpynW(cookie_name, buf_cookie, nEqualPos + 1); + cookie_data = &buf_cookie[nEqualPos + 1]; + Host = HTTP_GetHeader(lpwhr,szHost); - len = lstrlenW(Host->lpszValue) + 9 + lstrlenW(lpwhr->lpszPath); + len = lstrlenW((domain ? domain : (Host?Host->lpszValue:NULL))) + + strlenW(lpwhr->lpszPath) + 9; buf_url = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); - sprintfW(buf_url, szFmt, Host->lpszValue, lpwhr->lpszPath); - InternetSetCookieW(buf_url, NULL, setCookieHeader->lpszValue); + sprintfW(buf_url, szFmt, (domain ? domain : (Host?Host->lpszValue:NULL))); /* FIXME PATH!!! */ + InternetSetCookieW(buf_url, cookie_name, cookie_data); HeapFree(GetProcessHeap(), 0, buf_url); + HeapFree(GetProcessHeap(), 0, buf_cookie); + HeapFree(GetProcessHeap(), 0, cookie_name); + HeapFree(GetProcessHeap(), 0, domain); + nPosStart = nPosEnd; } - numCookies++; } } @@ -594,7 +614,7 @@ static BOOL HTTP_DoAuthorization( LPWININETHTTPREQW lpwhr, LPCWSTR pszAuthValue, /*********************************************************************** * HTTP_HttpAddRequestHeadersW (internal) */ -static BOOL HTTP_HttpAddRequestHeadersW(LPWININETHTTPREQW lpwhr, +static BOOL WINAPI HTTP_HttpAddRequestHeadersW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeader, DWORD dwHeaderLength, DWORD dwModifier) { LPWSTR lpszStart; @@ -636,13 +656,6 @@ static BOOL HTTP_HttpAddRequestHeadersW(LPWININETHTTPREQW lpwhr, lpszEnd += 2; /* Jump over \r\n */ } TRACE("interpreting header %s\n", debugstr_w(lpszStart)); - if (*lpszStart == '\0') - { - /* Skip 0-length headers */ - lpszStart = lpszEnd; - bSuccess = TRUE; - continue; - } pFieldAndValue = HTTP_InterpretHttpHeader(lpszStart); if (pFieldAndValue) { @@ -747,85 +760,57 @@ BOOL WINAPI HttpAddRequestHeadersA(HINTERNET hHttpRequest, BOOL WINAPI HttpEndRequestA(HINTERNET hRequest, LPINTERNET_BUFFERSA lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext) { - TRACE("(%p, %p, %08x, %08lx)\n", hRequest, lpBuffersOut, dwFlags, dwContext); + LPINTERNET_BUFFERSA ptr; + LPINTERNET_BUFFERSW lpBuffersOutW,ptrW; + BOOL rc = FALSE; - if (lpBuffersOut) + TRACE("(%p, %p, %08x, %08lx): stub\n", hRequest, lpBuffersOut, dwFlags, + dwContext); + + ptr = lpBuffersOut; + if (ptr) + lpBuffersOutW = (LPINTERNET_BUFFERSW)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(INTERNET_BUFFERSW)); + else + lpBuffersOutW = NULL; + + ptrW = lpBuffersOutW; + while (ptr) { - INTERNET_SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + if (ptr->lpvBuffer && ptr->dwBufferLength) + ptrW->lpvBuffer = HeapAlloc(GetProcessHeap(),0,ptr->dwBufferLength); + ptrW->dwBufferLength = ptr->dwBufferLength; + ptrW->dwBufferTotal= ptr->dwBufferTotal; + + if (ptr->Next) + ptrW->Next = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, + sizeof(INTERNET_BUFFERSW)); + + ptr = ptr->Next; + ptrW = ptrW->Next; } - return HttpEndRequestW(hRequest, NULL, dwFlags, dwContext); -} + rc = HttpEndRequestW(hRequest, lpBuffersOutW, dwFlags, dwContext); -static BOOL HTTP_HttpEndRequestW(LPWININETHTTPREQW lpwhr, DWORD dwFlags, DWORD_PTR dwContext) -{ - BOOL rc = FALSE; - INT responseLen; - DWORD dwBufferSize; - INTERNET_ASYNC_RESULT iar; - - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, - INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); - - responseLen = HTTP_GetResponseHeaders(lpwhr, TRUE); - if (responseLen) - rc = TRUE; - - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, - INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen, sizeof(DWORD)); - - /* process cookies here. Is this right? */ - HTTP_ProcessCookies(lpwhr); - - if (!set_content_length( lpwhr )) HTTP_FinishedReading(lpwhr); - - if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT)) + if (lpBuffersOutW) { - DWORD dwCode,dwCodeLength = sizeof(DWORD); - if (HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE, &dwCode, &dwCodeLength, NULL) && - (dwCode == 302 || dwCode == 301 || dwCode == 303)) + ptrW = lpBuffersOutW; + while (ptrW) { - WCHAR *new_url, szNewLocation[INTERNET_MAX_URL_LENGTH]; - dwBufferSize=sizeof(szNewLocation); - if (HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_LOCATION, szNewLocation, &dwBufferSize, NULL)) - { - /* redirects are always GETs */ - HeapFree(GetProcessHeap(), 0, lpwhr->lpszVerb); - lpwhr->lpszVerb = WININET_strdupW(szGET); - HTTP_DrainContent(lpwhr); - if ((new_url = HTTP_GetRedirectURL( lpwhr, szNewLocation ))) - { - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_REDIRECT, - new_url, (strlenW(new_url) + 1) * sizeof(WCHAR)); - rc = HTTP_HandleRedirect(lpwhr, new_url); - if (rc) - rc = HTTP_HttpSendRequestW(lpwhr, NULL, 0, NULL, 0, 0, TRUE); - HeapFree( GetProcessHeap(), 0, new_url ); - } - } + LPINTERNET_BUFFERSW ptrW2; + + FIXME("Do we need to translate info out of these buffer?\n"); + + HeapFree(GetProcessHeap(),0,ptrW->lpvBuffer); + ptrW2 = ptrW->Next; + HeapFree(GetProcessHeap(),0,ptrW); + ptrW = ptrW2; } } - iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet; - iar.dwError = rc ? 0 : INTERNET_GetLastError(); - - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, - INTERNET_STATUS_REQUEST_COMPLETE, &iar, - sizeof(INTERNET_ASYNC_RESULT)); return rc; } -static void AsyncHttpEndRequestProc(WORKREQUEST *work) -{ - struct WORKREQ_HTTPENDREQUESTW const *req = &work->u.HttpEndRequestW; - LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)work->hdr; - - TRACE("%p\n", lpwhr); - - HTTP_HttpEndRequestW(lpwhr, req->dwFlags, req->dwContext); -} - /*********************************************************************** * HttpEndRequestW (WININET.@) * @@ -841,15 +826,10 @@ BOOL WINAPI HttpEndRequestW(HINTERNET hRequest, { BOOL rc = FALSE; LPWININETHTTPREQW lpwhr; + INT responseLen; + DWORD dwBufferSize; TRACE("-->\n"); - - if (lpBuffersOut) - { - INTERNET_SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hRequest ); if (NULL == lpwhr || lpwhr->hdr.htype != WH_HHTTPREQ) @@ -857,27 +837,58 @@ BOOL WINAPI HttpEndRequestW(HINTERNET hRequest, INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE); if (lpwhr) WININET_Release( &lpwhr->hdr ); - return FALSE; + return FALSE; } + lpwhr->hdr.dwFlags |= dwFlags; + lpwhr->hdr.dwContext = dwContext; - if (lpwhr->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC) + /* We appear to do nothing with lpBuffersOut.. is that correct? */ + + SendAsyncCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, + INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); + + responseLen = HTTP_GetResponseHeaders(lpwhr, TRUE); + if (responseLen) + rc = TRUE; + + SendAsyncCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, + INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen, sizeof(DWORD)); + + /* process cookies here. Is this right? */ + HTTP_ProcessCookies(lpwhr); + + dwBufferSize = sizeof(lpwhr->dwContentLength); + if (!HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH, + &lpwhr->dwContentLength,&dwBufferSize,NULL)) + lpwhr->dwContentLength = -1; + + if (lpwhr->dwContentLength == 0) + HTTP_FinishedReading(lpwhr); + + if(!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT)) { - WORKREQUEST work; - struct WORKREQ_HTTPENDREQUESTW *request; - - work.asyncproc = AsyncHttpEndRequestProc; - work.hdr = WININET_AddRef( &lpwhr->hdr ); - - request = &work.u.HttpEndRequestW; - request->dwFlags = dwFlags; - request->dwContext = dwContext; - - INTERNET_AsyncCall(&work); - INTERNET_SetLastError(ERROR_IO_PENDING); + DWORD dwCode,dwCodeLength=sizeof(DWORD); + if(HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE,&dwCode,&dwCodeLength,NULL) && + (dwCode==302 || dwCode==301)) + { + WCHAR szNewLocation[INTERNET_MAX_URL_LENGTH]; + dwBufferSize=sizeof(szNewLocation); + if(HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,NULL)) + { + /* redirects are always GETs */ + HeapFree(GetProcessHeap(),0,lpwhr->lpszVerb); + lpwhr->lpszVerb = WININET_strdupW(szGET); + HTTP_DrainContent(lpwhr); + INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, + INTERNET_STATUS_REDIRECT, szNewLocation, + dwBufferSize); + rc = HTTP_HandleRedirect(lpwhr, szNewLocation); + if (rc) + rc = HTTP_HttpSendRequestW(lpwhr, NULL, 0, NULL, 0, 0, TRUE); + } + } } - else - rc = HTTP_HttpEndRequestW(lpwhr, dwFlags, dwContext); WININET_Release( &lpwhr->hdr ); TRACE("%i <--\n",rc); @@ -1006,20 +1017,12 @@ HINTERNET WINAPI HttpOpenRequestA(HINTERNET hHttpSession, types = lpszAcceptTypes; while (*types) { - __TRY + /* find out how many there are */ + if (((ULONG_PTR)*types >> 16) && **types) { - /* find out how many there are */ - if (*types && **types) - { - TRACE("accept type: %s\n", debugstr_a(*types)); - acceptTypesCount++; - } + TRACE("accept type: %s\n", debugstr_a(*types)); + acceptTypesCount++; } - __EXCEPT_PAGE_FAULT - { - WARN("invalid accept type pointer\n"); - } - __ENDTRY; types++; } szAcceptTypes = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR *) * (acceptTypesCount+1)); @@ -1029,26 +1032,20 @@ HINTERNET WINAPI HttpOpenRequestA(HINTERNET hHttpSession, types = lpszAcceptTypes; while (*types) { - __TRY + if (((ULONG_PTR)*types >> 16) && **types) { - if (*types && **types) - { - len = MultiByteToWideChar(CP_ACP, 0, *types, -1, NULL, 0 ); - szAcceptTypes[acceptTypesCount] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + len = MultiByteToWideChar(CP_ACP, 0, *types, -1, NULL, 0 ); + szAcceptTypes[acceptTypesCount] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (!szAcceptTypes[acceptTypesCount]) goto end; - MultiByteToWideChar(CP_ACP, 0, *types, -1, szAcceptTypes[acceptTypesCount], len); - acceptTypesCount++; - } + MultiByteToWideChar(CP_ACP, 0, *types, -1, szAcceptTypes[acceptTypesCount], len); + acceptTypesCount++; } - __EXCEPT_PAGE_FAULT - { - /* ignore invalid pointer */ - } - __ENDTRY; types++; } szAcceptTypes[acceptTypesCount] = NULL; } + else szAcceptTypes = 0; rc = HttpOpenRequestW(hHttpSession, szVerb, szObjectName, szVersion, szReferrer, @@ -1380,32 +1377,6 @@ static void HTTPREQ_Destroy(WININETHANDLEHEADER *hdr) WININET_Release(&lpwhr->lpHttpSession->hdr); - if (lpwhr->pAuthInfo) - { - if (SecIsValidHandle(&lpwhr->pAuthInfo->ctx)) - DeleteSecurityContext(&lpwhr->pAuthInfo->ctx); - if (SecIsValidHandle(&lpwhr->pAuthInfo->cred)) - FreeCredentialsHandle(&lpwhr->pAuthInfo->cred); - - HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo->auth_data); - HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo->scheme); - HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo); - lpwhr->pAuthInfo = NULL; - } - - if (lpwhr->pProxyAuthInfo) - { - if (SecIsValidHandle(&lpwhr->pProxyAuthInfo->ctx)) - DeleteSecurityContext(&lpwhr->pProxyAuthInfo->ctx); - if (SecIsValidHandle(&lpwhr->pProxyAuthInfo->cred)) - FreeCredentialsHandle(&lpwhr->pProxyAuthInfo->cred); - - HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo->auth_data); - HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo->scheme); - HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo); - lpwhr->pProxyAuthInfo = NULL; - } - HeapFree(GetProcessHeap(), 0, lpwhr->lpszPath); HeapFree(GetProcessHeap(), 0, lpwhr->lpszVerb); HeapFree(GetProcessHeap(), 0, lpwhr->lpszRawHeaders); @@ -1431,6 +1402,31 @@ static void HTTPREQ_CloseConnection(WININETHANDLEHEADER *hdr) if (!NETCON_connected(&lpwhr->netConnection)) return; + if (lpwhr->pAuthInfo) + { + if (SecIsValidHandle(&lpwhr->pAuthInfo->ctx)) + DeleteSecurityContext(&lpwhr->pAuthInfo->ctx); + if (SecIsValidHandle(&lpwhr->pAuthInfo->cred)) + FreeCredentialsHandle(&lpwhr->pAuthInfo->cred); + + HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo->auth_data); + HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo->scheme); + HeapFree(GetProcessHeap(), 0, lpwhr->pAuthInfo); + lpwhr->pAuthInfo = NULL; + } + if (lpwhr->pProxyAuthInfo) + { + if (SecIsValidHandle(&lpwhr->pProxyAuthInfo->ctx)) + DeleteSecurityContext(&lpwhr->pProxyAuthInfo->ctx); + if (SecIsValidHandle(&lpwhr->pProxyAuthInfo->cred)) + FreeCredentialsHandle(&lpwhr->pProxyAuthInfo->cred); + + HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo->auth_data); + HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo->scheme); + HeapFree(GetProcessHeap(), 0, lpwhr->pProxyAuthInfo); + lpwhr->pProxyAuthInfo = NULL; + } + INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_CLOSING_CONNECTION, 0, 0); @@ -1602,224 +1598,29 @@ static DWORD HTTPREQ_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buf return NETCON_set_timeout(&req->netConnection, option == INTERNET_OPTION_SEND_TIMEOUT, *(DWORD*)buffer); - - case INTERNET_OPTION_USERNAME: - HeapFree(GetProcessHeap(), 0, req->lpHttpSession->lpszUserName); - if (!(req->lpHttpSession->lpszUserName = WININET_strdupW(buffer))) return ERROR_OUTOFMEMORY; - return ERROR_SUCCESS; - - case INTERNET_OPTION_PASSWORD: - HeapFree(GetProcessHeap(), 0, req->lpHttpSession->lpszPassword); - if (!(req->lpHttpSession->lpszPassword = WININET_strdupW(buffer))) return ERROR_OUTOFMEMORY; - return ERROR_SUCCESS; } return ERROR_INTERNET_INVALID_OPTION; } -/* read some more data into the read buffer */ -static BOOL read_more_data( WININETHTTPREQW *req, int maxlen ) +static DWORD HTTP_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) { - int len; + int bytes_read; - if (req->read_size && req->read_pos) - { - /* move existing data to the start of the buffer */ - memmove( req->read_buf, req->read_buf + req->read_pos, req->read_size ); - req->read_pos = 0; - } + if(!NETCON_recv(&req->netConnection, buffer, min(size, req->dwContentLength - req->dwContentRead), + sync ? MSG_WAITALL : 0, &bytes_read)) { + if(req->dwContentLength != -1 && req->dwContentRead != req->dwContentLength) + ERR("not all data received %d/%d\n", req->dwContentRead, req->dwContentLength); - if (maxlen == -1) maxlen = sizeof(req->read_buf); - if (!NETCON_recv( &req->netConnection, req->read_buf + req->read_size, - maxlen - req->read_size, 0, &len )) return FALSE; - req->read_size += len; - return TRUE; -} - -/* remove some amount of data from the read buffer */ -static void remove_data( WININETHTTPREQW *req, int count ) -{ - if (!(req->read_size -= count)) req->read_pos = 0; - else req->read_pos += count; -} - -static BOOL read_line( WININETHTTPREQW *req, LPSTR buffer, DWORD *len ) -{ - int count, bytes_read, pos = 0; - - for (;;) - { - char *eol = memchr( req->read_buf + req->read_pos, '\n', req->read_size ); - - if (eol) - { - count = eol - (req->read_buf + req->read_pos); - bytes_read = count + 1; - } - else count = bytes_read = req->read_size; - - count = min( count, *len - pos ); - memcpy( buffer + pos, req->read_buf + req->read_pos, count ); - pos += count; - remove_data( req, bytes_read ); - if (eol) break; - - if (!read_more_data( req, -1 )) return FALSE; - if (!req->read_size) - { - *len = 0; - TRACE( "returning empty string\n" ); - return FALSE; - } - } - - if (pos < *len) - { - if (pos && buffer[pos - 1] == '\r') pos--; - *len = pos + 1; - } - buffer[*len - 1] = 0; - TRACE( "returning %s\n", debugstr_a(buffer)); - return TRUE; -} - -/* discard data contents until we reach end of line */ -static BOOL discard_eol( WININETHTTPREQW *req ) -{ - do - { - char *eol = memchr( req->read_buf + req->read_pos, '\n', req->read_size ); - if (eol) - { - remove_data( req, (eol + 1) - (req->read_buf + req->read_pos) ); - break; - } - req->read_pos = req->read_size = 0; /* discard everything */ - if (!read_more_data( req, -1 )) return FALSE; - } while (req->read_size); - return TRUE; -} - -/* read the size of the next chunk */ -static BOOL start_next_chunk( WININETHTTPREQW *req ) -{ - DWORD chunk_size = 0; - - if (!req->dwContentLength) return TRUE; - if (req->dwContentLength == req->dwContentRead) - { - /* read terminator for the previous chunk */ - if (!discard_eol( req )) return FALSE; - req->dwContentLength = ~0u; - req->dwContentRead = 0; - } - for (;;) - { - while (req->read_size) - { - char ch = req->read_buf[req->read_pos]; - if (ch >= '0' && ch <= '9') chunk_size = chunk_size * 16 + ch - '0'; - else if (ch >= 'a' && ch <= 'f') chunk_size = chunk_size * 16 + ch - 'a' + 10; - else if (ch >= 'A' && ch <= 'F') chunk_size = chunk_size * 16 + ch - 'A' + 10; - else if (ch == ';' || ch == '\r' || ch == '\n') - { - TRACE( "reading %u byte chunk\n", chunk_size ); - req->dwContentLength = chunk_size; - req->dwContentRead = 0; - if (!discard_eol( req )) return FALSE; - return TRUE; - } - remove_data( req, 1 ); - } - if (!read_more_data( req, -1 )) return FALSE; - if (!req->read_size) - { - req->dwContentLength = req->dwContentRead = 0; - return TRUE; - } - } -} - -/* return the size of data available to be read immediately */ -static DWORD get_avail_data( WININETHTTPREQW *req ) -{ - if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead)) - return 0; - return min( req->read_size, req->dwContentLength - req->dwContentRead ); -} - -/* check if we have reached the end of the data to read */ -static BOOL end_of_read_data( WININETHTTPREQW *req ) -{ - if (req->read_chunked) return (req->dwContentLength == 0); - if (req->dwContentLength == ~0u) return FALSE; - return (req->dwContentLength == req->dwContentRead); -} - -static BOOL refill_buffer( WININETHTTPREQW *req ) -{ - int len = sizeof(req->read_buf); - - if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead)) - { - if (!start_next_chunk( req )) return FALSE; - } - - if (req->dwContentLength != ~0u) len = min( len, req->dwContentLength - req->dwContentRead ); - if (len <= req->read_size) return TRUE; - - if (!read_more_data( req, len )) return FALSE; - if (!req->read_size) req->dwContentLength = req->dwContentRead = 0; - return TRUE; -} - -static void HTTP_ReceiveRequestData(WININETHTTPREQW *req, BOOL first_notif) -{ - INTERNET_ASYNC_RESULT iar; - - TRACE("%p\n", req); - - if (refill_buffer( req )) { - iar.dwResult = (DWORD_PTR)req->hdr.hInternet; - iar.dwError = first_notif ? 0 : get_avail_data(req); - }else { - iar.dwResult = 0; - iar.dwError = INTERNET_GetLastError(); - } - - INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar, - sizeof(INTERNET_ASYNC_RESULT)); -} - -static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) -{ - int len, bytes_read = 0; - - if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead)) - { - if (!start_next_chunk( req )) goto done; - } - if (req->dwContentLength != ~0u) size = min( size, req->dwContentLength - req->dwContentRead ); - - if (req->read_size) - { - bytes_read = min( req->read_size, size ); - memcpy( buffer, req->read_buf + req->read_pos, bytes_read ); - remove_data( req, bytes_read ); - } - - if (size > bytes_read && (!bytes_read || sync)) - { - if (NETCON_recv( &req->netConnection, (char *)buffer + bytes_read, size - bytes_read, - sync ? MSG_WAITALL : 0, &len)) - bytes_read += len; /* always return success, even if the network layer returns an error */ + *read = 0; + HTTP_FinishedReading(req); + return ERROR_SUCCESS; } -done: + req->dwContentRead += bytes_read; *read = bytes_read; - TRACE( "retrieved %u bytes (%u/%u)\n", bytes_read, req->dwContentRead, req->dwContentLength ); if(req->lpszCacheFile) { BOOL res; DWORD dwBytesWritten; @@ -1835,6 +1636,102 @@ done: return ERROR_SUCCESS; } +static DWORD get_chunk_size(const char *buffer) +{ + const char *p; + DWORD size = 0; + + for (p = buffer; *p; p++) + { + if (*p >= '0' && *p <= '9') size = size * 16 + *p - '0'; + else if (*p >= 'a' && *p <= 'f') size = size * 16 + *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') size = size * 16 + *p - 'A' + 10; + else if (*p == ';') break; + } + return size; +} + +static DWORD HTTP_ReadChunked(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) +{ + char reply[MAX_REPLY_LEN], *p = buffer; + DWORD buflen, to_read, to_write = size; + int bytes_read; + + *read = 0; + for (;;) + { + if (*read == size) break; + + if (req->dwContentLength == ~0UL) /* new chunk */ + { + buflen = sizeof(reply); + if (!NETCON_getNextLine(&req->netConnection, reply, &buflen)) break; + + if (!(req->dwContentLength = get_chunk_size(reply))) + { + /* zero sized chunk marks end of transfer; read any trailing headers and return */ + HTTP_GetResponseHeaders(req, FALSE); + break; + } + } + to_read = min(to_write, req->dwContentLength - req->dwContentRead); + + if (!NETCON_recv(&req->netConnection, p, to_read, sync ? MSG_WAITALL : 0, &bytes_read)) + { + if (bytes_read != to_read) + ERR("Not all data received %d/%d\n", bytes_read, to_read); + + /* always return success, even if the network layer returns an error */ + *read = 0; + break; + } + if (!bytes_read) break; + + req->dwContentRead += bytes_read; + to_write -= bytes_read; + *read += bytes_read; + + if (req->lpszCacheFile) + { + DWORD dwBytesWritten; + + if (!WriteFile(req->hCacheFile, p, bytes_read, &dwBytesWritten, NULL)) + WARN("WriteFile failed: %u\n", GetLastError()); + } + p += bytes_read; + + if (req->dwContentRead == req->dwContentLength) /* chunk complete */ + { + req->dwContentRead = 0; + req->dwContentLength = ~0UL; + + buflen = sizeof(reply); + if (!NETCON_getNextLine(&req->netConnection, reply, &buflen)) + { + ERR("Malformed chunk\n"); + *read = 0; + break; + } + } + } + if (!*read) HTTP_FinishedReading(req); + return ERROR_SUCCESS; +} + +static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) +{ + WCHAR encoding[20]; + DWORD buflen = sizeof(encoding); + static const WCHAR szChunked[] = {'c','h','u','n','k','e','d',0}; + + if (HTTP_HttpQueryInfoW(req, HTTP_QUERY_TRANSFER_ENCODING, encoding, &buflen, NULL) && + !strcmpiW(encoding, szChunked)) + { + return HTTP_ReadChunked(req, buffer, size, read, sync); + } + else + return HTTP_Read(req, buffer, size, read, sync); +} static DWORD HTTPREQ_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size, DWORD *read) { @@ -1842,7 +1739,7 @@ static DWORD HTTPREQ_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size return HTTPREQ_Read(req, buffer, size, read, TRUE); } -static void HTTPREQ_AsyncReadFileExAProc(WORKREQUEST *workRequest) +static void HTTPREQ_AsyncReadFileExProc(WORKREQUEST *workRequest) { struct WORKREQ_INTERNETREADFILEEXA const *data = &workRequest->u.InternetReadFileExA; WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr; @@ -1877,77 +1774,22 @@ static DWORD HTTPREQ_ReadFileExA(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSA *bu INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); - if ((hdr->dwFlags & INTERNET_FLAG_ASYNC) && !get_avail_data(req)) - { - WORKREQUEST workRequest; + if (hdr->dwFlags & INTERNET_FLAG_ASYNC) { + DWORD available = 0; - workRequest.asyncproc = HTTPREQ_AsyncReadFileExAProc; - workRequest.hdr = WININET_AddRef(&req->hdr); - workRequest.u.InternetReadFileExA.lpBuffersOut = buffers; + NETCON_query_data_available(&req->netConnection, &available); + if (!available) + { + WORKREQUEST workRequest; - INTERNET_AsyncCall(&workRequest); + workRequest.asyncproc = HTTPREQ_AsyncReadFileExProc; + workRequest.hdr = WININET_AddRef(&req->hdr); + workRequest.u.InternetReadFileExA.lpBuffersOut = buffers; - return ERROR_IO_PENDING; - } + INTERNET_AsyncCall(&workRequest); - res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, - !(flags & IRF_NO_WAIT)); - - if (res == ERROR_SUCCESS) { - DWORD size = buffers->dwBufferLength; - INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, - &size, sizeof(size)); - } - - return res; -} - -static void HTTPREQ_AsyncReadFileExWProc(WORKREQUEST *workRequest) -{ - struct WORKREQ_INTERNETREADFILEEXW const *data = &workRequest->u.InternetReadFileExW; - WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr; - INTERNET_ASYNC_RESULT iar; - DWORD res; - - TRACE("INTERNETREADFILEEXW %p\n", workRequest->hdr); - - res = HTTPREQ_Read(req, data->lpBuffersOut->lpvBuffer, - data->lpBuffersOut->dwBufferLength, &data->lpBuffersOut->dwBufferLength, TRUE); - - iar.dwResult = res == ERROR_SUCCESS; - iar.dwError = res; - - INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, - INTERNET_STATUS_REQUEST_COMPLETE, &iar, - sizeof(INTERNET_ASYNC_RESULT)); -} - -static DWORD HTTPREQ_ReadFileExW(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSW *buffers, - DWORD flags, DWORD_PTR context) -{ - - WININETHTTPREQW *req = (WININETHTTPREQW*)hdr; - DWORD res; - - if (flags & ~(IRF_ASYNC|IRF_NO_WAIT)) - FIXME("these dwFlags aren't implemented: 0x%x\n", flags & ~(IRF_ASYNC|IRF_NO_WAIT)); - - if (buffers->dwStructSize != sizeof(*buffers)) - return ERROR_INVALID_PARAMETER; - - INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); - - if ((hdr->dwFlags & INTERNET_FLAG_ASYNC) && !get_avail_data(req)) - { - WORKREQUEST workRequest; - - workRequest.asyncproc = HTTPREQ_AsyncReadFileExWProc; - workRequest.hdr = WININET_AddRef(&req->hdr); - workRequest.u.InternetReadFileExW.lpBuffersOut = buffers; - - INTERNET_AsyncCall(&workRequest); - - return ERROR_IO_PENDING; + return ERROR_IO_PENDING; + } } res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, @@ -1964,62 +1806,58 @@ static DWORD HTTPREQ_ReadFileExW(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSW *bu static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written) { - BOOL ret; LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)hdr; - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_SENDING_REQUEST, NULL, 0); - - *written = 0; - if ((ret = NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written))) - lpwhr->dwBytesWritten += *written; - - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_REQUEST_SENT, written, sizeof(DWORD)); - return ret; + return NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written); } static void HTTPREQ_AsyncQueryDataAvailableProc(WORKREQUEST *workRequest) { WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr; + INTERNET_ASYNC_RESULT iar; + char buffer[4048]; - HTTP_ReceiveRequestData(req, FALSE); + TRACE("%p\n", workRequest->hdr); + + iar.dwResult = NETCON_recv(&req->netConnection, buffer, + min(sizeof(buffer), req->dwContentLength - req->dwContentRead), + MSG_PEEK, (int *)&iar.dwError); + + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar, + sizeof(INTERNET_ASYNC_RESULT)); } static DWORD HTTPREQ_QueryDataAvailable(WININETHANDLEHEADER *hdr, DWORD *available, DWORD flags, DWORD_PTR ctx) { WININETHTTPREQW *req = (WININETHTTPREQW*)hdr; + BYTE buffer[4048]; + BOOL async; TRACE("(%p %p %x %lx)\n", req, available, flags, ctx); - if (!(*available = get_avail_data( req ))) + if(!NETCON_query_data_available(&req->netConnection, available) || *available) + return ERROR_SUCCESS; + + /* Even if we are in async mode, we need to determine whether + * there is actually more data available. We do this by trying + * to peek only a single byte in async mode. */ + async = (req->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC) != 0; + + if (NETCON_recv(&req->netConnection, buffer, + min(async ? 1 : sizeof(buffer), req->dwContentLength - req->dwContentRead), + MSG_PEEK, (int *)available) && async && *available) { - if (end_of_read_data( req )) return ERROR_SUCCESS; + WORKREQUEST workRequest; - if (req->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC) - { - WORKREQUEST workRequest; + *available = 0; + workRequest.asyncproc = HTTPREQ_AsyncQueryDataAvailableProc; + workRequest.hdr = WININET_AddRef( &req->hdr ); - workRequest.asyncproc = HTTPREQ_AsyncQueryDataAvailableProc; - workRequest.hdr = WININET_AddRef( &req->hdr ); + INTERNET_AsyncCall(&workRequest); - INTERNET_AsyncCall(&workRequest); - - return ERROR_IO_PENDING; - } - else - { - refill_buffer( req ); - *available = get_avail_data( req ); - } + return ERROR_IO_PENDING; } - if (*available == sizeof(req->read_buf)) /* check if we have even more pending in the socket */ - { - DWORD extra; - if (NETCON_query_data_available(&req->netConnection, &extra)) - *available = min( *available + extra, req->dwContentLength - req->dwContentRead ); - } - - TRACE( "returning %u\n", *available ); return ERROR_SUCCESS; } @@ -2030,7 +1868,6 @@ static const HANDLEHEADERVtbl HTTPREQVtbl = { HTTPREQ_SetOption, HTTPREQ_ReadFile, HTTPREQ_ReadFileExA, - HTTPREQ_ReadFileExW, HTTPREQ_WriteFile, HTTPREQ_QueryDataAvailable, NULL @@ -2076,7 +1913,6 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, lpwhr->hdr.refs = 1; lpwhr->hdr.lpfnStatusCB = lpwhs->hdr.lpfnStatusCB; lpwhr->hdr.dwInternalFlags = lpwhs->hdr.dwInternalFlags & INET_CALLBACKW; - lpwhr->dwContentLength = ~0u; WININET_AddRef( &lpwhs->hdr ); lpwhr->lpHttpSession = lpwhs; @@ -2114,7 +1950,7 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, lpwhr->lpszPath = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); rc = UrlEscapeW(lpszObjectName, lpwhr->lpszPath, &len, URL_ESCAPE_SPACES_ONLY); - if (rc != S_OK) + if (rc) { ERR("Unable to escape string!(%s) (%d)\n",debugstr_w(lpszObjectName),rc); strcpyW(lpwhr->lpszPath,lpszObjectName); @@ -2191,15 +2027,12 @@ static void HTTP_DrainContent(WININETHTTPREQW *req) if (!NETCON_connected(&req->netConnection)) return; if (req->dwContentLength == -1) - { NETCON_close(&req->netConnection); - return; - } do { char buffer[2048]; - if (HTTPREQ_Read(req, buffer, sizeof(buffer), &bytes_read, TRUE) != ERROR_SUCCESS) + if (HTTP_Read(req, buffer, sizeof(buffer), &bytes_read, TRUE) != ERROR_SUCCESS) return; } while (bytes_read); } @@ -2336,28 +2169,27 @@ static const LPCWSTR header_lookup[] = { /*********************************************************************** * HTTP_HttpQueryInfoW (internal) */ -static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, +static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex) { LPHTTPHEADERW lphttpHdr = NULL; BOOL bSuccess = FALSE; BOOL request_only = dwInfoLevel & HTTP_QUERY_FLAG_REQUEST_HEADERS; INT requested_index = lpdwIndex ? *lpdwIndex : 0; - DWORD level = (dwInfoLevel & ~HTTP_QUERY_MODIFIER_FLAGS_MASK); + INT level = (dwInfoLevel & ~HTTP_QUERY_MODIFIER_FLAGS_MASK); INT index = -1; /* Find requested header structure */ switch (level) { case HTTP_QUERY_CUSTOM: - if (!lpBuffer) return FALSE; index = HTTP_GetCustomHeaderIndex(lpwhr, lpBuffer, requested_index, request_only); break; case HTTP_QUERY_RAW_HEADERS_CRLF: { LPWSTR headers; - DWORD len = 0; + DWORD len; BOOL ret = FALSE; if (request_only) @@ -2365,24 +2197,15 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, else headers = lpwhr->lpszRawHeaders; - if (headers) - len = strlenW(headers) * sizeof(WCHAR); - - if (len + sizeof(WCHAR) > *lpdwBufferLength) + len = (strlenW(headers) + 1) * sizeof(WCHAR); + if (len > *lpdwBufferLength) { - len += sizeof(WCHAR); INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); ret = FALSE; } else if (lpBuffer) { - if (headers) - memcpy(lpBuffer, headers, len + sizeof(WCHAR)); - else - { - len = strlenW(szCrLf) * sizeof(WCHAR); - memcpy(lpBuffer, szCrLf, sizeof(szCrLf)); - } + memcpy(lpBuffer, headers, len); TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len / sizeof(WCHAR))); ret = TRUE; } @@ -2394,9 +2217,10 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, } case HTTP_QUERY_RAW_HEADERS: { + static const WCHAR szCrLf[] = {'\r','\n',0}; LPWSTR * ppszRawHeaderLines = HTTP_Tokenize(lpwhr->lpszRawHeaders, szCrLf); DWORD i, size = 0; - LPWSTR pszString = lpBuffer; + LPWSTR pszString = (WCHAR*)lpBuffer; for (i = 0; ppszRawHeaderLines[i]; i++) size += strlenW(ppszRawHeaderLines[i]) + 1; @@ -2408,17 +2232,17 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; } - if (pszString) + + for (i = 0; ppszRawHeaderLines[i]; i++) { - for (i = 0; ppszRawHeaderLines[i]; i++) - { - DWORD len = strlenW(ppszRawHeaderLines[i]); - memcpy(pszString, ppszRawHeaderLines[i], (len+1)*sizeof(WCHAR)); - pszString += len+1; - } - *pszString = '\0'; - TRACE("returning data: %s\n", debugstr_wn(lpBuffer, size)); + DWORD len = strlenW(ppszRawHeaderLines[i]); + memcpy(pszString, ppszRawHeaderLines[i], (len+1)*sizeof(WCHAR)); + pszString += len+1; } + *pszString = '\0'; + + TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, size)); + *lpdwBufferLength = size * sizeof(WCHAR); HTTP_FreeTokens(ppszRawHeaderLines); @@ -2434,12 +2258,11 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; } - if (lpBuffer) - { - memcpy(lpBuffer, lpwhr->lpszStatusText, (len + 1) * sizeof(WCHAR)); - TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len)); - } + memcpy(lpBuffer, lpwhr->lpszStatusText, (len+1)*sizeof(WCHAR)); *lpdwBufferLength = len * sizeof(WCHAR); + + TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, len)); + return TRUE; } break; @@ -2453,19 +2276,18 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; } - if (lpBuffer) - { - memcpy(lpBuffer, lpwhr->lpszVersion, (len + 1) * sizeof(WCHAR)); - TRACE("returning data: %s\n", debugstr_wn(lpBuffer, len)); - } + memcpy(lpBuffer, lpwhr->lpszVersion, (len+1)*sizeof(WCHAR)); *lpdwBufferLength = len * sizeof(WCHAR); + + TRACE("returning data: %s\n", debugstr_wn((WCHAR*)lpBuffer, len)); + return TRUE; } break; default: assert (LAST_TABLE_HEADER == (HTTP_QUERY_UNLESS_MODIFIED_SINCE + 1)); - if (level < LAST_TABLE_HEADER && header_lookup[level]) + if (level >= 0 && level < LAST_TABLE_HEADER && header_lookup[level]) index = HTTP_GetCustomHeaderIndex(lpwhr, header_lookup[level], requested_index,request_only); } @@ -2482,16 +2304,18 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, return bSuccess; } - if (lpdwIndex && level != HTTP_QUERY_STATUS_CODE) (*lpdwIndex)++; + if (lpdwIndex) + (*lpdwIndex)++; /* coalesce value to requested type */ - if (dwInfoLevel & HTTP_QUERY_FLAG_NUMBER && lpBuffer) + if (dwInfoLevel & HTTP_QUERY_FLAG_NUMBER) { - *(int *)lpBuffer = atoiW(lphttpHdr->lpszValue); - TRACE(" returning number: %d\n", *(int *)lpBuffer); - bSuccess = TRUE; + *(int *)lpBuffer = atoiW(lphttpHdr->lpszValue); + bSuccess = TRUE; + + TRACE(" returning number : %d\n", *(int *)lpBuffer); } - else if (dwInfoLevel & HTTP_QUERY_FLAG_SYSTEMTIME && lpBuffer) + else if (dwInfoLevel & HTTP_QUERY_FLAG_SYSTEMTIME) { time_t tmpTime; struct tm tmpTM; @@ -2500,20 +2324,24 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, tmpTime = ConvertTimeString(lphttpHdr->lpszValue); tmpTM = *gmtime(&tmpTime); - STHook = (SYSTEMTIME *)lpBuffer; - STHook->wDay = tmpTM.tm_mday; - STHook->wHour = tmpTM.tm_hour; - STHook->wMilliseconds = 0; - STHook->wMinute = tmpTM.tm_min; - STHook->wDayOfWeek = tmpTM.tm_wday; - STHook->wMonth = tmpTM.tm_mon + 1; - STHook->wSecond = tmpTM.tm_sec; - STHook->wYear = tmpTM.tm_year; - bSuccess = TRUE; + STHook = (SYSTEMTIME *) lpBuffer; + if(STHook==NULL) + return bSuccess; + + STHook->wDay = tmpTM.tm_mday; + STHook->wHour = tmpTM.tm_hour; + STHook->wMilliseconds = 0; + STHook->wMinute = tmpTM.tm_min; + STHook->wDayOfWeek = tmpTM.tm_wday; + STHook->wMonth = tmpTM.tm_mon + 1; + STHook->wSecond = tmpTM.tm_sec; + STHook->wYear = tmpTM.tm_year; - TRACE(" returning time: %04d/%02d/%02d - %d - %02d:%02d:%02d.%02d\n", - STHook->wYear, STHook->wMonth, STHook->wDay, STHook->wDayOfWeek, - STHook->wHour, STHook->wMinute, STHook->wSecond, STHook->wMilliseconds); + bSuccess = TRUE; + + TRACE(" returning time : %04d/%02d/%02d - %d - %02d:%02d:%02d.%02d\n", + STHook->wYear, STHook->wMonth, STHook->wDay, STHook->wDayOfWeek, + STHook->wHour, STHook->wMinute, STHook->wSecond, STHook->wMilliseconds); } else if (lphttpHdr->lpszValue) { @@ -2525,13 +2353,12 @@ static BOOL HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel, INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER); return bSuccess; } - if (lpBuffer) - { - memcpy(lpBuffer, lphttpHdr->lpszValue, len); - TRACE(" returning string: %s\n", debugstr_w(lpBuffer)); - } + + memcpy(lpBuffer, lphttpHdr->lpszValue, len); *lpdwBufferLength = len - sizeof(WCHAR); bSuccess = TRUE; + + TRACE(" returning string : %s\n", debugstr_w(lpBuffer)); } return bSuccess; } @@ -2951,13 +2778,8 @@ BOOL WINAPI HttpSendRequestW(HINTERNET hHttpRequest, LPCWSTR lpszHeaders, req = &workRequest.u.HttpSendRequestW; if (lpszHeaders) { - DWORD size; - - if (dwHeaderLength == ~0u) size = (strlenW(lpszHeaders) + 1) * sizeof(WCHAR); - else size = dwHeaderLength * sizeof(WCHAR); - - req->lpszHeader = HeapAlloc(GetProcessHeap(), 0, size); - memcpy(req->lpszHeader, lpszHeaders, size); + req->lpszHeader = HeapAlloc(GetProcessHeap(), 0, dwHeaderLength * sizeof(WCHAR)); + memcpy(req->lpszHeader, lpszHeaders, dwHeaderLength * sizeof(WCHAR)); } else req->lpszHeader = 0; @@ -3027,75 +2849,13 @@ static BOOL HTTP_GetRequestURL(WININETHTTPREQW *req, LPWSTR buf) return TRUE; } -/*********************************************************************** - * HTTP_GetRedirectURL (internal) - */ -static LPWSTR HTTP_GetRedirectURL(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) -{ - static WCHAR szHttp[] = {'h','t','t','p',0}; - static WCHAR szHttps[] = {'h','t','t','p','s',0}; - LPWININETHTTPSESSIONW lpwhs = lpwhr->lpHttpSession; - URL_COMPONENTSW urlComponents; - DWORD url_length = 0; - LPWSTR orig_url; - LPWSTR combined_url; - - if (lpszUrl[0]=='/') return WININET_strdupW( lpszUrl ); - - urlComponents.dwStructSize = sizeof(URL_COMPONENTSW); - urlComponents.lpszScheme = (lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE) ? szHttps : szHttp; - urlComponents.dwSchemeLength = 0; - urlComponents.lpszHostName = lpwhs->lpszHostName; - urlComponents.dwHostNameLength = 0; - urlComponents.nPort = lpwhs->nHostPort; - urlComponents.lpszUserName = lpwhs->lpszUserName; - urlComponents.dwUserNameLength = 0; - urlComponents.lpszPassword = NULL; - urlComponents.dwPasswordLength = 0; - urlComponents.lpszUrlPath = lpwhr->lpszPath; - urlComponents.dwUrlPathLength = 0; - urlComponents.lpszExtraInfo = NULL; - urlComponents.dwExtraInfoLength = 0; - - if (!InternetCreateUrlW(&urlComponents, 0, NULL, &url_length) && - (GetLastError() != ERROR_INSUFFICIENT_BUFFER)) - return NULL; - - orig_url = HeapAlloc(GetProcessHeap(), 0, url_length); - - /* convert from bytes to characters */ - url_length = url_length / sizeof(WCHAR) - 1; - if (!InternetCreateUrlW(&urlComponents, 0, orig_url, &url_length)) - { - HeapFree(GetProcessHeap(), 0, orig_url); - return NULL; - } - - url_length = 0; - if (!InternetCombineUrlW(orig_url, lpszUrl, NULL, &url_length, ICU_ENCODE_SPACES_ONLY) && - (GetLastError() != ERROR_INSUFFICIENT_BUFFER)) - { - HeapFree(GetProcessHeap(), 0, orig_url); - return NULL; - } - combined_url = HeapAlloc(GetProcessHeap(), 0, url_length * sizeof(WCHAR)); - - if (!InternetCombineUrlW(orig_url, lpszUrl, combined_url, &url_length, ICU_ENCODE_SPACES_ONLY)) - { - HeapFree(GetProcessHeap(), 0, orig_url); - HeapFree(GetProcessHeap(), 0, combined_url); - return NULL; - } - HeapFree(GetProcessHeap(), 0, orig_url); - return combined_url; -} - - /*********************************************************************** * HTTP_HandleRedirect (internal) */ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) { + static const WCHAR szContentType[] = {'C','o','n','t','e','n','t','-','T','y','p','e',0}; + static const WCHAR szContentLength[] = {'C','o','n','t','e','n','t','-','L','e','n','g','t','h',0}; LPWININETHTTPSESSIONW lpwhs = lpwhr->lpHttpSession; LPWININETAPPINFOW hIC = lpwhs->lpAppInfo; BOOL using_proxy = hIC->lpszProxy && hIC->lpszProxy[0]; @@ -3113,6 +2873,55 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) WCHAR protocol[32], hostName[MAXHOSTNAME], userName[1024]; static WCHAR szHttp[] = {'h','t','t','p',0}; static WCHAR szHttps[] = {'h','t','t','p','s',0}; + DWORD url_length = 0; + LPWSTR orig_url; + LPWSTR combined_url; + + urlComponents.dwStructSize = sizeof(URL_COMPONENTSW); + urlComponents.lpszScheme = (lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE) ? szHttps : szHttp; + urlComponents.dwSchemeLength = 0; + urlComponents.lpszHostName = lpwhs->lpszHostName; + urlComponents.dwHostNameLength = 0; + urlComponents.nPort = lpwhs->nHostPort; + urlComponents.lpszUserName = lpwhs->lpszUserName; + urlComponents.dwUserNameLength = 0; + urlComponents.lpszPassword = NULL; + urlComponents.dwPasswordLength = 0; + urlComponents.lpszUrlPath = lpwhr->lpszPath; + urlComponents.dwUrlPathLength = 0; + urlComponents.lpszExtraInfo = NULL; + urlComponents.dwExtraInfoLength = 0; + + if (!InternetCreateUrlW(&urlComponents, 0, NULL, &url_length) && + (GetLastError() != ERROR_INSUFFICIENT_BUFFER)) + return FALSE; + + orig_url = HeapAlloc(GetProcessHeap(), 0, url_length); + + /* convert from bytes to characters */ + url_length = url_length / sizeof(WCHAR) - 1; + if (!InternetCreateUrlW(&urlComponents, 0, orig_url, &url_length)) + { + HeapFree(GetProcessHeap(), 0, orig_url); + return FALSE; + } + + url_length = 0; + if (!InternetCombineUrlW(orig_url, lpszUrl, NULL, &url_length, ICU_ENCODE_SPACES_ONLY) && + (GetLastError() != ERROR_INSUFFICIENT_BUFFER)) + { + HeapFree(GetProcessHeap(), 0, orig_url); + return FALSE; + } + combined_url = HeapAlloc(GetProcessHeap(), 0, url_length * sizeof(WCHAR)); + + if (!InternetCombineUrlW(orig_url, lpszUrl, combined_url, &url_length, ICU_ENCODE_SPACES_ONLY)) + { + HeapFree(GetProcessHeap(), 0, orig_url); + HeapFree(GetProcessHeap(), 0, combined_url); + return FALSE; + } + HeapFree(GetProcessHeap(), 0, orig_url); userName[0] = 0; hostName[0] = 0; @@ -3131,8 +2940,13 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) urlComponents.dwUrlPathLength = 2048; urlComponents.lpszExtraInfo = NULL; urlComponents.dwExtraInfoLength = 0; - if(!InternetCrackUrlW(lpszUrl, strlenW(lpszUrl), 0, &urlComponents)) + if(!InternetCrackUrlW(combined_url, strlenW(combined_url), 0, &urlComponents)) + { + HeapFree(GetProcessHeap(), 0, combined_url); return FALSE; + } + + HeapFree(GetProcessHeap(), 0, combined_url); if (!strncmpW(szHttp, urlComponents.lpszScheme, strlenW(szHttp)) && (lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE)) @@ -3206,8 +3020,6 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) NETCON_close(&lpwhr->netConnection); if (!HTTP_ResolveName(lpwhr)) return FALSE; if (!NETCON_init(&lpwhr->netConnection, lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE)) return FALSE; - lpwhr->read_pos = lpwhr->read_size = 0; - lpwhr->read_chunked = FALSE; } } else @@ -3227,7 +3039,7 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) lpwhr->lpszPath = HeapAlloc(GetProcessHeap(), 0, needed*sizeof(WCHAR)); rc = UrlEscapeW(path, lpwhr->lpszPath, &needed, URL_ESCAPE_SPACES_ONLY); - if (rc != S_OK) + if (rc) { ERR("Unable to escape string!(%s) (%d)\n",debugstr_w(path),rc); strcpyW(lpwhr->lpszPath,path); @@ -3235,10 +3047,10 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) } /* Remove custom content-type/length headers on redirects. */ - index = HTTP_GetCustomHeaderIndex(lpwhr, szContent_Type, 0, TRUE); + index = HTTP_GetCustomHeaderIndex(lpwhr, szContentType, 0, TRUE); if (0 <= index) HTTP_DeleteCustomHeader(lpwhr, index); - index = HTTP_GetCustomHeaderIndex(lpwhr, szContent_Length, 0, TRUE); + index = HTTP_GetCustomHeaderIndex(lpwhr, szContentLength, 0, TRUE); if (0 <= index) HTTP_DeleteCustomHeader(lpwhr, index); @@ -3312,28 +3124,29 @@ static BOOL HTTP_SecureProxyConnect(LPWININETHTTPREQW lpwhr) static void HTTP_InsertCookies(LPWININETHTTPREQW lpwhr) { - static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s','%','s',0}; + static const WCHAR szUrlForm[] = {'h','t','t','p',':','/','/','%','s',0}; LPWSTR lpszCookies, lpszUrl = NULL; DWORD nCookieSize, size; LPHTTPHEADERW Host = HTTP_GetHeader(lpwhr,szHost); - size = (strlenW(Host->lpszValue) + strlenW(szUrlForm) + strlenW(lpwhr->lpszPath)) * sizeof(WCHAR); + size = (strlenW(Host->lpszValue) + strlenW(szUrlForm)) * sizeof(WCHAR); if (!(lpszUrl = HeapAlloc(GetProcessHeap(), 0, size))) return; - sprintfW( lpszUrl, szUrlForm, Host->lpszValue, lpwhr->lpszPath); + sprintfW( lpszUrl, szUrlForm, Host->lpszValue ); if (InternetGetCookieW(lpszUrl, NULL, NULL, &nCookieSize)) { int cnt = 0; static const WCHAR szCookie[] = {'C','o','o','k','i','e',':',' ',0}; + static const WCHAR szcrlf[] = {'\r','\n',0}; - size = sizeof(szCookie) + nCookieSize * sizeof(WCHAR) + sizeof(szCrLf); + size = sizeof(szCookie) + nCookieSize * sizeof(WCHAR) + sizeof(szcrlf); if ((lpszCookies = HeapAlloc(GetProcessHeap(), 0, size))) { cnt += sprintfW(lpszCookies, szCookie); InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize); - strcatW(lpszCookies, szCrLf); + strcatW(lpszCookies, szcrlf); - HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies), HTTP_ADDREQ_FLAG_REPLACE); + HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies), HTTP_ADDREQ_FLAG_ADD); HeapFree(GetProcessHeap(), 0, lpszCookies); } } @@ -3355,7 +3168,7 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, DWORD dwContentLength, BOOL bEndRequest) { INT cnt; - BOOL bSuccess = FALSE, redirected = FALSE; + BOOL bSuccess = FALSE; LPWSTR requestString = NULL; INT responseLen; BOOL loop_next; @@ -3373,11 +3186,10 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, if (!lpwhr->lpszVerb) lpwhr->lpszVerb = WININET_strdupW(szGET); - if (dwContentLength || strcmpW(lpwhr->lpszVerb, szGET)) + if (dwContentLength || !strcmpW(lpwhr->lpszVerb, szPost)) { sprintfW(contentLengthStr, szContentLength, dwContentLength); - HTTP_HttpAddRequestHeadersW(lpwhr, contentLengthStr, -1L, HTTP_ADDREQ_FLAG_REPLACE); - lpwhr->dwBytesToWrite = dwContentLength; + HTTP_HttpAddRequestHeadersW(lpwhr, contentLengthStr, -1L, HTTP_ADDREQ_FLAG_ADD_IF_NEW); } if (lpwhr->lpHttpSession->lpAppInfo->lpszAgent) { @@ -3457,7 +3269,7 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, goto lend; /* send the request as ASCII, tack on the optional data */ - if (!lpOptional || redirected) + if( !lpOptional ) dwOptionalLength = 0; len = WideCharToMultiByte( CP_ACP, 0, requestString, -1, NULL, 0, NULL, NULL ); @@ -3476,8 +3288,6 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, NETCON_send(&lpwhr->netConnection, ascii_req, len, 0, &cnt); HeapFree( GetProcessHeap(), 0, ascii_req ); - lpwhr->dwBytesWritten = dwOptionalLength; - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_REQUEST_SENT, &len, sizeof(DWORD)); @@ -3486,6 +3296,8 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, { DWORD dwBufferSize; DWORD dwStatusCode; + WCHAR encoding[20]; + static const WCHAR szChunked[] = {'c','h','u','n','k','e','d',0}; INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); @@ -3503,7 +3315,22 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, HTTP_ProcessCookies(lpwhr); - if (!set_content_length( lpwhr )) HTTP_FinishedReading(lpwhr); + dwBufferSize = sizeof(lpwhr->dwContentLength); + if (!HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH, + &lpwhr->dwContentLength,&dwBufferSize,NULL)) + lpwhr->dwContentLength = -1; + + if (lpwhr->dwContentLength == 0) + HTTP_FinishedReading(lpwhr); + + /* Correct the case where both a Content-Length and Transfer-encoding = chunked are set */ + + dwBufferSize = sizeof(encoding); + if (HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_TRANSFER_ENCODING, encoding, &dwBufferSize, NULL) && + !strcmpiW(encoding, szChunked)) + { + lpwhr->dwContentLength = -1; + } dwBufferSize = sizeof(dwStatusCode); if (!HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE, @@ -3512,29 +3339,21 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT) && bSuccess) { - WCHAR *new_url, szNewLocation[INTERNET_MAX_URL_LENGTH]; + WCHAR szNewLocation[INTERNET_MAX_URL_LENGTH]; dwBufferSize=sizeof(szNewLocation); if ((dwStatusCode==HTTP_STATUS_REDIRECT || dwStatusCode==HTTP_STATUS_MOVED) && HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,NULL)) { - /* redirects are always GETs */ - HeapFree(GetProcessHeap(), 0, lpwhr->lpszVerb); - lpwhr->lpszVerb = WININET_strdupW(szGET); - HTTP_DrainContent(lpwhr); - if ((new_url = HTTP_GetRedirectURL( lpwhr, szNewLocation ))) + INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, + INTERNET_STATUS_REDIRECT, szNewLocation, + dwBufferSize); + bSuccess = HTTP_HandleRedirect(lpwhr, szNewLocation); + if (bSuccess) { - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_REDIRECT, - new_url, (strlenW(new_url) + 1) * sizeof(WCHAR)); - bSuccess = HTTP_HandleRedirect(lpwhr, new_url); - if (bSuccess) - { - HeapFree(GetProcessHeap(), 0, requestString); - loop_next = TRUE; - } - HeapFree( GetProcessHeap(), 0, new_url ); + HeapFree(GetProcessHeap(), 0, requestString); + loop_next = TRUE; } - redirected = TRUE; } } if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTH) && bSuccess) @@ -3610,31 +3429,12 @@ lend: /* TODO: send notification for P3P header */ - if (lpwhr->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC) - { - if (bSuccess) - { - if (lpwhr->dwBytesWritten == lpwhr->dwBytesToWrite) HTTP_ReceiveRequestData(lpwhr, TRUE); - else - { - iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet; - iar.dwError = 0; + iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet; + iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError(); - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, - INTERNET_STATUS_REQUEST_COMPLETE, &iar, - sizeof(INTERNET_ASYNC_RESULT)); - } - } - else - { - iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet; - iar.dwError = INTERNET_GetLastError(); - - INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, - INTERNET_STATUS_REQUEST_COMPLETE, &iar, - sizeof(INTERNET_ASYNC_RESULT)); - } - } + INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, + INTERNET_STATUS_REQUEST_COMPLETE, &iar, + sizeof(INTERNET_ASYNC_RESULT)); TRACE("<--\n"); if (bSuccess) INTERNET_SetLastError(ERROR_SUCCESS); @@ -3679,34 +3479,11 @@ static DWORD HTTPSESSION_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, voi return INET_QueryOption(option, buffer, size, unicode); } -static DWORD HTTPSESSION_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buffer, DWORD size) -{ - WININETHTTPSESSIONW *ses = (WININETHTTPSESSIONW*)hdr; - - switch(option) { - case INTERNET_OPTION_USERNAME: - { - HeapFree(GetProcessHeap(), 0, ses->lpszUserName); - if (!(ses->lpszUserName = WININET_strdupW(buffer))) return ERROR_OUTOFMEMORY; - return ERROR_SUCCESS; - } - case INTERNET_OPTION_PASSWORD: - { - HeapFree(GetProcessHeap(), 0, ses->lpszPassword); - if (!(ses->lpszPassword = WININET_strdupW(buffer))) return ERROR_OUTOFMEMORY; - return ERROR_SUCCESS; - } - default: break; - } - - return ERROR_INTERNET_INVALID_OPTION; -} - static const HANDLEHEADERVtbl HTTPSESSIONVtbl = { HTTPSESSION_Destroy, NULL, HTTPSESSION_QueryOption, - HTTPSESSION_SetOption, + NULL, NULL, NULL, NULL, @@ -3834,7 +3611,7 @@ static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr) TRACE("-->\n"); - if (lpwhr->hdr.htype != WH_HHTTPREQ) + if (NULL == lpwhr || lpwhr->hdr.htype != WH_HHTTPREQ) { INTERNET_SetLastError(ERROR_INVALID_PARAMETER); goto lend; @@ -3893,9 +3670,6 @@ static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr) bSuccess = TRUE; lend: - lpwhr->read_pos = lpwhr->read_size = 0; - lpwhr->read_chunked = FALSE; - TRACE("%d <--\n", bSuccess); return bSuccess; } @@ -3940,6 +3714,7 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear) DWORD buflen = MAX_REPLY_LEN; BOOL bSuccess = FALSE; INT rc = 0; + static const WCHAR szCrLf[] = {'\r','\n',0}; static const WCHAR szHundred[] = {'1','0','0',0}; char bufferA[MAX_REPLY_LEN]; LPWSTR status_code, status_text; @@ -3957,12 +3732,17 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear) do { /* - * We should first receive 'HTTP/1.x nnn OK' where nnn is the status code. + * HACK peek at the buffer */ buflen = MAX_REPLY_LEN; - if (!read_line(lpwhr, bufferA, &buflen)) + NETCON_recv(&lpwhr->netConnection, buffer, buflen, MSG_PEEK, &rc); + + /* + * We should first receive 'HTTP/1.x nnn OK' where nnn is the status code. + */ + memset(buffer, 0, MAX_REPLY_LEN); + if (!NETCON_getNextLine(&lpwhr->netConnection, bufferA, &buflen)) goto lend; - rc += buflen; MultiByteToWideChar( CP_ACP, 0, bufferA, buflen, buffer, MAX_REPLY_LEN ); /* split the version from the status code */ @@ -4012,18 +3792,11 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear) do { buflen = MAX_REPLY_LEN; - if (read_line(lpwhr, bufferA, &buflen)) + if (NETCON_getNextLine(&lpwhr->netConnection, bufferA, &buflen)) { LPWSTR * pFieldAndValue; TRACE("got line %s, now interpreting\n", debugstr_a(bufferA)); - - if (!bufferA[0]) break; - if (!strchr(bufferA, ':')) - { - WARN("invalid header\n"); - continue; - } MultiByteToWideChar( CP_ACP, 0, bufferA, buflen, buffer, MAX_REPLY_LEN ); while (cchRawHeaders + buflen + strlenW(szCrLf) > cchMaxRawHeaders) @@ -4278,7 +4051,7 @@ static BOOL HTTP_ProcessHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field, LPCWSTR v * Called when all content from server has been read by client. * */ -static BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) +BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) { WCHAR szVersion[10]; WCHAR szConnectionResponse[20]; @@ -4289,9 +4062,9 @@ static BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) /* as per RFC 2068, S8.1.2.1, if the client is HTTP/1.1 then assume that * the connection is keep-alive by default */ - if (HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_VERSION, szVersion, - &dwBufferSize, NULL) && - !strcmpiW(szVersion, g_szHttp1_1)) + if (!HTTP_HttpQueryInfoW(lpwhr, HTTP_QUERY_VERSION, szVersion, + &dwBufferSize, NULL) || + strcmpiW(szVersion, g_szHttp1_1)) { keepalive = TRUE; } diff --git a/reactos/dll/win32/wininet/internet.c b/reactos/dll/win32/wininet/internet.c index aa2a6b720f0..bad795ddbd4 100644 --- a/reactos/dll/win32/wininet/internet.c +++ b/reactos/dll/win32/wininet/internet.c @@ -31,10 +31,6 @@ #define MAXHOSTNAME 100 /* from http.c */ -#if defined(__MINGW32__) || defined (_MSC_VER) -#include -#endif - #include #include #include @@ -117,7 +113,7 @@ HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info ) { num = HANDLE_CHUNK_SIZE; p = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof (*WININET_Handles)* num); + sizeof (UINT)* num); if( !p ) goto end; WININET_Handles = p; @@ -127,7 +123,7 @@ HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info ) { num = WININET_dwMaxHandles + HANDLE_CHUNK_SIZE; p = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - WININET_Handles, sizeof (*WININET_Handles)* num); + WININET_Handles, sizeof (UINT)* num); if( !p ) goto end; WININET_Handles = p; @@ -186,8 +182,7 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info ) info->vtbl->CloseConnection( info ); } /* Don't send a callback if this is a session handle created with InternetOpenUrl */ - if ((info->htype != WH_HHTTPSESSION && info->htype != WH_HFTPSESSION) - || !(info->dwInternalFlags & INET_OPENURL)) + if (info->htype != WH_HHTTPSESSION || !(info->dwInternalFlags & INET_OPENURL)) { INTERNET_SendCallback(info, info->dwContext, INTERNET_STATUS_HANDLE_CLOSING, &info->hInternet, @@ -415,11 +410,8 @@ static BOOL INTERNET_ConfigureProxy( LPWININETAPPINFOW lpwai ) TRACE("http proxy (from environment) = %s\n", debugstr_w(lpwai->lpszProxy)); enabled = 1; } - if (!enabled) - { - TRACE("Proxy is not enabled.\n"); - lpwai->dwAccessType = INTERNET_OPEN_TYPE_DIRECT; - } + if (!enabled) TRACE("Proxy is not enabled.\n"); + RegCloseKey( key ); return (enabled > 0); } @@ -467,8 +459,8 @@ static void dump_INTERNET_FLAGS(DWORD dwFlags) FE(INTERNET_FLAG_TRANSFER_BINARY) }; #undef FE - unsigned int i; - + int i; + for (i = 0; i < (sizeof(flag) / sizeof(flag[0])); i++) { if (flag[i].val & dwFlags) { TRACE(" %s", flag[i].name); @@ -551,10 +543,8 @@ static DWORD APPINFO_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *b if (ai->lpszProxyBypass) proxyBypassBytesRequired = (lstrlenW(ai->lpszProxyBypass) + 1) * sizeof(WCHAR); if (*size < sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired + proxyBypassBytesRequired) - { - *size = sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired + proxyBypassBytesRequired; - return ERROR_INSUFFICIENT_BUFFER; - } + return ERROR_INSUFFICIENT_BUFFER; + proxy = (LPWSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOW)); proxy_bypass = (LPWSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOW) + proxyBytesRequired); @@ -584,10 +574,8 @@ static DWORD APPINFO_QueryOption(WININETHANDLEHEADER *hdr, DWORD option, void *b proxyBypassBytesRequired = WideCharToMultiByte(CP_ACP, 0, ai->lpszProxyBypass, -1, NULL, 0, NULL, NULL); if (*size < sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired + proxyBypassBytesRequired) - { - *size = sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired + proxyBypassBytesRequired; return ERROR_INSUFFICIENT_BUFFER; - } + proxy = (LPSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOA)); proxy_bypass = (LPSTR)((LPBYTE)buffer + sizeof(INTERNET_PROXY_INFOA) + proxyBytesRequired); @@ -791,7 +779,7 @@ HINTERNET WINAPI InternetOpenA(LPCSTR lpszAgent, DWORD dwAccessType, BOOL WINAPI InternetGetLastResponseInfoA(LPDWORD lpdwError, LPSTR lpszBuffer, LPDWORD lpdwBufferLength) { - LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex); + LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex); TRACE("\n"); @@ -828,7 +816,7 @@ BOOL WINAPI InternetGetLastResponseInfoA(LPDWORD lpdwError, BOOL WINAPI InternetGetLastResponseInfoW(LPDWORD lpdwError, LPWSTR lpszBuffer, LPDWORD lpdwBufferLength) { - LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex); + LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex); TRACE("\n"); @@ -868,7 +856,7 @@ BOOL WINAPI InternetGetConnectedState(LPDWORD lpdwStatus, DWORD dwReserved) TRACE("(%p, 0x%08x)\n", lpdwStatus, dwReserved); if (lpdwStatus) { - WARN("always returning LAN connection.\n"); + FIXME("always returning LAN connection.\n"); *lpdwStatus = INTERNET_CONNECTION_LAN; } return TRUE; @@ -912,7 +900,7 @@ BOOL WINAPI InternetGetConnectedStateExW(LPDWORD lpdwStatus, LPWSTR lpszConnecti return FALSE; if (lpdwStatus) { - WARN("always returning LAN connection.\n"); + FIXME("always returning LAN connection.\n"); *lpdwStatus = INTERNET_CONNECTION_LAN; } return LoadStringW(WININET_hModule, IDS_LANCONNECTION, lpszConnectionName, dwNameLen); @@ -1825,8 +1813,8 @@ INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackA( INTERNET_STATUS_CALLBACK retVal; LPWININETHANDLEHEADER lpwh; - TRACE("%p\n", hInternet); - + TRACE("0x%08x\n", (ULONG)hInternet); + if (!(lpwh = WININET_GetObject(hInternet))) return INTERNET_INVALID_STATUS_CALLBACK; @@ -1853,7 +1841,7 @@ INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackW( INTERNET_STATUS_CALLBACK retVal; LPWININETHANDLEHEADER lpwh; - TRACE("%p\n", hInternet); + TRACE("0x%08x\n", (ULONG)hInternet); if (!(lpwh = WININET_GetObject(hInternet))) return INTERNET_INVALID_STATUS_CALLBACK; @@ -2006,40 +1994,33 @@ BOOL WINAPI InternetReadFileExA(HINTERNET hFile, LPINTERNET_BUFFERSA lpBuffersOu /*********************************************************************** * InternetReadFileExW (WININET.@) - * SEE - * InternetReadFileExA() + * + * Read data from an open internet file. + * + * PARAMS + * hFile [I] Handle returned by InternetOpenUrl() or HttpOpenRequest(). + * lpBuffersOut [I/O] Buffer. + * dwFlags [I] Flags. + * dwContext [I] Context for callbacks. + * + * RETURNS + * FALSE, last error is set to ERROR_CALL_NOT_IMPLEMENTED + * + * NOTES + * Not implemented in Wine or native either (as of IE6 SP2). + * */ BOOL WINAPI InternetReadFileExW(HINTERNET hFile, LPINTERNET_BUFFERSW lpBuffer, DWORD dwFlags, DWORD_PTR dwContext) { - LPWININETHANDLEHEADER hdr; - DWORD res = ERROR_INTERNET_INCORRECT_HANDLE_TYPE; + ERR("(%p, %p, 0x%x, 0x%lx): not implemented in native\n", hFile, lpBuffer, dwFlags, dwContext); - TRACE("(%p %p 0x%x 0x%lx)\n", hFile, lpBuffer, dwFlags, dwContext); - - hdr = WININET_GetObject(hFile); - if (!hdr) { - INTERNET_SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - - if(hdr->vtbl->ReadFileExW) - res = hdr->vtbl->ReadFileExW(hdr, lpBuffer, dwFlags, dwContext); - - WININET_Release(hdr); - - TRACE("-- %s (%u, bytes read: %d)\n", res == ERROR_SUCCESS ? "TRUE": "FALSE", - res, lpBuffer->dwBufferLength); - - if(res != ERROR_SUCCESS) - SetLastError(res); - return res == ERROR_SUCCESS; + INTERNET_SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; } DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode) { - static BOOL warn = TRUE; - switch(option) { case INTERNET_OPTION_REQUEST_FLAGS: TRACE("INTERNET_OPTION_REQUEST_FLAGS\n"); @@ -2066,11 +2047,8 @@ DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode) return ERROR_SUCCESS; case INTERNET_OPTION_CONNECTED_STATE: + FIXME("INTERNET_OPTION_CONNECTED_STATE: semi-stub\n"); - if (warn) { - FIXME("INTERNET_OPTION_CONNECTED_STATE: semi-stub\n"); - warn = FALSE; - } if (*size < sizeof(ULONG)) return ERROR_INSUFFICIENT_BUFFER; @@ -2155,7 +2133,8 @@ DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode) case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME: case INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL: FIXME("Unhandled dwOption %d\n", option->dwOption); - memset(&option->Value, 0, sizeof(option->Value)); + option->Value.dwValue = 0; + res = ERROR_INVALID_PARAMETER; break; default: @@ -2277,14 +2256,9 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, { case INTERNET_OPTION_CALLBACK: { - if (!lpwhh) - { - INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE); - return FALSE; - } - WININET_Release(lpwhh); - INTERNET_SetLastError(ERROR_INTERNET_OPTION_NOT_SETTABLE); - return FALSE; + INTERNET_STATUS_CALLBACK callback = *(INTERNET_STATUS_CALLBACK *)lpBuffer; + ret = (set_status_callback(lpwhh, callback, TRUE) != INTERNET_INVALID_STATUS_CALLBACK); + break; } case INTERNET_OPTION_HTTP_VERSION: { @@ -2368,35 +2342,8 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption, case INTERNET_OPTION_DISABLE_AUTODIAL: FIXME("Option INTERNET_OPTION_DISABLE_AUTODIAL; STUB\n"); break; - case INTERNET_OPTION_HTTP_DECODING: - FIXME("INTERNET_OPTION_HTTP_DECODING; STUB\n"); - INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION); - ret = FALSE; - break; - case INTERNET_OPTION_COOKIES_3RD_PARTY: - FIXME("INTERNET_OPTION_COOKIES_3RD_PARTY; STUB\n"); - INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION); - ret = FALSE; - break; - case INTERNET_OPTION_SEND_UTF8_SERVERNAME_TO_PROXY: - FIXME("INTERNET_OPTION_SEND_UTF8_SERVERNAME_TO_PROXY; STUB\n"); - INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION); - ret = FALSE; - break; - case INTERNET_OPTION_CODEPAGE_PATH: - FIXME("INTERNET_OPTION_CODEPAGE_PATH; STUB\n"); - INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION); - ret = FALSE; - break; - case INTERNET_OPTION_CODEPAGE_EXTRA: - FIXME("INTERNET_OPTION_CODEPAGE_EXTRA; STUB\n"); - INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION); - ret = FALSE; - break; - case INTERNET_OPTION_IDN: - FIXME("INTERNET_OPTION_IDN; STUB\n"); - INTERNET_SetLastError(ERROR_INTERNET_INVALID_OPTION); - ret = FALSE; + case 86: + FIXME("86\n"); break; default: FIXME("Option %d STUB\n",dwOption); @@ -2434,15 +2381,12 @@ BOOL WINAPI InternetSetOptionA(HINTERNET hInternet, DWORD dwOption, case INTERNET_OPTION_CALLBACK: { LPWININETHANDLEHEADER lpwh; + INTERNET_STATUS_CALLBACK callback = *(INTERNET_STATUS_CALLBACK *)lpBuffer; - if (!(lpwh = WININET_GetObject(hInternet))) - { - INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE); - return FALSE; - } + if (!(lpwh = WININET_GetObject(hInternet))) return FALSE; + r = (set_status_callback(lpwh, callback, FALSE) != INTERNET_INVALID_STATUS_CALLBACK); WININET_Release(lpwh); - INTERNET_SetLastError(ERROR_INTERNET_OPTION_NOT_SETTABLE); - return FALSE; + return r; } case INTERNET_OPTION_PROXY: { @@ -2531,18 +2475,6 @@ BOOL WINAPI InternetTimeFromSystemTimeA( const SYSTEMTIME* time, DWORD format, L TRACE( "%p 0x%08x %p 0x%08x\n", time, format, string, size ); - if (!time || !string || format != INTERNET_RFC1123_FORMAT) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if (size < INTERNET_RFC1123_BUFSIZE * sizeof(*string)) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } - ret = InternetTimeFromSystemTimeW( time, format, stringW, sizeof(stringW) ); if (ret) WideCharToMultiByte( CP_ACP, 0, stringW, -1, string, size, NULL, NULL ); @@ -2560,17 +2492,10 @@ BOOL WINAPI InternetTimeFromSystemTimeW( const SYSTEMTIME* time, DWORD format, L TRACE( "%p 0x%08x %p 0x%08x\n", time, format, string, size ); - if (!time || !string || format != INTERNET_RFC1123_FORMAT) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } + if (!time || !string) return FALSE; - if (size < INTERNET_RFC1123_BUFSIZE * sizeof(*string)) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); + if (format != INTERNET_RFC1123_FORMAT || size < INTERNET_RFC1123_BUFSIZE * sizeof(WCHAR)) return FALSE; - } sprintfW( string, date, WININET_wkday[time->wDayOfWeek], @@ -2880,8 +2805,6 @@ static HINTERNET INTERNET_InternetOpenUrlW(LPWININETAPPINFOW hIC, LPCWSTR lpszUr else urlComponents.nPort = INTERNET_DEFAULT_HTTPS_PORT; } - if (urlComponents.nScheme == INTERNET_SCHEME_HTTPS) dwFlags |= INTERNET_FLAG_SECURE; - /* FIXME: should use pointers, not handles, as handles are not thread-safe */ client = HTTP_Connect(hIC, hostName, urlComponents.nPort, userName, password, dwFlags, dwContext, INET_OPENURL); @@ -3087,7 +3010,7 @@ static LPWITHREADERROR INTERNET_AllocThreadError(void) */ void INTERNET_SetLastError(DWORD dwError) { - LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex); + LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex); if (!lpwite) lpwite = INTERNET_AllocThreadError(); @@ -3108,7 +3031,7 @@ void INTERNET_SetLastError(DWORD dwError) */ DWORD INTERNET_GetLastError(void) { - LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex); + LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex); if (!lpwite) return 0; /* TlsGetValue clears last error, so set it again here */ SetLastError(lpwite->dwError); @@ -3181,7 +3104,7 @@ BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest) */ LPSTR INTERNET_GetResponseBuffer(void) { - LPWITHREADERROR lpwite = TlsGetValue(g_dwTlsErrIndex); + LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex); if (!lpwite) lpwite = INTERNET_AllocThreadError(); TRACE("\n"); @@ -3528,9 +3451,6 @@ static BOOL calc_url_length(LPURL_COMPONENTSW lpUrlComponents, if (lpUrlComponents->lpszUrlPath) *lpdwUrlLength += URL_GET_COMP_LENGTH(lpUrlComponents, UrlPath); - if (lpUrlComponents->lpszExtraInfo) - *lpdwUrlLength += URL_GET_COMP_LENGTH(lpUrlComponents, ExtraInfo); - return TRUE; } @@ -3779,6 +3699,7 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW lpUrlComponents, DWORD dwFlags, } } + if (lpUrlComponents->lpszUrlPath) { dwLen = URL_GET_COMP_LENGTH(lpUrlComponents, UrlPath); @@ -3786,13 +3707,6 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW lpUrlComponents, DWORD dwFlags, lpszUrl += dwLen; } - if (lpUrlComponents->lpszExtraInfo) - { - dwLen = URL_GET_COMP_LENGTH(lpUrlComponents, ExtraInfo); - memcpy(lpszUrl, lpUrlComponents->lpszExtraInfo, dwLen * sizeof(WCHAR)); - lpszUrl += dwLen; - } - *lpszUrl = '\0'; return TRUE; @@ -3818,25 +3732,6 @@ DWORD WINAPI InternetConfirmZoneCrossingW( HWND hWnd, LPWSTR szUrlPrev, LPWSTR s return ERROR_SUCCESS; } -/*********************************************************************** - * PrivacySetZonePreferenceW (WININET.@) - */ -DWORD WINAPI PrivacySetZonePreferenceW( DWORD zone, DWORD type, DWORD template, LPCWSTR preference ) -{ - FIXME( "%x %x %x %s: stub\n", zone, type, template, debugstr_w(preference) ); - return 0; -} - -/*********************************************************************** - * PrivacyGetZonePreferenceW (WININET.@) - */ -DWORD WINAPI PrivacyGetZonePreferenceW( DWORD zone, DWORD type, LPDWORD template, - LPWSTR preference, LPDWORD length ) -{ - FIXME( "%x %x: stub\n", zone, type ); - return 0; -} - DWORD WINAPI InternetDialA( HWND hwndParent, LPSTR lpszConnectoid, DWORD dwFlags, DWORD_PTR* lpdwConnection, DWORD dwReserved ) { diff --git a/reactos/dll/win32/wininet/internet.h b/reactos/dll/win32/wininet/internet.h index 48271d650ec..0dcf5a22ce6 100644 --- a/reactos/dll/win32/wininet/internet.h +++ b/reactos/dll/win32/wininet/internet.h @@ -42,17 +42,29 @@ # include #endif -#if !defined(__MINGW32__) && !defined(_MSC_VER) +#if defined(__MINGW32__) || defined (_MSC_VER) +#include "ws2tcpip.h" +#ifndef MSG_WAITALL +#define MSG_WAITALL 0 +#endif +#else #define closesocket close #define ioctlsocket ioctl #endif /* __MINGW32__ */ +/* ReactOS-specific definitions */ +#undef CP_UNIXCP +#define CP_UNIXCP CP_THREAD_ACP + /* used for netconnection.c stuff */ typedef struct { BOOL useSSL; int socketFD; void *ssl_s; + char *peek_msg; + char *peek_msg_mem; + size_t peek_len; } WININET_NETCONNECTION; static inline LPWSTR WININET_strdupW( LPCWSTR str ) @@ -121,7 +133,6 @@ typedef struct { DWORD (*SetOption)(WININETHANDLEHEADER*,DWORD,void*,DWORD); DWORD (*ReadFile)(WININETHANDLEHEADER*,void*,DWORD,DWORD*); DWORD (*ReadFileExA)(WININETHANDLEHEADER*,INTERNET_BUFFERSA*,DWORD,DWORD_PTR); - DWORD (*ReadFileExW)(WININETHANDLEHEADER*,INTERNET_BUFFERSW*,DWORD,DWORD_PTR); BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*); DWORD (*QueryDataAvailable)(WININETHANDLEHEADER*,DWORD*,DWORD,DWORD_PTR); DWORD (*FindNextFileW)(WININETHANDLEHEADER*,void*); @@ -195,18 +206,12 @@ typedef struct LPWSTR lpszStatusText; DWORD dwContentLength; /* total number of bytes to be read */ DWORD dwContentRead; /* bytes of the content read so far */ - DWORD dwBytesToWrite; - DWORD dwBytesWritten; HTTPHEADERW *pCustHeaders; DWORD nCustHeaders; HANDLE hCacheFile; LPWSTR lpszCacheFile; struct HttpAuthInfo *pAuthInfo; struct HttpAuthInfo *pProxyAuthInfo; - BOOL read_chunked; /* are we reading in chunked mode? */ - DWORD read_pos; /* current read position in read_buf */ - DWORD read_size; /* valid data size in read_buf */ - char read_buf[4096]; /* buffer for already read but not returned data */ } WININETHTTPREQW, *LPWININETHTTPREQW; @@ -292,12 +297,6 @@ struct WORKREQ_HTTPSENDREQUESTW BOOL bEndRequest; }; -struct WORKREQ_HTTPENDREQUESTW -{ - DWORD dwFlags; - DWORD_PTR dwContext; -}; - struct WORKREQ_SENDCALLBACK { DWORD_PTR dwContext; @@ -321,11 +320,6 @@ struct WORKREQ_INTERNETREADFILEEXA LPINTERNET_BUFFERSA lpBuffersOut; }; -struct WORKREQ_INTERNETREADFILEEXW -{ - LPINTERNET_BUFFERSW lpBuffersOut; -}; - typedef struct WORKREQ { void (*asyncproc)(struct WORKREQ*); @@ -344,11 +338,9 @@ typedef struct WORKREQ struct WORKREQ_FTPRENAMEFILEW FtpRenameFileW; struct WORKREQ_FTPFINDNEXTW FtpFindNextW; struct WORKREQ_HTTPSENDREQUESTW HttpSendRequestW; - struct WORKREQ_HTTPENDREQUESTW HttpEndRequestW; struct WORKREQ_SENDCALLBACK SendCallback; - struct WORKREQ_INTERNETOPENURLW InternetOpenUrlW; + struct WORKREQ_INTERNETOPENURLW InternetOpenUrlW; struct WORKREQ_INTERNETREADFILEEXA InternetReadFileExA; - struct WORKREQ_INTERNETREADFILEEXW InternetReadFileExW; } u; } WORKREQUEST, *LPWORKREQUEST; @@ -389,6 +381,7 @@ INTERNETAPI HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion, LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext); +BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr); VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, @@ -398,6 +391,8 @@ VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength); +LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW lpwhr, LPCWSTR header); + BOOL NETCON_connected(WININET_NETCONNECTION *connection); BOOL NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL); BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain, @@ -411,6 +406,7 @@ BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags, int *recvd /* out */); BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available); +BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer); LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection); DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value); diff --git a/reactos/dll/win32/wininet/netconnection.c b/reactos/dll/win32/wininet/netconnection.c index d0d6f8e1dd2..5d8b4d75534 100644 --- a/reactos/dll/win32/wininet/netconnection.c +++ b/reactos/dll/win32/wininet/netconnection.c @@ -23,10 +23,6 @@ #include "config.h" #include "wine/port.h" -#if defined(__MINGW32__) || defined (_MSC_VER) -#include -#endif - #include #ifdef HAVE_POLL_H #include @@ -37,12 +33,10 @@ #ifdef HAVE_SYS_TIME_H # include #endif +#include #ifdef HAVE_SYS_SOCKET_H # include #endif -#ifdef HAVE_SYS_FILIO_H -# include -#endif #ifdef HAVE_UNISTD_H # include #endif @@ -61,6 +55,9 @@ #undef FAR #undef DSA #endif +#ifdef HAVE_SYS_SOCKET_H +# include +#endif #include #include @@ -118,18 +115,17 @@ MAKE_FUNCPTR(SSL_connect); MAKE_FUNCPTR(SSL_shutdown); MAKE_FUNCPTR(SSL_write); MAKE_FUNCPTR(SSL_read); -MAKE_FUNCPTR(SSL_pending); MAKE_FUNCPTR(SSL_get_verify_result); MAKE_FUNCPTR(SSL_get_peer_certificate); MAKE_FUNCPTR(SSL_CTX_get_timeout); MAKE_FUNCPTR(SSL_CTX_set_timeout); MAKE_FUNCPTR(SSL_CTX_set_default_verify_paths); +MAKE_FUNCPTR(i2d_X509); /* OpenSSL's libcrypto functions that we use */ MAKE_FUNCPTR(BIO_new_fp); MAKE_FUNCPTR(ERR_get_error); MAKE_FUNCPTR(ERR_error_string); -MAKE_FUNCPTR(i2d_X509); #undef MAKE_FUNCPTR #endif @@ -182,12 +178,12 @@ BOOL NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL) DYNSSL(SSL_shutdown); DYNSSL(SSL_write); DYNSSL(SSL_read); - DYNSSL(SSL_pending); DYNSSL(SSL_get_verify_result); DYNSSL(SSL_get_peer_certificate); DYNSSL(SSL_CTX_get_timeout); DYNSSL(SSL_CTX_set_timeout); DYNSSL(SSL_CTX_set_default_verify_paths); + DYNSSL(i2d_X509); #undef DYNSSL #define DYNCRYPTO(x) \ @@ -201,7 +197,6 @@ BOOL NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL) DYNCRYPTO(BIO_new_fp); DYNCRYPTO(ERR_get_error); DYNCRYPTO(ERR_error_string); - DYNCRYPTO(i2d_X509); #undef DYNCRYPTO pSSL_library_init(); @@ -209,6 +204,8 @@ BOOL NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL) pBIO_new_fp(stderr, BIO_NOCLOSE); /* FIXME: should use winedebug stuff */ meth = pSSLv23_method(); + connection->peek_msg = NULL; + connection->peek_msg_mem = NULL; #else FIXME("can't use SSL, not compiled in.\n"); INTERNET_SetLastError(ERROR_INTERNET_SECURITY_CHANNEL_ERROR); @@ -329,6 +326,11 @@ BOOL NETCON_close(WININET_NETCONNECTION *connection) #ifdef SONAME_LIBSSL if (connection->useSSL) { + HeapFree(GetProcessHeap(),0,connection->peek_msg_mem); + connection->peek_msg = NULL; + connection->peek_msg_mem = NULL; + connection->peek_len = 0; + pSSL_shutdown(connection->ssl_s); pSSL_free(connection->ssl_s); connection->ssl_s = NULL; @@ -536,8 +538,55 @@ BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int f else { #ifdef SONAME_LIBSSL - *recvd = pSSL_read(connection->ssl_s, buf, len); - return *recvd > 0 || !len; + if (flags & ~(MSG_PEEK|MSG_WAITALL)) + FIXME("SSL_read does not support the following flag: %08x\n", flags); + + /* this ugly hack is all for MSG_PEEK. eww gross */ + if (flags & MSG_PEEK && !connection->peek_msg) + { + connection->peek_msg = connection->peek_msg_mem = HeapAlloc(GetProcessHeap(), 0, (sizeof(char) * len) + 1); + } + else if (flags & MSG_PEEK && connection->peek_msg) + { + if (len < connection->peek_len) + FIXME("buffer isn't big enough. Do the expect us to wrap?\n"); + *recvd = min(len, connection->peek_len); + memcpy(buf, connection->peek_msg, *recvd); + return TRUE; + } + else if (connection->peek_msg) + { + *recvd = min(len, connection->peek_len); + memcpy(buf, connection->peek_msg, *recvd); + connection->peek_len -= *recvd; + connection->peek_msg += *recvd; + if (connection->peek_len == 0) + { + HeapFree(GetProcessHeap(), 0, connection->peek_msg_mem); + connection->peek_msg_mem = NULL; + connection->peek_msg = NULL; + } + /* check if we got enough data from the peek buffer */ + if (!(flags & MSG_WAITALL) || (*recvd == len)) + return TRUE; + /* otherwise, fall through */ + } + *recvd += pSSL_read(connection->ssl_s, (char*)buf + *recvd, len - *recvd); + if (flags & MSG_PEEK) /* must copy stuff into buffer */ + { + connection->peek_len = *recvd; + if (!*recvd) + { + HeapFree(GetProcessHeap(), 0, connection->peek_msg_mem); + connection->peek_msg_mem = NULL; + connection->peek_msg = NULL; + } + else + memcpy(connection->peek_msg, buf, *recvd); + } + if (*recvd < 1 && len) + return FALSE; + return TRUE; #else return FALSE; #endif @@ -555,9 +604,13 @@ BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *avail if (!NETCON_connected(connection)) return FALSE; +#ifdef SONAME_LIBSSL + if (connection->peek_msg) *available = connection->peek_len; +#endif + +#ifdef FIONREAD if (!connection->useSSL) { -#ifdef FIONREAD int unread; int retval = ioctlsocket(connection->socketFD, FIONREAD, &unread); if (!retval) @@ -565,17 +618,115 @@ BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *avail TRACE("%d bytes of queued, but unread data\n", unread); *available += unread; } + } #endif + return TRUE; +} + +/****************************************************************************** + * NETCON_getNextLine + */ +BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer) +{ + + TRACE("\n"); + + if (!NETCON_connected(connection)) return FALSE; + + if (!connection->useSSL) + { + struct timeval tv; + fd_set infd; + BOOL bSuccess = FALSE; + DWORD nRecv = 0; + + FD_ZERO(&infd); + FD_SET(connection->socketFD, &infd); + tv.tv_sec=RESPONSE_TIMEOUT; + tv.tv_usec=0; + + while (nRecv < *dwBuffer) + { + if (select(connection->socketFD+1,&infd,NULL,NULL,&tv) > 0) + { + if (recv(connection->socketFD, &lpszBuffer[nRecv], 1, 0) <= 0) + { + INTERNET_SetLastError(sock_get_error(errno)); + goto lend; + } + + if (lpszBuffer[nRecv] == '\n') + { + bSuccess = TRUE; + break; + } + if (lpszBuffer[nRecv] != '\r') + nRecv++; + } + else + { + INTERNET_SetLastError(ERROR_INTERNET_TIMEOUT); + goto lend; + } + } + + lend: /* FIXME: don't use labels */ + if (bSuccess) + { + lpszBuffer[nRecv++] = '\0'; + *dwBuffer = nRecv; + TRACE(":%u %s\n", nRecv, lpszBuffer); + return TRUE; + } + else + { + return FALSE; + } } else { #ifdef SONAME_LIBSSL - *available = pSSL_pending(connection->ssl_s); + long prev_timeout; + DWORD nRecv = 0; + BOOL success = TRUE; + + prev_timeout = pSSL_CTX_get_timeout(ctx); + pSSL_CTX_set_timeout(ctx, RESPONSE_TIMEOUT); + + while (nRecv < *dwBuffer) + { + int recv = 1; + if (!NETCON_recv(connection, &lpszBuffer[nRecv], 1, 0, &recv)) + { + INTERNET_SetLastError(ERROR_CONNECTION_ABORTED); + success = FALSE; + } + + if (lpszBuffer[nRecv] == '\n') + { + success = TRUE; + break; + } + if (lpszBuffer[nRecv] != '\r') + nRecv++; + } + + pSSL_CTX_set_timeout(ctx, prev_timeout); + if (success) + { + lpszBuffer[nRecv++] = '\0'; + *dwBuffer = nRecv; + TRACE("_SSL:%u %s\n", nRecv, lpszBuffer); + return TRUE; + } + return FALSE; +#else + return FALSE; #endif } - return TRUE; } + LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection) { #ifdef SONAME_LIBSSL @@ -637,7 +788,7 @@ DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value tv.tv_usec = (value % 1000) * 1000; result = setsockopt(connection->socketFD, SOL_SOCKET, - send ? SO_SNDTIMEO : SO_RCVTIMEO, (void*)&tv, + send ? SO_SNDTIMEO : SO_RCVTIMEO, &tv, sizeof(tv)); if (result == -1) diff --git a/reactos/dll/win32/wininet/urlcache.c b/reactos/dll/win32/wininet/urlcache.c index f385c7e81cb..b4feba3260c 100644 --- a/reactos/dll/win32/wininet/urlcache.c +++ b/reactos/dll/win32/wininet/urlcache.c @@ -692,7 +692,6 @@ static LPURLCACHE_HEADER URLCacheContainer_LockIndex(URLCACHECONTAINER * pContai * of the memory mapped file */ if (pHeader->dwFileSize != pContainer->file_size) { - UnmapViewOfFile( pHeader ); URLCacheContainer_CloseIndex(pContainer); error = URLCacheContainer_OpenIndex(pContainer); if (error != ERROR_SUCCESS) @@ -3624,26 +3623,10 @@ BOOL WINAPI IsUrlCacheEntryExpiredW( LPCWSTR url, DWORD dwFlags, FILETIME* pftLa /*********************************************************************** * GetDiskInfoA (WININET.@) */ -BOOL WINAPI GetDiskInfoA(PCSTR path, PDWORD cluster_size, PDWORDLONG free, PDWORDLONG total) +DWORD WINAPI GetDiskInfoA(void *p0, void *p1, void *p2, void *p3) { - BOOL ret; - ULARGE_INTEGER bytes_free, bytes_total; - - TRACE("(%s, %p, %p, %p)\n", debugstr_a(path), cluster_size, free, total); - - if (!path) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if ((ret = GetDiskFreeSpaceExA(path, NULL, &bytes_total, &bytes_free))) - { - if (cluster_size) *cluster_size = 1; - if (free) *free = bytes_free.QuadPart; - if (total) *total = bytes_total.QuadPart; - } - return ret; + FIXME("(%p, %p, %p, %p)\n", p0, p1, p2, p3); + return 0; } /*********************************************************************** @@ -3654,12 +3637,3 @@ DWORD WINAPI RegisterUrlCacheNotification(LPVOID a, DWORD b, DWORD c, DWORD d, D FIXME("(%p %x %x %x %x %x)\n", a, b, c, d, e, f); return 0; } - -/*********************************************************************** - * IncrementUrlCacheHeaderData (WININET.@) - */ -BOOL WINAPI IncrementUrlCacheHeaderData(DWORD index, LPDWORD data) -{ - FIXME("(%u, %p)\n", index, data); - return FALSE; -} diff --git a/reactos/dll/win32/wininet/utility.c b/reactos/dll/win32/wininet/utility.c index b68cf8d4a57..b0d9c9c91c6 100644 --- a/reactos/dll/win32/wininet/utility.c +++ b/reactos/dll/win32/wininet/utility.c @@ -25,10 +25,6 @@ #include "config.h" #include "wine/port.h" -#if defined(__MINGW32__) || defined (_MSC_VER) -#include -#endif - #include #include #include @@ -44,8 +40,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet); -#ifndef HAVE_GETADDRINFO - /* critical section to protect non-reentrant gethostbyname() */ static CRITICAL_SECTION cs_gethostbyname; static CRITICAL_SECTION_DEBUG critsect_debug = @@ -56,8 +50,6 @@ static CRITICAL_SECTION_DEBUG critsect_debug = }; static CRITICAL_SECTION cs_gethostbyname = { &critsect_debug, -1, 0, 0, 0, 0 }; -#endif - #define TIME_STRING_LEN 30 time_t ConvertTimeString(LPCWSTR asctime) @@ -150,12 +142,7 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort, WCHAR *found; char *name; int len, sz; -#ifdef HAVE_GETADDRINFO - struct addrinfo *res, hints; - int ret; -#else struct hostent *phe; -#endif TRACE("%s\n", debugstr_w(lpszServerName)); @@ -171,45 +158,27 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort, len = strlenW(lpszServerName); sz = WideCharToMultiByte( CP_UNIXCP, 0, lpszServerName, len, NULL, 0, NULL, NULL ); - if (!(name = HeapAlloc( GetProcessHeap(), 0, sz + 1 ))) return FALSE; + name = HeapAlloc(GetProcessHeap(), 0, sz+1); WideCharToMultiByte( CP_UNIXCP, 0, lpszServerName, len, name, sz, NULL, NULL ); name[sz] = 0; -#ifdef HAVE_GETADDRINFO - memset( &hints, 0, sizeof(struct addrinfo) ); - hints.ai_family = AF_INET; - - ret = getaddrinfo( name, NULL, &hints, &res ); - HeapFree( GetProcessHeap(), 0, name ); - if (ret != 0) - { - TRACE("failed to get address of %s (%s)\n", debugstr_w(lpszServerName), gai_strerror(ret)); - return FALSE; - } - memset( psa, 0, sizeof(struct sockaddr_in) ); - memcpy( &psa->sin_addr, &((struct sockaddr_in *)res->ai_addr)->sin_addr, sizeof(struct in_addr) ); - psa->sin_family = res->ai_family; - psa->sin_port = htons(nServerPort); - - freeaddrinfo( res ); -#else EnterCriticalSection( &cs_gethostbyname ); phe = gethostbyname(name); HeapFree( GetProcessHeap(), 0, name ); if (NULL == phe) { - TRACE("failed to get address of %s (%d)\n", debugstr_w(lpszServerName), h_errno); + TRACE("Failed to get hostname: (%s)\n", debugstr_w(lpszServerName) ); LeaveCriticalSection( &cs_gethostbyname ); return FALSE; } + memset(psa,0,sizeof(struct sockaddr_in)); memcpy((char *)&psa->sin_addr, phe->h_addr, phe->h_length); psa->sin_family = phe->h_addrtype; psa->sin_port = htons(nServerPort); LeaveCriticalSection( &cs_gethostbyname ); -#endif return TRUE; } diff --git a/reactos/dll/win32/wininet/wininet.rbuild b/reactos/dll/win32/wininet/wininet.rbuild index e2a96c941f1..cf0064396ea 100644 --- a/reactos/dll/win32/wininet/wininet.rbuild +++ b/reactos/dll/win32/wininet/wininet.rbuild @@ -18,7 +18,6 @@ secur32 crypt32 ws2_32 - pseh cookie.c dialogs.c ftp.c diff --git a/reactos/dll/win32/wininet/wininet.spec b/reactos/dll/win32/wininet/wininet.spec index d5995eb3cc3..dfbc38c02fc 100644 --- a/reactos/dll/win32/wininet/wininet.spec +++ b/reactos/dll/win32/wininet/wininet.spec @@ -1,5 +1,5 @@ 101 stub -noname DoConnectoidsExist -102 stdcall -noname GetDiskInfoA(str ptr ptr ptr) +102 stub -noname GetDiskInfoA 103 stub -noname PerformOperationOverUrlCacheA 104 stub -noname HttpCheckDavComplianceA 105 stub -noname HttpCheckDavComplianceW @@ -9,7 +9,7 @@ 111 stub -noname ExportCookieFileW 112 stub -noname IsProfilesEnabled 116 stub -noname IsDomainlegalCookieDomainA -117 stdcall -noname IsDomainLegalCookieDomainW(wstr wstr) +117 stub -noname IsDomainLegalCookieDomainW 118 stub -noname FindP3PPolicySymbol 120 stub -noname MapResourceToPolicy 121 stub -noname GetP3PPolicy @@ -109,7 +109,7 @@ @ stdcall HttpSendRequestExA(long ptr ptr long long) @ stdcall HttpSendRequestExW(long ptr ptr long long) @ stdcall HttpSendRequestW(ptr wstr long ptr long) -@ stdcall IncrementUrlCacheHeaderData(long ptr) +@ stub IncrementUrlCacheHeaderData @ stub InternetAlgIdToStringA @ stub InternetAlgIdToStringW @ stdcall InternetAttemptConnect(long) @@ -213,10 +213,10 @@ @ stdcall IsUrlCacheEntryExpiredW(wstr long ptr) @ stub LoadUrlCacheContent @ stub ParseX509EncodedCertificateForListBoxEntry -@ stdcall PrivacyGetZonePreferenceW(long long ptr ptr ptr) -@ stdcall PrivacySetZonePreferenceW(long long long wstr) +@ stub PrivacyGetZonePreferenceW # (long long ptr ptr ptr) +@ stub PrivacySetZonePreferenceW # (long long long wstr) @ stdcall ReadUrlCacheEntryStream(ptr long ptr ptr long) -@ stdcall RegisterUrlCacheNotification(ptr long long long long long) +@ stub RegisterUrlCacheNotification @ stdcall ResumeSuspendedDownload(long long) @ stdcall RetrieveUrlCacheEntryFileA(str ptr ptr long) @ stdcall RetrieveUrlCacheEntryFileW(wstr ptr ptr long) From e980bd998f118c072adbb5d25b223bc909ca5552 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Mon, 22 Jun 2009 08:22:41 +0000 Subject: [PATCH 027/577] - Initialize the ARM pool (MiInitializeArmPool): - Do some additional accounting to keep track of initial nonpaged pool range and size. - Create and initialize the free page lists, and free page entries. - Validate that the initial nonpaged pool address space was properly mapped. - Validate that the expansion nonpaged pool address space is unmapped, and prepare to map it. svn path=/trunk/; revision=41527 --- reactos/ntoskrnl/mm/ARM3/init.c | 5 + reactos/ntoskrnl/mm/ARM3/miarm.h | 12 +++ reactos/ntoskrnl/mm/ARM3/pool.c | 125 +++++++++++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 4 files changed, 143 insertions(+) create mode 100644 reactos/ntoskrnl/mm/ARM3/pool.c diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index b113b5d7e7d..0c7e2175903 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -362,6 +362,11 @@ MmArmInitSystem(IN ULONG Phase, 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); + + // + // Now go ahead and initialize the ARM pool + // + MiInitializeArmPool(); } // diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 7011adfee2e..cdc2881ef3b 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -9,7 +9,19 @@ #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT) #define MI_MAX_INIT_NONPAGED_POOL_SIZE (128 * 1024 * 1024) #define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024) +#define MI_MAX_FREE_PAGE_LISTS 4 extern MMPTE HyperTemplatePte; +extern ULONG MmSizeOfNonPagedPoolInBytes; +extern ULONG MmMaximumNonPagedPoolInBytes; +extern PVOID MmNonPagedPoolStart; +extern PVOID MmNonPagedPoolExpansionStart; + +VOID +NTAPI +MiInitializeArmPool( + VOID +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c new file mode 100644 index 00000000000..63e0b536359 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -0,0 +1,125 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/pool.c + * PURPOSE: ARM Memory Manager Pool Allocator + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::POOL" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +LIST_ENTRY MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS]; +PFN_NUMBER MmNumberOfFreeNonPagedPool, MiExpansionPoolPagesInitialCharge; +PVOID MmNonPagedPoolEnd0; +PFN_NUMBER MiStartOfInitialPoolFrame, MiEndOfInitialPoolFrame; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +MiInitializeArmPool(VOID) +{ + ULONG i; + PFN_NUMBER PoolPages; + PMMFREE_POOL_ENTRY FreeEntry, FirstEntry; + PMMPTE PointerPte; + PAGED_CODE(); + + // + // We keep 4 lists of free pages (4 lists help avoid contention) + // + for (i = 0; i < MI_MAX_FREE_PAGE_LISTS; i++) + { + // + // Initialize each of them + // + InitializeListHead(&MmNonPagedPoolFreeListHead[i]); + } + + // + // Calculate how many pages the initial nonpaged pool has + // + PoolPages = BYTES_TO_PAGES(MmSizeOfNonPagedPoolInBytes); + MmNumberOfFreeNonPagedPool = PoolPages; + + // + // Initialize the first free entry + // + FreeEntry = MmNonPagedPoolStart; + FirstEntry = FreeEntry; + FreeEntry->Size = PoolPages; + FreeEntry->Owner = FirstEntry; + + // + // Insert it into the last list + // + InsertHeadList(&MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS - 1], + &FreeEntry->List); + + // + // Now create free entries for every single other page + // + while (PoolPages-- > 1) + { + // + // Link them all back to the original entry + // + FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)FreeEntry + PAGE_SIZE); + FreeEntry->Owner = FirstEntry; + } + + // + // Validate and remember first allocated pool page + // + PointerPte = MiAddressToPte(MmNonPagedPoolStart); + ASSERT(PointerPte->u.Hard.Valid == 1); + MiStartOfInitialPoolFrame = PFN_FROM_PTE(PointerPte); + + // + // Keep track of where initial nonpaged pool ends + // + MmNonPagedPoolEnd0 = (PVOID)((ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes); + + // + // Validate and remember last allocated pool page + // + PointerPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolEnd0 - 1)); + ASSERT(PointerPte->u.Hard.Valid == 1); + MiEndOfInitialPoolFrame = PFN_FROM_PTE(PointerPte); + + // + // Validate the first nonpaged pool expansion page (which is a guard page) + // + PointerPte = MiAddressToPte(MmNonPagedPoolExpansionStart); + ASSERT(PointerPte->u.Hard.Valid == 0); + + // + // Calculate the size of the expansion region alone + // + MiExpansionPoolPagesInitialCharge = + BYTES_TO_PAGES(MmMaximumNonPagedPoolInBytes - MmSizeOfNonPagedPoolInBytes); + + // + // Remove 2 pages, since there's a guard page on top and on the bottom + // + MiExpansionPoolPagesInitialCharge -= 2; + + // + // Now initialize the nonpaged pool expansion PTE space. Remember there's a + // guard page on top so make sure to skip it. The bottom guard page will be + // guaranteed by the fact our size is off by one. + // +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 78d6e5dd15b..5240db23593 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -361,6 +361,7 @@ init.c + pool.c anonmem.c balance.c From e5cc98dbc4f850452c6fbb8148aa305c589977a5 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Mon, 22 Jun 2009 08:51:28 +0000 Subject: [PATCH 028/577] - Initialize nonpaged pool expansion system PTEs (MiInitializeSystemPtes): - Just supports expansion space for now, not system space. - Very basic initialization of the accounting structures required. - Sets up the first two system PTE clusters for the space (the first contains the linkage, the second contains the sizage). - Called from MiInitializeArmPool. svn path=/trunk/; revision=41528 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 15 +++++ reactos/ntoskrnl/mm/ARM3/pool.c | 3 + reactos/ntoskrnl/mm/ARM3/syspte.c | 76 ++++++++++++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 4 files changed, 95 insertions(+) create mode 100644 reactos/ntoskrnl/mm/ARM3/syspte.c diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index cdc2881ef3b..ab52df06ef2 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -11,6 +11,13 @@ #define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024) #define MI_MAX_FREE_PAGE_LISTS 4 +typedef enum _MMSYSTEM_PTE_POOL_TYPE +{ + SystemPteSpace, + NonPagedPoolExpansion, + MaximumPtePoolTypes +} MMSYSTEM_PTE_POOL_TYPE; + extern MMPTE HyperTemplatePte; extern ULONG MmSizeOfNonPagedPoolInBytes; @@ -24,4 +31,12 @@ MiInitializeArmPool( VOID ); +VOID +NTAPI +MiInitializeSystemPtes( + IN PMMPTE StartingPte, + IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE PoolType +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c index 63e0b536359..32f377b8b2b 100644 --- a/reactos/ntoskrnl/mm/ARM3/pool.c +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -120,6 +120,9 @@ MiInitializeArmPool(VOID) // guard page on top so make sure to skip it. The bottom guard page will be // guaranteed by the fact our size is off by one. // + MiInitializeSystemPtes(PointerPte + 1, + MiExpansionPoolPagesInitialCharge, + NonPagedPoolExpansion); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/syspte.c b/reactos/ntoskrnl/mm/ARM3/syspte.c new file mode 100644 index 00000000000..a9a09ed7b57 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/syspte.c @@ -0,0 +1,76 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/syspte.c + * PURPOSE: ARM Memory Manager System PTE Allocator + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::SYSPTE" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +PMMPTE MmSystemPteBase; +PMMPTE MmSystemPtesStart[MaximumPtePoolTypes]; +PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes]; +MMPTE MmFirstFreeSystemPte[MaximumPtePoolTypes]; +ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes]; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +MiInitializeSystemPtes(IN PMMPTE StartingPte, + IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE PoolType) +{ + // + // Sanity checks + // + ASSERT(NumberOfPtes >= 1); + ASSERT(PoolType == NonPagedPoolExpansion); + + // + // Set the starting and ending PTE addresses for this space + // + MmSystemPteBase = (PVOID)PAGETABLE_MAP; + MmSystemPtesStart[PoolType] = StartingPte; + MmSystemPtesEnd[PoolType] = StartingPte + NumberOfPtes - 1; + DPRINT1("System PTE space for %d starting at: %p and ending at: %p\n", + PoolType, MmSystemPtesStart[PoolType], MmSystemPtesEnd[PoolType]); + + // + // Clear all the PTEs to start with + // + RtlZeroMemory(StartingPte, NumberOfPtes * sizeof(MMPTE)); + + // + // Make the first entry free and link it + // + StartingPte->u.List.NextEntry = -1; + MmFirstFreeSystemPte[PoolType].u.Long = 0; + MmFirstFreeSystemPte[PoolType].u.List.NextEntry = StartingPte - + MmSystemPteBase; + + // + // The second entry stores the size of this PTE space + // + StartingPte++; + StartingPte->u.Long = 0; + StartingPte->u.List.NextEntry = NumberOfPtes; + + // + // We also keep a global for it + // + MmTotalFreeSystemPtes[PoolType] = NumberOfPtes; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 5240db23593..e35eedac8aa 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -362,6 +362,7 @@ init.c pool.c + syspte.c anonmem.c balance.c From 872b7b4830e27db881177475fbbe9d0fd0ff1802 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Mon, 22 Jun 2009 09:34:24 +0000 Subject: [PATCH 029/577] - Initialize count of System PTEs: - Use 7000 for systems with 19MB of RAM or less, 11000 for systems between 19 and 32MB of RAM, and 22000 for systems with more than that. - Windows will go up to 50000 on server machines, but this is likely not needed now (22000 system PTEs is roughly 100 MB). - This now affects the calculation of MmNonPagedSystemStart, which is now correct and reflects the nonpaged address space of the system. - System PTEs are not yet initialized (but their page tables are mapped by the same code which maps nonpaged pool expansion VA page tables). svn path=/trunk/; revision=41529 --- reactos/ntoskrnl/mm/ARM3/init.c | 104 ++++++++++++++++++++++++++----- reactos/ntoskrnl/mm/ARM3/miarm.h | 2 + 2 files changed, 92 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index 0c7e2175903..a702b38fa5c 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -95,6 +95,13 @@ PVOID MmNonPagedPoolStart; PVOID MmNonPagedPoolExpansionStart; PVOID MmNonPagedPoolEnd = (PVOID)0xFFBE0000; +// +// Windows NT seems to choose between 7000, 11000 and 50000 +// On systems with more than 32MB, this number is then doubled, and further +// aligned up to a PDE boundary (4MB). +// +ULONG MmNumberOfSystemPtes; + /* PRIVATE FUNCTIONS **********************************************************/ NTSTATUS @@ -109,11 +116,40 @@ MmArmInitSystem(IN ULONG Phase, MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte; PVOID NonPagedPoolExpansionVa, BaseAddress; NTSTATUS Status; + ULONG OldCount; BoundaryAddressMultiple.QuadPart = Low.QuadPart = 0; High.QuadPart = -1; if (Phase == 0) { + // + // Check if this is a machine with less than 19MB of RAM + // + if (MmNumberOfPhysicalPages < MI_MIN_PAGES_FOR_SYSPTE_TUNING) + { + // + // Use the very minimum of system PTEs + // + MmNumberOfSystemPtes = 7000; + } + else + { + // + // Use the default, but check if we have more than 32MB of RAM + // + MmNumberOfSystemPtes = 11000; + if (MmNumberOfPhysicalPages > MI_MIN_PAGES_FOR_SYSPTE_BOOST) + { + // + // Double the amount of system PTEs + // + MmNumberOfSystemPtes <<= 1; + } + } + + DPRINT1("System PTE count has been tuned to %d (%d bytes)\n", + MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); + // // Check if this is a machine with less than 256MB of RAM, and no overide // @@ -212,28 +248,47 @@ MmArmInitSystem(IN ULONG Phase, NonPagedPoolExpansionVa = MmNonPagedPoolStart; DPRINT1("NP Pool has been tuned to: %d bytes and %d bytes\n", MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes); - DPRINT1("NP Expansion VA begins at: %p and ends at: %p\n", - MmNonPagedPoolStart, MmNonPagedPoolEnd); // - // Now calculate the nonpaged system VA region - // This includes nonpaged pool expansion (above) and the system PTEs - // Since there are no system PTEs yet, this is (for now) the same + // Now calculate the nonpaged system VA region, which includes the + // nonpaged pool expansion (above) and the system PTEs. Note that it is + // then aligned to a PDE boundary (4MB). // - MmNonPagedSystemStart = MmNonPagedPoolStart; - DPRINT1("NP System VA (later will be System PTEs) start at: %p\n", - MmNonPagedSystemStart); + MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart - + (MmNumberOfSystemPtes + 1) * PAGE_SIZE); + MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart & + ~((4 * 1024 * 1024) - 1)); + // + // Don't let it go below the minimum + // + if (MmNonPagedSystemStart < (PVOID)0xEB000000) + { + // + // This is a hard-coded limit in the Windows NT address space + // + MmNonPagedSystemStart = (PVOID)0xEB000000; + + // + // Reduce the amount of system PTEs to reach this point + // + MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart - + (ULONG_PTR)MmNonPagedSystemStart) >> + PAGE_SHIFT; + MmNumberOfSystemPtes--; + ASSERT(MmNumberOfSystemPtes > 1000); + } + // // Non paged pool should come after the PFN database, but since we are // co-existing with the ReactOS NP pool, our "ARM Pool" will instead // start at this arbitrarly chosen base address. // When ARM pool becomes non paged pool, this needs to be changed. // + DPRINT1("System PTE VA starts at: %p\n", MmNonPagedSystemStart); + DPRINT1("NP Expansion VA begins at: %p and ends at: %p\n", + MmNonPagedPoolStart, MmNonPagedPoolEnd); MmNonPagedPoolStart = (PVOID)0xA0000000; - DPRINT1("NP VA begins at: %p and ends at: %p\n", - MmNonPagedPoolStart, - (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes); // // Now we actually need to get these many physical pages. Nonpaged pool @@ -244,11 +299,14 @@ MmArmInitSystem(IN ULONG Phase, High, BoundaryAddressMultiple); ASSERT(PageFrameIndex != 0); + DPRINT1("NP VA begins at: %p and ends at: %p\n", + MmNonPagedPoolStart, + (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes); DPRINT1("NP PA PFN begins at: %lx\n", PageFrameIndex); // // Now we need some pages to create the page tables for the NP system VA - // which would normally include system PTEs and expansion NP + // which includes system PTEs and expansion NP // StartPde = MiAddressToPde(MmNonPagedSystemStart); EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); @@ -311,7 +369,7 @@ MmArmInitSystem(IN ULONG Phase, } // - // Now rememeber where the expansion starts + // Now remember where the expansion starts // MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa; @@ -348,7 +406,7 @@ MmArmInitSystem(IN ULONG Phase, ASSERT(Status == STATUS_SUCCESS); // - // And we need one more for the system NP (expansion NP only for now) + // And we need one more for the system NP // BaseAddress = MmNonPagedSystemStart; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), @@ -363,10 +421,28 @@ MmArmInitSystem(IN ULONG Phase, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); + // + // Sanity check: make sure we have properly defined the system PTE space + // + ASSERT(MiAddressToPte(MmNonPagedSystemStart) < + MiAddressToPte(MmNonPagedPoolExpansionStart)); + // // Now go ahead and initialize the ARM pool // MiInitializeArmPool(); + + // + // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs! + // + PointerPte = MiAddressToPte(MmNonPagedSystemStart); + OldCount = MmNumberOfSystemPtes; + MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) - + PointerPte; + MmNumberOfSystemPtes--; + ASSERT((MmNumberOfSystemPtes - OldCount) <= 1000); + DPRINT1("Final System PTE count: %d (%d bytes)\n", + MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); } // diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index ab52df06ef2..4b2705a7471 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -7,6 +7,8 @@ */ #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT) +#define MI_MIN_PAGES_FOR_SYSPTE_TUNING ((19*1024*1024) >> PAGE_SHIFT) +#define MI_MIN_PAGES_FOR_SYSPTE_BOOST ((32*1024*1024) >> PAGE_SHIFT) #define MI_MAX_INIT_NONPAGED_POOL_SIZE (128 * 1024 * 1024) #define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024) #define MI_MAX_FREE_PAGE_LISTS 4 From dba96538b8bcad33b0204665e2adf46fd621a357 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Mon, 22 Jun 2009 10:22:19 +0000 Subject: [PATCH 030/577] - Initialize system PTE space. svn path=/trunk/; revision=41530 --- reactos/ntoskrnl/mm/ARM3/init.c | 5 +++++ reactos/ntoskrnl/mm/ARM3/syspte.c | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index a702b38fa5c..8ab3b4f4e07 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -443,6 +443,11 @@ MmArmInitSystem(IN ULONG Phase, ASSERT((MmNumberOfSystemPtes - OldCount) <= 1000); DPRINT1("Final System PTE count: %d (%d bytes)\n", MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); + + // + // Create the system PTE space + // + MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace); } // diff --git a/reactos/ntoskrnl/mm/ARM3/syspte.c b/reactos/ntoskrnl/mm/ARM3/syspte.c index a9a09ed7b57..40177dc711f 100644 --- a/reactos/ntoskrnl/mm/ARM3/syspte.c +++ b/reactos/ntoskrnl/mm/ARM3/syspte.c @@ -23,6 +23,7 @@ PMMPTE MmSystemPtesStart[MaximumPtePoolTypes]; PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes]; MMPTE MmFirstFreeSystemPte[MaximumPtePoolTypes]; ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes]; +ULONG MmTotalSystemPtes; /* PRIVATE FUNCTIONS **********************************************************/ @@ -36,7 +37,6 @@ MiInitializeSystemPtes(IN PMMPTE StartingPte, // Sanity checks // ASSERT(NumberOfPtes >= 1); - ASSERT(PoolType == NonPagedPoolExpansion); // // Set the starting and ending PTE addresses for this space @@ -71,6 +71,17 @@ MiInitializeSystemPtes(IN PMMPTE StartingPte, // We also keep a global for it // MmTotalFreeSystemPtes[PoolType] = NumberOfPtes; + + // + // Check if this is the system PTE space + // + if (PoolType == SystemPteSpace) + { + // + // Remember how many PTEs we have + // + MmTotalSystemPtes = NumberOfPtes; + } } /* EOF */ From ce839b70b3fe626dcc686878ab4c0226331aa5ed Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 22 Jun 2009 11:31:57 +0000 Subject: [PATCH 031/577] Remove unused stuff. svn path=/trunk/; revision=41532 --- reactos/ntoskrnl/kd/i386/kdmemsup.c | 137 +------------- reactos/ntoskrnl/kdbg/kdb_keyboard.c | 257 +-------------------------- 2 files changed, 3 insertions(+), 391 deletions(-) diff --git a/reactos/ntoskrnl/kd/i386/kdmemsup.c b/reactos/ntoskrnl/kd/i386/kdmemsup.c index d0d5fbe8092..ec0f7f0f83d 100644 --- a/reactos/ntoskrnl/kd/i386/kdmemsup.c +++ b/reactos/ntoskrnl/kd/i386/kdmemsup.c @@ -30,89 +30,6 @@ static BOOLEAN KdpPhysAccess = FALSE; -#if 0 -extern ULONG MmGlobalKernelPageDirectory[1024]; -ULONG_PTR IdentityMapAddrHigh, IdentityMapAddrLow; - -ULONGLONG -FASTCALL -KdpPhysRead(ULONG_PTR Addr, LONG Len) -{ - ULONGLONG Result = 0; - ULONG_PTR OldCR3 = __readcr3(), OldCR4 = __readcr4(); - - if (Addr & HIGH_PHYS_MASK) - { - Addr &= ~HIGH_PHYS_MASK; - __writecr3(IdentityMapAddrHigh); - } - else - __writecr3(IdentityMapAddrLow); - - __writecr4(OldCR4|CR4_PAGE_SIZE_BIT); // Turn on large page translation - __invlpg((PVOID)Addr); - - switch (Len) - { - case 8: - Result = *((PULONGLONG)Addr); - break; - case 4: - Result = *((PULONG)Addr); - break; - case 2: - Result = *((PUSHORT)Addr); - break; - case 1: - Result = *((PUCHAR)Addr); - break; - } - __writecr4(OldCR4); // Turn off large page translation - __writecr3(OldCR3); - __invlpg((PVOID)Addr); - - return Result; -} - -VOID -NTAPI -KdpPhysWrite(ULONG_PTR Addr, LONG Len, ULONGLONG Value) -{ - ULONG_PTR OldCR3 = __readcr3(), OldCR4 = __readcr4(); - - if (Addr & HIGH_PHYS_MASK) - { - Addr &= ~HIGH_PHYS_MASK; - __writecr3(IdentityMapAddrHigh); - } - else - __writecr3(IdentityMapAddrLow); - - __writecr4(OldCR4|CR4_PAGE_SIZE_BIT); // Turn on large page translation - __invlpg((PVOID)Addr); - - switch (Len) - { - case 8: - *((PULONGLONG)Addr) = Value; - break; - case 4: - *((PULONG)Addr) = Value; - break; - case 2: - *((PUSHORT)Addr) = Value; - break; - case 1: - *((PUCHAR)Addr) = Value; - break; - } - __writecr4(OldCR4); // Turn off large page translation - __writecr3(OldCR3); - __invlpg((PVOID)Addr); -} - -#else - static ULONG_PTR KdpPhysMap(ULONG_PTR PhysAddr, LONG Len) @@ -194,7 +111,6 @@ KdpPhysWrite(ULONG_PTR PhysAddr, LONG Len, ULONGLONG Value) break; } } -#endif BOOLEAN NTAPI @@ -291,60 +207,11 @@ KdpSafeWriteMemory(ULONG_PTR Addr, LONG Len, ULONGLONG Value) return TRUE; } -#if 0 -VOID -NTAPI -KdpEnableSafeMem() -{ - int i; - PULONG IdentityMapVirt; - PHYSICAL_ADDRESS IdentityMapPhys, Highest = { }; - - if (KdpPhysAccess) - return; - - Highest.LowPart = (ULONG)-1; - /* Allocate a physical page and map it to copy the phys copy code onto */ - IdentityMapVirt = (PULONG)MmAllocateContiguousMemory(2 * PAGE_SIZE, Highest); - IdentityMapPhys = MmGetPhysicalAddress(IdentityMapVirt); - IdentityMapAddrHigh = IdentityMapPhys.LowPart; - - /* Copy the kernel space */ - memcpy(IdentityMapVirt, - MmGlobalKernelPageDirectory, - PAGE_SIZE); - - /* Set up 512 4Mb pages (high 2Gig identity mapped) */ - for (i = 0; i < 512; i++) - { - IdentityMapVirt[i] = - HIGH_PHYS_MASK | (i << 22) | PDE_PS_BIT | PDE_W_BIT | PDE_PRESENT_BIT; - } - - /* Allocate a physical page and map it to copy the phys copy code onto */ - IdentityMapAddrLow = IdentityMapAddrHigh + PAGE_SIZE; - IdentityMapVirt += PAGE_SIZE / sizeof(ULONG); - - /* Copy the kernel space */ - memcpy(IdentityMapVirt, - MmGlobalKernelPageDirectory, - PAGE_SIZE); - - /* Set up 512 4Mb pages (low 2Gig identity mapped) */ - for (i = 0; i < 512; i++) - { - IdentityMapVirt[i] = (i << 22) | PDE_PS_BIT | PDE_W_BIT | PDE_PRESENT_BIT; - } - - KdpPhysAccess = TRUE; -} - -#else - VOID NTAPI KdpEnableSafeMem(VOID) { KdpPhysAccess = TRUE; } -#endif + +/* EOF */ diff --git a/reactos/ntoskrnl/kdbg/kdb_keyboard.c b/reactos/ntoskrnl/kdbg/kdb_keyboard.c index e2af88fbdfc..9abf9f310d2 100644 --- a/reactos/ntoskrnl/kdbg/kdb_keyboard.c +++ b/reactos/ntoskrnl/kdbg/kdb_keyboard.c @@ -14,7 +14,6 @@ #define NDEBUG #include -#if 1 #define KBD_STATUS_REG 0x64 #define KBD_CNTL_REG 0x64 @@ -137,258 +136,4 @@ KdbpTryGetCharKeyboard(PULONG ScanCode, ULONG Retry) return -1; } -#endif - -#if 0 - -/* GLOBALS *******************************************************************/ - -/* - * Keyboard I/O ports. - */ -#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */ -#define K_STATUS 0x64 /* keybd status (read-only) */ -#define K_CMD 0x64 /* keybd ctlr command (write-only) */ - -/* - * Bit definitions for K_STATUS port. - */ -#define K_OBUF_FUL 0x01 /* output (from keybd) buffer full */ -#define K_IBUF_FUL 0x02 /* input (to keybd) buffer full */ -#define K_SYSFLAG 0x04 /* "System Flag" */ -#define K_CMD_DATA 0x08 /* 1 = input buf has cmd, 0 = data */ -#define K_KBD_INHIBIT 0x10 /* 0 if keyboard inhibited */ -#define K_AUX_OBUF_FUL 0x20 /* 1 = obuf holds aux device data */ -#define K_TIMEOUT 0x40 /* timout error flag */ -#define K_PARITY_ERROR 0x80 /* parity error flag */ - -/* - * Keyboard controller commands (sent to K_CMD port). - */ -#define KC_CMD_READ 0x20 /* read controller command byte */ -#define KC_CMD_WRITE 0x60 /* write controller command byte */ -#define KC_CMD_DIS_AUX 0xa7 /* disable auxiliary device */ -#define KC_CMD_ENB_AUX 0xa8 /* enable auxiliary device */ -#define KC_CMD_TEST_AUX 0xa9 /* test auxiliary device interface */ -#define KC_CMD_SELFTEST 0xaa /* keyboard controller self-test */ -#define KC_CMD_TEST 0xab /* test keyboard interface */ -#define KC_CMD_DUMP 0xac /* diagnostic dump */ -#define KC_CMD_DISABLE 0xad /* disable keyboard */ -#define KC_CMD_ENABLE 0xae /* enable keyboard */ -#define KC_CMD_RDKBD 0xc4 /* read keyboard ID */ -#define KC_CMD_WIN 0xd0 /* read output port */ -#define KC_CMD_WOUT 0xd1 /* write output port */ -#define KC_CMD_ECHO 0xee /* used for diagnostic testing */ -#define KC_CMD_PULSE 0xff /* pulse bits 3-0 based on low nybble */ - -/* - * Keyboard commands (send to K_RDWR). - */ -#define K_CMD_LEDS 0xed /* set status LEDs (caps lock, etc.) */ -#define K_CMD_TYPEMATIC 0xf3 /* set key repeat and delay */ - -/* - * Bit definitions for controller command byte (sent following - * KC_CMD_WRITE command). - * - * Bits 0x02 and 0x80 unused, always set to 0. - */ -#define K_CB_ENBLIRQ 0x01 /* enable data-ready intrpt */ -#define K_CB_SETSYSF 0x04 /* Set System Flag */ -#define K_CB_INHBOVR 0x08 /* Inhibit Override */ -#define K_CB_DISBLE 0x10 /* disable keyboard */ -#define K_CB_IGNPARITY 0x20 /* ignore parity from keyboard */ -#define K_CB_SCAN 0x40 /* standard scan conversion */ - -/* - * Bit definitions for "Indicator Status Byte" (sent after a - * K_CMD_LEDS command). If the bit is on, the LED is on. Undefined - * bit positions must be 0. - */ -#define K_LED_SCRLLK 0x1 /* scroll lock */ -#define K_LED_NUMLK 0x2 /* num lock */ -#define K_LED_CAPSLK 0x4 /* caps lock */ - -/* - * Bit definitions for "Miscellaneous port B" (K_PORTB). - */ -/* read/write */ -#define K_ENABLETMR2 0x01 /* enable output from timer 2 */ -#define K_SPKRDATA 0x02 /* direct input to speaker */ -#define K_ENABLEPRTB 0x04 /* "enable" port B */ -#define K_EIOPRTB 0x08 /* enable NMI on parity error */ -/* read-only */ -#define K_REFRESHB 0x10 /* refresh flag from INLTCONT PAL */ -#define K_OUT2B 0x20 /* timer 2 output */ -#define K_ICKB 0x40 /* I/O channel check (parity error) */ - -/* - * Bit definitions for the keyboard controller's output port. - */ -#define KO_SYSRESET 0x01 /* processor reset */ -#define KO_GATE20 0x02 /* A20 address line enable */ -#define KO_AUX_DATA_OUT 0x04 /* output data to auxiliary device */ -#define KO_AUX_CLOCK 0x08 /* auxiliary device clock */ -#define KO_OBUF_FUL 0x10 /* keyboard output buffer full */ -#define KO_AUX_OBUF_FUL 0x20 /* aux device output buffer full */ -#define KO_CLOCK 0x40 /* keyboard clock */ -#define KO_DATA_OUT 0x80 /* output data to keyboard */ - -/* - * Keyboard return codes. - */ -#define K_RET_RESET_DONE 0xaa /* BAT complete */ -#define K_RET_ECHO 0xee /* echo after echo command */ -#define K_RET_ACK 0xfa /* ack */ -#define K_RET_RESET_FAIL 0xfc /* BAT error */ -#define K_RET_RESEND 0xfe /* resend request */ - -#define SHIFT -1 -#define CTRL -2 -#define META -3 - -static char keymap[128][2] = { - {0}, /* 0 */ - {27, 27}, /* 1 - ESC */ - {'1', '!'}, /* 2 */ - {'2', '@'}, - {'3', '#'}, - {'4', '$'}, - {'5', '%'}, - {'6', '^'}, - {'7', '&'}, - {'8', '*'}, - {'9', '('}, - {'0', ')'}, - {'-', '_'}, - {'=', '+'}, - {8, 8}, /* 14 - Backspace */ - {'\t', '\t'}, /* 15 */ - {'q', 'Q'}, - {'w', 'W'}, - {'e', 'E'}, - {'r', 'R'}, - {'t', 'T'}, - {'y', 'Y'}, - {'u', 'U'}, - {'i', 'I'}, - {'o', 'O'}, - {'p', 'P'}, - {'[', '{'}, - {']', '}'}, /* 27 */ - {'\r', '\r'}, /* 28 - Enter */ - {CTRL, CTRL}, /* 29 - Ctrl */ - {'a', 'A'}, /* 30 */ - {'s', 'S'}, - {'d', 'D'}, - {'f', 'F'}, - {'g', 'G'}, - {'h', 'H'}, - {'j', 'J'}, - {'k', 'K'}, - {'l', 'L'}, - {';', ':'}, - {'\'', '"'}, /* 40 */ - {'`', '~'}, /* 41 */ - {SHIFT, SHIFT}, /* 42 - Left Shift */ - {'\\', '|'}, /* 43 */ - {'z', 'Z'}, /* 44 */ - {'x', 'X'}, - {'c', 'C'}, - {'v', 'V'}, - {'b', 'B'}, - {'n', 'N'}, - {'m', 'M'}, - {',', '<'}, - {'.', '>'}, - {'/', '?'}, /* 53 */ - {SHIFT, SHIFT}, /* 54 - Right Shift */ - {0, 0}, /* 55 - Print Screen */ - {META, META}, /* 56 - Alt */ - {' ', ' '}, /* 57 - Space bar */ - {0, 0}, /* 58 - Caps Lock */ - {0, 0}, /* 59 - F1 */ - {0, 0}, /* 60 - F2 */ - {0, 0}, /* 61 - F3 */ - {0, 0}, /* 62 - F4 */ - {0, 0}, /* 63 - F5 */ - {0, 0}, /* 64 - F6 */ - {0, 0}, /* 65 - F7 */ - {0, 0}, /* 66 - F8 */ - {0, 0}, /* 67 - F9 */ - {0, 0}, /* 68 - F10 */ - {0, 0}, /* 69 - Num Lock */ - {0, 0}, /* 70 - Scroll Lock */ - {'7', '7'}, /* 71 - Numeric keypad 7 */ - {'8', '8'}, /* 72 - Numeric keypad 8 */ - {'9', '9'}, /* 73 - Numeric keypad 9 */ - {'-', '-'}, /* 74 - Numeric keypad '-' */ - {'4', '4'}, /* 75 - Numeric keypad 4 */ - {'5', '5'}, /* 76 - Numeric keypad 5 */ - {'6', '6'}, /* 77 - Numeric keypad 6 */ - {'+', '+'}, /* 78 - Numeric keypad '+' */ - {'1', '1'}, /* 79 - Numeric keypad 1 */ - {'2', '2'}, /* 80 - Numeric keypad 2 */ - {'3', '3'}, /* 81 - Numeric keypad 3 */ - {'0', '0'}, /* 82 - Numeric keypad 0 */ - {'.', '.'}, /* 83 - Numeric keypad '.' */ -}; - -/* FUNCTIONS *****************************************************************/ - -/* - * Quick poll for a pending input character. - * Returns a character if available, -1 otherwise. This routine can return - * false negatives in the following cases: - * - * - a valid character is in transit from the keyboard when called - * - a key release is received (from a previous key press) - * - a SHIFT key press is received (shift state is recorded however) - * - a key press for a multi-character sequence is received - * - * Yes, this is horrible. - */ -ULONG -KdbpTryGetCharKeyboard(VOID) -{ - static unsigned shift_state, ctrl_state, meta_state; - unsigned scan_code, ch; - - /* See if a scan code is ready, returning if none. */ - if ((READ_PORT_UCHAR((PUCHAR)K_STATUS) & K_OBUF_FUL) == 0) { - return -1; - } - scan_code = READ_PORT_UCHAR((PUCHAR)K_RDWR); - - /* Handle key releases - only release of SHIFT is important. */ - if (scan_code & 0x80) { - scan_code &= 0x7f; - if (keymap[scan_code][0] == SHIFT) - shift_state = 0; - else if (keymap[scan_code][0] == CTRL) - ctrl_state = 0; - else if (keymap[scan_code][0] == META) - meta_state = 0; - ch = -1; - } else { - /* Translate the character through the keymap. */ - ch = keymap[scan_code][shift_state] | meta_state; - if (ch == SHIFT) { - shift_state = 1; - ch = -1; - } else if (ch == CTRL) { - ctrl_state = 1; - ch = -1; - } else if (ch == META) { - meta_state = 0200; - ch = -1; - } else if (ch == 0) - ch = -1; - else if (ctrl_state) - ch = (keymap[scan_code][1] - '@') | meta_state; - } - - return ch; -} - -#endif +/* EOF */ From 30a7c1f02fdbd0bdf6a6072f90f566f177435424 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 22 Jun 2009 11:32:25 +0000 Subject: [PATCH 032/577] Change GDB stub. svn path=/trunk/; revision=41533 --- reactos/ntoskrnl/kd/wrappers/gdbstub.c | 530 ++++++++++--------------- 1 file changed, 212 insertions(+), 318 deletions(-) diff --git a/reactos/ntoskrnl/kd/wrappers/gdbstub.c b/reactos/ntoskrnl/kd/wrappers/gdbstub.c index eaa99022701..17e45f18fde 100644 --- a/reactos/ntoskrnl/kd/wrappers/gdbstub.c +++ b/reactos/ntoskrnl/kd/wrappers/gdbstub.c @@ -11,76 +11,17 @@ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ****************************************************************************/ - /**************************************************************************** - * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $ - * - * Module name: remcom.c $ - * Revision: 1.34 $ - * Date: 91/03/09 12:29:49 $ * Contributor: Lake Stevens Instrument Division$ * * Description: low level support for gdb debugger. $ * - * Considerations: only works on target hardware $ - * * Written by: Glenn Engel $ * ModuleState: Experimental $ * - * NOTES: See Below $ - * * Modified for 386 by Jim Kingdon, Cygnus Support. * Modified for ReactOS by Casper S. Hornstrup * - * To enable debugger support, two things need to happen. One, setting - * up a routine so that it is in the exception path, is necessary in order - * to allow any breakpoints or error conditions to be properly intercepted - * and reported to gdb. - * Two, a breakpoint needs to be generated to begin communication. - * - * Because gdb will sometimes write to the stack area to execute function - * calls, this program cannot rely on using the supervisor stack so it - * uses it's own stack area. - * - ************* - * - * The following gdb commands are supported: - * - * command function Return value - * - * g return the value of the CPU Registers hex data or ENN - * G set the value of the CPU Registers OK or ENN - * - * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN - * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN - * - * c Resume at current address SNN ( signal NN) - * cAA..AA Continue at address AA..AA SNN - * - * s Step one instruction SNN - * sAA..AA Step one instruction from AA..AA SNN - * - * k kill - * - * ? What was the last sigval ? SNN (signal NN) - * - * All commands and responses are sent with a packet which includes a - * Checksum. A packet consists of - * - * $#. - * - * where - * :: - * :: < two hex digits computed as modulo 256 sum of > - * - * When a packet is received, it is first acknowledged with either '+' or '-'. - * '+' indicates a successful transfer. '-' indicates a failed transfer. - * - * Example: - * - * Host: Reply: - * $m0,10#2a +$00010203040506070809101112131415#42 - * ****************************************************************************/ #include @@ -88,12 +29,8 @@ #include /************************************************************************/ -/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/ -/* at least NUMREGBYTES*2 are needed for register packets */ -#define BUFMAX 1000 static BOOLEAN GspInitialized; - static BOOLEAN GspRemoteDebug; static CONST CHAR HexChars[]="0123456789abcdef"; @@ -105,7 +42,12 @@ static PETHREAD GspEnumThread; static FAST_MUTEX GspLock; extern LIST_ENTRY PsActiveProcessHead; -KD_PORT_INFORMATION GdbPortInfo = { 2, 115200, 0 }; /* FIXME hardcoded for COM2, 115200 baud */ + +/* FIXME hardcoded for COM2, 115200 baud */ +KD_PORT_INFORMATION GdbPortInfo = { 2, 115200, 0 }; + +static CHAR GspInBuffer[1000]; +static CHAR GspOutBuffer[1000]; /* Number of Registers. */ #define NUMREGS 16 @@ -178,8 +120,6 @@ HexValue(CHAR ch) return -1; } -static CHAR GspInBuffer[BUFMAX]; -static CHAR GspOutBuffer[BUFMAX]; VOID GdbPutChar(UCHAR Value) @@ -199,7 +139,6 @@ GdbGetChar(VOID) } /* scan for the sequence $# */ - PCHAR GspGetPacket() { @@ -221,7 +160,7 @@ GspGetPacket() Count = 0; /* now, read until a # or end of Buffer is found */ - while (Count < BUFMAX) + while (Count < sizeof(GspInBuffer) - 1) { ch = GdbGetChar(); if (ch == '$') @@ -260,7 +199,6 @@ GspGetPacket() } /* send the packet in Buffer. */ - VOID GspPutPacket(PCHAR Buffer) { @@ -314,19 +252,25 @@ GspPutPacketNoWait(PCHAR Buffer) GdbPutChar(HexChars[Checksum & 0xf]); } -/* Indicate to caller of GspMem2Hex or GspHex2Mem that there has been an - error. */ +/* Indicate to caller of GspMem2Hex or GspHex2Mem that there has been an error. */ static volatile BOOLEAN GspMemoryError = FALSE; -static volatile void *GspAccessLocation = NULL; static CHAR GspReadMemSafe(PCHAR Address) { - CHAR ch; - KdpSafeReadMemory((ULONG_PTR)Address, 1, &ch); + CHAR ch = 0; + if (!KdpSafeReadMemory((ULONG_PTR)Address, 1, &ch)) + GspMemoryError = TRUE; return ch; } +static void +GspWriteMemSafe(PCHAR Address, CHAR Ch) +{ + if (!KdpSafeWriteMemory((ULONG_PTR)Address, 1, Ch)) + GspMemoryError = TRUE; +} + /* Convert the memory pointed to by Address into hex, placing result in Buffer */ /* Return a pointer to the last char put in Buffer (null) */ /* If MayFault is TRUE, then we should set GspMemoryError in response to @@ -375,7 +319,6 @@ GspWriteMem(PCHAR Address, ULONG CountInPage; ULONG i; CHAR ch; - ULONG OldProt = 0; Current = Address; while (Current < Address + Count) @@ -391,11 +334,6 @@ GspWriteMem(PCHAR Address, /* Flows into next page, handle only current page in this iteration */ CountInPage = PAGE_SIZE - (Address - Page); } - if (MayFault) - { - OldProt = MmGetPageProtect(NULL, Address); - MmSetPageProtect(NULL, Address, PAGE_EXECUTE_READWRITE); - } for (i = 0; i < CountInPage && ! GspMemoryError; i++) { @@ -403,18 +341,17 @@ GspWriteMem(PCHAR Address, if (MayFault) { - GspAccessLocation = Current; + GspWriteMemSafe(Current, ch); } - *Current = ch; - if (MayFault) + else { - GspAccessLocation = NULL; + *Current = ch; } + Current++; } if (MayFault) { - MmSetPageProtect(NULL, Page, OldProt); if (GspMemoryError) { return Current - Address; @@ -432,8 +369,8 @@ GspHex2MemGetContent(PVOID Context, ULONG Offset) HexValue(*((PCHAR) Context + 2 * Offset + 1))); } -/* Convert the hex array pointed to by Buffer into binary to be placed at Address */ -/* Return a pointer to the character AFTER the last byte read from Buffer */ +/* Convert the hex array pointed to by Buffer into binary to be placed at Address + * Return a pointer to the character AFTER the last byte read from Buffer */ static PCHAR GspHex2Mem(PCHAR Buffer, PCHAR Address, @@ -445,49 +382,6 @@ GspHex2Mem(PCHAR Buffer, return Buffer + 2 * Count; } -static void -GspWriteMemSafe(PCHAR Address, - CHAR Ch) -{ - KdpSafeWriteMemory((ULONG_PTR)Address, 1, Ch); -} - - -/* This function takes the 386 exception vector and attempts to - translate this number into a unix compatible signal value */ -ULONG -GspComputeSignal(NTSTATUS ExceptionCode) -{ - ULONG SigVal; - - switch (ExceptionCode) - { - case STATUS_INTEGER_DIVIDE_BY_ZERO: - SigVal = 8; /* divide by zero */ - break; - case STATUS_SINGLE_STEP: - case STATUS_BREAKPOINT: - SigVal = 5; /* breakpoint */ - break; - case STATUS_INTEGER_OVERFLOW: - case STATUS_ARRAY_BOUNDS_EXCEEDED: - SigVal = 16; /* bound instruction */ - break; - case STATUS_ILLEGAL_INSTRUCTION: - SigVal = 4; /* Invalid opcode */ - break; - case STATUS_STACK_OVERFLOW: - case STATUS_DATATYPE_MISALIGNMENT: - case STATUS_ACCESS_VIOLATION: - SigVal = 11; /* access violation */ - break; - default: - SigVal = 7; /* "software generated" */ - } - return SigVal; -} - - /**********************************************/ /* WHILE WE FIND NICE HEX CHARS, BUILD A LONG */ /* RETURN NUMBER OF CHARS PROCESSED */ @@ -932,6 +826,15 @@ GspQuery(PCHAR Request) GspMem2Hex(Buffer, &GspOutBuffer[0], strlen(Buffer), FALSE); } } + else if (strncmp(Request, "Supported", 9) == 0) + { + /* tell maximum incoming packet size */ + sprintf(GspOutBuffer, "PacketSize=%u", sizeof(GspInBuffer) - 1); + } + else if (strncmp(Request, "Rcmd,", 5) == 0) + { + ; + } } VOID @@ -955,6 +858,8 @@ GspQueryThreadStatus(PCHAR Request) } } +#define DR6_BS 0x00004000 /* Single step */ + #define DR7_L0 0x00000001 /* Local breakpoint 0 enable */ #define DR7_G0 0x00000002 /* Global breakpoint 0 enable */ #define DR7_L1 0x00000004 /* Local breakpoint 1 enable */ @@ -1011,7 +916,6 @@ typedef struct _GSPSWBREAKPOINT #define MAX_SW_BREAKPOINTS 64 static unsigned GspSwBreakpointCount = 0; static GSPSWBREAKPOINT GspSwBreakpoints[MAX_SW_BREAKPOINTS]; -static CHAR GspSwBreakpointsInstructions[MAX_SW_BREAKPOINTS]; static void GspSetHwBreakpoint(ULONG Type, ULONG_PTR Address, ULONG Length) @@ -1085,6 +989,21 @@ GspRemoveHwBreakpoint(ULONG Type, ULONG_PTR Address, ULONG Length) strcpy(GspOutBuffer, "E22"); } +static BOOLEAN +GspFindSwBreakpoint(ULONG_PTR Address, PULONG PIndex) +{ + ULONG Index; + + for (Index = 0; Index < GspSwBreakpointCount; Index++) + if (GspSwBreakpoints[Index].Address == Address) + { + if (PIndex) *PIndex = Index; + return TRUE; + } + + return FALSE; +} + static void GspSetSwBreakpoint(ULONG_PTR Address) { @@ -1094,61 +1013,44 @@ GspSetSwBreakpoint(ULONG_PTR Address) { DPRINT1("Trying to set too many software breakpoints\n"); strcpy(GspOutBuffer, "E22"); + return; } - else + + if (GspFindSwBreakpoint(Address, NULL)) { - unsigned Index; - - for (Index = 0; Index < GspSwBreakpointCount; Index++) - { - if (GspSwBreakpoints[Index].Address == Address) - { - strcpy(GspOutBuffer, "E22"); - return; - } - } - - DPRINT("Stored at index %u\n", GspSwBreakpointCount); - GspSwBreakpoints[GspSwBreakpointCount].Address = Address; - GspSwBreakpoints[GspSwBreakpointCount].Active = FALSE; - GspSwBreakpointsInstructions[GspSwBreakpointCount] = - GspReadMemSafe((PCHAR )Address); - GspWriteMemSafe((PCHAR )Address, 0xCC); - GspSwBreakpointCount++; - strcpy(GspOutBuffer, "OK"); + strcpy(GspOutBuffer, "E22"); + return; } + + DPRINT("Stored at index %u\n", GspSwBreakpointCount); + GspSwBreakpoints[GspSwBreakpointCount].Address = Address; + GspSwBreakpoints[GspSwBreakpointCount].Active = FALSE; + GspSwBreakpointCount++; + strcpy(GspOutBuffer, "OK"); } static void GspRemoveSwBreakpoint(ULONG_PTR Address) { - unsigned Index; + ULONG Index; DPRINT("GspRemoveSwBreakpoint(0x%p)\n", Address); - for (Index = 0; Index < GspSwBreakpointCount; Index++) + + if (GspFindSwBreakpoint(Address, &Index)) { - if (GspSwBreakpoints[Index].Address == Address) + DPRINT("Found match at index %u\n", Index); + ASSERT(! GspSwBreakpoints[Index].Active); + + if (Index + 1 < GspSwBreakpointCount) { - DPRINT("Found match at index %u\n", Index); - ASSERT(! GspSwBreakpoints[Index].Active); - - GspWriteMemSafe((PCHAR )Address, - GspSwBreakpointsInstructions[Index]); - - if (Index + 1 < GspSwBreakpointCount) - { - memmove(GspSwBreakpoints + Index, - GspSwBreakpoints + (Index + 1), - (GspSwBreakpointCount - Index - 1) * - sizeof(GSPSWBREAKPOINT)); - memmove(GspSwBreakpointsInstructions + Index, - GspSwBreakpointsInstructions + (Index + 1), - (GspSwBreakpointCount - Index - 1) * sizeof(CHAR)); - } - GspSwBreakpointCount--; - strcpy(GspOutBuffer, "OK"); - return; + memmove(GspSwBreakpoints + Index, + GspSwBreakpoints + (Index + 1), + (GspSwBreakpointCount - Index - 1) * + sizeof(GSPSWBREAKPOINT)); } + GspSwBreakpointCount--; + strcpy(GspOutBuffer, "OK"); + return; } DPRINT1("Not found\n"); @@ -1194,6 +1096,28 @@ GspLoadHwBreakpoint(PKTRAP_FRAME TrapFrame, } } +static void +GspLoadSwBreakpoint(ULONG Index) +{ + GspMemoryError = FALSE; + GspSwBreakpoints[Index].PrevContent = GspReadMemSafe((PCHAR) GspSwBreakpoints[Index].Address); + if (! GspMemoryError) + { + GspWriteMemSafe((PCHAR) GspSwBreakpoints[Index].Address, I386_OPCODE_INT3); + } + GspSwBreakpoints[Index].Active = ! GspMemoryError; + if (GspMemoryError) + { + DPRINT1("Failed to set software breakpoint at 0x%p\n", + GspSwBreakpoints[Index].Address); + } + else + { + DPRINT("Successfully set software breakpoint at 0x%p\n", + GspSwBreakpoints[Index].Address); + } +} + static void GspLoadBreakpoints(PKTRAP_FRAME TrapFrame) { @@ -1202,6 +1126,7 @@ GspLoadBreakpoints(PKTRAP_FRAME TrapFrame) DPRINT("GspLoadBreakpoints\n"); DPRINT("DR7 on entry: 0x%08x\n", TrapFrame->Dr7); + /* Remove all breakpoints */ TrapFrame->Dr7 &= ~(DR7_L0 | DR7_L1 | DR7_L2 | DR7_L3 | DR7_G0 | DR7_G1 | DR7_G2 | DR7_G3 | @@ -1235,47 +1160,22 @@ GspLoadBreakpoints(PKTRAP_FRAME TrapFrame) for (Index = 0; Index < GspSwBreakpointCount; Index++) { - if (GspHwBreakpointCount + Index < MAX_HW_BREAKPOINTS) - { - DPRINT("Implementing software interrupt using hardware register\n"); - GspLoadHwBreakpoint(TrapFrame, GspHwBreakpointCount + Index, - GspSwBreakpoints[Index].Address, 0, - I386_BP_TYPE_EXECUTE); - GspSwBreakpoints[Index].Active = FALSE; - } - else - { - DPRINT("Using real software breakpoint\n"); - GspMemoryError = FALSE; - GspSwBreakpoints[Index].PrevContent = GspReadMemSafe((PCHAR) GspSwBreakpoints[Index].Address); - if (! GspMemoryError) - { - GspWriteMemSafe((PCHAR) GspSwBreakpoints[Index].Address, I386_OPCODE_INT3); - } - GspSwBreakpoints[Index].Active = ! GspMemoryError; - if (GspMemoryError) - { - DPRINT1("Failed to set software breakpoint at 0x%p\n", - GspSwBreakpoints[Index].Address); - } - else - { - DPRINT("Successfully set software breakpoint at 0x%p\n", - GspSwBreakpoints[Index].Address); - DPRINT1("Successfully set software breakpoint at 0x%p\n", GspSwBreakpoints[Index].Address); - } - } + DPRINT("Using real software breakpoint\n"); + GspLoadSwBreakpoint(Index); } DPRINT("Final DR7 value 0x%08x\n", TrapFrame->Dr7); } static void -GspUnloadBreakpoints(PKTRAP_FRAME TrapFrame) +GspUnloadBreakpoints(void) { unsigned Index; - DPRINT("GspUnloadHwBreakpoints\n"); + DPRINT("GspUnloadBreakpoints\n"); + + /* Disable hardware debugging while we are inside the stub */ + Ke386SetDr7(0); for (Index = 0; Index < GspSwBreakpointCount; Index++) { @@ -1299,62 +1199,37 @@ GspUnloadBreakpoints(PKTRAP_FRAME TrapFrame) } } -static BOOLEAN gdb_attached_yet = FALSE; -/* - * This function does all command procesing for interfacing to gdb. - */ -KD_CONTINUE_TYPE -NTAPI -KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, - PCONTEXT Context, - PKTRAP_FRAME TrapFrame) +static void +GspStopReply(NTSTATUS ExceptionCode, PKTRAP_FRAME TrapFrame) { - BOOLEAN Stepping; - LONG Address; - LONG Length; - LONG SigVal = 0; - LONG NewPC; - PCHAR ptr; + PCHAR ptr = GspOutBuffer; + ULONG SigVal; + LONG Esp; - /* FIXME: Stop on other CPUs too */ - - if (STATUS_ACCESS_VIOLATION == (NTSTATUS) ExceptionRecord->ExceptionCode && - NULL != GspAccessLocation && - (ULONG_PTR) GspAccessLocation == - (ULONG_PTR) ExceptionRecord->ExceptionInformation[1]) + switch (ExceptionCode) { - GspAccessLocation = NULL; - GspMemoryError = TRUE; - Context->Eip += 3; + case STATUS_INTEGER_DIVIDE_BY_ZERO: + SigVal = 8; /* divide by zero */ + break; + case STATUS_SINGLE_STEP: + case STATUS_BREAKPOINT: + SigVal = 5; /* breakpoint */ + break; + case STATUS_INTEGER_OVERFLOW: + case STATUS_ARRAY_BOUNDS_EXCEEDED: + SigVal = 16; /* bound instruction */ + break; + case STATUS_ILLEGAL_INSTRUCTION: + SigVal = 4; /* Invalid opcode */ + break; + case STATUS_STACK_OVERFLOW: + case STATUS_DATATYPE_MISALIGNMENT: + case STATUS_ACCESS_VIOLATION: + SigVal = 11; /* access violation */ + break; + default: + SigVal = 7; /* "software generated" */ } - else - { - DPRINT("Thread %p entering stub\n", PsGetCurrentThread()); - /* Can only debug 1 thread at a time... */ - ExAcquireFastMutex(&GspLock); - DPRINT("Thread %p acquired mutex\n", PsGetCurrentThread()); - - /* Disable hardware debugging while we are inside the stub */ - Ke386SetDr7(0); - GspUnloadBreakpoints(TrapFrame); - - /* Make sure we're debugging the current thread. */ - if (NULL != GspDbgThread) - { - DPRINT1("Internal error: entering stub with non-NULL GspDbgThread\n"); - ObDereferenceObject(GspDbgThread); - GspDbgThread = NULL; - } - - /* ugly hack to avoid attempting to send status at the very - * beginning, right when GDB is trying to query the stub */ - if (gdb_attached_yet) - { - LONG Esp; - - stop_reply: - /* reply to host that an exception has occurred */ - SigVal = GspComputeSignal(ExceptionRecord->ExceptionCode); ptr = GspOutBuffer; @@ -1380,33 +1255,67 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, *ptr++ = ';'; *ptr = '\0'; +} - GspPutPacket(&GspOutBuffer[0]); - /* DPRINT("------- replied status: (%s) -------\n", GspOutBuffer); */ + +/* + * This function does all command procesing for interfacing to GDB. + */ +KD_CONTINUE_TYPE +NTAPI +KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, + PCONTEXT Context, + PKTRAP_FRAME TrapFrame) +{ + static BOOLEAN GdbAttached = FALSE; + BOOLEAN Stepping = FALSE; + NTSTATUS ExceptionCode; + LONG Address; + LONG Length; + PCHAR ptr; + + /* FIXME: Stop on other CPUs too */ + + DPRINT("Thread %p entering stub\n", PsGetCurrentThread()); + ExceptionCode = (NTSTATUS) ExceptionRecord->ExceptionCode; + + /* Can only debug 1 thread at a time... */ + ExAcquireFastMutex(&GspLock); + DPRINT("Thread %p acquired mutex\n", PsGetCurrentThread()); + + GspUnloadBreakpoints(); + + /* Make sure we're debugging the current thread. */ + if (NULL != GspDbgThread) + { + DPRINT1("Internal error: entering stub with non-NULL GspDbgThread\n"); + ObDereferenceObject(GspDbgThread); + GspDbgThread = NULL; + } + + if (GdbAttached) + { + GspStopReply(ExceptionCode, TrapFrame); + GspPutPacket(GspOutBuffer); + // DbgPrint(">>> (%s) >>>\n", GspOutBuffer); } else { - gdb_attached_yet = 1; + GdbAttached = TRUE; } - Stepping = FALSE; - while (TRUE) { /* Zero the buffer now so we don't have to worry about the terminating zero character */ - memset(GspOutBuffer, 0, sizeof(GspInBuffer)); + memset(GspOutBuffer, 0, sizeof(GspOutBuffer)); ptr = GspGetPacket(); - /* DPRINT("------- Get (%s) command -------\n", ptr); */ + // DbgPrint("<<< (%s) <<<\n", ptr); switch(*ptr++) { case '?': /* a little hack to send more complete status information */ - goto stop_reply; - GspOutBuffer[0] = 'S'; - GspOutBuffer[1] = HexChars[SigVal >> 4]; - GspOutBuffer[2] = HexChars[SigVal % 16]; - GspOutBuffer[3] = 0; + GspStopReply(ExceptionCode, TrapFrame); break; case 'd': GspRemoteDebug = !GspRemoteDebug; /* toggle debug flag */ @@ -1478,7 +1387,7 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, if (GspMemoryError) { strcpy(GspOutBuffer, "E03"); - DPRINT("Fault during memory read\n"); + DPRINT1("Fault during memory read\n"); } } @@ -1514,7 +1423,7 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, if (GspMemoryError) { strcpy(GspOutBuffer, "E03"); - DPRINT("Fault during memory write\n"); + DPRINT1("Fault during memory write\n"); } else { @@ -1537,55 +1446,49 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, case 'c': { ULONG BreakpointNumber; - ULONG dr6_; + ULONG Dr6; - /* try to read optional parameter, pc unchanged if no parm */ + /* try to read optional parameter, pc changed if param */ if (GspHex2Long (&ptr, &Address)) { Context->Eip = Address; } - - NewPC = Context->Eip; + else if (ExceptionCode == STATUS_BREAKPOINT) + { + if (GspReadMemSafe((PCHAR) Context->Eip) == (CHAR) I386_OPCODE_INT3) + { + Context->Eip++; + } + } /* clear the trace bit */ - Context->EFlags &= 0xfffffeff; + Context->EFlags &= ~EFLAGS_TF; /* set the trace bit if we're Stepping */ if (Stepping) { - Context->EFlags |= 0x100; + Context->EFlags |= EFLAGS_TF; } -#if defined(__GNUC__) - asm volatile ("movl %%db6, %0\n" : "=r" (dr6_) : ); -#elif defined(_MSC_VER) - __asm mov eax, dr6 __asm mov dr6_, eax; -#else -#error Unknown compiler for inline assembler -#endif - if (!(dr6_ & 0x4000)) + Dr6 = Ke386GetDr6(); + if (!(Dr6 & DR6_BS)) { - for (BreakpointNumber = 0; BreakpointNumber < 4; ++BreakpointNumber) + for (BreakpointNumber = 0; BreakpointNumber < MAX_HW_BREAKPOINTS; ++BreakpointNumber) { - if (dr6_ & (1 << BreakpointNumber)) + if (Dr6 & (1 << BreakpointNumber)) { - if (GspHwBreakpoints[BreakpointNumber].Type == 0) + if (GspHwBreakpoints[BreakpointNumber].Type == I386_BP_TYPE_EXECUTE) { /* Set restore flag */ - Context->EFlags |= 0x10000; + Context->EFlags |= EFLAGS_RF; break; } } } } + GspLoadBreakpoints(TrapFrame); -#if defined(__GNUC__) - asm volatile ("movl %0, %%db6\n" : : "r" (0)); -#elif defined(_MSC_VER) - __asm mov eax, 0 __asm mov dr6, eax; -#else -#error Unknown compiler for inline assembler -#endif + Ke386SetDr6(0); if (NULL != GspDbgThread) { @@ -1596,14 +1499,19 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, DPRINT("Thread %p releasing mutex\n", PsGetCurrentThread()); ExReleaseFastMutex(&GspLock); DPRINT("Thread %p leaving stub\n", PsGetCurrentThread()); - return kdContinue; - break; + + if (ExceptionCode == STATUS_BREAKPOINT || + ExceptionCode == STATUS_SINGLE_STEP) + { + return kdContinue; + } + + return kdHandleException; } case 'k': /* kill the program */ strcpy(GspOutBuffer, "OK"); break; - /* kill the program */ case 'H': /* Set thread */ GspSetThread(ptr); @@ -1630,11 +1538,11 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, GspHex2Long(&ptr, &Length); if (0 == Type) { - GspSetSwBreakpoint((ULONG_PTR) Address); + GspSetSwBreakpoint((ULONG_PTR) Address); } else { - GspSetHwBreakpoint(Type, (ULONG_PTR) Address, Length); + GspSetHwBreakpoint(Type, (ULONG_PTR) Address, Length); } break; } @@ -1652,11 +1560,11 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, GspHex2Long(&ptr, &Length); if (0 == Type) { - GspRemoveSwBreakpoint((ULONG_PTR) Address); + GspRemoveSwBreakpoint((ULONG_PTR) Address); } else { - GspRemoveHwBreakpoint(Type, (ULONG_PTR) Address, Length); + GspRemoveHwBreakpoint(Type, (ULONG_PTR) Address, Length); } break; } @@ -1667,20 +1575,8 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, /* reply to the request */ GspPutPacket(GspOutBuffer); - /* DPRINT("------- reply command (%s) -------\n", GspOutBuffer); */ + // DbgPrint(">>> (%s) >>>\n", GspOutBuffer); } - - /* not reached */ - ASSERT(0); - } - - if (NULL != GspDbgThread) - { - ObDereferenceObject(GspDbgThread); - GspDbgThread = NULL; - } - - return kdContinue; } @@ -1754,8 +1650,6 @@ KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable, /* Initialize the Port */ KdPortInitializeEx(&GdbPortInfo, 0, 0); - - KdpPort = GdbPortInfo.ComPort; } else if (BootPhase == 1) { From ae5cb55a9c4a2adfa7fb4738c1ba7cfbb376ae4d Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 22 Jun 2009 11:32:58 +0000 Subject: [PATCH 033/577] - If KDBG is not compiled in, try to use GDB instead. - Check WrapperTable.KdpPrintRoutine. - Allow to use GDB (/DEBUGPORT=GDB) and have debug output (/DEBUGPORT=COM1) at the same time. svn path=/trunk/; revision=41534 --- reactos/ntoskrnl/kd/kdinit.c | 92 ++++++++++++++++-------------------- reactos/ntoskrnl/kd/kdio.c | 4 +- reactos/ntoskrnl/kd/kdmain.c | 10 ++++ 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/reactos/ntoskrnl/kd/kdinit.c b/reactos/ntoskrnl/kd/kdinit.c index 1633af11efd..aae380e922a 100644 --- a/reactos/ntoskrnl/kd/kdinit.c +++ b/reactos/ntoskrnl/kd/kdinit.c @@ -42,47 +42,6 @@ PKDP_INIT_ROUTINE InitRoutines[KdMax] = {KdpScreenInit, /* PRIVATE FUNCTIONS *********************************************************/ -PCHAR -NTAPI -KdpGetWrapperDebugMode(PCHAR Currentp2, - PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - PCHAR p2 = Currentp2; - - /* Check for GDB Debugging */ - if (!_strnicmp(p2, "GDB", 3)) - { - /* Enable it */ - p2 += 3; - KdpDebugMode.Gdb = TRUE; - - /* Enable Debugging */ - KdDebuggerEnabled = TRUE; - KdDebuggerNotPresent = FALSE; - WrapperInitRoutine = KdpGdbStubInit; - } - - /* Check for PICE Debugging */ - else if (!_strnicmp(p2, "PICE", 4)) - { - /* Enable it */ - p2 += 4; - KdpDebugMode.Pice = TRUE; - - /* Enable Debugging */ - KdDebuggerEnabled = TRUE; - KdDebuggerNotPresent = FALSE; - } - -#ifdef KDBG - /* Get the KDBG Settings and enable it */ - KdDebuggerEnabled = TRUE; - KdDebuggerNotPresent = FALSE; - KdbpGetCommandLineSettings(LoaderBlock->LoadOptions); -#endif - return p2; -} - PCHAR NTAPI KdpGetDebugMode(PCHAR Currentp2) @@ -129,6 +88,31 @@ KdpGetDebugMode(PCHAR Currentp2) KdpDebugMode.Bochs = TRUE; } + /* Check for GDB Debugging */ + else if (!_strnicmp(p2, "GDB", 3)) + { + /* Enable it */ + p2 += 3; + KdpDebugMode.Gdb = TRUE; + + /* Enable Debugging */ + KdDebuggerEnabled = TRUE; + KdDebuggerNotPresent = FALSE; + WrapperInitRoutine = KdpGdbStubInit; + } + + /* Check for PICE Debugging */ + else if (!_strnicmp(p2, "PICE", 4)) + { + /* Enable it */ + p2 += 4; + KdpDebugMode.Pice = TRUE; + + /* Enable Debugging */ + KdDebuggerEnabled = TRUE; + KdDebuggerNotPresent = FALSE; + } + return p2; } @@ -179,7 +163,7 @@ KdInitSystem(ULONG BootPhase, /* Upcase it */ _strupr(CommandLine); - /* Check for settings that we support */ + /* XXX Check for settings that we support */ if (strstr(CommandLine, "BREAK")) KdpEarlyBreak = TRUE; if (strstr(CommandLine, "NODEBUG")) KdDebuggerEnabled = FALSE; if (strstr(CommandLine, "CRASHDEBUG")) KdDebuggerEnabled = FALSE; @@ -190,16 +174,23 @@ KdInitSystem(ULONG BootPhase, KdpDebugMode.Serial = TRUE; } +#ifdef KDBG + /* Get the KDBG Settings and enable it */ + KdDebuggerEnabled = TRUE; + KdDebuggerNotPresent = FALSE; + KdbpGetCommandLineSettings(LoaderBlock->LoadOptions); +#endif + /* Get the port and baud rate */ Port = strstr(CommandLine, "DEBUGPORT"); BaudRate = strstr(CommandLine, "BAUDRATE"); Irq = strstr(CommandLine, "IRQ"); - /* Check if we got the /DEBUGPORT parameter */ - if (Port) + /* Check if we got the /DEBUGPORT parameter(s) */ + while (Port) { /* Move past the actual string, to reach the port*/ - Port += strlen("DEBUGPORT"); + Port += sizeof("DEBUGPORT") - 1; /* Now get past any spaces and skip the equal sign */ while (*Port == ' ') Port++; @@ -207,15 +198,14 @@ KdInitSystem(ULONG BootPhase, /* Get the debug mode and wrapper */ Port = KdpGetDebugMode(Port); - Port = KdpGetWrapperDebugMode(Port, LoaderBlock); - KdDebuggerEnabled = TRUE; + Port = strstr(Port, "DEBUGPORT"); } /* Check if we got a baud rate */ if (BaudRate) { /* Move past the actual string, to reach the rate */ - BaudRate += strlen("BAUDRATE"); + BaudRate += sizeof("BAUDRATE") - 1; /* Now get past any spaces */ while (*BaudRate == ' ') BaudRate++; @@ -233,7 +223,7 @@ KdInitSystem(ULONG BootPhase, if (Irq) { /* Move past the actual string, to reach the rate */ - Irq += strlen("IRQ"); + Irq += sizeof("IRQ") - 1; /* Now get past any spaces */ while (*Irq == ' ') Irq++; @@ -257,7 +247,7 @@ KdInitSystem(ULONG BootPhase, if (WrapperInitRoutine) WrapperInitRoutine(&WrapperTable, 0); return TRUE; } - else + else /* BootPhase > 0 */ { #ifdef _M_IX86 KdpEnableSafeMem(); @@ -271,4 +261,4 @@ KdInitSystem(ULONG BootPhase, return TRUE; } - /* EOF */ +/* EOF */ diff --git a/reactos/ntoskrnl/kd/kdio.c b/reactos/ntoskrnl/kd/kdio.c index a2fa6a0dc0f..6a520e49868 100644 --- a/reactos/ntoskrnl/kd/kdio.c +++ b/reactos/ntoskrnl/kd/kdio.c @@ -293,11 +293,11 @@ KdpPrintString(LPSTR String, } /* Call the Wrapper Routine */ - if (WrapperInitRoutine) WrapperTable.KdpPrintRoutine(String, Length); + if (WrapperTable.KdpPrintRoutine) + WrapperTable.KdpPrintRoutine(String, Length); /* Return the Length */ return Length; } /* EOF */ - diff --git a/reactos/ntoskrnl/kd/kdmain.c b/reactos/ntoskrnl/kd/kdmain.c index 1b4876582b6..2d736a8ecfe 100644 --- a/reactos/ntoskrnl/kd/kdmain.c +++ b/reactos/ntoskrnl/kd/kdmain.c @@ -163,12 +163,22 @@ KdpEnterDebuggerException(IN PKTRAP_FRAME TrapFrame, EipOld = Context->Eip; #endif +#ifdef KDBG /* Call KDBG if available */ Return = KdbEnterDebuggerException(ExceptionRecord, PreviousMode, Context, TrapFrame, !SecondChance); +#else /* not KDBG */ + if (WrapperInitRoutine) + { + /* Call GDB */ + Return = WrapperTable.KdpExceptionRoutine(ExceptionRecord, + Context, + TrapFrame); + } +#endif /* not KDBG */ /* Bump EIP over int 3 if debugger did not already change it */ if (ExceptionRecord->ExceptionCode == STATUS_BREAKPOINT) From 1fcd100e5075dc2d691945002ef4c1536227c995 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 22 Jun 2009 11:33:19 +0000 Subject: [PATCH 034/577] Remove unused functions. svn path=/trunk/; revision=41535 --- reactos/base/system/smss/smapi.c | 44 +--------------------- reactos/subsystems/win32/csrss/api/wapi.c | 45 ----------------------- 2 files changed, 1 insertion(+), 88 deletions(-) diff --git a/reactos/base/system/smss/smapi.c b/reactos/base/system/smss/smapi.c index df9e0c777bb..53595d751e4 100644 --- a/reactos/base/system/smss/smapi.c +++ b/reactos/base/system/smss/smapi.c @@ -285,49 +285,6 @@ SmpHandleConnectionRequest (PSM_PORT_MESSAGE Request) return Status; } -/********************************************************************** - * NAME - * SmpApiThread/1 - * - * DECRIPTION - * Due to differences in LPC implementation between NT and ROS, - * we need a thread to listen to for connection request that - * creates a new thread for each connected port. This is not - * necessary in NT LPC, because server side connected ports are - * never used to receive requests. - */ -#if 0 -VOID NTAPI -SmpApiThread (HANDLE ListeningPort) -{ - NTSTATUS Status = STATUS_SUCCESS; - SM_PORT_MESSAGE Request; - - DPRINT("SM: %s called\n", __FUNCTION__); - RtlZeroMemory(&Request, sizeof(PORT_MESSAGE)); - - while (TRUE) - { - Status = NtListenPort (ListeningPort, & Request.Header); - if (!NT_SUCCESS(Status)) - { - DPRINT1("SM: %s: NtListenPort() failed! (Status==x%08lx)\n", __FUNCTION__, Status); - break; - } - Status = SmpHandleConnectionRequest (& Request); - if(!NT_SUCCESS(Status)) - { - DPRINT1("SM: %s: SmpHandleConnectionRequest failed (Status=0x%08lx)\n", - __FUNCTION__, Status); - break; - } - } - /* Cleanup */ - NtClose(ListeningPort); - /* DIE */ - NtTerminateThread(NtCurrentThread(), Status); -} -#endif /* LPC PORT INITIALIZATION **************************************************/ @@ -360,6 +317,7 @@ SmCreateApiPort(VOID) { return(Status); } + /* * Create one thread for the named LPC * port \SmApiPort diff --git a/reactos/subsystems/win32/csrss/api/wapi.c b/reactos/subsystems/win32/csrss/api/wapi.c index db10d67dd56..50e2fef3c85 100644 --- a/reactos/subsystems/win32/csrss/api/wapi.c +++ b/reactos/subsystems/win32/csrss/api/wapi.c @@ -300,51 +300,6 @@ ClientConnectionThread(HANDLE ServerPort) RtlExitUserThread(STATUS_SUCCESS); } -/********************************************************************** - * NAME - * ServerApiPortThread/1 - * - * DESCRIPTION - * Handle connection requests from clients to the port - * "\Windows\ApiPort". - */ -#if 0 -DWORD WINAPI -ServerApiPortThread (HANDLE hApiListenPort) -{ - NTSTATUS Status = STATUS_SUCCESS; - BYTE RawRequest[sizeof(PORT_MESSAGE) + sizeof(CSR_CONNECTION_INFO)]; - PPORT_MESSAGE Request = (PPORT_MESSAGE)RawRequest; - - DPRINT("CSR: %s called", __FUNCTION__); - - for (;;) - { - REMOTE_PORT_VIEW LpcRead; - LpcRead.Length = sizeof(LpcRead); - - Status = NtListenPort (hApiListenPort, Request); - if (!NT_SUCCESS(Status)) - { - DPRINT1("CSR: NtListenPort() failed, status=%x\n", Status); - break; - } - - Status = CsrpHandleConnectionRequest(Request, hApiListenPort); - if(!NT_SUCCESS(Status)) - { - DPRINT1("CSR: %s: SmpHandleConnectionRequest failed (Status=0x%08lx)\n", - __FUNCTION__, Status); - break; - } - } - - NtClose(hApiListenPort); - NtTerminateThread(NtCurrentThread(), Status); - return 0; -} -#endif - /********************************************************************** * NAME * ServerSbApiPortThread/1 From d103f7f548a1da15dbac9e3451836ae756f22a33 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 22 Jun 2009 13:26:12 +0000 Subject: [PATCH 035/577] [FORMATTING] svn path=/trunk/; revision=41537 --- reactos/ntoskrnl/kd/wrappers/gdbstub.c | 1951 ++++++++++++------------ 1 file changed, 935 insertions(+), 1016 deletions(-) diff --git a/reactos/ntoskrnl/kd/wrappers/gdbstub.c b/reactos/ntoskrnl/kd/wrappers/gdbstub.c index 17e45f18fde..956197898a3 100644 --- a/reactos/ntoskrnl/kd/wrappers/gdbstub.c +++ b/reactos/ntoskrnl/kd/wrappers/gdbstub.c @@ -33,9 +33,9 @@ static BOOLEAN GspInitialized; static BOOLEAN GspRemoteDebug; -static CONST CHAR HexChars[]="0123456789abcdef"; +static CONST CHAR HexChars[] = "0123456789abcdef"; -static PETHREAD GspRunThread; /* NULL means run all threads */ +static PETHREAD GspRunThread; /* NULL means run all threads */ static PETHREAD GspDbgThread; static PETHREAD GspEnumThread; @@ -54,202 +54,192 @@ static CHAR GspOutBuffer[1000]; enum REGISTER_NAMES { - EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, - PC /* also known as eip */, - PS /* also known as eflags */, - CS, SS, DS, ES, FS, GS + EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, + PC /* also known as eip */ , + PS /* also known as eflags */ , + CS, SS, DS, ES, FS, GS }; typedef struct _CPU_REGISTER { - ULONG Size; - ULONG OffsetInTF; - ULONG OffsetInContext; - BOOLEAN SetInContext; + ULONG Size; + ULONG OffsetInTF; + ULONG OffsetInContext; + BOOLEAN SetInContext; } CPU_REGISTER, *PCPU_REGISTER; static CPU_REGISTER GspRegisters[NUMREGS] = { - { 4, FIELD_OFFSET(KTRAP_FRAME, Eax), FIELD_OFFSET(CONTEXT, Eax), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, Ecx), FIELD_OFFSET(CONTEXT, Ecx), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, Edx), FIELD_OFFSET(CONTEXT, Edx), FALSE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, Ebx), FIELD_OFFSET(CONTEXT, Ebx), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp ), FIELD_OFFSET(CONTEXT, Esp), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEbp), FIELD_OFFSET(CONTEXT, Ebp), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, Esi), FIELD_OFFSET(CONTEXT, Esi), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, Edi), FIELD_OFFSET(CONTEXT, Edi), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEip), FIELD_OFFSET(CONTEXT, Eip), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, EFlags), FIELD_OFFSET(CONTEXT, EFlags), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, SegCs), FIELD_OFFSET(CONTEXT, SegCs), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareSegSs), FIELD_OFFSET(CONTEXT, SegSs), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, SegDs), FIELD_OFFSET(CONTEXT, SegDs), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, SegEs), FIELD_OFFSET(CONTEXT, SegEs), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, SegFs), FIELD_OFFSET(CONTEXT, SegFs), TRUE }, - { 4, FIELD_OFFSET(KTRAP_FRAME, SegGs), FIELD_OFFSET(CONTEXT, SegGs), TRUE } + { 4, FIELD_OFFSET(KTRAP_FRAME, Eax), FIELD_OFFSET(CONTEXT, Eax), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, Ecx), FIELD_OFFSET(CONTEXT, Ecx), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, Edx), FIELD_OFFSET(CONTEXT, Edx), FALSE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, Ebx), FIELD_OFFSET(CONTEXT, Ebx), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp), FIELD_OFFSET(CONTEXT, Esp), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEbp), FIELD_OFFSET(CONTEXT, Ebp), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, Esi), FIELD_OFFSET(CONTEXT, Esi), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, Edi), FIELD_OFFSET(CONTEXT, Edi), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, DbgEip), FIELD_OFFSET(CONTEXT, Eip), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, EFlags), FIELD_OFFSET(CONTEXT, EFlags), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, SegCs), FIELD_OFFSET(CONTEXT, SegCs), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, HardwareSegSs), FIELD_OFFSET(CONTEXT, SegSs), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, SegDs), FIELD_OFFSET(CONTEXT, SegDs), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, SegEs), FIELD_OFFSET(CONTEXT, SegEs), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, SegFs), FIELD_OFFSET(CONTEXT, SegFs), TRUE }, + { 4, FIELD_OFFSET(KTRAP_FRAME, SegGs), FIELD_OFFSET(CONTEXT, SegGs), TRUE } }; -static PCHAR GspThreadStates[DeferredReady+1] = +static PCHAR GspThreadStates[DeferredReady + 1] = { - "Initialized", - "Ready", - "Running", - "Standby", - "Terminated", - "Waiting", - "Transition", - "DeferredReady" + "Initialized", + "Ready", + "Running", + "Standby", + "Terminated", + "Waiting", + "Transition", + "DeferredReady" }; - LONG HexValue(CHAR ch) { - if ((ch >= '0') && (ch <= '9')) - { - return (ch - '0'); - } - if ((ch >= 'a') && (ch <= 'f')) - { - return (ch - 'a' + 10); - } - if ((ch >= 'A') && (ch <= 'F')) - { - return (ch - 'A' + 10); - } + if ((ch >= '0') && (ch <= '9')) + return (ch - '0'); - return -1; + if ((ch >= 'a') && (ch <= 'f')) + return (ch - 'a' + 10); + + if ((ch >= 'A') && (ch <= 'F')) + return (ch - 'A' + 10); + + return -1; } - VOID GdbPutChar(UCHAR Value) { - KdPortPutByteEx(&GdbPortInfo, Value); + KdPortPutByteEx(&GdbPortInfo, Value); } UCHAR GdbGetChar(VOID) { - UCHAR Value; + UCHAR Value; - while (!KdPortGetByteEx(&GdbPortInfo, &Value)) - ; + while (!KdPortGetByteEx(&GdbPortInfo, &Value)) + ; - return Value; + return Value; } -/* scan for the sequence $# */ +/* scan for the sequence $# */ PCHAR GspGetPacket() { - PCHAR Buffer = &GspInBuffer[0]; - CHAR Checksum; - CHAR XmitChecksum; - ULONG Count; - CHAR ch; + PCHAR Buffer = &GspInBuffer[0]; + CHAR Checksum; + CHAR XmitChecksum; + ULONG Count; + CHAR ch; - while (TRUE) + while (TRUE) { - /* wait around for the start character, ignore all other characters */ - while ((ch = GdbGetChar ()) != '$') - ; + /* wait around for the start character, ignore all other characters */ + while ((ch = GdbGetChar()) != '$') + ; - retry: - Checksum = 0; - XmitChecksum = -1; - Count = 0; +retry: + Checksum = 0; + XmitChecksum = -1; + Count = 0; - /* now, read until a # or end of Buffer is found */ - while (Count < sizeof(GspInBuffer) - 1) + /* now, read until a # or end of Buffer is found */ + while (Count < sizeof(GspInBuffer) - 1) { - ch = GdbGetChar(); - if (ch == '$') - { - goto retry; - } - if (ch == '#') - { - break; - } - Checksum = Checksum + ch; - Buffer[Count] = ch; - Count = Count + 1; + ch = GdbGetChar(); + if (ch == '$') + goto retry; + + if (ch == '#') + break; + + Checksum = Checksum + ch; + Buffer[Count] = ch; + Count = Count + 1; } - Buffer[Count] = 0; + Buffer[Count] = 0; - if (ch == '#') + if (ch == '#') { - ch = GdbGetChar(); - XmitChecksum = (CHAR)(HexValue(ch) << 4); - ch = GdbGetChar(); - XmitChecksum += (CHAR)(HexValue(ch)); + ch = GdbGetChar(); + XmitChecksum = (CHAR)(HexValue(ch) << 4); + ch = GdbGetChar(); + XmitChecksum += (CHAR)(HexValue(ch)); - if (Checksum != XmitChecksum) + if (Checksum != XmitChecksum) { - GdbPutChar('-'); /* failed checksum */ + GdbPutChar('-'); /* failed checksum */ } - else + else { - GdbPutChar('+'); /* successful transfer */ - - return &Buffer[0]; + GdbPutChar('+'); /* successful transfer */ + return &Buffer[0]; } } } } -/* send the packet in Buffer. */ +/* send the packet in Buffer. */ VOID GspPutPacket(PCHAR Buffer) { - CHAR Checksum; - LONG Count; - CHAR ch; + CHAR Checksum; + LONG Count; + CHAR ch; - /* $#. */ - do + /* $#. */ + do { - GdbPutChar('$'); - Checksum = 0; - Count = 0; + GdbPutChar('$'); + Checksum = 0; + Count = 0; - while ((ch = Buffer[Count])) + while ((ch = Buffer[Count])) { - GdbPutChar(ch); - Checksum += ch; - Count += 1; + GdbPutChar(ch); + Checksum += ch; + Count += 1; } - GdbPutChar('#'); - GdbPutChar(HexChars[(Checksum >> 4) & 0xf]); - GdbPutChar(HexChars[Checksum & 0xf]); + GdbPutChar('#'); + GdbPutChar(HexChars[(Checksum >> 4) & 0xf]); + GdbPutChar(HexChars[Checksum & 0xf]); } - while (GdbGetChar() != '+'); + while (GdbGetChar() != '+'); } - VOID GspPutPacketNoWait(PCHAR Buffer) { - CHAR Checksum; - LONG Count; - CHAR ch; + CHAR Checksum; + LONG Count; + CHAR ch; - /* $#. */ - GdbPutChar('$'); - Checksum = 0; - Count = 0; + /* $#. */ + GdbPutChar('$'); + Checksum = 0; + Count = 0; - while ((ch = Buffer[Count])) + while ((ch = Buffer[Count])) { - GdbPutChar(ch); - Checksum += ch; - Count += 1; + GdbPutChar(ch); + Checksum += ch; + Count += 1; } - GdbPutChar('#'); - GdbPutChar(HexChars[(Checksum >> 4) & 0xf]); - GdbPutChar(HexChars[Checksum & 0xf]); + GdbPutChar('#'); + GdbPutChar(HexChars[(Checksum >> 4) & 0xf]); + GdbPutChar(HexChars[Checksum & 0xf]); } /* Indicate to caller of GspMem2Hex or GspHex2Mem that there has been an error. */ @@ -259,8 +249,10 @@ static CHAR GspReadMemSafe(PCHAR Address) { CHAR ch = 0; + if (!KdpSafeReadMemory((ULONG_PTR)Address, 1, &ch)) - GspMemoryError = TRUE; + GspMemoryError = TRUE; + return ch; } @@ -268,118 +260,101 @@ static void GspWriteMemSafe(PCHAR Address, CHAR Ch) { if (!KdpSafeWriteMemory((ULONG_PTR)Address, 1, Ch)) - GspMemoryError = TRUE; + GspMemoryError = TRUE; } -/* Convert the memory pointed to by Address into hex, placing result in Buffer */ -/* Return a pointer to the last char put in Buffer (null) */ -/* If MayFault is TRUE, then we should set GspMemoryError in response to - a fault; if FALSE treat a fault like any other fault in the stub. */ +/* Convert the memory pointed to by Address into hex, placing result in Buffer + * Return a pointer to the last char put in Buffer (null) + * If MayFault is TRUE, then we should set GspMemoryError in response to + * a fault; if FALSE treat a fault like any other fault in the stub. + */ static PCHAR -GspMem2Hex(PCHAR Address, - PCHAR Buffer, - LONG Count, - BOOLEAN MayFault) +GspMem2Hex(PCHAR Address, PCHAR Buffer, LONG Count, BOOLEAN MayFault) { - ULONG i; - CHAR ch; + ULONG i; + CHAR ch; - for (i = 0; i < (ULONG) Count; i++) + for (i = 0; i < (ULONG)Count; i++) { - if (MayFault) + if (MayFault) { - ch = GspReadMemSafe(Address); - if (GspMemoryError) - { - return Buffer; - } + ch = GspReadMemSafe(Address); + if (GspMemoryError) + return Buffer; } - else + else { - ch = *Address; + ch = *Address; } - *Buffer++ = HexChars[(ch >> 4) & 0xf]; - *Buffer++ = HexChars[ch & 0xf]; - Address++; + *Buffer++ = HexChars[(ch >> 4) & 0xf]; + *Buffer++ = HexChars[ch & 0xf]; + Address++; } - *Buffer = 0; - return Buffer; + *Buffer = 0; + return Buffer; } static ULONG -GspWriteMem(PCHAR Address, - ULONG Count, - BOOLEAN MayFault, - CHAR (*GetContent)(PVOID Context, ULONG Offset), - PVOID Context) +GspWriteMem(PCHAR Address, ULONG Count, BOOLEAN MayFault, + CHAR (*GetContent)(PVOID Context, ULONG Offset), PVOID Context) { - PCHAR Current; - PCHAR Page; - ULONG CountInPage; - ULONG i; - CHAR ch; + PCHAR Current; + PCHAR Page; + ULONG CountInPage; + ULONG i; + CHAR ch; - Current = Address; - while (Current < Address + Count) + Current = Address; + while (Current < Address + Count) { - Page = (PCHAR)PAGE_ROUND_DOWN(Current); - if (Address + Count <= Page + PAGE_SIZE) + Page = (PCHAR)PAGE_ROUND_DOWN(Current); + if (Address + Count <= Page + PAGE_SIZE) { - /* Fits in this page */ - CountInPage = Count; + /* Fits in this page */ + CountInPage = Count; } - else + else { - /* Flows into next page, handle only current page in this iteration */ - CountInPage = PAGE_SIZE - (Address - Page); + /* Flows into next page, handle only current page in this iteration */ + CountInPage = PAGE_SIZE - (Address - Page); } - for (i = 0; i < CountInPage && ! GspMemoryError; i++) + for (i = 0; i < CountInPage && !GspMemoryError; i++) { - ch = (*GetContent)(Context, Current - Address); + ch = (*GetContent)(Context, Current - Address); - if (MayFault) - { - GspWriteMemSafe(Current, ch); - } - else - { - *Current = ch; - } + if (MayFault) + GspWriteMemSafe(Current, ch); + else + *Current = ch; - Current++; + Current++; } - if (MayFault) + if (MayFault) { - if (GspMemoryError) - { - return Current - Address; - } + if (GspMemoryError) + return Current - Address; } } - return Current - Address; + return Current - Address; } static CHAR GspHex2MemGetContent(PVOID Context, ULONG Offset) { - return (CHAR)((HexValue(*((PCHAR) Context + 2 * Offset)) << 4) + - HexValue(*((PCHAR) Context + 2 * Offset + 1))); + return (CHAR)((HexValue(*((PCHAR)Context + 2 * Offset)) << 4) + + HexValue(*((PCHAR)Context + 2 * Offset + 1))); } /* Convert the hex array pointed to by Buffer into binary to be placed at Address * Return a pointer to the character AFTER the last byte read from Buffer */ static PCHAR -GspHex2Mem(PCHAR Buffer, - PCHAR Address, - ULONG Count, - BOOLEAN MayFault) +GspHex2Mem(PCHAR Buffer, PCHAR Address, ULONG Count, BOOLEAN MayFault) { - Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer); - - return Buffer + 2 * Count; + Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer); + return Buffer + 2 * Count; } /**********************************************/ @@ -387,48 +362,43 @@ GspHex2Mem(PCHAR Buffer, /* RETURN NUMBER OF CHARS PROCESSED */ /**********************************************/ LONG -GspHex2Long(PCHAR *Address, - PLONG Value) +GspHex2Long(PCHAR *Address, PLONG Value) { - LONG NumChars = 0; - LONG Hex; + LONG NumChars = 0; + LONG Hex; - *Value = 0; + *Value = 0; - while (**Address) + while (**Address) { - Hex = HexValue(**Address); - if (Hex >= 0) + Hex = HexValue(**Address); + if (Hex >= 0) { - *Value = (*Value << 4) | Hex; - NumChars++; + *Value = (*Value << 4) | Hex; + NumChars++; } - else + else { - break; + break; } - (*Address)++; + (*Address)++; } - return NumChars; + return NumChars; } - VOID -GspLong2Hex(PCHAR *Address, - LONG Value) +GspLong2Hex(PCHAR *Address, LONG Value) { - LONG Save; + LONG Save; - Save = (((Value >> 0) & 0xff) << 24) | - (((Value >> 8) & 0xff) << 16) | - (((Value >> 16) & 0xff) << 8) | - (((Value >> 24) & 0xff) << 0); - *Address = GspMem2Hex((PCHAR) &Save, *Address, 4, FALSE); + Save = (((Value >> 0) & 0xff) << 24) | (((Value >> 8) & 0xff) << 16) | + (((Value >> 16) & 0xff) << 8) | (((Value >> 24) & 0xff) << 0); + + *Address = GspMem2Hex((PCHAR)&Save, *Address, 4, FALSE); } - /* * When coming from kernel mode, Esp is not stored in the trap frame. * Instead, it was pointing to the location of the TrapFrame Esp member @@ -438,447 +408,428 @@ GspLong2Hex(PCHAR *Address, static LONG GspGetEspFromTrapFrame(PKTRAP_FRAME TrapFrame) { - return KeGetPreviousMode() == KernelMode - ? (LONG) &TrapFrame->HardwareEsp : (LONG)TrapFrame->HardwareEsp; + return KeGetPreviousMode() == KernelMode ? + (LONG)&TrapFrame->HardwareEsp : (LONG)TrapFrame->HardwareEsp; } - static VOID -GspGetRegisters(PCHAR Address, - PKTRAP_FRAME TrapFrame) +GspGetRegisters(PCHAR Address, PKTRAP_FRAME TrapFrame) { - ULONG_PTR Value; - PULONG p; - ULONG i; - PETHREAD Thread; - ULONG_PTR *KernelStack; + ULONG_PTR Value; + PULONG p; + ULONG i; + PETHREAD Thread; + ULONG_PTR *KernelStack; - if (NULL == GspDbgThread) + if (NULL == GspDbgThread) { - Thread = PsGetCurrentThread(); + Thread = PsGetCurrentThread(); } - else + else { - TrapFrame = GspDbgThread->Tcb.TrapFrame; - Thread = GspDbgThread; + TrapFrame = GspDbgThread->Tcb.TrapFrame; + Thread = GspDbgThread; } - if (Waiting == Thread->Tcb.State) + if (Waiting == Thread->Tcb.State) { - KernelStack = Thread->Tcb.KernelStack; - for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++) + KernelStack = Thread->Tcb.KernelStack; + for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++) { - switch(i) + switch (i) + { + case EBP: + Value = KernelStack[3]; + break; + case EDI: + Value = KernelStack[4]; + break; + case ESI: + Value = KernelStack[5]; + break; + case EBX: + Value = KernelStack[6]; + break; + case PC: + Value = KernelStack[7]; + break; + case ESP: + Value = (ULONG_PTR)(KernelStack + 8); + break; + case CS: + Value = KGDT_R0_CODE; + break; + case DS: + Value = KGDT_R0_DATA; + break; + default: + Value = 0; + break; + } + + Address = GspMem2Hex((PCHAR)&Value, Address, GspRegisters[i].Size, FALSE); + } + } + else + { + for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++) + { + if (TrapFrame) + { + if (ESP == i) + { + Value = GspGetEspFromTrapFrame(TrapFrame); + } + else + { + p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[i].OffsetInTF); + Value = *p; + } + } + else if (i == PC) + { + /* + * This thread has not been sheduled yet so assume it + * is still in PsBeginThreadWithContextInternal(). + */ + Value = (ULONG)KiThreadStartup; + } + else { - case EBP: - Value = KernelStack[3]; - break; - case EDI: - Value = KernelStack[4]; - break; - case ESI: - Value = KernelStack[5]; - break; - case EBX: - Value = KernelStack[6]; - break; - case PC: - Value = KernelStack[7]; - break; - case ESP: - Value = (ULONG_PTR) (KernelStack + 8); - break; - case CS: - Value = KGDT_R0_CODE; - break; - case DS: - Value = KGDT_R0_DATA; - break; - default: Value = 0; - break; } - Address = GspMem2Hex((PCHAR) &Value, Address, GspRegisters[i].Size, - FALSE); - } - } - else - { - for (i = 0; i < sizeof(GspRegisters) / sizeof(GspRegisters[0]); i++) - { - if (TrapFrame) - { - if (ESP == i) - { - Value = GspGetEspFromTrapFrame(TrapFrame); - } - else - { - p = (PULONG)((ULONG_PTR) TrapFrame + - GspRegisters[i].OffsetInTF); - Value = *p; - } - } - else if (i == PC) - { - /* - * This thread has not been sheduled yet so assume it - * is still in PsBeginThreadWithContextInternal(). - */ - Value = (ULONG)KiThreadStartup; - } - else - { - Value = 0; - } - Address = GspMem2Hex((PCHAR) &Value, Address, - GspRegisters[i].Size, FALSE); + + Address = GspMem2Hex((PCHAR)&Value, Address, GspRegisters[i].Size, FALSE); } } } - VOID -GspSetRegistersInTrapFrame(PCHAR Address, - PCONTEXT Context, - PKTRAP_FRAME TrapFrame) +GspSetRegistersInTrapFrame(PCHAR Address, PCONTEXT Context, PKTRAP_FRAME TrapFrame) { - ULONG Value; - PCHAR Buffer; - PULONG p; - ULONG i; + ULONG Value; + PCHAR Buffer; + PULONG p; + ULONG i; - if (!TrapFrame) - { - return; - } + if (!TrapFrame) + return; - Buffer = Address; - for (i = 0; i < NUMREGS; i++) + Buffer = Address; + for (i = 0; i < NUMREGS; i++) { - if (GspRegisters[i].SetInContext) + if (GspRegisters[i].SetInContext) { - p = (PULONG) ((ULONG_PTR) Context + GspRegisters[i].OffsetInContext); + p = (PULONG)((ULONG_PTR)Context + GspRegisters[i].OffsetInContext); } - else + else { - p = (PULONG) ((ULONG_PTR) TrapFrame + GspRegisters[i].OffsetInTF); + p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[i].OffsetInTF); } - Value = 0; - Buffer = GspHex2Mem(Buffer, (PCHAR) &Value, GspRegisters[i].Size, FALSE); - *p = Value; + + Value = 0; + Buffer = GspHex2Mem(Buffer, (PCHAR)&Value, GspRegisters[i].Size, FALSE); + *p = Value; } } - VOID -GspSetSingleRegisterInTrapFrame(PCHAR Address, - LONG Number, - PCONTEXT Context, - PKTRAP_FRAME TrapFrame) +GspSetSingleRegisterInTrapFrame(PCHAR Address, LONG Number, PCONTEXT Context, PKTRAP_FRAME TrapFrame) { - ULONG Value; - PULONG p; + ULONG Value; + PULONG p; - if (!TrapFrame) + if (!TrapFrame) + return; + + if (GspRegisters[Number].SetInContext) { - return; + p = (PULONG)((ULONG_PTR)Context + GspRegisters[Number].OffsetInContext); + } + else + { + p = (PULONG)((ULONG_PTR)TrapFrame + GspRegisters[Number].OffsetInTF); } - if (GspRegisters[Number].SetInContext) - { - p = (PULONG) ((ULONG_PTR) Context + GspRegisters[Number].OffsetInContext); - } - else - { - p = (PULONG) ((ULONG_PTR) TrapFrame + GspRegisters[Number].OffsetInTF); - } - Value = 0; - GspHex2Mem(Address, (PCHAR) &Value, GspRegisters[Number].Size, FALSE); - *p = Value; + Value = 0; + GspHex2Mem(Address, (PCHAR)&Value, GspRegisters[Number].Size, FALSE); + *p = Value; } - BOOLEAN -GspFindThread(PCHAR Data, - PETHREAD *Thread) +GspFindThread(PCHAR Data, PETHREAD *Thread) { - PETHREAD ThreadInfo = NULL; + PETHREAD ThreadInfo = NULL; - if (strcmp (Data, "-1") == 0) + if (strcmp(Data, "-1") == 0) { - /* All threads */ - ThreadInfo = NULL; + /* All threads */ + ThreadInfo = NULL; } - else + else { - ULONG uThreadId; - HANDLE ThreadId; - PCHAR ptr = &Data[0]; + ULONG uThreadId; + HANDLE ThreadId; + PCHAR ptr = &Data[0]; - GspHex2Long(&ptr, (PLONG) &uThreadId); - ThreadId = (HANDLE)uThreadId; + GspHex2Long(&ptr, (PLONG)&uThreadId); + ThreadId = (HANDLE)uThreadId; - if (!NT_SUCCESS(PsLookupThreadByThreadId(ThreadId, &ThreadInfo))) + if (!NT_SUCCESS(PsLookupThreadByThreadId(ThreadId, &ThreadInfo))) { - *Thread = NULL; - return FALSE; + *Thread = NULL; + return FALSE; } } - *Thread = ThreadInfo; - return TRUE; -} + *Thread = ThreadInfo; + return TRUE; +} VOID GspSetThread(PCHAR Request) { - PETHREAD ThreadInfo; - PCHAR ptr = &Request[1]; + PETHREAD ThreadInfo; + PCHAR ptr = &Request[1]; - switch (Request[0]) - { - case 'c': /* Run thread */ - if (GspFindThread(ptr, &ThreadInfo)) - { - GspOutBuffer[0] = 'O'; - GspOutBuffer[1] = 'K'; + switch (Request[0]) + { + case 'c': /* Run thread */ + if (GspFindThread(ptr, &ThreadInfo)) + { + GspOutBuffer[0] = 'O'; + GspOutBuffer[1] = 'K'; - if (NULL != GspRunThread) - { - ObDereferenceObject(GspRunThread); - } - GspRunThread = ThreadInfo; - if (NULL != GspRunThread) - { - ObReferenceObject(GspRunThread); - } - } - else - { - GspOutBuffer[0] = 'E'; - } - break; - case 'g': /* Debug thread */ - if (GspFindThread(ptr, &ThreadInfo)) - { - GspOutBuffer[0] = 'O'; - GspOutBuffer[1] = 'K'; + if (NULL != GspRunThread) + ObDereferenceObject(GspRunThread); - if (NULL != GspDbgThread) - { - ObDereferenceObject(GspDbgThread); - } + GspRunThread = ThreadInfo; - if (ThreadInfo == PsGetCurrentThread()) - { - GspDbgThread = NULL; - ObDereferenceObject(ThreadInfo); + if (NULL != GspRunThread) + ObReferenceObject(GspRunThread); } - else + else { - GspDbgThread = ThreadInfo; + GspOutBuffer[0] = 'E'; } - } - else - { - GspOutBuffer[0] = 'E'; - } - break; - default: - break; - } + break; + + case 'g': /* Debug thread */ + if (GspFindThread(ptr, &ThreadInfo)) + { + GspOutBuffer[0] = 'O'; + GspOutBuffer[1] = 'K'; + + if (NULL != GspDbgThread) + ObDereferenceObject(GspDbgThread); + + if (ThreadInfo == PsGetCurrentThread()) + { + GspDbgThread = NULL; + ObDereferenceObject(ThreadInfo); + } + else + { + GspDbgThread = ThreadInfo; + } + } + else + { + GspOutBuffer[0] = 'E'; + } + break; + + default: + break; + } } - VOID GspQuery(PCHAR Request) { - ULONG Value; + ULONG Value; - if (strncmp(Request, "C", 1) == 0) + if (strncmp(Request, "C", 1) == 0) { - PCHAR ptr = &GspOutBuffer[2]; + PCHAR ptr = &GspOutBuffer[2]; - /* Get current thread id */ - GspOutBuffer[0] = 'Q'; - GspOutBuffer[1] = 'C'; - if (NULL != GspDbgThread) - { - Value = (ULONG) GspDbgThread->Cid.UniqueThread; - } - else - { - Value = (ULONG) PsGetCurrentThread()->Cid.UniqueThread; - } - GspLong2Hex(&ptr, Value); + /* Get current thread id */ + GspOutBuffer[0] = 'Q'; + GspOutBuffer[1] = 'C'; + + if (NULL != GspDbgThread) + Value = (ULONG)GspDbgThread->Cid.UniqueThread; + else + Value = (ULONG)PsGetCurrentThread()->Cid.UniqueThread; + + GspLong2Hex(&ptr, Value); } - else if (strncmp(Request, "fThreadInfo", 11) == 0) + else if (strncmp(Request, "fThreadInfo", 11) == 0) { - PEPROCESS Process; - PLIST_ENTRY AThread, AProcess; - PCHAR ptr = &GspOutBuffer[1]; + PEPROCESS Process; + PLIST_ENTRY AThread, AProcess; + PCHAR ptr = &GspOutBuffer[1]; - /* Get first thread id */ - GspEnumThread = NULL; - AProcess = PsActiveProcessHead.Flink; - while(AProcess != &PsActiveProcessHead) + /* Get first thread id */ + GspEnumThread = NULL; + AProcess = PsActiveProcessHead.Flink; + while (AProcess != &PsActiveProcessHead) { - Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks); - AThread = Process->ThreadListHead.Flink; - if (AThread != &Process->ThreadListHead) + Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks); + AThread = Process->ThreadListHead.Flink; + if (AThread != &Process->ThreadListHead) { - GspEnumThread = CONTAINING_RECORD(Process->ThreadListHead.Flink, - ETHREAD, ThreadListEntry); - break; + GspEnumThread = CONTAINING_RECORD(Process->ThreadListHead.Flink, + ETHREAD, ThreadListEntry); + break; } - AProcess = AProcess->Flink; + AProcess = AProcess->Flink; } - if(GspEnumThread != NULL) + if (GspEnumThread != NULL) { - GspOutBuffer[0] = 'm'; - Value = (ULONG) GspEnumThread->Cid.UniqueThread; - GspLong2Hex(&ptr, Value); + GspOutBuffer[0] = 'm'; + Value = (ULONG)GspEnumThread->Cid.UniqueThread; + GspLong2Hex(&ptr, Value); } - else + else { - /* FIXME - what to do here? This case should never happen though, there - should always be at least one thread on the system... */ - /* GspOutBuffer[0] = 'l'; */ + /* FIXME - what to do here? This case should never happen though, there + should always be at least one thread on the system... */ + /* GspOutBuffer[0] = 'l'; */ } } - else if (strncmp(Request, "sThreadInfo", 11) == 0) + else if (strncmp(Request, "sThreadInfo", 11) == 0) { - PEPROCESS Process; - PLIST_ENTRY AThread, AProcess; - PCHAR ptr = &GspOutBuffer[1]; + PEPROCESS Process; + PLIST_ENTRY AThread, AProcess; + PCHAR ptr = &GspOutBuffer[1]; - /* Get next thread id */ - if (GspEnumThread != NULL) + /* Get next thread id */ + if (GspEnumThread != NULL) { - /* find the next thread */ - Process = GspEnumThread->ThreadsProcess; - if(GspEnumThread->ThreadListEntry.Flink != &Process->ThreadListHead) + /* find the next thread */ + Process = GspEnumThread->ThreadsProcess; + if (GspEnumThread->ThreadListEntry.Flink != &Process->ThreadListHead) { - GspEnumThread = CONTAINING_RECORD(GspEnumThread->ThreadListEntry.Flink, - ETHREAD, ThreadListEntry); + GspEnumThread = CONTAINING_RECORD(GspEnumThread->ThreadListEntry.Flink, + ETHREAD, ThreadListEntry); } - else + else { - PETHREAD Thread = NULL; - AProcess = Process->ActiveProcessLinks.Flink; - while(AProcess != &PsActiveProcessHead) + PETHREAD Thread = NULL; + AProcess = Process->ActiveProcessLinks.Flink; + while (AProcess != &PsActiveProcessHead) { - Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks); - AThread = Process->ThreadListHead.Flink; - if (AThread != &Process->ThreadListHead) + Process = CONTAINING_RECORD(AProcess, EPROCESS, ActiveProcessLinks); + AThread = Process->ThreadListHead.Flink; + if (AThread != &Process->ThreadListHead) { - Thread = CONTAINING_RECORD(Process->ThreadListHead.Flink, - ETHREAD, ThreadListEntry); - break; + Thread = CONTAINING_RECORD(Process->ThreadListHead.Flink, + ETHREAD, ThreadListEntry); + break; } - AProcess = AProcess->Flink; + AProcess = AProcess->Flink; } - GspEnumThread = Thread; + GspEnumThread = Thread; } - if (GspEnumThread != NULL) + if (GspEnumThread != NULL) { - /* return the ID */ - GspOutBuffer[0] = 'm'; - Value = (ULONG) GspEnumThread->Cid.UniqueThread; - GspLong2Hex(&ptr, Value); + /* return the ID */ + GspOutBuffer[0] = 'm'; + Value = (ULONG)GspEnumThread->Cid.UniqueThread; + GspLong2Hex(&ptr, Value); } - else + else { - GspOutBuffer[0] = 'l'; + GspOutBuffer[0] = 'l'; } } - else + else { - GspOutBuffer[0] = 'l'; + GspOutBuffer[0] = 'l'; } } - else if (strncmp(Request, "ThreadExtraInfo", 15) == 0) + else if (strncmp(Request, "ThreadExtraInfo", 15) == 0) { - PETHREAD ThreadInfo; + PETHREAD ThreadInfo; - /* Get thread information */ - if (GspFindThread(Request + 16, &ThreadInfo)) + /* Get thread information */ + if (GspFindThread(Request + 16, &ThreadInfo)) { - char Buffer[64]; - PEPROCESS Proc; + char Buffer[64]; + PEPROCESS Proc; - Proc = (PEPROCESS) ThreadInfo->ThreadsProcess; + Proc = (PEPROCESS)ThreadInfo->ThreadsProcess; - Buffer[0] = '\0'; - if (NULL != Proc ) - { - sprintf(Buffer, "%s [%d:0x%x], ", Proc->ImageFileName, - (int) Proc->UniqueProcessId, - (int) ThreadInfo->Cid.UniqueThread); - } - strcpy(Buffer + strlen(Buffer), - GspThreadStates[ThreadInfo->Tcb.State]); + Buffer[0] = '\0'; - ObDereferenceObject(ThreadInfo); + if (NULL != Proc) + sprintf(Buffer, "%s [%d:0x%x], ", + Proc->ImageFileName, + (int)Proc->UniqueProcessId, + (int)ThreadInfo->Cid.UniqueThread); - GspMem2Hex(Buffer, &GspOutBuffer[0], strlen(Buffer), FALSE); + strcpy(Buffer + strlen(Buffer), GspThreadStates[ThreadInfo->Tcb.State]); + + ObDereferenceObject(ThreadInfo); + + GspMem2Hex(Buffer, &GspOutBuffer[0], strlen(Buffer), FALSE); } } - else if (strncmp(Request, "Supported", 9) == 0) + else if (strncmp(Request, "Supported", 9) == 0) { - /* tell maximum incoming packet size */ - sprintf(GspOutBuffer, "PacketSize=%u", sizeof(GspInBuffer) - 1); + /* tell maximum incoming packet size */ + sprintf(GspOutBuffer, "PacketSize=%u", sizeof(GspInBuffer) - 1); } - else if (strncmp(Request, "Rcmd,", 5) == 0) + else if (strncmp(Request, "Rcmd,", 5) == 0) { - ; + ; } } VOID GspQueryThreadStatus(PCHAR Request) { - PETHREAD ThreadInfo; - PCHAR ptr = &Request[0]; + PETHREAD ThreadInfo; + PCHAR ptr = &Request[0]; - if (GspFindThread(ptr, &ThreadInfo)) + if (GspFindThread(ptr, &ThreadInfo)) { - ObDereferenceObject(ThreadInfo); + ObDereferenceObject(ThreadInfo); - GspOutBuffer[0] = 'O'; - GspOutBuffer[1] = 'K'; - GspOutBuffer[2] = '\0'; + GspOutBuffer[0] = 'O'; + GspOutBuffer[1] = 'K'; + GspOutBuffer[2] = '\0'; } - else + else { - GspOutBuffer[0] = 'E'; - GspOutBuffer[1] = '\0'; + GspOutBuffer[0] = 'E'; + GspOutBuffer[1] = '\0'; } } -#define DR6_BS 0x00004000 /* Single step */ +#define DR6_BS 0x00004000 /* Single step */ -#define DR7_L0 0x00000001 /* Local breakpoint 0 enable */ -#define DR7_G0 0x00000002 /* Global breakpoint 0 enable */ -#define DR7_L1 0x00000004 /* Local breakpoint 1 enable */ -#define DR7_G1 0x00000008 /* Global breakpoint 1 enable */ -#define DR7_L2 0x00000010 /* Local breakpoint 2 enable */ -#define DR7_G2 0x00000020 /* Global breakpoint 2 enable */ -#define DR7_L3 0x00000040 /* Local breakpoint 3 enable */ -#define DR7_G3 0x00000080 /* Global breakpoint 3 enable */ -#define DR7_LE 0x00000100 /* Local exact breakpoint enable (old) */ -#define DR7_GE 0x00000200 /* Global exact breakpoint enable (old) */ -#define DR7_GD 0x00002000 /* General detect enable */ -#define DR7_TYPE0_MASK 0x00030000 /* Breakpoint 0 condition */ -#define DR7_LEN0_MASK 0x000c0000 /* Breakpoint 0 length */ -#define DR7_TYPE1_MASK 0x00300000 /* Breakpoint 1 condition */ -#define DR7_LEN1_MASK 0x00c00000 /* Breakpoint 1 length */ -#define DR7_TYPE2_MASK 0x03000000 /* Breakpoint 2 condition */ -#define DR7_LEN2_MASK 0x0c000000 /* Breakpoint 2 length */ -#define DR7_TYPE3_MASK 0x30000000 /* Breakpoint 3 condition */ -#define DR7_LEN3_MASK 0xc0000000 /* Breakpoint 3 length */ +#define DR7_L0 0x00000001 /* Local breakpoint 0 enable */ +#define DR7_G0 0x00000002 /* Global breakpoint 0 enable */ +#define DR7_L1 0x00000004 /* Local breakpoint 1 enable */ +#define DR7_G1 0x00000008 /* Global breakpoint 1 enable */ +#define DR7_L2 0x00000010 /* Local breakpoint 2 enable */ +#define DR7_G2 0x00000020 /* Global breakpoint 2 enable */ +#define DR7_L3 0x00000040 /* Local breakpoint 3 enable */ +#define DR7_G3 0x00000080 /* Global breakpoint 3 enable */ +#define DR7_LE 0x00000100 /* Local exact breakpoint enable (old) */ +#define DR7_GE 0x00000200 /* Global exact breakpoint enable (old) */ +#define DR7_GD 0x00002000 /* General detect enable */ +#define DR7_TYPE0_MASK 0x00030000 /* Breakpoint 0 condition */ +#define DR7_LEN0_MASK 0x000c0000 /* Breakpoint 0 length */ +#define DR7_TYPE1_MASK 0x00300000 /* Breakpoint 1 condition */ +#define DR7_LEN1_MASK 0x00c00000 /* Breakpoint 1 length */ +#define DR7_TYPE2_MASK 0x03000000 /* Breakpoint 2 condition */ +#define DR7_LEN2_MASK 0x0c000000 /* Breakpoint 2 length */ +#define DR7_TYPE3_MASK 0x30000000 /* Breakpoint 3 condition */ +#define DR7_LEN3_MASK 0xc0000000 /* Breakpoint 3 length */ #define DR7_GLOBAL_ENABLE(Bp) (2 << (2 * (Bp))) #define DR7_TYPE(Bp, Type) ((Type) << (16 + 4 * (Bp))) #define DR7_LEN(Bp, Len) ((Len) << (18 + 4 * (Bp))) @@ -897,9 +848,9 @@ GspQueryThreadStatus(PCHAR Request) typedef struct _GSPHWBREAKPOINT { - ULONG Type; - ULONG_PTR Address; - ULONG Length; + ULONG Type; + ULONG_PTR Address; + ULONG Length; } GSPHWBREAKPOINT; #define MAX_HW_BREAKPOINTS 4 @@ -908,9 +859,9 @@ static GSPHWBREAKPOINT GspHwBreakpoints[MAX_HW_BREAKPOINTS]; typedef struct _GSPSWBREAKPOINT { - ULONG_PTR Address; - CHAR PrevContent; - BOOLEAN Active; + ULONG_PTR Address; + CHAR PrevContent; + BOOLEAN Active; } GSPSWBREAKPOINT; #define MAX_SW_BREAKPOINTS 64 @@ -920,280 +871,269 @@ static GSPSWBREAKPOINT GspSwBreakpoints[MAX_SW_BREAKPOINTS]; static void GspSetHwBreakpoint(ULONG Type, ULONG_PTR Address, ULONG Length) { - DPRINT("GspSetHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length); + DPRINT("GspSetHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length); - if (GDB_ZTYPE_READ_WATCHPOINT == Type) + if (GDB_ZTYPE_READ_WATCHPOINT == Type) { - DPRINT1("Read watchpoint not supported\n"); - strcpy(GspOutBuffer, "E22"); + DPRINT1("Read watchpoint not supported\n"); + strcpy(GspOutBuffer, "E22"); } - else if (GDB_ZTYPE_HARDWARE_BREAKPOINT == Type && 1 != Length) + else if (GDB_ZTYPE_HARDWARE_BREAKPOINT == Type && 1 != Length) { - DPRINT1("Invalid length %lu for hardware breakpoint\n", Length); - strcpy(GspOutBuffer, "E22"); + DPRINT1("Invalid length %lu for hardware breakpoint\n", Length); + strcpy(GspOutBuffer, "E22"); } - else if (1 != Length && 2 != Length && 4 != Length) + else if (1 != Length && 2 != Length && 4 != Length) { - DPRINT1("Invalid length %lu for GDB Z type %lu\n", Length, Type); - strcpy(GspOutBuffer, "E22"); + DPRINT1("Invalid length %lu for GDB Z type %lu\n", Length, Type); + strcpy(GspOutBuffer, "E22"); } - else if (0 != (Address & (Length - 1))) + else if (0 != (Address & (Length - 1))) { - DPRINT1("Invalid alignment for address 0x%p and length %d\n", - Address, Length); - strcpy(GspOutBuffer, "E22"); + DPRINT1("Invalid alignment for address 0x%p and length %d\n", Address, Length); + strcpy(GspOutBuffer, "E22"); } - else if (MAX_HW_BREAKPOINTS == GspHwBreakpointCount) + else if (MAX_HW_BREAKPOINTS == GspHwBreakpointCount) { - DPRINT1("Trying to set too many hardware breakpoints\n"); - strcpy(GspOutBuffer, "E22"); + DPRINT1("Trying to set too many hardware breakpoints\n"); + strcpy(GspOutBuffer, "E22"); } - else + else { - DPRINT("Stored at index %u\n", GspHwBreakpointCount); - GspHwBreakpoints[GspHwBreakpointCount].Type = Type; - GspHwBreakpoints[GspHwBreakpointCount].Address = Address; - GspHwBreakpoints[GspHwBreakpointCount].Length = Length; - GspHwBreakpointCount++; - strcpy(GspOutBuffer, "OK"); + DPRINT("Stored at index %u\n", GspHwBreakpointCount); + GspHwBreakpoints[GspHwBreakpointCount].Type = Type; + GspHwBreakpoints[GspHwBreakpointCount].Address = Address; + GspHwBreakpoints[GspHwBreakpointCount].Length = Length; + GspHwBreakpointCount++; + strcpy(GspOutBuffer, "OK"); } } static void GspRemoveHwBreakpoint(ULONG Type, ULONG_PTR Address, ULONG Length) { - unsigned Index; + unsigned Index; - DPRINT("GspRemoveHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length); - for (Index = 0; Index < GspHwBreakpointCount; Index++) + DPRINT("GspRemoveHwBreakpoint(%lu, 0x%p, %lu)\n", Type, Address, Length); + for (Index = 0; Index < GspHwBreakpointCount; Index++) { - if (GspHwBreakpoints[Index].Type == Type && - GspHwBreakpoints[Index].Address == Address && - GspHwBreakpoints[Index].Length == Length) + if (GspHwBreakpoints[Index].Type == Type && + GspHwBreakpoints[Index].Address == Address && + GspHwBreakpoints[Index].Length == Length) { - DPRINT("Found match at index %u\n", Index); - if (Index + 1 < GspHwBreakpointCount) - { - memmove(GspHwBreakpoints + Index, - GspHwBreakpoints + (Index + 1), - (GspHwBreakpointCount - Index - 1) * - sizeof(GSPHWBREAKPOINT)); - } - GspHwBreakpointCount--; - strcpy(GspOutBuffer, "OK"); - return; + DPRINT("Found match at index %u\n", Index); + if (Index + 1 < GspHwBreakpointCount) + memmove(GspHwBreakpoints + Index, + GspHwBreakpoints + (Index + 1), + (GspHwBreakpointCount - Index - 1) * sizeof(GSPHWBREAKPOINT)); + + GspHwBreakpointCount--; + strcpy(GspOutBuffer, "OK"); + return; } } - DPRINT1("Not found\n"); - strcpy(GspOutBuffer, "E22"); + DPRINT1("Not found\n"); + strcpy(GspOutBuffer, "E22"); } static BOOLEAN GspFindSwBreakpoint(ULONG_PTR Address, PULONG PIndex) { - ULONG Index; + ULONG Index; - for (Index = 0; Index < GspSwBreakpointCount; Index++) - if (GspSwBreakpoints[Index].Address == Address) - { - if (PIndex) *PIndex = Index; - return TRUE; - } + for (Index = 0; Index < GspSwBreakpointCount; Index++) + if (GspSwBreakpoints[Index].Address == Address) + { + if (PIndex) + *PIndex = Index; + return TRUE; + } - return FALSE; + return FALSE; } static void GspSetSwBreakpoint(ULONG_PTR Address) { - DPRINT("GspSetSwBreakpoint(0x%p)\n", Address); + DPRINT("GspSetSwBreakpoint(0x%p)\n", Address); - if (MAX_SW_BREAKPOINTS == GspSwBreakpointCount) + if (MAX_SW_BREAKPOINTS == GspSwBreakpointCount) { - DPRINT1("Trying to set too many software breakpoints\n"); - strcpy(GspOutBuffer, "E22"); - return; + DPRINT1("Trying to set too many software breakpoints\n"); + strcpy(GspOutBuffer, "E22"); + return; } - if (GspFindSwBreakpoint(Address, NULL)) + if (GspFindSwBreakpoint(Address, NULL)) { - strcpy(GspOutBuffer, "E22"); - return; + strcpy(GspOutBuffer, "E22"); + return; } - DPRINT("Stored at index %u\n", GspSwBreakpointCount); - GspSwBreakpoints[GspSwBreakpointCount].Address = Address; - GspSwBreakpoints[GspSwBreakpointCount].Active = FALSE; - GspSwBreakpointCount++; - strcpy(GspOutBuffer, "OK"); + DPRINT("Stored at index %u\n", GspSwBreakpointCount); + GspSwBreakpoints[GspSwBreakpointCount].Address = Address; + GspSwBreakpoints[GspSwBreakpointCount].Active = FALSE; + GspSwBreakpointCount++; + strcpy(GspOutBuffer, "OK"); } static void GspRemoveSwBreakpoint(ULONG_PTR Address) { - ULONG Index; + ULONG Index; - DPRINT("GspRemoveSwBreakpoint(0x%p)\n", Address); + DPRINT("GspRemoveSwBreakpoint(0x%p)\n", Address); - if (GspFindSwBreakpoint(Address, &Index)) + if (GspFindSwBreakpoint(Address, &Index)) { - DPRINT("Found match at index %u\n", Index); - ASSERT(! GspSwBreakpoints[Index].Active); + DPRINT("Found match at index %u\n", Index); + ASSERT(!GspSwBreakpoints[Index].Active); - if (Index + 1 < GspSwBreakpointCount) - { - memmove(GspSwBreakpoints + Index, - GspSwBreakpoints + (Index + 1), - (GspSwBreakpointCount - Index - 1) * - sizeof(GSPSWBREAKPOINT)); - } - GspSwBreakpointCount--; - strcpy(GspOutBuffer, "OK"); - return; + if (Index + 1 < GspSwBreakpointCount) + memmove(GspSwBreakpoints + Index, + GspSwBreakpoints + (Index + 1), + (GspSwBreakpointCount - Index - 1) * sizeof(GSPSWBREAKPOINT)); + + GspSwBreakpointCount--; + strcpy(GspOutBuffer, "OK"); + return; } - DPRINT1("Not found\n"); - strcpy(GspOutBuffer, "E22"); + DPRINT1("Not found\n"); + strcpy(GspOutBuffer, "E22"); } static void -GspLoadHwBreakpoint(PKTRAP_FRAME TrapFrame, - unsigned BpIndex, - ULONG_PTR Address, - ULONG Length, - ULONG Type) +GspLoadHwBreakpoint(PKTRAP_FRAME TrapFrame, unsigned BpIndex, + ULONG_PTR Address, ULONG Length, ULONG Type) { - DPRINT("GspLoadHwBreakpoint(0x%p, %d, 0x%p, %d)\n", TrapFrame, BpIndex, - Address, Type); + DPRINT("GspLoadHwBreakpoint(0x%p, %d, 0x%p, %d)\n", + TrapFrame, BpIndex, Address, Type); - /* Set the DR7_Gx bit to globally enable the breakpoint */ - TrapFrame->Dr7 |= DR7_GLOBAL_ENABLE(BpIndex) | - DR7_LEN(BpIndex, Length) | - DR7_TYPE(BpIndex, Type); + /* Set the DR7_Gx bit to globally enable the breakpoint */ + TrapFrame->Dr7 |= DR7_GLOBAL_ENABLE(BpIndex) | + DR7_LEN(BpIndex, Length) | + DR7_TYPE(BpIndex, Type); - switch (BpIndex) + switch (BpIndex) { - case 0: - DPRINT("Setting DR0 to 0x%p\n", Address); - TrapFrame->Dr0 = Address; - break; + case 0: + DPRINT("Setting DR0 to 0x%p\n", Address); + TrapFrame->Dr0 = Address; + break; - case 1: - DPRINT("Setting DR1 to 0x%p\n", Address); - TrapFrame->Dr1 = Address; - break; + case 1: + DPRINT("Setting DR1 to 0x%p\n", Address); + TrapFrame->Dr1 = Address; + break; - case 2: - DPRINT("Setting DR2 to 0x%p\n", Address); - TrapFrame->Dr2 = Address; - break; + case 2: + DPRINT("Setting DR2 to 0x%p\n", Address); + TrapFrame->Dr2 = Address; + break; - case 3: - DPRINT("Setting DR3 to 0x%p\n", Address); - TrapFrame->Dr3 = Address; - break; + case 3: + DPRINT("Setting DR3 to 0x%p\n", Address); + TrapFrame->Dr3 = Address; + break; } } static void GspLoadSwBreakpoint(ULONG Index) { - GspMemoryError = FALSE; - GspSwBreakpoints[Index].PrevContent = GspReadMemSafe((PCHAR) GspSwBreakpoints[Index].Address); - if (! GspMemoryError) - { - GspWriteMemSafe((PCHAR) GspSwBreakpoints[Index].Address, I386_OPCODE_INT3); - } - GspSwBreakpoints[Index].Active = ! GspMemoryError; - if (GspMemoryError) - { - DPRINT1("Failed to set software breakpoint at 0x%p\n", - GspSwBreakpoints[Index].Address); - } - else - { - DPRINT("Successfully set software breakpoint at 0x%p\n", - GspSwBreakpoints[Index].Address); - } + GspMemoryError = FALSE; + + GspSwBreakpoints[Index].PrevContent = GspReadMemSafe((PCHAR)GspSwBreakpoints[Index].Address); + + if (!GspMemoryError) + GspWriteMemSafe((PCHAR)GspSwBreakpoints[Index].Address, I386_OPCODE_INT3); + + GspSwBreakpoints[Index].Active = !GspMemoryError; + + if (GspMemoryError) + DPRINT1("Failed to set software breakpoint at 0x%p\n", GspSwBreakpoints[Index].Address); + else + DPRINT("Successfully set software breakpoint at 0x%p\n", GspSwBreakpoints[Index].Address); } static void GspLoadBreakpoints(PKTRAP_FRAME TrapFrame) { - unsigned Index; - ULONG i386Type; + unsigned Index; + ULONG i386Type; - DPRINT("GspLoadBreakpoints\n"); - DPRINT("DR7 on entry: 0x%08x\n", TrapFrame->Dr7); + DPRINT("GspLoadBreakpoints\n"); + DPRINT("DR7 on entry: 0x%08x\n", TrapFrame->Dr7); - /* Remove all breakpoints */ - TrapFrame->Dr7 &= ~(DR7_L0 | DR7_L1 | DR7_L2 | DR7_L3 | - DR7_G0 | DR7_G1 | DR7_G2 | DR7_G3 | - DR7_TYPE0_MASK | DR7_LEN0_MASK | - DR7_TYPE1_MASK | DR7_LEN1_MASK | - DR7_TYPE2_MASK | DR7_LEN2_MASK | - DR7_TYPE3_MASK | DR7_LEN3_MASK); + /* Remove all breakpoints */ + TrapFrame->Dr7 &= ~(DR7_L0 | DR7_L1 | DR7_L2 | DR7_L3 | + DR7_G0 | DR7_G1 | DR7_G2 | DR7_G3 | + DR7_TYPE0_MASK | DR7_LEN0_MASK | + DR7_TYPE1_MASK | DR7_LEN1_MASK | + DR7_TYPE2_MASK | DR7_LEN2_MASK | + DR7_TYPE3_MASK | DR7_LEN3_MASK); - for (Index = 0; Index < GspHwBreakpointCount; Index++) + for (Index = 0; Index < GspHwBreakpointCount; Index++) { - switch(GspHwBreakpoints[Index].Type) + switch (GspHwBreakpoints[Index].Type) { - case GDB_ZTYPE_HARDWARE_BREAKPOINT: - i386Type = I386_BP_TYPE_EXECUTE; - break; - case GDB_ZTYPE_WRITE_WATCHPOINT: - i386Type = I386_BP_TYPE_DATA_WRITE; - break; - case GDB_ZTYPE_ACCESS_WATCHPOINT: - i386Type = I386_BP_TYPE_DATA_READWRITE; - break; - default: - ASSERT(FALSE); - i386Type = I386_BP_TYPE_EXECUTE; - break; + case GDB_ZTYPE_HARDWARE_BREAKPOINT: + i386Type = I386_BP_TYPE_EXECUTE; + break; + case GDB_ZTYPE_WRITE_WATCHPOINT: + i386Type = I386_BP_TYPE_DATA_WRITE; + break; + case GDB_ZTYPE_ACCESS_WATCHPOINT: + i386Type = I386_BP_TYPE_DATA_READWRITE; + break; + default: + ASSERT(FALSE); + i386Type = I386_BP_TYPE_EXECUTE; + break; } - GspLoadHwBreakpoint(TrapFrame, Index, GspHwBreakpoints[Index].Address, - GspHwBreakpoints[Index].Length - 1, i386Type); + GspLoadHwBreakpoint(TrapFrame, Index, GspHwBreakpoints[Index].Address, + GspHwBreakpoints[Index].Length - 1, i386Type); } - for (Index = 0; Index < GspSwBreakpointCount; Index++) + for (Index = 0; Index < GspSwBreakpointCount; Index++) { - DPRINT("Using real software breakpoint\n"); - GspLoadSwBreakpoint(Index); + DPRINT("Using real software breakpoint\n"); + GspLoadSwBreakpoint(Index); } - DPRINT("Final DR7 value 0x%08x\n", TrapFrame->Dr7); + DPRINT("Final DR7 value 0x%08x\n", TrapFrame->Dr7); } static void GspUnloadBreakpoints(void) { - unsigned Index; + unsigned Index; - DPRINT("GspUnloadBreakpoints\n"); + DPRINT("GspUnloadBreakpoints\n"); - /* Disable hardware debugging while we are inside the stub */ - Ke386SetDr7(0); + /* Disable hardware debugging while we are inside the stub */ + Ke386SetDr7(0); - for (Index = 0; Index < GspSwBreakpointCount; Index++) + for (Index = 0; Index < GspSwBreakpointCount; Index++) { - if (GspSwBreakpoints[Index].Active) + if (GspSwBreakpoints[Index].Active) { - GspMemoryError = FALSE; - GspWriteMemSafe((PCHAR) GspSwBreakpoints[Index].Address, - GspSwBreakpoints[Index].PrevContent); - GspSwBreakpoints[Index].Active = FALSE; - if (GspMemoryError) + GspMemoryError = FALSE; + GspWriteMemSafe((PCHAR)GspSwBreakpoints[Index].Address, + GspSwBreakpoints[Index].PrevContent); + GspSwBreakpoints[Index].Active = FALSE; + if (GspMemoryError) { - DPRINT1("Failed to remove software breakpoint from 0x%p\n", - GspSwBreakpoints[Index].Address); + DPRINT1("Failed to remove software breakpoint from 0x%p\n", + GspSwBreakpoints[Index].Address); } - else + else { - DPRINT("Successfully removed software breakpoint from 0x%p\n", - GspSwBreakpoints[Index].Address); + DPRINT("Successfully removed software breakpoint from 0x%p\n", + GspSwBreakpoints[Index].Address); } } } @@ -1206,58 +1146,57 @@ GspStopReply(NTSTATUS ExceptionCode, PKTRAP_FRAME TrapFrame) ULONG SigVal; LONG Esp; - switch (ExceptionCode) + switch (ExceptionCode) { - case STATUS_INTEGER_DIVIDE_BY_ZERO: - SigVal = 8; /* divide by zero */ - break; - case STATUS_SINGLE_STEP: - case STATUS_BREAKPOINT: - SigVal = 5; /* breakpoint */ - break; - case STATUS_INTEGER_OVERFLOW: - case STATUS_ARRAY_BOUNDS_EXCEEDED: - SigVal = 16; /* bound instruction */ - break; - case STATUS_ILLEGAL_INSTRUCTION: - SigVal = 4; /* Invalid opcode */ - break; - case STATUS_STACK_OVERFLOW: - case STATUS_DATATYPE_MISALIGNMENT: - case STATUS_ACCESS_VIOLATION: - SigVal = 11; /* access violation */ - break; - default: - SigVal = 7; /* "software generated" */ + case STATUS_INTEGER_DIVIDE_BY_ZERO: + SigVal = 8; /* divide by zero */ + break; + case STATUS_SINGLE_STEP: + case STATUS_BREAKPOINT: + SigVal = 5; /* breakpoint */ + break; + case STATUS_INTEGER_OVERFLOW: + case STATUS_ARRAY_BOUNDS_EXCEEDED: + SigVal = 16; /* bound instruction */ + break; + case STATUS_ILLEGAL_INSTRUCTION: + SigVal = 4; /* Invalid opcode */ + break; + case STATUS_STACK_OVERFLOW: + case STATUS_DATATYPE_MISALIGNMENT: + case STATUS_ACCESS_VIOLATION: + SigVal = 11; /* access violation */ + break; + default: + SigVal = 7; /* "software generated" */ } - ptr = GspOutBuffer; + ptr = GspOutBuffer; - *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */ - *ptr++ = HexChars[(SigVal >> 4) & 0xf]; - *ptr++ = HexChars[SigVal & 0xf]; + *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */ + *ptr++ = HexChars[(SigVal >> 4) & 0xf]; + *ptr++ = HexChars[SigVal & 0xf]; - *ptr++ = HexChars[ESP]; - *ptr++ = ':'; + *ptr++ = HexChars[ESP]; + *ptr++ = ':'; - Esp = GspGetEspFromTrapFrame(TrapFrame); /* SP */ - ptr = GspMem2Hex((PCHAR) &Esp, ptr, 4, 0); - *ptr++ = ';'; + Esp = GspGetEspFromTrapFrame(TrapFrame); /* SP */ + ptr = GspMem2Hex((PCHAR)&Esp, ptr, 4, 0); + *ptr++ = ';'; - *ptr++ = HexChars[EBP]; - *ptr++ = ':'; - ptr = GspMem2Hex((PCHAR) &TrapFrame->Ebp, ptr, 4, 0); /* FP */ - *ptr++ = ';'; + *ptr++ = HexChars[EBP]; + *ptr++ = ':'; + ptr = GspMem2Hex((PCHAR)&TrapFrame->Ebp, ptr, 4, 0); /* FP */ + *ptr++ = ';'; - *ptr++ = HexChars[PC]; - *ptr++ = ':'; - ptr = GspMem2Hex((PCHAR) &TrapFrame->Eip, ptr, 4, 0); /* PC */ - *ptr++ = ';'; + *ptr++ = HexChars[PC]; + *ptr++ = ':'; + ptr = GspMem2Hex((PCHAR)&TrapFrame->Eip, ptr, 4, 0); /* PC */ + *ptr++ = ';'; - *ptr = '\0'; + *ptr = '\0'; } - /* * This function does all command procesing for interfacing to GDB. */ @@ -1277,224 +1216,219 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, /* FIXME: Stop on other CPUs too */ DPRINT("Thread %p entering stub\n", PsGetCurrentThread()); - ExceptionCode = (NTSTATUS) ExceptionRecord->ExceptionCode; + ExceptionCode = (NTSTATUS)ExceptionRecord->ExceptionCode; - /* Can only debug 1 thread at a time... */ - ExAcquireFastMutex(&GspLock); - DPRINT("Thread %p acquired mutex\n", PsGetCurrentThread()); + /* Can only debug 1 thread at a time... */ + ExAcquireFastMutex(&GspLock); + DPRINT("Thread %p acquired mutex\n", PsGetCurrentThread()); - GspUnloadBreakpoints(); + GspUnloadBreakpoints(); - /* Make sure we're debugging the current thread. */ - if (NULL != GspDbgThread) + /* Make sure we're debugging the current thread. */ + if (NULL != GspDbgThread) + { + DPRINT1("Internal error: entering stub with non-NULL GspDbgThread\n"); + ObDereferenceObject(GspDbgThread); + GspDbgThread = NULL; + } + + if (GdbAttached) + { + GspStopReply(ExceptionCode, TrapFrame); + GspPutPacket(GspOutBuffer); + // DbgPrint(">>> (%s) >>>\n", GspOutBuffer); + } + else + { + GdbAttached = TRUE; + } + + while (TRUE) + { + /* Zero the buffer now so we don't have to worry about the terminating zero character */ + memset(GspOutBuffer, 0, sizeof(GspOutBuffer)); + ptr = GspGetPacket(); + // DbgPrint("<<< (%s) <<<\n", ptr); + + switch (*ptr++) { - DPRINT1("Internal error: entering stub with non-NULL GspDbgThread\n"); - ObDereferenceObject(GspDbgThread); - GspDbgThread = NULL; - } - - if (GdbAttached) - { - GspStopReply(ExceptionCode, TrapFrame); - GspPutPacket(GspOutBuffer); - // DbgPrint(">>> (%s) >>>\n", GspOutBuffer); - } - else - { - GdbAttached = TRUE; - } - - while (TRUE) - { - /* Zero the buffer now so we don't have to worry about the terminating zero character */ - memset(GspOutBuffer, 0, sizeof(GspOutBuffer)); - ptr = GspGetPacket(); - // DbgPrint("<<< (%s) <<<\n", ptr); - - switch(*ptr++) - { case '?': - /* a little hack to send more complete status information */ - GspStopReply(ExceptionCode, TrapFrame); - break; + /* a little hack to send more complete status information */ + GspStopReply(ExceptionCode, TrapFrame); + break; + case 'd': - GspRemoteDebug = !GspRemoteDebug; /* toggle debug flag */ - break; + GspRemoteDebug = !GspRemoteDebug; /* toggle debug flag */ + break; + case 'g': /* return the value of the CPU Registers */ - GspGetRegisters(GspOutBuffer, TrapFrame); - break; + GspGetRegisters(GspOutBuffer, TrapFrame); + break; + case 'G': /* set the value of the CPU Registers - return OK */ - if (NULL != GspDbgThread) - { - GspSetRegistersInTrapFrame(ptr, Context, GspDbgThread->Tcb.TrapFrame); - } - else - { - GspSetRegistersInTrapFrame(ptr, Context, TrapFrame); - } - strcpy(GspOutBuffer, "OK"); - break; + if (NULL != GspDbgThread) + GspSetRegistersInTrapFrame(ptr, Context, GspDbgThread->Tcb.TrapFrame); + else + GspSetRegistersInTrapFrame(ptr, Context, TrapFrame); + + strcpy(GspOutBuffer, "OK"); + break; + case 'P': /* set the value of a single CPU register - return OK */ - { + { LONG Register; if ((GspHex2Long(&ptr, &Register)) && (*ptr++ == '=')) - { + { if ((Register >= 0) && (Register < NUMREGS)) - { + { if (GspDbgThread) - { - GspSetSingleRegisterInTrapFrame(ptr, Register, - Context, + { + GspSetSingleRegisterInTrapFrame(ptr, Register, Context, GspDbgThread->Tcb.TrapFrame); - } + } else - { - GspSetSingleRegisterInTrapFrame(ptr, Register, - Context, TrapFrame); - } + { + GspSetSingleRegisterInTrapFrame(ptr, Register, Context, TrapFrame); + } strcpy(GspOutBuffer, "OK"); break; - } - } + } + } strcpy(GspOutBuffer, "E01"); break; - } + } /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ case 'm': - /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */ - if (GspHex2Long(&ptr, &Address) && - *(ptr++) == ',' && - GspHex2Long(&ptr, &Length)) + { + /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */ + if (GspHex2Long(&ptr, &Address) && *(ptr++) == ',' && GspHex2Long(&ptr, &Length)) { - PEPROCESS DbgProcess = NULL; + PEPROCESS DbgProcess = NULL; - ptr = NULL; - if (NULL != GspDbgThread && - PsGetCurrentProcess() != GspDbgThread->ThreadsProcess) + ptr = NULL; + if (NULL != GspDbgThread && + PsGetCurrentProcess() != GspDbgThread->ThreadsProcess) { - DbgProcess = GspDbgThread->ThreadsProcess; - KeAttachProcess(&DbgProcess->Pcb); + DbgProcess = GspDbgThread->ThreadsProcess; + KeAttachProcess(&DbgProcess->Pcb); } - GspMemoryError = FALSE; - GspMem2Hex((PCHAR) Address, GspOutBuffer, Length, 1); - if (NULL != DbgProcess) + + GspMemoryError = FALSE; + GspMem2Hex((PCHAR)Address, GspOutBuffer, Length, 1); + + if (NULL != DbgProcess) + KeDetachProcess(); + + if (GspMemoryError) { - KeDetachProcess(); - } - if (GspMemoryError) - { - strcpy(GspOutBuffer, "E03"); - DPRINT1("Fault during memory read\n"); + strcpy(GspOutBuffer, "E03"); + DPRINT1("Fault during memory read\n"); } } - if (NULL != ptr) - { - strcpy(GspOutBuffer, "E01"); - } - break; + if (NULL != ptr) + strcpy(GspOutBuffer, "E01"); + + break; + } /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ case 'M': - /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */ - if (GspHex2Long(&ptr, &Address)) + { + /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */ + if (GspHex2Long(&ptr, &Address)) { - if (*(ptr++) == ',' && - GspHex2Long(&ptr, &Length) && - *(ptr++) == ':') + if (*(ptr++) == ',' && GspHex2Long(&ptr, &Length) && *(ptr++) == ':') { - PEPROCESS DbgProcess = NULL; + PEPROCESS DbgProcess = NULL; - if (NULL != GspDbgThread && - PsGetCurrentProcess() != GspDbgThread->ThreadsProcess) + if (NULL != GspDbgThread && + PsGetCurrentProcess() != GspDbgThread->ThreadsProcess) { - DbgProcess = GspDbgThread->ThreadsProcess; - KeAttachProcess(&DbgProcess->Pcb); + DbgProcess = GspDbgThread->ThreadsProcess; + KeAttachProcess(&DbgProcess->Pcb); } - GspMemoryError = FALSE; - GspHex2Mem(ptr, (PCHAR) Address, Length, TRUE); - if (NULL != DbgProcess) + GspMemoryError = FALSE; + GspHex2Mem(ptr, (PCHAR)Address, Length, TRUE); + if (NULL != DbgProcess) + KeDetachProcess(); + + if (GspMemoryError) { - KeDetachProcess(); + strcpy(GspOutBuffer, "E03"); + DPRINT1("Fault during memory write\n"); } - if (GspMemoryError) + else { - strcpy(GspOutBuffer, "E03"); - DPRINT1("Fault during memory write\n"); + strcpy(GspOutBuffer, "OK"); } - else - { - strcpy(GspOutBuffer, "OK"); - } - ptr = NULL; + ptr = NULL; } } - if (NULL != ptr) - { - strcpy(GspOutBuffer, "E02"); - } - break; + if (NULL != ptr) + strcpy(GspOutBuffer, "E02"); - /* cAA..AA Continue at address AA..AA(optional) */ - /* sAA..AA Step one instruction from AA..AA(optional) */ + break; + } + + /* cAA..AA Continue at address AA..AA */ + /* sAA..AA Step one instruction from AA..AA */ case 's': - Stepping = TRUE; + Stepping = TRUE; case 'c': - { + { ULONG BreakpointNumber; ULONG Dr6; /* try to read optional parameter, pc changed if param */ - if (GspHex2Long (&ptr, &Address)) - { + if (GspHex2Long(&ptr, &Address)) + { Context->Eip = Address; - } + } else if (ExceptionCode == STATUS_BREAKPOINT) - { - if (GspReadMemSafe((PCHAR) Context->Eip) == (CHAR) I386_OPCODE_INT3) - { + { + if (GspReadMemSafe((PCHAR)Context->Eip) == (CHAR)I386_OPCODE_INT3) Context->Eip++; - } - } + } /* clear the trace bit */ Context->EFlags &= ~EFLAGS_TF; /* set the trace bit if we're Stepping */ if (Stepping) - { Context->EFlags |= EFLAGS_TF; - } Dr6 = Ke386GetDr6(); if (!(Dr6 & DR6_BS)) - { - for (BreakpointNumber = 0; BreakpointNumber < MAX_HW_BREAKPOINTS; ++BreakpointNumber) - { + { + for (BreakpointNumber = 0; + BreakpointNumber < MAX_HW_BREAKPOINTS; + BreakpointNumber++) + { if (Dr6 & (1 << BreakpointNumber)) - { + { if (GspHwBreakpoints[BreakpointNumber].Type == I386_BP_TYPE_EXECUTE) - { + { /* Set restore flag */ Context->EFlags |= EFLAGS_RF; break; - } - } - } - } + } + } + } + } GspLoadBreakpoints(TrapFrame); Ke386SetDr6(0); if (NULL != GspDbgThread) - { + { ObDereferenceObject(GspDbgThread); GspDbgThread = NULL; - } + } DPRINT("Thread %p releasing mutex\n", PsGetCurrentThread()); ExReleaseFastMutex(&GspLock); @@ -1502,124 +1436,112 @@ KdpGdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord, if (ExceptionCode == STATUS_BREAKPOINT || ExceptionCode == STATUS_SINGLE_STEP) - { return kdContinue; - } return kdHandleException; - } - - case 'k': /* kill the program */ - strcpy(GspOutBuffer, "OK"); - break; - - case 'H': /* Set thread */ - GspSetThread(ptr); - break; - - case 'q': /* Query */ - GspQuery(ptr); - break; - - case 'T': /* Query thread status */ - GspQueryThreadStatus(ptr); - break; - - case 'Z': - { - LONG Type; - LONG Address; - LONG Length; - - GspHex2Long(&ptr, &Type); - ptr++; - GspHex2Long(&ptr, &Address); - ptr++; - GspHex2Long(&ptr, &Length); - if (0 == Type) - { - GspSetSwBreakpoint((ULONG_PTR) Address); - } - else - { - GspSetHwBreakpoint(Type, (ULONG_PTR) Address, Length); - } - break; - } - - case 'z': - { - LONG Type; - LONG Address; - LONG Length; - - GspHex2Long(&ptr, &Type); - ptr++; - GspHex2Long(&ptr, &Address); - ptr++; - GspHex2Long(&ptr, &Length); - if (0 == Type) - { - GspRemoveSwBreakpoint((ULONG_PTR) Address); - } - else - { - GspRemoveHwBreakpoint(Type, (ULONG_PTR) Address, Length); - } - break; - } - - default: - break; } - /* reply to the request */ - GspPutPacket(GspOutBuffer); - // DbgPrint(">>> (%s) >>>\n", GspOutBuffer); - } -} + case 'k': /* kill the program */ + strcpy(GspOutBuffer, "OK"); + break; + case 'H': /* Set thread */ + GspSetThread(ptr); + break; + + case 'q': /* Query */ + GspQuery(ptr); + break; + + case 'T': /* Query thread status */ + GspQueryThreadStatus(ptr); + break; + + case 'Z': + { + LONG Type; + LONG Address; + LONG Length; + + GspHex2Long(&ptr, &Type); + ptr++; + GspHex2Long(&ptr, &Address); + ptr++; + GspHex2Long(&ptr, &Length); + + if (0 == Type) + GspSetSwBreakpoint((ULONG_PTR)Address); + else + GspSetHwBreakpoint(Type, (ULONG_PTR)Address, Length); + + break; + } + + case 'z': + { + LONG Type; + LONG Address; + LONG Length; + + GspHex2Long(&ptr, &Type); + ptr++; + GspHex2Long(&ptr, &Address); + ptr++; + GspHex2Long(&ptr, &Length); + + if (0 == Type) + GspRemoveSwBreakpoint((ULONG_PTR)Address); + else + GspRemoveHwBreakpoint(Type, (ULONG_PTR)Address, Length); + + break; + } + + default: + break; + } + + /* reply to the request */ + GspPutPacket(GspOutBuffer); + // DbgPrint(">>> (%s) >>>\n", GspOutBuffer); + } +} BOOLEAN NTAPI -GspBreakIn(PKINTERRUPT Interrupt, - PVOID ServiceContext) +GspBreakIn(PKINTERRUPT Interrupt, PVOID ServiceContext) { - PKTRAP_FRAME TrapFrame; - BOOLEAN DoBreakIn; - CONTEXT Context; - KIRQL OldIrql; - UCHAR Value; + PKTRAP_FRAME TrapFrame; + BOOLEAN DoBreakIn; + CONTEXT Context; + KIRQL OldIrql; + UCHAR Value; - DPRINT("Break In\n"); + DPRINT("Break In\n"); - DoBreakIn = FALSE; - while (KdPortGetByteEx(&GdbPortInfo, &Value)) + DoBreakIn = FALSE; + while (KdPortGetByteEx(&GdbPortInfo, &Value)) { - if (Value == 0x03) - { - DoBreakIn = TRUE; - } + if (Value == 0x03) + DoBreakIn = TRUE; } - if (!DoBreakIn) - { - return TRUE; - } + if (!DoBreakIn) + return TRUE; - KeRaiseIrql(HIGH_LEVEL, &OldIrql); + KeRaiseIrql(HIGH_LEVEL, &OldIrql); - TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame; + TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame; - KeTrapFrameToContext(TrapFrame, NULL, &Context); + KeTrapFrameToContext(TrapFrame, NULL, &Context); - KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame); + KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame); - KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags, KernelMode); + KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags, KernelMode); - KeLowerIrql(OldIrql); + KeLowerIrql(OldIrql); - return TRUE; + return TRUE; } VOID @@ -1631,40 +1553,37 @@ KdpGdbDebugPrint(PCH Message, ULONG Length) /* Initialize the GDB stub */ VOID NTAPI -KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable, - ULONG BootPhase) +KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable, ULONG BootPhase) { - if (!KdDebuggerEnabled || !KdpDebugMode.Gdb) + if (!KdDebuggerEnabled || !KdpDebugMode.Gdb) + return; + + if (BootPhase == 0) { - return; + ExInitializeFastMutex(&GspLock); + + /* Write out the functions that we support for now */ + WrapperTable->KdpInitRoutine = KdpGdbStubInit; + WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint; + WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException; + + /* Initialize the Port */ + KdPortInitializeEx(&GdbPortInfo, 0, 0); } - - if (BootPhase == 0) + else if (BootPhase == 1) { - ExInitializeFastMutex(&GspLock); + GspInitialized = TRUE; - /* Write out the functions that we support for now */ - WrapperTable->KdpInitRoutine = KdpGdbStubInit; - WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint; - WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException; + GspRunThread = NULL; + GspDbgThread = NULL; + GspEnumThread = NULL; - /* Initialize the Port */ - KdPortInitializeEx(&GdbPortInfo, 0, 0); + HalDisplayString("Waiting for GDB to attach\n"); + DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); } - else if (BootPhase == 1) + else if (BootPhase == 2) { - GspInitialized = TRUE; - - GspRunThread = NULL; - GspDbgThread = NULL; - GspEnumThread = NULL; - - HalDisplayString("Waiting for GDB to attach\n"); - DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); - } - else if (BootPhase == 2) - { - HalDisplayString("\n GDB debugging enabled\n\n"); + HalDisplayString("\n GDB debugging enabled\n\n"); } } From 8374c07f2d819951c5b1a6b09a4a551be5d8cf6e Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 22 Jun 2009 13:28:18 +0000 Subject: [PATCH 036/577] Fix comment. svn path=/trunk/; revision=41538 --- reactos/ntoskrnl/kd/wrappers/kdbg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/kd/wrappers/kdbg.c b/reactos/ntoskrnl/kd/wrappers/kdbg.c index 342120752a1..23655ac600b 100644 --- a/reactos/ntoskrnl/kd/wrappers/kdbg.c +++ b/reactos/ntoskrnl/kd/wrappers/kdbg.c @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: ntoskrnl/kd/wrappers/bochs.c + * FILE: ntoskrnl/kd/wrappers/kdbg.c * PURPOSE: KDBG Wrapper for Kd * * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org) From e8904388455eb4e8f88053dae5fe3d29029c4d8a Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 22 Jun 2009 13:37:49 +0000 Subject: [PATCH 037/577] Silence warnings. svn path=/trunk/; revision=41539 --- reactos/ntoskrnl/include/internal/ex.h | 6 +++--- reactos/ntoskrnl/include/internal/mm.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index e39a129fd42..45f79909e4f 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -574,8 +574,8 @@ ExInsertFastReference(IN OUT PEX_FAST_REF FastRef, return TRUE; } -BOOLEAN FORCEINLINE +BOOLEAN ExReleaseFastReference(IN PEX_FAST_REF FastRef, IN PVOID Object) { @@ -609,8 +609,8 @@ ExReleaseFastReference(IN PEX_FAST_REF FastRef, return TRUE; } -EX_FAST_REF FORCEINLINE +EX_FAST_REF ExSwapFastReference(IN PEX_FAST_REF FastRef, IN PVOID Object) { @@ -636,8 +636,8 @@ ExSwapFastReference(IN PEX_FAST_REF FastRef, return OldValue; } -EX_FAST_REF FORCEINLINE +EX_FAST_REF ExCompareSwapFastReference(IN PEX_FAST_REF FastRef, IN PVOID Object, IN PVOID OldObject) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 04d2aaa33b9..75524ebb8a9 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1158,8 +1158,8 @@ MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page); // // ReactOS Compatibility Layer // -PVOID FORCEINLINE +PVOID MmCreateHyperspaceMapping(IN PFN_NUMBER Page) { HyperProcess = (PEPROCESS)KeGetCurrentThread()->ApcState.Process; From debf9f3155a8de8c5ba1396356dbbec5ae59ef65 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 22 Jun 2009 13:47:10 +0000 Subject: [PATCH 038/577] Fix build. svn path=/trunk/; revision=41541 --- reactos/ntoskrnl/kd/kdmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/kd/kdmain.c b/reactos/ntoskrnl/kd/kdmain.c index 2d736a8ecfe..8874d2142c6 100644 --- a/reactos/ntoskrnl/kd/kdmain.c +++ b/reactos/ntoskrnl/kd/kdmain.c @@ -116,7 +116,7 @@ KdpEnterDebuggerException(IN PKTRAP_FRAME TrapFrame, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChance) { - KD_CONTINUE_TYPE Return; + KD_CONTINUE_TYPE Return = kdHandleException; ULONG ExceptionCommand = ExceptionRecord->ExceptionInformation[0]; #ifdef _M_IX86 ULONG EipOld; From e44867e54a1e0272909e128ea977512e0c815005 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 13:51:07 +0000 Subject: [PATCH 039/577] sync jscript with wine 1.1.24 svn path=/trunk/; revision=41542 --- reactos/dll/win32/jscript/date.c | 639 ++++++++++++++++++++++++++++--- 1 file changed, 578 insertions(+), 61 deletions(-) diff --git a/reactos/dll/win32/jscript/date.c b/reactos/dll/win32/jscript/date.c index e17ad268f56..3fd856eaebb 100644 --- a/reactos/dll/win32/jscript/date.c +++ b/reactos/dll/win32/jscript/date.c @@ -64,18 +64,18 @@ static const WCHAR getMinutesW[] = {'g','e','t','M','i','n','u','t','e','s',0}; static const WCHAR getUTCMinutesW[] = {'g','e','t','U','T','C','M','i','n','u','t','e','s',0}; static const WCHAR getSecondsW[] = {'g','e','t','S','e','c','o','n','d','s',0}; static const WCHAR getUTCSecondsW[] = {'g','e','t','U','T','C','S','e','c','o','n','d','s',0}; -static const WCHAR getMilisecondsW[] = {'g','e','t','M','i','l','i','s','e','c','o','n','d','s',0}; -static const WCHAR getUTCMilisecondsW[] = {'g','e','t','U','T','C','M','i','l','i','s','e','c','o','n','d','s',0}; +static const WCHAR getMillisecondsW[] = {'g','e','t','M','i','l','l','i','s','e','c','o','n','d','s',0}; +static const WCHAR getUTCMillisecondsW[] = {'g','e','t','U','T','C','M','i','l','l','i','s','e','c','o','n','d','s',0}; static const WCHAR getTimezoneOffsetW[] = {'g','e','t','T','i','m','e','z','o','n','e','O','f','f','s','e','t',0}; static const WCHAR setTimeW[] = {'s','e','t','T','i','m','e',0}; -static const WCHAR setMilisecondsW[] = {'s','e','t','M','i','l','i','s','e','c','o','n','d','s',0}; -static const WCHAR setUTCMilisecondsW[] = {'s','e','t','U','T','C','M','i','l','i','s','e','c','o','n','d','s',0}; +static const WCHAR setMillisecondsW[] = {'s','e','t','M','i','l','l','i','s','e','c','o','n','d','s',0}; +static const WCHAR setUTCMillisecondsW[] = {'s','e','t','U','T','C','M','i','l','l','i','s','e','c','o','n','d','s',0}; static const WCHAR setSecondsW[] = {'s','e','t','S','e','c','o','n','d','s',0}; static const WCHAR setUTCSecondsW[] = {'s','e','t','U','T','C','S','e','c','o','n','d','s',0}; static const WCHAR setMinutesW[] = {'s','e','t','M','i','n','u','t','e','s',0}; static const WCHAR setUTCMinutesW[] = {'s','e','t','U','T','C','M','i','n','u','t','e','s',0}; static const WCHAR setHoursW[] = {'s','e','t','H','o','u','r','s',0}; -static const WCHAR setUTCHoursW[] = {'s','e','t','H','o','u','r','s',0}; +static const WCHAR setUTCHoursW[] = {'s','e','t','U','T','C','H','o','u','r','s',0}; static const WCHAR setDateW[] = {'s','e','t','D','a','t','e',0}; static const WCHAR setUTCDateW[] = {'s','e','t','U','T','C','D','a','t','e',0}; static const WCHAR setMonthW[] = {'s','e','t','M','o','n','t','h',0}; @@ -83,6 +83,200 @@ static const WCHAR setUTCMonthW[] = {'s','e','t','U','T','C','M','o','n','t','h' static const WCHAR setFullYearW[] = {'s','e','t','F','u','l','l','Y','e','a','r',0}; static const WCHAR setUTCFullYearW[] = {'s','e','t','U','T','C','F','u','l','l','Y','e','a','r',0}; +/*ECMA-262 3th Edition 15.9.1.2 */ +#define MS_PER_DAY 86400000 +#define MS_PER_HOUR 3600000 +#define MS_PER_MINUTE 60000 + +/* ECMA-262 3th Edition 15.9.1.2 */ +static inline DOUBLE day(DOUBLE time) +{ + return floor(time / MS_PER_DAY); +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline DOUBLE days_in_year(DOUBLE year) +{ + int y; + + if(year != (int)year) + return ret_nan(); + + y = year; + if(y%4 != 0) return 365; + if(y%100 != 0) return 366; + if(y%400 != 0) return 365; + return 366; +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline DOUBLE day_from_year(DOUBLE year) +{ + int y; + + if(year != (int)year) + return ret_nan(); + + y = year; + return 365*(y-1970) + floor((y-1969)/4) + - floor((y-1901)/100) + floor((y-1601)/400); +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline DOUBLE time_from_year(DOUBLE year) +{ + return MS_PER_DAY*day_from_year(year); +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline DOUBLE year_from_time(DOUBLE time) +{ + int y; + + if(isnan(time)) + return ret_nan(); + + y = 1970 + time/365.25/MS_PER_DAY; + + if(time_from_year(y) > time) + while(time_from_year(y) > time) y--; + else + while(time_from_year(y+1)<=time) y++; + + return y; +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline int in_leap_year(DOUBLE time) +{ + if(days_in_year(year_from_time(time))==366) + return 1; + return 0; +} + +/* ECMA-262 3th Edition 15.9.1.4 */ +static inline int day_within_year(DOUBLE time) +{ + return day(time) - day_from_year(year_from_time(time)); +} + +/* ECMA-262 3th Edition 15.9.1.4 */ +static inline DOUBLE month_from_time(DOUBLE time) +{ + int ily = in_leap_year(time); + int dwy = day_within_year(time); + + if(isnan(time)) + return ret_nan(); + + if(0<=dwy && dwy<31) return 0; + if(dwy < 59+ily) return 1; + if(dwy < 90+ily) return 2; + if(dwy < 120+ily) return 3; + if(dwy < 151+ily) return 4; + if(dwy < 181+ily) return 5; + if(dwy < 212+ily) return 6; + if(dwy < 243+ily) return 7; + if(dwy < 273+ily) return 8; + if(dwy < 304+ily) return 9; + if(dwy < 334+ily) return 10; + return 11; +} + +/* ECMA-262 3th Edition 15.9.1.5 */ +static inline DOUBLE date_from_time(DOUBLE time) +{ + int dwy = day_within_year(time); + int ily = in_leap_year(time); + int mft = month_from_time(time); + + if(isnan(time)) + return ret_nan(); + + if(mft==0) return dwy+1; + if(mft==1) return dwy-30; + if(mft==2) return dwy-58-ily; + if(mft==3) return dwy-89-ily; + if(mft==4) return dwy-119-ily; + if(mft==5) return dwy-150-ily; + if(mft==6) return dwy-180-ily; + if(mft==7) return dwy-211-ily; + if(mft==8) return dwy-242-ily; + if(mft==9) return dwy-272-ily; + if(mft==10) return dwy-303-ily; + return dwy-333-ily; +} + +/* ECMA-262 3th Edition 15.9.1.6 */ +static inline DOUBLE week_day(DOUBLE time) +{ + DOUBLE ret; + + if(isnan(time)) + return ret_nan(); + + ret = fmod(day(time)+4, 7); + if(ret<0) ret += 7; + + return ret; +} + +/* ECMA-262 3th Edition 15.9.1.10 */ +static inline DOUBLE hour_from_time(DOUBLE time) +{ + DOUBLE ret; + + if(isnan(time)) + return ret_nan(); + + ret = fmod(floor(time/MS_PER_HOUR), 24); + if(ret<0) ret += 24; + + return ret; +} + +/* ECMA-262 3th Edition 15.9.1.10 */ +static inline DOUBLE min_from_time(DOUBLE time) +{ + DOUBLE ret; + + if(isnan(time)) + return ret_nan(); + + ret = fmod(floor(time/MS_PER_MINUTE), 60); + if(ret<0) ret += 60; + + return ret; +} + +/* ECMA-262 3th Edition 15.9.1.10 */ +static inline DOUBLE sec_from_time(DOUBLE time) +{ + DOUBLE ret; + + if(isnan(time)) + return ret_nan(); + + ret = fmod(floor(time/1000), 60); + if(ret<0) ret += 60; + + return ret; +} + +/* ECMA-262 3th Edition 15.9.1.10 */ +static inline DOUBLE ms_from_time(DOUBLE time) +{ + DOUBLE ret; + + if(isnan(time)) + return ret_nan(); + + ret = fmod(time, 1000); + if(ret<0) ret += 1000; + + return ret; +} + /* ECMA-262 3rd Edition 15.9.1.14 */ static inline DOUBLE time_clip(DOUBLE time) { @@ -188,116 +382,308 @@ static HRESULT Date_getTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM return S_OK; } +/* ECMA-262 3th Edition 15.9.1.3 */ static HRESULT Date_getFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, year_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.3 */ static HRESULT Date_getUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, year_from_time(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.4 */ static HRESULT Date_getMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, month_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.4 */ static HRESULT Date_getUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, month_from_time(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.5 */ static HRESULT Date_getDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, date_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.5 */ static HRESULT Date_getUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, date_from_time(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.6 */ static HRESULT Date_getDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, week_day(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.6 */ static HRESULT Date_getUTCDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, week_day(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.10 */ static HRESULT Date_getHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, hour_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.10 */ static HRESULT Date_getUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, hour_from_time(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.10 */ static HRESULT Date_getMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, min_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.10 */ static HRESULT Date_getUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, min_from_time(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.10 */ static HRESULT Date_getSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, sec_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.10 */ static HRESULT Date_getUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, sec_from_time(date->time)); + } + return S_OK; } -static HRESULT Date_getMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, +/* ECMA-262 3th Edition 15.9.1.10 */ +static HRESULT Date_getMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, ms_from_time(time)); + } + return S_OK; } -static HRESULT Date_getUTCMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, +/* ECMA-262 3th Edition 15.9.1.10 */ +static HRESULT Date_getUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, ms_from_time(date->time)); + } + return S_OK; } static HRESULT Date_getTimezoneOffset(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -322,6 +708,7 @@ static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM } if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); if(retv) num_set_nan(retv); return S_OK; } @@ -339,60 +726,190 @@ static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM return S_OK; } -static HRESULT Date_setMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, +static HRESULT Date_setMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + date->time = time_clip(date->time - ms_from_time(date->time) + num_val(&v)); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } -static HRESULT Date_setUTCMiliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, +static HRESULT Date_setUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + return Date_setMilliseconds(dispex, lcid, flags, dp, retv, ei, caller); } static HRESULT Date_setSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + date->time = time_clip(date->time - (sec_from_time(date->time) - num_val(&v))*1000.0); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } static HRESULT Date_setUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + return Date_setSeconds(dispex, lcid, flags, dp, retv, ei, caller); } static HRESULT Date_setMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + date->time = time_clip(date->time - (min_from_time(date->time) - num_val(&v))*MS_PER_MINUTE); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } static HRESULT Date_setUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + return Date_setMinutes(dispex, lcid, flags, dp, retv, ei, caller); } static HRESULT Date_setHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + date->time = time_clip(date->time + - (hour_from_time(date->time - date->bias*MS_PER_MINUTE) + - num_val(&v))*MS_PER_HOUR); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + date->time = time_clip(date->time + - (hour_from_time(date->time) - num_val(&v))*MS_PER_HOUR); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -449,7 +966,7 @@ static const builtin_prop_t Date_props[] = { {getDayW, Date_getDay, PROPF_METHOD}, {getFullYearW, Date_getFullYear, PROPF_METHOD}, {getHoursW, Date_getHours, PROPF_METHOD}, - {getMilisecondsW, Date_getMiliseconds, PROPF_METHOD}, + {getMillisecondsW, Date_getMilliseconds, PROPF_METHOD}, {getMinutesW, Date_getMinutes, PROPF_METHOD}, {getMonthW, Date_getMonth, PROPF_METHOD}, {getSecondsW, Date_getSeconds, PROPF_METHOD}, @@ -459,7 +976,7 @@ static const builtin_prop_t Date_props[] = { {getUTCDayW, Date_getUTCDay, PROPF_METHOD}, {getUTCFullYearW, Date_getUTCFullYear, PROPF_METHOD}, {getUTCHoursW, Date_getUTCHours, PROPF_METHOD}, - {getUTCMilisecondsW, Date_getUTCMiliseconds, PROPF_METHOD}, + {getUTCMillisecondsW, Date_getUTCMilliseconds, PROPF_METHOD}, {getUTCMinutesW, Date_getUTCMinutes, PROPF_METHOD}, {getUTCMonthW, Date_getUTCMonth, PROPF_METHOD}, {getUTCSecondsW, Date_getUTCSeconds, PROPF_METHOD}, @@ -469,7 +986,7 @@ static const builtin_prop_t Date_props[] = { {setDateW, Date_setDate, PROPF_METHOD}, {setFullYearW, Date_setFullYear, PROPF_METHOD}, {setHoursW, Date_setHours, PROPF_METHOD}, - {setMilisecondsW, Date_setMiliseconds, PROPF_METHOD}, + {setMillisecondsW, Date_setMilliseconds, PROPF_METHOD}, {setMinutesW, Date_setMinutes, PROPF_METHOD}, {setMonthW, Date_setMonth, PROPF_METHOD}, {setSecondsW, Date_setSeconds, PROPF_METHOD}, @@ -477,7 +994,7 @@ static const builtin_prop_t Date_props[] = { {setUTCDateW, Date_setUTCDate, PROPF_METHOD}, {setUTCFullYearW, Date_setUTCFullYear, PROPF_METHOD}, {setUTCHoursW, Date_setUTCHours, PROPF_METHOD}, - {setUTCMilisecondsW, Date_setUTCMiliseconds, PROPF_METHOD}, + {setUTCMillisecondsW, Date_setUTCMilliseconds, PROPF_METHOD}, {setUTCMinutesW, Date_setUTCMinutes, PROPF_METHOD}, {setUTCMonthW, Date_setUTCMonth, PROPF_METHOD}, {setUTCSecondsW, Date_setUTCSeconds, PROPF_METHOD}, From fe3ce4156848da0784f4e4045584b5882f94a7f3 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 13:51:31 +0000 Subject: [PATCH 040/577] sync jscript_winetest with wine 1.1.24 svn path=/trunk/; revision=41543 --- rostests/winetests/jscript/api.js | 56 +++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/rostests/winetests/jscript/api.js b/rostests/winetests/jscript/api.js index 1f922b902b3..ad4822c580e 100644 --- a/rostests/winetests/jscript/api.js +++ b/rostests/winetests/jscript/api.js @@ -945,6 +945,62 @@ ok(date.setTime(123) === 123, "date.setTime(123) !== 123"); ok(date.setTime("123", NaN) === 123, "date.setTime(\"123\") !== 123"); ok(isNaN(date.setTime(NaN)), "date.setTime(NaN) is not NaN"); +ok(date.setTime(0) === date.getTime(), "date.setTime(0) !== date.getTime()"); +ok(date.getUTCFullYear() === 1970, "date.getUTCFullYear() = " + date.getUTCFullYear()); +ok(date.getUTCMonth() === 0, "date.getUTCMonth() = " + date.getUTCMonth()); +ok(date.getUTCDate() === 1, "date.getUTCDate() = " + date.getUTCDate()); +ok(date.getUTCDay() === 4, "date.getUTCDay() = " + date.getUTCDay()); +ok(date.getUTCHours() === 0, "date.getUTCHours() = " + date.getUTCHours()); +ok(date.getUTCMinutes() === 0, "date.getUTCMinutes() = " + date.getUTCMinutes()); +ok(date.getUTCSeconds() === 0, "date.getUTCSeconds() = " + date.getUTCSeconds()); +ok(date.getUTCMilliseconds() === 0, "date.getUTCMilliseconds() = " + date.getUTCMilliseconds()); +date.setTime(60*24*60*60*1000); +ok(date.getUTCFullYear() === 1970, "date.getUTCFullYear() = " + date.getUTCFullYear()); +ok(date.getUTCMonth() === 2, "date.getUTCMonth() = " + date.getUTCMonth()); +ok(date.getUTCDate() === 2, "date.getUTCDate() = " + date.getUTCDate()); +ok(date.getUTCDay() === 1, "date.getUTCDay() = " + date.getUTCDay()); +ok(date.getUTCHours() === 0, "date.getUTCHours() = " + date.getUTCHours()); +ok(date.getUTCMinutes() === 0, "date.getUTCMinutes() = " + date.getUTCMinutes()); +ok(date.getUTCSeconds() === 0, "date.getUTCSeconds() = " + date.getUTCSeconds()); +ok(date.getUTCMilliseconds() === 0, "date.getUTCMilliseconds() = " + date.getUTCMilliseconds()); +date.setTime(59*24*60*60*1000 + 4*365*24*60*60*1000 + 60*60*1000 + 2*60*1000 + 2*1000 + 640); +ok(date.getUTCFullYear() === 1974, "date.getUTCFullYear() = " + date.getUTCFullYear()); +ok(date.getUTCMonth() === 1, "date.getUTCMonth() = " + date.getUTCMonth()); +ok(date.getUTCMonth(123) === 1, "date.getUTCMonth() = " + date.getUTCMonth()); +ok(date.getUTCDate() === 28, "date.getUTCDate() = " + date.getUTCDate()); +ok(date.getUTCDay() === 4, "date.getUTCDay() = " + date.getUTCDay()); +ok(date.getUTCHours() === 1, "date.getUTCHours() = " + date.getUTCHours()); +ok(date.getUTCMinutes() === 2, "date.getUTCMinutes() = " + date.getUTCMinutes()); +ok(date.getUTCSeconds() === 2, "date.getUTCSeconds() = " + date.getUTCSeconds()); +ok(date.getUTCMilliseconds() === 640, "date.getUTCMilliseconds() = " + date.getUTCMilliseconds()); +date.setTime(Infinity); +ok(isNaN(date.getUTCFullYear()), "date.getUTCFullYear() is not NaN"); +ok(isNaN(date.getUTCMonth()), "date.getUTCMonth() is not NaN"); +ok(isNaN(date.getUTCDate()), "date.getUTCDate() is not NaN"); +ok(isNaN(date.getUTCDay()), "date.getUTCDay() is not NaN"); +ok(isNaN(date.getUTCHours()), "date.getUTCHours() is not NaN"); +ok(isNaN(date.getUTCMinutes()), "date.getUTCMinutes() is not NaN"); +ok(isNaN(date.getUTCSeconds()), "date.getUTCSeconds() is not NaN"); +ok(isNaN(date.getUTCMilliseconds()), "date.getUTCMilliseconds() is not NaN"); +ok(isNaN(date.setMilliseconds(0)), "date.setMilliseconds() is not NaN"); + +date.setTime(0); +date.setMilliseconds(-10, 2); +ok(date.getUTCMilliseconds() === 990, "date.getUTCMilliseconds() = " + date.getUTCMilliseconds()); +ok(date.setMilliseconds(10) === date.setUTCMilliseconds(10), "date.setUTCMilliseconds(10) !== date.setUTCMilliseconds(10)"); +date.setSeconds(-10); +ok(date.getUTCSeconds() === 50, "date.getUTCSeconds() = " + date.getUTCSeconds()); +ok(date.setSeconds(10) === date.setUTCSeconds(10), "date.setUTCSeconds(10) !== date.setUTCSeconds(10)"); +date.setMinutes(-10); +ok(date.getUTCMinutes() === 50, "date.getUTCMinutes() = " + date.getUTCMinutes()); +ok(date.setMinutes(10) === date.setUTCMinutes(10), "date.setUTCMinutes(10) !== date.setUTCMinutes(10)"); +date.setUTCHours(-10); +ok(date.getUTCHours() === 14, "date.getUTCHours() = " + date.getUTCHours()); +date.setUTCHours(-123); +ok(date.getTime() === -614989990, "date.getTime() = " + date.getTime()); +date.setHours(20); +ok(date.getHours() === 20, "date.getHours() = " + date.getHours()); + ok(typeof(Math.PI) === "number", "typeof(Math.PI) = " + typeof(Math.PI)); ok(Math.floor(Math.PI*100) === 314, "Math.PI = " + Math.PI); Math.PI = "test"; From 5c0ec477ebe80e5d01d114194ee4193a1bb3d0da Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 14:01:24 +0000 Subject: [PATCH 041/577] sync advpack and msi with wine 1.1.24 svn path=/trunk/; revision=41544 --- reactos/dll/win32/advpack/advpack.spec | 2 +- reactos/dll/win32/advpack/files.c | 38 +++++++ reactos/dll/win32/msi/streams.c | 6 +- reactos/dll/win32/msi/table.c | 146 ++++++++++--------------- 4 files changed, 99 insertions(+), 93 deletions(-) diff --git a/reactos/dll/win32/advpack/advpack.spec b/reactos/dll/win32/advpack/advpack.spec index 2ba1057332f..665d1e11158 100644 --- a/reactos/dll/win32/advpack/advpack.spec +++ b/reactos/dll/win32/advpack/advpack.spec @@ -17,7 +17,7 @@ @ stdcall ExecuteCabW(ptr ptr ptr) @ stdcall ExecuteCab(ptr ptr ptr) ExecuteCabA @ stdcall ExtractFilesA(str str long ptr ptr long) -# stdcall ExtractFilesW(wstr wstr long ptr ptr long) +@ stdcall ExtractFilesW(wstr wstr long ptr ptr long) @ stdcall ExtractFiles(str str long ptr ptr long) ExtractFilesA @ stdcall FileSaveMarkNotExistA(str str str) @ stdcall FileSaveMarkNotExistW(wstr wstr wstr) diff --git a/reactos/dll/win32/advpack/files.c b/reactos/dll/win32/advpack/files.c index 63f4080b934..216b8632dc7 100644 --- a/reactos/dll/win32/advpack/files.c +++ b/reactos/dll/win32/advpack/files.c @@ -748,6 +748,44 @@ done: return res; } +/*********************************************************************** + * ExtractFilesW (ADVPACK.@) + * + * Extracts the specified files from a cab archive into + * a destination directory. + * + * PARAMS + * CabName [I] Filename of the cab archive. + * ExpandDir [I] Destination directory for the extracted files. + * Flags [I] Reserved. + * FileList [I] Optional list of files to extract. See NOTES. + * LReserved [I] Reserved. Must be NULL. + * Reserved [I] Reserved. Must be 0. + * + * RETURNS + * Success: S_OK. + * Failure: E_FAIL. + * + * NOTES + * FileList is a colon-separated list of filenames. If FileList is + * non-NULL, only the files in the list will be extracted from the + * cab file, otherwise all files will be extracted. Any number of + * spaces, tabs, or colons can be before or after the list, but + * the list itself must only be separated by colons. + * + * BUGS + * Unimplemented. + */ +HRESULT WINAPI ExtractFilesW(LPCWSTR CabName, LPCWSTR ExpandDir, DWORD Flags, + LPCWSTR FileList, LPVOID LReserved, DWORD Reserved) +{ + + FIXME("(%s, %s, %d, %s, %p, %d) stub!\n", debugstr_w(CabName), debugstr_w(ExpandDir), + Flags, debugstr_w(FileList), LReserved, Reserved); + + return E_FAIL; +} + /*********************************************************************** * FileSaveMarkNotExistA (ADVPACK.@) * diff --git a/reactos/dll/win32/msi/streams.c b/reactos/dll/win32/msi/streams.c index 2d869cc0d29..12f707e5e57 100644 --- a/reactos/dll/win32/msi/streams.c +++ b/reactos/dll/win32/msi/streams.c @@ -60,7 +60,7 @@ static BOOL streams_set_table_size(MSISTREAMSVIEW *sv, UINT size) if (size >= sv->max_streams) { sv->max_streams *= 2; - sv->streams = msi_realloc(sv->streams, sv->max_streams * sizeof(STREAM *)); + sv->streams = msi_realloc_zero(sv->streams, sv->max_streams * sizeof(STREAM *)); if (!sv->streams) return FALSE; } @@ -387,7 +387,7 @@ static UINT STREAMS_delete(struct tagMSIVIEW *view) for (i = 0; i < sv->num_rows; i++) { - if (sv->streams[i]->stream) + if (sv->streams[i] && sv->streams[i]->stream) IStream_Release(sv->streams[i]->stream); msi_free(sv->streams[i]); } @@ -462,7 +462,7 @@ static INT add_streams_to_table(MSISTREAMSVIEW *sv) return -1; sv->max_streams = 1; - sv->streams = msi_alloc(sizeof(STREAM *)); + sv->streams = msi_alloc_zero(sizeof(STREAM *)); if (!sv->streams) return -1; diff --git a/reactos/dll/win32/msi/table.c b/reactos/dll/win32/msi/table.c index 885c0ddf796..0b5b99164b9 100644 --- a/reactos/dll/win32/msi/table.c +++ b/reactos/dll/win32/msi/table.c @@ -73,9 +73,8 @@ typedef struct tagMSIORDERINFO struct tagMSITABLE { BYTE **data; + BOOL *data_persistent; UINT row_count; - BYTE **nonpersistent_data; - UINT nonpersistent_row_count; struct list entry; MSICOLUMNINFO *colinfo; UINT col_count; @@ -476,9 +475,7 @@ static void free_table( MSITABLE *table ) for( i=0; irow_count; i++ ) msi_free( table->data[i] ); msi_free( table->data ); - for( i=0; inonpersistent_row_count; i++ ) - msi_free( table->nonpersistent_data[i] ); - msi_free( table->nonpersistent_data ); + msi_free( table->data_persistent ); msi_free_colinfo( table->colinfo, table->col_count ); msi_free( table->colinfo ); msi_free( table ); @@ -520,6 +517,9 @@ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg t->data = msi_alloc_zero( t->row_count * sizeof (USHORT*) ); if( !t->data ) goto err; + t->data_persistent = msi_alloc_zero( t->row_count * sizeof(BOOL)); + if ( !t->data_persistent ) + goto err; /* transpose all the data */ TRACE("Transposing data from %d rows\n", t->row_count ); @@ -528,6 +528,7 @@ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg t->data[i] = msi_alloc( row_size ); if( !t->data[i] ) goto err; + t->data_persistent[i] = TRUE; for( j=0; jcol_count; j++ ) { @@ -634,8 +635,7 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info, table->ref_count = 1; table->row_count = 0; table->data = NULL; - table->nonpersistent_row_count = 0; - table->nonpersistent_data = NULL; + table->data_persistent = NULL; table->colinfo = NULL; table->col_count = 0; table->persistent = persistent; @@ -783,8 +783,7 @@ static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret ) table->row_count = 0; table->data = NULL; - table->nonpersistent_row_count = 0; - table->nonpersistent_data = NULL; + table->data_persistent = NULL; table->colinfo = NULL; table->col_count = 0; table->persistent = MSICONDITION_TRUE; @@ -833,6 +832,7 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t ) goto err; } + rawsize = 0; p = rawdata; for( i=0; icol_count; i++ ) { @@ -840,6 +840,10 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t ) { UINT offset = t->colinfo[i].offset; + if (!t->data_persistent[j]) continue; + if (i == 0) + rawsize += row_size; + *p++ = t->data[j][offset]; *p++ = t->data[j][offset + 1]; if( 4 == bytes_per_column( db, &t->colinfo[i] ) ) @@ -1087,11 +1091,6 @@ BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name ) if( table->data[ i ][ 0 ] == table_id ) return TRUE; - count = table->nonpersistent_row_count; - for( i=0; inonpersistent_data[ i ][ 0 ] == table_id ) - return TRUE; - return FALSE; } @@ -1113,7 +1112,6 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; UINT offset, n; - BYTE **data; if( !tv->table ) return ERROR_INVALID_PARAMETER; @@ -1122,7 +1120,7 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * return ERROR_INVALID_PARAMETER; /* how many rows are there ? */ - if( row >= tv->table->row_count + tv->table->nonpersistent_row_count ) + if( row >= tv->table->row_count ) return ERROR_NO_MORE_ITEMS; if( tv->columns[col-1].offset >= tv->row_size ) @@ -1135,14 +1133,6 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * if (tv->order) row = tv->order->reorder[row]; - if (row >= tv->table->row_count) - { - row -= tv->table->row_count; - data = tv->table->nonpersistent_data; - } - else - data = tv->table->data; - n = bytes_per_column( tv->db, &tv->columns[col-1] ); if (n != 2 && n != 3 && n != 4) { @@ -1151,7 +1141,7 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * } offset = tv->columns[col-1].offset; - *val = read_table_int(data, row, offset, n); + *val = read_table_int(tv->table->data, row, offset, n); /* TRACE("Data [%d][%d] = %d\n", row, col, *val ); */ @@ -1277,7 +1267,6 @@ static UINT TABLE_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, ISt static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) { UINT offset, n, i; - BYTE **data; if( !tv->table ) return ERROR_INVALID_PARAMETER; @@ -1285,7 +1274,7 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) if( (col==0) || (col>tv->num_cols) ) return ERROR_INVALID_PARAMETER; - if( row >= tv->table->row_count + tv->table->nonpersistent_row_count ) + if( row >= tv->table->row_count ) return ERROR_INVALID_PARAMETER; if( tv->columns[col-1].offset >= tv->row_size ) @@ -1298,14 +1287,6 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) msi_free( tv->columns[col-1].hash_table ); tv->columns[col-1].hash_table = NULL; - if (row >= tv->table->row_count) - { - row -= tv->table->row_count; - data = tv->table->nonpersistent_data; - } - else - data = tv->table->data; - n = bytes_per_column( tv->db, &tv->columns[col-1] ); if ( n != 2 && n != 3 && n != 4 ) { @@ -1315,7 +1296,7 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) offset = tv->columns[col-1].offset; for ( i = 0; i < n; i++ ) - data[row][offset + i] = (val >> i * 8) & 0xff; + tv->table->data[row][offset + i] = (val >> i * 8) & 0xff; return ERROR_SUCCESS; } @@ -1393,9 +1374,8 @@ static UINT TABLE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI if ( !(mask&(1<= tv->table->row_count then it is a non-persistent row */ persistent = (tv->table->persistent != MSICONDITION_FALSE) && - (row < tv->table->row_count); + (tv->table->data_persistent[row]); /* FIXME: should we allow updating keys? */ val = 0; @@ -1469,8 +1449,10 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; BYTE **p, *row; + BOOL *b; UINT sz; BYTE ***data_ptr; + BOOL **data_persist_ptr; UINT *row_count; TRACE("%p %s\n", view, temporary ? "TRUE" : "FALSE"); @@ -1482,20 +1464,11 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo if( !row ) return ERROR_NOT_ENOUGH_MEMORY; - if( temporary ) - { - row_count = &tv->table->nonpersistent_row_count; - data_ptr = &tv->table->nonpersistent_data; - if (*num == -1) - *num = tv->table->row_count + tv->table->nonpersistent_row_count; - } - else - { - row_count = &tv->table->row_count; - data_ptr = &tv->table->data; - if (*num == -1) - *num = tv->table->row_count; - } + row_count = &tv->table->row_count; + data_ptr = &tv->table->data; + data_persist_ptr = &tv->table->data_persistent; + if (*num == -1) + *num = tv->table->row_count; sz = (*row_count + 1) * sizeof (BYTE*); if( *data_ptr ) @@ -1508,8 +1481,24 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo return ERROR_NOT_ENOUGH_MEMORY; } + sz = (*row_count + 1) * sizeof (BOOL); + if( *data_persist_ptr ) + b = msi_realloc( *data_persist_ptr, sz ); + else + b = msi_alloc( sz ); + if( !b ) + { + msi_free( row ); + msi_free( p ); + return ERROR_NOT_ENOUGH_MEMORY; + } + *data_ptr = p; (*data_ptr)[*row_count] = row; + + *data_persist_ptr = b; + (*data_persist_ptr)[*row_count] = !temporary; + (*row_count)++; return ERROR_SUCCESS; @@ -1545,7 +1534,7 @@ static UINT TABLE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *col { if( !tv->table ) return ERROR_INVALID_PARAMETER; - *rows = tv->table->row_count + tv->table->nonpersistent_row_count; + *rows = tv->table->row_count; } return ERROR_SUCCESS; @@ -1620,8 +1609,7 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec ) static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary ) { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; - UINT i, r, idx, size; - BYTE **data; + UINT i, r; TRACE("%p %p %s\n", tv, rec, temporary ? "TRUE" : "FALSE" ); @@ -1635,27 +1623,16 @@ static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, if( r != ERROR_SUCCESS ) return r; - idx = row; - if( temporary ) - { - data = tv->table->nonpersistent_data; - size = tv->table->nonpersistent_row_count; - idx -= tv->table->row_count; - } - else - { - data = tv->table->data; - size = tv->table->row_count; - } - /* shift the rows to make room for the new row */ - if( idx != size - 1 ) + for (i = tv->table->row_count - 1; i > row; i--) { - for (i = 1; i < size - idx; i++) - memmove(&(data[size - i][0]), - &(data[size - i - 1][0]), tv->row_size); + memmove(&(tv->table->data[i][0]), + &(tv->table->data[i - 1][0]), tv->row_size); + tv->table->data_persistent[i] = tv->table->data_persistent[i - 1]; } + /* Re-set the persistence flag */ + tv->table->data_persistent[row] = !temporary; return TABLE_set_row( view, row, rec, (1<num_cols) - 1 ); } @@ -1663,7 +1640,6 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row ) { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; UINT r, num_rows, num_cols, i; - BYTE **data; TRACE("%p %d\n", tv, row); @@ -1677,19 +1653,8 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row ) if ( row >= num_rows ) return ERROR_FUNCTION_FAILED; - if ( row < tv->table->row_count ) - { - num_rows = tv->table->row_count; - tv->table->row_count--; - data = tv->table->data; - } - else - { - num_rows = tv->table->nonpersistent_row_count; - row -= tv->table->row_count; - tv->table->nonpersistent_row_count--; - data = tv->table->nonpersistent_data; - } + num_rows = tv->table->row_count; + tv->table->row_count--; /* reset the hash tables */ for (i = 0; i < tv->num_cols; i++) @@ -1702,7 +1667,10 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row ) return ERROR_SUCCESS; for (i = row + 1; i < num_rows; i++) - memcpy(data[i - 1], data[i], tv->row_size); + { + memcpy(tv->table->data[i - 1], tv->table->data[i], tv->row_size); + tv->table->data_persistent[i - 1] = tv->table->data_persistent[i]; + } return ERROR_SUCCESS; } @@ -1856,7 +1824,7 @@ static UINT TABLE_find_matching_rows( struct tagMSIVIEW *view, UINT col, if( !tv->columns[col-1].hash_table ) { UINT i; - UINT num_rows = tv->table->row_count + tv->table->nonpersistent_row_count; + UINT num_rows = tv->table->row_count; MSICOLUMNHASHENTRY **hash_table; MSICOLUMNHASHENTRY *new_entry; @@ -2625,7 +2593,7 @@ static UINT msi_table_find_row( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row ) data = msi_record_to_row( tv, rec ); if( !data ) return r; - for( i = 0; i < tv->table->row_count + tv->table->nonpersistent_row_count; i++ ) + for( i = 0; i < tv->table->row_count; i++ ) { r = msi_row_matches( tv, i, data ); if( r == ERROR_SUCCESS ) From 9152e0286c42f3a57e9eef3f57d78be2ee78f204 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 22 Jun 2009 14:09:16 +0000 Subject: [PATCH 042/577] - Remove padding member from ETHREAD, it's not needed anymore after KTHREAD has been fixed. svn path=/trunk/; revision=41545 --- reactos/include/ndk/pstypes.h | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/include/ndk/pstypes.h b/reactos/include/ndk/pstypes.h index 0db76b1ab71..2f6a2c0ded7 100644 --- a/reactos/include/ndk/pstypes.h +++ b/reactos/include/ndk/pstypes.h @@ -1036,7 +1036,6 @@ typedef struct _PSP_RATE_APC typedef struct _ETHREAD { KTHREAD Tcb; - PVOID Padding; LARGE_INTEGER CreateTime; union { From c7b0db5721f0c9849a07566f48ad3b076833a2dc Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 19:27:02 +0000 Subject: [PATCH 043/577] sync crypt32 with wine 1.1.24 svn path=/trunk/; revision=41550 --- reactos/dll/win32/crypt32/cert.c | 2 +- reactos/dll/win32/crypt32/chain.c | 24 ++++++++++----------- reactos/dll/win32/crypt32/context.c | 4 ++-- reactos/dll/win32/crypt32/crypt32_Fr.rc | 3 ++- reactos/dll/win32/crypt32/crypt32_private.h | 2 +- reactos/dll/win32/crypt32/encode.c | 6 +++--- reactos/dll/win32/crypt32/msg.c | 6 +++--- reactos/dll/win32/crypt32/object.c | 6 +++--- reactos/dll/win32/crypt32/str.c | 2 +- 9 files changed, 28 insertions(+), 27 deletions(-) diff --git a/reactos/dll/win32/crypt32/cert.c b/reactos/dll/win32/crypt32/cert.c index 2780cba6343..2b43d3e59a8 100644 --- a/reactos/dll/win32/crypt32/cert.c +++ b/reactos/dll/win32/crypt32/cert.c @@ -2419,7 +2419,7 @@ static void CRYPT_SetBitInField(struct BitField *field, DWORD bit) field->indexes[indexIndex] |= 1 << (bit % BITS_PER_DWORD); } -static BOOL CRYPT_IsBitInFieldSet(struct BitField *field, DWORD bit) +static BOOL CRYPT_IsBitInFieldSet(const struct BitField *field, DWORD bit) { BOOL set = FALSE; DWORD indexIndex = bit / BITS_PER_DWORD; diff --git a/reactos/dll/win32/crypt32/chain.c b/reactos/dll/win32/crypt32/chain.c index 2e414cdddf8..b22cb5b0cc4 100644 --- a/reactos/dll/win32/crypt32/chain.c +++ b/reactos/dll/win32/crypt32/chain.c @@ -262,7 +262,7 @@ static void CRYPT_CheckSimpleChainForCycles(PCERT_SIMPLE_CHAIN chain) } /* Checks whether the chain is cyclic by examining the last element's status */ -static inline BOOL CRYPT_IsSimpleChainCyclic(PCERT_SIMPLE_CHAIN chain) +static inline BOOL CRYPT_IsSimpleChainCyclic(const CERT_SIMPLE_CHAIN *chain) { if (chain->cElement) return chain->rgpElement[chain->cElement - 1]->TrustStatus.dwErrorStatus @@ -272,7 +272,7 @@ static inline BOOL CRYPT_IsSimpleChainCyclic(PCERT_SIMPLE_CHAIN chain) } static inline void CRYPT_CombineTrustStatus(CERT_TRUST_STATUS *chainStatus, - CERT_TRUST_STATUS *elementStatus) + const CERT_TRUST_STATUS *elementStatus) { /* Any error that applies to an element also applies to a chain.. */ chainStatus->dwErrorStatus |= elementStatus->dwErrorStatus; @@ -282,7 +282,7 @@ static inline void CRYPT_CombineTrustStatus(CERT_TRUST_STATUS *chainStatus, chainStatus->dwInfoStatus |= (elementStatus->dwInfoStatus & 0xfffffff0); } -static BOOL CRYPT_AddCertToSimpleChain(PCertificateChainEngine engine, +static BOOL CRYPT_AddCertToSimpleChain(const CertificateChainEngine *engine, PCERT_SIMPLE_CHAIN chain, PCCERT_CONTEXT cert, DWORD subjectInfoStatus) { BOOL ret = FALSE; @@ -720,7 +720,7 @@ static void CRYPT_CheckChainNameConstraints(PCERT_SIMPLE_CHAIN chain) } } -static void dump_basic_constraints(PCERT_EXTENSION ext) +static void dump_basic_constraints(const CERT_EXTENSION *ext) { CERT_BASIC_CONSTRAINTS_INFO *info; DWORD size = 0; @@ -737,7 +737,7 @@ static void dump_basic_constraints(PCERT_EXTENSION ext) } } -static void dump_basic_constraints2(PCERT_EXTENSION ext) +static void dump_basic_constraints2(const CERT_EXTENSION *ext) { CERT_BASIC_CONSTRAINTS2_INFO constraints; DWORD size = sizeof(CERT_BASIC_CONSTRAINTS2_INFO); @@ -754,7 +754,7 @@ static void dump_basic_constraints2(PCERT_EXTENSION ext) } } -static void dump_extension(PCERT_EXTENSION ext) +static void dump_extension(const CERT_EXTENSION *ext) { TRACE_(chain)("%s (%scritical)\n", debugstr_a(ext->pszObjId), ext->fCritical ? "" : "not "); @@ -1008,7 +1008,7 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject, /* Builds a simple chain by finding an issuer for the last cert in the chain, * until reaching a self-signed cert, or until no issuer can be found. */ -static BOOL CRYPT_BuildSimpleChain(PCertificateChainEngine engine, +static BOOL CRYPT_BuildSimpleChain(const CertificateChainEngine *engine, HCERTSTORE world, PCERT_SIMPLE_CHAIN chain) { BOOL ret = TRUE; @@ -1116,7 +1116,7 @@ static BOOL CRYPT_BuildCandidateChainFromCert(HCERTCHAINENGINE hChainEngine, /* Makes and returns a copy of chain, up to and including element iElement. */ static PCERT_SIMPLE_CHAIN CRYPT_CopySimpleChainToElement( - PCERT_SIMPLE_CHAIN chain, DWORD iElement) + const CERT_SIMPLE_CHAIN *chain, DWORD iElement) { PCERT_SIMPLE_CHAIN copy = CryptMemAlloc(sizeof(CERT_SIMPLE_CHAIN)); @@ -1345,7 +1345,7 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain( #define IS_TRUST_ERROR_SET(TrustStatus, bits) \ (TrustStatus)->dwErrorStatus & (bits) -static DWORD CRYPT_ChainQuality(PCertificateChain chain) +static DWORD CRYPT_ChainQuality(const CertificateChain *chain) { DWORD quality = CHAIN_QUALITY_HIGHEST; @@ -1402,7 +1402,7 @@ static PCertificateChain CRYPT_ChooseHighestQualityChain( } static BOOL CRYPT_AddAlternateChainToChain(PCertificateChain chain, - PCertificateChain alternate) + const CertificateChain *alternate) { BOOL ret; @@ -1427,7 +1427,7 @@ static BOOL CRYPT_AddAlternateChainToChain(PCertificateChain chain, } static PCERT_CHAIN_ELEMENT CRYPT_FindIthElementInChain( - PCERT_CHAIN_CONTEXT chain, DWORD i) + const CERT_CHAIN_CONTEXT *chain, DWORD i) { DWORD j, iElement; PCERT_CHAIN_ELEMENT element = NULL; @@ -1448,7 +1448,7 @@ typedef struct _CERT_CHAIN_PARA_NO_EXTRA_FIELDS { } CERT_CHAIN_PARA_NO_EXTRA_FIELDS, *PCERT_CHAIN_PARA_NO_EXTRA_FIELDS; static void CRYPT_VerifyChainRevocation(PCERT_CHAIN_CONTEXT chain, - LPFILETIME pTime, PCERT_CHAIN_PARA pChainPara, DWORD chainFlags) + LPFILETIME pTime, const CERT_CHAIN_PARA *pChainPara, DWORD chainFlags) { DWORD cContext; diff --git a/reactos/dll/win32/crypt32/context.c b/reactos/dll/win32/crypt32/context.c index f7ebebb1c48..bb877995a1d 100644 --- a/reactos/dll/win32/crypt32/context.c +++ b/reactos/dll/win32/crypt32/context.c @@ -201,7 +201,7 @@ struct ContextList *ContextList_Create( return list; } -static inline struct list *ContextList_ContextToEntry(struct ContextList *list, +static inline struct list *ContextList_ContextToEntry(const struct ContextList *list, const void *context) { struct list *ret; @@ -213,7 +213,7 @@ static inline struct list *ContextList_ContextToEntry(struct ContextList *list, return ret; } -static inline void *ContextList_EntryToContext(struct ContextList *list, +static inline void *ContextList_EntryToContext(const struct ContextList *list, struct list *entry) { return (LPBYTE)entry - sizeof(LINK_CONTEXT) - list->contextSize; diff --git a/reactos/dll/win32/crypt32/crypt32_Fr.rc b/reactos/dll/win32/crypt32/crypt32_Fr.rc index 08a1898852e..35ade1e1a9e 100644 --- a/reactos/dll/win32/crypt32/crypt32_Fr.rc +++ b/reactos/dll/win32/crypt32/crypt32_Fr.rc @@ -1,7 +1,7 @@ /* * crypt32 dll French resources * - * Copyright 2006-2008 Jonathan Ernst + * Copyright 2006-2009 Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -171,6 +171,7 @@ STRINGTABLE DISCARDABLE IDS_LOCALIZEDNAME_MY "Personnel" IDS_LOCALIZEDNAME_CA "Autorités intermédiaires" IDS_LOCALIZEDNAME_ADDRESSBOOK "Autres personnes" + IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Éditeurs de confiance" } STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/crypt32/crypt32_private.h b/reactos/dll/win32/crypt32/crypt32_private.h index 46d4797b680..07c63825b58 100644 --- a/reactos/dll/win32/crypt32/crypt32_private.h +++ b/reactos/dll/win32/crypt32/crypt32_private.h @@ -79,7 +79,7 @@ typedef struct _CRYPT_DIGESTED_DATA CRYPT_HASH_BLOB hash; } CRYPT_DIGESTED_DATA; -BOOL CRYPT_AsnEncodePKCSDigestedData(CRYPT_DIGESTED_DATA *digestedData, +BOOL CRYPT_AsnEncodePKCSDigestedData(const CRYPT_DIGESTED_DATA *digestedData, void *pvData, DWORD *pcbData); typedef struct _CRYPT_SIGNED_INFO diff --git a/reactos/dll/win32/crypt32/encode.c b/reactos/dll/win32/crypt32/encode.c index 14d193fb3a6..67a0155e584 100644 --- a/reactos/dll/win32/crypt32/encode.c +++ b/reactos/dll/win32/crypt32/encode.c @@ -1078,7 +1078,7 @@ static BOOL WINAPI CRYPT_AsnEncodeNameValue(DWORD dwCertEncodingType, } static BOOL CRYPT_AsnEncodeRdnAttr(DWORD dwCertEncodingType, - CERT_RDN_ATTR *attr, CryptEncodeObjectExFunc nameValueEncodeFunc, + const CERT_RDN_ATTR *attr, CryptEncodeObjectExFunc nameValueEncodeFunc, BYTE *pbEncoded, DWORD *pcbEncoded) { DWORD bytesNeeded = 0, lenBytes, size; @@ -1268,7 +1268,7 @@ static BOOL WINAPI CRYPT_DEREncodeItemsAsSet(DWORD dwCertEncodingType, return ret; } -static BOOL CRYPT_AsnEncodeRdn(DWORD dwCertEncodingType, CERT_RDN *rdn, +static BOOL CRYPT_AsnEncodeRdn(DWORD dwCertEncodingType, const CERT_RDN *rdn, CryptEncodeObjectExFunc nameValueEncodeFunc, BYTE *pbEncoded, DWORD *pcbEncoded) { @@ -1881,7 +1881,7 @@ static BOOL WINAPI CRYPT_AsnEncodePKCSContentInfoInternal( cItem, dwFlags, pEncodePara, pbEncoded, pcbEncoded); } -BOOL CRYPT_AsnEncodePKCSDigestedData(CRYPT_DIGESTED_DATA *digestedData, +BOOL CRYPT_AsnEncodePKCSDigestedData(const CRYPT_DIGESTED_DATA *digestedData, void *pvData, DWORD *pcbData) { struct AsnEncodeSequenceItem items[] = { diff --git a/reactos/dll/win32/crypt32/msg.c b/reactos/dll/win32/crypt32/msg.c index a16eef12cf8..0b4027d17b0 100644 --- a/reactos/dll/win32/crypt32/msg.c +++ b/reactos/dll/win32/crypt32/msg.c @@ -1340,7 +1340,7 @@ static BOOL CSignedEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, } static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags, - const void *pvMsgEncodeInfo, LPSTR pszInnerContentObjID, + const void *pvMsgEncodeInfo, LPCSTR pszInnerContentObjID, PCMSG_STREAM_INFO pStreamInfo) { const CMSG_SIGNED_ENCODE_INFO_WITH_CMS *info = pvMsgEncodeInfo; @@ -1553,7 +1553,7 @@ static BOOL CDecodeMsg_CopyData(CRYPT_DATA_BLOB *blob, const BYTE *pbData, return ret; } -static BOOL CDecodeMsg_DecodeDataContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob) +static BOOL CDecodeMsg_DecodeDataContent(CDecodeMsg *msg, const CRYPT_DER_BLOB *blob) { BOOL ret; CRYPT_DATA_BLOB *data; @@ -1613,7 +1613,7 @@ static inline void CRYPT_FixUpAlgorithmID(CRYPT_ALGORITHM_IDENTIFIER *id) } static BOOL CDecodeMsg_DecodeHashedContent(CDecodeMsg *msg, - CRYPT_DER_BLOB *blob) + const CRYPT_DER_BLOB *blob) { BOOL ret; CRYPT_DIGESTED_DATA *digestedData; diff --git a/reactos/dll/win32/crypt32/object.c b/reactos/dll/win32/crypt32/object.c index e880f089090..f505b7d804d 100644 --- a/reactos/dll/win32/crypt32/object.c +++ b/reactos/dll/win32/crypt32/object.c @@ -1080,7 +1080,7 @@ static BOOL WINAPI CRYPT_FormatBasicConstraints2(DWORD dwCertEncodingType, return ret; } -static BOOL CRYPT_FormatHexStringWithPrefix(CRYPT_DATA_BLOB *blob, int id, +static BOOL CRYPT_FormatHexStringWithPrefix(const CRYPT_DATA_BLOB *blob, int id, LPWSTR str, DWORD *pcbStr) { WCHAR buf[MAX_STRING_RESOURCE_LEN]; @@ -1114,13 +1114,13 @@ static BOOL CRYPT_FormatHexStringWithPrefix(CRYPT_DATA_BLOB *blob, int id, return ret; } -static BOOL CRYPT_FormatKeyId(CRYPT_DATA_BLOB *keyId, LPWSTR str, +static BOOL CRYPT_FormatKeyId(const CRYPT_DATA_BLOB *keyId, LPWSTR str, DWORD *pcbStr) { return CRYPT_FormatHexStringWithPrefix(keyId, IDS_KEY_ID, str, pcbStr); } -static BOOL CRYPT_FormatCertSerialNumber(CRYPT_DATA_BLOB *serialNum, LPWSTR str, +static BOOL CRYPT_FormatCertSerialNumber(const CRYPT_DATA_BLOB *serialNum, LPWSTR str, DWORD *pcbStr) { return CRYPT_FormatHexStringWithPrefix(serialNum, IDS_CERT_SERIAL_NUMBER, diff --git a/reactos/dll/win32/crypt32/str.c b/reactos/dll/win32/crypt32/str.c index d3bca2b7c0a..c0b76779a0a 100644 --- a/reactos/dll/win32/crypt32/str.c +++ b/reactos/dll/win32/crypt32/str.c @@ -341,7 +341,7 @@ static DWORD CRYPT_AddPrefixW(LPCWSTR prefix, LPWSTR psz, DWORD csz) static const WCHAR indent[] = { ' ',' ',' ',' ',' ',0 }; DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel, - PCERT_NAME_BLOB pName, DWORD dwStrType, LPWSTR psz, DWORD csz) + const CERT_NAME_BLOB *pName, DWORD dwStrType, LPWSTR psz, DWORD csz) { static const DWORD unsupportedFlags = CERT_NAME_STR_NO_QUOTING_FLAG | CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG; From 05a913066988ed5717f191726044c2f95569411a Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 19:29:26 +0000 Subject: [PATCH 044/577] sync cryptdlg and cryptui with wine 1.1.24 svn path=/trunk/; revision=41551 --- reactos/dll/win32/cryptdlg/cryptdlg.rc | 1 + reactos/dll/win32/cryptdlg/cryptdlg_De.rc | 36 ++ reactos/dll/win32/cryptui/cryptui.rc | 1 + reactos/dll/win32/cryptui/cryptui_De.rc | 465 ++++++++++++++++++++++ 4 files changed, 503 insertions(+) create mode 100644 reactos/dll/win32/cryptdlg/cryptdlg_De.rc create mode 100644 reactos/dll/win32/cryptui/cryptui_De.rc diff --git a/reactos/dll/win32/cryptdlg/cryptdlg.rc b/reactos/dll/win32/cryptdlg/cryptdlg.rc index e8156531dcc..a4946529a14 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg.rc +++ b/reactos/dll/win32/cryptdlg/cryptdlg.rc @@ -22,6 +22,7 @@ #include "winuser.h" #include "cryptres.h" +#include "cryptdlg_De.rc" #include "cryptdlg_En.rc" #include "cryptdlg_Fr.rc" #include "cryptdlg_Ko.rc" diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_De.rc b/reactos/dll/win32/cryptdlg/cryptdlg_De.rc new file mode 100644 index 00000000000..647171d8983 --- /dev/null +++ b/reactos/dll/win32/cryptdlg/cryptdlg_De.rc @@ -0,0 +1,36 @@ +/* + * cryptdlg dll resources + * + * Copyright 2009 André Hentschel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_CERT_POLICY "Zertifikatsrichtlinie" + IDS_POLICY_ID "Richtlinien Qualifizierung: " + IDS_POLICY_QUALIFIER_INFO "Richtlinien Qualifizierungs Information" + IDS_POLICY_QUALIFIER_ID "Richtlinien Qualifizierungs-ID=" + IDS_CPS "CPS" + IDS_USER_NOTICE "Benutzerbenachrichtigung" + IDS_QUALIFIER "Qualifizierung" + IDS_NOTICE_REF "Benachrichtigungsbezug" + IDS_ORGANIZATION "Organisation=" + IDS_NOTICE_NUM "Benachrichtigungsnummer=" + IDS_NOTICE_TEXT "Benachrichtigungstext=" +} diff --git a/reactos/dll/win32/cryptui/cryptui.rc b/reactos/dll/win32/cryptui/cryptui.rc index 4b170e3f4bf..ef998f883e9 100644 --- a/reactos/dll/win32/cryptui/cryptui.rc +++ b/reactos/dll/win32/cryptui/cryptui.rc @@ -46,6 +46,7 @@ IDB_CERT_WATERMARK BITMAP LOADONCALL DISCARDABLE certwatermark.bmp /* @makedep: certheader.bmp */ IDB_CERT_HEADER BITMAP LOADONCALL DISCARDABLE certheader.bmp +#include "cryptui_De.rc" #include "cryptui_En.rc" #include "cryptui_Ko.rc" #include "cryptui_Nl.rc" diff --git a/reactos/dll/win32/cryptui/cryptui_De.rc b/reactos/dll/win32/cryptui/cryptui_De.rc new file mode 100644 index 00000000000..dcd7ac8e443 --- /dev/null +++ b/reactos/dll/win32/cryptui/cryptui_De.rc @@ -0,0 +1,465 @@ +/* + * cryptui dll resources + * + * Copyright 2009 André Hentschel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma code_page(65001) + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_CERTIFICATE "Zertifikat" + IDS_CERTIFICATEINFORMATION "Zertifikatsinformationen" + IDS_CERT_INFO_BAD_SIG "Das Zertifikat hat einen ungültige Signatur. Das Zertifikat wurde eventuell manipuliert." + IDS_CERT_INFO_UNTRUSTED_CA "Dieses Stammzertifikat ist nicht vertrauenswürdig. Installieren Sie das Zertifikat zu den vertrauenswürdigen Stammzertifikatsstellen, um die Vertrauensstellung zu aktivieren." + IDS_CERT_INFO_UNTRUSTED_ROOT "Das Zertifikat hat kein gültiges Stammzertifikat." + IDS_CERT_INFO_PARTIAL_CHAIN "Der Zertifikats-Aussteller konnte nicht gefunden werden." + IDS_CERT_INFO_BAD_PURPOSES "Die geplanten Zwecke des Zertifikats konnten nicht verifiziert werden." + IDS_CERT_INFO_PURPOSES "Dieses Zertifikat dient folgenden Zwecken:" + IDS_SUBJECT_HEADING "Ausgestellt für: " + IDS_ISSUER_HEADING "Ausgestellt von: " + IDS_VALID_FROM "Gültig ab " + IDS_VALID_TO " bis " + IDS_CERTIFICATE_BAD_SIGNATURE "Das Zertifikat hat einen ungültige Signatur." + IDS_CERTIFICATE_BAD_TIME "Dieses Zertifikat ist entweder abgelaufen oder noch nicht gültig." + IDS_CERTIFICATE_BAD_TIMENEST "Das Zertifikat überschreitet die Gültigkeit des Ausstellers." + IDS_CERTIFICATE_REVOKED "Das Zertifikat wurde vom Aussteller zurückgezogen." + IDS_CERTIFICATE_VALID "Dieses Zertifikat ist gültig." + IDS_FIELD "Feld" + IDS_VALUE "Wert" + IDS_FIELDS_ALL "" + IDS_FIELDS_V1 "Nur Version-1-Felder" + IDS_FIELDS_EXTENSIONS "Nur Erweiterungen" + IDS_FIELDS_CRITICAL_EXTENSIONS "Nur kritische Erweiterungen" + IDS_FIELDS_PROPERTIES "Nur Eigenschaften" + IDS_FIELD_VERSION "Version" + IDS_FIELD_SERIAL_NUMBER "Seriennummer" + IDS_FIELD_ISSUER "Aussteller" + IDS_FIELD_VALID_FROM "Gültig ab" + IDS_FIELD_VALID_TO "Gültig bis" + IDS_FIELD_SUBJECT "Antragsteller" + IDS_FIELD_PUBLIC_KEY "Öffentlicher Schlüssel" + IDS_FIELD_PUBLIC_KEY_FORMAT "%s (%d Bits)" + IDS_PROP_HASH "SHA1 Hash" + IDS_PROP_ENHKEY_USAGE "Erweiterte Schlüsselnutzung (Eigenschaft)" + IDS_PROP_FRIENDLY_NAME "Angezeigter Name" + IDS_PROP_DESCRIPTION "Beschreibung" + IDS_CERTIFICATE_PROPERTIES "Zertifikatseigenschaften" + IDS_CERTIFICATE_PURPOSE_ERROR "Bitte geben Sie die OID im Format 1.2.3.4 an" + IDS_CERTIFICATE_PURPOSE_EXISTS "Die eingegebene OID existiert bereits." + IDS_SELECT_STORE_TITLE "Zertifikatsspeicher wählen" + IDS_SELECT_STORE "Bitte wählen Sie einen Zertifikatsspeicher." + IDS_IMPORT_WIZARD "Importassistent für die Zertifikatsverwaltung" + IDS_IMPORT_TYPE_MISMATCH "Die Datei enthält Objekte, die nicht den Kriterien entsprechen. Bitte wählen Sie eine andere Datei." + IDS_IMPORT_FILE_TITLE "Zu importierende Datei" + IDS_IMPORT_FILE_SUBTITLE "Geben Sie die zu importierende Datei an." + IDS_IMPORT_STORE_TITLE "Zertifikatsspeicher wählen" + IDS_IMPORT_STORE_SUBTITLE "Zertifikatsspeicher sind Systemspeicher für Zertifikate." + IDS_IMPORT_FILTER_CERT "X.509 Zertifikat (*.cer; *.crt)" + IDS_IMPORT_FILTER_PFX "Privater Informationsaustausch (*.pfx; *.p12)" + IDS_IMPORT_FILTER_CRL "Zertifikatssperrliste (*.crl)" + IDS_IMPORT_FILTER_CTL "Zertifikatsvertrauensliste (*.stl)" + IDS_IMPORT_FILTER_SERIALIZED_STORE "Microsoft Speicher serieller Zertifikate (*.sst)" + IDS_IMPORT_FILTER_CMS "CMS/PKCS #7 Zertifikate (*.spc; *.p7b)" + IDS_IMPORT_FILTER_ALL "Alle Dateien (*.*)" + IDS_IMPORT_EMPTY_FILE "Bitte wählen Sie eine Datei." + IDS_IMPORT_BAD_FORMAT "Unbekanntes Format. Wählen Sie eine andere Datei." + IDS_IMPORT_OPEN_FAILED "Konnte die Datei nicht öffnen: " + IDS_IMPORT_DEST_DETERMINED "Automatisch ausgewählt" + IDS_IMPORT_SELECT_STORE "Bitte wählen Sie einen Speicher" + IDS_IMPORT_STORE_SELECTION "Zertifikatsspeicher gewählt" + IDS_IMPORT_DEST_AUTOMATIC "Automatisch ausgewählt" + IDS_IMPORT_FILE "Datei" + IDS_IMPORT_CONTENT "Inhalt" + IDS_IMPORT_CONTENT_CERT "Zertifikat" + IDS_IMPORT_CONTENT_CRL "Zertifikatssperrliste" + IDS_IMPORT_CONTENT_CTL "Zertifikatsvertrauensliste" + IDS_IMPORT_CONTENT_CMS "CMS/PKCS #7 Zertifikat" + IDS_IMPORT_CONTENT_PFX "Privater Informationsaustausch" + IDS_IMPORT_CONTENT_STORE "Zertifikatsspeicher" + IDS_IMPORT_SUCCEEDED "Importvorgang erfolgreich." + IDS_IMPORT_FAILED "Importvorgang gescheitert." + IDS_WIZARD_TITLE_FONT "Arial" + IDS_PURPOSE_ALL "" + IDS_PURPOSE_ADVANCED "" + IDS_SUBJECT_COLUMN "Ausgestellt für" + IDS_ISSUER_COLUMN "Ausgestellt von" + IDS_EXPIRATION_COLUMN "Verfallsdatum" + IDS_FRIENDLY_NAME_COLUMN "Angezeigter Name" + IDS_ALLOWED_PURPOSE_ALL "" + IDS_ALLOWED_PURPOSE_NONE "" + IDS_WARN_REMOVE_MY "Sie sind danach nicht länger fähig Nachrichten mit diesem Zertifikat zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie es löschen möchten?" + IDS_WARN_REMOVE_PLURAL_MY "Sie sind danach nicht länger fähig Nachrichten mit diesen Zertifikaten zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_ADDRESSBOOK "Sie sind danach nicht länger fähig Nachrichten mit diesem Zertifikat zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie es löschen möchten?" + IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Sie sind danach nicht länger fähig Nachrichten mit diesen Zertifikaten zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_CA "Von dieser CA ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie es löschen möchten?" + IDS_WARN_REMOVE_PLURAL_CA "Von diesen CAs ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_ROOT "Von dieser Stamm-CA ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie es löschen möchten?" + IDS_WARN_REMOVE_PLURAL_ROOT "Von diesen Stamm-CAs ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Software die von diesem Hersteller signiert ist wird nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie ihn löschen möchten?" + IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Software die von diesen Herstellern signiert ist wird nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_DEFAULT "Sind Sie sicher, dass Sie dieses Zertifikat entfernen möchten?" + IDS_WARN_REMOVE_PLURAL_DEFAULT "Sind Sie sicher, dass Sie diese Zertifikate entfernen möchten?" + IDS_CERT_MGR "Zertifikate" + IDS_PURPOSE_SERVER_AUTH "Garantiert die Identität eines entfernten Computers" + IDS_PURPOSE_CLIENT_AUTH "Beweist Ihre Identität für einen entfernten Computers" + IDS_PURPOSE_CODE_SIGNING "Schützt Software vor Manipulation nach der Veröffentlichung" + IDS_PURPOSE_EMAIL_PROTECTION "Sichert E-Mail Nachrichten" + IDS_PURPOSE_IPSEC "Erlaubt sichere Kommunikation über das Internet" + IDS_PURPOSE_TIMESTAMP_SIGNING "Erlaubt Daten mit der aktuellen Zeit zu signieren" + IDS_PURPOSE_CTL_USAGE_SIGNING "Erlaubt Ihnen eine Zertifikatsvertrauensliste zu signieren" + IDS_PURPOSE_EFS "Erlaubt es lokale Daten zu verschlüsseln" + IDS_PURPOSE_EFS_RECOVERY "Datenwiederherstellung" + IDS_PURPOSE_WHQL "Windows Hardware Treiber Verifizierung" + IDS_PURPOSE_NT5 "Windows System Komponenten Verifizierung" + IDS_PURPOSE_OEM_WHQL "OEM Windows System Komponenten Verifizierung" + IDS_PURPOSE_EMBEDDED_NT "Embedded Windows System Komponenten Verifizierung" + IDS_PURPOSE_ROOT_LIST_SIGNER "Stammlisten Signierer" + IDS_PURPOSE_QUALIFIED_SUBORDINATION "Qualifizierte Unterordnung" + IDS_PURPOSE_KEY_RECOVERY "Schlüsselwiederherstellung" + IDS_PURPOSE_DOCUMENT_SIGNING "Dokument signieren" + IDS_PURPOSE_LIFETIME_SIGNING "Lebensdauer signieren" + IDS_PURPOSE_DRM "Digitale Rechte" + IDS_PURPOSE_LICENSES "Lizenzschlüssel" + IDS_PURPOSE_LICENSE_SERVER "Lizenz Server Verifizierung" + IDS_PURPOSE_ENROLLMENT_AGENT "Zertifikatsanfrage" + IDS_PURPOSE_SMARTCARD_LOGON "Smart Card Anmeldung" + IDS_PURPOSE_CA_EXCHANGE "Private Schlüsselarchive" + IDS_PURPOSE_KEY_RECOVERY_AGENT "Schlüsselwiederherstellung" + IDS_PURPOSE_DS_EMAIL_REPLICATION "Verzeichnissdienst E-Mail-Replikation" + IDS_EXPORT_WIZARD "Exportassistent für die Zertifikatsverwaltung" + IDS_EXPORT_FORMAT_TITLE "Export Format" + IDS_EXPORT_FORMAT_SUBTITLE "Wählen Sie ein Dateiformat." + IDS_EXPORT_FILE_TITLE "Export Dateiname" + IDS_EXPORT_FILE_SUBTITLE "Geben Sie die Datei an, in die Sie exportieren möchten." + IDS_EXPORT_FILE_EXISTS "Die angegebene Datei existiert bereits. Möchten Sie sie ersetzen?" + IDS_EXPORT_FILTER_CERT "DER-codiertes binäres X.509 (*.cer)" + IDS_EXPORT_FILTER_BASE64_CERT "Base64-codiertes X.509 (*.cer)" + IDS_EXPORT_FILTER_CRL "Zertifikatssperrliste (*.crl)" + IDS_EXPORT_FILTER_CTL "Zertifikatsvertrauensliste (*.stl)" + IDS_EXPORT_FILTER_CMS "CMS/PKCS #7 Zertifikate (*.p7b)" + IDS_EXPORT_FILTER_PFX "Privater Informationsaustausch (*.pfx)" + IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Zertifikatsspeicher (*.sst)" + IDS_EXPORT_FORMAT "Dateiformat" + IDS_EXPORT_INCLUDE_CHAIN "Alle Zertifikate im Zertifizierungspfad einbeziehen" + IDS_EXPORT_KEYS "Schlüssel exportieren" + IDS_YES "Ja" + IDS_NO "Nein" + IDS_EXPORT_SUCCEEDED "Exportvorgang erfolgreich." + IDS_EXPORT_FAILED "Exportvorgang gescheitert." + IDS_EXPORT_PRIVATE_KEY_TITLE "Privaten Schlüssel exportieren" + IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Das Zertifikat enthält einen privaten Schlüssel der eventuell mit dem Zertifikat exportiert wird." + IDS_EXPORT_PASSWORD_TITLE "Passwort eingeben" + IDS_EXPORT_PASSWORD_SUBTITLE "Der private Schlüssel sollte Passwortgeschützt sein." + IDS_EXPORT_PASSWORD_MISMATCH "Die Passwörter sind unterschiedlich." + IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Hinweis: Der private Schlüssel des Zertifikats konnte nicht geöffnet werden." + IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Hinweis: Der private Schlüssel des Zertifikats kann nicht exportiert werden." +} + +IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Allgemein" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", -1, "Static", WS_BORDER|SS_WHITERECT, 6,10,241,200 + CONTROL "", IDC_CERTIFICATE_ICON,"RichEdit20W", + ES_READONLY|WS_DISABLED,8,11,26,26 + CONTROL "", IDC_CERTIFICATE_INFO,"RichEdit20W", + ES_READONLY|WS_DISABLED,34,11,212,26 + CONTROL "", -1, "Static", SS_BLACKFRAME, 16,37,222,1 + CONTROL "", IDC_CERTIFICATE_STATUS,"RichEdit20W", + ES_READONLY|ES_MULTILINE,8,38,238,78 + CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1 + CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W", + ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90 + PUSHBUTTON "&Zertifikat installieren...", IDC_ADDTOSTORE,93,216,80,14 + PUSHBUTTON "Au&sstellererklärung", IDC_ISSUERSTATEMENT,177,216,70,14 +END + +IDD_DETAIL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Details" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Anzeigen:", -1, 6,12,40,14 + COMBOBOX IDC_DETAIL_SELECT, 43,10,100,14, + CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP + CONTROL "", IDC_DETAIL_LIST, "SysListView32", + LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 6,28,241,100 + CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W", + ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70 + PUSHBUTTON "&Eigenschaften bearbeiten...", IDC_EDITPROPERTIES,75,216,98,14 + PUSHBUTTON "In &Datei kopieren...", IDC_EXPORT,177,216,70,14 +END + +IDD_HIERARCHY DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Zertifizierungspfad" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "&Zertifizierungspfad", -1,6,10,245,165, BS_GROUPBOX + CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER, + 13,22,231,130 + PUSHBUTTON "&Zertifikat anzeigen", IDC_VIEWCERTIFICATE,175,156,70,14 + LTEXT "Zertifizierungs&status:", IDC_CERTIFICATESTATUS,6,183,70,14 + CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W", + WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36 +END + +IDD_USERNOTICE DIALOG DISCARDABLE 0, 0, 255, 256 +CAPTION "Haftungsausschluss" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_USERNOTICE,"RichEdit20W", + WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200 + PUSHBUTTON "Schließen", IDOK,95,216,70,14 + PUSHBUTTON "weitere &Informationen", IDC_CPS,171,216,76,14 +END + +IDD_CERT_PROPERTIES_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Allgemein" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Name:", -1, 6,14,60,14 + EDITTEXT IDC_FRIENDLY_NAME, 60,12,191,14, ES_AUTOHSCROLL|WS_TABSTOP + LTEXT "&Beschreibung:", -1, 6,32,60,14 + EDITTEXT IDC_DESCRIPTION, 60,30,191,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + GROUPBOX "Zertifikatszwecke", -1,6,48,245,165, BS_GROUPBOX + AUTORADIOBUTTON "&Alle Zwecke für dieses Zertifikat aktivieren", + IDC_ENABLE_ALL_PURPOSES, 12,58,180,14, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "A&lle Zwecke für dieses Zertifikat deaktivieren", + IDC_DISABLE_ALL_PURPOSES, 12,70,180,14, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "Nur &folgende Zwecke aktivieren:", + IDC_ENABLE_SELECTED_PURPOSES, 12,82,180,14, BS_AUTORADIOBUTTON + CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 24,100,220,90 + PUSHBUTTON "&Zweck hinzufügen...", IDC_ADD_PURPOSE,173,194,71,14 +END + +IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68 +CAPTION "Zweck hinzufügen" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Geben Sie die Objekt-ID (OID) für den Zertifikatszweck an, den Sie hinzufügen möchten:", + -1, 6,6,190,28 + EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + PUSHBUTTON "OK", IDOK, 33,48,60,14 + PUSHBUTTON "Abbrechen", IDCANCEL, 100,48,60,14 +END + +IDD_SELECT_STORE DIALOG DISCARDABLE 0,0,200,136 +CAPTION "Zertifikatsspeicher wählen" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Zertifikatsspeicher wählen den Sie benutzen möchten:", IDC_STORE_TEXT, 6,6,190,28 + CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP, + 6,28,188,70 + CHECKBOX "&Physikalischen Speicher anzeigen", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14, + BS_AUTOCHECKBOX|WS_TABSTOP + PUSHBUTTON "OK", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Abbrechen", IDCANCEL, 144,118,50,14 +END + +IDD_IMPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Importassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Willkommen", IDC_IMPORT_TITLE, + 115,1,195,40 + LTEXT "Dieser Assistent hilft ihnen Zertifikate, Zertifikatssperrlisten und Zertifikatsvertrauenslisten aus einer Datei zu importieren.", + -1, 115,33,195,24 + LTEXT "Ein Zertifikat dient zur Identifikation von Ihnen oder ihrem Computer. Es kann auch für die Authentifizierung und zum Unterzeichnen genutzt werden. Zertifikatsspeicher sind Sammlungen von Zertifikaten, Zertifikatssperrlisten und Zertifikatsvertrauenslisten.", + -1, 115,64,195,40 + LTEXT "Klicken Sie Weiter um fortzufahren.", + -1, 115,111,195,8 +END + +IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Importassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Dateiname:", -1, 21,1,195,10 + EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "D&urchsuchen...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14 + LTEXT "Hinweis: Es können mehrere Zertifikate in einer Datei folgender Formate gespeichert werden:", + -1, 21,26,265,16 + LTEXT "Syntaxstandard kryptografischer Meldungen /PKCS #7 Messages (.p7b)", + -1, 31,49,265,10 + LTEXT "Privater Informationsaustausch/PKCS #12 (.pfx, .p12)", + -1, 31,64,265,10 + LTEXT "Microsoft Speicher serieller Zertifikate (.sst)", + -1, 31,79,265,10 +END + +IDD_IMPORT_STORE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Importassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wine kann automatisch einen Zertifikatsspeicher wählen, oder Sie wählen einen aus.", + -1, 21,1,195,20 + AUTORADIOBUTTON "A&utomatisch einen Zertifikatsspeicher wählen", + IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "&Alle Zertifikate im folgendem Zertifikatsspeicher speichern:", + IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON + EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY + PUSHBUTTON "&Durchsuchen...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14 +END + +IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Importassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Fertigstellen des Assistenten", IDC_IMPORT_TITLE, + 115,1,195,40 + LTEXT "Importvorgang ordnungsgemäß abgeschlossen.", + -1, 115,33,195,24 + LTEXT "Sie haben folgende Einstellungen gewählt:", + -1, 115,57,195,12 + CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 115,67,174,100 +END + +IDD_CERT_MGR DIALOG DISCARDABLE 0,0,335,270 +CAPTION "Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Geplanter Zweck:", -1, 7,9,100,12 + COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14, + CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP + CONTROL "", IDC_MGR_STORES, "SysTabControl32", + WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140 + CONTROL "", IDC_MGR_CERTS, "SysListView32", + LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111 + PUSHBUTTON "&Importieren...", IDC_MGR_IMPORT, 7,172,51,14 + PUSHBUTTON "&Exportieren...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED + PUSHBUTTON "&Entfernen", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED + PUSHBUTTON "&Erweitert...", IDC_MGR_ADVANCED, 277,172,51,14 + GROUPBOX "Beabsichtigte Zwecke des Zertifikates", -1,7,194,321,47, BS_GROUPBOX + LTEXT "", IDC_MGR_PURPOSES, 13,208,252,30 + PUSHBUTTON "&Anzeigen...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED + PUSHBUTTON "&Schließen", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON +END + +IDD_CERT_MGR_ADVANCED DIALOG DISCARDABLE 0,0,248,176 +CAPTION "Erweiterte Optionen" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Zertifikatszweck", -1, 7,7,234,141, BS_GROUPBOX + LTEXT "Wählen Sie mindestens einen Zweck, der als Erweitert aufgeführt werden soll.", + -1, 14,18,220,16 + LTEXT "&Zertifikatszwecke:", -1, 14,41,90,12, WS_TABSTOP + CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 14,51,220,90 + PUSHBUTTON "OK", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Abbrechen", IDCANCEL, 190,155,51,14 +END + +IDD_EXPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Willkommen", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "Dieser Assistent hilft ihnen Zertifikate, Zertifikatssperrlisten und Zertifikatsvertrauenslisten in eine Datei zu exportieren.", + -1, 115,33,195,16 + LTEXT "Ein Zertifikat dient zur Identifikation von Ihnen oder ihrem Computer. Es kann auch für die Authentifizierung und zum Unterzeichnen genutzt werden. Zertifikatsspeicher sind Sammlungen von Zertifikaten, Zertifikatssperrlisten und Zertifikatsvertrauenslisten.", + -1, 115,56,195,40 + LTEXT "Klicken Sie Weiter um fortzufahren.", + -1, 115,103,195,8 +END + +IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wenn Sie sich entscheiden den privaten Schlüssel zu exportieren, werden Sie später nach einem Passwort gefragt.", -1, 21,1,195,23 + LTEXT "Privaten Schlüssel exportieren?", -1, 21,24,195,15 + AUTORADIOBUTTON "&Ja, privaten Schlüssel exportieren", + IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "&Nein, privaten Schlüssel nicht exportieren", + IDC_EXPORT_PRIVATE_KEY_NO, 31,48,200,12, BS_AUTORADIOBUTTON + LTEXT "", IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE, 21,60,200,24 +END + +IDD_EXPORT_PASSWORD DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Passwort:", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + LTEXT "Passwort &bestätigen:", -1, 21,35,195,10 + EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP +END + +IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wählen Sie das gewünschte Format:", -1, 21,1,195,10 + AUTORADIOBUTTON "&DER-codiertes X.509 (.cer)", + IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "B&ase64-codiertes X.509 (.cer):", + IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "&Syntaxstandard kryptografischer Meldungen/PKCS #7 Zertifikate (.p7b)", + IDC_EXPORT_FORMAT_CMS, 31,42,250,12, BS_AUTORADIOBUTTON + CHECKBOX "&Wenn möglich alle Zertifikate im Zertifizierungspfad einbeziehen", + IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,250,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + AUTORADIOBUTTON "&Privater Informationsaustausch/PKCS #12 (.pfx)", + IDC_EXPORT_FORMAT_PFX, 31,72,250,12, BS_AUTORADIOBUTTON|WS_DISABLED + CHECKBOX "W&enn möglich alle Zertifikate im Zertifizierungspfad einbeziehen", + IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,250,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "&Verstärkte Sicherheit aktivieren", + IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "Priva&ten Schlüssel löschen wenn der Export erfolgreich war", + IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,250,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED +END + +IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Dateiname:", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "&Durchsuchen...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14 +END + +IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Fertigstellen des Assistenten", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "Exportvorgang ordnungsgemäß abgeschlossen.", + -1, 115,33,195,24 + LTEXT "Sie haben folgende Einstellungen gewählt:", + -1, 115,57,195,12 + CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 115,67,174,100 +END + +#pragma code_page(default) From 075273b3eac52b63e7c246e23cf948f023c1fbaf Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 19:38:47 +0000 Subject: [PATCH 045/577] sync hhctrl.ocx with wine 1.1.24 svn path=/trunk/; revision=41552 --- reactos/dll/win32/hhctrl.ocx/Lt.rc | 63 ++++++++++++++++++++++++++ reactos/dll/win32/hhctrl.ocx/hhctrl.rc | 1 + 2 files changed, 64 insertions(+) create mode 100644 reactos/dll/win32/hhctrl.ocx/Lt.rc diff --git a/reactos/dll/win32/hhctrl.ocx/Lt.rc b/reactos/dll/win32/hhctrl.ocx/Lt.rc new file mode 100644 index 00000000000..fed6b40e400 --- /dev/null +++ b/reactos/dll/win32/hhctrl.ocx/Lt.rc @@ -0,0 +1,63 @@ +/* + * HTML Help resources + * Lithuanian Language Support + * + * Copyright 2009 Aurimas FiÅ¡eras + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_CONTENTS "&Turinys" + IDS_INDEX "&RodyklÄ—" + IDS_SEARCH "&PaieÅ¡ka" + IDS_FAVORITES "&Adresynas" +END + +STRINGTABLE +BEGIN + IDTB_EXPAND "Rodyti" + IDTB_CONTRACT "SlÄ—pti" + IDTB_STOP "Stabdyti" + IDTB_REFRESH "Atnaujinti" + IDTB_BACK "Atgal" + IDTB_HOME "Ä® pradžiÄ…" + IDTB_SYNC "Sinchronizuoti" + IDTB_PRINT "Spausdinti" + IDTB_OPTIONS "Parinktys" + IDTB_FORWARD "Pirmyn" + IDTB_NOTES "IDTB_NOTES" + IDTB_BROWSE_FWD "IDTB_BROWSE_FWD" + IDTB_BROWSE_BACK "IDT_BROWSE_BACK" + IDTB_CONTENTS "IDTB_CONTENTS" + IDTB_INDEX "IDTB_INDEX" + IDTB_SEARCH "IDTB_SEARCH" + IDTB_HISTORY "IDTB_HISTORY" + IDTB_FAVORITES "IDTB_FAVORITES" + IDTB_JUMP1 "Nukreipimas1" + IDTB_JUMP2 "Nukreipimas2" + IDTB_CUSTOMIZE "Adaptuoti" + IDTB_ZOOM "Keisti mastelį" + IDTB_TOC_NEXT "IDTB_TOC_NEXT" + IDTB_TOC_PREV "IDTB_TOC_PREV" +END + +#pragma code_page(default) diff --git a/reactos/dll/win32/hhctrl.ocx/hhctrl.rc b/reactos/dll/win32/hhctrl.ocx/hhctrl.rc index e6dc1126418..8618819ed12 100644 --- a/reactos/dll/win32/hhctrl.ocx/hhctrl.rc +++ b/reactos/dll/win32/hhctrl.ocx/hhctrl.rc @@ -38,6 +38,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Fi.rc" #include "Hu.rc" #include "Ko.rc" +#include "Lt.rc" #include "Nl.rc" #include "No.rc" #include "Pl.rc" From edb01fbf5b9e34d06210267f91a43bb9d065995e Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 19:47:30 +0000 Subject: [PATCH 046/577] sync credui with wine 1.1.24 svn path=/trunk/; revision=41553 --- reactos/dll/win32/credui/credui_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/credui/credui_main.c b/reactos/dll/win32/credui/credui_main.c index 7e3c8a02ab9..a6bbde62eb8 100644 --- a/reactos/dll/win32/credui/credui_main.c +++ b/reactos/dll/win32/credui/credui_main.c @@ -138,7 +138,7 @@ struct cred_dialog_params BOOL fBalloonTipActive; }; -static void CredDialogFillUsernameCombo(HWND hwndUsername, struct cred_dialog_params *params) +static void CredDialogFillUsernameCombo(HWND hwndUsername, const struct cred_dialog_params *params) { DWORD count; DWORD i; From 1e54de4e07daf85cebb666369370fa4703d59402 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 19:52:48 +0000 Subject: [PATCH 047/577] sync user32_winetest with wine 1.1.24 svn path=/trunk/; revision=41554 --- rostests/winetests/user32/msg.c | 157 ++++++++++++++++++++++++++++++-- 1 file changed, 147 insertions(+), 10 deletions(-) diff --git a/rostests/winetests/user32/msg.c b/rostests/winetests/user32/msg.c index 0a59ae8b55f..580582f58ad 100755 --- a/rostests/winetests/user32/msg.c +++ b/rostests/winetests/user32/msg.c @@ -1775,6 +1775,7 @@ static BOOL ignore_message( UINT message ) message == WM_GETICON || message == WM_GETOBJECT || message == WM_TIMECHANGE || + message == WM_DISPLAYCHANGE || message == WM_DEVICECHANGE); } @@ -1870,7 +1871,10 @@ static void add_message_(int line, const struct recvd_message *msg) di.u.lp = 0; di.u.item.type = dis->CtlType; di.u.item.ctl_id = dis->CtlID; - di.u.item.item_id = dis->itemID; + if (dis->CtlType == ODT_LISTBOX || + dis->CtlType == ODT_COMBOBOX || + dis->CtlType == ODT_MENU) + di.u.item.item_id = dis->itemID; di.u.item.action = dis->itemAction; di.u.item.state = dis->itemState; @@ -5088,6 +5092,8 @@ todo_wine { } /****************** button message test *************************/ +#define ID_BUTTON 0x000e + static const struct message WmSetFocusButtonSeq[] = { { HCBT_SETFOCUS, hook }, @@ -5095,7 +5101,9 @@ static const struct message WmSetFocusButtonSeq[] = { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 2 }, { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, { WM_SETFOCUS, sent|wparam, 0 }, - { WM_CTLCOLORBTN, sent|defwinproc }, + { WM_CTLCOLORBTN, sent|parent }, + { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_SETFOCUS) }, + { WM_APP, sent|wparam|lparam, 0, 0 }, { 0 } }; static const struct message WmKillFocusButtonSeq[] = @@ -5103,9 +5111,13 @@ static const struct message WmKillFocusButtonSeq[] = { HCBT_SETFOCUS, hook }, { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, { WM_KILLFOCUS, sent|wparam, 0 }, - { WM_CTLCOLORBTN, sent|defwinproc }, + { WM_CTLCOLORBTN, sent|parent }, + { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_KILLFOCUS) }, { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 1 }, + { WM_APP, sent|wparam|lparam, 0, 0 }, + { WM_PAINT, sent }, + { WM_CTLCOLORBTN, sent|parent }, { 0 } }; static const struct message WmSetFocusStaticSeq[] = @@ -5115,7 +5127,10 @@ static const struct message WmSetFocusStaticSeq[] = { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 2 }, { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, { WM_SETFOCUS, sent|wparam, 0 }, - { WM_CTLCOLORSTATIC, sent|defwinproc }, + { WM_CTLCOLORSTATIC, sent|parent }, + { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_SETFOCUS) }, + { WM_COMMAND, sent|wparam|parent|optional, MAKEWPARAM(ID_BUTTON, BN_CLICKED) }, /* radio button */ + { WM_APP, sent|wparam|lparam, 0, 0 }, { 0 } }; static const struct message WmKillFocusStaticSeq[] = @@ -5123,9 +5138,42 @@ static const struct message WmKillFocusStaticSeq[] = { HCBT_SETFOCUS, hook }, { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, { WM_KILLFOCUS, sent|wparam, 0 }, - { WM_CTLCOLORSTATIC, sent|defwinproc }, + { WM_CTLCOLORSTATIC, sent|parent }, + { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_KILLFOCUS) }, { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 1 }, + { WM_APP, sent|wparam|lparam, 0, 0 }, + { WM_PAINT, sent }, + { WM_CTLCOLORSTATIC, sent|parent }, + { 0 } +}; +static const struct message WmSetFocusOwnerdrawSeq[] = +{ + { HCBT_SETFOCUS, hook }, + { WM_IME_SETCONTEXT, sent|wparam|optional, 1 }, + { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 2 }, + { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, + { WM_SETFOCUS, sent|wparam, 0 }, + { WM_CTLCOLORBTN, sent|parent }, + { WM_DRAWITEM, sent|wparam|lparam|parent, ID_BUTTON, 0x001040e4 }, + { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_SETFOCUS) }, + { WM_APP, sent|wparam|lparam, 0, 0 }, + { 0 } +}; +static const struct message WmKillFocusOwnerdrawSeq[] = +{ + { HCBT_SETFOCUS, hook }, + { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, + { WM_KILLFOCUS, sent|wparam, 0 }, + { WM_CTLCOLORBTN, sent|parent }, + { WM_DRAWITEM, sent|wparam|lparam|parent, ID_BUTTON, 0x000040e4 }, + { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_KILLFOCUS) }, + { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, + { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 1 }, + { WM_APP, sent|wparam|lparam, 0, 0 }, + { WM_PAINT, sent }, + { WM_CTLCOLORBTN, sent|parent }, + { WM_DRAWITEM, sent|wparam|lparam|parent, ID_BUTTON, 0x000010e4 }, { 0 } }; static const struct message WmLButtonDownSeq[] = @@ -5242,10 +5290,10 @@ static void test_button_messages(void) { BS_AUTORADIOBUTTON, DLGC_BUTTON | DLGC_RADIOBUTTON, WmSetFocusStaticSeq, WmKillFocusStaticSeq }, { BS_OWNERDRAW, DLGC_BUTTON, - WmSetFocusButtonSeq, WmKillFocusButtonSeq } + WmSetFocusOwnerdrawSeq, WmKillFocusOwnerdrawSeq } }; unsigned int i; - HWND hwnd; + HWND hwnd, parent; DWORD dlg_code; HFONT zfont; @@ -5262,30 +5310,58 @@ static void test_button_messages(void) subclass_button(); + parent = CreateWindowExA(0, "TestParentClass", "Test parent", WS_OVERLAPPEDWINDOW | WS_VISIBLE, + 100, 100, 200, 200, 0, 0, 0, NULL); + ok(parent != 0, "Failed to create parent window\n"); + for (i = 0; i < sizeof(button)/sizeof(button[0]); i++) { - hwnd = CreateWindowExA(0, "my_button_class", "test", button[i].style | WS_POPUP, - 0, 0, 50, 14, 0, 0, 0, NULL); + MSG msg; + DWORD style; + + hwnd = CreateWindowExA(0, "my_button_class", "test", button[i].style | WS_CHILD | BS_NOTIFY, + 0, 0, 50, 14, parent, (HMENU)ID_BUTTON, 0, NULL); ok(hwnd != 0, "Failed to create button window\n"); + style = GetWindowLongA(hwnd, GWL_STYLE); + style &= ~(WS_CHILD | BS_NOTIFY); + /* XP turns a BS_USERBUTTON into BS_PUSHBUTTON */ + if (button[i].style == BS_USERBUTTON) + todo_wine ok(style == BS_PUSHBUTTON, "expected style BS_PUSHBUTTON got %x\n", style); + else + ok(style == button[i].style, "expected style %x got %x\n", button[i].style, style); + dlg_code = SendMessageA(hwnd, WM_GETDLGCODE, 0, 0); ok(dlg_code == button[i].dlg_code, "%u: wrong dlg_code %08x\n", i, dlg_code); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); SetFocus(0); + flush_events(); flush_sequence(); + log_all_parent_messages++; + trace("button style %08x\n", button[i].style); + ok(GetFocus() == 0, "expected focus 0, got %p\n", GetFocus()); SetFocus(hwnd); + SendMessage(hwnd, WM_APP, 0, 0); /* place a separator mark here */ + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg); ok_sequence(button[i].setfocus, "SetFocus(hwnd) on a button", FALSE); SetFocus(0); + SendMessage(hwnd, WM_APP, 0, 0); /* place a separator mark here */ + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg); ok_sequence(button[i].killfocus, "SetFocus(0) on a button", FALSE); + log_all_parent_messages--; + + ok(GetFocus() == 0, "expected focus 0, got %p\n", GetFocus()); DestroyWindow(hwnd); } + DestroyWindow(parent); + hwnd = CreateWindowExA(0, "my_button_class", "test", BS_PUSHBUTTON | WS_POPUP | WS_VISIBLE, 0, 0, 50, 14, 0, 0, 0, NULL); ok(hwnd != 0, "Failed to create button window\n"); @@ -7169,7 +7245,7 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam message == WM_PARENTNOTIFY || message == WM_CANCELMODE || message == WM_SETFOCUS || message == WM_KILLFOCUS || message == WM_ENABLE || message == WM_ENTERIDLE || - message == WM_DRAWITEM || + message == WM_DRAWITEM || message == WM_COMMAND || message == WM_IME_SETCONTEXT) { switch (message) @@ -11592,6 +11668,66 @@ static void test_defwinproc(void) DestroyWindow( hwnd); } +static void test_PostMessage(void) +{ + static const struct + { + HWND hwnd; + BOOL ret; + } data[] = + { + { HWND_TOP /* 0 */, TRUE }, + { HWND_BROADCAST, TRUE }, + { HWND_BOTTOM, TRUE }, + { HWND_TOPMOST, TRUE }, + { HWND_NOTOPMOST, FALSE }, + { HWND_MESSAGE, FALSE }, + { (HWND)0xdeadbeef, FALSE } + }; + int i; + HWND hwnd; + BOOL ret; + MSG msg; + static const WCHAR staticW[] = {'s','t','a','t','i','c',0}; + + SetLastError(0xdeadbeef); + hwnd = CreateWindowExW(0, staticW, NULL, WS_POPUP, 0,0,0,0,0,0,0, NULL); + if (!hwnd && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("Skipping some PostMessage tests on Win9x/WinMe\n"); + return; + } + assert(hwnd); + + flush_events(); + + PostMessage(hwnd, WM_USER+1, 0x1234, 0x5678); + PostMessage(0, WM_USER+2, 0x5678, 0x1234); + + for (i = 0; i < sizeof(data)/sizeof(data[0]); i++) + { + memset(&msg, 0xab, sizeof(msg)); + ret = PeekMessageA(&msg, data[i].hwnd, 0, 0, PM_NOREMOVE); + ok(ret == data[i].ret, "%d: hwnd %p expected %d, got %d\n", i, data[i].hwnd, data[i].ret, ret); + if (data[i].ret) + { + if (data[i].hwnd) + ok(ret && msg.hwnd == 0 && msg.message == WM_USER+2 && + msg.wParam == 0x5678 && msg.lParam == 0x1234, + "%d: got ret %d hwnd %p msg %04x wParam %08lx lParam %08lx instead of TRUE/0/WM_USER+2/0x5678/0x1234\n", + i, ret, msg.hwnd, msg.message, msg.wParam, msg.lParam); + else + ok(ret && msg.hwnd == hwnd && msg.message == WM_USER+1 && + msg.wParam == 0x1234 && msg.lParam == 0x5678, + "%d: got ret %d hwnd %p msg %04x wParam %08lx lParam %08lx instead of TRUE/%p/WM_USER+1/0x1234/0x5678\n", + i, ret, msg.hwnd, msg.message, msg.wParam, msg.lParam, msg.hwnd); + } + } + + DestroyWindow(hwnd); + flush_events(); +} + START_TEST(msg) { BOOL ret; @@ -11633,6 +11769,7 @@ START_TEST(msg) hEvent_hook = 0; #endif + test_PostMessage(); test_ShowWindow(); test_PeekMessage(); test_PeekMessage2(); From b704b9556d5628e1712bc6871a4b652d113e8d5a Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 19:56:37 +0000 Subject: [PATCH 048/577] sync user32 button with wine 1.1.24 svn path=/trunk/; revision=41555 --- reactos/dll/win32/user32/controls/button.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/dll/win32/user32/controls/button.c b/reactos/dll/win32/user32/controls/button.c index 3763fbcf173..b746d3a2eba 100644 --- a/reactos/dll/win32/user32/controls/button.c +++ b/reactos/dll/win32/user32/controls/button.c @@ -467,6 +467,7 @@ static LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg, if (style & BS_NOTIFY) BUTTON_NOTIFY_PARENT(hWnd, BN_KILLFOCUS); + InvalidateRect( hWnd, NULL, FALSE ); break; case WM_SYSCOLORCHANGE: From 2cdaa146f7027ded7e691078bb473052cae6efa5 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 22 Jun 2009 20:00:38 +0000 Subject: [PATCH 049/577] modified dll/ntdll/include/ntdll.h Explicitly include modified dll/ntdll/ldr/utils.c Use ANSI C variadic macros, instead of hacks ntdll now compiles with Visual C++ svn path=/trunk/; revision=41556 --- reactos/dll/ntdll/include/ntdll.h | 3 +++ reactos/dll/ntdll/ldr/utils.c | 8 +------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/reactos/dll/ntdll/include/ntdll.h b/reactos/dll/ntdll/include/ntdll.h index e85d5c5ffb6..6c05a3e9d35 100644 --- a/reactos/dll/ntdll/include/ntdll.h +++ b/reactos/dll/ntdll/include/ntdll.h @@ -32,4 +32,7 @@ /* CSRSS Header */ #include +/* PSEH */ +#include + /* EOF */ diff --git a/reactos/dll/ntdll/ldr/utils.c b/reactos/dll/ntdll/ldr/utils.c index 83c5bbb7319..7c231ab0cf2 100644 --- a/reactos/dll/ntdll/ldr/utils.c +++ b/reactos/dll/ntdll/ldr/utils.c @@ -27,13 +27,7 @@ /* GLOBALS *******************************************************************/ #ifdef NDEBUG -#if defined(__GNUC__) -#define TRACE_LDR(args...) if (RtlGetNtGlobalFlags() & FLG_SHOW_LDR_SNAPS) { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } -#elif defined(_MSC_VER) -#define TRACE_LDR(args, ...) if (RtlGetNtGlobalFlags() & FLG_SHOW_LDR_SNAPS) { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(__VA_ARGS__); } -#endif /* __GNUC__ */ -#else -#define TRACE_LDR(args...) do { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(args); } while(0) +#define TRACE_LDR(...) if (RtlGetNtGlobalFlags() & FLG_SHOW_LDR_SNAPS) { DbgPrint("(LDR:%s:%d) ",__FILE__,__LINE__); DbgPrint(__VA_ARGS__); } #endif typedef struct _TLS_DATA From 223ecea05b4694bcb921f8814f0ad53cffbc9f8f Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 22 Jun 2009 20:03:20 +0000 Subject: [PATCH 050/577] #define inline to __inline for Visual C++ when compiling C sources svn path=/trunk/; revision=41557 --- reactos/ReactOS-generic.rbuild | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/ReactOS-generic.rbuild b/reactos/ReactOS-generic.rbuild index 041bd557bdb..e3fd526b33f 100644 --- a/reactos/ReactOS-generic.rbuild +++ b/reactos/ReactOS-generic.rbuild @@ -132,6 +132,7 @@ + __inline /Zl /Zi /W1 From 156d181a796895d0921924c7160a0bdc4e420649 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 20:07:32 +0000 Subject: [PATCH 051/577] sync advapi32_winetest with wine 1.1.24 svn path=/trunk/; revision=41558 --- rostests/winetests/advapi32/lsa.c | 45 +++++++++++++++++++++++--- rostests/winetests/advapi32/security.c | 9 +++--- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/rostests/winetests/advapi32/lsa.c b/rostests/winetests/advapi32/lsa.c index 39c91d38123..e69e4e1b563 100644 --- a/rostests/winetests/advapi32/lsa.c +++ b/rostests/winetests/advapi32/lsa.c @@ -37,6 +37,7 @@ DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); static HMODULE hadvapi32; static NTSTATUS (WINAPI *pLsaClose)(LSA_HANDLE); +static NTSTATUS (WINAPI *pLsaEnumerateAccountRights)(LSA_HANDLE,PSID,PLSA_UNICODE_STRING*,PULONG); static NTSTATUS (WINAPI *pLsaFreeMemory)(PVOID); static NTSTATUS (WINAPI *pLsaOpenPolicy)(PLSA_UNICODE_STRING,PLSA_OBJECT_ATTRIBUTES,ACCESS_MASK,PLSA_HANDLE); static NTSTATUS (WINAPI *pLsaQueryInformationPolicy)(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*); @@ -47,12 +48,13 @@ static BOOL init(void) hadvapi32 = GetModuleHandle("advapi32.dll"); pLsaClose = (void*)GetProcAddress(hadvapi32, "LsaClose"); + pLsaEnumerateAccountRights = (void*)GetProcAddress(hadvapi32, "LsaEnumerateAccountRights"); pLsaFreeMemory = (void*)GetProcAddress(hadvapi32, "LsaFreeMemory"); pLsaOpenPolicy = (void*)GetProcAddress(hadvapi32, "LsaOpenPolicy"); pLsaQueryInformationPolicy = (void*)GetProcAddress(hadvapi32, "LsaQueryInformationPolicy"); pConvertSidToStringSidA = (void*)GetProcAddress(hadvapi32, "ConvertSidToStringSidA"); - if (pLsaClose && pLsaFreeMemory && pLsaOpenPolicy && pLsaQueryInformationPolicy && pConvertSidToStringSidA) + if (pLsaClose && pLsaEnumerateAccountRights && pLsaFreeMemory && pLsaOpenPolicy && pLsaQueryInformationPolicy && pConvertSidToStringSidA) return TRUE; return FALSE; @@ -73,9 +75,9 @@ static void test_lsa(void) /* try a more restricted access mask if necessary */ if (status == STATUS_ACCESS_DENIED) { - trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n"); - status = pLsaOpenPolicy( NULL, &object_attributes, POLICY_VIEW_LOCAL_INFORMATION, &handle); - ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08x\n", status); + trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES\n"); + status = pLsaOpenPolicy( NULL, &object_attributes, POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES, &handle); + ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES) returned 0x%08x\n", status); } if (status == STATUS_SUCCESS) { @@ -83,6 +85,8 @@ static void test_lsa(void) PPOLICY_PRIMARY_DOMAIN_INFO primary_domain_info; PPOLICY_ACCOUNT_DOMAIN_INFO account_domain_info; PPOLICY_DNS_DOMAIN_INFO dns_domain_info; + HANDLE token; + BOOL ret; status = pLsaQueryInformationPolicy(handle, PolicyAuditEventsInformation, (PVOID*)&audit_events_info); if (status == STATUS_ACCESS_DENIED) @@ -174,6 +178,39 @@ static void test_lsa(void) pLsaFreeMemory((LPVOID)dns_domain_info); } + /* We need a valid SID to pass to LsaEnumerateAccountRights */ + ret = OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &token ); + ok(ret, "Unable to obtain process token, error %u\n", GetLastError( )); + if (ret) { + char buffer[64]; + DWORD len; + TOKEN_USER *token_user = (TOKEN_USER *) buffer; + ret = GetTokenInformation( token, TokenUser, (LPVOID) token_user, sizeof(buffer), &len ); + ok(ret || GetLastError( ) == ERROR_INSUFFICIENT_BUFFER, "Unable to obtain token information, error %u\n", GetLastError( )); + if (! ret && GetLastError( ) == ERROR_INSUFFICIENT_BUFFER) { + trace("Resizing buffer to %u.\n", len); + token_user = LocalAlloc( 0, len ); + if (token_user != NULL) + ret = GetTokenInformation( token, TokenUser, (LPVOID) token_user, len, &len ); + } + + if (ret) { + PLSA_UNICODE_STRING rights; + ULONG rights_count; + rights = (PLSA_UNICODE_STRING) 0xdeadbeaf; + rights_count = 0xcafecafe; + status = pLsaEnumerateAccountRights(handle, token_user->User.Sid, &rights, &rights_count); + ok(status == STATUS_SUCCESS || status == STATUS_OBJECT_NAME_NOT_FOUND, "Unexpected status 0x%x\n", status); + if (status == STATUS_SUCCESS) + pLsaFreeMemory( rights ); + else + ok(rights == NULL && rights_count == 0, "Expected rights and rights_count to be set to 0 on failure\n"); + } + if (token_user != NULL && token_user != (TOKEN_USER *) buffer) + LocalFree( token_user ); + CloseHandle( token ); + } + status = pLsaClose(handle); ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08x\n", status); } diff --git a/rostests/winetests/advapi32/security.c b/rostests/winetests/advapi32/security.c index b68629d3916..af52a3acf05 100644 --- a/rostests/winetests/advapi32/security.c +++ b/rostests/winetests/advapi32/security.c @@ -1237,10 +1237,11 @@ static void test_token_attr(void) Domain[0] = '\0'; ret = LookupAccountSid(NULL, Groups->Groups[i].Sid, Name, &NameLength, Domain, &DomainLength, &SidNameUse); if (ret) - trace("\t%s, %s\\%s use: %d attr: 0x%08x\n", SidString, Domain, Name, SidNameUse, Groups->Groups[i].Attributes); - else - trace("\t%s, attr: 0x%08x LookupAccountSid failed with error %d\n", SidString, Groups->Groups[i].Attributes, GetLastError()); - LocalFree(SidString); + { + trace("%s, %s\\%s use: %d attr: 0x%08x\n", SidString, Domain, Name, SidNameUse, Groups->Groups[i].Attributes); + LocalFree(SidString); + } + else trace("attr: 0x%08x LookupAccountSid failed with error %d\n", Groups->Groups[i].Attributes, GetLastError()); } HeapFree(GetProcessHeap(), 0, Groups); From 4f96f16ac2b6fe50371f86831a0cc481207b7ec2 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 20:08:05 +0000 Subject: [PATCH 052/577] sync CreateWellKnownSid with wine 1.1.24 svn path=/trunk/; revision=41559 --- reactos/dll/win32/advapi32/sec/sid.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/advapi32/sec/sid.c b/reactos/dll/win32/advapi32/sec/sid.c index 10925430718..7efe2a3f252 100644 --- a/reactos/dll/win32/advapi32/sec/sid.c +++ b/reactos/dll/win32/advapi32/sec/sid.c @@ -1664,7 +1664,8 @@ CreateWellKnownSid(IN WELL_KNOWN_SID_TYPE WellKnownSidType, unsigned int i; TRACE("(%d, %s, %p, %p)\n", WellKnownSidType, debugstr_sid(DomainSid), pSid, cbSid); - if (cbSid == NULL || pSid == NULL || (DomainSid && !IsValidSid(DomainSid))) { + if (cbSid == NULL || (DomainSid && !IsValidSid(DomainSid))) + { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } @@ -1673,11 +1674,17 @@ CreateWellKnownSid(IN WELL_KNOWN_SID_TYPE WellKnownSidType, if (WellKnownSids[i].Type == WellKnownSidType) { DWORD length = GetSidLengthRequired(WellKnownSids[i].Sid.SubAuthorityCount); - if (*cbSid < length) { + if (*cbSid < length) + { + *cbSid = length; SetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; } - + if (!pSid) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } CopyMemory(pSid, &WellKnownSids[i].Sid.Revision, length); *cbSid = length; return TRUE; @@ -1696,11 +1703,17 @@ CreateWellKnownSid(IN WELL_KNOWN_SID_TYPE WellKnownSidType, DWORD domain_sid_length = GetSidLengthRequired(domain_subauth); DWORD output_sid_length = GetSidLengthRequired(domain_subauth + 1); - if (*cbSid < output_sid_length) { + if (*cbSid < output_sid_length) + { + *cbSid = output_sid_length; SetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; } - + if (!pSid) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } CopyMemory(pSid, DomainSid, domain_sid_length); (*GetSidSubAuthorityCount(pSid))++; (*GetSidSubAuthority(pSid, domain_subauth)) = WellKnownRids[i].Rid; From e89c456751df8433e9035f629bc8cb32a12f84b5 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 22 Jun 2009 20:15:42 +0000 Subject: [PATCH 053/577] modified dll/win32/kernel32/file/volume.c modified dll/win32/kernel32/misc/actctx.c modified dll/win32/kernel32/misc/lang.c C89 compliance modified dll/win32/kernel32/k32.h Include modified dll/win32/kernel32/misc/res.c Hey Arch, instead of copying and pasting definitions from , why don't you include it? svn path=/trunk/; revision=41560 --- reactos/dll/win32/kernel32/file/volume.c | 10 ++-- reactos/dll/win32/kernel32/k32.h | 1 + reactos/dll/win32/kernel32/misc/actctx.c | 4 +- reactos/dll/win32/kernel32/misc/lang.c | 6 +-- reactos/dll/win32/kernel32/misc/res.c | 60 +----------------------- 5 files changed, 13 insertions(+), 68 deletions(-) diff --git a/reactos/dll/win32/kernel32/file/volume.c b/reactos/dll/win32/kernel32/file/volume.c index 6107956412c..4648d7e1fa0 100644 --- a/reactos/dll/win32/kernel32/file/volume.c +++ b/reactos/dll/win32/kernel32/file/volume.c @@ -88,6 +88,7 @@ GetLogicalDriveStringsA(DWORD nBufferLength, { DWORD drive, count; DWORD dwDriveMap; + LPSTR p; dwDriveMap = GetLogicalDrives(); @@ -100,7 +101,7 @@ GetLogicalDriveStringsA(DWORD nBufferLength, if ((count * 4) + 1 > nBufferLength) return ((count * 4) + 1); - LPSTR p = lpBuffer; + p = lpBuffer; for (drive = 0; drive < MAX_DOS_DRIVES; drive++) if (dwDriveMap & (1< nBufferLength) return ((count * 4) + 1); - LPWSTR p = lpBuffer; + p = lpBuffer; for (drive = 0; drive < MAX_DOS_DRIVES; drive++) if (dwDriveMap & (1<NameLength; continue; } - else + else { NtClose(FileHandle); SetLastErrorByStatus(Status); @@ -1023,7 +1025,7 @@ GetVolumeNameForVolumeMountPointW( { MountPoint = MountPoints->MountPoints + Index; SymbolicLinkName = (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset; - + /* * Check for "\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\" * (with the last slash being optional) style symbolic links. diff --git a/reactos/dll/win32/kernel32/k32.h b/reactos/dll/win32/kernel32/k32.h index 602642120ac..a47f9666a7f 100755 --- a/reactos/dll/win32/kernel32/k32.h +++ b/reactos/dll/win32/kernel32/k32.h @@ -27,6 +27,7 @@ /* C Headers */ #include +#include #include #include diff --git a/reactos/dll/win32/kernel32/misc/actctx.c b/reactos/dll/win32/kernel32/misc/actctx.c index 6d592867ded..3e81c9c2f9e 100644 --- a/reactos/dll/win32/kernel32/misc/actctx.c +++ b/reactos/dll/win32/kernel32/misc/actctx.c @@ -174,7 +174,7 @@ CreateActCtxW( DPRINT("CreateActCtxW(%p %08lx)\n", pActCtx, pActCtx ? pActCtx->dwFlags : 0); - Status = RtlCreateActivationContext(&hActCtx, &pActCtx); + Status = RtlCreateActivationContext(&hActCtx, (PVOID*)&pActCtx); if (!NT_SUCCESS(Status)) { SetLastError(RtlNtStatusToDosError(Status)); @@ -318,6 +318,6 @@ ZombifyActCtx( SetLastError(RtlNtStatusToDosError(Status)); return FALSE; } - + return TRUE; } diff --git a/reactos/dll/win32/kernel32/misc/lang.c b/reactos/dll/win32/kernel32/misc/lang.c index a6e58e2e809..52fe97bbb67 100644 --- a/reactos/dll/win32/kernel32/misc/lang.c +++ b/reactos/dll/win32/kernel32/misc/lang.c @@ -1550,10 +1550,10 @@ GetGeoInfoA( case GEO_FRIENDLYNAME: { WCHAR szBuffer[MAX_PATH]; - int Ret; - - Ret = NLS_GetGeoFriendlyName(Location, szBuffer, cchData); char szBufferA[sizeof(szBuffer)/sizeof(WCHAR)]; + int Ret; + + Ret = NLS_GetGeoFriendlyName(Location, szBuffer, cchData); WideCharToMultiByte(CP_ACP, 0, szBuffer, -1, szBufferA, sizeof(szBufferA), 0, 0); strcpy(lpGeoData, szBufferA); diff --git a/reactos/dll/win32/kernel32/misc/res.c b/reactos/dll/win32/kernel32/misc/res.c index db00fac780e..1b77a977418 100644 --- a/reactos/dll/win32/kernel32/misc/res.c +++ b/reactos/dll/win32/kernel32/misc/res.c @@ -13,6 +13,7 @@ */ #include +#include #define NDEBUG #include @@ -21,55 +22,6 @@ SetLastError(ERROR_CALL_NOT_IMPLEMENTED); \ DPRINT1("%s() is UNIMPLEMENTED!\n", __FUNCTION__) -/* Strustures and functions from include/wine/list.h */ -struct list -{ - struct list *next; - struct list *prev; -}; - -static inline void list_init( struct list *list ) -{ - list->next = list->prev = list; -} - -/* add an element before the specified one */ -static inline void list_add_before( struct list *elem, struct list *to_add ) -{ - to_add->next = elem; - to_add->prev = elem->prev; - elem->prev->next = to_add; - elem->prev = to_add; -} - -/* add element at the tail of the list */ -static inline void list_add_tail( struct list *list, struct list *elem ) -{ - list_add_before( list, elem ); -} - -/* remove an element from its list */ -static inline void list_remove( struct list *elem ) -{ - elem->next->prev = elem->prev; - elem->prev->next = elem->next; -} - -/* get the next element */ -static inline struct list *list_next( const struct list *list, const struct list *elem ) -{ - struct list *ret = elem->next; - if (elem->next == list) ret = NULL; - return ret; -} - -/* get the first element */ -static inline struct list *list_head( const struct list *list ) -{ - return list_next( list, list ); -} - - /* * Data structure for updating resources. * Type/Name/Language is a keyset for accessing resource data. @@ -264,16 +216,6 @@ static struct resource_data *allocate_resource_data( WORD Language, DWORD codepa return resdata; } -/* get pointer to object containing list element */ -#define LIST_ENTRY(elem, type, field) \ - ((type *)((char *)(elem) - (unsigned int)(&((type *)0)->field))) - -/* iterate through the list using a list entry */ -#define LIST_FOR_EACH_ENTRY(elem, list, type, field) \ - for ((elem) = LIST_ENTRY((list)->next, type, field); \ - &(elem)->field != (list); \ - (elem) = LIST_ENTRY((elem)->field.next, type, field)) - static void add_resource_dir_entry( struct list *dir, struct resource_dir_entry *resdir ) { struct resource_dir_entry *ent; From 7faf270a8a06e98e43281fa5e9449390a03f36c2 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 22 Jun 2009 20:19:06 +0000 Subject: [PATCH 054/577] modified lib/rtl/exception.c Silence unavoidable warning modified lib/rtl/generictable.c Avoid silenceable warning svn path=/trunk/; revision=41561 --- reactos/lib/rtl/exception.c | 9 +++++++++ reactos/lib/rtl/generictable.c | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/reactos/lib/rtl/exception.c b/reactos/lib/rtl/exception.c index b0581ae3ed6..15c1fe8d306 100644 --- a/reactos/lib/rtl/exception.c +++ b/reactos/lib/rtl/exception.c @@ -66,6 +66,11 @@ RtlRaiseException(PEXCEPTION_RECORD ExceptionRecord) RtlRaiseStatus(Status); } +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4717) +#endif + /* * @implemented */ @@ -113,6 +118,10 @@ RtlRaiseStatus(NTSTATUS Status) RtlRaiseStatus(Status); } +#ifdef _MSC_VER +#pragma warning(pop) +#endif + /* * @implemented */ diff --git a/reactos/lib/rtl/generictable.c b/reactos/lib/rtl/generictable.c index 0d8f7807147..272182d0ba3 100644 --- a/reactos/lib/rtl/generictable.c +++ b/reactos/lib/rtl/generictable.c @@ -619,7 +619,7 @@ RtlEnumerateGenericTableWithoutSplayingAvl(IN PRTL_AVL_TABLE Table, IN OUT PVOID *RestartKey) { /* FIXME! */ - return RtlEnumerateGenericTableWithoutSplayingAvl(Table, RestartKey); + return NULL; } /* From c7681120836e3413bdaee54f99e96bda7ee0aec7 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 22 Jun 2009 20:22:06 +0000 Subject: [PATCH 055/577] modified lib/sdk/crt/include/float.h What the hell has to do with S_IFIFO, Arch? svn path=/trunk/; revision=41562 --- reactos/lib/sdk/crt/include/float.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/lib/sdk/crt/include/float.h b/reactos/lib/sdk/crt/include/float.h index 087b59092b6..48281188df5 100644 --- a/reactos/lib/sdk/crt/include/float.h +++ b/reactos/lib/sdk/crt/include/float.h @@ -101,9 +101,6 @@ #ifndef DBL_MAX_10_EXP #define DBL_MAX_10_EXP 308 #endif -#ifndef S_IFIFO -#define S_IFIFO -1 -#endif #ifndef UINT64_MAX #define UINT64_MAX 0xffffffffffffffff #endif @@ -117,10 +114,10 @@ extern "C" { #ifndef _CRTIMP #ifdef _DLL #define _CRTIMP __declspec(dllimport) -#else +#else #define _CRTIMP #endif /* _DLL */ -#endif +#endif /* Set the FPU control word as cw = (cw & ~unMask) | (unNew & unMask), * i.e. change the bits in unMask to have the values they have in unNew, From c14238f2a9bc20aea2b782f50182ca1404e1780b Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 22 Jun 2009 20:25:25 +0000 Subject: [PATCH 056/577] Correct placement of calling convention attribute svn path=/trunk/; revision=41563 --- reactos/include/ddk/ntddser.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/include/ddk/ntddser.h b/reactos/include/ddk/ntddser.h index 4e0e14ae5ed..39493ed33ea 100644 --- a/reactos/include/ddk/ntddser.h +++ b/reactos/include/ddk/ntddser.h @@ -365,12 +365,12 @@ typedef struct _SERENUM_PORT_DESC { USHORT Reserved[1]; } SERENUM_PORT_DESC, *PSERENUM_PORT_DESC; -typedef UCHAR NTAPI -(*PSERENUM_READPORT)( +typedef UCHAR +(NTAPI*PSERENUM_READPORT)( PVOID SerPortAddress); -typedef VOID NTAPI -(*PSERENUM_WRITEPORT)( +typedef VOID +(NTAPI*PSERENUM_WRITEPORT)( PVOID SerPortAddress, UCHAR Value); From 7c326b484e32decc2da531e90b12175d8e863e3b Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 22 Jun 2009 20:27:16 +0000 Subject: [PATCH 057/577] Don't want to fix all uses of PSEH2 macros, therefore have some curly braces, everyone svn path=/trunk/; revision=41564 --- reactos/include/reactos/libs/pseh/pseh2.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/include/reactos/libs/pseh/pseh2.h b/reactos/include/reactos/libs/pseh/pseh2.h index 26f88bf483c..0523231c2f7 100644 --- a/reactos/include/reactos/libs/pseh/pseh2.h +++ b/reactos/include/reactos/libs/pseh/pseh2.h @@ -401,10 +401,10 @@ __SEH_END_SCOPE_CHAIN; #include -#define _SEH2_TRY __try -#define _SEH2_FINALLY __finally -#define _SEH2_EXCEPT(...) __except(__VA_ARGS__) -#define _SEH2_END +#define _SEH2_TRY __try { +#define _SEH2_FINALLY } __finally { +#define _SEH2_EXCEPT(...) } __except(__VA_ARGS__) { +#define _SEH2_END } #define _SEH2_GetExceptionInformation() (GetExceptionInformation()) #define _SEH2_GetExceptionCode() (GetExceptionCode()) From 6943f54891fcc809be2b2d62879118177b5bc1a8 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 22 Jun 2009 20:29:48 +0000 Subject: [PATCH 058/577] Change to use the magic attribute salad for inline functions in headers svn path=/trunk/; revision=41565 --- reactos/include/reactos/wine/list.h | 40 +++++++++++++++++++---------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/reactos/include/reactos/wine/list.h b/reactos/include/reactos/wine/list.h index 68cd4cfd083..05b2df3fd4a 100644 --- a/reactos/include/reactos/wine/list.h +++ b/reactos/include/reactos/wine/list.h @@ -21,6 +21,18 @@ #ifndef __WINE_SERVER_LIST_H #define __WINE_SERVER_LIST_H +#ifdef __cplusplus +#define __WINE_SERVER_LIST_INLINE inline +#else +#if defined(__GNUC__) +#define __WINE_SERVER_LIST_INLINE extern __inline__ __attribute__((__always_inline__,__gnu_inline__)) +#elif defined(_MSC_VER) +#define __WINE_SERVER_LIST_INLINE __inline +#else +#define __WINE_SERVER_LIST_INLINE static +#endif +#endif + struct list { struct list *next; @@ -63,7 +75,7 @@ struct list */ /* add an element after the specified one */ -static inline void list_add_after( struct list *elem, struct list *to_add ) +__WINE_SERVER_LIST_INLINE void list_add_after( struct list *elem, struct list *to_add ) { to_add->next = elem->next; to_add->prev = elem; @@ -72,7 +84,7 @@ static inline void list_add_after( struct list *elem, struct list *to_add ) } /* add an element before the specified one */ -static inline void list_add_before( struct list *elem, struct list *to_add ) +__WINE_SERVER_LIST_INLINE void list_add_before( struct list *elem, struct list *to_add ) { to_add->next = elem; to_add->prev = elem->prev; @@ -81,26 +93,26 @@ static inline void list_add_before( struct list *elem, struct list *to_add ) } /* add element at the head of the list */ -static inline void list_add_head( struct list *list, struct list *elem ) +__WINE_SERVER_LIST_INLINE void list_add_head( struct list *list, struct list *elem ) { list_add_after( list, elem ); } /* add element at the tail of the list */ -static inline void list_add_tail( struct list *list, struct list *elem ) +__WINE_SERVER_LIST_INLINE void list_add_tail( struct list *list, struct list *elem ) { list_add_before( list, elem ); } /* remove an element from its list */ -static inline void list_remove( struct list *elem ) +__WINE_SERVER_LIST_INLINE void list_remove( struct list *elem ) { elem->next->prev = elem->prev; elem->prev->next = elem->next; } /* get the next element */ -static inline struct list *list_next( const struct list *list, const struct list *elem ) +__WINE_SERVER_LIST_INLINE struct list *list_next( const struct list *list, const struct list *elem ) { struct list *ret = elem->next; if (elem->next == list) ret = NULL; @@ -108,7 +120,7 @@ static inline struct list *list_next( const struct list *list, const struct list } /* get the previous element */ -static inline struct list *list_prev( const struct list *list, const struct list *elem ) +__WINE_SERVER_LIST_INLINE struct list *list_prev( const struct list *list, const struct list *elem ) { struct list *ret = elem->prev; if (elem->prev == list) ret = NULL; @@ -116,31 +128,31 @@ static inline struct list *list_prev( const struct list *list, const struct list } /* get the first element */ -static inline struct list *list_head( const struct list *list ) +__WINE_SERVER_LIST_INLINE struct list *list_head( const struct list *list ) { return list_next( list, list ); } /* get the last element */ -static inline struct list *list_tail( const struct list *list ) +__WINE_SERVER_LIST_INLINE struct list *list_tail( const struct list *list ) { return list_prev( list, list ); } /* check if a list is empty */ -static inline int list_empty( const struct list *list ) +__WINE_SERVER_LIST_INLINE int list_empty( const struct list *list ) { return list->next == list; } /* initialize a list */ -static inline void list_init( struct list *list ) +__WINE_SERVER_LIST_INLINE void list_init( struct list *list ) { list->next = list->prev = list; } /* count the elements of a list */ -static inline unsigned int list_count( const struct list *list ) +__WINE_SERVER_LIST_INLINE unsigned int list_count( const struct list *list ) { unsigned count = 0; const struct list *ptr; @@ -149,7 +161,7 @@ static inline unsigned int list_count( const struct list *list ) } /* move all elements from src to the tail of dst */ -static inline void list_move_tail( struct list *dst, struct list *src ) +__WINE_SERVER_LIST_INLINE void list_move_tail( struct list *dst, struct list *src ) { if (list_empty(src)) return; @@ -161,7 +173,7 @@ static inline void list_move_tail( struct list *dst, struct list *src ) } /* move all elements from src to the head of dst */ -static inline void list_move_head( struct list *dst, struct list *src ) +__WINE_SERVER_LIST_INLINE void list_move_head( struct list *dst, struct list *src ) { if (list_empty(src)) return; From 535d640ce06f6654842e8982f45ea20b2bb1a995 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 22 Jun 2009 21:07:52 +0000 Subject: [PATCH 059/577] - define YieldProcessor msvc compatible - rtl now builds svn path=/trunk/; revision=41566 --- reactos/include/psdk/winnt.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index 3699fbfd0d0..c95c1312395 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -4946,10 +4946,24 @@ MemoryBarrier(VOID) #error Unknown architecture #endif +VOID +_mm_pause ( + VOID + ); + + #if defined(_M_IX86) +#ifdef _MSC_VER +#pragma intrinsic(_mm_pause) +#else #define YieldProcessor() __asm__ __volatile__("pause"); +#endif #elif defined (_M_AMD64) +#ifdef _MSC_VER +#define YieldProcessor _mm_pause +#else #define YieldProcessor() __asm__ __volatile__("pause"); +#endif #elif defined(_M_PPC) #define YieldProcessor() __asm__ __volatile__("nop"); #elif defined(_M_MIPS) From 1196d4547412b06cb1352f063a3a97b6bb6282e3 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 22:48:39 +0000 Subject: [PATCH 060/577] don't build arm stuff on non arm builds fixes 2nd stage svn path=/trunk/; revision=41567 --- reactos/ntoskrnl/mm/mminit.c | 8 ++++---- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 960e056637e..7f6219a27b9 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -384,11 +384,11 @@ MmInit1(VOID) /* Unmap low memory */ MmDeletePageTable(NULL, 0); - // - // Initialize ARM³ - // +#ifdef _ARM_ + /* Initialize ARM³ */ MmArmInitSystem(0, KeLoaderBlock); - +#endif + /* Initialize nonpaged pool */ MiInitializeNonPagedPool(); diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index e35eedac8aa..855c2d1f92e 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -352,6 +352,11 @@ stubs.c + + init.c + pool.c + syspte.c + @@ -359,11 +364,6 @@ page.c - - init.c - pool.c - syspte.c - anonmem.c balance.c cont.c From c8ee793546d0a7e117429c20316f39b600ed1d2e Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 22:54:03 +0000 Subject: [PATCH 061/577] partial advapi32 sid sync to wine 1.1.24 svn path=/trunk/; revision=41568 --- reactos/dll/win32/advapi32/sec/sid.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/reactos/dll/win32/advapi32/sec/sid.c b/reactos/dll/win32/advapi32/sec/sid.c index 7efe2a3f252..6dac3dac683 100644 --- a/reactos/dll/win32/advapi32/sec/sid.c +++ b/reactos/dll/win32/advapi32/sec/sid.c @@ -506,7 +506,7 @@ static BOOL DumpAce(LPVOID pace, WCHAR **pwptr, ULONG *plen) return FALSE; } - piace = (ACCESS_ALLOWED_ACE *)pace; + piace = pace; DumpString(&openbr, 1, pwptr, plen); switch (piace->Header.AceType) { @@ -789,7 +789,6 @@ static DWORD ComputeStringSidSize(LPCWSTR StringSid) return GetSidLengthRequired(0); } - /****************************************************************************** * ParseStringSidToSid */ @@ -900,7 +899,6 @@ lend: return bret; } - /****************************************************************************** * ParseAclStringFlags */ @@ -930,7 +928,6 @@ static DWORD ParseAclStringFlags(LPCWSTR* StringAcl) return flags; } - /****************************************************************************** * ParseAceStringType */ @@ -1182,7 +1179,7 @@ lerr: */ static BOOL ParseStringSecurityDescriptorToSecurityDescriptor( LPCWSTR StringSecurityDescriptor, - SECURITY_DESCRIPTOR* SecurityDescriptor, + SECURITY_DESCRIPTOR_RELATIVE* SecurityDescriptor, LPDWORD cBytes) { BOOL bret = FALSE; @@ -1195,7 +1192,7 @@ static BOOL ParseStringSecurityDescriptorToSecurityDescriptor( *cBytes = sizeof(SECURITY_DESCRIPTOR); if (SecurityDescriptor) - lpNext = ((LPBYTE) SecurityDescriptor) + sizeof(SECURITY_DESCRIPTOR); + lpNext = (LPBYTE)(SecurityDescriptor + 1); while (*StringSecurityDescriptor) { @@ -1233,7 +1230,7 @@ static BOOL ParseStringSecurityDescriptorToSecurityDescriptor( if (SecurityDescriptor) { - SecurityDescriptor->Owner = (PSID)(lpNext - (LPBYTE)SecurityDescriptor); + SecurityDescriptor->Owner = lpNext - (LPBYTE)SecurityDescriptor; lpNext += bytes; /* Advance to next token */ } @@ -1251,7 +1248,7 @@ static BOOL ParseStringSecurityDescriptorToSecurityDescriptor( if (SecurityDescriptor) { - SecurityDescriptor->Group = (PSID)(lpNext - (LPBYTE)SecurityDescriptor); + SecurityDescriptor->Group = lpNext - (LPBYTE)SecurityDescriptor; lpNext += bytes; /* Advance to next token */ } @@ -1271,7 +1268,7 @@ static BOOL ParseStringSecurityDescriptorToSecurityDescriptor( if (SecurityDescriptor) { SecurityDescriptor->Control |= SE_DACL_PRESENT | flags; - SecurityDescriptor->Dacl = (PACL)(lpNext - (LPBYTE)SecurityDescriptor); + SecurityDescriptor->Dacl = lpNext - (LPBYTE)SecurityDescriptor; lpNext += bytes; /* Advance to next token */ } @@ -1291,7 +1288,7 @@ static BOOL ParseStringSecurityDescriptorToSecurityDescriptor( if (SecurityDescriptor) { SecurityDescriptor->Control |= SE_SACL_PRESENT | flags; - SecurityDescriptor->Sacl = (PACL)(lpNext - (LPBYTE)SecurityDescriptor); + SecurityDescriptor->Sacl = lpNext - (LPBYTE)SecurityDescriptor; lpNext += bytes; /* Advance to next token */ } @@ -1360,7 +1357,7 @@ BOOL WINAPI ConvertStringSecurityDescriptorToSecurityDescriptorW( psd->Control |= SE_SELF_RELATIVE; if (!ParseStringSecurityDescriptorToSecurityDescriptor(StringSecurityDescriptor, - psd, &cBytes)) + (SECURITY_DESCRIPTOR_RELATIVE *)psd, &cBytes)) { LocalFree(psd); goto lend; From 2cbbe81d2581afbcd52db432ede71de25d32d0ea Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Mon, 22 Jun 2009 22:59:30 +0000 Subject: [PATCH 062/577] fix comment IsUserAdmin -> IsUserAnAdmin svn path=/trunk/; revision=41569 --- reactos/dll/win32/shell32/shellord.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/shell32/shellord.c b/reactos/dll/win32/shell32/shellord.c index 7220067e2dc..002a6bb8e8f 100644 --- a/reactos/dll/win32/shell32/shellord.c +++ b/reactos/dll/win32/shell32/shellord.c @@ -1265,11 +1265,19 @@ BOOL WINAPI FileIconInit(BOOL bFullInit) { FIXME("(%s)\n", bFullInit ? "true" : "false"); return 0; } -/************************************************************************* - * IsUserAdmin [SHELL32.680] NT 4.0 - * - */ +/************************************************************************* + * IsUserAnAdmin [SHELL32.680] NT 4.0 + * + * Checks whether the current user is a member of the Administrators group. + * + * PARAMS + * None + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ BOOL WINAPI IsUserAnAdmin(VOID) { SID_IDENTIFIER_AUTHORITY Authority = {SECURITY_NT_AUTHORITY}; @@ -1331,7 +1339,6 @@ BOOL WINAPI IsUserAnAdmin(VOID) FreeSid(lpSid); HeapFree(GetProcessHeap(), 0, lpGroups); - return bResult; } From a0a3c1519e5efe42d6e29d439bc7954c94f2541b Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 04:59:32 +0000 Subject: [PATCH 063/577] =?UTF-8?q?-=20Revert=2041567:=20=20=20-=20ARM?= =?UTF-8?q?=C2=B3=20(Alternate=20ReactOS=20Memory=20Management=20Module)?= =?UTF-8?q?=20"stuff"=20is=20not=20ACORN=20Risc=20Machines=20(ARM)=20Port?= =?UTF-8?q?=20"stuff".=20=20=20-=20We=20are=20lucky=20this=20user=20made?= =?UTF-8?q?=20this=20change=20before=20the=20rest=20of=20the=20code=20was?= =?UTF-8?q?=20checked=20in=20--=20hyperspace,=20MDLs,=20nonpaged=20pool,?= =?UTF-8?q?=20kernel=20stacks,=20I/O=20mappings,=20noncached=20memory=20an?= =?UTF-8?q?d=20contigous=20memory=20will=20soon=20all=20be=20built=20on=20?= =?UTF-8?q?ARM=C2=B3=20--=20good=20thing=20this=20wasn't=20the=20case=20ye?= =?UTF-8?q?t!=20=20=20-=20Recommend=20this=20user=20gets=20banned=20for=20?= =?UTF-8?q?reverting=20code=20without=20approval=20within=20the=2024hr=20g?= =?UTF-8?q?race=20period=20in=20ReactOS=20guidelines.=20=20=20-=20If=20you?= =?UTF-8?q?=20have=20a=20bug=20to=20report,=20use=20Bugzilla,=20not=20your?= =?UTF-8?q?=20head=20as=20a=20sledgehammer.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=41570 --- reactos/ntoskrnl/mm/mminit.c | 2 -- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 10 +++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 7f6219a27b9..10c811e286a 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -384,10 +384,8 @@ MmInit1(VOID) /* Unmap low memory */ MmDeletePageTable(NULL, 0); -#ifdef _ARM_ /* Initialize ARM³ */ MmArmInitSystem(0, KeLoaderBlock); -#endif /* Initialize nonpaged pool */ MiInitializeNonPagedPool(); diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 855c2d1f92e..e35eedac8aa 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -352,11 +352,6 @@ stubs.c - - init.c - pool.c - syspte.c - @@ -364,6 +359,11 @@ page.c + + init.c + pool.c + syspte.c + anonmem.c balance.c cont.c From bb161e9df2a05e1abf14ef7ac85161be74ad82c8 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 05:00:48 +0000 Subject: [PATCH 064/577] - Do not reformat other people's code simply to reformat it. svn path=/trunk/; revision=41571 --- reactos/ntoskrnl/mm/mminit.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 10c811e286a..5da1bafc77b 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -384,7 +384,9 @@ MmInit1(VOID) /* Unmap low memory */ MmDeletePageTable(NULL, 0); - /* Initialize ARM³ */ + // + // Initialize ARM³ + // MmArmInitSystem(0, KeLoaderBlock); /* Initialize nonpaged pool */ From fbca42cd9fd48cea19db3e2e7dc72c53dc1e206d Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 06:32:11 +0000 Subject: [PATCH 065/577] - Do not zero out MC_SYSTEM pages if they are "early pages" either. This could cause issues on certain systems where mapping the PFN database required "early pages", and they were zeroed before hyperspace was ready. - Add a new flag to MmGetContigousPages to specify if these pages should be zeroed or not. Allows the nonpaged pool pages not to get automatically zeroed when allocated (the NP pool allocator can do this by itself later). This allows initial nonpaged pool to be allocated before hyperspace is ready. svn path=/trunk/; revision=41572 --- reactos/ntoskrnl/include/internal/mm.h | 3 ++- reactos/ntoskrnl/mm/cont.c | 3 ++- reactos/ntoskrnl/mm/freelist.c | 7 ++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 75524ebb8a9..ac090d5c483 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1125,7 +1125,8 @@ MmGetContinuousPages( ULONG NumberOfBytes, PHYSICAL_ADDRESS LowestAcceptableAddress, PHYSICAL_ADDRESS HighestAcceptableAddress, - PHYSICAL_ADDRESS BoundaryAddressMultiple + PHYSICAL_ADDRESS BoundaryAddressMultiple, + BOOLEAN ZeroPages ); NTSTATUS diff --git a/reactos/ntoskrnl/mm/cont.c b/reactos/ntoskrnl/mm/cont.c index faeb8658aa0..577e1ca8ea9 100644 --- a/reactos/ntoskrnl/mm/cont.c +++ b/reactos/ntoskrnl/mm/cont.c @@ -103,7 +103,8 @@ MmAllocateContiguousMemorySpecifyCache(IN SIZE_T NumberOfBytes, PBase = MmGetContinuousPages(NumberOfBytes, LowestAcceptableAddress, HighestAcceptableAddress, - BoundaryAddressMultiple); + BoundaryAddressMultiple, + TRUE); if (PBase == 0) { MmLockAddressSpace(MmGetKernelAddressSpace()); diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 6ee34130982..600a3079e41 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -138,7 +138,8 @@ NTAPI MmGetContinuousPages(ULONG NumberOfBytes, PHYSICAL_ADDRESS LowestAcceptableAddress, PHYSICAL_ADDRESS HighestAcceptableAddress, - PHYSICAL_ADDRESS BoundaryAddressMultiple) + PHYSICAL_ADDRESS BoundaryAddressMultiple, + BOOLEAN ZeroPages) { ULONG NrPages; ULONG i, j; @@ -222,7 +223,7 @@ MmGetContinuousPages(ULONG NumberOfBytes, { if (MiGetPfnEntry(i)->Flags.Zero == 0) { - MiZeroPage(i); + if (ZeroPages) MiZeroPage(i); } else { @@ -727,7 +728,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) /* Allocate an early page -- we'll account for it later */ KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); PfnOffset = MmAllocEarlyPage(); - MiZeroPage(PfnOffset); + if (Consumer != MC_SYSTEM) MiZeroPage(PfnOffset); return PfnOffset; } From 52fc282ff31536bb65a34d35379c4ee700f02257 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 06:39:10 +0000 Subject: [PATCH 066/577] =?UTF-8?q?-=20For=20one=20thing,=20fix=20build=20?= =?UTF-8?q?in=20ARM3/init.c=20(sorry!)=20-=20Secondly,=20initialize=20hype?= =?UTF-8?q?rspace=20in=20ARM=C2=B3=20now,=20at=20the=20correct=20place:=20?= =?UTF-8?q?=20=20-=20Also,=20create=20the=20hyperspace=20PDE=20here,=20and?= =?UTF-8?q?=20not=20in=20FreeLDR,=20which=20was=20incorrect=20in=20the=20f?= =?UTF-8?q?irst=20place.=20=20=20=20=20-=20This=20might=20help=20booting?= =?UTF-8?q?=20Windows/WinLDR.=20-=20Install-tested=20w/=20networking,=20wi?= =?UTF-8?q?th=20no=20issues=20found,=20on:=20=20=20-=20Virtual=20Box=202.4?= =?UTF-8?q?=20=20=20-=20VMWare=206.5=20=20=20-=20QEMU=200.9.0=20-=20PEBKAC?= =?UTF-8?q?=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=41573 --- reactos/boot/freeldr/freeldr/arch/arm/boot.s | 5 --- .../boot/freeldr/freeldr/arch/arm/loader.c | 17 ++-------- .../boot/freeldr/freeldr/arch/i386/loader.c | 6 ---- reactos/boot/freeldr/freeldr/arch/i386/mb.S | 4 --- .../boot/freeldr/freeldr/include/reactos.h | 2 -- reactos/ntoskrnl/mm/ARM3/init.c | 31 ++++++++++++++++++- reactos/ntoskrnl/mm/ARM3/miarm.h | 1 + reactos/ntoskrnl/mm/hypermap.c | 19 +----------- reactos/ntoskrnl/mm/mminit.c | 3 -- 9 files changed, 34 insertions(+), 54 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/arm/boot.s b/reactos/boot/freeldr/freeldr/arch/arm/boot.s index a4fe1d375ba..6a38ad685ef 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/boot.s +++ b/reactos/boot/freeldr/freeldr/arch/arm/boot.s @@ -149,10 +149,5 @@ MasterTranslationTable: .space 0x0400 // 0xYYYYYYYY->0xC10FFFFF .space 0x0C00 // PADDING FOR 4KB GRANULARITY -.global HyperSpaceTranslationTable -HyperSpaceTranslationTable: - .space 0x0400 // 0xYYYYYYYY->0xC10FFFFF - .space 0x0C00 // PADDING FOR 4KB GRANULARITY - .global TranslationTableEnd TranslationTableEnd: diff --git a/reactos/boot/freeldr/freeldr/arch/arm/loader.c b/reactos/boot/freeldr/freeldr/arch/arm/loader.c index 06bf7ca281b..d1548d9eeaa 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/loader.c @@ -42,7 +42,7 @@ PCHAR ArmSharedHeap; extern ADDRESS_RANGE ArmBoardMemoryMap[16]; extern ULONG ArmBoardMemoryMapRangeCount; extern ARM_TRANSLATION_TABLE ArmTranslationTable; -extern ARM_COARSE_PAGE_TABLE BootTranslationTable, KernelTranslationTable, FlatMapTranslationTable, MasterTranslationTable, HyperSpaceTranslationTable; +extern ARM_COARSE_PAGE_TABLE BootTranslationTable, KernelTranslationTable, FlatMapTranslationTable, MasterTranslationTable; extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint; extern ULONG_PTR KernelBase; extern ULONG_PTR AnsiData, OemData, UnicodeData, RegistryData, KernelData, HalData, DriverData[16]; @@ -683,7 +683,7 @@ ArmSetupPageDirectory(VOID) ARM_PTE Pte; ULONG i, j; PARM_TRANSLATION_TABLE ArmTable; - PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable, HyperSpaceTable; + PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable; // // Get the PDEs that we will use @@ -693,7 +693,6 @@ ArmSetupPageDirectory(VOID) KernelTable = &KernelTranslationTable; FlatMapTable = &FlatMapTranslationTable; MasterTable = &MasterTranslationTable; - HyperSpaceTable = &HyperSpaceTranslationTable; // // Set the master L1 PDE as the TTB @@ -810,12 +809,6 @@ ArmSetupPageDirectory(VOID) // Pte.L1.Coarse.BaseAddress = (ULONG)MasterTable >> CPT_SHIFT; ArmTable->Pte[PDE_BASE >> PDE_SHIFT] = Pte; - - // - // Now create the template for the hyperspace table which maps 1MB - // - Pte.L1.Coarse.BaseAddress = (ULONG)HyperSpaceTable >> CPT_SHIFT; - ArmTable->Pte[HYPER_SPACE >> PDE_SHIFT] = Pte; // // Now create the template for the coarse page tables which map the first 8MB @@ -983,12 +976,6 @@ ArmSetupPageDirectory(VOID) Pte.L2.Small.BaseAddress = (ULONG)&MasterTranslationTable >> PTE_SHIFT; FlatMapTable->Pte[16] = Pte; - // - // And finally for the 0xC1100000 region (1MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&HyperSpaceTranslationTable >> PTE_SHIFT; - FlatMapTable->Pte[17] = Pte; - // // Now we handle the master translation area for our PDEs. We'll just make // the 4 page tables point to the ARM TTB. diff --git a/reactos/boot/freeldr/freeldr/arch/i386/loader.c b/reactos/boot/freeldr/freeldr/arch/i386/loader.c index eb60ebf6f4c..4e29731c74f 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/loader.c @@ -27,7 +27,6 @@ extern PAGE_DIRECTORY_X86 startup_pagedirectory; extern PAGE_DIRECTORY_X86 lowmem_pagetable; extern PAGE_DIRECTORY_X86 kernel_pagetable; -extern PAGE_DIRECTORY_X86 hyperspace_pagetable; extern PAGE_DIRECTORY_X86 apic_pagetable; extern PAGE_DIRECTORY_X86 kpcr_pagetable; extern PAGE_DIRECTORY_X86 kuser_pagetable; @@ -150,11 +149,6 @@ FrLdrSetupPageDirectory(VOID) PageDir->Pde[StartupPageTableIndex].Write = 1; PageDir->Pde[StartupPageTableIndex].PageFrameNumber = PaPtrToPfn(startup_pagedirectory); - /* Set up the Hyperspace PDE */ - PageDir->Pde[HyperspacePageTableIndex].Valid = 1; - PageDir->Pde[HyperspacePageTableIndex].Write = 1; - PageDir->Pde[HyperspacePageTableIndex].PageFrameNumber = PaPtrToPfn(hyperspace_pagetable); - /* Set up the HAL PDE */ PageDir->Pde[HalPageTableIndex].Valid = 1; PageDir->Pde[HalPageTableIndex].Write = 1; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/mb.S b/reactos/boot/freeldr/freeldr/arch/i386/mb.S index d87e45758b8..3d7845b009f 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/mb.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/mb.S @@ -34,7 +34,6 @@ .globl _startup_pagedirectory .globl _lowmem_pagetable .globl _kernel_pagetable - .globl _hyperspace_pagetable .globl _apic_pagetable .globl _kpcr_pagetable .globl _kuser_pagetable @@ -64,9 +63,6 @@ _lowmem_pagetable: _kernel_pagetable: .fill 2*4096, 1, 0 -_hyperspace_pagetable: - .fill 4096, 1, 0 - _apic_pagetable: .fill 4096, 1, 0 diff --git a/reactos/boot/freeldr/freeldr/include/reactos.h b/reactos/boot/freeldr/freeldr/include/reactos.h index d38a3cb1631..0caf409bcc4 100644 --- a/reactos/boot/freeldr/freeldr/include/reactos.h +++ b/reactos/boot/freeldr/freeldr/include/reactos.h @@ -41,13 +41,11 @@ ((p) >> PFN_SHIFT) #define STARTUP_BASE 0xC0000000 -#define HYPERSPACE_BASE 0xC0400000 #define HAL_BASE 0xFFC00000 #define APIC_BASE 0xFFFE0000 #define LowMemPageTableIndex 0 #define StartupPageTableIndex (STARTUP_BASE >> 22) -#define HyperspacePageTableIndex (HYPERSPACE_BASE >> 22) #define HalPageTableIndex (HAL_BASE >> 22) typedef struct _PAGE_DIRECTORY_X86 diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index 8ab3b4f4e07..009941f8cf3 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -297,7 +297,8 @@ MmArmInitSystem(IN ULONG Phase, PageFrameIndex = MmGetContinuousPages(MmSizeOfNonPagedPoolInBytes, Low, High, - BoundaryAddressMultiple); + BoundaryAddressMultiple, + FALSE); ASSERT(PageFrameIndex != 0); DPRINT1("NP VA begins at: %p and ends at: %p\n", MmNonPagedPoolStart, @@ -448,6 +449,34 @@ MmArmInitSystem(IN ULONG Phase, // Create the system PTE space // MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace); + + // + // Get the PDE For hyperspace + // + StartPde = MiAddressToPde(HYPER_SPACE); + + // + // Allocate a page for it and create it + // + PageFrameIndex = MmAllocPage(MC_SYSTEM, 0); + TempPde.u.Hard.PageFrameNumber = PageFrameIndex; + TempPde.u.Hard.Global = FALSE; // Hyperspace is local! + ASSERT(StartPde->u.Hard.Valid == 0); + ASSERT(TempPde.u.Hard.Valid == 1); + *StartPde = TempPde; + + // + // Zero out the page table now + // + PointerPte = MiAddressToPte(HYPER_SPACE); + RtlZeroMemory(PointerPte, PAGE_SIZE); + + // + // Setup the mapping PTEs + // + MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START); + MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END); + MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES; } // diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 4b2705a7471..0d220a0446a 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -26,6 +26,7 @@ extern ULONG MmSizeOfNonPagedPoolInBytes; extern ULONG MmMaximumNonPagedPoolInBytes; extern PVOID MmNonPagedPoolStart; extern PVOID MmNonPagedPoolExpansionStart; +extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte; VOID NTAPI diff --git a/reactos/ntoskrnl/mm/hypermap.c b/reactos/ntoskrnl/mm/hypermap.c index 4d818a74c45..280c5792440 100644 --- a/reactos/ntoskrnl/mm/hypermap.c +++ b/reactos/ntoskrnl/mm/hypermap.c @@ -14,30 +14,13 @@ /* GLOBALS ********************************************************************/ -PMMPTE MmFirstReservedMappingPte; -PMMPTE MmLastReservedMappingPte; +PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte; MMPTE HyperTemplatePte; PEPROCESS HyperProcess; KIRQL HyperIrql; /* PRIVATE FUNCTIONS **********************************************************/ -VOID -NTAPI -MiInitHyperSpace(VOID) -{ - PMMPTE PointerPte; - - /* Get the hyperspace PTE and zero out the page table */ - PointerPte = MiAddressToPte(HYPER_SPACE); - RtlZeroMemory(PointerPte, PAGE_SIZE); - - /* Setup mapping PTEs */ - MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START); - MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END); - MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES; -} - PVOID NTAPI MiMapPageInHyperSpace(IN PEPROCESS Process, diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 5da1bafc77b..54271f65754 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -375,9 +375,6 @@ MmInit1(VOID) /* Intialize system memory areas */ MiInitSystemMemoryAreas(); - /* Initialize hyperspace */ - MiInitHyperSpace(); - /* Initialize the page list */ MmInitializePageList(); From 12ed6254a7f8a150b5a05f18a2a551c82b81b3cc Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 07:32:43 +0000 Subject: [PATCH 067/577] - Move hypermap.c into ARM3 since it will be changed to use System PTEs for zero PTEs to solve the current race conditions that had to be fixed/hacked around in the current implementation. - DO NOT MAP HYPERSPACE PTEs as GLOBAL! They are now mapped as local, which might fix some really strange bugs that could've occured in the past. - Use MiPteToAddress instead of manually doing the bitmagic when mapping a page into hyperspace. svn path=/trunk/; revision=41574 --- reactos/ntoskrnl/mm/{ => ARM3}/hypermap.c | 76 ++++++++++++++++------- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 2 +- 2 files changed, 56 insertions(+), 22 deletions(-) rename reactos/ntoskrnl/mm/{ => ARM3}/hypermap.c (70%) diff --git a/reactos/ntoskrnl/mm/hypermap.c b/reactos/ntoskrnl/mm/ARM3/hypermap.c similarity index 70% rename from reactos/ntoskrnl/mm/hypermap.c rename to reactos/ntoskrnl/mm/ARM3/hypermap.c index 280c5792440..60d73fcf640 100644 --- a/reactos/ntoskrnl/mm/hypermap.c +++ b/reactos/ntoskrnl/mm/ARM3/hypermap.c @@ -1,7 +1,7 @@ /* * PROJECT: ReactOS Kernel * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: ntoskrnl/mm/hypermap.c + * FILE: ntoskrnl/mm/ARM3/hypermap.c * PURPOSE: Hyperspace Mapping Functionality * PROGRAMMERS: ReactOS Portable Systems Group */ @@ -15,6 +15,7 @@ /* GLOBALS ********************************************************************/ PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte; +PMMPTE MiFirstReservedZeroingPte; MMPTE HyperTemplatePte; PEPROCESS HyperProcess; KIRQL HyperIrql; @@ -30,43 +31,60 @@ MiMapPageInHyperSpace(IN PEPROCESS Process, MMPTE TempPte; PMMPTE PointerPte; PFN_NUMBER Offset; - PVOID Address; - /* Never accept page 0 */ + // + // Never accept page 0 + // ASSERT(Page != 0); - /* Build the PTE */ + // + // Build the PTE + // TempPte = HyperTemplatePte; TempPte.u.Hard.PageFrameNumber = Page; + TempPte.u.Hard.Global = 0; // Hyperspace is local! - /* Pick the first hyperspace PTE */ + // + // Pick the first hyperspace PTE + // PointerPte = MmFirstReservedMappingPte; - /* Acquire the hyperlock */ + // + // Acquire the hyperlock + // ASSERT(Process == PsGetCurrentProcess()); KeAcquireSpinLock(&Process->HyperSpaceLock, OldIrql); - /* Now get the first free PTE */ + // + // Now get the first free PTE + // Offset = PFN_FROM_PTE(PointerPte); if (!Offset) { - /* Reset the PTEs */ + // + // Reset the PTEs + // Offset = MI_HYPERSPACE_PTES; KeFlushProcessTb(); } - /* Prepare the next PTE */ + // + // Prepare the next PTE + // PointerPte->u.Hard.PageFrameNumber = Offset - 1; - /* Write the current PTE */ + // + // Write the current PTE + // PointerPte += Offset; ASSERT(PointerPte->u.Hard.Valid == 0); ASSERT(TempPte.u.Hard.Valid == 1); *PointerPte = TempPte; - /* Return the address */ - Address = (PVOID)((ULONG_PTR)PointerPte << 10); - return Address; + // + // Return the address + // + return MiPteToAddress(PointerPte); } VOID @@ -77,10 +95,14 @@ MiUnmapPageInHyperSpace(IN PEPROCESS Process, { ASSERT(Process == PsGetCurrentProcess()); - /* Blow away the mapping */ + // + // Blow away the mapping + // MiAddressToPte(Address)->u.Long = 0; - /* Release the hyperlock */ + // + // Release the hyperlock + // ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); KeReleaseSpinLock(&Process->HyperSpaceLock, OldIrql); } @@ -93,24 +115,36 @@ MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page) PMMPTE PointerPte; PVOID Address; - /* Never accept page 0 */ + // + // Never accept page 0 + // ASSERT(Page != 0); - /* Build the PTE */ + // + // Build the PTE + // TempPte = HyperTemplatePte; TempPte.u.Hard.PageFrameNumber = Page; - /* Get the Zero PTE and its address */ + // + // Get the Zero PTE and its address + // PointerPte = MiAddressToPte(MI_ZERO_PTE); Address = (PVOID)((ULONG_PTR)PointerPte << 10); - /* Invalidate the old address */ + // + // Invalidate the old address + // __invlpg(Address); - /* Write the current PTE */ + // + // Write the current PTE + // TempPte.u.Hard.PageFrameNumber = Page; *PointerPte = TempPte; - /* Return the address */ + // + // Return the address + // return Address; } diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index e35eedac8aa..6320bf03ddf 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -360,6 +360,7 @@ + hypermap.c init.c pool.c syspte.c @@ -370,7 +371,6 @@ dbgpool.c drvlck.c freelist.c - hypermap.c iospace.c kmap.c marea.c From 9730c518108f1ba258af4dc531325496eb7269af Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 07:49:39 +0000 Subject: [PATCH 068/577] - Move ARM Pool to 0xB0000000 to avoid clashing with existing ReactOS address space components (shouldn't happen if things work right, but better safe than sorry). - Implement System PTE allocator (MiReserveAlignedSystemPtes and MiReserveSystemPtes). Very simple yet functional, no optimizes for now. - Allocate 32 zeoring PTEs from the System PTE pool. - Not used yet, only the allocation is made to test the current framework. - Tested on VirtualBox, QEMU and VMWare with RAM sizes from 128MB to 1536MB with no problems. svn path=/trunk/; revision=41575 --- reactos/ntoskrnl/include/internal/mm.h | 1 + reactos/ntoskrnl/mm/ARM3/init.c | 17 +++- reactos/ntoskrnl/mm/ARM3/miarm.h | 8 ++ reactos/ntoskrnl/mm/ARM3/syspte.c | 131 +++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index ac090d5c483..2cb6cce9aa7 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -64,6 +64,7 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE; #define HYPER_SPACE (0xC0400000) #define MI_HYPERSPACE_PTES (256 - 1) +#define MI_ZERO_PTES (32) #define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE #define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ MI_HYPERSPACE_PTES * PAGE_SIZE) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index 009941f8cf3..f739b3fee72 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -52,7 +52,7 @@ ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; // immediately follows the PFN database, typically sharing the same PDE. It is // a very small resource (32MB on a 1GB system), and capped at 128MB. // -// Right now, we call this the "ARM Pool" and it begins at 0xA0000000 since we +// Right now, we call this the "ARM Pool" and it begins at 0xB0000000 since we // don't want to interefere with the ReactOS memory manager PFN database (yet). // // The expansion nonpaged pool, on the other hand, can grow much bigger (400MB @@ -288,7 +288,7 @@ MmArmInitSystem(IN ULONG Phase, DPRINT1("System PTE VA starts at: %p\n", MmNonPagedSystemStart); DPRINT1("NP Expansion VA begins at: %p and ends at: %p\n", MmNonPagedPoolStart, MmNonPagedPoolEnd); - MmNonPagedPoolStart = (PVOID)0xA0000000; + MmNonPagedPoolStart = (PVOID)0xB0000000; // // Now we actually need to get these many physical pages. Nonpaged pool @@ -477,6 +477,19 @@ MmArmInitSystem(IN ULONG Phase, MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START); MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END); MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES; + + // + // Reserve system PTEs for zeroing PTEs and clear them + // + MiFirstReservedZeroingPte = MiReserveSystemPtes(MI_ZERO_PTES, + SystemPteSpace); + DPRINT1("ZERO PTEs are at: %p\n", MiFirstReservedZeroingPte); + RtlZeroMemory(MiFirstReservedZeroingPte, MI_ZERO_PTES * sizeof(MMPTE)); + + // + // Set the counter to maximum to boot with + // + MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; } // diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 0d220a0446a..0441f041760 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -27,6 +27,7 @@ extern ULONG MmMaximumNonPagedPoolInBytes; extern PVOID MmNonPagedPoolStart; extern PVOID MmNonPagedPoolExpansionStart; extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte; +extern PMMPTE MiFirstReservedZeroingPte; VOID NTAPI @@ -42,4 +43,11 @@ MiInitializeSystemPtes( IN MMSYSTEM_PTE_POOL_TYPE PoolType ); +PMMPTE +NTAPI +MiReserveSystemPtes( + IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/syspte.c b/reactos/ntoskrnl/mm/ARM3/syspte.c index 40177dc711f..f3c41f56a33 100644 --- a/reactos/ntoskrnl/mm/ARM3/syspte.c +++ b/reactos/ntoskrnl/mm/ARM3/syspte.c @@ -27,6 +27,137 @@ ULONG MmTotalSystemPtes; /* PRIVATE FUNCTIONS **********************************************************/ +PMMPTE +NTAPI +MiReserveAlignedSystemPtes(IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType, + IN ULONG Alignment) +{ + PMMPTE PointerPte, NextPte, PreviousPte; + ULONG_PTR ClusterSize; + + // + // Sanity check + // + ASSERT(Alignment <= PAGE_SIZE); + + // + // Get the first free cluster and make sure we have PTEs available + // + PointerPte = &MmFirstFreeSystemPte[SystemPtePoolType]; + if (PointerPte->u.List.NextEntry == -1) return NULL; + + // + // Now move to the first free system PTE cluster + // + PreviousPte = PointerPte; + PointerPte = MmSystemPteBase + PointerPte->u.List.NextEntry; + + // + // Loop each cluster + // + while (TRUE) + { + // + // Check if we're done to only one PTE left + // + if (!PointerPte->u.List.OneEntry) + { + // + // Keep track of the next cluster in case we have to relink + // + NextPte = PointerPte + 1; + + // + // Can this cluster satisfy the request? + // + ClusterSize = (ULONG_PTR)NextPte->u.List.NextEntry; + if (NumberOfPtes < ClusterSize) + { + // + // It can, and it will leave just one PTE left + // + if ((ClusterSize - NumberOfPtes) == 1) + { + // + // This cluster becomes a single system PTE entry + // + PointerPte->u.List.OneEntry = 1; + } + else + { + // + // Otherwise, the next cluster aborbs what's left + // + NextPte->u.List.NextEntry = ClusterSize - NumberOfPtes; + } + + // + // Decrement the free count and move to the next starting PTE + // + MmTotalFreeSystemPtes[SystemPtePoolType] -= NumberOfPtes; + PointerPte += (ClusterSize - NumberOfPtes); + break; + } + + // + // Did we find exactly what you wanted? + // + if (NumberOfPtes == ClusterSize) + { + // + // Yes, fixup the cluster and decrease free system PTE count + // + PreviousPte->u.List.NextEntry = PointerPte->u.List.NextEntry; + MmTotalFreeSystemPtes[SystemPtePoolType] -= NumberOfPtes; + break; + } + } + else if (NumberOfPtes == 1) + { + // + // We have one PTE in this cluster, and it's all you want + // + PreviousPte->u.List.NextEntry = PointerPte->u.List.NextEntry; + MmTotalFreeSystemPtes[SystemPtePoolType]--; + break; + } + + // + // We couldn't find what you wanted -- is this the last cluster? + // + if (PointerPte->u.List.NextEntry == -1) return NULL; + + // + // Go to the next cluster + // + PreviousPte = PointerPte; + PointerPte = MmSystemPteBase + PointerPte->u.List.NextEntry; + ASSERT(PointerPte > PreviousPte); + } + + // + // Flush the TLB and return the first PTE + // + KeFlushProcessTb(); + return PointerPte; +} + +PMMPTE +NTAPI +MiReserveSystemPtes(IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType) +{ + PMMPTE PointerPte; + + // + // Use the extended function + // + PointerPte = MiReserveAlignedSystemPtes(NumberOfPtes, SystemPtePoolType, 0); + ASSERT(PointerPte != NULL); + return PointerPte; +} + VOID NTAPI MiInitializeSystemPtes(IN PMMPTE StartingPte, From 25941abce10a4ff171f04af709bcbcdb85f6a78d Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 09:11:01 +0000 Subject: [PATCH 069/577] - So it turns out bad things can happen if you play behind Mm's back. - The lovely poetry is brought to you by 7AM coding marathons... svn path=/trunk/; revision=41576 --- reactos/ntoskrnl/mm/ARM3/init.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index f739b3fee72..07812264ad1 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -104,6 +104,29 @@ ULONG MmNumberOfSystemPtes; /* PRIVATE FUNCTIONS **********************************************************/ +// +// In Bavaria, this is probably a hate crime +// +VOID +FASTCALL +MiSyncARM3WithROS(IN PVOID AddressStart, + IN PVOID AddressEnd) +{ + // + // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder + // + ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart); + while (Pde < ADDR_TO_PDE_OFFSET(AddressEnd)) + { + // + // This both odious and heinous + // + extern PULONG MmGlobalKernelPageDirectory; + MmGlobalKernelPageDirectory[Pde] = ((PULONG)PAGEDIRECTORY_MAP)[Pde]; + Pde++; + } +} + NTSTATUS NTAPI MmArmInitSystem(IN ULONG Phase, @@ -490,6 +513,13 @@ MmArmInitSystem(IN ULONG Phase, // Set the counter to maximum to boot with // MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; + + // + // Sync us up with ReactOS Mm + // + MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); + MiSyncARM3WithROS(MmNonPagedPoolStart, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); + MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); } // From d11a34b5ed3626b6c2b13433d6176c0fd0c2fe21 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 09:23:16 +0000 Subject: [PATCH 070/577] - Jesus Christ man, learn some C, will you? - Fix boot. - The lack of colorful poetry is brought to you by cogent human beings on the West Coast whom you should be thankful haven't gone to bed yet. svn path=/trunk/; revision=41577 --- reactos/ntoskrnl/mm/ARM3/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index 07812264ad1..55d7db4dbff 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -121,7 +121,7 @@ MiSyncARM3WithROS(IN PVOID AddressStart, // // This both odious and heinous // - extern PULONG MmGlobalKernelPageDirectory; + extern ULONG MmGlobalKernelPageDirectory[1024]; MmGlobalKernelPageDirectory[Pde] = ((PULONG)PAGEDIRECTORY_MAP)[Pde]; Pde++; } From 2c293c30c4a02c2f3555fe137d6cf6cad88730ed Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Tue, 23 Jun 2009 09:34:45 +0000 Subject: [PATCH 071/577] - Reimplement the way zeroing PTEs are used: - First, switch to using system PTEs as it should've been from the beginning. Our original implementation was broken and prone to race conditions, which Dmitry graciously fixed. - We can now remove the MiZeroPageInternal hack that was used as a way to avoid deadlock/contention in the zero paths. - Zeroing PTEs is done at DPC level in ReactOS, to avoid ReactOS-specific race issues. In Windows NT, this operation is always done at passive. - Zeroing PTEs are similar to hyperspace PTEs, but they can be mapped in chunks for optimization. - ReactOS does not currently make use of this functionality, so zeroing is pretty slow, especially on bootup if you have lots of memory (all RAM is zeroed). - The existing ReactOS "compatibility layer" for hyperspace was augmented to seamlessly use the new zeroing PTE API. - You must now unmap zeroing PTEs -- MiZeroPage was modified to do this. - System PTE binning, NBQUEUES and SLISTS would optimize this further. TBD. - Once again, tested on the trinity of supported emulators. svn path=/trunk/; revision=41578 --- reactos/ntoskrnl/include/internal/mm.h | 16 +++- reactos/ntoskrnl/mm/ARM3/hypermap.c | 101 ++++++++++++++++++++----- reactos/ntoskrnl/mm/freelist.c | 17 +---- reactos/ntoskrnl/mm/kmap.c | 8 +- 4 files changed, 100 insertions(+), 42 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 2cb6cce9aa7..c1509c7f848 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1155,7 +1155,13 @@ MiUnmapPageInHyperSpace(IN PEPROCESS Process, PVOID NTAPI -MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page); +MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages, + IN PFN_NUMBER NumberOfPages); + +VOID +NTAPI +MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress, + IN PFN_NUMBER NumberOfPages); // // ReactOS Compatibility Layer @@ -1168,6 +1174,14 @@ MmCreateHyperspaceMapping(IN PFN_NUMBER Page) return MiMapPageInHyperSpace(HyperProcess, Page, &HyperIrql); } +PVOID +FORCEINLINE +MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page) +{ + PMMPFN Pfn1 = MiGetPfnEntry(Page); + return MiMapPagesToZeroInHyperSpace(&Pfn1, 1); +} + #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql); /* i386/page.c *********************************************************/ diff --git a/reactos/ntoskrnl/mm/ARM3/hypermap.c b/reactos/ntoskrnl/mm/ARM3/hypermap.c index 60d73fcf640..cb59ddec543 100644 --- a/reactos/ntoskrnl/mm/ARM3/hypermap.c +++ b/reactos/ntoskrnl/mm/ARM3/hypermap.c @@ -109,42 +109,101 @@ MiUnmapPageInHyperSpace(IN PEPROCESS Process, PVOID NTAPI -MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page) +MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages, + IN PFN_NUMBER NumberOfPages) { MMPTE TempPte; PMMPTE PointerPte; - PVOID Address; + PFN_NUMBER Offset, PageFrameIndex; + PMMPFN Page; // - // Never accept page 0 + // Sanity checks // - ASSERT(Page != 0); + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(NumberOfPages != 0); + ASSERT(NumberOfPages <= (MI_ZERO_PTES - 1)); + + // + // Pick the first zeroing PTE + // + PointerPte = MiFirstReservedZeroingPte; // - // Build the PTE + // Now get the first free PTE // - TempPte = HyperTemplatePte; - TempPte.u.Hard.PageFrameNumber = Page; - + Offset = PFN_FROM_PTE(PointerPte); + if (NumberOfPages > Offset) + { + // + // Reset the PTEs + // + Offset = MI_ZERO_PTES - 1; + PointerPte->u.Hard.PageFrameNumber = Offset; + KeFlushProcessTb(); + } + // - // Get the Zero PTE and its address + // Prepare the next PTE // - PointerPte = MiAddressToPte(MI_ZERO_PTE); - Address = (PVOID)((ULONG_PTR)PointerPte << 10); - - // - // Invalidate the old address - // - __invlpg(Address); - + PointerPte->u.Hard.PageFrameNumber = Offset - NumberOfPages; + // // Write the current PTE // - TempPte.u.Hard.PageFrameNumber = Page; - *PointerPte = TempPte; - + PointerPte += (Offset + 1); + TempPte = HyperTemplatePte; + TempPte.u.Hard.Global = FALSE; // Hyperspace is local! + do + { + // + // Get the first page entry and its PFN + // + Page = *Pages++; + PageFrameIndex = MiGetPfnEntryIndex(Page); + + // + // Write the PFN + // + TempPte.u.Hard.PageFrameNumber = PageFrameIndex; + + // + // Set the correct PTE to write to, and set its new value + // + PointerPte--; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + } while (--NumberOfPages); + // // Return the address // - return Address; + return MiPteToAddress(PointerPte); } + +VOID +NTAPI +MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress, + IN PFN_NUMBER NumberOfPages) +{ + PMMPTE PointerPte; + + // + // Sanity checks + // + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT (NumberOfPages != 0); + ASSERT (NumberOfPages <= (MI_ZERO_PTES - 1)); + + // + // Get the first PTE for the mapped zero VA + // + PointerPte = MiAddressToPte(VirtualAddress); + + // + // Blow away the mapped zero PTEs + // + RtlZeroMemory(PointerPte, NumberOfPages * sizeof(MMPTE)); +} + diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 600a3079e41..45f0307c577 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -938,21 +938,6 @@ MmAllocPagesSpecifyRange(ULONG Consumer, return NumberOfPagesFound; } -static -NTSTATUS -MiZeroPageInternal(PFN_TYPE Page) -{ - PVOID TempAddress; - - TempAddress = MiMapPageToZeroInHyperSpace(Page); - if (TempAddress == NULL) - { - return(STATUS_NO_MEMORY); - } - memset(TempAddress, 0, PAGE_SIZE); - return(STATUS_SUCCESS); -} - NTSTATUS NTAPI MmZeroPageThreadMain(PVOID Ignored) @@ -1000,7 +985,7 @@ MmZeroPageThreadMain(PVOID Ignored) PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); Pfn = PageDescriptor - MmPfnDatabase; - Status = MiZeroPageInternal(Pfn); + Status = MiZeroPage(Pfn); oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); if (PageDescriptor->MapCount != 0) diff --git a/reactos/ntoskrnl/mm/kmap.c b/reactos/ntoskrnl/mm/kmap.c index 0a442803f5e..e671088b26c 100644 --- a/reactos/ntoskrnl/mm/kmap.c +++ b/reactos/ntoskrnl/mm/kmap.c @@ -21,18 +21,18 @@ NTSTATUS NTAPI MiZeroPage(PFN_TYPE Page) { - PEPROCESS Process; KIRQL Irql; PVOID TempAddress; - Process = PsGetCurrentProcess(); - TempAddress = MiMapPageInHyperSpace(Process, Page, &Irql); + Irql = KeRaiseIrqlToDpcLevel(); + TempAddress = MiMapPageToZeroInHyperSpace(Page); if (TempAddress == NULL) { return(STATUS_NO_MEMORY); } memset(TempAddress, 0, PAGE_SIZE); - MiUnmapPageInHyperSpace(Process, TempAddress, Irql); + MiUnmapPagesInZeroSpace(TempAddress, 1); + KeLowerIrql(Irql); return(STATUS_SUCCESS); } From c90eb62d1789aa0acba4ae293e1786e500435675 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Tue, 23 Jun 2009 11:24:10 +0000 Subject: [PATCH 072/577] sync shlwapi with wine 1.1.24 svn path=/trunk/; revision=41579 --- reactos/dll/win32/shlwapi/shlwapi.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shlwapi/shlwapi.spec b/reactos/dll/win32/shlwapi/shlwapi.spec index d9cc3a5f842..b7ea3aa6fff 100644 --- a/reactos/dll/win32/shlwapi/shlwapi.spec +++ b/reactos/dll/win32/shlwapi/shlwapi.spec @@ -193,7 +193,7 @@ 193 stdcall -noname SHGetCurColorRes() 194 stdcall -noname SHWaitForSendMessageThread(ptr long) 195 stdcall -noname SHIsExpandableFolder(ptr ptr) -196 stub -noname DnsRecordSetCompare #stdcall @(ptr ptr ptr ptr) dnsapi.DnsRecordSetCompare +196 stdcall -noname DnsRecordSetCompare(ptr ptr ptr ptr) dnsapi.DnsRecordSetCompare 197 stdcall -noname SHFillRectClr(long ptr long) 198 stdcall -noname SHSearchMapInt(ptr ptr long long) 199 stdcall -noname IUnknown_Set(ptr ptr) From 2d5297edef840ff93bbe85888b6245a605a26b4a Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Tue, 23 Jun 2009 11:44:23 +0000 Subject: [PATCH 073/577] sync kernel32_winetest with wine 1.1.24 svn path=/trunk/; revision=41580 --- rostests/winetests/kernel32/comm.c | 14 +- rostests/winetests/kernel32/file.c | 192 ++++++++++++++------------ rostests/winetests/kernel32/pipe.c | 3 + rostests/winetests/kernel32/process.c | 56 ++++++++ 4 files changed, 175 insertions(+), 90 deletions(-) diff --git a/rostests/winetests/kernel32/comm.c b/rostests/winetests/kernel32/comm.c index 8cd07ad6bcb..2fb95cdb939 100755 --- a/rostests/winetests/kernel32/comm.c +++ b/rostests/winetests/kernel32/comm.c @@ -561,6 +561,7 @@ static void test_BuildCommDCBW(TEST *ptest, int initial_value, DCB *pexpected_dc BOOL result; DCB dcb; WCHAR wide_string[sizeof(ptest->string)]; + static int reportedDCBW = 0; MultiByteToWideChar(CP_ACP, 0, ptest->string, -1, wide_string, sizeof(wide_string) / sizeof(WCHAR)); @@ -572,7 +573,8 @@ static void test_BuildCommDCBW(TEST *ptest, int initial_value, DCB *pexpected_dc if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - win_skip("BuildCommDCBW is not available\n"); + if(!reportedDCBW++) + win_skip("BuildCommDCBW is not implemented\n"); return; } @@ -587,6 +589,7 @@ static void test_BuildCommDCBAndTimeoutsW(TEST *ptest, int initial_value, DCB *p DCB dcb; COMMTIMEOUTS timeouts; WCHAR wide_string[sizeof(ptest->string)]; + static int reportedDCBAndTW = 0; MultiByteToWideChar(CP_ACP, 0, ptest->string, -1, wide_string, sizeof(wide_string) / sizeof(WCHAR)); @@ -599,14 +602,15 @@ static void test_BuildCommDCBAndTimeoutsW(TEST *ptest, int initial_value, DCB *p if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - win_skip("BuildCommDCBAndTimeoutsW is not available\n"); + if(!reportedDCBAndTW++) + win_skip("BuildCommDCBAndTimeoutsW is not implemented\n"); return; } /* check results */ - check_result("BuildCommDCBAndTimeoutsA", ptest, initial_value, result); - check_dcb("BuildCommDCBAndTimeoutsA", ptest, initial_value, &dcb, pexpected_dcb); - check_timeouts("BuildCommDCBAndTimeoutsA", ptest, initial_value, &timeouts, pexpected_timeouts); + check_result("BuildCommDCBAndTimeoutsW", ptest, initial_value, result); + check_dcb("BuildCommDCBAndTimeoutsW", ptest, initial_value, &dcb, pexpected_dcb); + check_timeouts("BuildCommDCBAndTimeoutsW", ptest, initial_value, &timeouts, pexpected_timeouts); } static void test_BuildCommDCB(void) diff --git a/rostests/winetests/kernel32/file.c b/rostests/winetests/kernel32/file.c index 4ad10eb1b88..e2ad49d596f 100755 --- a/rostests/winetests/kernel32/file.c +++ b/rostests/winetests/kernel32/file.c @@ -55,10 +55,11 @@ static const char sillytext[] = "sdlkfjasdlkfj a dslkj adsklf \n \nasdklf askldfa sdlkf \nsadklf asdklf asdf "; struct test_list { - const char *file; - const DWORD err; - const DWORD options; - const BOOL todo_flag; + const char *file; /* file string to test */ + const DWORD err; /* Win NT and further error code */ + const LONG err2; /* Win 9x & ME error code or -1 */ + const DWORD options; /* option flag to use for open */ + const BOOL todo_flag; /* todo_wine indicator */ } ; static void InitFunctionPointers(void) @@ -717,19 +718,19 @@ static void test_CreateFileA(void) static const char nt_drive[] = "\\\\?\\A:"; DWORD i, ret, len; struct test_list p[] = { - {"", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dir as file w \ */ - {"", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* dir as dir w \ */ - {"a", ERROR_FILE_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist file */ - {"a\\", ERROR_FILE_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist dir */ - {"removeme", ERROR_ACCESS_DENIED, FILE_ATTRIBUTE_NORMAL, FALSE }, /* exist dir w/o \ */ - {"removeme\\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* exst dir w \ */ - {"c:", ERROR_ACCESS_DENIED, FILE_ATTRIBUTE_NORMAL, FALSE }, /* device in file namespace */ - {"c:", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* device in file namespace as dir */ - {"c:\\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* root dir w \ */ - {"c:\\", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* root dir w \ as dir */ - {"\\\\?\\c:", ERROR_SUCCESS, FILE_ATTRIBUTE_NORMAL,FALSE }, /* dev namespace drive */ - {"\\\\?\\c:\\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dev namespace drive w \ */ - {NULL, 0, 0, FALSE} + {"", ERROR_PATH_NOT_FOUND, -1, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dir as file w \ */ + {"", ERROR_SUCCESS, ERROR_PATH_NOT_FOUND, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* dir as dir w \ */ + {"a", ERROR_FILE_NOT_FOUND, -1, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist file */ + {"a\\", ERROR_FILE_NOT_FOUND, ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist dir */ + {"removeme", ERROR_ACCESS_DENIED, -1, FILE_ATTRIBUTE_NORMAL, FALSE }, /* exist dir w/o \ */ + {"removeme\\", ERROR_PATH_NOT_FOUND, -1, FILE_ATTRIBUTE_NORMAL, TRUE }, /* exst dir w \ */ + {"c:", ERROR_ACCESS_DENIED, ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* device in file namespace */ + {"c:", ERROR_SUCCESS, ERROR_PATH_NOT_FOUND, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* device in file namespace as dir */ + {"c:\\", ERROR_PATH_NOT_FOUND, ERROR_ACCESS_DENIED, FILE_ATTRIBUTE_NORMAL, TRUE }, /* root dir w \ */ + {"c:\\", ERROR_SUCCESS, ERROR_ACCESS_DENIED, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* root dir w \ as dir */ + {"\\\\?\\c:", ERROR_SUCCESS, ERROR_BAD_NETPATH, FILE_ATTRIBUTE_NORMAL,FALSE }, /* dev namespace drive */ + {"\\\\?\\c:\\", ERROR_PATH_NOT_FOUND, ERROR_BAD_NETPATH, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dev namespace drive w \ */ + {NULL, 0, -1, 0, FALSE} }; BY_HANDLE_FILE_INFORMATION Finfo; @@ -829,13 +830,17 @@ static void test_CreateFileA(void) } /* otherwise validate results with expectations */ else if (p[i].todo_flag) - todo_wine ok((hFile == INVALID_HANDLE_VALUE && p[i].err == GetLastError()) || + todo_wine ok( + (hFile == INVALID_HANDLE_VALUE && + (p[i].err == GetLastError() || p[i].err2 == GetLastError())) || (hFile != INVALID_HANDLE_VALUE && p[i].err == ERROR_SUCCESS), "CreateFileA failed on %s, hFile %p, err=%u, should be %u\n", filename, hFile, GetLastError(), p[i].err); else - ok((hFile == INVALID_HANDLE_VALUE && p[i].err == GetLastError()) || - (hFile != INVALID_HANDLE_VALUE && p[i].err == ERROR_SUCCESS), + ok( + (hFile == INVALID_HANDLE_VALUE && + (p[i].err == GetLastError() || p[i].err2 == GetLastError())) || + (hFile != INVALID_HANDLE_VALUE && p[i].err == ERROR_SUCCESS), "CreateFileA failed on %s, hFile %p, err=%u, should be %u\n", filename, hFile, GetLastError(), p[i].err); if (hFile != INVALID_HANDLE_VALUE) @@ -852,21 +857,26 @@ static void test_CreateFileA(void) NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); - ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == ERROR_SUCCESS, + if (hFile != INVALID_HANDLE_VALUE && GetLastError() != ERROR_PATH_NOT_FOUND) + { + ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == ERROR_SUCCESS, "CreateFileA did not work, last error %u on volume <%s>\n", GetLastError(), temp_path ); - if (hFile != INVALID_HANDLE_VALUE) - { - ret = GetFileInformationByHandle( hFile, &Finfo ); - if (ret) + if (hFile != INVALID_HANDLE_VALUE) { - ok(Finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY, - "CreateFileA probably did not open temp directory %s correctly\n file information does not include FILE_ATTRIBUTE_DIRECTORY, actual=0x%08x\n", + ret = GetFileInformationByHandle( hFile, &Finfo ); + if (ret) + { + ok(Finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY, + "CreateFileA probably did not open temp directory %s correctly\n file information does not include FILE_ATTRIBUTE_DIRECTORY, actual=0x%08x\n", temp_path, Finfo.dwFileAttributes); + } + CloseHandle( hFile ); } - CloseHandle( hFile ); } + else + skip("Probable Win9x, got ERROR_PATH_NOT_FOUND w/ FILE_FLAG_BACKUP_SEMANTICS or %s\n", temp_path); /* *** Test opening volumes/devices using drive letter *** */ @@ -879,7 +889,8 @@ static void test_CreateFileA(void) FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); - if (hFile != INVALID_HANDLE_VALUE || GetLastError() != ERROR_ACCESS_DENIED) + if (hFile != INVALID_HANDLE_VALUE || + (GetLastError() != ERROR_ACCESS_DENIED && GetLastError() != ERROR_BAD_NETPATH)) { /* if we have adm rights to volume, then try rest of tests */ ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", @@ -946,6 +957,9 @@ static void test_CreateFileA(void) if (hFile != INVALID_HANDLE_VALUE) CloseHandle( hFile ); } + /* If we see ERROR_BAD_NETPATH then on Win9x or WinME, so skip */ + else if (GetLastError() == ERROR_BAD_NETPATH) + skip("Probable Win9x, got ERROR_BAD_NETPATH (53)\n"); else skip("Do not have authority to access volumes. Tests skipped\n"); @@ -957,78 +971,86 @@ static void test_CreateFileA(void) strcpy(filename, "c:\\"); filename[0] = windowsdir[0]; ret = pGetVolumeNameForVolumeMountPointA( filename, Volume_1, MAX_PATH ); - ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n"); - ok(strlen(Volume_1) == 49, "GetVolumeNameForVolumeMountPointA returned wrong length name %s\n", Volume_1); + ok(ret, "GetVolumeNameForVolumeMountPointA failed, for %s, last error=%d\n", filename, GetLastError()); + if (ret) + { + ok(strlen(Volume_1) == 49, "GetVolumeNameForVolumeMountPointA returned wrong length name <%s>\n", Volume_1); - /* test the result of opening a unique volume name (GUID) */ - /* with the trailing \ */ - /* this should error out */ - strcpy(filename, Volume_1); - hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + /* test the result of opening a unique volume name (GUID) + * with the trailing \ + * this should error out + */ + strcpy(filename, Volume_1); + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); - todo_wine - ok(hFile == INVALID_HANDLE_VALUE, - "CreateFileA should not have opened %s, hFile %p\n", - filename, hFile); - todo_wine - ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, - "CreateFileA should have returned ERROR_PATH_NOT_FOUND on %s, but got %u\n", - filename, GetLastError()); - if (hFile != INVALID_HANDLE_VALUE) - CloseHandle( hFile ); + todo_wine + ok(hFile == INVALID_HANDLE_VALUE, + "CreateFileA should not have opened %s, hFile %p\n", + filename, hFile); + todo_wine + ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateFileA should have returned ERROR_PATH_NOT_FOUND on %s, but got %u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); - /* test the result of opening a unique volume name (GUID) */ - /* with the temp path string as dir */ - /* this should work */ - strcpy(filename, Volume_1); - strcat(filename, temp_path+3); - hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + /* test the result of opening a unique volume name (GUID) + * with the temp path string as dir + * this should work + */ + strcpy(filename, Volume_1); + strcat(filename, temp_path+3); + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); - todo_wine - ok(hFile != INVALID_HANDLE_VALUE, - "CreateFileA should have opened %s, but got %u\n", - filename, GetLastError()); - if (hFile != INVALID_HANDLE_VALUE) - CloseHandle( hFile ); + todo_wine + ok(hFile != INVALID_HANDLE_VALUE, + "CreateFileA should have opened %s, but got %u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); - /* test the result of opening a unique volume name (GUID) */ - /* without the trailing \ and in device namespace */ - /* this should work */ - strcpy(filename, Volume_1); - filename[2] = '.'; - filename[48] = 0; - hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + /* test the result of opening a unique volume name (GUID) + * without the trailing \ and in device namespace + * this should work + */ + strcpy(filename, Volume_1); + filename[2] = '.'; + filename[48] = 0; + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); - if (hFile != INVALID_HANDLE_VALUE || GetLastError() != ERROR_ACCESS_DENIED) - { - /* if we have adm rights to volume, then try rest of tests */ - ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", - filename, GetLastError()); - if (hFile != INVALID_HANDLE_VALUE) + if (hFile != INVALID_HANDLE_VALUE || GetLastError() != ERROR_ACCESS_DENIED) { - /* if we opened the volume/device, try to read it. Since it */ - /* opened, we should be able to read it. We don't care about*/ - /* what the data is at this time. */ - len = 512; - ret = ReadFile( hFile, buffer, len, &len, NULL ); - todo_wine ok(ret, "Failed to read volume, last error %u, %u, for %s\n", - GetLastError(), ret, filename); - if (ret) + /* if we have adm rights to volume, then try rest of tests */ + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) { - trace("buffer is\n"); - dumpmem(buffer, 64); - } - CloseHandle( hFile ); - } + /* if we opened the volume/device, try to read it. Since it */ + /* opened, we should be able to read it. We don't care about*/ + /* what the data is at this time. */ + len = 512; + ret = ReadFile( hFile, buffer, len, &len, NULL ); + todo_wine ok(ret, "Failed to read volume, last error %u, %u, for %s\n", + GetLastError(), ret, filename); + if (ret) + { + trace("buffer is\n"); + dumpmem(buffer, 64); + } + CloseHandle( hFile ); + } + } + else + skip("Do not have authority to access volumes. Tests skipped\n"); } else - skip("Do not have authority to access volumes. Tests skipped\n"); + win_skip("GetVolumeNameForVolumeMountPointA not functioning\n"); } else win_skip("GetVolumeNameForVolumeMountPointA not found\n"); diff --git a/rostests/winetests/kernel32/pipe.c b/rostests/winetests/kernel32/pipe.c index a1080faad3d..948c704e99e 100755 --- a/rostests/winetests/kernel32/pipe.c +++ b/rostests/winetests/kernel32/pipe.c @@ -836,6 +836,7 @@ static int test_DisconnectNamedPipe(void) char ibuf[32]; DWORD written; DWORD readden; + DWORD ret; SetLastError(0xdeadbeef); hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, @@ -876,6 +877,8 @@ static int test_DisconnectNamedPipe(void) "ReadFile from disconnected pipe with bytes waiting\n"); ok(!DisconnectNamedPipe(hnp) && GetLastError() == ERROR_PIPE_NOT_CONNECTED, "DisconnectNamedPipe worked twice\n"); + ret = WaitForSingleObject(hFile, 0); + ok(ret == WAIT_TIMEOUT, "WaitForSingleObject returned %X\n", ret); ok(CloseHandle(hFile), "CloseHandle\n"); } diff --git a/rostests/winetests/kernel32/process.c b/rostests/winetests/kernel32/process.c index 1a57d5b5092..9bcd3022768 100755 --- a/rostests/winetests/kernel32/process.c +++ b/rostests/winetests/kernel32/process.c @@ -43,6 +43,12 @@ ok((expected) == value, "Expected " #actual " to be %d (" #expected ") is %d\n", \ (expected), value); \ } while (0) +#define expect_eq_s(expected, actual) \ + do { \ + LPCSTR value = (actual); \ + ok(lstrcmpA((expected), value) == 0, "Expected " #actual " to be L\"%s\" (" #expected ") is L\"%s\"\n", \ + expected, value); \ + } while (0) #define expect_eq_ws_i(expected, actual) \ do { \ LPCWSTR value = (actual); \ @@ -70,6 +76,7 @@ static const char *wine_dbgstr_w(LPCWSTR wstr) static HINSTANCE hkernel32; static LPVOID (WINAPI *pVirtualAllocEx)(HANDLE, LPVOID, SIZE_T, DWORD, DWORD); static BOOL (WINAPI *pVirtualFreeEx)(HANDLE, LPVOID, SIZE_T, DWORD); +static BOOL (WINAPI *pQueryFullProcessImageNameA)(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize); static BOOL (WINAPI *pQueryFullProcessImageNameW)(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD lpdwSize); /* ############################### */ @@ -208,6 +215,7 @@ static int init(void) hkernel32 = GetModuleHandleA("kernel32"); pVirtualAllocEx = (void *) GetProcAddress(hkernel32, "VirtualAllocEx"); pVirtualFreeEx = (void *) GetProcAddress(hkernel32, "VirtualFreeEx"); + pQueryFullProcessImageNameA = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameA"); pQueryFullProcessImageNameW = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameW"); return 1; } @@ -1620,6 +1628,53 @@ static void test_GetProcessVersion(void) CloseHandle(pi.hThread); } +static void test_ProcessNameA(void) +{ +#define INIT_STR "Just some words" + DWORD length, size; + CHAR buf[1024]; + + if (!pQueryFullProcessImageNameA) + { + win_skip("QueryFullProcessImageNameA unavailable (added in Windows Vista)\n"); + return; + } + /* get the buffer length without \0 terminator */ + length = 1024; + expect_eq_d(TRUE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &length)); + expect_eq_d(length, lstrlenA(buf)); + + /* when the buffer is too small + * - function fail with error ERROR_INSUFFICIENT_BUFFER + * - the size variable is not modified + * tested with the biggest too small size + */ + size = length; + sprintf(buf,INIT_STR); + expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &size)); + expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError()); + expect_eq_d(length, size); + expect_eq_s(INIT_STR, buf); + + /* retest with smaller buffer size + */ + size = 4; + sprintf(buf,INIT_STR); + expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &size)); + expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError()); + expect_eq_d(4, size); + expect_eq_s(INIT_STR, buf); + + /* this is a difference between the ascii and the unicode version + * the unicode version crashes when the size is big enough to hold the result + * ascii version throughs an error + */ + size = 1024; + expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, NULL, &size)); + expect_eq_d(1024, size); + expect_eq_d(ERROR_INVALID_PARAMETER, GetLastError()); +} + static void test_ProcessName(void) { HANDLE hSelf; @@ -1743,6 +1798,7 @@ START_TEST(process) test_ExitCode(); test_OpenProcess(); test_GetProcessVersion(); + test_ProcessNameA(); test_ProcessName(); test_Handles(); /* things that can be tested: From aa2eef5de1934c639be9767cb7a4e1ba8185b8d3 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Tue, 23 Jun 2009 11:47:46 +0000 Subject: [PATCH 074/577] sync crypt32_winetest with wine 1.1.24 svn path=/trunk/; revision=41581 --- rostests/winetests/crypt32/encode.c | 3 ++- rostests/winetests/crypt32/oid.c | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rostests/winetests/crypt32/encode.c b/rostests/winetests/crypt32/encode.c index e40619492a7..3e99800638c 100644 --- a/rostests/winetests/crypt32/encode.c +++ b/rostests/winetests/crypt32/encode.c @@ -5843,7 +5843,8 @@ static void test_decodePKCSAttribute(DWORD dwEncoding) * I doubt an app depends on that. */ ok(!ret && (GetLastError() == CRYPT_E_ASN1_EOD || - GetLastError() == CRYPT_E_ASN1_CORRUPT || OSS_MORE_INPUT /* Win9x */), + GetLastError() == CRYPT_E_ASN1_CORRUPT || + GetLastError() == OSS_MORE_INPUT /* Win9x */), "Expected CRYPT_E_ASN1_EOD, CRYPT_E_ASN1_CORRUPT, or OSS_MORE_INPUT, got %x\n", GetLastError()); ret = pCryptDecodeObjectEx(dwEncoding, PKCS_ATTRIBUTE, diff --git a/rostests/winetests/crypt32/oid.c b/rostests/winetests/crypt32/oid.c index 9b50129fd1d..8b680c44a80 100644 --- a/rostests/winetests/crypt32/oid.c +++ b/rostests/winetests/crypt32/oid.c @@ -384,7 +384,7 @@ static void test_registerDefaultOIDFunction(void) static const char func[] = "CertDllOpenStoreProv"; char buf[MAX_PATH]; BOOL ret; - long rc; + LSTATUS rc; HKEY key; ret = CryptRegisterDefaultOIDFunction(0, NULL, 0, NULL); @@ -419,7 +419,7 @@ static void test_registerDefaultOIDFunction(void) ok(ret, "CryptRegisterDefaultOIDFunction failed: %08x\n", GetLastError()); sprintf(buf, fmt, 0, func); rc = RegOpenKeyA(HKEY_LOCAL_MACHINE, buf, &key); - ok(rc == 0, "Expected key to exist, RegOpenKeyA failed: %ld\n", rc); + ok(rc == 0, "Expected key to exist, RegOpenKeyA failed: %d\n", rc); if (rc == 0) { static const CHAR dllA[] = "Dll"; @@ -432,7 +432,7 @@ static void test_registerDefaultOIDFunction(void) size = sizeof(dllBuf) / sizeof(dllBuf[0]); rc = RegQueryValueExA(key, dllA, NULL, &type, (LPBYTE)dllBuf, &size); ok(rc == 0, - "Expected Dll value to exist, RegQueryValueExA failed: %ld\n", rc); + "Expected Dll value to exist, RegQueryValueExA failed: %d\n", rc); ok(type == REG_MULTI_SZ, "Expected type REG_MULTI_SZ, got %d\n", type); /* bogusDll was registered first, so that should be first */ ptr = dllBuf; From 0e7c48671b70c8356dd5aebcb82ed63ac622be52 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Tue, 23 Jun 2009 12:02:58 +0000 Subject: [PATCH 075/577] sync ntdll rtlstr winetest with wine 1.1.24 svn path=/trunk/; revision=41582 --- rostests/winetests/ntdll/rtlstr.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/rostests/winetests/ntdll/rtlstr.c b/rostests/winetests/ntdll/rtlstr.c index e1d4be7ea83..ad9c5a18810 100755 --- a/rostests/winetests/ntdll/rtlstr.c +++ b/rostests/winetests/ntdll/rtlstr.c @@ -89,7 +89,7 @@ static WCHAR* AtoW( const char* p ) { WCHAR* buffer; DWORD len = MultiByteToWideChar( CP_ACP, 0, p, -1, NULL, 0 ); - buffer = malloc( len * sizeof(WCHAR) ); + buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR) ); MultiByteToWideChar( CP_ACP, 0, p, -1, buffer, len ); return buffer; } @@ -191,7 +191,7 @@ static void test_RtlInitUnicodeStringEx(void) UNICODE_STRING uni; NTSTATUS result; - teststring2 = malloc((TESTSTRING2_LEN + 1) * sizeof(WCHAR)); + teststring2 = HeapAlloc(GetProcessHeap(), 0, (TESTSTRING2_LEN + 1) * sizeof(WCHAR)); memset(teststring2, 'X', TESTSTRING2_LEN * sizeof(WCHAR)); teststring2[TESTSTRING2_LEN] = '\0'; @@ -293,7 +293,7 @@ static void test_RtlInitUnicodeStringEx(void) "pRtlInitUnicodeString(&uni, 0) sets Buffer to %p, expected %p\n", uni.Buffer, NULL); - free(teststring2); + HeapFree(GetProcessHeap(), 0, teststring2); } @@ -1357,14 +1357,15 @@ static void test_RtlUnicodeStringToInteger(void) test_num, str2int[test_num].str, str2int[test_num].base, result, str2int[test_num].result, str2int[test_num].alternative); if (result == STATUS_SUCCESS) - ok(value == str2int[test_num].value, + ok(value == str2int[test_num].value || + broken(str2int[test_num].str[0] == '\0' && str2int[test_num].base == 16), /* nt4 */ "(test %d): RtlUnicodeStringToInteger(\"%s\", %d, [out]) assigns value %d, expected: %d\n", test_num, str2int[test_num].str, str2int[test_num].base, value, str2int[test_num].value); else ok(value == 0xdeadbeef || value == 0 /* vista */, "(test %d): RtlUnicodeStringToInteger(\"%s\", %d, [out]) assigns value %d, expected 0 or deadbeef\n", test_num, str2int[test_num].str, str2int[test_num].base, value); - free(wstr); + HeapFree(GetProcessHeap(), 0, wstr); } wstr = AtoW(str2int[1].str); @@ -1404,7 +1405,7 @@ static void test_RtlUnicodeStringToInteger(void) "didn't return expected value (test c): expected: %d, got: %d\n", 1, value); /* w2k: uni.Length = 0 returns value 11234567 instead of 0 */ - free(wstr); + HeapFree(GetProcessHeap(), 0, wstr); } From e230289f946f08e73fc0162f69ace7eea8a0c982 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 23 Jun 2009 12:41:14 +0000 Subject: [PATCH 076/577] - Fix adapter failure when a network address is not specified in the registry - As a bonus, it also fixes OID_802_3_PERMANENT_ADDRESS svn path=/trunk/; revision=41583 --- reactos/drivers/network/dd/ne2000/ne2000/8390.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/network/dd/ne2000/ne2000/8390.c b/reactos/drivers/network/dd/ne2000/ne2000/8390.c index 0461305558c..4a3a409674f 100644 --- a/reactos/drivers/network/dd/ne2000/ne2000/8390.c +++ b/reactos/drivers/network/dd/ne2000/ne2000/8390.c @@ -266,9 +266,9 @@ static BOOLEAN NICReadSAPROM( for (i = 0; i < 16; i++) Adapter->SAPROM[i] = Buffer[i * 2]; - /* Copy the station address */ + /* Copy the permanent address */ NdisMoveMemory( - (PVOID)&Adapter->StationAddress, + (PVOID)&Adapter->PermanentAddress, (PVOID)&Adapter->SAPROM, DRIVER_LENGTH_OF_ADDRESS); From d8a2e91f8e32020d2bff2f8bb80983f79af9ad9d Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Tue, 23 Jun 2009 13:37:11 +0000 Subject: [PATCH 077/577] sync urlmon with wine 1.1.24 svn path=/trunk/; revision=41584 --- reactos/dll/win32/urlmon/bindctx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/urlmon/bindctx.c b/reactos/dll/win32/urlmon/bindctx.c index 044b817eda5..8c1949bae8c 100644 --- a/reactos/dll/win32/urlmon/bindctx.c +++ b/reactos/dll/win32/urlmon/bindctx.c @@ -386,7 +386,7 @@ static HRESULT WINAPI BSCHttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface, TRACE("(%p)->(%p %p %ld)\n", This, pbSecurityId, pcbSecurityId, dwReserved); if(!This->http_negotiate2) - return E_FAIL; + return E_NOTIMPL; return IHttpNegotiate2_GetRootSecurityId(This->http_negotiate2, pbSecurityId, pcbSecurityId, dwReserved); From 8267318b15fbb3fb9d6b34be4ab2861f432910f2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 23 Jun 2009 13:58:56 +0000 Subject: [PATCH 078/577] - Fix a crash when reading the network address from the registry - Fixes bug 4634 svn path=/trunk/; revision=41585 --- reactos/drivers/network/ndis/ndis/config.c | 39 +++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c index 02eabd35a5b..d18e06feb76 100644 --- a/reactos/drivers/network/ndis/ndis/config.c +++ b/reactos/drivers/network/ndis/ndis/config.c @@ -662,6 +662,7 @@ NdisReadNetworkAddress( NDIS_STRING Keyword; UINT *IntArray = 0; UINT i,j = 0; + NDIS_STRING str; NdisInitUnicodeString(&Keyword, L"NetworkAddress"); NdisReadConfiguration(Status, &ParameterValue, ConfigurationHandle, &Keyword, NdisParameterString); @@ -672,11 +673,41 @@ NdisReadNetworkAddress( return; } - while (ParameterValue->ParameterData.StringData.Buffer[j] != '\0') j++; + if (ParameterValue->ParameterType == NdisParameterInteger) + { + WCHAR Buff[25]; + NDIS_DbgPrint(MAX_TRACE, ("Read integer data %lx\n", + ParameterValue->ParameterData.IntegerData)); + + str.Buffer = Buff; + str.MaximumLength = (USHORT)sizeof(Buff); + str.Length = 0; + + *Status = RtlIntegerToUnicodeString(ParameterValue->ParameterData.IntegerData, + 10, + &str); + + if (*Status != NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MIN_TRACE, ("RtlIntegerToUnicodeString failed (%x)\n", *Status)); + *Status = NDIS_STATUS_FAILURE; + return; + } + + NDIS_DbgPrint(MAX_TRACE, ("Converted integer data into %wZ\n", &str)); + } + else + { + ASSERT(ParameterValue->ParameterType == NdisParameterString); + str = ParameterValue->ParameterData.StringData; + } + + while (str.Buffer[j] != '\0') j++; + *NetworkAddressLength = (UINT)((j/2)+0.5); - if (j == 0) + if ((*NetworkAddressLength) == 0) { NDIS_DbgPrint(MIN_TRACE,("Empty NetworkAddress registry entry.\n")); *Status = NDIS_STATUS_FAILURE; @@ -708,8 +739,8 @@ NdisReadNetworkAddress( /* convert from string to bytes */ for(i=0; i<(*NetworkAddressLength); i++) { - IntArray[i] = (UnicodeToHexByte((ParameterValue->ParameterData.StringData.Buffer)[2*i]) << 4) + - UnicodeToHexByte((ParameterValue->ParameterData.StringData.Buffer)[2*i+1]); + IntArray[i] = (UnicodeToHexByte((str.Buffer)[2*i]) << 4) + + UnicodeToHexByte((str.Buffer)[2*i+1]); } *NetworkAddress = IntArray; From 39572f4e0d4c00fcafcaf91baca9283336df8689 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 23 Jun 2009 14:00:49 +0000 Subject: [PATCH 079/577] - Fix adapter failure if a network address of invalid length is specified svn path=/trunk/; revision=41586 --- reactos/drivers/network/dd/ne2000/ne2000/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/network/dd/ne2000/ne2000/main.c b/reactos/drivers/network/dd/ne2000/ne2000/main.c index 800274e1d43..295b797a4da 100644 --- a/reactos/drivers/network/dd/ne2000/ne2000/main.c +++ b/reactos/drivers/network/dd/ne2000/ne2000/main.c @@ -373,7 +373,7 @@ static NDIS_STATUS NTAPI MiniportInitialize( NdisCloseConfiguration(ConfigurationHandle); } - if (Status != NDIS_STATUS_SUCCESS) + if (Status != NDIS_STATUS_SUCCESS || RegNetworkAddressLength != DRIVER_LENGTH_OF_ADDRESS) { int i; for (i = 0; i < DRIVER_LENGTH_OF_ADDRESS; i++) From 42e13d3260fa758c43cc703938f68db3c9926a42 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 23 Jun 2009 14:09:59 +0000 Subject: [PATCH 080/577] - Move NDIS_VERSION into ndissys.h and use it for NdisGetVersion also svn path=/trunk/; revision=41587 --- reactos/drivers/network/ndis/include/ndissys.h | 3 +++ reactos/drivers/network/ndis/ndis/config.c | 1 - reactos/drivers/network/ndis/ndis/misc.c | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/network/ndis/include/ndissys.h b/reactos/drivers/network/ndis/include/ndissys.h index f20e56d3035..4934cd574cb 100644 --- a/reactos/drivers/network/ndis/include/ndissys.h +++ b/reactos/drivers/network/ndis/include/ndissys.h @@ -28,6 +28,9 @@ #define EXPORT NTAPI #endif +/* the version of NDIS we claim to be */ +#define NDIS_VERSION 0x00050001 + #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24)) #define NDIS_TAG 0x4e4d4953 diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c index d18e06feb76..e409379ab77 100644 --- a/reactos/drivers/network/ndis/ndis/config.c +++ b/reactos/drivers/network/ndis/ndis/config.c @@ -33,7 +33,6 @@ #include "ndissys.h" -#define NDIS_VERSION 0x00050001 /* the version of NDIS we claim to be to miniport drivers */ #define PARAMETERS_KEY L"Parameters" /* The parameters subkey under the device-specific key */ /* diff --git a/reactos/drivers/network/ndis/ndis/misc.c b/reactos/drivers/network/ndis/ndis/misc.c index 032536e7b4d..fed88273cd8 100644 --- a/reactos/drivers/network/ndis/ndis/misc.c +++ b/reactos/drivers/network/ndis/ndis/misc.c @@ -515,7 +515,7 @@ NdisGetVersion(VOID) { NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - return (UINT) 0x501; + return NDIS_VERSION; } /* From d516d6898cb0a1719a80619198e18d23f5ea2ab7 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 23 Jun 2009 14:47:48 +0000 Subject: [PATCH 081/577] - We only need 11 chars to hold our 32-bit integer and the trailing NULL char - Make sure we don't overread our buffer svn path=/trunk/; revision=41589 --- reactos/drivers/network/ndis/ndis/config.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c index e409379ab77..964e58d278e 100644 --- a/reactos/drivers/network/ndis/ndis/config.c +++ b/reactos/drivers/network/ndis/ndis/config.c @@ -65,7 +65,7 @@ NdisWriteConfiguration( ULONG ParameterType; ULONG DataSize; PVOID Data; - WCHAR Buff[25]; + WCHAR Buff[11]; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -86,6 +86,7 @@ NdisWriteConfiguration( ParameterValue->ParameterData.IntegerData, (ParameterValue->ParameterType == NdisParameterInteger) ? 10 : 16, &Str))) { + NDIS_DbgPrint(MIN_TRACE, ("RtlIntegerToUnicodeString failed (%x)\n", *Status)); *Status = NDIS_STATUS_FAILURE; return; } @@ -674,7 +675,7 @@ NdisReadNetworkAddress( if (ParameterValue->ParameterType == NdisParameterInteger) { - WCHAR Buff[25]; + WCHAR Buff[11]; NDIS_DbgPrint(MAX_TRACE, ("Read integer data %lx\n", ParameterValue->ParameterData.IntegerData)); @@ -702,7 +703,7 @@ NdisReadNetworkAddress( str = ParameterValue->ParameterData.StringData; } - while (str.Buffer[j] != '\0') j++; + while (str.Buffer[j] != '\0' && j < str.Length) j++; *NetworkAddressLength = (UINT)((j/2)+0.5); From 5c78f6d219a5d82ebdfe8cdaef4b0dcc6fce9887 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 23 Jun 2009 14:51:50 +0000 Subject: [PATCH 082/577] - Fix the order of checks svn path=/trunk/; revision=41590 --- reactos/drivers/network/ndis/ndis/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c index 964e58d278e..f83be9ea291 100644 --- a/reactos/drivers/network/ndis/ndis/config.c +++ b/reactos/drivers/network/ndis/ndis/config.c @@ -703,7 +703,7 @@ NdisReadNetworkAddress( str = ParameterValue->ParameterData.StringData; } - while (str.Buffer[j] != '\0' && j < str.Length) j++; + while (j < str.Length && str.Buffer[j] != '\0') j++; *NetworkAddressLength = (UINT)((j/2)+0.5); From de0a0cf543250a3569eeeb8b64bacd48fc05eb03 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Tue, 23 Jun 2009 23:06:10 +0000 Subject: [PATCH 083/577] - Hey Arch, try to learn basic PSEH2 syntax before fuddling around with it. svn path=/trunk/; revision=41597 --- reactos/dll/win32/kernel32/string/lstring.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reactos/dll/win32/kernel32/string/lstring.c b/reactos/dll/win32/kernel32/string/lstring.c index 564a46dbfa1..a61cceb427f 100644 --- a/reactos/dll/win32/kernel32/string/lstring.c +++ b/reactos/dll/win32/kernel32/string/lstring.c @@ -82,6 +82,8 @@ lstrcpynA(LPSTR lpString1, LPCSTR lpString2, int iMaxLength) Ret = lpString1; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } _SEH2_END; return Ret; @@ -103,6 +105,8 @@ lstrcpyA(LPSTR lpString1, LPCSTR lpString2) Ret = lpString1; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } _SEH2_END; return Ret; @@ -123,6 +127,8 @@ lstrcatA(LPSTR lpString1, LPCSTR lpString2) Ret = strcat(lpString1, lpString2); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } _SEH2_END; return Ret; @@ -143,6 +149,8 @@ lstrlenA(LPCSTR lpString) Ret = strlen(lpString); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } _SEH2_END; return Ret; @@ -223,6 +231,8 @@ lstrcpynW(LPWSTR lpString1, LPCWSTR lpString2, int iMaxLength) Ret = lpString1; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } _SEH2_END; return Ret; @@ -243,6 +253,8 @@ lstrcpyW(LPWSTR lpString1, LPCWSTR lpString2) Ret = wcscpy(lpString1, lpString2); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } _SEH2_END; return Ret; @@ -263,6 +275,8 @@ lstrcatW(LPWSTR lpString1, LPCWSTR lpString2) Ret = wcscat(lpString1, lpString2); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } _SEH2_END; return Ret; @@ -283,6 +297,8 @@ lstrlenW(LPCWSTR lpString) Ret = wcslen(lpString); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } _SEH2_END; return Ret; From b1dcc588eb160adfd00ada30eda3ed31c8771d48 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Wed, 24 Jun 2009 19:53:06 +0000 Subject: [PATCH 084/577] fix crash while loading PowerPoint 2003 Viewer See issue #4624 for more details. svn path=/trunk/; revision=41598 --- reactos/dll/win32/gdi32/objects/dc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index 911fbff8271..ff3be454e46 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -36,7 +36,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver, } else { - if (lpwszDevice) // First + if ((lpwszDevice) && (wcslen(lpwszDevice) != 0)) // First { if (!_wcsnicmp(lpwszDevice, L"\\\\.\\DISPLAY",11)) Display = TRUE; RtlInitUnicodeString(&Device, lpwszDevice); From 5206a9089787186138bbc272f139cdf801b3874a Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Wed, 24 Jun 2009 19:53:54 +0000 Subject: [PATCH 085/577] stub NtSetThreadExecutionState needed by PowerPoint Viewer 2003 svn path=/trunk/; revision=41599 --- reactos/ntoskrnl/po/power.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/po/power.c b/reactos/ntoskrnl/po/power.c index 98768e34a52..6701ce2d9db 100644 --- a/reactos/ntoskrnl/po/power.c +++ b/reactos/ntoskrnl/po/power.c @@ -588,6 +588,16 @@ NTAPI NtSetThreadExecutionState(IN EXECUTION_STATE esFlags, OUT EXECUTION_STATE *PreviousFlags) { + static EXECUTION_STATE current = + ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_USER_PRESENT; + EXECUTION_STATE old = current; + UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + + if (!(current & ES_CONTINUOUS) || (esFlags & ES_CONTINUOUS)) + current = esFlags; + + *PreviousFlags = old; + + return STATUS_SUCCESS; } From 5d33bdc236a6dcde0d4f177c3ccf268240bf4e98 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 24 Jun 2009 21:57:48 +0000 Subject: [PATCH 086/577] - Fix a crash that happens when we are running at APC_LEVEL, acquire the recursive mutex (which improperly handled APC_LEVEL), then attempt to access paged pool (or do anything else that depends on Irql < DISPATCH_LEVEL) - Optimize the code for acquiring and releasing the recursive mutex at DISPATCH_LEVEL svn path=/trunk/; revision=41600 --- .../drivers/network/tcpip/recmutex/recmutex.c | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/reactos/drivers/network/tcpip/recmutex/recmutex.c b/reactos/drivers/network/tcpip/recmutex/recmutex.c index 0427a29664b..5951045cb3c 100644 --- a/reactos/drivers/network/tcpip/recmutex/recmutex.c +++ b/reactos/drivers/network/tcpip/recmutex/recmutex.c @@ -14,6 +14,7 @@ VOID RecursiveMutexInit( PRECURSIVE_MUTEX RecMutex ) { SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { NTSTATUS Status = STATUS_SUCCESS; PVOID CurrentThread = KeGetCurrentThread(); + KIRQL CurrentIrql; /* Wait for the previous user to unlock the RecMutex state. There might be * multiple waiters waiting to change the state. We need to check each @@ -27,9 +28,13 @@ SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { return TRUE; } - if( KeGetCurrentIrql() == PASSIVE_LEVEL ) { + CurrentIrql = KeGetCurrentIrql(); + + ASSERT(CurrentIrql <= DISPATCH_LEVEL); + + if( CurrentIrql <= APC_LEVEL ) { ExAcquireFastMutex( &RecMutex->Mutex ); - RecMutex->OldIrql = PASSIVE_LEVEL; + RecMutex->OldIrql = CurrentIrql; while( RecMutex->Locked ) { ExReleaseFastMutex( &RecMutex->Mutex ); Status = KeWaitForSingleObject( &RecMutex->StateLockedEvent, @@ -45,7 +50,8 @@ SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { RecMutex->LockCount++; ExReleaseFastMutex( &RecMutex->Mutex ); } else { - KeAcquireSpinLock( &RecMutex->SpinLock, &RecMutex->OldIrql ); + KeAcquireSpinLockAtDpcLevel( &RecMutex->SpinLock ); + RecMutex->OldIrql = DISPATCH_LEVEL; RecMutex->Locked = TRUE; RecMutex->Writer = ToWrite; RecMutex->CurrentThread = CurrentThread; @@ -56,14 +62,13 @@ SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { } VOID RecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) { - if( RecMutex->LockCount == 0 ) { - return; - } else - RecMutex->LockCount--; + + ASSERT(RecMutex->LockCount > 0); + RecMutex->LockCount--; if( !RecMutex->LockCount ) { RecMutex->CurrentThread = NULL; - if( RecMutex->OldIrql == PASSIVE_LEVEL ) { + if( RecMutex->OldIrql <= APC_LEVEL ) { ExAcquireFastMutex( &RecMutex->Mutex ); RecMutex->Locked = FALSE; RecMutex->Writer = FALSE; @@ -71,10 +76,9 @@ VOID RecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) { } else { RecMutex->Locked = FALSE; RecMutex->Writer = FALSE; - KeReleaseSpinLock( &RecMutex->SpinLock, RecMutex->OldIrql ); + KeReleaseSpinLockFromDpcLevel( &RecMutex->SpinLock ); } - RecMutex->OldIrql = PASSIVE_LEVEL; KePulseEvent( &RecMutex->StateLockedEvent, IO_NETWORK_INCREMENT, FALSE ); } From d01aa9d736855ab728c2f8245322086dbcce5e2b Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Wed, 24 Jun 2009 22:07:50 +0000 Subject: [PATCH 087/577] fix formatting svn path=/trunk/; revision=41601 --- .../drivers/network/tcpip/recmutex/recmutex.c | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/reactos/drivers/network/tcpip/recmutex/recmutex.c b/reactos/drivers/network/tcpip/recmutex/recmutex.c index 5951045cb3c..f1a54a6cc21 100644 --- a/reactos/drivers/network/tcpip/recmutex/recmutex.c +++ b/reactos/drivers/network/tcpip/recmutex/recmutex.c @@ -6,26 +6,26 @@ VOID RecursiveMutexInit( PRECURSIVE_MUTEX RecMutex ) { KeInitializeSpinLock( &RecMutex->SpinLock ); ExInitializeFastMutex( &RecMutex->Mutex ); KeInitializeEvent( &RecMutex->StateLockedEvent, - NotificationEvent, FALSE ); + NotificationEvent, FALSE ); } /* NOTE: When we leave, the FAST_MUTEX must have been released. The result - * is that we always exit in the same irql as entering */ +* is that we always exit in the same irql as entering */ SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { NTSTATUS Status = STATUS_SUCCESS; PVOID CurrentThread = KeGetCurrentThread(); KIRQL CurrentIrql; /* Wait for the previous user to unlock the RecMutex state. There might be - * multiple waiters waiting to change the state. We need to check each - * time we get the event whether somebody still has the state locked */ + * multiple waiters waiting to change the state. We need to check each + * time we get the event whether somebody still has the state locked */ if( !RecMutex ) return FALSE; if( CurrentThread == RecMutex->CurrentThread || - (!ToWrite && !RecMutex->Writer) ) { - RecMutex->LockCount++; - return TRUE; + (!ToWrite && !RecMutex->Writer) ) { + RecMutex->LockCount++; + return TRUE; } CurrentIrql = KeGetCurrentIrql(); @@ -33,29 +33,29 @@ SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { ASSERT(CurrentIrql <= DISPATCH_LEVEL); if( CurrentIrql <= APC_LEVEL ) { - ExAcquireFastMutex( &RecMutex->Mutex ); - RecMutex->OldIrql = CurrentIrql; - while( RecMutex->Locked ) { - ExReleaseFastMutex( &RecMutex->Mutex ); - Status = KeWaitForSingleObject( &RecMutex->StateLockedEvent, - UserRequest, - KernelMode, - FALSE, - NULL ); - ExAcquireFastMutex( &RecMutex->Mutex ); - } - RecMutex->Locked = TRUE; - RecMutex->Writer = ToWrite; - RecMutex->CurrentThread = CurrentThread; - RecMutex->LockCount++; - ExReleaseFastMutex( &RecMutex->Mutex ); + ExAcquireFastMutex( &RecMutex->Mutex ); + RecMutex->OldIrql = CurrentIrql; + while( RecMutex->Locked ) { + ExReleaseFastMutex( &RecMutex->Mutex ); + Status = KeWaitForSingleObject( &RecMutex->StateLockedEvent, + UserRequest, + KernelMode, + FALSE, + NULL ); + ExAcquireFastMutex( &RecMutex->Mutex ); + } + RecMutex->Locked = TRUE; + RecMutex->Writer = ToWrite; + RecMutex->CurrentThread = CurrentThread; + RecMutex->LockCount++; + ExReleaseFastMutex( &RecMutex->Mutex ); } else { - KeAcquireSpinLockAtDpcLevel( &RecMutex->SpinLock ); + KeAcquireSpinLockAtDpcLevel( &RecMutex->SpinLock ); RecMutex->OldIrql = DISPATCH_LEVEL; - RecMutex->Locked = TRUE; - RecMutex->Writer = ToWrite; - RecMutex->CurrentThread = CurrentThread; - RecMutex->LockCount++; + RecMutex->Locked = TRUE; + RecMutex->Writer = ToWrite; + RecMutex->CurrentThread = CurrentThread; + RecMutex->LockCount++; } return TRUE; @@ -67,20 +67,20 @@ VOID RecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) { RecMutex->LockCount--; if( !RecMutex->LockCount ) { - RecMutex->CurrentThread = NULL; - if( RecMutex->OldIrql <= APC_LEVEL ) { - ExAcquireFastMutex( &RecMutex->Mutex ); - RecMutex->Locked = FALSE; - RecMutex->Writer = FALSE; - ExReleaseFastMutex( &RecMutex->Mutex ); - } else { - RecMutex->Locked = FALSE; - RecMutex->Writer = FALSE; - KeReleaseSpinLockFromDpcLevel( &RecMutex->SpinLock ); - } + RecMutex->CurrentThread = NULL; + if( RecMutex->OldIrql <= APC_LEVEL ) { + ExAcquireFastMutex( &RecMutex->Mutex ); + RecMutex->Locked = FALSE; + RecMutex->Writer = FALSE; + ExReleaseFastMutex( &RecMutex->Mutex ); + } else { + RecMutex->Locked = FALSE; + RecMutex->Writer = FALSE; + KeReleaseSpinLockFromDpcLevel( &RecMutex->SpinLock ); + } - KePulseEvent( &RecMutex->StateLockedEvent, IO_NETWORK_INCREMENT, - FALSE ); + KePulseEvent( &RecMutex->StateLockedEvent, IO_NETWORK_INCREMENT, + FALSE ); } } From 1ef5fa35afbc14b05646802cf4b37de31b910889 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Wed, 24 Jun 2009 22:12:48 +0000 Subject: [PATCH 088/577] fix typo svn path=/trunk/; revision=41602 --- reactos/dll/win32/ws2_32_new/ws2_32.def | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/ws2_32_new/ws2_32.def b/reactos/dll/win32/ws2_32_new/ws2_32.def index b04ec26f37f..1468fb47211 100644 --- a/reactos/dll/win32/ws2_32_new/ws2_32.def +++ b/reactos/dll/win32/ws2_32_new/ws2_32.def @@ -9,7 +9,7 @@ WSAAccept@20 @29 WSAAddressToStringA@20 @30 WSAAddressToStringW@20 @31 WSAAsyncGetHostByAddr@28 @102 -WSAAsyncGetHostByNam@20e @103 +WSAAsyncGetHostByName@20 @103 WSAAsyncGetProtoByName@20 @105 WSAAsyncGetProtoByNumber@20 @104 WSAAsyncGetServByName@24 @107 From 8101b8e12f6d35779d66e06c7b7b8b44123c4bab Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Wed, 24 Jun 2009 22:23:29 +0000 Subject: [PATCH 089/577] Hack: partially undo r38510 changes to overcome regression (bug #4169). svn path=/trunk/; revision=41603 --- reactos/ntoskrnl/se/semgr.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index e20c219dd0d..b0ee9889d6b 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -638,7 +638,7 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, PTOKEN Token; NTSTATUS Status; PAGED_CODE(); - + /* Check if this is kernel mode */ if (PreviousMode == KernelMode) { @@ -654,7 +654,7 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, /* Just give the desired access */ *GrantedAccess = DesiredAccess; } - + /* Success */ *AccessStatus = STATUS_SUCCESS; return STATUS_SUCCESS; @@ -688,24 +688,32 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, SubjectSecurityContext.ProcessAuditId = NULL; SeLockSubjectContext(&SubjectSecurityContext); + /* FIXME */ /* Now perform the access check */ - SeAccessCheck(SecurityDescriptor, - &SubjectSecurityContext, - TRUE, - DesiredAccess, - 0, - &PrivilegeSet, //FIXME - GenericMapping, - PreviousMode, - GrantedAccess, - AccessStatus); + if (SeAccessCheck(SecurityDescriptor, + &SubjectSecurityContext, + TRUE, + DesiredAccess, + 0, + &PrivilegeSet, //FIXME + GenericMapping, + PreviousMode, + GrantedAccess, + AccessStatus)) + { + Status = *AccessStatus; + } + else + { + Status = STATUS_ACCESS_DENIED; + } /* Unlock subject context and dereference the token */ SeUnlockSubjectContext(&SubjectSecurityContext); ObDereferenceObject(Token); - /* Check succeeded */ - return STATUS_SUCCESS; + /* Check succeeded? */ + return Status; } From 68ccd5f6e47c18c511fc19e9488049547448e12d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 25 Jun 2009 02:43:38 +0000 Subject: [PATCH 090/577] Rewrite (NtUser)SystemParametersInfo and related. - Instead of getting the data from the window station and other strange places, the values are now mostly stored in a global variable. This is possible because NtUserSystemParametersInfo should fail anyway when being called from a non-interactive windowstation (tested on windows XP). - WM_SETTINGCHANGE is now properly sent not posted to all toplevel Windows also passing the registry string as the lParam value (strings could need some testing). - SystemMetrics are now set and updated from system parameters. - Most values are now properly loaded from registry and also saved. - user32_winetest sysparams: before: 634 executed / 235 failures, after: 1093 executed, 11 failures - Fixes the non-bold caption font in 2nd stage. - Implements a number SPI codes. - Implements helper functions for registry and file access Thanks to all testers for all the regression testing :) See issue #4595 for more details. svn path=/trunk/; revision=41604 --- reactos/base/system/userinit/userinit.c | 153 +- reactos/dll/win32/user32/misc/desktop.c | 194 +- reactos/include/psdk/winuser.h | 93 +- .../win32/win32k/include/cursoricon.h | 12 +- .../subsystems/win32/win32k/include/misc.h | 19 +- .../subsystems/win32/win32k/include/monitor.h | 15 + .../win32/win32k/include/sysparams.h | 180 + .../subsystems/win32/win32k/include/win32k.h | 1 + .../subsystems/win32/win32k/include/winsta.h | 1 - reactos/subsystems/win32/win32k/misc/file.c | 356 ++ .../subsystems/win32/win32k/misc/registry.c | 206 ++ .../subsystems/win32/win32k/ntuser/input.c | 16 +- .../subsystems/win32/win32k/ntuser/metric.c | 250 +- reactos/subsystems/win32/win32k/ntuser/misc.c | 23 +- .../subsystems/win32/win32k/ntuser/ntstubs.c | 38 - .../subsystems/win32/win32k/ntuser/ntuser.c | 85 + .../subsystems/win32/win32k/ntuser/painting.c | 4 +- .../win32/win32k/ntuser/simplecall.c | 21 +- .../win32/win32k/ntuser/sysparams.c | 2898 ++++++++--------- .../subsystems/win32/win32k/ntuser/winsta.c | 37 +- reactos/subsystems/win32/win32k/win32k.rbuild | 2 + 21 files changed, 2527 insertions(+), 2077 deletions(-) create mode 100644 reactos/subsystems/win32/win32k/include/sysparams.h create mode 100644 reactos/subsystems/win32/win32k/misc/file.c create mode 100644 reactos/subsystems/win32/win32k/misc/registry.c diff --git a/reactos/base/system/userinit/userinit.c b/reactos/base/system/userinit/userinit.c index e9b3e6480c8..2e14ce3aed0 100644 --- a/reactos/base/system/userinit/userinit.c +++ b/reactos/base/system/userinit/userinit.c @@ -401,99 +401,10 @@ VOID SetUserSysColors(VOID) RegCloseKey(hKey); } -static -VOID LoadUserFontSetting( - IN LPWSTR lpValueName, - OUT PLOGFONTW pFont) -{ - HKEY hKey; - LOGFONTW lfTemp; - DWORD Type, Size; - LONG rc; +DWORD +WINAPI +UpdatePerUserSystemParameters(DWORD dw1, BOOL bEnable); - TRACE("(%s, %p)\n", debugstr_w(lpValueName), pFont); - - Size = sizeof(LOGFONTW); - rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_METRICS, - 0, KEY_QUERY_VALUE, &hKey); - if (rc != ERROR_SUCCESS) - { - WARN("RegOpenKeyEx() failed with error %lu\n", rc); - return; - } - rc = RegQueryValueEx(hKey, lpValueName, NULL, &Type, (LPBYTE)&lfTemp, &Size); - if (rc != ERROR_SUCCESS || Type != REG_BINARY) - { - WARN("RegQueryValueEx() failed with error %lu\n", rc); - return; - } - RegCloseKey(hKey); - /* FIXME: Check if lfTemp is a valid font */ - *pFont = lfTemp; -} - -static -VOID LoadUserMetricSetting( - IN LPWSTR lpValueName, - OUT INT *pValue) -{ - HKEY hKey; - DWORD Type, Size; - WCHAR strValue[8]; - LONG rc; - - TRACE("(%s, %p)\n", debugstr_w(lpValueName), pValue); - - Size = sizeof(strValue); - rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_METRICS, - 0, KEY_QUERY_VALUE, &hKey); - if (rc != ERROR_SUCCESS) - { - WARN("RegOpenKeyEx() failed with error %lu\n", rc); - return; - } - rc = RegQueryValueEx(hKey, lpValueName, NULL, &Type, (LPBYTE)&strValue, &Size); - if (rc != ERROR_SUCCESS || Type != REG_SZ) - { - WARN("RegQueryValueEx() failed with error %lu\n", rc); - return; - } - RegCloseKey(hKey); - *pValue = StrToInt(strValue); -} - -static -VOID SetUserMetrics(VOID) -{ - NONCLIENTMETRICSW ncmetrics; - MINIMIZEDMETRICS mmmetrics; - - TRACE("()\n"); - - ncmetrics.cbSize = sizeof(NONCLIENTMETRICSW); - mmmetrics.cbSize = sizeof(MINIMIZEDMETRICS); - SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncmetrics, 0); - SystemParametersInfoW(SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &mmmetrics, 0); - - LoadUserFontSetting(L"CaptionFont", &ncmetrics.lfCaptionFont); - LoadUserFontSetting(L"SmCaptionFont", &ncmetrics.lfSmCaptionFont); - LoadUserFontSetting(L"MenuFont", &ncmetrics.lfMenuFont); - LoadUserFontSetting(L"StatusFont", &ncmetrics.lfStatusFont); - LoadUserFontSetting(L"MessageFont", &ncmetrics.lfMessageFont); - /* FIXME: load icon font ? */ - - LoadUserMetricSetting(L"BorderWidth", &ncmetrics.iBorderWidth); - LoadUserMetricSetting(L"ScrollWidth", &ncmetrics.iScrollWidth); - LoadUserMetricSetting(L"ScrollHeight", &ncmetrics.iScrollHeight); - LoadUserMetricSetting(L"CaptionWidth", &ncmetrics.iCaptionWidth); - LoadUserMetricSetting(L"CaptionHeight", &ncmetrics.iCaptionHeight); - LoadUserMetricSetting(L"SmCaptionWidth", &ncmetrics.iSmCaptionWidth); - LoadUserMetricSetting(L"SmCaptionHeight", &ncmetrics.iSmCaptionHeight); - LoadUserMetricSetting(L"Menuwidth", &ncmetrics.iMenuWidth); - LoadUserMetricSetting(L"MenuHeight", &ncmetrics.iMenuHeight); - - SystemParametersInfoW(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncmetrics, 0); -} static VOID SetUserWallpaper(VOID) @@ -536,61 +447,6 @@ VOID SetUserWallpaper(VOID) WARN("RegOpenKeyEx() failed with error %lu\n", rc); } -static VOID SetUserPreference(UINT uiAction,BOOL bValue,UINT fWinIni) -{ - DWORD dwvalue = bValue; - SystemParametersInfo(uiAction, 0, (PVOID)&dwvalue, fWinIni); -} - -static VOID SetUserPreferences(VOID) -{ - HKEY hKey; - DWORD Type, Size; - LONG rc; - USERPREFERENCESMASK Preferences; - - TRACE("()\n"); - - rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_DESKTOP, - 0, KEY_QUERY_VALUE, &hKey); - if (rc == ERROR_SUCCESS) - { - Size = sizeof(USERPREFERENCESMASK); - ERR("USERPREFERENCESMASK size: %d\n",Size); - - rc = RegQueryValueEx(hKey, - L"UserPreferencesMask", - NULL, - &Type, - (LPBYTE)&Preferences, - &Size); - if (rc == ERROR_SUCCESS && Type == REG_BINARY) - { - SetUserPreference(SPI_SETUIEFFECTS, Preferences.bUiEffects, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETACTIVEWINDOWTRACKING, Preferences.bActiveWindowTracking, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETMENUANIMATION, Preferences.bMenuAnimation, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETCOMBOBOXANIMATION, Preferences.bComboBoxAnimation, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETLISTBOXSMOOTHSCROLLING, Preferences.bListBoxSmoothScrolling, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETGRADIENTCAPTIONS, Preferences.bGradientCaptions, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETKEYBOARDCUES, Preferences.bKeyboardCues, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETACTIVEWNDTRKZORDER, Preferences.bActiveWndTrkZorder, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETHOTTRACKING, Preferences.bHotTracking, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETMENUFADE, Preferences.bMenuFade, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETSELECTIONFADE, Preferences.bSelectionFade, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETTOOLTIPANIMATION, Preferences.bTooltipAnimation, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETTOOLTIPFADE, Preferences.bTooltipFade, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETCURSORSHADOW, Preferences.bCursorShadow, SPIF_SENDCHANGE); - } - else - { - ERR("No User Preferences set in registry or incorrect type (error %lu)\n", rc); - } - RegCloseKey(hKey); - } - else - WARN("RegOpenKeyEx() failed with error %lu\n", rc); -} - static VOID PlayLogonSound() { @@ -641,10 +497,9 @@ VOID SetUserSettings(VOID) { TRACE("()\n"); + UpdatePerUserSystemParameters(1, TRUE); SetUserSysColors(); - SetUserMetrics(); SetUserWallpaper(); - SetUserPreferences(); } typedef DWORD (WINAPI *PCMP_REPORT_LOGON)(DWORD, DWORD); diff --git a/reactos/dll/win32/user32/misc/desktop.c b/reactos/dll/win32/user32/misc/desktop.c index c3eb8266530..fbf519987a5 100644 --- a/reactos/dll/win32/user32/misc/desktop.c +++ b/reactos/dll/win32/user32/misc/desktop.c @@ -124,15 +124,6 @@ SystemParametersInfoA(UINT uiAction, { switch (uiAction) { - case SPI_GETHIGHCONTRAST: - case SPI_SETHIGHCONTRAST: - case SPI_GETSOUNDSENTRY: - case SPI_SETSOUNDSENTRY: - { - /* FIXME: Support this accessibility SPI actions */ - FIXME("FIXME: Unsupported SPI Code: %lx \n",uiAction ); - return FALSE; - } case SPI_GETNONCLIENTMETRICS: { @@ -248,88 +239,40 @@ SystemParametersInfoA(UINT uiAction, } case SPI_GETDESKWALLPAPER: { - HKEY hKey; - BOOL Ret = FALSE; + BOOL Ret; + WCHAR awc[MAX_PATH]; + UNICODE_STRING ustrWallpaper; + ANSI_STRING astrWallpaper; -#if 0 - /* Get the desktop bitmap handle, this does NOT return the file name! */ - if(!NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, 0)) - { - /* Return an empty string, no wallpapaper is set */ - *(CHAR*)pvParam = '\0'; - return TRUE; - } -#endif + Ret = NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, awc, fWinIni); + RtlInitUnicodeString(&ustrWallpaper, awc); + RtlUnicodeStringToAnsiString(&astrWallpaper, &ustrWallpaper, TRUE); - /* FIXME - Read the registry key for now, but what happens if the wallpaper was - changed without SPIF_UPDATEINIFILE?! */ - if(RegOpenKeyExW(HKEY_CURRENT_USER, - L"Control Panel\\Desktop", - 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) - { - DWORD Type, Size; - Size = uiParam; - if(RegQueryValueExA(hKey, - "Wallpaper", - NULL, - &Type, - (LPBYTE)pvParam, - &Size) == ERROR_SUCCESS - && Type == REG_SZ) - { - Ret = TRUE; - } - RegCloseKey(hKey); - } + RtlCopyMemory(pvParam, astrWallpaper.Buffer, uiParam); + RtlFreeAnsiString(&astrWallpaper); return Ret; } + case SPI_SETDESKWALLPAPER: { - HBITMAP hNewWallpaper; - BOOL Ret; - LPSTR lpWallpaper = (LPSTR)pvParam; + NTSTATUS Status; + UNICODE_STRING ustrWallpaper; + BOOL Ret; - if(lpWallpaper != NULL && *lpWallpaper != '\0') - { - hNewWallpaper = LoadImageA(0, lpWallpaper, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); - if(hNewWallpaper == NULL) + if (pvParam) { - return FALSE; + Status = RtlCreateUnicodeStringFromAsciiz(&ustrWallpaper, pvParam); + if (!NT_SUCCESS(Status)) + { + ERR("Status = 0x%x\n", Status); + return FALSE; + } + pvParam = &ustrWallpaper; } - } - else - { - hNewWallpaper = NULL; - lpWallpaper = NULL; - } - /* Set the wallpaper bitmap */ - if(!NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallpaper, fWinIni & SPIF_SENDCHANGE)) - { - if(hNewWallpaper != NULL) - DeleteObject(hNewWallpaper); - return FALSE; - } - /* Do not use the bitmap handle anymore, it doesn't belong to our process anymore! */ - - Ret = TRUE; - if(fWinIni & SPIF_UPDATEINIFILE) - { - /* Save the path to the file in the registry */ - HKEY hKey; - if(RegOpenKeyExW(HKEY_CURRENT_USER, - L"Control Panel\\Desktop", - 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) - { - Ret = RegSetValueExA(hKey, "Wallpaper", 0, REG_SZ, (LPBYTE)(lpWallpaper != NULL ? lpWallpaper : ""), - (lpWallpaper != NULL ? (lstrlenA(lpWallpaper) + 1) * sizeof(CHAR) : sizeof(CHAR)) == ERROR_SUCCESS); - RegCloseKey(hKey); - } - } - - RedrawWindow(GetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE); - - return Ret; + Ret = NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, uiParam, pvParam, fWinIni); + RtlFreeUnicodeString(&ustrWallpaper); + return Ret; } } return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); @@ -347,97 +290,14 @@ SystemParametersInfoW(UINT uiAction, { switch(uiAction) { - case SPI_GETHIGHCONTRAST: - case SPI_SETHIGHCONTRAST: - case SPI_GETSOUNDSENTRY: - case SPI_SETSOUNDSENTRY: - { - /* FIXME: Support this accessibility SPI actions */ - FIXME("FIXME: Unsupported SPI Code: %lx \n",uiAction ); - return FALSE; - } - case SPI_GETDESKWALLPAPER: - { - HKEY hKey; - BOOL Ret = FALSE; -#if 0 - /* Get the desktop bitmap handle, this does NOT return the file name! */ - if(!NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, 0)) - { - /* Return an empty string, no wallpapaper is set */ - *(WCHAR*)pvParam = L'\0'; - return TRUE; - } -#endif - - /* FIXME - Read the registry key for now, but what happens if the wallpaper was - changed without SPIF_UPDATEINIFILE?! */ - if(RegOpenKeyExW(HKEY_CURRENT_USER, - L"Control Panel\\Desktop", - 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) - { - DWORD Type, Size; - Size = uiParam * sizeof(WCHAR); - if(RegQueryValueExW(hKey, - L"Wallpaper", - NULL, - &Type, - (LPBYTE)pvParam, - &Size) == ERROR_SUCCESS - && Type == REG_SZ) - { - Ret = TRUE; - } - RegCloseKey(hKey); - } - return Ret; - } case SPI_SETDESKWALLPAPER: - { - HBITMAP hNewWallpaper; - BOOL Ret; - LPWSTR lpWallpaper = (LPWSTR)pvParam; - - if(lpWallpaper != NULL && *lpWallpaper != L'\0') { - hNewWallpaper = LoadImageW(0, lpWallpaper, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); + UNICODE_STRING ustrWallpaper; - if(hNewWallpaper == NULL) - { - return FALSE; - } + RtlInitUnicodeString(&ustrWallpaper, pvParam); + return NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, uiParam, &ustrWallpaper, fWinIni); } - else - { - hNewWallpaper = NULL; - lpWallpaper = NULL; - } - - /* Set the wallpaper bitmap */ - if(!NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallpaper, fWinIni & SPIF_SENDCHANGE)) - return FALSE; - /* Do not use the bitmap handle anymore, it doesn't belong to our process anymore! */ - Ret = TRUE; - if(fWinIni & SPIF_UPDATEINIFILE) - { - /* Save the path to the file in the registry */ - HKEY hKey; - - if(RegOpenKeyExW(HKEY_CURRENT_USER, - L"Control Panel\\Desktop", - 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) - { - Ret = (RegSetValueExW(hKey, L"Wallpaper", 0, REG_SZ, (lpWallpaper != NULL ? (LPBYTE)lpWallpaper : (LPBYTE)L""), - (lpWallpaper != NULL ? (lstrlenW(lpWallpaper) + 1) * sizeof(WCHAR) : sizeof(WCHAR))) == ERROR_SUCCESS); - RegCloseKey(hKey); - } - } - - RedrawWindow(GetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE); - - return Ret; - } } return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); } diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index 0139bcc93bc..fa4190852e5 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -1334,21 +1334,6 @@ extern "C" { #define SPI_SETICONTITLELOGFONT 0x0022 #define SPI_GETFASTTASKSWITCH 0x0023 #define SPI_SETFASTTASKSWITCH 0x0024 -#define SPI_GETFILTERKEYS 0x0032 -#define SPI_SETFILTERKEYS 0x0033 -#define SPI_GETTOGGLEKEYS 0x0034 -#define SPI_SETTOGGLEKEYS 0x0035 -#define SPI_GETMOUSEKEYS 0x0036 -#define SPI_SETMOUSEKEYS 0x0037 -#define SPI_GETSHOWSOUNDS 0x0038 -#define SPI_SETSHOWSOUNDS 0x0039 -#define SPI_GETSTICKYKEYS 0x003A -#define SPI_SETSTICKYKEYS 0x003B -#define SPI_GETACCESSTIMEOUT 0x003C -#define SPI_SETACCESSTIMEOUT 0x003D -#define SPI_GETSOUNDSENTRY 0x0040 -#define SPI_SETSOUNDSENTRY 0x0041 - #if(WINVER >= 0x0400) #define SPI_SETDRAGFULLWINDOWS 0x0025 #define SPI_GETDRAGFULLWINDOWS 0x0026 @@ -1361,6 +1346,26 @@ extern "C" { #define SPI_SETWORKAREA 0x002F #define SPI_GETWORKAREA 0x0030 #define SPI_SETPENWINDOWS 0x0031 +#endif +#define SPI_GETFILTERKEYS 0x0032 +#define SPI_SETFILTERKEYS 0x0033 +#define SPI_GETTOGGLEKEYS 0x0034 +#define SPI_SETTOGGLEKEYS 0x0035 +#define SPI_GETMOUSEKEYS 0x0036 +#define SPI_SETMOUSEKEYS 0x0037 +#define SPI_GETSHOWSOUNDS 0x0038 +#define SPI_SETSHOWSOUNDS 0x0039 +#define SPI_GETSTICKYKEYS 0x003A +#define SPI_SETSTICKYKEYS 0x003B +#define SPI_GETACCESSTIMEOUT 0x003C +#define SPI_SETACCESSTIMEOUT 0x003D +#if(WINVER >= 0x0400) + #define SPI_GETSERIALKEYS 0x003E + #define SPI_SETSERIALKEYS 0x003F +#endif +#define SPI_GETSOUNDSENTRY 0x0040 +#define SPI_SETSOUNDSENTRY 0x0041 +#if(WINVER >= 0x0400) #define SPI_GETHIGHCONTRAST 0x0042 #define SPI_SETHIGHCONTRAST 0x0043 #define SPI_GETKEYBOARDPREF 0x0044 @@ -1390,17 +1395,15 @@ extern "C" { #define SPI_GETWINDOWSEXTENSION 0x005C #define SPI_SETMOUSETRAILS 0x005D #define SPI_GETMOUSETRAILS 0x005E - #define SPI_SCREENSAVERRUNNING 0x0061 - #define SPI_SETSCREENSAVERRUNNING SPI_SCREENSAVERRUNNING - #define SPI_GETSERIALKEYS 0x003E - #define SPI_SETSERIALKEYS 0x003F #endif - #if(_WIN32_WINNT >= 0x0400) #define SPI_GETSNAPTODEFBUTTON 0x005F #define SPI_SETSNAPTODEFBUTTON 0x0060 #endif - +#if(WINVER >= 0x0400) + #define SPI_SCREENSAVERRUNNING 0x0061 + #define SPI_SETSCREENSAVERRUNNING SPI_SCREENSAVERRUNNING +#endif #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) #define SPI_GETMOUSEHOVERWIDTH 0x0062 #define SPI_SETMOUSEHOVERWIDTH 0x0063 @@ -1412,20 +1415,25 @@ extern "C" { #define SPI_SETWHEELSCROLLLINES 0x0069 #define SPI_GETMENUSHOWDELAY 0x006A #define SPI_SETMENUSHOWDELAY 0x006B + #if (_WIN32_WINNT >= 0x0600) + #define SPI_GETWHEELSCROLLCHARS 0x006C + #define SPI_SETWHEELSCROLLCHARS 0x006D + #endif #define SPI_GETSHOWIMEUI 0x006E #define SPI_SETSHOWIMEUI 0x006F - /* Correct ? */ - #define SPI_GETWHEELSCROLLCHARS 0x006C - #define SPI_SETWHEELSCROLLCHARS 0x006D #endif - #if(WINVER >= 0x0500) #define SPI_GETMOUSESPEED 0x0070 #define SPI_SETMOUSESPEED 0x0071 #define SPI_GETSCREENSAVERRUNNING 0x0072 #define SPI_GETDESKWALLPAPER 0x0073 #endif - +#if(WINVER >= 0x0600) + #define SPI_GETAUDIODESCRIPTION 0x0074 + #define SPI_SETAUDIODESCRIPTION 0x0075 + #define SPI_GETSCREENSAVESECURE 0x0076 + #define SPI_SETSCREENSAVESECURE 0x0077 +#endif #if(WINVER >= 0x0500) #define SPI_GETACTIVEWINDOWTRACKING 0x1000 #define SPI_SETACTIVEWINDOWTRACKING 0x1001 @@ -1455,17 +1463,6 @@ extern "C" { #define SPI_SETTOOLTIPFADE 0x1019 #define SPI_GETCURSORSHADOW 0x101A #define SPI_SETCURSORSHADOW 0x101B - #define SPI_GETUIEFFECTS 0x103E - #define SPI_SETUIEFFECTS 0x103F - #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000 - #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001 - #define SPI_GETACTIVEWNDTRKTIMEOUT 0x2002 - #define SPI_SETACTIVEWNDTRKTIMEOUT 0x2003 - #define SPI_GETFOREGROUNDFLASHCOUNT 0x2004 - #define SPI_SETFOREGROUNDFLASHCOUNT 0x2005 - #define SPI_GETCARETWIDTH 0x2006 - #define SPI_SETCARETWIDTH 0x2007 - #if(_WIN32_WINNT >= 0x0501) #define SPI_GETMOUSESONAR 0x101C #define SPI_SETMOUSESONAR 0x101D @@ -1480,13 +1477,31 @@ extern "C" { #define SPI_GETBLOCKSENDINPUTRESETS 0x1026 #define SPI_SETBLOCKSENDINPUTRESETS 0x1027 #endif - + #define SPI_GETUIEFFECTS 0x103E + #define SPI_SETUIEFFECTS 0x103F + #if(_WIN32_WINNT >= 0x0600) + #define SPI_GETDISABLEOVERLAPPEDCONTENT 0x1040 + #define SPI_SETDISABLEOVERLAPPEDCONTENT 0x1041 + #define SPI_GETCLIENTAREAANIMATION 0x1042 + #define SPI_SETCLIENTAREAANIMATION 0x1043 + #define SPI_GETCLEARTYPE 0x1048 + #define SPI_SETCLEARTYPE 0x1049 + #define SPI_GETSPEECHRECOGNITION 0x104A + #define SPI_SETSPEECHRECOGNITION 0x104B + #endif + #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000 + #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001 + #define SPI_GETACTIVEWNDTRKTIMEOUT 0x2002 + #define SPI_SETACTIVEWNDTRKTIMEOUT 0x2003 + #define SPI_GETFOREGROUNDFLASHCOUNT 0x2004 + #define SPI_SETFOREGROUNDFLASHCOUNT 0x2005 + #define SPI_GETCARETWIDTH 0x2006 + #define SPI_SETCARETWIDTH 0x2007 #if(_WIN32_WINNT >= 0x0501) #define SPI_GETMOUSECLICKLOCKTIME 0x2008 #define SPI_SETMOUSECLICKLOCKTIME 0x2009 #define SPI_GETFONTSMOOTHINGTYPE 0x200A #define SPI_SETFONTSMOOTHINGTYPE 0x200B - #define SPI_GETFONTSMOOTHINGCONTRAST 0x200C #define SPI_SETFONTSMOOTHINGCONTRAST 0x200D #define SPI_GETFOCUSBORDERWIDTH 0x200E diff --git a/reactos/subsystems/win32/win32k/include/cursoricon.h b/reactos/subsystems/win32/win32k/include/cursoricon.h index 5335150b7f8..1e9bd2346e5 100644 --- a/reactos/subsystems/win32/win32k/include/cursoricon.h +++ b/reactos/subsystems/win32/win32k/include/cursoricon.h @@ -41,14 +41,14 @@ typedef struct _CURSORACCELERATION_INFO typedef struct _SYSTEM_CURSORINFO { BOOL Enabled; - BOOL SwapButtons; + BOOL SwapButtons;// UINT ButtonsDown; CURSORCLIP_INFO CursorClipInfo; PCURICON_OBJECT CurrentCursorObject; - UINT WheelScroLines; - UINT WheelScroChars; +// UINT WheelScroLines; +// UINT WheelScroChars; BYTE ShowingCursor; - UINT DblClickSpeed; + UINT DblClickSpeed;// UINT DblClickWidth; UINT DblClickHeight; @@ -56,8 +56,8 @@ typedef struct _SYSTEM_CURSORINFO UINT MouseHoverWidth; UINT MouseHoverHeight; - UINT MouseSpeed; - CURSORACCELERATION_INFO CursorAccelerationInfo; +// UINT MouseSpeed; +// CURSORACCELERATION_INFO CursorAccelerationInfo; DWORD LastBtnDown; LONG LastBtnDownX; diff --git a/reactos/subsystems/win32/win32k/include/misc.h b/reactos/subsystems/win32/win32k/include/misc.h index 776e940ec82..d40354c5149 100644 --- a/reactos/subsystems/win32/win32k/include/misc.h +++ b/reactos/subsystems/win32/win32k/include/misc.h @@ -54,10 +54,27 @@ extern HGDIOBJ StockObjects[]; extern SHORT gusLanguageID; SHORT FASTCALL IntGdiGetLanguageID(); -ULONG FASTCALL IntSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni); DWORD APIENTRY IntGetQueueStatus(BOOL ClearChanges); VOID FASTCALL IntUserManualGuiCheck(LONG Check); PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *); VOID APIENTRY HackUnsecureVirtualMemory(IN PVOID); +BOOL +NTAPI +RegReadUserSetting( + IN PCWSTR pwszKeyName, + IN PCWSTR pwszValueName, + IN ULONG ulType, + OUT PVOID pvData, + IN ULONG cbDataSize); + +BOOL +NTAPI +RegWriteUserSetting( + IN PCWSTR pwszKeyName, + IN PCWSTR pwszValueName, + IN ULONG ulType, + OUT PVOID pvData, + IN ULONG cbDataSize); + #endif /* __WIN32K_MISC_H */ diff --git a/reactos/subsystems/win32/win32k/include/monitor.h b/reactos/subsystems/win32/win32k/include/monitor.h index edf2c8edc32..e5ebae7e962 100644 --- a/reactos/subsystems/win32/win32k/include/monitor.h +++ b/reactos/subsystems/win32/win32k/include/monitor.h @@ -14,6 +14,21 @@ typedef struct _MONITOR_OBJECT PDEVOBJ *GdiDevice; /* pointer to the GDI device to which this monitor is attached */ struct _MONITOR_OBJECT *Prev, *Next; /* doubly linked list */ + + // This is the structure Windows uses: +// HEAD head; +// struct _MONITOR_OBJECT *pMonitorNext; +// DWORD dwMONFlags; + RECT rcMonitor; + RECT rcWork; +// HRGN hrgnMonitor; +// SHORT Spare0; +// SHORT cWndStack; +// HDEV hDev; +// HDEV hDevReal; +// BYTE DockTargets[4][7]; +// struct _MONITOR_OBJECT* Flink; +// struct _MONITOR_OBJECT* Blink; } MONITOR_OBJECT, *PMONITOR_OBJECT; /* functions */ diff --git a/reactos/subsystems/win32/win32k/include/sysparams.h b/reactos/subsystems/win32/win32k/include/sysparams.h new file mode 100644 index 00000000000..d8761d7c908 --- /dev/null +++ b/reactos/subsystems/win32/win32k/include/sysparams.h @@ -0,0 +1,180 @@ +#ifndef _WIN32K_SYSPARAMS_H +#define _WIN32K_SYSPARAMS_H + +#include "cursoricon.h" + +// create one struct +// make usable for different users (multiple structs!) + +#define SPI_TABLE1_MIN 1 +#define SPI_TABLE1_MAX 119 +#define SPI_TABLE2_MIN 4096 +#define SPI_TABLE2_MAX 4171 +#define SPI_TABLE3_MIN 8192 +#define SPI_TABLE3_MAX 8215 + +#define SPIF_PROTECT 0x80000 + +enum +{ + UPM_ACTIVEWINDOWTRACKING = 0x01, + UPM_MENUANIMATION = 0x02, + UPM_COMBOBOXANIMATION = 0x04, + UPM_LISTBOXSMOOTHSCROLLING = 0x08, + UPM_GRADIENTCAPTIONS = 0x10, + UPM_KEYBOARDCUES = 0x20, + UPM_ACTIVEWNDTRKZORDER = 0x40, + UPM_HOTTRACKING = 0x80, + UPM_RESERVED = 0x100, + UPM_MENUFADE = 0x200, + UPM_SELECTIONFADE = 0x400, + UPM_TOOLTIPANIMATION = 0x800, + UPM_TOOLTIPFADE = 0x1000, + UPM_CURSORSHADOW = 0x2000, + // room for more + UPM_UIEFFECTS = 0x80000000, + UPM_DEFAULT = 0x80003E9E +} USERPREFMASKS; + +typedef struct _SPIVALUES +{ + /* Metrics */ + NONCLIENTMETRICSW ncm; + MINIMIZEDMETRICS mm; + ICONMETRICSW im; + UINT uiFocusBorderWidth; + UINT uiFocusBorderHeight; + + /* Accessability */ + ACCESSTIMEOUT accesstimeout; + HIGHCONTRAST highcontrast; + BOOL bScreenReader; +#if(WINVER >= 0x0600) + AUDIODESCRIPTION audiodescription; + BOOL bClientAreaAnimation; + BOOL bDisableOverlappedContent; + ULONG ulMsgDuration; + BOOL bSpeechRecognition; +#endif + + /* Sound */ + SOUNDSENTRY soundsentry; + BOOL bShowSounds; + BOOL bBeep; + + /* Mouse */ + CURSORACCELERATION_INFO caiMouse; + MOUSEKEYS mousekeys; + BOOL bMouseClickLock; + DWORD dwMouseClickLockTime; + BOOL bMouseSonar; + BOOL bMouseVanish; + BOOL bMouseBtnSwap; + BOOL bSmoothScrolling; + INT iMouseSpeed; + INT iMouseHoverWidth; + INT iMouseHoverHeight; + INT iMouseHoverTime; + INT iDblClickWidth; + INT iDblClickHeight; + INT iDblClickTime; + INT iDragWidth; + INT iDragHeight; + INT iMouseTrails; + INT iWheelScrollLines; +#if (_WIN32_WINNT >= 0x0600) + UINT uiWheelScrollChars; +#endif + + /* Keyboard */ + FILTERKEYS filterkeys; + SERIALKEYS serialkeys; + STICKYKEYS stickykeys; + TOGGLEKEYS togglekeys; + DWORD dwKbdSpeed; + BOOL bKbdPref; + HKL hklDefInputLang; + INT iKbdDelay; + + /* Screen saver */ + INT iScrSaverTimeout; + BOOL bScrSaverActive; + BOOL bScrSaverRunning; +#if(WINVER >= 0x0600) + BOOL bScrSaverSecure; +#endif + + /* Power */ + INT iLowPwrTimeout; + INT iPwrOffTimeout; + BOOL bLowPwrActive; + BOOL bPwrOffActive; + + /* UI Effects */ + DWORD dwUserPrefMask; + BOOL bFontSmoothing; + UINT uiFontSmoothingType; + UINT uiFontSmoothingContrast; + UINT uiFontSmoothingOrientation; + BOOL bDragFullWindows; + BOOL bMenuDropAlign; + BOOL bFlatMenu; + DWORD dwMenuShowDelay; + BOOL bDropShadow; + BOOL bBlockSendInputResets; +#if(_WIN32_WINNT >= 0x0600) + BOOL bClearType; +#endif + + /* Text metrics */ + TEXTMETRICW tmMenuFont; + TEXTMETRICW tmCaptionFont; + + BOOL bHandHeld; + BOOL bFastTaskSwitch; + UINT uiGridGranularity; + UNICODE_STRING ustrWallpaper; + WCHAR awcWallpaper[MAX_PATH]; + + ANIMATIONINFO animationinfo; + BOOL bSnapToDefBtn; + BOOL bShowImeUi; + DWORD dwForegroundLockTimeout; + DWORD dwActiveTrackingTimeout; + DWORD dwForegroundFlashCount; + DWORD dwCaretWidth; + +// SPI_LANGDRIVER +// SPI_SETDESKPATTERN +// SPI_SETPENWINDOWS +// SPI_SETCURSORS +// SPI_SETICONS +// SPI_SETLANGTOGGLE +// SPI_GETWINDOWSEXTENSION + +} SPIVALUES, *PSPIVALUES; + +typedef union _SPIBUFFER +{ + char ach[1]; + WCHAR awcWallpaper[MAX_PATH+1]; + FILTERKEYS fiterkeys; + TOGGLEKEYS togglekeys; + MOUSEKEYS mousekeys; + STICKYKEYS stickykeys; + ACCESSTIMEOUT accesstimeout; + SERIALKEYS serialkeys; + SOUNDSENTRY soundsentry; + NONCLIENTMETRICSW ncmetrics; + MINIMIZEDMETRICS mmmetrics; + ICONMETRICS iconmetrics; + HIGHCONTRAST highcontrast; + ANIMATIONINFO animationinfo; +#if(WINVER >= 0x0600) + AUDIODESCRIPTION audiodescription; +#endif +} SPIBUFFER; + +extern SPIVALUES gspv; + +#endif /* _WIN32K_SYSPARAMS_H */ diff --git a/reactos/subsystems/win32/win32k/include/win32k.h b/reactos/subsystems/win32/win32k/include/win32k.h index 65292a5bd66..75c1b305948 100644 --- a/reactos/subsystems/win32/win32k/include/win32k.h +++ b/reactos/subsystems/win32/win32k/include/win32k.h @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include diff --git a/reactos/subsystems/win32/win32k/include/winsta.h b/reactos/subsystems/win32/win32k/include/winsta.h index 06b881c4f19..dbb061027a0 100644 --- a/reactos/subsystems/win32/win32k/include/winsta.h +++ b/reactos/subsystems/win32/win32k/include/winsta.h @@ -41,7 +41,6 @@ typedef struct _WINSTATION_OBJECT BOOL DropShadow; BOOL DragFullWindows; BOOL FlatMenu; - USERPREFERENCESMASK UserPreferences; /* ScreenSaver */ BOOL ScreenSaverRunning; diff --git a/reactos/subsystems/win32/win32k/misc/file.c b/reactos/subsystems/win32/win32k/misc/file.c new file mode 100644 index 00000000000..d21a735d658 --- /dev/null +++ b/reactos/subsystems/win32/win32k/misc/file.c @@ -0,0 +1,356 @@ +/* + * COPYRIGHT: GPL, see COPYING in the top level directory + * PROJECT: ReactOS win32 kernel mode subsystem server + * PURPOSE: File access support routines + * FILE: subsystem/win32/win32k/misc/registry.c + * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#include + +#define NDEBUG +#include + +BOOL +NTAPI +W32kDosPathNameToNtPathName( + IN PCWSTR pwszDosPathName, + OUT PUNICODE_STRING pustrNtPathName) +{ + NTSTATUS Status; + + /* Prepend "\??\" */ + pustrNtPathName->Length = 0; + Status = RtlAppendUnicodeToString(pustrNtPathName, L"\\??\\"); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Append the dos name */ + Status = RtlAppendUnicodeToString(pustrNtPathName, pwszDosPathName); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + return TRUE; +} + + +HANDLE +NTAPI +W32kOpenFile(PCWSTR pwszFileName, DWORD dwDesiredAccess) +{ + UNICODE_STRING ustrFile; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE hFile = INVALID_HANDLE_VALUE; + NTSTATUS Status; + + DPRINT("W32kOpenFile(%S)\n", pwszFileName); + + RtlInitUnicodeString(&ustrFile, pwszFileName); + + InitializeObjectAttributes(&ObjectAttributes, &ustrFile, 0, NULL, NULL); + + Status = ZwCreateFile(&hFile, + dwDesiredAccess, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + 0, + FILE_OPEN, + FILE_NON_DIRECTORY_FILE, + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + hFile = NULL; + } + + DPRINT("Leaving W32kOpenFile, Status=0x%x, hFile=0x%x\n", Status, hFile); + return hFile; +} + +HANDLE +NTAPI +W32kCreateFileSection(HANDLE hFile, + ULONG flAllocation, + DWORD flPageProtection, + ULONGLONG ullMaxSize) +{ + NTSTATUS Status; + HANDLE hSection = NULL; + ACCESS_MASK amDesiredAccess; + + /* Set access mask */ + amDesiredAccess = STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ; + + /* Check if write access is requested */ + if (flPageProtection == PAGE_READWRITE) + { + /* Add it to access mask */ + amDesiredAccess |= SECTION_MAP_WRITE; + } + + /* Now create the actual section */ + Status = ZwCreateSection(&hSection, + amDesiredAccess, + NULL, + NULL, + flPageProtection, + flAllocation, + hFile); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + } + + DPRINT("Leaving W32kCreateFileSection, Status=0x%x, hSection=0x%x\n", Status, hSection); + + /* Return section handle */ + return hSection; +} + +PVOID +NTAPI +W32kMapViewOfSection( + HANDLE hSection, + DWORD dwPageProtect, + ULONG_PTR ulSectionOffset) +{ + NTSTATUS Status; + LARGE_INTEGER liSectionOffset; + ULONG_PTR ulViewSize; + PVOID pvBase = 0; + + ulViewSize = + liSectionOffset.QuadPart = ulSectionOffset; + Status = ZwMapViewOfSection(hSection, + NtCurrentProcess(), + &pvBase, + 0, + 0, + &liSectionOffset, + &ulViewSize, + ViewShare, + 0, + dwPageProtect); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + } + + DPRINT("Leaving W32kMapViewOfSection, Status=0x%x, pvBase=0x%x\n", Status, pvBase); + + return pvBase; +} + +typedef struct tagBITMAPV5INFO +{ + BITMAPV5HEADER bmiHeader; + RGBQUAD bmiColors[256]; +} BITMAPV5INFO, *PBITMAPV5INFO; + +// FIXME: this should go to dibobj.c +NTSTATUS +ProbeAndConvertBitmapInfo( + OUT PBITMAPV5INFO pbmiDst, + IN PBITMAPINFO pbmiUnsafe) +{ + BITMAPV5HEADER *pbmhDst = (BITMAPV5HEADER*)&pbmiDst->bmiHeader; + DWORD dwSize; + RGBQUAD *pbmiColors; + ULONG ulWidthBytes; + + /* Get the size and probe */ + ProbeForRead(&pbmiUnsafe->bmiHeader.biSize, sizeof(DWORD), 1); + dwSize = pbmiUnsafe->bmiHeader.biSize; + ProbeForRead(pbmiUnsafe, dwSize, 1); + + /* Check the size */ + // FIXME: are intermediate sizes allowed? As what are they interpreted? + // make sure we don't use a too big dwSize later + if (dwSize != sizeof(BITMAPCOREHEADER) && + dwSize != sizeof(BITMAPINFOHEADER) && + dwSize != sizeof(BITMAPV4HEADER) && + dwSize != sizeof(BITMAPV5HEADER)) + { + return STATUS_INVALID_PARAMETER; + } + + pbmiColors = (RGBQUAD*)((PCHAR)pbmiUnsafe + dwSize); + + pbmhDst->bV5Size = sizeof(BITMAPV5HEADER); + + if (dwSize == sizeof(BITMAPCOREHEADER)) + { + PBITMAPCOREHEADER pbch = (PBITMAPCOREHEADER)pbmiUnsafe; + + /* Manually copy the fields that are present */ + pbmhDst->bV5Width = pbch->bcWidth; + pbmhDst->bV5Height = pbch->bcHeight; + pbmhDst->bV5Planes = pbch->bcPlanes; + pbmhDst->bV5BitCount = pbch->bcBitCount; + + /* Set some default values */ + pbmhDst->bV5Compression = BI_RGB; + pbmhDst->bV5SizeImage = 0; + pbmhDst->bV5XPelsPerMeter = 72; + pbmhDst->bV5YPelsPerMeter = 72; + pbmhDst->bV5ClrUsed = 0; + pbmhDst->bV5ClrImportant = 0; + } + else + { + /* Copy valid fields */ + memcpy(pbmhDst, pbmiUnsafe, dwSize); + + /* Zero out the rest of the V5 header */ + memset((char*)pbmhDst + dwSize, 0, sizeof(BITMAPV5HEADER) - dwSize); + } + + + if (dwSize < sizeof(BITMAPV4HEADER)) + { + if (pbmhDst->bV5Compression == BI_BITFIELDS) + { + DWORD *pMasks = (DWORD*)pbmiColors; + pbmhDst->bV5RedMask = pMasks[0]; + pbmhDst->bV5GreenMask = pMasks[1]; + pbmhDst->bV5BlueMask = pMasks[2]; + pbmhDst->bV5AlphaMask = 0; + pbmhDst->bV5ClrUsed = 0; + } + +// pbmhDst->bV5CSType; +// pbmhDst->bV5Endpoints; +// pbmhDst->bV5GammaRed; +// pbmhDst->bV5GammaGreen; +// pbmhDst->bV5GammaBlue; + } + + if (dwSize < sizeof(BITMAPV5HEADER)) + { +// pbmhDst->bV5Intent; +// pbmhDst->bV5ProfileData; +// pbmhDst->bV5ProfileSize; +// pbmhDst->bV5Reserved; + } + + ulWidthBytes = ((pbmhDst->bV5Width * pbmhDst->bV5Planes * + pbmhDst->bV5BitCount + 31) & ~31) / 8; + + if (pbmhDst->bV5SizeImage == 0) + pbmhDst->bV5SizeImage = abs(ulWidthBytes * pbmhDst->bV5Height); + + if (pbmhDst->bV5ClrUsed == 0) + pbmhDst->bV5ClrUsed = pbmhDst->bV5BitCount == 1 ? 2 : + (pbmhDst->bV5BitCount == 4 ? 16 : + (pbmhDst->bV5BitCount == 8 ? 256 : 0)); + + if (pbmhDst->bV5Planes != 1) + { + return STATUS_INVALID_PARAMETER; + } + + if (pbmhDst->bV5BitCount != 0 && pbmhDst->bV5BitCount != 1 && + pbmhDst->bV5BitCount != 4 && pbmhDst->bV5BitCount != 8 && + pbmhDst->bV5BitCount != 16 && pbmhDst->bV5BitCount != 24 && + pbmhDst->bV5BitCount != 32) + { + DPRINT("Invalid bit count: %d\n", pbmhDst->bV5BitCount); + return STATUS_INVALID_PARAMETER; + } + + if ((pbmhDst->bV5BitCount == 0 && + pbmhDst->bV5Compression != BI_JPEG && pbmhDst->bV5Compression != BI_PNG)) + { + DPRINT("Bit count 0 is invalid for compression %d.\n", pbmhDst->bV5Compression); + return STATUS_INVALID_PARAMETER; + } + + if (pbmhDst->bV5Compression == BI_BITFIELDS && + pbmhDst->bV5BitCount != 16 && pbmhDst->bV5BitCount != 32) + { + DPRINT("Bit count %d is invalid for compression BI_BITFIELDS.\n", pbmhDst->bV5BitCount); + return STATUS_INVALID_PARAMETER; + } + + return STATUS_SUCCESS; +} + + +HBITMAP +NTAPI +UserLoadImage(PCWSTR pwszName) +{ + NTSTATUS Status; + HANDLE hFile, hSection; + BITMAPFILEHEADER *pbmfh; + LPBITMAPINFO pbmi; + ULONG cjInfoSize; + PVOID pvBits; + HBITMAP hbmp = 0; + BITMAPV5INFO bmiLocal; + + /* Open the file */ + hFile = W32kOpenFile(pwszName, FILE_READ_DATA); + if (hFile == INVALID_HANDLE_VALUE) + return NULL; + + /* Create a section */ + hSection = W32kCreateFileSection(hFile, SEC_COMMIT, PAGE_READONLY, 0); + ZwClose(hFile); + if (!hSection) + return NULL; + + /* Map the section */ + pbmfh = W32kMapViewOfSection(hSection, PAGE_READONLY, 0); + ZwClose(hSection); + if (!pbmfh) + return NULL; + + /* Get a pointer to the BITMAPINFO */ + pbmi = (LPBITMAPINFO)(pbmfh + 1); + + /* Create a normalized local BITMAPINFO */ + _SEH2_TRY + { + Status = ProbeAndConvertBitmapInfo(&bmiLocal, pbmi); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END + + if (NT_SUCCESS(Status)) + { + cjInfoSize = bmiLocal.bmiHeader.bV5Size + + bmiLocal.bmiHeader.bV5ClrUsed * sizeof(RGBQUAD); + pvBits = (PVOID)((PCHAR)pbmi + cjInfoSize); + + // FIXME: use Gre... so that the BITMAPINFO doesn't get probed + hbmp = NtGdiCreateDIBitmapInternal(NULL, + bmiLocal.bmiHeader.bV5Width, + bmiLocal.bmiHeader.bV5Height, + CBM_INIT, + pvBits, + pbmi, + DIB_RGB_COLORS, + bmiLocal.bmiHeader.bV5Size, + bmiLocal.bmiHeader.bV5SizeImage, + 0, + 0); + } + + /* Unmap our section, we don't need it anymore */ + ZwUnmapViewOfSection(NtCurrentProcess(), pbmfh); + + DPRINT("Leaving UserLoadImage, hbmp = %p\n", hbmp); + return hbmp; +} diff --git a/reactos/subsystems/win32/win32k/misc/registry.c b/reactos/subsystems/win32/win32k/misc/registry.c new file mode 100644 index 00000000000..f03de06e5f6 --- /dev/null +++ b/reactos/subsystems/win32/win32k/misc/registry.c @@ -0,0 +1,206 @@ +/* + * COPYRIGHT: GPL, see COPYING in the top level directory + * PROJECT: ReactOS win32 kernel mode subsystem server + * PURPOSE: Registry loading and storing + * FILE: subsystem/win32/win32k/misc/registry.c + * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#include + +#define NDEBUG +#include + +BOOL +NTAPI +RegReadUserSetting( + IN PCWSTR pwszKeyName, + IN PCWSTR pwszValueName, + IN ULONG ulType, + OUT PVOID pvData, + IN ULONG cbDataSize) +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING usCurrentUserKey, usKeyName, usValueName; + WCHAR awcBuffer[MAX_PATH]; + HKEY hkey; + PKEY_VALUE_PARTIAL_INFORMATION pInfo; + ULONG cbInfoSize, cbReqSize; + + /* Get the path of the current user's profile */ + Status = RtlFormatCurrentUserKeyPath(&usCurrentUserKey); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Initialize empty key name */ + RtlInitEmptyUnicodeString(&usKeyName, awcBuffer, sizeof(awcBuffer)); + + /* Append the current user key name */ + Status = RtlAppendUnicodeStringToString(&usKeyName, &usCurrentUserKey); + + /* Free the current user key name */ + RtlFreeUnicodeString(&usCurrentUserKey); + + /* Check for success */ + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Append a '\', we can trust in enough space left. */ + usKeyName.Buffer[usKeyName.Length / sizeof(WCHAR)] = '\\'; + usKeyName.Length += sizeof(WCHAR); + + /* Append the subkey name */ + Status = RtlAppendUnicodeToString(&usKeyName, pwszKeyName); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Initialize object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &usKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + /* Open the key */ + Status = ZwOpenKey(&hkey, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Check if the local buffer is sufficient */ + cbInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + cbDataSize; + if (cbInfoSize <= sizeof(awcBuffer)) + { + pInfo = (PVOID)awcBuffer; + } + else + { + /* It's not, allocate a sufficient buffer */ + pInfo = ExAllocatePoolWithTag(PagedPool, cbInfoSize, TAG_TEMP); + if (!pInfo) + { + ZwClose(hkey); + return FALSE; + } + } + + /* Query the value */ + RtlInitUnicodeString(&usValueName, pwszValueName); + Status = ZwQueryValueKey(hkey, + &usValueName, + KeyValuePartialInformation, + (PVOID)pInfo, + cbInfoSize, + &cbReqSize); + if (NT_SUCCESS(Status)) + { + /* Did we get the right type */ + if (pInfo->Type == ulType) + { + /* Copy the contents to the caller */ + RtlCopyMemory(pvData, pInfo->Data, cbDataSize); + } + } + + /* Cleanup */ + ZwClose(hkey); + if (pInfo != (PVOID)awcBuffer) + ExFreePoolWithTag(pInfo, TAG_TEMP); + + return NT_SUCCESS(Status); +} + +BOOL +NTAPI +RegWriteUserSetting( + IN PCWSTR pwszKeyName, + IN PCWSTR pwszValueName, + IN ULONG ulType, + OUT PVOID pvData, + IN ULONG cbDataSize) +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING usCurrentUserKey, usKeyName, usValueName; + WCHAR awcBuffer[MAX_PATH]; + HKEY hkey; + + // FIXME: logged in user versus current process user? + /* Get the path of the current user's profile */ + Status = RtlFormatCurrentUserKeyPath(&usCurrentUserKey); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlFormatCurrentUserKeyPath failed\n"); + return FALSE; + } + + /* Initialize empty key name */ + RtlInitEmptyUnicodeString(&usKeyName, awcBuffer, sizeof(awcBuffer)); + + /* Append the current user key name */ + Status = RtlAppendUnicodeStringToString(&usKeyName, &usCurrentUserKey); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Free the current user key name */ + RtlFreeUnicodeString(&usCurrentUserKey); + + /* Append a '\', we can trust in enough space left. */ + usKeyName.Buffer[usKeyName.Length / sizeof(WCHAR)] = '\\'; + usKeyName.Length += sizeof(WCHAR); + + /* Append the subkey name */ + Status = RtlAppendUnicodeToString(&usKeyName, pwszKeyName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlAppendUnicodeToString failed with Status=%lx, buf:%d,%d\n", Status, usKeyName.Length, usKeyName.MaximumLength); + return FALSE; + } + + /* Initialize object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &usKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + /* Open or create the key */ + Status = ZwCreateKey(&hkey, + KEY_READ | KEY_WRITE, + &ObjectAttributes, + 0, + NULL, + 0, + NULL); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create key: 0x%x\n", Status); + return FALSE; + } + + /* Initialize the value name string */ + RtlInitUnicodeString(&usValueName, pwszValueName); + + Status = ZwSetValueKey(hkey, &usValueName, 0, ulType, pvData, cbDataSize); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Failed to write reg key '%S' value '%S', Status = %lx\n", + pwszKeyName, pwszValueName, Status); + } + + /* Cleanup */ + ZwClose(hkey); + + return NT_SUCCESS(Status); +} + diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 0e5fba2ad67..f2d3e355b68 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -55,8 +55,6 @@ static KEVENT InputThreadsStart; static BOOLEAN InputThreadsRunning = FALSE; /* FUNCTIONS *****************************************************************/ -ULONG FASTCALL -IntSystemParametersInfo(UINT uiAction, UINT uiParam,PVOID pvParam, UINT fWinIni); DWORD IntLastInputTick(BOOL LastInputTickSetGet); #define ClearMouseInput(mi) \ @@ -885,7 +883,7 @@ RawInputThreadMain(PVOID StartContext) MasterTimer = ExAllocatePoolWithTag(NonPagedPool, sizeof(KTIMER), TAG_INPUT); if (!MasterTimer) - { + { DPRINT1("Win32K: Failed making Raw Input thread a win32 thread.\n"); return; } @@ -1065,18 +1063,6 @@ CLEANUP: END_CLEANUP; } -BOOL FASTCALL -IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap) -{ - PSYSTEM_CURSORINFO CurInfo; - BOOL res; - - CurInfo = IntGetSysCursorInfo(WinStaObject); - res = CurInfo->SwapButtons; - CurInfo->SwapButtons = Swap; - return res; -} - BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi) { diff --git a/reactos/subsystems/win32/win32k/ntuser/metric.c b/reactos/subsystems/win32/win32k/ntuser/metric.c index 58eec348259..c93826993a1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/metric.c +++ b/reactos/subsystems/win32/win32k/ntuser/metric.c @@ -4,8 +4,7 @@ * PURPOSE: Window classes * FILE: subsys/win32k/ntuser/metric.c * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) - * REVISION HISTORY: - * 06-06-2001 CSH Created + * Timo Kreuzer (timo.kreuzer@reactos.org) */ /* INCLUDES ******************************************************************/ @@ -20,9 +19,6 @@ static BOOL Setup = FALSE; /* FUNCTIONS *****************************************************************/ -// FIXME: These are only win xp default values, mostly hardcoded. They should be -// read from the registry. It must be possible to change or reinitialize the -// values, for example desk.cpl BOOL FASTCALL InitMetrics(VOID) @@ -31,21 +27,10 @@ InitMetrics(VOID) PWINSTATION_OBJECT WinStaObject; ULONG Width = 640, Height = 480; PSYSTEM_CURSORINFO CurInfo; - HDC hScreenDC; - PDC pScreenDC; + INT *piSysMet; - hScreenDC = IntGdiCreateDC(NULL, NULL, NULL, NULL, TRUE); - if (hScreenDC) - { - pScreenDC = DC_LockDc(hScreenDC); - if (pScreenDC) - { - Width = pScreenDC->ppdev->GDIInfo.ulHorzRes; - Height = pScreenDC->ppdev->GDIInfo.ulVertRes; - DC_UnlockDc(pScreenDC); - } - NtGdiDeleteObjectApp(hScreenDC); - } + Width = pPrimarySurface->GDIInfo.ulHorzRes; + Height = pPrimarySurface->GDIInfo.ulVertRes; Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, KernelMode, @@ -60,103 +45,131 @@ InitMetrics(VOID) CurInfo = NULL; } - gpsi->SystemMetrics[SM_CXSCREEN] = Width; - gpsi->SystemMetrics[SM_CYSCREEN] = Height; - gpsi->SystemMetrics[SM_CXVSCROLL] = 16; - gpsi->SystemMetrics[SM_CYHSCROLL] = 16; - /* FIXME: "reg://Control Panel/Desktop/WindowMetrics/CaptionHeight" + 1 */ - gpsi->SystemMetrics[SM_CYCAPTION] = 19; - gpsi->SystemMetrics[SM_CXBORDER] = 1; - gpsi->SystemMetrics[SM_CYBORDER] = 1; - gpsi->SystemMetrics[SM_CXDLGFRAME] = 3; - gpsi->SystemMetrics[SM_CYDLGFRAME] = 3; - gpsi->SystemMetrics[SM_CYVTHUMB] = 16; - gpsi->SystemMetrics[SM_CXHTHUMB] = 16; - gpsi->SystemMetrics[SM_CXICON] = 32; - gpsi->SystemMetrics[SM_CYICON] = 32; - gpsi->SystemMetrics[SM_CXCURSOR] = 32; - gpsi->SystemMetrics[SM_CYCURSOR] = 32; - gpsi->SystemMetrics[SM_CYMENU] = 19; - /* FIXME: shouldn't we take borders etc into account??? */ - gpsi->SystemMetrics[SM_CXFULLSCREEN] = gpsi->SystemMetrics[SM_CXSCREEN]; - gpsi->SystemMetrics[SM_CYFULLSCREEN] = gpsi->SystemMetrics[SM_CYSCREEN]; - gpsi->SystemMetrics[SM_CYKANJIWINDOW] = 0; - gpsi->SystemMetrics[SM_MOUSEPRESENT] = 1; - gpsi->SystemMetrics[SM_CYVSCROLL] = 16; - gpsi->SystemMetrics[SM_CXHSCROLL] = 16; - gpsi->SystemMetrics[SM_DEBUG] = 0; - gpsi->SystemMetrics[SM_SWAPBUTTON] = CurInfo ? CurInfo->SwapButtons : 0; - gpsi->SystemMetrics[SM_RESERVED1] = 0; - gpsi->SystemMetrics[SM_RESERVED2] = 0; - gpsi->SystemMetrics[SM_RESERVED3] = 0; - gpsi->SystemMetrics[SM_RESERVED4] = 0; - gpsi->SystemMetrics[SM_CXMIN] = 112; - gpsi->SystemMetrics[SM_CYMIN] = 27; - gpsi->SystemMetrics[SM_CXSIZE] = 18; - gpsi->SystemMetrics[SM_CYSIZE] = 18; - gpsi->SystemMetrics[SM_CXFRAME] = 4; - gpsi->SystemMetrics[SM_CYFRAME] = 4; - gpsi->SystemMetrics[SM_CXMINTRACK] = 112; - gpsi->SystemMetrics[SM_CYMINTRACK] = 27; - gpsi->SystemMetrics[SM_CXDOUBLECLK] = CurInfo ? CurInfo->DblClickWidth : 4; - gpsi->SystemMetrics[SM_CYDOUBLECLK] = CurInfo ? CurInfo->DblClickWidth : 4; - gpsi->SystemMetrics[SM_CXICONSPACING] = 64; - gpsi->SystemMetrics[SM_CYICONSPACING] = 64; - gpsi->SystemMetrics[SM_MENUDROPALIGNMENT] = 0; - gpsi->SystemMetrics[SM_PENWINDOWS] = 0; - gpsi->SystemMetrics[SM_DBCSENABLED] = 0; - gpsi->SystemMetrics[SM_CMOUSEBUTTONS] = 2; - gpsi->SystemMetrics[SM_SECURE] = 0; - gpsi->SystemMetrics[SM_CXEDGE] = 2; - gpsi->SystemMetrics[SM_CYEDGE] = 2; - gpsi->SystemMetrics[SM_CXMINSPACING] = 160; - gpsi->SystemMetrics[SM_CYMINSPACING] = 24; - gpsi->SystemMetrics[SM_CXSMICON] = 16; - gpsi->SystemMetrics[SM_CYSMICON] = 16; - gpsi->SystemMetrics[SM_CYSMCAPTION] = 15; - gpsi->SystemMetrics[SM_CXSMSIZE] = 12; - gpsi->SystemMetrics[SM_CYSMSIZE] = 14; - gpsi->SystemMetrics[SM_CXMENUSIZE] = 18; - gpsi->SystemMetrics[SM_CYMENUSIZE] = 18; - gpsi->SystemMetrics[SM_ARRANGE] = 8; - gpsi->SystemMetrics[SM_CXMINIMIZED] = 160; - gpsi->SystemMetrics[SM_CYMINIMIZED] = 24; - gpsi->SystemMetrics[SM_CXMAXTRACK] = gpsi->SystemMetrics[SM_CYSCREEN] + 12; - gpsi->SystemMetrics[SM_CYMAXTRACK] = gpsi->SystemMetrics[SM_CYSCREEN] + 12; - /* This seems to be 8 pixels greater than the screen width */ - gpsi->SystemMetrics[SM_CXMAXIMIZED] = gpsi->SystemMetrics[SM_CXSCREEN] + 8; - /* This seems to be 20 pixels less than the screen height, taskbar maybe? */ - gpsi->SystemMetrics[SM_CYMAXIMIZED] = gpsi->SystemMetrics[SM_CYSCREEN] - 20; - gpsi->SystemMetrics[SM_NETWORK] = 3; - gpsi->SystemMetrics[64] = 0; - gpsi->SystemMetrics[65] = 0; - gpsi->SystemMetrics[66] = 0; - gpsi->SystemMetrics[SM_CLEANBOOT] = 0; - gpsi->SystemMetrics[SM_CXDRAG] = 4; - gpsi->SystemMetrics[SM_CYDRAG] = 4; - gpsi->SystemMetrics[SM_SHOWSOUNDS] = 0; - gpsi->SystemMetrics[SM_CXMENUCHECK] = 13; - gpsi->SystemMetrics[SM_CYMENUCHECK] = 13; - gpsi->SystemMetrics[SM_SLOWMACHINE] = 0; - gpsi->SystemMetrics[SM_MIDEASTENABLED] = 0; - gpsi->SystemMetrics[SM_MOUSEWHEELPRESENT] = 1; - gpsi->SystemMetrics[SM_XVIRTUALSCREEN] = 0; - gpsi->SystemMetrics[SM_YVIRTUALSCREEN] = 0; - gpsi->SystemMetrics[SM_CXVIRTUALSCREEN] = Width; - gpsi->SystemMetrics[SM_CYVIRTUALSCREEN] = Height; - gpsi->SystemMetrics[SM_CMONITORS] = 1; - gpsi->SystemMetrics[SM_SAMEDISPLAYFORMAT] = 1; - gpsi->SystemMetrics[SM_IMMENABLED] = 0; - gpsi->SystemMetrics[SM_CXFOCUSBORDER] = 1; - gpsi->SystemMetrics[SM_CYFOCUSBORDER] = 1; - gpsi->SystemMetrics[SM_TABLETPC] = 0; - gpsi->SystemMetrics[SM_MEDIACENTER] = 0; - gpsi->SystemMetrics[SM_STARTER] = 0; - gpsi->SystemMetrics[SM_SERVERR2] = 0; + piSysMet = (INT*)gpsi->SystemMetrics; + + /* Screen sizes */ + piSysMet[SM_CXSCREEN] = Width; + piSysMet[SM_CYSCREEN] = Height; + piSysMet[SM_XVIRTUALSCREEN] = 0; + piSysMet[SM_YVIRTUALSCREEN] = 0; + piSysMet[SM_CXVIRTUALSCREEN] = Width; + piSysMet[SM_CYVIRTUALSCREEN] = Height; + + /* NC area sizes */ + piSysMet[SM_CYCAPTION] = gspv.ncm.iCaptionHeight + 1; // 19 + piSysMet[SM_CYSMCAPTION] = gspv.ncm.iSmCaptionHeight + 1; // 15; + piSysMet[SM_CXSIZE] = gspv.ncm.iCaptionHeight; // 18; + piSysMet[SM_CYSIZE] = gspv.ncm.iCaptionHeight; // 18; + piSysMet[SM_CXSMSIZE] = gspv.ncm.iSmCaptionWidth; // 12; xp: piSysMet(SM_CYSMCAPTION) - 1 + piSysMet[SM_CYSMSIZE] = gspv.ncm.iSmCaptionHeight; // 14; + piSysMet[SM_CXBORDER] = 1; // seems to be hardcoded + piSysMet[SM_CYBORDER] = 1; // seems to be hardcoded + piSysMet[SM_CXFOCUSBORDER] = 1; + piSysMet[SM_CYFOCUSBORDER] = 1; + piSysMet[SM_CXDLGFRAME] = 3; + piSysMet[SM_CYDLGFRAME] = 3; + piSysMet[SM_CXEDGE] = 2; + piSysMet[SM_CYEDGE] = 2; + piSysMet[SM_CXFRAME] = piSysMet[SM_CXDLGFRAME] + gspv.ncm.iBorderWidth; // 4 + piSysMet[SM_CYFRAME] = piSysMet[SM_CYDLGFRAME] + gspv.ncm.iBorderWidth; // 4 #if (_WIN32_WINNT >= 0x0600) - gpsi->SystemMetrics[90] = 0; - gpsi->SystemMetrics[SM_MOUSEHORIZONTALWHEELPRESENT] = 0; - gpsi->SystemMetrics[SM_CXPADDEDBORDER] = 0; + piSysMet[SM_CXPADDEDBORDER] = 0; +#endif + + /* Window sizes */ + DPRINT("ncm.iCaptionWidth=%d,GetSystemMetrics(SM_CYSIZE)=%d,GetSystemMetrics(SM_CXFRAME)=%d,avcwCaption=%d \n", + gspv.ncm.iCaptionWidth, piSysMet[SM_CYSIZE],piSysMet[SM_CXFRAME], gspv.tmCaptionFont.tmAveCharWidth); + + piSysMet[SM_CXMIN] = 3 * max(gspv.ncm.iCaptionWidth, 8) // 112 + + piSysMet[SM_CYSIZE] + 4 + + 4 * gspv.tmCaptionFont.tmAveCharWidth + + 2 * piSysMet[SM_CXFRAME]; + piSysMet[SM_CYMIN] = piSysMet[SM_CYCAPTION] + 2 * piSysMet[SM_CYFRAME];// 27 + piSysMet[SM_CXMAXIMIZED] = piSysMet[SM_CXSCREEN] + 2 * piSysMet[SM_CXFRAME]; + piSysMet[SM_CYMAXIMIZED] = piSysMet[SM_CYSCREEN] - 20; + piSysMet[SM_CXFULLSCREEN] = piSysMet[SM_CXSCREEN]; + piSysMet[SM_CYFULLSCREEN] = piSysMet[SM_CYMAXIMIZED] - piSysMet[SM_CYMIN]; + piSysMet[SM_CYKANJIWINDOW] = 0; + piSysMet[SM_CXMINIMIZED] = gspv.mm.iWidth + 6; + piSysMet[SM_CYMINIMIZED] = piSysMet[SM_CYCAPTION] + 5; + piSysMet[SM_CXMINSPACING] = piSysMet[SM_CXMINIMIZED] + gspv.mm.iHorzGap; + piSysMet[SM_CYMINSPACING] = piSysMet[SM_CYMINIMIZED] + gspv.mm.iVertGap; + piSysMet[SM_CXMAXTRACK] = piSysMet[SM_CXVIRTUALSCREEN] + 4 + + 2 * piSysMet[SM_CXFRAME]; + piSysMet[SM_CYMAXTRACK] = piSysMet[SM_CYVIRTUALSCREEN] + 4 + + 2 * piSysMet[SM_CYFRAME]; + + /* Icon */ + piSysMet[SM_CXVSCROLL] = gspv.ncm.iScrollWidth; //16; + piSysMet[SM_CYVTHUMB] = gspv.ncm.iScrollHeight; //16; + piSysMet[SM_CYHSCROLL] = gspv.ncm.iScrollWidth; //16; + piSysMet[SM_CXHTHUMB] = gspv.ncm.iScrollHeight; //16; + piSysMet[SM_CYVSCROLL] = gspv.ncm.iScrollHeight; // 16 + piSysMet[SM_CXHSCROLL] = gspv.ncm.iScrollHeight; // 16; + piSysMet[SM_CXICON] = 32; + piSysMet[SM_CYICON] = 32; + piSysMet[SM_CXSMICON] = 16; + piSysMet[SM_CYSMICON] = 16; + piSysMet[SM_CXICONSPACING] = gspv.im.iHorzSpacing;// 64; + piSysMet[SM_CYICONSPACING] = gspv.im.iVertSpacing; // 64; + piSysMet[SM_CXCURSOR] = 32; + piSysMet[SM_CYCURSOR] = 32; + piSysMet[SM_CXMINTRACK] = piSysMet[SM_CXMIN]; // 117 + piSysMet[SM_CYMINTRACK] = piSysMet[SM_CYMIN]; // 27 + piSysMet[SM_CXDRAG] = 4; + piSysMet[SM_CYDRAG] = 4; + piSysMet[SM_ARRANGE] = gspv.mm.iArrange; // 8; + + /* Menu */ + piSysMet[SM_CYMENU] = gspv.ncm.iMenuHeight + 1;//19; + piSysMet[SM_MENUDROPALIGNMENT] = gspv.bMenuDropAlign; + piSysMet[SM_CXMENUCHECK] = ((1 + gspv.tmMenuFont.tmHeight + + gspv.tmMenuFont.tmExternalLeading) & ~1) - 1; // 13; + piSysMet[SM_CYMENUCHECK] = piSysMet[SM_CXMENUCHECK]; + piSysMet[SM_CXMENUSIZE] = gspv.ncm.iMenuWidth; //18; + piSysMet[SM_CYMENUSIZE] = gspv.ncm.iMenuHeight; //18; + + /* Mouse */ + piSysMet[SM_MOUSEPRESENT] = 1; + piSysMet[SM_MOUSEWHEELPRESENT] = 1; + piSysMet[SM_CMOUSEBUTTONS] = 2; + piSysMet[SM_SWAPBUTTON] = gspv.bMouseBtnSwap ? 1 : 0; //CurInfo ? CurInfo->SwapButtons : 0; + piSysMet[SM_CXDOUBLECLK] = gspv.iDblClickWidth;//CurInfo ? CurInfo->DblClickWidth : 4; + piSysMet[SM_CYDOUBLECLK] = gspv.iDblClickHeight;//CurInfo ? CurInfo->DblClickWidth : 4; +#if (_WIN32_WINNT >= 0x0600) + piSysMet[SM_MOUSEHORIZONTALWHEELPRESENT] = 0; +#endif + + /* Version info */ + piSysMet[SM_TABLETPC] = 0; + piSysMet[SM_MEDIACENTER] = 0; + piSysMet[SM_STARTER] = 0; + piSysMet[SM_SERVERR2] = 0; + piSysMet[SM_PENWINDOWS] = 0; + + /* Other */ + piSysMet[SM_DEBUG] = 0; + piSysMet[SM_NETWORK] = 3; + piSysMet[SM_SLOWMACHINE] = 0; + piSysMet[SM_SECURE] = 0; + piSysMet[SM_DBCSENABLED] = 0; + piSysMet[SM_CLEANBOOT] = 0; + piSysMet[SM_SHOWSOUNDS] = gspv.bShowSounds; + piSysMet[SM_MIDEASTENABLED] = 0; + piSysMet[SM_CMONITORS] = 1; + piSysMet[SM_SAMEDISPLAYFORMAT] = 1; + piSysMet[SM_IMMENABLED] = 0; + + /* Reserved */ + piSysMet[SM_RESERVED1] = 0; + piSysMet[SM_RESERVED2] = 0; + piSysMet[SM_RESERVED3] = 0; + piSysMet[SM_RESERVED4] = 0; + piSysMet[64] = 0; + piSysMet[65] = 0; + piSysMet[66] = 0; +#if (_WIN32_WINNT >= 0x0600) + piSysMet[90] = 0; #endif gpsi->SRVINFO_Flags |= SRVINFO_METRICS; @@ -174,14 +187,9 @@ ULONG FASTCALL UserGetSystemMetrics(ULONG Index) { ASSERT(gpsi); + ASSERT(Setup); DPRINT("UserGetSystemMetrics(%d)\n", Index); - // FIXME: Do this when loading - if (!Setup) - { - InitMetrics(); - } - /* Get metrics from array */ if (Index < SM_CMETRICS) { diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index ece9477109c..8dfee1a98bf 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -136,31 +136,16 @@ APIENTRY NtUserGetDoubleClickTime(VOID) { UINT Result; - NTSTATUS Status; - PWINSTATION_OBJECT WinStaObject; - PSYSTEM_CURSORINFO CurInfo; - DECLARE_RETURN(UINT); DPRINT("Enter NtUserGetDoubleClickTime\n"); UserEnterShared(); - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObject); - if (!NT_SUCCESS(Status)) - RETURN( (DWORD)FALSE); + // FIXME: Check if this works on non-interactive winsta + Result = gspv.iDblClickTime; - CurInfo = IntGetSysCursorInfo(WinStaObject); - Result = CurInfo->DblClickSpeed; - - ObDereferenceObject(WinStaObject); - RETURN( Result); - -CLEANUP: - DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n",_ret_); + DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n", Result); UserLeave(); - END_CLEANUP; + return Result; } BOOL diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index e7d573b7dc3..c012aed9a70 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -809,44 +809,6 @@ NtUserHardErrorControl( return 0; } -/* - Called from win32csr. - */ -NTSTATUS -APIENTRY -NtUserInitialize( - DWORD dwWinVersion, - HANDLE hPowerRequestEvent, - HANDLE hMediaRequestEvent) -{ - UserEnterExclusive(); - UNIMPLEMENTED; -// Check to see we have the right version. -// Initialize Power Request List. -// Initialize Media Change. -// Initialize CSRSS -// { -// Startup DxGraphics. -// calls ** IntGdiGetLanguageID() and sets it **. -// Enables Fonts drivers, Initialize Font table & Stock Fonts. -// } -// Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA) -// Create Object Directory,,, Looks like create workstation. "\\Windows\\WindowStations" -// Create Event for Diconnect Desktop. -// Initialize Video. -// { -// DrvInitConsole. -// DrvChangeDisplaySettings. -// Update Shared Device Caps. -// Initialize User Screen. -// } -// Create ThreadInfo for this Thread! -// Set Global SERVERINFO Error flags. -// Load Resources. - UserLeave(); - return STATUS_SUCCESS; -} - DWORD APIENTRY NtUserMinMaximize( diff --git a/reactos/subsystems/win32/win32k/ntuser/ntuser.c b/reactos/subsystems/win32/win32k/ntuser/ntuser.c index 0589711ab10..56f88d8be45 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntuser.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntuser.c @@ -34,6 +34,10 @@ #include ERESOURCE UserLock; +BOOL gbInitialized; + +BOOL +InitSysParams(); /* FUNCTIONS **********************************************************/ @@ -66,9 +70,90 @@ NTSTATUS FASTCALL InitUserImpl(VOID) DPRINT("Global Server Data -> %x\n", gpsi); } } + + InitSysParams(); + return STATUS_SUCCESS; } + +NTSTATUS +NTAPI +UserInitialize( + HANDLE hPowerRequestEvent, + HANDLE hMediaRequestEvent) +{ +// Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA) +// Create Object Directory,,, Looks like create workstation. "\\Windows\\WindowStations" +// Create Event for Diconnect Desktop. +// Initialize Video. +// { +// DrvInitConsole. +// DrvChangeDisplaySettings. +// Update Shared Device Caps. +// Initialize User Screen. +// } +// Create ThreadInfo for this Thread! +// Set Global SERVERINFO Error flags. +// Load Resources. + + NtUserUpdatePerUserSystemParameters(0, TRUE); + + return STATUS_SUCCESS; +} + +/* + Called from win32csr. + */ +NTSTATUS +APIENTRY +NtUserInitialize( + DWORD dwWinVersion, + HANDLE hPowerRequestEvent, + HANDLE hMediaRequestEvent) +{ + NTSTATUS Status; + + DPRINT1("Enter NtUserInitialize(%lx, %p, %p)\n", + dwWinVersion, hPowerRequestEvent, hMediaRequestEvent); + + /* Check the Windows version */ + if (dwWinVersion != 0) + { + return STATUS_UNSUCCESSFUL; + } + + /* Acquire exclusive lock */ + UserEnterExclusive(); + + /* Check if we are already initialized */ + if (gbInitialized) + { + UserLeave(); + return STATUS_UNSUCCESSFUL; + } + +// Initialize Power Request List. +// Initialize Media Change. +// InitializeGreCSRSS(); +// { +// Startup DxGraphics. +// calls ** IntGdiGetLanguageID() and sets it **. +// Enables Fonts drivers, Initialize Font table & Stock Fonts. +// } + + /* Initialize USER */ + Status = UserInitialize(hPowerRequestEvent, hMediaRequestEvent); + + /* Set us as initialized */ + gbInitialized = TRUE; + + /* Return */ + UserLeave(); + return Status; +} + + /* RETURN True if current thread owns the lock (possibly shared) diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index fff7ab7be27..1bea638910c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -1559,10 +1559,10 @@ UserDrawCaptionText(HDC hDc, #endif nclm.cbSize = sizeof(nclm); - if(!IntSystemParametersInfo(SPI_GETNONCLIENTMETRICS, + if(!UserSystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &nclm, 0)) { - DPRINT1("%s: IntSystemParametersInfo() failed!\n", __FUNCTION__); + DPRINT1("%s: UserSystemParametersInfo() failed!\n", __FUNCTION__); return FALSE; } diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index 4eba2f34219..6c13dd5cd27 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -228,23 +228,12 @@ NtUserCallOneParam( case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON: { - PWINSTATION_OBJECT WinSta; - NTSTATUS Status; DWORD Result; - - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinSta); - if (!NT_SUCCESS(Status)) - RETURN( (DWORD)FALSE); - - /* FIXME - Result = (DWORD)IntSwapMouseButton(WinStaObject, (BOOL)Param); */ - Result = 0; - - ObDereferenceObject(WinSta); - RETURN( Result); + + Result = gspv.bMouseBtnSwap; + gspv.bMouseBtnSwap = Param ? TRUE : FALSE; + gpsi->SystemMetrics[SM_SWAPBUTTON] = gspv.bMouseBtnSwap; + RETURN(Result); } case ONEPARAM_ROUTINE_SWITCHCARETSHOWING: diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index e178b4e80ed..c10eeca5e22 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -1,13 +1,16 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel + * COPYRIGHT: GPL, see COPYING in the top level directory + * PROJECT: ReactOS win32 kernel mode subsystem server * PURPOSE: System parameters functions - * FILE: subsystem/win32/win32k/ntuser/sysparam.c - * PROGRAMER: Ge van Geldorp (ge@gse.nl) - * REVISION HISTORY: - * 2008/03/20 Split from misc.c + * FILE: subsystem/win32/win32k/ntuser/sysparams.c + * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ +// TODO: +// - check all values that are in Winsta in ros +// - does setting invalid fonts work? +// - save appropriate text metrics + #include #define NDEBUG @@ -15,1545 +18,1486 @@ #include -VOID FASTCALL -IntGetFontMetricSetting(LPWSTR lpValueName, PLOGFONTW font) +#define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl(TAG('R', 'o', 's', 'D'), (PVOID)Frames, Count, NULL, 0, NULL, KernelMode) +HBITMAP NTAPI UserLoadImage(PCWSTR); +BOOL NTAPI W32kDosPathNameToNtPathName(PCWSTR, PUNICODE_STRING); + +BOOL gbDebug = 0; +SPIVALUES gspv; +BOOL gbSpiInitialized = FALSE; +PWINSTATION_OBJECT gpwinstaCurrent = NULL; + +// HACK! We initialize SPI before we have a proper surface to get this from. +#define dpi 96 +//(pPrimarySurface->GDIInfo.ulLogPixelsY) +#define REG2METRIC(reg) (reg > 0 ? reg : ((-(reg) * dpi + 720) / 1440)) +#define METRIC2REG(met) (-((((met) * 1440)- 0) / dpi)) + +#define REQ_INTERACTIVE_WINSTA(err) \ + if (gpwinstaCurrent != InputWindowStation) \ + { \ + SetLastWin32Error(err); \ + return 0; \ + } + +#define DPRINTX if (gbDebug) DPRINT1 + +static const WCHAR* KEY_MOUSE = L"Control Panel\\Mouse"; +static const WCHAR* VAL_MOUSE1 = L"MouseThreshold1"; +static const WCHAR* VAL_MOUSE2 = L"MouseThreshold2"; +static const WCHAR* VAL_MOUSE3 = L"MouseSpeed"; +static const WCHAR* VAL_DBLCLKWIDTH = L"DoubleClickWidth"; +static const WCHAR* VAL_DBLCLKHEIGHT = L"DoubleClickHeight"; +static const WCHAR* VAL_DBLCLKTIME = L"DoubleClickSpeed"; +static const WCHAR* VAL_SWAP = L"SwapMouseButtons"; + +static const WCHAR* KEY_DESKTOP = L"Control Panel\\Desktop"; +static const WCHAR* VAL_SCRTO = L"ScreenSaveTimeOut"; +static const WCHAR* VAL_SCRACT = L"ScreenSaveActive"; +static const WCHAR* VAL_GRID = L"GridGranularity"; +static const WCHAR* VAL_DRAG = L"DragFullWindows"; +static const WCHAR* VAL_DRAGHEIGHT = L"DragHeight"; +static const WCHAR* VAL_DRAGWIDTH = L"DragWidth"; +static const WCHAR* VAL_FNTSMOOTH = L"FontSmoothing"; + +static const WCHAR* KEY_MDALIGN = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"; +static const WCHAR* VAL_MDALIGN = L"MenuDropAlignment"; + +static const WCHAR* KEY_METRIC = L"Control Panel\\Desktop\\WindowMetrics"; +static const WCHAR* VAL_BORDER = L"BorderWidth"; +static const WCHAR* VAL_ICONSPC = L"IconSpacing"; +static const WCHAR* VAL_ICONVSPC = L"IconVerticalspacing"; +static const WCHAR* VAL_ITWRAP = L"IconTitleWrap"; + +static const WCHAR* KEY_SOUND = L"Control Panel\\Sound"; +static const WCHAR* VAL_BEEP = L"Beep"; + +static const WCHAR* KEY_KBD = L"Control Panel\\Keyboard"; +static const WCHAR* VAL_KBDSPD = L"KeyboardSpeed"; +static const WCHAR* VAL_KBDDELAY = L"KeyboardDelay"; + +static const WCHAR* KEY_SHOWSNDS = L"Control Panel\\Accessibility\\ShowSounds"; +static const WCHAR* KEY_KDBPREF = L"Control Panel\\Accessibility\\Keyboard Preference"; +static const WCHAR* KEY_SCRREAD = L"Control Panel\\Accessibility\\Blind Access"; +static const WCHAR* VAL_ON = L"On"; + + + +/** Loading the settings ******************************************************/ + +static +INT +SpiLoadInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue) { - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - NTSTATUS Status; - /* Firefox 1.0.7 depends on the lfHeight value being negative */ - static LOGFONTW DefaultFont = { - -11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, - L"MS Sans Serif" - }; + WCHAR awcBuffer[12]; + ULONG cbSize; - RtlZeroMemory(&QueryTable, sizeof(QueryTable)); - - QueryTable[0].Name = lpValueName; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[0].EntryContext = font; - - Status = RtlQueryRegistryValues( - RTL_REGISTRY_USER, - L"Control Panel\\Desktop\\WindowMetrics", - QueryTable, - NULL, - NULL); - - if (!NT_SUCCESS(Status)) - { - RtlCopyMemory(font, &DefaultFont, sizeof(LOGFONTW)); - } -} - -static NTSTATUS FASTCALL -IntWriteSystemParametersSettings(PUNICODE_STRING SubKeyName, - PUNICODE_STRING KeyName, - ULONG Type, - PVOID Data, - ULONG DataSize) -{ - UNICODE_STRING KeyPath; - NTSTATUS Status; - HANDLE CurrentUserKey, KeyHandle; - OBJECT_ATTRIBUTES KeyAttributes, ObjectAttributes; - - /* Get a handle to the current users settings */ - Status = RtlFormatCurrentUserKeyPath(&KeyPath); - if(!NT_SUCCESS(Status)) - return Status; - - InitializeObjectAttributes(&ObjectAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, NULL, NULL); - /* Open the HKCU key */ - Status = ZwOpenKey(&CurrentUserKey, KEY_WRITE, &ObjectAttributes); - RtlFreeUnicodeString(&KeyPath); - if(!NT_SUCCESS(Status)) - return Status; - - - /* Open up the settings to read the values */ - InitializeObjectAttributes(&KeyAttributes, SubKeyName, OBJ_CASE_INSENSITIVE, CurrentUserKey, NULL); - Status = ZwOpenKey(&KeyHandle, KEY_WRITE, &KeyAttributes); - ZwClose(CurrentUserKey); - - if (NT_SUCCESS(Status)) + cbSize = sizeof(awcBuffer); + if (!RegReadUserSetting(pwszKey, pwszValue, REG_SZ, awcBuffer, cbSize)) { - ZwSetValueKey(KeyHandle, KeyName, 0, Type, Data, DataSize); - ZwClose(KeyHandle); + return iValue; } - return Status; + return _wtoi(awcBuffer); } -#if 0 -/* not used at the moment */ -/* FIXME: currently only supporting known DataSize */ -static NTSTATUS FASTCALL -IntReadSystemParametersSettings(PUNICODE_STRING SubKeyName, - PUNICODE_STRING KeyName, - ULONG Type, - PVOID Data, - ULONG DataSize) +static +INT +SpiLoadMouse(LPWSTR pwszValue, INT iValue) { - UNICODE_STRING KeyPath; - ULONG Length, ReqLength; - NTSTATUS Status; - HANDLE CurrentUserKey, KeyHandle; - OBJECT_ATTRIBUTES KeyAttributes, ObjectAttributes; - PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; - - /* Get a handle to the current users settings */ - Status = RtlFormatCurrentUserKeyPath(&KeyPath); - if(!NT_SUCCESS(Status)) { - return Status; - } - - InitializeObjectAttributes(&ObjectAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, NULL, NULL); - /* Open the HKCU key */ - Status = ZwOpenKey(&CurrentUserKey, KEY_READ, &ObjectAttributes); - if(!NT_SUCCESS(Status)) { - RtlFreeUnicodeString(&KeyPath); - return Status; - } - RtlFreeUnicodeString(&KeyPath); - - /* Open up the settings to read the values */ - InitializeObjectAttributes(&KeyAttributes, SubKeyName, OBJ_CASE_INSENSITIVE, CurrentUserKey, NULL); - Status = ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes); - ZwClose(CurrentUserKey); - RtlFreeUnicodeString(&KeyPath); - if(!NT_SUCCESS(Status)) { - return Status; - } - - Length = sizeof(KEY_VALUE_PARTIAL_INFORMATION)+DataSize; - KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, Length, TAG_WINSTA); - if(KeyValuePartialInfo) { - Status = ZwQueryValueKey(KeyHandle, KeyName, KeyValuePartialInformation, (PVOID)KeyValuePartialInfo, Length, &ReqLength); - if(NT_SUCCESS(Status)) { - RtlCopyMemory(Data, KeyValuePartialInfo->Data, DataSize); - } else { - } - ExFreePoolWithTag(KeyValuePartialInfo, TAG_WINSTA); - } else { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - ZwClose(KeyHandle); - - return Status; + return SpiLoadInt(KEY_MOUSE, pwszValue, iValue); } + +static +INT +SpiLoadMetric(LPWSTR pwszValue, INT iValue) +{ + INT iRegVal; + + iRegVal = SpiLoadInt(KEY_METRIC, pwszValue, METRIC2REG(iValue)); + DPRINT("Loaded metric setting '%S', iValue=%d(reg:%d), ret=%d(reg:%d)\n", + pwszValue, iValue, METRIC2REG(iValue), REG2METRIC(iRegVal), iRegVal); + return REG2METRIC(iRegVal); +} + +static +VOID +SpiLoadFont(PLOGFONTW plfOut, LPWSTR pwszValueName, PLOGFONTW plfDefault) +{ + BOOL bResult; + + bResult = RegReadUserSetting(KEY_METRIC, + pwszValueName, + REG_BINARY, + plfOut, + sizeof(LOGFONTW)); + if (!bResult) + *plfOut = *plfDefault; +} + +static +VOID +SpiFixupValues() +{ + /* Fixup values */ + gspv.ncm.iCaptionWidth = max(gspv.ncm.iCaptionWidth, 8); + gspv.ncm.iBorderWidth = max(gspv.ncm.iBorderWidth, 1); + gspv.ncm.iScrollWidth = max(gspv.ncm.iScrollWidth, 8); + gspv.ncm.iScrollHeight = max(gspv.ncm.iScrollHeight, 8); +// gspv.ncm.iMenuHeight = max(gspv.ncm.iMenuHeight, gspv.tmMenuFont.tmHeight); +// gspv.ncm.iMenuHeight = max(gspv.ncm.iMenuHeight, +// 2 + gspv.tmMenuFont.tmHeight + +// gspv.tmMenuFont.tmExternalLeading); + if (gspv.iDblClickTime == 0) gspv.iDblClickTime = 500; + + // FIXME: hack!!! + gspv.tmMenuFont.tmHeight = 11; + gspv.tmMenuFont.tmExternalLeading = 2; + + gspv.tmCaptionFont.tmHeight = 11; + gspv.tmCaptionFont.tmExternalLeading = 2; + +} + +static +VOID +SpiUpdatePerUserSystemParameters() +{ + static LOGFONTW lf1 = {-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, + FALSE, ANSI_CHARSET, 0, 0, DEFAULT_QUALITY, + VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"}; + static LOGFONTW lf2 = {-11, 0, 0, 0, FW_BOLD, FALSE, FALSE, + FALSE, ANSI_CHARSET, 0, 0, DEFAULT_QUALITY, + VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"}; + + DPRINT("Enter SpiUpdatePerUserSystemParameters\n"); + + /* Clear the structure */ + memset(&gspv, 0, sizeof(gspv)); + + /* Load mouse settings */ + gspv.caiMouse.FirstThreshold = SpiLoadMouse(L"MouseThreshold1", 6); + gspv.caiMouse.SecondThreshold = SpiLoadMouse(L"MouseThreshold2", 10); + gspv.caiMouse.Acceleration = SpiLoadMouse(L"MouseSpeed", 1); + + /* Load NONCLIENTMETRICS */ + gspv.ncm.cbSize = sizeof(NONCLIENTMETRICSW); + gspv.ncm.iBorderWidth = SpiLoadMetric(L"BorderWidth", 1); + gspv.ncm.iScrollWidth = SpiLoadMetric(L"ScrollWidth", 16); + gspv.ncm.iScrollHeight = SpiLoadMetric(L"ScrollHeight", 16); + gspv.ncm.iCaptionWidth = SpiLoadMetric(L"CaptionWidth", 19); + gspv.ncm.iCaptionHeight = SpiLoadMetric(L"CaptionHeight", 19); + gspv.ncm.iSmCaptionWidth = SpiLoadMetric(L"SmCaptionWidth", 12); + gspv.ncm.iSmCaptionHeight = SpiLoadMetric(L"SmCaptionHeight", 14); + gspv.ncm.iMenuWidth = SpiLoadMetric(L"MenuWidth", 18); + gspv.ncm.iMenuHeight = SpiLoadMetric(L"MenuHeight", 18); +#if (WINVER >= 0x0600) + gspv.ncm.iPaddedBorderWidth = SpiLoadMetric(L"PaddedBorderWidth", 18); +#endif + SpiLoadFont(&gspv.ncm.lfCaptionFont, L"CaptionFont", &lf2); + SpiLoadFont(&gspv.ncm.lfSmCaptionFont, L"SmCaptionFont", &lf1); + SpiLoadFont(&gspv.ncm.lfMenuFont, L"MenuFont", &lf1); + SpiLoadFont(&gspv.ncm.lfStatusFont, L"StatusFont", &lf1); + SpiLoadFont(&gspv.ncm.lfMessageFont, L"MessageFont", &lf1); + + /* Load MINIMIZEDMETRICS */ + gspv.mm.cbSize = sizeof(MINIMIZEDMETRICS); + gspv.mm.iWidth = SpiLoadMetric(L"MinWidth", 160); + gspv.mm.iHorzGap = SpiLoadMetric(L"MinHorzGap", 160); + gspv.mm.iVertGap = SpiLoadMetric(L"MinVertGap", 24); + gspv.mm.iArrange = SpiLoadInt(KEY_METRIC, L"MinArrange", ARW_HIDE); + + /* Load ICONMETRICS */ + gspv.im.cbSize = sizeof(ICONMETRICSW); + gspv.im.iHorzSpacing = SpiLoadMetric(L"IconSpacing", 64); + gspv.im.iVertSpacing = SpiLoadMetric(L"IconVerticalspacing", 64); + gspv.im.iTitleWrap = SpiLoadMetric(L"IconTitleWrap", 0); + SpiLoadFont(&gspv.im.lfFont, L"IconFont", &lf1); + + /* Some hardcoded values for now */ + gspv.tmCaptionFont.tmAveCharWidth = 6; + gspv.bBeep = TRUE; + gspv.bFlatMenu = FALSE; + gspv.iDblClickTime = 500; + gspv.uiFocusBorderWidth = 1; + gspv.uiFocusBorderHeight = 1; + gspv.bMenuDropAlign = 1; + gspv.bDropShadow = 1; + gspv.dwUserPrefMask = UPM_DEFAULT; + gspv.dwMenuShowDelay = 100; + + gspv.bMouseBtnSwap = FALSE; + gspv.iMouseSpeed = 10; + gspv.iMouseHoverTime = 80; + gspv.iMouseHoverWidth = 4; + gspv.iMouseHoverHeight = 4; + gspv.iDblClickTime = 500; + gspv.iDblClickWidth = 4; + gspv.iDblClickHeight = 4; + gspv.iWheelScrollLines = 3; +#if (_WIN32_WINNT >= 0x0600) + gspv.uiWheelScrollChars = 1; #endif -static ULONG FASTCALL -IntUpdateUserPreferencesMask(PWINSTATION_OBJECT WinStaObject, UINT fWinIni) + gspv.iScrSaverTimeout = 10; + gspv.bScrSaverActive = FALSE; + gspv.bScrSaverRunning = FALSE; +#if(WINVER >= 0x0600) + gspv.bScrSaverSecure = FALSE; +#endif + + /* Make sure we don't use broken values */ + SpiFixupValues(); + + /* Update SystemMetrics */ + InitMetrics(); +} + +BOOL +InitSysParams() +{ + SpiUpdatePerUserSystemParameters(); + gbSpiInitialized = TRUE; + return TRUE; +} + + +BOOL +APIENTRY +NtUserUpdatePerUserSystemParameters( + DWORD dwReserved, + BOOL bEnable) +{ + BOOL bResult; + + DPRINT("Enter NtUserUpdatePerUserSystemParameters\n"); + UserEnterExclusive(); + + SpiUpdatePerUserSystemParameters(); + bResult = IntDesktopUpdatePerUserSettings(bEnable); + + DPRINT("Leave NtUserUpdatePerUserSystemParameters, returning %d\n", bResult); + UserLeave(); + + return bResult; +} + + +/** Storing the settings ******************************************************/ + +static +VOID +SpiStoreSz(PCWSTR pwszKey, PCWSTR pwszValue, PCWSTR pwsz) +{ + RegWriteUserSetting(pwszKey, + pwszValue, + REG_SZ, + (PWSTR)pwsz, + wcslen(pwsz) * sizeof(WCHAR)); +} + +static +VOID +SpiStoreSzInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue) +{ + WCHAR awcBuffer[15]; + + _itow(iValue, awcBuffer, 10); + RegWriteUserSetting(pwszKey, + pwszValue, + REG_SZ, + awcBuffer, + (wcslen(awcBuffer) + 1) * sizeof(WCHAR)); +} + +static +VOID +SpiStoreMetric(LPCWSTR pwszValue, INT iValue) +{ + SpiStoreSzInt(KEY_METRIC, pwszValue, METRIC2REG(iValue)); +} + +static +VOID +SpiStoreFont(PCWSTR pwszValue, LOGFONTW* plogfont) +{ + RegWriteUserSetting(KEY_METRIC, + pwszValue, + REG_BINARY, + plogfont, + sizeof(LOGFONTW)); +} + + +/** Get/Set value *************************************************************/ + +// FIXME: get rid of the flags and only use this from um. kernel can access data directly. +static +UINT_PTR +SpiMemCopy(PVOID pvDst, PVOID pvSrc, ULONG cbSize, BOOL bProtect, BOOL bToUser) { NTSTATUS Status = STATUS_SUCCESS; - UNICODE_STRING SubKeyName = RTL_CONSTANT_STRING(L"Control Panel\\Desktop"); - UNICODE_STRING UserPreferencesMask = RTL_CONSTANT_STRING(L"UserPreferencesMask"); - if (fWinIni & SPIF_UPDATEINIFILE) + if (bProtect) { - Status = IntWriteSystemParametersSettings( - &SubKeyName, - &UserPreferencesMask, - REG_BINARY, - &WinStaObject->UserPreferences, - sizeof(USERPREFERENCESMASK)); - if(!NT_SUCCESS(Status)) + _SEH2_TRY { - DPRINT1("Registry update of UserPreferencesMask failed (%0X)\n",Status); + if (bToUser) + { + ProbeForWrite(pvDst, cbSize, 1); + } + else + { + ProbeForRead(pvSrc, cbSize, 1); + } + memcpy(pvDst, pvSrc, cbSize); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END + } + else + { + memcpy(pvDst, pvSrc, cbSize); + } + + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + DPRINT("SpiMemCopy failed, pvDst=%p, pvSrc=%p, bProtect=%d, bToUser=%d\n", pvDst, pvSrc, bProtect, bToUser); + } + return NT_SUCCESS(Status); +} + +static inline +UINT_PTR +SpiGet(PVOID pvParam, PVOID pvData, ULONG cbSize, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_ACCESS_DENIED); + return SpiMemCopy(pvParam, pvData, cbSize, fl & SPIF_PROTECT, TRUE); +} + +static inline +UINT_PTR +SpiSet(PVOID pvData, PVOID pvParam, ULONG cbSize, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + return SpiMemCopy(pvData, pvParam, cbSize, fl & SPIF_PROTECT, FALSE); +} + +static inline +UINT_PTR +SpiGetEx(PVOID pvParam, PVOID pvData, ULONG cbSize, FLONG fl) +{ + ULONG cbBufSize; + /* Get the cbSite member from UM memory */ + if (!SpiSet(&cbBufSize, pvParam, sizeof(ULONG), fl)) + return 0; + /* Verify the correct size */ + if (cbBufSize != cbSize) + return 0; + return SpiGet(pvParam, pvData, cbSize, fl); +} + +static inline +UINT_PTR +SpiGetInt(PVOID pvParam, PVOID piValue, FLONG fl) +{ + return SpiGet(pvParam, piValue, sizeof(INT), fl); +} + +static inline +UINT_PTR +SpiSetYesNo(BOOL *pbData, BOOL bValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + *pbData = bValue ? TRUE : FALSE; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSz(pwszKey, pwszValue, bValue ? L"Yes" : L"No"); + } + return (UINT_PTR)pwszKey; +} + +static inline +UINT_PTR +SpiSetBool(BOOL *pbData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + *pbData = iValue ? TRUE : FALSE; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSzInt(pwszKey, pwszValue, iValue); + } + return (UINT_PTR)pwszKey; +} + +static inline +UINT_PTR +SpiSetInt(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + *(INT*)pvData = iValue; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSzInt(pwszKey, pwszValue, iValue); + } + return (UINT_PTR)pwszKey; +} + +static inline +UINT_PTR +SpiSetMetric(PVOID pvData, INT iValue, PCWSTR pwszValue, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + *(INT*)pvData = iValue; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreMetric(pwszValue, iValue); + } + return (UINT_PTR)KEY_METRIC; +} + +static inline +UINT_PTR +SpiSetUserPref(DWORD dwMask, PVOID pvValue, FLONG fl) +{ + DWORD dwRegMask; + BOOL bValue = pvValue ? 1 : 0; + + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + + /* Set or clear bit according to bValue */ + gspv.dwUserPrefMask = bValue ? gspv.dwUserPrefMask | dwMask : + gspv.dwUserPrefMask & ~dwMask; + + if (fl & SPIF_UPDATEINIFILE) + { + /* Read current value */ + RegReadUserSetting(KEY_DESKTOP, + L"UserPreferencesMask", + REG_BINARY, + &dwRegMask, + sizeof(DWORD)); + + /* Set or clear bit according to bValue */ + dwRegMask = bValue ? dwRegMask | dwMask : dwRegMask & ~dwMask; + + /* write back value */ + RegWriteUserSetting(KEY_DESKTOP, + L"UserPreferencesMask", + REG_BINARY, + &dwRegMask, + sizeof(DWORD)); + } + + return (UINT_PTR)KEY_DESKTOP; +} + +static inline +UINT_PTR +SpiGetUserPref(DWORD dwMask, PVOID pvParam, FLONG fl) +{ + INT iValue = gspv.dwUserPrefMask & dwMask ? 1 : 0; + return SpiGetInt(pvParam, &iValue, fl); +} + +static +UINT_PTR +SpiSetWallpaper(PVOID pvParam, FLONG fl) +{ + UNICODE_STRING ustr; + WCHAR awc[MAX_PATH]; + BOOL bResult; + HBITMAP hbmp, hOldBitmap; + SURFACE *psurfBmp; + ULONG ulTile, ulStyle; + + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + + if (!pvParam) + { + /* FIXME: Reset Wallpaper to registry value */ + return (UINT_PTR)KEY_DESKTOP; + } + + /* Capture UNICODE_STRING */ + bResult = SpiMemCopy(&ustr, pvParam, sizeof(UNICODE_STRING), fl & SPIF_PROTECT, 0); + if (!bResult) return 0; + if (ustr.Length > MAX_PATH * sizeof(WCHAR)) + return 0; + + /* Copy the string buffer name */ + bResult = SpiMemCopy(gspv.awcWallpaper, ustr.Buffer, ustr.Length, fl & SPIF_PROTECT, 0); + if (!bResult) return 0; + + /* Update the UNICODE_STRING */ + gspv.ustrWallpaper.Buffer = gspv.awcWallpaper; + gspv.ustrWallpaper.MaximumLength = MAX_PATH * sizeof(WCHAR); + gspv.ustrWallpaper.Length = ustr.Length; + gspv.awcWallpaper[ustr.Length / sizeof(WCHAR)] = 0; + + DPRINT("SpiSetWallpaper, name=%S\n", gspv.awcWallpaper); + + /* Update registry */ + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSz(KEY_DESKTOP, L"Wallpaper", gspv.awcWallpaper); + } + + /* Got a filename? */ + if (gspv.awcWallpaper[0] != 0) + { + /* Convert file name to nt file name */ + ustr.Buffer = awc; + ustr.MaximumLength = MAX_PATH * sizeof(WCHAR); + ustr.Length = 0; + if (!W32kDosPathNameToNtPathName(gspv.awcWallpaper, &ustr)) + { + DPRINT1("RtlDosPathNameToNtPathName_U failed\n"); + return 0; + } + + /* Load the Bitmap */ + hbmp = UserLoadImage(ustr.Buffer); + if (!hbmp) + { + DPRINT1("UserLoadImage failed\n"); + return 0; + } + + /* Try to get the size of the wallpaper */ + if(!(psurfBmp = SURFACE_LockSurface(hbmp))) + { + GreDeleteObject(hbmp); + return 0; + } + + gpwinstaCurrent->cxWallpaper = psurfBmp->SurfObj.sizlBitmap.cx; + gpwinstaCurrent->cyWallpaper = psurfBmp->SurfObj.sizlBitmap.cy; + gpwinstaCurrent->WallpaperMode = wmCenter; + + SURFACE_UnlockSurface(psurfBmp); + + /* Change the bitmap's ownership */ + GDIOBJ_SetOwnership(hbmp, NULL); + + /* Yes, Windows really loads the current setting from the registry. */ + ulTile = SpiLoadInt(KEY_DESKTOP, L"TileWallpaper", 0); + ulStyle = SpiLoadInt(KEY_DESKTOP, L"WallpaperStyle", 0); + DPRINT("SpiSetWallpaper: ulTile=%ld, ulStyle=%d\n", ulTile, ulStyle); + + /* Check the values we found in the registry */ + if(ulTile && !ulStyle) + { + gpwinstaCurrent->WallpaperMode = wmTile; + } + else if(!ulTile && ulStyle == 2) + { + gpwinstaCurrent->WallpaperMode = wmStretch; } } - return Status; + else + { + /* Remove wallpaper */ + gpwinstaCurrent->cxWallpaper = 0; + gpwinstaCurrent->cyWallpaper = 0; + hbmp = 0; + } + + /* Take care of the old wallpaper, if any */ + hOldBitmap = gpwinstaCurrent->hbmWallpaper; + if(hOldBitmap != NULL) + { + /* Delete the old wallpaper */ + GDIOBJ_SetOwnership(hOldBitmap, PsGetCurrentProcess()); + GreDeleteObject(hOldBitmap); + } + + /* Set the new wallpaper */ + gpwinstaCurrent->hbmWallpaper = hbmp; + + NtUserRedrawWindow(UserGetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE); + + + return (UINT_PTR)KEY_DESKTOP; } -ULONG FASTCALL -IntSystemParametersInfo( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni) +static +UINT_PTR +SpiGetSet(UINT uiAction, UINT uiParam, PVOID pvParam, FLONG fl) { - PWINSTATION_OBJECT WinStaObject; - NTSTATUS Status; - BOOL bChanged = FALSE; + switch (uiAction) + { + case SPI_GETBEEP: + return SpiGetInt(pvParam, &gspv.bBeep, fl); - static BOOL bInitialized = FALSE; - static LOGFONTW IconFont; - static NONCLIENTMETRICSW pMetrics; - static MINIMIZEDMETRICS MinimizedMetrics; - static BOOL GradientCaptions = TRUE; - static UINT FocusBorderHeight = 1; - static UINT FocusBorderWidth = 1; - static ANIMATIONINFO anim; - static STICKYKEYS StickyKeys = {sizeof(STICKYKEYS), 0x1fa}; - static FILTERKEYS FilterKeys = {sizeof(FILTERKEYS), 0, 0, 0, 0, 0}; - static TOGGLEKEYS ToggleKeys = {sizeof(TOGGLEKEYS), 0}; - static MOUSEKEYS MouseKeys = {sizeof(MOUSEKEYS), 0, 0, 0, 0, 0, 0}; - static BOOL KeyboardPref = FALSE; - static BOOL ShowSounds = FALSE; - static ACCESSTIMEOUT AccessTimeout = {sizeof(ACCESSTIMEOUT), 0, 0}; - static DWORD CaretWidth = 1; - static SERIALKEYS SerialKeys = {sizeof(SERIALKEYS), 0, 0, 0, 0, 0, 0}; + case SPI_SETBEEP: + return SpiSetYesNo(&gspv.bBeep, uiParam, KEY_SOUND, VAL_BEEP, fl); - if (!bInitialized) - { - RtlZeroMemory(&IconFont, sizeof(LOGFONTW)); - RtlZeroMemory(&pMetrics, sizeof(NONCLIENTMETRICSW)); + case SPI_GETMOUSE: + return SpiGet(pvParam, &gspv.caiMouse, 3 * sizeof(INT), fl); - IntGetFontMetricSetting(L"CaptionFont", &pMetrics.lfCaptionFont); - IntGetFontMetricSetting(L"SmCaptionFont", &pMetrics.lfSmCaptionFont); - IntGetFontMetricSetting(L"MenuFont", &pMetrics.lfMenuFont); - IntGetFontMetricSetting(L"StatusFont", &pMetrics.lfStatusFont); - IntGetFontMetricSetting(L"MessageFont", &pMetrics.lfMessageFont); - IntGetFontMetricSetting(L"IconFont", &IconFont); - - pMetrics.iBorderWidth = 1; - pMetrics.iScrollWidth = UserGetSystemMetrics(SM_CXVSCROLL); - pMetrics.iScrollHeight = UserGetSystemMetrics(SM_CYHSCROLL); - pMetrics.iCaptionWidth = UserGetSystemMetrics(SM_CXSIZE); - pMetrics.iCaptionHeight = UserGetSystemMetrics(SM_CYSIZE); - pMetrics.iSmCaptionWidth = UserGetSystemMetrics(SM_CXSMSIZE); - pMetrics.iSmCaptionHeight = UserGetSystemMetrics(SM_CYSMSIZE); - pMetrics.iMenuWidth = UserGetSystemMetrics(SM_CXMENUSIZE); - pMetrics.iMenuHeight = UserGetSystemMetrics(SM_CYMENUSIZE); - pMetrics.cbSize = sizeof(NONCLIENTMETRICSW); - - MinimizedMetrics.cbSize = sizeof(MINIMIZEDMETRICS); - MinimizedMetrics.iWidth = UserGetSystemMetrics(SM_CXMINIMIZED); - MinimizedMetrics.iHorzGap = UserGetSystemMetrics(SM_CXMINSPACING); - MinimizedMetrics.iVertGap = UserGetSystemMetrics(SM_CYMINSPACING); - MinimizedMetrics.iArrange = ARW_HIDE; - - bInitialized = TRUE; - } - - switch(uiAction) - { - case SPI_GETDRAGFULLWINDOWS: - /* FIXME: Implement this, don't just return constant */ - *(PBOOL)pvParam = FALSE; - break; - - case SPI_SETKEYBOARDCUES: - case SPI_SETMENUANIMATION: - case SPI_SETMENUFADE: - case SPI_SETTOOLTIPANIMATION: - case SPI_SETTOOLTIPFADE: - case SPI_SETDOUBLECLKWIDTH: - case SPI_SETDOUBLECLKHEIGHT: - case SPI_SETDOUBLECLICKTIME: - case SPI_SETDESKWALLPAPER: - case SPI_SETSCREENSAVERRUNNING: - case SPI_SETSCREENSAVETIMEOUT: - case SPI_SETFLATMENU: - case SPI_SETMOUSEHOVERTIME: - case SPI_SETMOUSEHOVERWIDTH: - case SPI_SETMOUSEHOVERHEIGHT: - case SPI_SETMOUSE: - case SPI_SETMOUSESPEED: - case SPI_SETMOUSEBUTTONSWAP: - /* We will change something, so set the flag here */ - bChanged = TRUE; - case SPI_GETKEYBOARDCUES: - case SPI_GETMENUANIMATION: - case SPI_GETMENUFADE: - case SPI_GETTOOLTIPANIMATION: - case SPI_GETTOOLTIPFADE: - case SPI_GETDESKWALLPAPER: - case SPI_GETWHEELSCROLLLINES: - case SPI_GETWHEELSCROLLCHARS: - case SPI_GETSCREENSAVERRUNNING: - case SPI_GETSCREENSAVETIMEOUT: - case SPI_GETSCREENSAVEACTIVE: - case SPI_GETFLATMENU: - case SPI_GETMOUSEHOVERTIME: - case SPI_GETMOUSEHOVERWIDTH: - case SPI_GETMOUSEHOVERHEIGHT: - case SPI_GETMOUSE: - case SPI_GETMOUSESPEED: - { - PSYSTEM_CURSORINFO CurInfo; - - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObject); - if(!NT_SUCCESS(Status)) + case SPI_SETMOUSE: + if (!SpiSet(&gspv.caiMouse, pvParam, 3 * sizeof(INT), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) { - SetLastNtError(Status); - return (DWORD)FALSE; + SpiStoreSzInt(KEY_MOUSE, VAL_MOUSE1, gspv.caiMouse.FirstThreshold); + SpiStoreSzInt(KEY_MOUSE, VAL_MOUSE2, gspv.caiMouse.SecondThreshold); + SpiStoreSzInt(KEY_MOUSE, VAL_MOUSE3, gspv.caiMouse.Acceleration); } + return (UINT_PTR)KEY_MOUSE; - switch(uiAction) - { - case SPI_GETKEYBOARDCUES: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bKeyboardCues; - break; - case SPI_GETMENUANIMATION: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bMenuAnimation; - break; - case SPI_GETMENUFADE: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bMenuFade; - break; - case SPI_GETTOOLTIPANIMATION: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bTooltipAnimation; - break; - case SPI_GETTOOLTIPFADE: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bTooltipFade; - break; - case SPI_SETKEYBOARDCUES: - WinStaObject->UserPreferences.bKeyboardCues = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_SETMENUANIMATION: - WinStaObject->UserPreferences.bMenuAnimation = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_SETMENUFADE: - WinStaObject->UserPreferences.bMenuFade = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_SETTOOLTIPANIMATION: - WinStaObject->UserPreferences.bTooltipAnimation = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_SETTOOLTIPFADE: - WinStaObject->UserPreferences.bTooltipFade = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_GETFLATMENU: - ASSERT(pvParam); - *((UINT*)pvParam) = WinStaObject->FlatMenu; - break; - case SPI_SETFLATMENU: - WinStaObject->FlatMenu = (BOOL)pvParam; - break; - case SPI_GETSCREENSAVETIMEOUT: - ASSERT(pvParam); - *((UINT*)pvParam) = WinStaObject->ScreenSaverTimeOut; - break; - case SPI_SETSCREENSAVETIMEOUT: - WinStaObject->ScreenSaverTimeOut = uiParam; - break; - case SPI_GETSCREENSAVERRUNNING: - if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning; - break; - case SPI_SETSCREENSAVERRUNNING: - if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning; - WinStaObject->ScreenSaverRunning = uiParam; - break; - case SPI_SETSCREENSAVEACTIVE: - WinStaObject->ScreenSaverActive = uiParam; - break; - case SPI_GETSCREENSAVEACTIVE: - if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverActive; - break; - case SPI_GETWHEELSCROLLLINES: - ASSERT(pvParam); - CurInfo = IntGetSysCursorInfo(WinStaObject); - *((UINT*)pvParam) = CurInfo->WheelScroLines; - /* FIXME add this value to scroll list as scroll value ?? */ - break; - case SPI_GETWHEELSCROLLCHARS: - ASSERT(pvParam); - CurInfo = IntGetSysCursorInfo(WinStaObject); - *((UINT*)pvParam) = CurInfo->WheelScroChars; - // FIXME add this value to scroll list as scroll value ?? - break; - case SPI_SETDOUBLECLKWIDTH: - CurInfo = IntGetSysCursorInfo(WinStaObject); - /* FIXME limit the maximum value? */ - CurInfo->DblClickWidth = uiParam; - break; - case SPI_SETDOUBLECLKHEIGHT: - CurInfo = IntGetSysCursorInfo(WinStaObject); - /* FIXME limit the maximum value? */ - CurInfo->DblClickHeight = uiParam; - break; - case SPI_SETDOUBLECLICKTIME: - CurInfo = IntGetSysCursorInfo(WinStaObject); - /* FIXME limit the maximum time to 1000 ms? */ - CurInfo->DblClickSpeed = uiParam; - break; - case SPI_GETMOUSEHOVERTIME: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *((UINT*)pvParam) = CurInfo->MouseHoverTime; - break; - case SPI_SETMOUSEHOVERTIME: - /* see http://msdn2.microsoft.com/en-us/library/ms724947.aspx - * copy text from it, if some agument why xp and 2003 behovir diffent - * only if they do not have SP install - * " Windows Server 2003 and Windows XP: The operating system does not - * enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until - * Windows Server 2003 SP1 and Windows XP SP2 " - */ - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->MouseHoverTime = uiParam; - if(CurInfo->MouseHoverTime < USER_TIMER_MINIMUM) - { - CurInfo->MouseHoverTime = USER_TIMER_MINIMUM; - } - if(CurInfo->MouseHoverTime > USER_TIMER_MAXIMUM) - { - CurInfo->MouseHoverTime = USER_TIMER_MAXIMUM; - } + case SPI_GETBORDER: + return SpiGetInt(pvParam, &gspv.ncm.iBorderWidth, fl); - break; - case SPI_GETMOUSEHOVERWIDTH: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *(PUINT)pvParam = CurInfo->MouseHoverWidth; - break; - case SPI_GETMOUSEHOVERHEIGHT: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *(PUINT)pvParam = CurInfo->MouseHoverHeight; - break; - case SPI_SETMOUSEHOVERWIDTH: - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->MouseHoverWidth = uiParam; - break; - case SPI_SETMOUSEHOVERHEIGHT: - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->MouseHoverHeight = uiParam; - break; - case SPI_SETMOUSEBUTTONSWAP: - { - UNICODE_STRING SubKeyName = RTL_CONSTANT_STRING(L"Control Panel\\Mouse"); - UNICODE_STRING SwapMouseButtons = RTL_CONSTANT_STRING(L"SwapMouseButtons"); - WCHAR szBuffer[10]; + case SPI_SETBORDER: + uiParam = max(uiParam, 1); + return SpiSetInt(&gspv.ncm.iBorderWidth, uiParam, KEY_METRIC, VAL_BORDER, fl); - swprintf(szBuffer, L"%u", uiParam); - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->SwapButtons = uiParam; - IntWriteSystemParametersSettings(&SubKeyName, &SwapMouseButtons, REG_SZ, szBuffer, (wcslen(szBuffer)+1) * sizeof(WCHAR)); - break; - } - case SPI_SETMOUSE: - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->CursorAccelerationInfo = *(PCURSORACCELERATION_INFO)pvParam; - break; - case SPI_GETMOUSE: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *(PCURSORACCELERATION_INFO)pvParam = CurInfo->CursorAccelerationInfo; - break; - case SPI_SETMOUSESPEED: - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->MouseSpeed = (UINT)pvParam; - /* Limit value to 1...20 range */ - if(CurInfo->MouseSpeed < 1) - { - CurInfo->MouseSpeed = 1; - } - else if(CurInfo->MouseSpeed > 20) - { - CurInfo->MouseSpeed = 20; - } - break; - case SPI_GETMOUSESPEED: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *(PUINT)pvParam = CurInfo->MouseSpeed; - break; - case SPI_SETDESKWALLPAPER: - { - /* This function expects different parameters than the user mode version! + case SPI_GETKEYBOARDSPEED: + return SpiGetInt(pvParam, &gspv.dwKbdSpeed, fl); - We let the user mode code load the bitmap, it passed the handle to - the bitmap. We'll change it's ownership to system and replace it with - the current wallpaper bitmap */ - HBITMAP hOldBitmap, hNewBitmap; - UNICODE_STRING Key = RTL_CONSTANT_STRING(L"Control Panel\\Desktop"); - UNICODE_STRING Tile = RTL_CONSTANT_STRING(L"TileWallpaper"); - UNICODE_STRING Style = RTL_CONSTANT_STRING(L"WallpaperStyle"); - UNICODE_STRING KeyPath; - OBJECT_ATTRIBUTES KeyAttributes; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS Status; - HANDLE CurrentUserKey = NULL; - HANDLE KeyHandle = NULL; - PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; - ULONG Length = 0; - ULONG ResLength = 0; - ULONG TileNum = 0; - ULONG StyleNum = 0; - ASSERT(pvParam); + case SPI_SETKEYBOARDSPEED: + return SpiSetInt(&gspv.dwKbdSpeed, uiParam, KEY_KBD, VAL_KBDSPD, fl); - hNewBitmap = *(HBITMAP*)pvParam; - if(hNewBitmap != NULL) - { - SURFACE *psurfBmp; - /* try to get the size of the wallpaper */ - if(!(psurfBmp = SURFACE_LockSurface(hNewBitmap))) - { - ObDereferenceObject(WinStaObject); - return FALSE; - } - WinStaObject->cxWallpaper = psurfBmp->SurfObj.sizlBitmap.cx; - WinStaObject->cyWallpaper = psurfBmp->SurfObj.sizlBitmap.cy; - - SURFACE_UnlockSurface(psurfBmp); - - /* change the bitmap's ownership */ - GDIOBJ_SetOwnership(hNewBitmap, NULL); - } - hOldBitmap = (HBITMAP)InterlockedExchange((LONG*)&WinStaObject->hbmWallpaper, (LONG)hNewBitmap); - if(hOldBitmap != NULL) - { - /* delete the old wallpaper */ - GreDeleteObject(hOldBitmap); - } - - /* Set the style */ - /*default value is center */ - WinStaObject->WallpaperMode = wmCenter; - - /* Get a handle to the current users settings */ - RtlFormatCurrentUserKeyPath(&KeyPath); - InitializeObjectAttributes(&ObjectAttributes,&KeyPath,OBJ_CASE_INSENSITIVE,NULL,NULL); - ZwOpenKey(&CurrentUserKey, KEY_READ, &ObjectAttributes); - RtlFreeUnicodeString(&KeyPath); - - /* open up the settings to read the values */ - InitializeObjectAttributes(&KeyAttributes, &Key, OBJ_CASE_INSENSITIVE, - CurrentUserKey, NULL); - ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes); - ZwClose(CurrentUserKey); - - /* read the tile value in the registry */ - Status = ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation, - 0, 0, &ResLength); - - /* fall back to .DEFAULT if we didnt find values */ - if(Status == STATUS_INVALID_HANDLE) - { - RtlInitUnicodeString (&KeyPath,L"\\Registry\\User\\.Default\\Control Panel\\Desktop"); - InitializeObjectAttributes(&KeyAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, - NULL, NULL); - ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes); - ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation, - 0, 0, &ResLength); - } - - ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION); - KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); - Length = ResLength; - - if(!KeyValuePartialInfo) - { - NtClose(KeyHandle); - return FALSE; - } - - Status = ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation, - (PVOID)KeyValuePartialInfo, Length, &ResLength); - if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ)) - { - ZwClose(KeyHandle); - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - return FALSE; - } - - Tile.Length = KeyValuePartialInfo->DataLength; - Tile.MaximumLength = KeyValuePartialInfo->DataLength; - Tile.Buffer = (PWSTR)KeyValuePartialInfo->Data; - - Status = RtlUnicodeStringToInteger(&Tile, 0, &TileNum); - if(!NT_SUCCESS(Status)) - { - TileNum = 0; - } - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - - /* start over again and look for the style*/ - ResLength = 0; - Status = ZwQueryValueKey(KeyHandle, &Style, KeyValuePartialInformation, - 0, 0, &ResLength); - - ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION); - KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); - Length = ResLength; - - if(!KeyValuePartialInfo) - { - ZwClose(KeyHandle); - return FALSE; - } - - Status = ZwQueryValueKey(KeyHandle, &Style, KeyValuePartialInformation, - (PVOID)KeyValuePartialInfo, Length, &ResLength); - if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ)) - { - ZwClose(KeyHandle); - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - return FALSE; - } - - Style.Length = KeyValuePartialInfo->DataLength; - Style.MaximumLength = KeyValuePartialInfo->DataLength; - Style.Buffer = (PWSTR)KeyValuePartialInfo->Data; - - Status = RtlUnicodeStringToInteger(&Style, 0, &StyleNum); - if(!NT_SUCCESS(Status)) - { - StyleNum = 0; - } - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - - /* Check the values we found in the registry */ - if(TileNum && !StyleNum) - { - WinStaObject->WallpaperMode = wmTile; - } - else if(!TileNum && StyleNum == 2) - { - WinStaObject->WallpaperMode = wmStretch; - } - - ZwClose(KeyHandle); - break; - } - case SPI_GETDESKWALLPAPER: - /* This function expects different parameters than the user mode version! - We basically return the current wallpaper handle - if any. The user - mode version should load the string from the registry and return it - without calling this function */ - - ASSERT(pvParam); - *(HBITMAP*)pvParam = (HBITMAP)WinStaObject->hbmWallpaper; - break; - } - - /* FIXME save the value to the registry */ - - ObDereferenceObject(WinStaObject); + case SPI_LANGDRIVER: + DPRINT1("SPI_LANGDRIVER is unimplemented\n"); break; - } - case SPI_SETWORKAREA: - { - RECTL *rc; + + case SPI_GETSCREENSAVETIMEOUT: + return SpiGetInt(pvParam, &gspv.iScrSaverTimeout, fl); + + case SPI_SETSCREENSAVETIMEOUT: + return SpiSetInt(&gspv.iScrSaverTimeout, uiParam, KEY_DESKTOP, VAL_SCRTO, fl); + + case SPI_GETSCREENSAVEACTIVE: + return SpiGetInt(pvParam, &gspv.bScrSaverActive, fl); + + case SPI_SETSCREENSAVEACTIVE: + return SpiSetInt(&gspv.bScrSaverActive, uiParam, KEY_DESKTOP, VAL_SCRACT, fl); + + case SPI_GETGRIDGRANULARITY: + return SpiGetInt(pvParam, &gspv.uiGridGranularity, fl); + + case SPI_SETGRIDGRANULARITY: + return SpiSetInt(&gspv.uiGridGranularity, uiParam, KEY_DESKTOP, VAL_GRID, fl); + + case SPI_GETDESKWALLPAPER: + uiParam = min(uiParam, gspv.ustrWallpaper.Length + 1); + return SpiGet(pvParam, gspv.awcWallpaper, uiParam, fl); + + case SPI_SETDESKWALLPAPER: + return SpiSetWallpaper(pvParam, fl); + + case SPI_SETDESKPATTERN: + DPRINT1("SPI_SETDESKPATTERN is unimplemented\n"); + break; + + case SPI_GETKEYBOARDDELAY: + return SpiGetInt(pvParam, &gspv.iKbdDelay, fl); + + case SPI_SETKEYBOARDDELAY: + return SpiSetInt(&gspv.iKbdDelay, uiParam, KEY_KBD, VAL_KBDDELAY, fl); + + case SPI_ICONHORIZONTALSPACING: + if (pvParam) + { + return SpiGetInt(pvParam, &gspv.im.iHorzSpacing, fl); + } + uiParam = max(uiParam, 32); + return SpiSetMetric(&gspv.im.iHorzSpacing, uiParam, VAL_ICONSPC, fl); + + case SPI_ICONVERTICALSPACING: + if (pvParam) + { + return SpiGetInt(pvParam, &gspv.im.iVertSpacing, fl); + } + uiParam = max(uiParam, 32); + return SpiSetMetric(&gspv.im.iVertSpacing, uiParam, VAL_ICONVSPC, fl); + + case SPI_GETICONTITLEWRAP: + return SpiGetInt(pvParam, &gspv.im.iTitleWrap, fl); + + case SPI_SETICONTITLEWRAP: + return SpiSetInt(&gspv.im.iTitleWrap, uiParam, KEY_METRIC, VAL_ITWRAP, fl); + + case SPI_GETMENUDROPALIGNMENT: + return SpiGetInt(pvParam, &gspv.bMenuDropAlign, fl); + + case SPI_SETMENUDROPALIGNMENT: + return SpiSetBool(&gspv.bMenuDropAlign, uiParam, KEY_MDALIGN, VAL_MDALIGN, fl); + + case SPI_SETDOUBLECLKWIDTH: + return SpiSetInt(&gspv.iDblClickWidth, uiParam, KEY_MOUSE, VAL_DBLCLKWIDTH, fl); + + case SPI_SETDOUBLECLKHEIGHT: + return SpiSetInt(&gspv.iDblClickHeight, uiParam, KEY_MOUSE, VAL_DBLCLKHEIGHT, fl); + + case SPI_GETICONTITLELOGFONT: + return SpiGet(pvParam, &gspv.im.lfFont, sizeof(LOGFONTW), fl); + + case SPI_SETICONTITLELOGFONT: + if (!SpiSet(&gspv.im.lfFont, pvParam, sizeof(LOGFONTW), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreFont(L"IconFont", &gspv.im.lfFont); + } + return (UINT_PTR)KEY_METRIC; + + case SPI_SETDOUBLECLICKTIME: + return SpiSetInt(&gspv.iDblClickTime, uiParam, KEY_MOUSE, VAL_DBLCLKTIME, fl); + + case SPI_SETMOUSEBUTTONSWAP: + return SpiSetInt(&gspv.bMouseBtnSwap, uiParam, KEY_MOUSE, VAL_SWAP, fl); + + case SPI_GETFASTTASKSWITCH: + return SpiGetInt(pvParam, &gspv.bFastTaskSwitch, fl); + + case SPI_SETFASTTASKSWITCH: + /* According to Winetest this one is unimplemented */ + return 0; + + case SPI_GETDRAGFULLWINDOWS: + return SpiGetInt(pvParam, &gspv.bDragFullWindows, fl); + + case SPI_SETDRAGFULLWINDOWS: + return SpiSetInt(&gspv.bDragFullWindows, uiParam, KEY_DESKTOP, VAL_DRAG, fl); + + case SPI_GETNONCLIENTMETRICS: + return SpiGet(pvParam, &gspv.ncm, sizeof(NONCLIENTMETRICSW), fl); + + case SPI_SETNONCLIENTMETRICS: + if (!SpiSet(&gspv.ncm, pvParam, sizeof(NONCLIENTMETRICSW), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreMetric(L"BorderWidth", gspv.ncm.iBorderWidth); + SpiStoreMetric(L"ScrollWidth", gspv.ncm.iScrollWidth); + SpiStoreMetric(L"ScrollHeight", gspv.ncm.iScrollHeight); + SpiStoreMetric(L"CaptionWidth", gspv.ncm.iCaptionWidth); + SpiStoreMetric(L"CaptionHeight", gspv.ncm.iCaptionHeight); + SpiStoreMetric(L"SmCaptionWidth", gspv.ncm.iSmCaptionWidth); + SpiStoreMetric(L"SmCaptionHeight", gspv.ncm.iSmCaptionHeight); + SpiStoreMetric(L"MenuWidth", gspv.ncm.iMenuWidth); + SpiStoreMetric(L"MenuHeight", gspv.ncm.iMenuHeight); +#if (WINVER >= 0x0600) + SpiStoreMetric(L"PaddedBorderWidth", gspv.ncm.iPaddedBorderWidth); +#endif + SpiStoreFont(L"CaptionFont", &gspv.ncm.lfCaptionFont); + SpiStoreFont(L"SmCaptionFont", &gspv.ncm.lfSmCaptionFont); + SpiStoreFont(L"MenuFont", &gspv.ncm.lfMenuFont); + SpiStoreFont(L"StatusFont", &gspv.ncm.lfStatusFont); + SpiStoreFont(L"MessageFont", &gspv.ncm.lfMessageFont); + } + return (UINT_PTR)KEY_METRIC; + + case SPI_GETMINIMIZEDMETRICS: + return SpiGet(pvParam, &gspv.mm, sizeof(MINIMIZEDMETRICS), fl); + + case SPI_SETMINIMIZEDMETRICS: + if (!SpiSet(&gspv.mm, pvParam, sizeof(MINIMIZEDMETRICS), fl)) + return 0; + gspv.mm.iWidth = max(0, gspv.mm.iWidth); + gspv.mm.iHorzGap = max(0, gspv.mm.iHorzGap); + gspv.mm.iVertGap = max(0, gspv.mm.iVertGap); + gspv.mm.iArrange = gspv.mm.iArrange & 0xf; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreMetric(L"MinWidth", gspv.mm.iWidth); + SpiStoreMetric(L"MinHorzGap", gspv.mm.iHorzGap); + SpiStoreMetric(L"MinVertGap", gspv.mm.iVertGap); + SpiStoreMetric(L"MinArrange", gspv.mm.iArrange); + } + return (UINT_PTR)KEY_METRIC; + + case SPI_GETICONMETRICS: + return SpiGet(pvParam, &gspv.im, sizeof(ICONMETRICS), fl); + + case SPI_SETICONMETRICS: + if (!SpiSet(&gspv.im, pvParam, sizeof(ICONMETRICS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreMetric(L"IconSpacing", gspv.im.iHorzSpacing); + SpiStoreMetric(L"IconVerticalspacing", gspv.im.iVertSpacing); + SpiStoreMetric(L"IconTitleWrap", gspv.im.iTitleWrap); + SpiStoreFont(L"IconFont", &gspv.im.lfFont); + } + return (UINT_PTR)KEY_METRIC; + + case SPI_GETWORKAREA: // FIXME: the workarea should be part of the MONITOR + { PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); - PDESKTOP Desktop = pti->Desktop; + PDESKTOP pdesktop = pti->Desktop; + RECTL rclWorkarea; - if(!Desktop) - { - /* FIXME - Set last error */ - return FALSE; - } + if(!pdesktop) + return 0; - ASSERT(pvParam); - rc = pvParam; - Desktop->WorkArea = *rc; - bChanged = TRUE; + IntGetDesktopWorkArea(pdesktop, &rclWorkarea); + return SpiGet(pvParam, &rclWorkarea, sizeof(RECTL), fl); + } - break; - } - case SPI_GETWORKAREA: - { + case SPI_SETWORKAREA: // FIXME: the workarea should be part of the MONITOR + { PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); - PDESKTOP Desktop = pti->Desktop; + PDESKTOP pdesktop = pti->Desktop; + RECT rcWorkArea; - if(!Desktop) + if(!pdesktop) + return 0; + + if (!SpiSet(&rcWorkArea, pvParam, sizeof(RECTL), fl)) + return 0; + + /* Verify the new values */ + if (rcWorkArea.left < 0 || + rcWorkArea.top < 0 || + rcWorkArea.right > gpsi->SystemMetrics[SM_CXSCREEN] || + rcWorkArea.bottom > gpsi->SystemMetrics[SM_CYSCREEN] || + rcWorkArea.right <= rcWorkArea.left || + rcWorkArea.bottom <= rcWorkArea.top) + return 0; + + pdesktop->WorkArea = rcWorkArea; + if (fl & SPIF_UPDATEINIFILE) { - /* FIXME - Set last error */ - return FALSE; + // FIXME: what to do? } + return (UINT_PTR)KEY_DESKTOP; + } - ASSERT(pvParam); - IntGetDesktopWorkArea(Desktop, pvParam); - + case SPI_SETPENWINDOWS: + DPRINT1("SPI_SETPENWINDOWS is unimplemented\n"); break; - } - case SPI_SETGRADIENTCAPTIONS: - { - GradientCaptions = (pvParam != NULL); - /* FIXME - should be checked if the color depth is higher than 8bpp? */ - bChanged = TRUE; - break; - } - case SPI_GETGRADIENTCAPTIONS: - { - HDC hDC; - BOOL Ret = GradientCaptions; - hDC = IntGetScreenDC(); - if(!hDC) + case SPI_GETFILTERKEYS: + return SpiGet(pvParam, &gspv.filterkeys, sizeof(FILTERKEYS), fl); + + case SPI_SETFILTERKEYS: + if (!SpiSet(&gspv.filterkeys, pvParam, sizeof(FILTERKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) { - return FALSE; + // FIXME: what to do? } - Ret = (NtGdiGetDeviceCaps(hDC, BITSPIXEL) > 8) && Ret; + return (UINT_PTR)KEY_DESKTOP; - ASSERT(pvParam); - *((PBOOL)pvParam) = Ret; - break; - } - case SPI_SETFONTSMOOTHING: - { - IntEnableFontRendering(uiParam != 0); - bChanged = TRUE; - break; - } - case SPI_GETFONTSMOOTHING: - { - ASSERT(pvParam); - *((BOOL*)pvParam) = IntIsFontRenderingEnabled(); - break; - } - case SPI_SETFONTSMOOTHINGTYPE: - { - if (*((UINT*)pvParam) == FE_FONTSMOOTHINGCLEARTYPE) + case SPI_GETTOGGLEKEYS: + return SpiGet(pvParam, &gspv.togglekeys, sizeof(TOGGLEKEYS), fl); + + case SPI_SETTOGGLEKEYS: + if (!SpiSet(&gspv.togglekeys, pvParam, sizeof(TOGGLEKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) { - DPRINT1("ReactOS does not support ClearType smoothing but it is returned TRUE\n"); + // FIXME: what to do? } - bChanged = TRUE; - break; - } - case SPI_GETFONTSMOOTHINGTYPE: - { - /* We do not support ClearType. Only standard smoothing */ - DPRINT1("ReactOS does not support ClearType smoothing. Returned FE_FONTSMOOTHINGSTANDARD\n"); - *((UINT*)pvParam) = FE_FONTSMOOTHINGSTANDARD; - break; - } - case SPI_GETICONTITLELOGFONT: - { - ASSERT(pvParam); - *((LOGFONTW*)pvParam) = IconFont; - break; - } - case SPI_GETNONCLIENTMETRICS: - { - ASSERT(pvParam); - *((NONCLIENTMETRICSW*)pvParam) = pMetrics; - break; - } - case SPI_GETANIMATION: - { - ASSERT(pvParam); - *(( ANIMATIONINFO*)pvParam) = anim; - break; - } - case SPI_SETANIMATION: - { - ASSERT(pvParam); - anim = *((ANIMATIONINFO*)pvParam); - bChanged = TRUE; - } - case SPI_SETNONCLIENTMETRICS: - { - ASSERT(pvParam); - pMetrics = *((NONCLIENTMETRICSW*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETMINIMIZEDMETRICS: - { - ASSERT(pvParam); - *((MINIMIZEDMETRICS*)pvParam) = MinimizedMetrics; - break; - } - case SPI_SETMINIMIZEDMETRICS: - { - ASSERT(pvParam); - MinimizedMetrics = *((MINIMIZEDMETRICS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETFOCUSBORDERHEIGHT: - { - ASSERT(pvParam); - *((UINT*)pvParam) = FocusBorderHeight; - break; - } - case SPI_GETFOCUSBORDERWIDTH: - { - ASSERT(pvParam); - *((UINT*)pvParam) = FocusBorderWidth; - break; - } - case SPI_SETFOCUSBORDERHEIGHT: - { - FocusBorderHeight = (UINT)pvParam; - bChanged = TRUE; - break; - } - case SPI_SETFOCUSBORDERWIDTH: - { - FocusBorderWidth = (UINT)pvParam; - bChanged = TRUE; - break; - } - case SPI_GETSTICKYKEYS: - { - *((STICKYKEYS*)pvParam) = StickyKeys; - break; - } - case SPI_SETSTICKYKEYS: - { - StickyKeys = *((STICKYKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETFILTERKEYS: - { - *((FILTERKEYS*)pvParam) = FilterKeys; - break; - } - case SPI_SETFILTERKEYS: - { - FilterKeys = *((FILTERKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETTOGGLEKEYS: - { - *((TOGGLEKEYS*)pvParam) = ToggleKeys; - break; - } - case SPI_SETTOGGLEKEYS: - { - ToggleKeys = *((TOGGLEKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETSERIALKEYS: - { - *((SERIALKEYS*)pvParam) = SerialKeys; - break; - } - case SPI_SETSERIALKEYS: - { - SerialKeys = *((SERIALKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETMOUSEKEYS: - { - *((MOUSEKEYS*)pvParam) = MouseKeys; - break; - } - case SPI_SETMOUSEKEYS: - { - MouseKeys = *((MOUSEKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETKEYBOARDPREF: - { - *((BOOL*)pvParam) = KeyboardPref; - break; - } - case SPI_SETKEYBOARDPREF: - { - KeyboardPref = (BOOL)uiParam; - bChanged = TRUE; - break; - } - case SPI_GETSHOWSOUNDS: - { - *((BOOL*)pvParam) = ShowSounds; - break; - } - case SPI_SETSHOWSOUNDS: - { - ShowSounds = (BOOL)uiParam; - bChanged = TRUE; - break; - } - case SPI_GETACCESSTIMEOUT: - { - *((ACCESSTIMEOUT*)pvParam) = AccessTimeout; - break; - } - case SPI_SETACCESSTIMEOUT: - { - AccessTimeout = *((ACCESSTIMEOUT*)pvParam); - bChanged = TRUE; - break; - } + return (UINT_PTR)KEY_DESKTOP; - case SPI_GETCARETWIDTH: - { - *((DWORD*)pvParam) = CaretWidth; - break; - } + case SPI_GETMOUSEKEYS: + return SpiGet(pvParam, &gspv.mousekeys, sizeof(MOUSEKEYS), fl); - case SPI_SETCARETWIDTH: - { - CaretWidth = *((DWORD*)pvParam); - bChanged = TRUE; - break; - } + case SPI_SETMOUSEKEYS: + if (!SpiSet(&gspv.mousekeys, pvParam, sizeof(MOUSEKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; - default: - { - DPRINT1("FIXME: Unsupported SPI Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n", - uiAction, uiParam, pvParam, fWinIni); - return FALSE; - } - } - /* Did we change something ? */ - if (bChanged) - { - /* Shall we send a WM_SETTINGCHANGE message ? */ - if (fWinIni & (SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)) - { - /* Broadcast WM_SETTINGCHANGE to all toplevel windows */ - /* FIXME: lParam should be pointer to a string containing the reg key */ - UserPostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, (WPARAM)uiAction, 0); - } - } - return TRUE; + case SPI_GETSHOWSOUNDS: + return SpiGetInt(pvParam, &gspv.bShowSounds, fl); + + case SPI_SETSHOWSOUNDS: + return SpiSetBool(&gspv.bShowSounds, uiParam, KEY_SHOWSNDS, VAL_ON, fl); + + case SPI_GETSTICKYKEYS: + if (uiParam != sizeof(STICKYKEYS)) + return 0; + return SpiGetEx(pvParam, &gspv.stickykeys, sizeof(STICKYKEYS), fl); + + case SPI_SETSTICKYKEYS: + if (!SpiSet(&gspv.stickykeys, pvParam, sizeof(STICKYKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETACCESSTIMEOUT: + if (uiParam != 0 && uiParam != sizeof(ACCESSTIMEOUT)) + return 0; + return SpiGetEx(pvParam, &gspv.accesstimeout, sizeof(ACCESSTIMEOUT), fl); + + case SPI_SETACCESSTIMEOUT: + if (!SpiSet(&gspv.accesstimeout, pvParam, sizeof(ACCESSTIMEOUT), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETSERIALKEYS: + return SpiGet(pvParam, &gspv.serialkeys, sizeof(SERIALKEYS), fl); + + case SPI_SETSERIALKEYS: + if (!SpiSet(&gspv.serialkeys, pvParam, sizeof(SERIALKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETSOUNDSENTRY: + return SpiGet(pvParam, &gspv.soundsentry, sizeof(SOUNDSENTRY), fl); + + case SPI_SETSOUNDSENTRY: + if (!SpiSet(&gspv.soundsentry, pvParam, sizeof(SOUNDSENTRY), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETHIGHCONTRAST: + return SpiGet(pvParam, &gspv.highcontrast, sizeof(HIGHCONTRAST), fl); + + case SPI_SETHIGHCONTRAST: + if (!SpiSet(&gspv.highcontrast, pvParam, sizeof(HIGHCONTRAST), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETKEYBOARDPREF: + return SpiGetInt(pvParam, &gspv.bKbdPref, fl); + + case SPI_SETKEYBOARDPREF: + return SpiSetBool(&gspv.bKbdPref, uiParam, KEY_KDBPREF, VAL_ON, fl); + + case SPI_GETSCREENREADER: + return SpiGetInt(pvParam, &gspv.bScreenReader, fl); + + case SPI_SETSCREENREADER: + return SpiSetBool(&gspv.bScreenReader, uiParam, KEY_SCRREAD, VAL_ON, fl); + + case SPI_GETANIMATION: + return SpiGet(pvParam, &gspv.animationinfo, sizeof(ANIMATIONINFO), fl); + + case SPI_SETANIMATION: + if (!SpiSet(&gspv.animationinfo, pvParam, sizeof(ANIMATIONINFO), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETFONTSMOOTHING: + return SpiGetInt(pvParam, &gspv.bFontSmoothing, fl); + + case SPI_SETFONTSMOOTHING: + gspv.bFontSmoothing = uiParam ? TRUE : FALSE; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSzInt(KEY_DESKTOP, VAL_FNTSMOOTH, uiParam ? 2 : 0); + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_SETDRAGWIDTH: + return SpiSetInt(&gspv.iDragWidth, uiParam, KEY_DESKTOP, VAL_DRAGWIDTH, fl); + + case SPI_SETDRAGHEIGHT: + return SpiSetInt(&gspv.iDragHeight, uiParam, KEY_DESKTOP, VAL_DRAGHEIGHT, fl); + + case SPI_SETHANDHELD: + return SpiSetBool(&gspv.bHandHeld, uiParam, KEY_DESKTOP, L"HandHeld", fl); + + case SPI_GETLOWPOWERTIMEOUT: + return SpiGetInt(pvParam, &gspv.iLowPwrTimeout, fl); + + case SPI_GETPOWEROFFTIMEOUT: + return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl); + + case SPI_SETLOWPOWERTIMEOUT: + return SpiSetInt(&gspv.iLowPwrTimeout, uiParam, KEY_DESKTOP, L"LowPowerTimeOut", fl); + + case SPI_SETPOWEROFFTIMEOUT: + return SpiSetInt(&gspv.iPwrOffTimeout, uiParam, KEY_DESKTOP, L"PowerOffTimeOut", fl); + + case SPI_GETLOWPOWERACTIVE: + return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl); + + case SPI_GETPOWEROFFACTIVE: + return SpiGetInt(pvParam, &gspv.bPwrOffActive, fl); + + case SPI_SETLOWPOWERACTIVE: + return SpiSetBool(&gspv.bLowPwrActive, uiParam, KEY_DESKTOP, L"LowPowerActive", fl); + + case SPI_SETPOWEROFFACTIVE: + return SpiSetBool(&gspv.bPwrOffActive, uiParam, KEY_DESKTOP, L"PowerOffActive", fl); + + case SPI_SETCURSORS: + DPRINT1("SPI_SETCURSORS is unimplemented\n"); + break; + + case SPI_SETICONS: + DPRINT1("SPI_SETICONS is unimplemented\n"); + break; + + case SPI_GETDEFAULTINPUTLANG: + DPRINT1("SPI_GETDEFAULTINPUTLANG is unimplemented\n"); + break; + + case SPI_SETDEFAULTINPUTLANG: + DPRINT1("SPI_SETDEFAULTINPUTLANG is unimplemented\n"); + break; + + case SPI_SETLANGTOGGLE: + DPRINT1("SPI_SETLANGTOGGLE is unimplemented\n"); + break; + + case SPI_GETWINDOWSEXTENSION: + DPRINT1("SPI_GETWINDOWSEXTENSION is unimplemented\n"); + break; + + case SPI_GETMOUSETRAILS: + return SpiGetInt(pvParam, &gspv.iMouseTrails, fl); + + case SPI_SETMOUSETRAILS: + return SpiSetInt(&gspv.iMouseTrails, uiParam, KEY_MOUSE, L"MouseTrails", fl); + + case SPI_GETSNAPTODEFBUTTON: + return SpiGetInt(pvParam, &gspv.bSnapToDefBtn, fl); + + case SPI_SETSNAPTODEFBUTTON: + return SpiSetBool(&gspv.bSnapToDefBtn, uiParam, KEY_MOUSE, L"SnapToDefaultButton", fl); + + case SPI_GETMOUSEHOVERWIDTH: + return SpiGetInt(pvParam, &gspv.iMouseHoverWidth, fl); + + case SPI_SETMOUSEHOVERWIDTH: + return SpiSetInt(&gspv.iMouseHoverWidth, uiParam, KEY_MOUSE, L"MouseHoverWidth", fl); + + case SPI_GETMOUSEHOVERHEIGHT: + return SpiGetInt(pvParam, &gspv.iMouseHoverHeight, fl); + + case SPI_SETMOUSEHOVERHEIGHT: + return SpiSetInt(&gspv.iMouseHoverHeight, uiParam, KEY_MOUSE, L"MouseHoverHeight", fl); + + case SPI_GETMOUSEHOVERTIME: + return SpiGetInt(pvParam, &gspv.iMouseHoverTime, fl); + + case SPI_SETMOUSEHOVERTIME: + /* see http://msdn2.microsoft.com/en-us/library/ms724947.aspx + * copy text from it, if some agument why xp and 2003 behovir diffent + * only if they do not have SP install + * " Windows Server 2003 and Windows XP: The operating system does not + * enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until + * Windows Server 2003 SP1 and Windows XP SP2 " + */ + return SpiSetInt(&gspv.iMouseHoverTime, uiParam, KEY_MOUSE, L"MouseHoverTime", fl); + + case SPI_GETWHEELSCROLLLINES: + return SpiGetInt(pvParam, &gspv.iWheelScrollLines, fl); + + case SPI_SETWHEELSCROLLLINES: + return SpiSetInt(&gspv.iWheelScrollLines, uiParam, KEY_DESKTOP, L"WheelScrollLines", fl); + + case SPI_GETMENUSHOWDELAY: + return SpiGetInt(pvParam, &gspv.dwMenuShowDelay, fl); + + case SPI_SETMENUSHOWDELAY: + return SpiSetInt(&gspv.dwMenuShowDelay, uiParam, KEY_DESKTOP, L"MenuShowDelay", fl); + +#if (_WIN32_WINNT >= 0x0600) + case SPI_GETWHEELSCROLLCHARS: + return SpiGetInt(pvParam, &gspv.uiWheelScrollChars, fl); + + case SPI_SETWHEELSCROLLCHARS: + return SpiSetInt(&gspv.uiWheelScrollChars, uiParam, KEY_DESKTOP, L"WheelScrollChars", fl); +#endif + case SPI_GETSHOWIMEUI: + return SpiGetInt(pvParam, &gspv.bShowImeUi, fl); + + case SPI_SETSHOWIMEUI: + return SpiSetBool(&gspv.bShowImeUi, uiParam, KEY_DESKTOP, L"", fl); + + case SPI_GETMOUSESPEED: + return SpiGetInt(pvParam, &gspv.iMouseSpeed, fl); + + case SPI_SETMOUSESPEED: + // vgl SETMOUSE + return SpiSetInt(&gspv.iMouseSpeed, uiParam, KEY_MOUSE, L"MouseSpeed", fl); + + case SPI_GETSCREENSAVERRUNNING: + return SpiGetInt(pvParam, &gspv.bScrSaverRunning, fl); + + case SPI_SETSCREENSAVERRUNNING: + // FIXME: also return value? + return SpiSetBool(&gspv.bScrSaverRunning, uiParam, KEY_MOUSE, L"", fl); + +#if(WINVER >= 0x0600) + case SPI_GETAUDIODESCRIPTION: + return SpiGet(pvParam, &gspv.audiodesription, sizeof(AUDIODESCRIPTION), fl); + + case SPI_SETAUDIODESCRIPTION: + DPRINT1("SPI_SETAUDIODESCRIPTION is unimplemented\n"); + break; + + case SPI_GETSCREENSAVESECURE: + return SpiGetInt(pvParam, &gspv.bScrSaverSecure, fl); + + case SPI_SETSCREENSAVESECURE: + return SpiSetBool(&gspv.bScrSaverSecure, uiParam, KEY_DESKTOP, L"ScreenSaverIsSecure", fl); +#endif + + case SPI_GETACTIVEWINDOWTRACKING: + return SpiGetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl); + + case SPI_SETACTIVEWINDOWTRACKING: + return SpiSetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl); + + case SPI_GETMENUANIMATION: + return SpiGetUserPref(UPM_MENUANIMATION, pvParam, fl); + + case SPI_SETMENUANIMATION: + return SpiSetUserPref(UPM_MENUANIMATION, pvParam, fl); + + case SPI_GETCOMBOBOXANIMATION: + return SpiGetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl); + + case SPI_SETCOMBOBOXANIMATION: + return SpiSetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl); + + case SPI_GETLISTBOXSMOOTHSCROLLING: + return SpiGetUserPref(UPM_LISTBOXSMOOTHSCROLLING, pvParam, fl); + + case SPI_SETLISTBOXSMOOTHSCROLLING: + return SpiSetUserPref(UPM_LISTBOXSMOOTHSCROLLING, pvParam, fl); + + case SPI_GETGRADIENTCAPTIONS: + return SpiGetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl); + + case SPI_SETGRADIENTCAPTIONS: + return SpiSetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl); + + case SPI_GETKEYBOARDCUES: + return SpiGetUserPref(UPM_KEYBOARDCUES, pvParam, fl); + + case SPI_SETKEYBOARDCUES: + return SpiSetUserPref(UPM_KEYBOARDCUES, pvParam, fl); + + case SPI_GETACTIVEWNDTRKZORDER: + return SpiGetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl); + + case SPI_SETACTIVEWNDTRKZORDER: + return SpiSetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl); + + case SPI_GETHOTTRACKING: + return SpiGetUserPref(UPM_HOTTRACKING, pvParam, fl); + + case SPI_SETHOTTRACKING: + return SpiSetUserPref(UPM_HOTTRACKING, pvParam, fl); + + case SPI_GETMENUFADE: + return SpiGetUserPref(UPM_MENUFADE, pvParam, fl); + + case SPI_SETMENUFADE: + return SpiSetUserPref(UPM_MENUFADE, pvParam, fl); + + case SPI_GETSELECTIONFADE: + return SpiGetUserPref(UPM_SELECTIONFADE, pvParam, fl); + + case SPI_SETSELECTIONFADE: + return SpiSetUserPref(UPM_SELECTIONFADE, pvParam, fl); + + case SPI_GETTOOLTIPANIMATION: + return SpiGetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl); + + case SPI_SETTOOLTIPANIMATION: + return SpiSetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl); + + case SPI_GETTOOLTIPFADE: + return SpiGetUserPref(UPM_TOOLTIPFADE, pvParam, fl); + + case SPI_SETTOOLTIPFADE: + return SpiSetUserPref(UPM_TOOLTIPFADE, pvParam, fl); + + case SPI_GETCURSORSHADOW: + return SpiGetUserPref(UPM_CURSORSHADOW, pvParam, fl); + + case SPI_SETCURSORSHADOW: + return SpiSetUserPref(UPM_CURSORSHADOW, pvParam, fl); + + case SPI_GETUIEFFECTS: + return SpiGetUserPref(UPM_UIEFFECTS, pvParam, fl); + + case SPI_SETUIEFFECTS: + return SpiSetUserPref(UPM_UIEFFECTS, pvParam, fl); + + case SPI_GETMOUSESONAR: + return SpiGetInt(pvParam, &gspv.bMouseSonar, fl); + + case SPI_SETMOUSESONAR: + return SpiSetBool(&gspv.bMouseSonar, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETMOUSECLICKLOCK: + return SpiGetInt(pvParam, &gspv.bMouseClickLock, fl); + + case SPI_SETMOUSECLICKLOCK: + return SpiSetBool(&gspv.bMouseClickLock, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETMOUSEVANISH: + return SpiGetInt(pvParam, &gspv.bMouseVanish, fl); + + case SPI_SETMOUSEVANISH: + return SpiSetBool(&gspv.bMouseVanish, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFLATMENU: + return SpiGetInt(pvParam, &gspv.bFlatMenu, fl); + + case SPI_SETFLATMENU: + return SpiSetBool(&gspv.bFlatMenu, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETDROPSHADOW: + return SpiGetInt(pvParam, &gspv.bDropShadow, fl); + + case SPI_SETDROPSHADOW: + return SpiSetBool(&gspv.bDropShadow, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETBLOCKSENDINPUTRESETS: + return SpiGetInt(pvParam, &gspv.bBlockSendInputResets, fl); + + case SPI_SETBLOCKSENDINPUTRESETS: + return SpiSetBool(&gspv.bBlockSendInputResets, uiParam, KEY_MOUSE, L"", fl); + +#if(_WIN32_WINNT >= 0x0600) + case SPI_GETDISABLEOVERLAPPEDCONTENT: + return SpiGetInt(pvParam, &gspv.bDisableOverlappedContent, fl); + + case SPI_SETDISABLEOVERLAPPEDCONTENT: + return SpiSetBool(&gspv.bDisableOverlappedContent, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETCLIENTAREAANIMATION: + return SpiGetInt(pvParam, &gspv.bClientAnimation, fl); + + case SPI_SETCLIENTAREAANIMATION: + return SpiSetBool(&gspv.bClientAnimation, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETCLEARTYPE: + return SpiGetInt(pvParam, &gspv.bClearType, fl); + + case SPI_SETCLEARTYPE: + return SpiSetBool(&gspv.bClearType, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETSPEECHRECOGNITION: + return SpiGetInt(pvParam, &gspv.bSpeechRecognition, fl); + + case SPI_SETSPEECHRECOGNITION: + return SpiSetBool(&gspv.bSpeechRecognition, uiParam, KEY_MOUSE, L"", fl); +#endif + + case SPI_GETFOREGROUNDLOCKTIMEOUT: + return SpiGetInt(pvParam, &gspv.dwForegroundLockTimeout, fl); + + case SPI_SETFOREGROUNDLOCKTIMEOUT: + return SpiSetInt(&gspv.dwForegroundLockTimeout, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETACTIVEWNDTRKTIMEOUT: + return SpiGetInt(pvParam, &gspv.dwActiveTrackingTimeout, fl); + + case SPI_SETACTIVEWNDTRKTIMEOUT: + return SpiSetInt(&gspv.dwActiveTrackingTimeout, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFOREGROUNDFLASHCOUNT: + return SpiGetInt(pvParam, &gspv.dwForegroundFlashCount, fl); + + case SPI_SETFOREGROUNDFLASHCOUNT: + return SpiSetInt(&gspv.dwForegroundFlashCount, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETCARETWIDTH: + return SpiGetInt(pvParam, &gspv.dwCaretWidth, fl); + + case SPI_SETCARETWIDTH: + return SpiSetInt(&gspv.dwCaretWidth, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETMOUSECLICKLOCKTIME: + return SpiGetInt(pvParam, &gspv.dwMouseClickLockTime, fl); + + case SPI_SETMOUSECLICKLOCKTIME: + return SpiSetInt(&gspv.dwMouseClickLockTime, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFONTSMOOTHINGTYPE: + return SpiGetInt(pvParam, &gspv.uiFontSmoothingType, fl); + + case SPI_SETFONTSMOOTHINGTYPE: + return SpiSetInt(&gspv.uiFontSmoothingType, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFONTSMOOTHINGCONTRAST: + return SpiGetInt(pvParam, &gspv.uiFontSmoothingContrast, fl); + + case SPI_SETFONTSMOOTHINGCONTRAST: + return SpiSetInt(&gspv.uiFontSmoothingContrast, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFOCUSBORDERWIDTH: + return SpiGetInt(pvParam, &gspv.uiFocusBorderWidth, fl); + + case SPI_SETFOCUSBORDERWIDTH: + return SpiSetInt(&gspv.uiFocusBorderWidth, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFOCUSBORDERHEIGHT: + return SpiGetInt(pvParam, &gspv.uiFocusBorderHeight, fl); + + case SPI_SETFOCUSBORDERHEIGHT: + return SpiSetInt(&gspv.uiFocusBorderHeight, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFONTSMOOTHINGORIENTATION: + return SpiGetInt(pvParam, &gspv.uiFontSmoothingOrientation, fl); + + case SPI_SETFONTSMOOTHINGORIENTATION: + return SpiSetInt(&gspv.uiFontSmoothingOrientation, uiParam, KEY_MOUSE, L"", fl); + + /* The following are undocumented, but valid SPI values */ + case 0x1010: + case 0x1011: + case 0x1028: + case 0x1029: + case 0x102A: + case 0x102B: + case 0x102C: + case 0x102D: + case 0x102E: + case 0x102F: + case 0x1030: + case 0x1031: + case 0x1032: + case 0x1033: + case 0x1034: + case 0x1035: + case 0x1036: + case 0x1037: + case 0x1038: + case 0x1039: + case 0x103A: + case 0x103B: + case 0x103C: + case 0x103D: + DPRINT1("Undocumented SPI value %x is unimplemented\n", uiAction); + break; + + default: + DPRINT1("Invalid SPI value: %d\n", uiAction); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + + return 0; } -static BOOL -UserSystemParametersInfo_StructSet( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni, - PVOID pBuffer, /* private kmode buffer */ - UINT cbSize /* size of buffer and expected size usermode data, pointed by pvParam */ - ) -{ - NTSTATUS Status = STATUS_SUCCESS; - - DPRINT("UserSystemParametersInfo_StructSet SPI Action 0x%x (uiParam: 0x%x, fWinIni: 0x%x)\n", - uiAction, uiParam, fWinIni); - - _SEH2_TRY - { - ProbeForRead(pvParam, cbSize, 1); - RtlCopyMemory(pBuffer,pvParam,cbSize); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - if(*(PUINT)pBuffer != cbSize) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, pBuffer, fWinIni); -} - -static BOOL -UserSystemParametersInfo_StructGet( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni, - PVOID pBuffer, /* private kmode buffer */ - UINT cbSize /* size of buffer and expected size usermode data, pointed by pvParam */ - ) -{ - NTSTATUS Status = STATUS_SUCCESS; - - DPRINT("UserSystemParametersInfo_StructGet SPI Action 0x%x (uiParam: 0x%x, fWinIni: 0x%x)\n",uiAction, uiParam, fWinIni); - - _SEH2_TRY - { - ProbeForRead(pvParam, cbSize, 1); - /* Copy only first UINT describing structure size*/ - *((PUINT)pBuffer) = *((PUINT)pvParam); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - if(*((PUINT)pBuffer) != cbSize) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return( FALSE); - } - if(!IntSystemParametersInfo(uiAction, uiParam, pBuffer, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, cbSize, 1); - RtlCopyMemory(pvParam,pBuffer,cbSize); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); -} - -/* - * @implemented - */ -BOOL FASTCALL +BOOL +FASTCALL UserSystemParametersInfo( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni) + UINT uiAction, + UINT uiParam, + PVOID pvParam, + UINT fWinIni) { - NTSTATUS Status = STATUS_SUCCESS; + ULONG_PTR ulResult; - /* FIXME: Support Windows Vista SPI Actions */ + if (!gbSpiInitialized) + { + KeRosDumpStackFrames(NULL, 20); + return FALSE; + } - switch(uiAction) - { -#if 1 /* only for 32bit applications */ - case SPI_SETLOWPOWERACTIVE: - case SPI_SETLOWPOWERTIMEOUT: - case SPI_SETPOWEROFFACTIVE: - case SPI_SETPOWEROFFTIMEOUT: -#endif - case SPI_SETICONS: - case SPI_SETSCREENSAVETIMEOUT: - case SPI_SETSCREENSAVEACTIVE: - case SPI_SETDOUBLECLKWIDTH: - case SPI_SETDOUBLECLKHEIGHT: - case SPI_SETDOUBLECLICKTIME: - case SPI_SETFONTSMOOTHING: - case SPI_SETMOUSEHOVERTIME: - case SPI_SETMOUSEHOVERWIDTH: - case SPI_SETMOUSEHOVERHEIGHT: - case SPI_SETMOUSETRAILS: - case SPI_SETSNAPTODEFBUTTON: - case SPI_SETBEEP: - case SPI_SETBLOCKSENDINPUTRESETS: - case SPI_SETKEYBOARDDELAY: - case SPI_SETKEYBOARDPREF: - case SPI_SETKEYBOARDSPEED: - case SPI_SETMOUSEBUTTONSWAP: - case SPI_SETWHEELSCROLLLINES: - case SPI_SETMENUSHOWDELAY: - case SPI_SETMENUDROPALIGNMENT: - case SPI_SETICONTITLEWRAP: - case SPI_SETCURSORS: - case SPI_SETDESKPATTERN: - case SPI_SETBORDER: - case SPI_SETDRAGHEIGHT: - case SPI_SETDRAGWIDTH: - case SPI_SETSHOWIMEUI: - case SPI_SETSCREENREADER: - case SPI_SETSHOWSOUNDS: - return IntSystemParametersInfo(uiAction, uiParam, NULL, fWinIni); + /* Get a pointer to the current Windowstation */ + gpwinstaCurrent = IntGetWinStaObj(); - /* NOTICE: from the IntSystemParametersInfo implementation it uses pvParam */ - case SPI_SETSCREENSAVERRUNNING: - case SPI_SETFLATMENU: - case SPI_SETMOUSESPEED: - case SPI_SETGRADIENTCAPTIONS: - case SPI_SETFOCUSBORDERHEIGHT: - case SPI_SETFOCUSBORDERWIDTH: - case SPI_SETLANGTOGGLE: - case SPI_SETMENUFADE: - case SPI_SETDROPSHADOW: - case SPI_SETACTIVEWINDOWTRACKING: - case SPI_SETACTIVEWNDTRKZORDER: - case SPI_SETACTIVEWNDTRKTIMEOUT: - case SPI_SETCARETWIDTH: - case SPI_SETFOREGROUNDFLASHCOUNT: - case SPI_SETFOREGROUNDLOCKTIMEOUT: - case SPI_SETFONTSMOOTHINGORIENTATION: - case SPI_SETFONTSMOOTHINGTYPE: - case SPI_SETFONTSMOOTHINGCONTRAST: - case SPI_SETKEYBOARDCUES: - case SPI_SETCOMBOBOXANIMATION: - case SPI_SETCURSORSHADOW: - case SPI_SETHOTTRACKING: - case SPI_SETLISTBOXSMOOTHSCROLLING: - case SPI_SETMENUANIMATION: - case SPI_SETSELECTIONFADE: - case SPI_SETTOOLTIPANIMATION: - case SPI_SETTOOLTIPFADE: - case SPI_SETUIEFFECTS: - case SPI_SETMOUSECLICKLOCK: - case SPI_SETMOUSESONAR: - case SPI_SETMOUSEVANISH: - return IntSystemParametersInfo(uiAction, 0, pvParam, fWinIni); + if (!gpwinstaCurrent) + { + DPRINT1("UserSystemParametersInfo called without active windowstation.\n"); + //KeRosDumpStackFrames(NULL, 0); + } - /* Get SPI msg here */ + /* Do the actual operation */ + ulResult = SpiGetSet(uiAction, uiParam, pvParam, fWinIni); -#if 1 /* only for 32bit applications */ - case SPI_GETLOWPOWERACTIVE: - case SPI_GETLOWPOWERTIMEOUT: - case SPI_GETPOWEROFFACTIVE: - case SPI_GETPOWEROFFTIMEOUT: -#endif + /* Did we change something? */ + if (ulResult > 1) + { + SpiFixupValues(); - case SPI_GETSCREENSAVERRUNNING: - case SPI_GETSCREENSAVETIMEOUT: - case SPI_GETSCREENSAVEACTIVE: - case SPI_GETKEYBOARDCUES: - case SPI_GETFONTSMOOTHING: - case SPI_GETGRADIENTCAPTIONS: - case SPI_GETFOCUSBORDERHEIGHT: - case SPI_GETFOCUSBORDERWIDTH: - case SPI_GETWHEELSCROLLLINES: - case SPI_GETWHEELSCROLLCHARS: - case SPI_GETFLATMENU: - case SPI_GETMOUSEHOVERHEIGHT: - case SPI_GETMOUSEHOVERWIDTH: - case SPI_GETMOUSEHOVERTIME: - case SPI_GETMOUSESPEED: - case SPI_GETMOUSETRAILS: - case SPI_GETSNAPTODEFBUTTON: - case SPI_GETBEEP: - case SPI_GETBLOCKSENDINPUTRESETS: - case SPI_GETKEYBOARDDELAY: - case SPI_GETKEYBOARDPREF: - case SPI_GETMENUDROPALIGNMENT: - case SPI_GETMENUFADE: - case SPI_GETMENUSHOWDELAY: - case SPI_GETICONTITLEWRAP: - case SPI_GETDROPSHADOW: - case SPI_GETFONTSMOOTHINGCONTRAST: - case SPI_GETFONTSMOOTHINGORIENTATION: - case SPI_GETFONTSMOOTHINGTYPE: - case SPI_GETACTIVEWINDOWTRACKING: - case SPI_GETACTIVEWNDTRKZORDER: - case SPI_GETBORDER: - case SPI_GETCOMBOBOXANIMATION: - case SPI_GETCURSORSHADOW: - case SPI_GETHOTTRACKING: - case SPI_GETLISTBOXSMOOTHSCROLLING: - case SPI_GETMENUANIMATION: - case SPI_GETSELECTIONFADE: - case SPI_GETTOOLTIPANIMATION: - case SPI_GETTOOLTIPFADE: - case SPI_GETUIEFFECTS: - case SPI_GETMOUSECLICKLOCK: - case SPI_GETMOUSECLICKLOCKTIME: - case SPI_GETMOUSESONAR: - case SPI_GETMOUSEVANISH: - case SPI_GETSCREENREADER: - case SPI_GETSHOWSOUNDS: - { - /* pvParam is PINT,PUINT or PBOOL */ - UINT Ret; - if(!IntSystemParametersInfo(uiAction, uiParam, &Ret, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof(UINT ), 1); - *(PUINT)pvParam = Ret; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } + /* Update system metrics */ + InitMetrics(); - case SPI_GETACTIVEWNDTRKTIMEOUT: - case SPI_GETKEYBOARDSPEED: - case SPI_GETCARETWIDTH: - case SPI_GETDRAGFULLWINDOWS: - case SPI_GETFOREGROUNDFLASHCOUNT: - case SPI_GETFOREGROUNDLOCKTIMEOUT: - { - /* pvParam is PDWORD */ - DWORD Ret; - if(!IntSystemParametersInfo(uiAction, uiParam, &Ret, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof(DWORD ), 1); - *(PDWORD)pvParam = Ret; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_GETICONMETRICS: - { - ICONMETRICSW Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETICONMETRICS: - { - ICONMETRICSW Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETMINIMIZEDMETRICS: - { - MINIMIZEDMETRICS Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni,&Buffer,sizeof(Buffer)); - } - case SPI_SETMINIMIZEDMETRICS: - { - MINIMIZEDMETRICS Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni,&Buffer,sizeof(Buffer)); - } - case SPI_GETNONCLIENTMETRICS: - { - NONCLIENTMETRICSW Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETNONCLIENTMETRICS: - { - NONCLIENTMETRICSW Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETANIMATION: - { - ANIMATIONINFO Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETANIMATION: - { - ANIMATIONINFO Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETACCESSTIMEOUT: - { - ACCESSTIMEOUT Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETACCESSTIMEOUT: - { - ACCESSTIMEOUT Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETFILTERKEYS: - { - FILTERKEYS Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, - &Buffer,sizeof(Buffer)); - } - case SPI_SETFILTERKEYS: - { - FILTERKEYS Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, - &Buffer,sizeof(Buffer)); - } - case SPI_GETSTICKYKEYS: - { - STICKYKEYS Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETSTICKYKEYS: - { - STICKYKEYS Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETTOGGLEKEYS: - { - TOGGLEKEYS Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETTOGGLEKEYS: - { - TOGGLEKEYS Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETWORKAREA: - { - RECT rc; - _SEH2_TRY - { - ProbeForRead(pvParam, sizeof( RECT ), 1); - RtlCopyMemory(&rc,pvParam,sizeof(RECT)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, &rc, fWinIni); - } - case SPI_GETWORKAREA: - { - RECT rc; - if(!IntSystemParametersInfo(uiAction, uiParam, &rc, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof( RECT ), 1); - RtlCopyMemory(pvParam,&rc,sizeof(RECT)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_SETMOUSE: - { - CURSORACCELERATION_INFO CursorAccelerationInfo; - _SEH2_TRY - { - ProbeForRead(pvParam, sizeof( CURSORACCELERATION_INFO ), 1); - RtlCopyMemory(&CursorAccelerationInfo,pvParam,sizeof(CURSORACCELERATION_INFO)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, &CursorAccelerationInfo, fWinIni); - } - case SPI_GETMOUSE: - { - CURSORACCELERATION_INFO CursorAccelerationInfo; - if(!IntSystemParametersInfo(uiAction, uiParam, &CursorAccelerationInfo, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof( CURSORACCELERATION_INFO ), 1); - RtlCopyMemory(pvParam,&CursorAccelerationInfo,sizeof(CURSORACCELERATION_INFO)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_SETICONTITLELOGFONT: - { - LOGFONTW LogFont; - _SEH2_TRY - { - ProbeForRead(pvParam, sizeof( LOGFONTW ), 1); - RtlCopyMemory(&LogFont,pvParam,sizeof(LOGFONTW)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, &LogFont, fWinIni); - } - case SPI_GETICONTITLELOGFONT: - { - LOGFONTW LogFont; - if(!IntSystemParametersInfo(uiAction, uiParam, &LogFont, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof( LOGFONTW ), 1); - RtlCopyMemory(pvParam,&LogFont,sizeof(LOGFONTW)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_ICONVERTICALSPACING: - case SPI_ICONHORIZONTALSPACING: - { - UINT Ret; - if(!IntSystemParametersInfo(uiAction, uiParam, &Ret, fWinIni)) - { - return( FALSE); - } - if(NULL != pvParam) - { - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof(UINT ), 1); - *(PUINT)pvParam = Ret; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - } - return( TRUE); - } - case SPI_SETDEFAULTINPUTLANG: - case SPI_SETDESKWALLPAPER: - /* !!! As opposed to the user mode version this version accepts a handle to the bitmap! */ - { - HANDLE Handle; - _SEH2_TRY - { - ProbeForRead(pvParam, sizeof( HANDLE ), 1); - Handle = *(PHANDLE)pvParam; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, &Handle, fWinIni); - } - case SPI_GETDEFAULTINPUTLANG: - case SPI_GETDESKWALLPAPER: - { - HANDLE Handle; - if(!IntSystemParametersInfo(uiAction, uiParam, &Handle, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof( HANDLE ), 1); - *(PHANDLE)pvParam = Handle; - RtlCopyMemory(pvParam,&Handle,sizeof(HANDLE)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_GETHIGHCONTRAST: - case SPI_SETHIGHCONTRAST: - case SPI_GETSOUNDSENTRY: - case SPI_SETSOUNDSENTRY: - { - /* FIXME: Support this accessibility SPI actions */ - DPRINT1("FIXME: Unsupported SPI Code: %lx \n",uiAction ); - break; - } - default : - { - SetLastNtError(ERROR_INVALID_PARAMETER); - DPRINT1("Invalid SPI Code: %lx \n",uiAction ); - break; - } - } - return( FALSE); + /* Send notification to toplevel windows, if requested */ + if (fWinIni & (SPIF_SENDCHANGE | SPIF_SENDWININICHANGE)) + { + /* Send WM_SETTINGCHANGE to all toplevel windows */ + co_IntSendMessageTimeout(HWND_BROADCAST, + WM_SETTINGCHANGE, + (WPARAM)uiAction, + (LPARAM)ulResult, + SMTO_NORMAL, + 100, + &ulResult); + } + ulResult = 1; + } + + /* Dereference the windowstation */ + if (gpwinstaCurrent) + { + ObDereferenceObject(gpwinstaCurrent); + gpwinstaCurrent = NULL; + } + + return ulResult; } -/* - * @implemented - */ BOOL APIENTRY NtUserSystemParametersInfo( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni) + UINT uiAction, + UINT uiParam, + PVOID pvParam, + UINT fWinIni) { - DECLARE_RETURN(BOOLEAN); + BOOL bResult; - DPRINT("Enter NtUserSystemParametersInfo\n"); - UserEnterExclusive(); + DPRINT("Enter NtUserSystemParametersInfo(%d)\n", uiAction); + UserEnterExclusive(); - RETURN( UserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni)); + //if (uiAction == SPI_SETMOUSE) gbDebug = 1; -CLEANUP: - DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; + // FIXME: get rid of the flags and only use this from um. kernel can access data directly. + /* Set UM memory protection flag */ + fWinIni |= SPIF_PROTECT; + + /* Call internal function */ + bResult = UserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); + + //DPRINTX("NtUserSystemParametersInfo SPI_ICONHORIZONTALSPACING uiParam=%d, pvParam=%p, pvParam=%d bResult=%d\n", + // uiParam, pvParam, pvParam?*(UINT*)pvParam:0, bResult); + + DPRINT("Leave NtUserSystemParametersInfo, returning %d\n", bResult); + UserLeave(); + + //DPRINTX("NtUserSystemParametersInfo SPI_ICONHORIZONTALSPACING bResult=%d\n", bResult); + //gbDebug = 0; + + return bResult; } - - -BOOL APIENTRY -NtUserUpdatePerUserSystemParameters( - DWORD dwReserved, - BOOL bEnable) -{ - BOOL Result = TRUE; - DECLARE_RETURN(BOOLEAN); - - DPRINT("Enter NtUserUpdatePerUserSystemParameters\n"); - UserEnterExclusive(); - - Result &= IntDesktopUpdatePerUserSettings(bEnable); - RETURN( Result); - -CLEANUP: - DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - -/* EOF */ diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index 4c590b51d21..563fcbcd441 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -537,40 +537,25 @@ NtUserCreateWindowStation( /* FIXME: Obtain the following information from the registry */ - CurInfo->WheelScroLines = 3; - CurInfo->WheelScroChars = 3; +// CurInfo->WheelScroLines = 3; +// CurInfo->WheelScroChars = 3; CurInfo->SwapButtons = FALSE; CurInfo->DblClickSpeed = 500; CurInfo->DblClickWidth = 4; CurInfo->DblClickHeight = 4; - CurInfo->MouseSpeed = 10; - CurInfo->CursorAccelerationInfo.FirstThreshold = 6; - CurInfo->CursorAccelerationInfo.SecondThreshold = 10; - CurInfo->CursorAccelerationInfo.Acceleration = 1; +// CurInfo->MouseSpeed = 10; +// CurInfo->CursorAccelerationInfo.FirstThreshold = 6; +// CurInfo->CursorAccelerationInfo.SecondThreshold = 10; +// CurInfo->CursorAccelerationInfo.Acceleration = 1; - CurInfo->MouseHoverTime = 80; - CurInfo->MouseHoverWidth = 4; - CurInfo->MouseHoverHeight = 4; +// CurInfo->MouseHoverTime = 80; +// CurInfo->MouseHoverWidth = 4; +// CurInfo->MouseHoverHeight = 4; - WindowStationObject->ScreenSaverActive = FALSE; - WindowStationObject->ScreenSaverTimeOut = 10; +// WindowStationObject->ScreenSaverActive = FALSE; +// WindowStationObject->ScreenSaverTimeOut = 10; WindowStationObject->SystemCursor = CurInfo; - - RtlZeroMemory(&WindowStationObject->UserPreferences, sizeof(USERPREFERENCESMASK)); - /* Set all fields with default value = 1 : */ - WindowStationObject->UserPreferences.bMenuAnimation = 1; - WindowStationObject->UserPreferences.bComboBoxAnimation = 1; - WindowStationObject->UserPreferences.bListBoxSmoothScrolling = 1; - WindowStationObject->UserPreferences.bGradientCaptions = 1; - WindowStationObject->UserPreferences.bHotTracking = 1; - WindowStationObject->UserPreferences.bMenuFade = 1; - WindowStationObject->UserPreferences.bSelectionFade = 1; - WindowStationObject->UserPreferences.bMenuFade = 1; - WindowStationObject->UserPreferences.bTooltipAnimation = 1; - WindowStationObject->UserPreferences.bTooltipFade = 1; - WindowStationObject->UserPreferences.bCursorShadow = 1; - WindowStationObject->UserPreferences.bUiEffects = 1; /* END FIXME loading from register */ diff --git a/reactos/subsystems/win32/win32k/win32k.rbuild b/reactos/subsystems/win32/win32k/win32k.rbuild index 81afe2768c5..9e9a9a19b7e 100644 --- a/reactos/subsystems/win32/win32k/win32k.rbuild +++ b/reactos/subsystems/win32/win32k/win32k.rbuild @@ -86,9 +86,11 @@ driver.c err.c + file.c math.c rtlstr.c copy.c + registry.c usrheap.c From f760f8c9069d1024e0835844ae0bec03a135dfb2 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 25 Jun 2009 07:16:26 +0000 Subject: [PATCH 091/577] - Don't modify access status when function fails - reduces advapi32_winetest security failures by 3 svn path=/trunk/; revision=41605 --- reactos/dll/win32/advapi32/token/token.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/advapi32/token/token.c b/reactos/dll/win32/advapi32/token/token.c index 8ed48af0ac8..f32d629d1d0 100644 --- a/reactos/dll/win32/advapi32/token/token.c +++ b/reactos/dll/win32/advapi32/token/token.c @@ -172,7 +172,7 @@ AccessCheck(IN PSECURITY_DESCRIPTOR pSecurityDescriptor, { /* Access denied */ SetLastError(RtlNtStatusToDosError(NtAccessStatus)); - *AccessStatus = FALSE; + return FALSE; } else { From d53c35b02be2cbbc52f681850491b709c68af89b Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Thu, 25 Jun 2009 10:27:57 +0000 Subject: [PATCH 092/577] No reason to compile PSEH2 with other compilers than GCC svn path=/trunk/; revision=41607 --- reactos/lib/pseh/pseh.rbuild | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/lib/pseh/pseh.rbuild b/reactos/lib/pseh/pseh.rbuild index 86993cc4952..dcbde827368 100644 --- a/reactos/lib/pseh/pseh.rbuild +++ b/reactos/lib/pseh/pseh.rbuild @@ -4,8 +4,11 @@ framebased.S - framebased-gcchack.c - framebased-gcchack-asm.S + + + framebased-gcchack.c + framebased-gcchack-asm.S + From ff37974bbaf0f32215c2dbe5e32acb35acc5e74a Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Thu, 25 Jun 2009 13:29:58 +0000 Subject: [PATCH 093/577] Remove a hack from NtAccessCheck(). Bug #4169. svn path=/trunk/; revision=41610 --- reactos/ntoskrnl/se/semgr.c | 178 +++++++++++++++++------------------- 1 file changed, 85 insertions(+), 93 deletions(-) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index b0ee9889d6b..b5bbc02fb15 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -49,7 +49,7 @@ SepInitExports(VOID) SepExports.SeSystemEnvironmentPrivilege = SeSystemEnvironmentPrivilege; SepExports.SeChangeNotifyPrivilege = SeChangeNotifyPrivilege; SepExports.SeRemoteShutdownPrivilege = SeRemoteShutdownPrivilege; - + SepExports.SeNullSid = SeNullSid; SepExports.SeWorldSid = SeWorldSid; SepExports.SeLocalSid = SeLocalSid; @@ -72,11 +72,11 @@ SepInitExports(VOID) SepExports.SeAuthenticatedUsersSid = SeAuthenticatedUsersSid; SepExports.SeRestrictedSid = SeRestrictedSid; SepExports.SeAnonymousLogonSid = SeAnonymousLogonSid; - + SepExports.SeUndockPrivilege = SeUndockPrivilege; SepExports.SeSyncAgentPrivilege = SeSyncAgentPrivilege; SepExports.SeEnableDelegationPrivilege = SeEnableDelegationPrivilege; - + SeExports = &SepExports; return TRUE; } @@ -92,18 +92,18 @@ SepInitializationPhase0(VOID) if (!SepInitSDs()) return FALSE; SepInitPrivileges(); if (!SepInitExports()) return FALSE; - + /* Initialize the subject context lock */ ExInitializeResource(&SepSubjectContextLock); - + /* Initialize token objects */ SepInitializeTokenImplementation(); - + /* Clear impersonation info for the idle thread */ PsGetCurrentThread()->ImpersonationInfo = NULL; PspClearCrossThreadFlag(PsGetCurrentThread(), CT_ACTIVE_IMPERSONATION_INFO_BIT); - + /* Initialize the boot token */ ObInitializeFastReference(&PsGetCurrentProcess()->Token, NULL); ObInitializeFastReference(&PsGetCurrentProcess()->Token, @@ -117,7 +117,7 @@ SepInitializationPhase1(VOID) { NTSTATUS Status; PAGED_CODE(); - + /* Insert the system token into the tree */ Status = ObInsertObject((PVOID)(PsGetCurrentProcess()->Token.Value & ~MAX_FAST_REFS), @@ -127,7 +127,7 @@ SepInitializationPhase1(VOID) NULL, NULL); ASSERT(NT_SUCCESS(Status)); - + /* FIXME: TODO \\ Security directory */ return TRUE; } @@ -140,17 +140,17 @@ SeInitSystem(VOID) switch (ExpInitializationPhase) { case 0: - + /* Do Phase 0 */ return SepInitializationPhase0(); - + case 1: - + /* Do Phase 1 */ return SepInitializationPhase1(); - + default: - + /* Don't know any other phase! Bugcheck! */ KeBugCheckEx(UNEXPECTED_INITIALIZATION_CALL, 0, @@ -170,7 +170,7 @@ SeInitSRM(VOID) HANDLE DirectoryHandle; HANDLE EventHandle; NTSTATUS Status; - + /* Create '\Security' directory */ RtlInitUnicodeString(&Name, L"\\Security"); @@ -187,7 +187,7 @@ SeInitSRM(VOID) DPRINT1("Failed to create 'Security' directory!\n"); return FALSE; } - + /* Create 'LSA_AUTHENTICATION_INITALIZED' event */ RtlInitUnicodeString(&Name, L"\\LSA_AUTHENTICATION_INITALIZED"); @@ -207,12 +207,12 @@ SeInitSRM(VOID) NtClose(DirectoryHandle); return FALSE; } - + ZwClose(EventHandle); ZwClose(DirectoryHandle); - + /* FIXME: Create SRM port and listener thread */ - + return TRUE; } @@ -228,16 +228,16 @@ SeDefaultObjectMethod(IN PVOID Object, IN PGENERIC_MAPPING GenericMapping) { PAGED_CODE(); - + /* Select the operation type */ switch (OperationType) { /* Setting a new descriptor */ case SetSecurityDescriptor: - + /* Sanity check */ ASSERT((PoolType == PagedPool) || (PoolType == NonPagedPool)); - + /* Set the information */ return ObSetSecurityDescriptorInfo(Object, SecurityInformation, @@ -245,33 +245,33 @@ SeDefaultObjectMethod(IN PVOID Object, OldSecurityDescriptor, PoolType, GenericMapping); - + case QuerySecurityDescriptor: - + /* Query the information */ return ObQuerySecurityDescriptorInfo(Object, SecurityInformation, SecurityDescriptor, ReturnLength, OldSecurityDescriptor); - + case DeleteSecurityDescriptor: - + /* De-assign it */ return ObDeassignSecurity(OldSecurityDescriptor); - + case AssignSecurityDescriptor: - + /* Assign it */ ObAssignObjectSecurityDescriptor(Object, SecurityDescriptor, PoolType); return STATUS_SUCCESS; - + default: - + /* Bug check */ KeBugCheckEx(SECURITY_SYSTEM, 0, STATUS_INVALID_PARAMETER, 0, 0); } - + /* Should never reach here */ ASSERT(FALSE); return STATUS_SUCCESS; @@ -284,14 +284,14 @@ SepSidInToken(PACCESS_TOKEN _Token, { ULONG i; PTOKEN Token = (PTOKEN)_Token; - + PAGED_CODE(); - + if (Token->UserAndGroupCount == 0) { return FALSE; } - + for (i=0; iUserAndGroupCount; i++) { if (RtlEqualSid(Sid, Token->UserAndGroups[i].Sid)) @@ -300,11 +300,11 @@ SepSidInToken(PACCESS_TOKEN _Token, { return TRUE; } - + return FALSE; } } - + return FALSE; } @@ -314,7 +314,7 @@ SeQuerySecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, OUT PACCESS_MASK DesiredAccess) { *DesiredAccess = 0; - + if (SecurityInformation & (OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION)) { @@ -331,7 +331,7 @@ SeSetSecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, OUT PACCESS_MASK DesiredAccess) { *DesiredAccess = 0; - + if (SecurityInformation & (OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION)) { *DesiredAccess |= WRITE_OWNER; @@ -374,7 +374,7 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, PSID Sid; NTSTATUS Status; PAGED_CODE(); - + /* Check if this is kernel mode */ if (AccessMode == KernelMode) { @@ -391,12 +391,12 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, /* Give the desired and previous access */ *GrantedAccess = DesiredAccess | PreviouslyGrantedAccess; } - + /* Success */ *AccessStatus = STATUS_SUCCESS; return TRUE; } - + /* Check if we didn't get an SD */ if (!SecurityDescriptor) { @@ -404,7 +404,7 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, *AccessStatus = STATUS_ACCESS_DENIED; return FALSE; } - + /* Check for invalid impersonation */ if ((SubjectSecurityContext->ClientToken) && (SubjectSecurityContext->ImpersonationLevel < SecurityImpersonation)) @@ -412,7 +412,7 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, *AccessStatus = STATUS_BAD_IMPERSONATION_LEVEL; return FALSE; } - + /* Check for no access desired */ if (!DesiredAccess) { @@ -423,31 +423,31 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, *AccessStatus = STATUS_ACCESS_DENIED; return FALSE; } - + /* Return the previous access only */ *GrantedAccess = PreviouslyGrantedAccess; *AccessStatus = STATUS_SUCCESS; *Privileges = NULL; return TRUE; } - + /* Acquire the lock if needed */ if (!SubjectContextLocked) SeLockSubjectContext(SubjectSecurityContext); - + /* Map given accesses */ RtlMapGenericMask(&DesiredAccess, GenericMapping); if (PreviouslyGrantedAccess) RtlMapGenericMask(&PreviouslyGrantedAccess, GenericMapping); - - - + + + CurrentAccess = PreviouslyGrantedAccess; - - - + + + Token = SubjectSecurityContext->ClientToken ? SubjectSecurityContext->ClientToken : SubjectSecurityContext->PrimaryToken; - + /* Get the DACL */ Status = RtlGetDaclSecurityDescriptor(SecurityDescriptor, &Present, @@ -459,11 +459,11 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { SeUnlockSubjectContext(SubjectSecurityContext); } - + *AccessStatus = Status; return FALSE; } - + /* RULE 1: Grant desired access if the object is unprotected */ if (Present == TRUE && Dacl == NULL) { @@ -471,18 +471,18 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { SeUnlockSubjectContext(SubjectSecurityContext); } - + *GrantedAccess = DesiredAccess; *AccessStatus = STATUS_SUCCESS; return TRUE; } - + CurrentAccess = PreviouslyGrantedAccess; - + /* RULE 2: Check token for 'take ownership' privilege */ Privilege.Luid = SeTakeOwnershipPrivilege; Privilege.Attributes = SE_PRIVILEGE_ENABLED; - + if (SepPrivilegeCheck(Token, &Privilege, 1, @@ -497,13 +497,13 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { SeUnlockSubjectContext(SubjectSecurityContext); } - + *GrantedAccess = CurrentAccess; *AccessStatus = STATUS_SUCCESS; return TRUE; } } - + /* RULE 3: Check whether the token is the owner */ Status = RtlGetOwnerSecurityDescriptor(SecurityDescriptor, &Sid, @@ -515,11 +515,11 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { SeUnlockSubjectContext(SubjectSecurityContext); } - + *AccessStatus = Status; return FALSE; } - + if (Sid && SepSidInToken(Token, Sid)) { CurrentAccess |= (READ_CONTROL | WRITE_DAC); @@ -530,13 +530,13 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { SeUnlockSubjectContext(SubjectSecurityContext); } - + *GrantedAccess = CurrentAccess; *AccessStatus = STATUS_SUCCESS; return TRUE; } } - + /* Fail if DACL is absent */ if (Present == FALSE) { @@ -544,12 +544,12 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { SeUnlockSubjectContext(SubjectSecurityContext); } - + *GrantedAccess = 0; *AccessStatus = STATUS_ACCESS_DENIED; return FALSE; } - + /* RULE 4: Grant rights according to the DACL */ CurrentAce = (PACE)(Dacl + 1); for (i = 0; i < Dacl->AceCount; i++) @@ -563,13 +563,13 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { SeUnlockSubjectContext(SubjectSecurityContext); } - + *GrantedAccess = 0; *AccessStatus = STATUS_ACCESS_DENIED; return FALSE; } } - + else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) { if (SepSidInToken(Token, Sid)) @@ -585,17 +585,17 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, } CurrentAce = (PACE)((ULONG_PTR)CurrentAce + CurrentAce->Header.AceSize); } - + if (SubjectContextLocked == FALSE) { SeUnlockSubjectContext(SubjectSecurityContext); } - + DPRINT("CurrentAccess %08lx\n DesiredAccess %08lx\n", CurrentAccess, DesiredAccess); - + *GrantedAccess = CurrentAccess & DesiredAccess; - + if (DesiredAccess & MAXIMUM_ALLOWED) { *GrantedAccess = CurrentAccess; @@ -688,32 +688,24 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, SubjectSecurityContext.ProcessAuditId = NULL; SeLockSubjectContext(&SubjectSecurityContext); - /* FIXME */ /* Now perform the access check */ - if (SeAccessCheck(SecurityDescriptor, - &SubjectSecurityContext, - TRUE, - DesiredAccess, - 0, - &PrivilegeSet, //FIXME - GenericMapping, - PreviousMode, - GrantedAccess, - AccessStatus)) - { - Status = *AccessStatus; - } - else - { - Status = STATUS_ACCESS_DENIED; - } + SeAccessCheck(SecurityDescriptor, + &SubjectSecurityContext, + TRUE, + DesiredAccess, + 0, + &PrivilegeSet, //FIXME + GenericMapping, + PreviousMode, + GrantedAccess, + AccessStatus); /* Unlock subject context and dereference the token */ SeUnlockSubjectContext(&SubjectSecurityContext); ObDereferenceObject(Token); - /* Check succeeded? */ - return Status; + /* Check succeeded */ + return STATUS_SUCCESS; } From c1b0f80304e74b0a986a86cf218b6f87ce2bf970 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Thu, 25 Jun 2009 14:39:01 +0000 Subject: [PATCH 094/577] sync shell32 with wine 1.1.24 svn path=/trunk/; revision=41611 --- rostests/winetests/shell32/appbar.c | 23 ++++++++-- rostests/winetests/shell32/shlfolder.c | 60 ++++++++++++++++++-------- 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/rostests/winetests/shell32/appbar.c b/rostests/winetests/shell32/appbar.c index 51bea2b2fdd..73dc0b2d81a 100644 --- a/rostests/winetests/shell32/appbar.c +++ b/rostests/winetests/shell32/appbar.c @@ -36,6 +36,7 @@ struct testwindow_info { HWND hwnd; BOOL registered; + BOOL to_be_deleted; RECT desired_rect; UINT edge; RECT allocated_rect; @@ -58,6 +59,12 @@ static void testwindow_setpos(HWND hwnd) return; } + if (info->to_be_deleted) + { + win_skip("Some Win95 and NT4 systems send messages to removed taskbars\n"); + return; + } + abd.cbSize = sizeof(abd); abd.hWnd = hwnd; abd.uEdge = info->edge; @@ -71,15 +78,15 @@ static void testwindow_setpos(HWND hwnd) abd.rc.top = abd.rc.bottom - (info->desired_rect.bottom - info->desired_rect.top); break; case ABE_LEFT: - ok(info->desired_rect.right == abd.rc.right, "ABM_QUERYPOS changed right of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + ok(info->desired_rect.right == abd.rc.right, "ABM_QUERYPOS changed right of rect from %i to %i\n", info->desired_rect.right, abd.rc.right); abd.rc.right = abd.rc.left + (info->desired_rect.right - info->desired_rect.left); break; case ABE_RIGHT: - ok(info->desired_rect.left == abd.rc.left, "ABM_QUERYPOS changed left of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + ok(info->desired_rect.left == abd.rc.left, "ABM_QUERYPOS changed left of rect from %i to %i\n", info->desired_rect.left, abd.rc.left); abd.rc.left = abd.rc.right - (info->desired_rect.right - info->desired_rect.left); break; case ABE_TOP: - ok(info->desired_rect.bottom == abd.rc.bottom, "ABM_QUERYPOS changed bottom of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + ok(info->desired_rect.bottom == abd.rc.bottom, "ABM_QUERYPOS changed bottom of rect from %i to %i\n", info->desired_rect.bottom, abd.rc.bottom); abd.rc.bottom = abd.rc.top + (info->desired_rect.bottom - info->desired_rect.top); break; } @@ -221,6 +228,7 @@ static void test_setpos(void) /* dock windows[0] to the bottom of the screen */ windows[0].registered = TRUE; + windows[0].to_be_deleted = FALSE; windows[0].edge = ABE_BOTTOM; windows[0].desired_rect.left = 0; windows[0].desired_rect.right = screen_width; @@ -241,6 +249,7 @@ static void test_setpos(void) /* dock windows[1] to the bottom of the screen */ windows[1].registered = TRUE; + windows[1].to_be_deleted = FALSE; windows[1].edge = ABE_BOTTOM; windows[1].desired_rect.left = 0; windows[1].desired_rect.right = screen_width; @@ -272,6 +281,7 @@ static void test_setpos(void) /* dock windows[2] to the bottom of the screen */ windows[2].registered = TRUE; + windows[2].to_be_deleted = FALSE; windows[2].edge = ABE_BOTTOM; windows[2].desired_rect.left = 0; windows[2].desired_rect.right = screen_width; @@ -328,6 +338,7 @@ static void test_setpos(void) expected_bottom = max(windows[0].allocated_rect.bottom, windows[1].allocated_rect.bottom); abd.hWnd = windows[0].hwnd; + windows[0].to_be_deleted = TRUE; ret = SHAppBarMessage(ABM_REMOVE, &abd); ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); windows[0].registered = FALSE; @@ -341,12 +352,14 @@ static void test_setpos(void) /* remove the other windows */ abd.hWnd = windows[1].hwnd; + windows[1].to_be_deleted = TRUE; ret = SHAppBarMessage(ABM_REMOVE, &abd); ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); windows[1].registered = FALSE; DestroyWindow(windows[1].hwnd); abd.hWnd = windows[2].hwnd; + windows[2].to_be_deleted = TRUE; ret = SHAppBarMessage(ABM_REMOVE, &abd); ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); windows[2].registered = FALSE; @@ -399,7 +412,9 @@ static void test_appbarget(void) if(ret) { ok(abd.hWnd == (HWND)0xcccccccc, "hWnd overwritten\n"); - ok(abd.uEdge <= ABE_BOTTOM, "uEdge not returned\n"); + ok(abd.uEdge <= ABE_BOTTOM || + broken(abd.uEdge == 0xcccccccc), /* Some Win95 and NT4 */ + "uEdge not returned\n"); ok(abd.rc.left != 0xcccccccc, "rc not updated\n"); } diff --git a/rostests/winetests/shell32/shlfolder.c b/rostests/winetests/shell32/shlfolder.c index 790096682e9..74873765f00 100644 --- a/rostests/winetests/shell32/shlfolder.c +++ b/rostests/winetests/shell32/shlfolder.c @@ -81,6 +81,15 @@ static void init_function_pointers(void) ok(hr == S_OK, "SHGetMalloc failed %08x\n", hr); } +static const char *wine_dbgstr_w(LPCWSTR str) +{ + static char buf[512]; + if (!str) + return "(null)"; + WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); + return buf; +} + static void test_ParseDisplayName(void) { HRESULT hr; @@ -265,13 +274,15 @@ static void test_EnumObjects(IShellFolder *iFolder) for (i = 0; i < 5; i++) { SFGAOF flags; +#define SFGAO_VISTA SFGAO_DROPTARGET | SFGAO_CANLINK | SFGAO_CANCOPY /* Native returns all flags no matter what we ask for */ flags = SFGAO_CANCOPY; hr = IShellFolder_GetAttributesOf(iFolder, 1, (LPCITEMIDLIST*)(idlArr + i), &flags); flags &= SFGAO_testfor; ok(hr == S_OK, "GetAttributesOf returns %08x\n", hr); ok(flags == (attrs[i]) || - flags == (attrs[i] & ~SFGAO_FILESYSANCESTOR), /* Win9x, NT4 */ + flags == (attrs[i] & ~SFGAO_FILESYSANCESTOR) || /* Win9x, NT4 */ + flags == ((attrs[i] & ~SFGAO_CAPABILITYMASK) | SFGAO_VISTA), /* Vista and higher */ "GetAttributesOf[%i] got %08x, expected %08x\n", i, flags, attrs[i]); flags = SFGAO_testfor; @@ -469,7 +480,8 @@ static void test_GetDisplayName(void) } /* WinXP and up store the filenames as both ANSI and UNICODE in the pidls */ if (pidlLast->mkid.cb >= 76) { - ok(!lstrcmpW((WCHAR*)&pidlLast->mkid.abID[46], wszFileName), + ok(!lstrcmpW((WCHAR*)&pidlLast->mkid.abID[46], wszFileName) || + (pidlLast->mkid.cb >= 94 && !lstrcmpW((WCHAR*)&pidlLast->mkid.abID[64], wszFileName)), /* Vista */ "Filename should be stored as wchar-string at this position!\n"); } @@ -478,6 +490,7 @@ static void test_GetDisplayName(void) hr = IShellFolder_BindToObject(psfDesktop, pidlTestFile, NULL, &IID_IUnknown, (VOID**)&psfFile); todo_wine ok (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || + hr == E_NOTIMPL || /* Vista */ broken(SUCCEEDED(hr)), /* Win9x, W2K */ "hr = %08x\n", hr); if (SUCCEEDED(hr)) { @@ -960,7 +973,9 @@ static void test_SHGetPathFromIDList(void) wszPath[1] = '\0'; result = pSHGetPathFromIDListW(pidlMyComputer, wszPath); ok (!result, "SHGetPathFromIDListW succeeded where it shouldn't!\n"); - ok (GetLastError()==0xdeadbeef, "SHGetPathFromIDListW shouldn't set last error! Last error: %u\n", GetLastError()); + ok (GetLastError()==0xdeadbeef || + GetLastError()==ERROR_SUCCESS, /* Vista and higher */ + "Unexpected last error from SHGetPathFromIDListW: %u\n", GetLastError()); ok (!wszPath[0], "Expected empty path\n"); if (result) { IShellFolder_Release(psfDesktop); @@ -1116,6 +1131,10 @@ static HRESULT WINAPI InitPropertyBag_IPropertyBag_Read(IPropertyBag *iface, LPC 'A','t','t','r','i','b','u','t','e','s',0 }; static const WCHAR wszResolveLinkFlags[] = { 'R','e','s','o','l','v','e','L','i','n','k','F','l','a','g','s',0 }; + static const WCHAR wszTargetKnownFolder[] = { + 'T','a','r','g','e','t','K','n','o','w','n','F','o','l','d','e','r',0 }; + static const WCHAR wszCLSID[] = { + 'C','L','S','I','D',0 }; if (!lstrcmpW(pszPropName, wszTargetSpecialFolder)) { ok(V_VT(pVar) == VT_I4 || @@ -1155,7 +1174,19 @@ static HRESULT WINAPI InitPropertyBag_IPropertyBag_Read(IPropertyBag *iface, LPC return S_OK; } - ok(FALSE, "PropertyBag was asked for unknown property (vt=%d)!\n", V_VT(pVar)); + if (!lstrcmpW(pszPropName, wszTargetKnownFolder)) { + ok(V_VT(pVar) == VT_BSTR, "Wrong variant type for 'TargetKnownFolder' property!\n"); + /* TODO */ + return E_INVALIDARG; + } + + if (!lstrcmpW(pszPropName, wszCLSID)) { + ok(V_VT(pVar) == VT_EMPTY, "Wrong variant type for 'CLSID' property!\n"); + /* TODO */ + return E_INVALIDARG; + } + + ok(FALSE, "PropertyBag was asked for unknown property %s (vt=%d)!\n", wine_dbgstr_w(pszPropName), V_VT(pVar)); return E_INVALIDARG; } @@ -1529,7 +1560,7 @@ static void testSHGetFolderPathAndSubDirA(void) static char toolongpath[MAX_PATH+1]; if(!pSHGetFolderPathA) { - skip("SHGetFolderPathA not present!\n"); + win_skip("SHGetFolderPathA not present!\n"); return; } if(FAILED(pSHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, appdata))) @@ -1551,16 +1582,13 @@ static void testSHGetFolderPathAndSubDirA(void) skip("RemoveDirectoryA(%s) failed with error %u\n", testpath, GetLastError()); return; } - for(i=0; i< MAX_PATH; i++) - toolongpath[i] = '0' + i % 10; - toolongpath[MAX_PATH] = '\0'; /* test invalid second parameter */ ret = pSHGetFolderPathAndSubDirA(NULL, CSIDL_FLAG_DONT_VERIFY | 0xff, NULL, SHGFP_TYPE_CURRENT, wine, testpath); ok(E_INVALIDARG == ret, "expected E_INVALIDARG, got %x\n", ret); - /* test invalid forth parameter */ - ret = pSHGetFolderPathAndSubDirA(NULL, CSIDL_FLAG_DONT_VERIFY | CSIDL_LOCAL_APPDATA, NULL, 2, wine, testpath); + /* test fourth parameter */ + ret = pSHGetFolderPathAndSubDirA(NULL, CSIDL_FLAG_DONT_VERIFY | CSIDL_LOCAL_APPDATA, NULL, 2, winetemp, testpath); switch(ret) { case S_OK: /* winvista */ ok(!strncmp(appdata, testpath, strlen(appdata)), @@ -1590,6 +1618,9 @@ static void testSHGetFolderPathAndSubDirA(void) ok(S_OK == ret, "expected S_OK, got %x\n", ret); ok(!lstrcmpA(appdata, testpath), "expected %s, got %s\n", appdata, testpath); + for(i=0; i< MAX_PATH; i++) + toolongpath[i] = '0' + i % 10; + toolongpath[MAX_PATH] = '\0'; ret = pSHGetFolderPathAndSubDirA(NULL, CSIDL_FLAG_DONT_VERIFY | CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, toolongpath, testpath); ok(HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE) == ret, "expected %x, got %x\n", HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE), ret); @@ -1622,15 +1653,6 @@ static void testSHGetFolderPathAndSubDirA(void) RemoveDirectoryA(testpath); } -static const char *wine_dbgstr_w(LPCWSTR str) -{ - static char buf[512]; - if (!str) - return "(null)"; - WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); - return buf; -} - static void test_LocalizedNames(void) { static char cCurrDirA[MAX_PATH]; From 7480a839caec27f5f90330801e0350f74d8af523 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 25 Jun 2009 18:48:46 +0000 Subject: [PATCH 095/577] - revert 41605 as its incorrect svn path=/trunk/; revision=41612 --- reactos/dll/win32/advapi32/token/token.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/advapi32/token/token.c b/reactos/dll/win32/advapi32/token/token.c index f32d629d1d0..8ed48af0ac8 100644 --- a/reactos/dll/win32/advapi32/token/token.c +++ b/reactos/dll/win32/advapi32/token/token.c @@ -172,7 +172,7 @@ AccessCheck(IN PSECURITY_DESCRIPTOR pSecurityDescriptor, { /* Access denied */ SetLastError(RtlNtStatusToDosError(NtAccessStatus)); - return FALSE; + *AccessStatus = FALSE; } else { From 8ce3178f05277b0111a9436e5f6f0f03eb2606ad Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Thu, 25 Jun 2009 19:58:12 +0000 Subject: [PATCH 096/577] Add accessibility keys. svn path=/trunk/; revision=41613 --- reactos/boot/bootdata/hivedef_arm.inf | 5 +++++ reactos/boot/bootdata/hivedef_i386.inf | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/reactos/boot/bootdata/hivedef_arm.inf b/reactos/boot/bootdata/hivedef_arm.inf index 31841026c5e..202459ac4fd 100644 --- a/reactos/boot/bootdata/hivedef_arm.inf +++ b/reactos/boot/bootdata/hivedef_arm.inf @@ -456,6 +456,11 @@ HKCU, "Control Panel\Desktop\WindowMetrics","StatusFont",0x00000001,f5,ff,ff,ff, 00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +; Accessibility +HKCU,"Control Panel\Accessibility",,0x00000012 +HKCU,"Control Panel\Accessibility\Keyboard Preference",,0x00000012 +HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0" + ; Internet Explorer HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf index 45d82e05f77..a481c430ab8 100644 --- a/reactos/boot/bootdata/hivedef_i386.inf +++ b/reactos/boot/bootdata/hivedef_i386.inf @@ -474,6 +474,11 @@ HKCU, "Control Panel\Desktop\WindowMetrics","StatusFont",0x00000001,f5,ff,ff,ff, 00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 +; Accessibility +HKCU,"Control Panel\Accessibility",,0x00000012 +HKCU,"Control Panel\Accessibility\Keyboard Preference",,0x00000012 +HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0" + ; Internet Explorer HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" From f1ab1a2cae73382f659892bdf48e6655a35fa6cb Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 25 Jun 2009 20:39:32 +0000 Subject: [PATCH 097/577] - Implement HCBT_CREATEWND support. Tested with user32 cross wine tests, still hangs on win test. For Christoph. svn path=/trunk/; revision=41614 --- .../subsystems/win32/win32k/ntuser/callback.c | 64 ++++++++++++++----- reactos/subsystems/win32/win32k/ntuser/hook.c | 60 ++++++++++++++++- 2 files changed, 106 insertions(+), 18 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 05585952834..49ed2af6617 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -347,8 +347,10 @@ co_IntCallHookProc(INT HookId, CBT_CREATEWNDW *CbtCreateWnd =NULL; PCHAR Extra; PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra ; - PUNICODE_STRING WindowName = NULL; - PUNICODE_STRING ClassName = NULL; + UNICODE_STRING WindowName; + UNICODE_STRING ClassName; + PANSI_STRING asWindowName; + PANSI_STRING asClassName; ArgumentLength = sizeof(HOOKPROC_CALLBACK_ARGUMENTS) - sizeof(WCHAR) + ModuleName->Length; @@ -360,12 +362,29 @@ co_IntCallHookProc(INT HookId, case HCBT_CREATEWND: CbtCreateWnd = (CBT_CREATEWNDW *) lParam; ArgumentLength += sizeof(HOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS); - WindowName = (PUNICODE_STRING) (CbtCreateWnd->lpcs->lpszName); - ArgumentLength += WindowName->Length + sizeof(WCHAR); - ClassName = (PUNICODE_STRING) (CbtCreateWnd->lpcs->lpszClass); - if (! IS_ATOM(ClassName->Buffer)) + + asWindowName = (PANSI_STRING)&WindowName; + asClassName = (PANSI_STRING)&ClassName; + + if (Ansi) { - ArgumentLength += ClassName->Length + sizeof(WCHAR); + RtlInitAnsiString(asWindowName, (PCSZ)CbtCreateWnd->lpcs->lpszName); + ArgumentLength += WindowName.Length + sizeof(CHAR); + } + else + { + RtlInitUnicodeString(&WindowName, CbtCreateWnd->lpcs->lpszName); + ArgumentLength += WindowName.Length + sizeof(WCHAR); + } + + if (Ansi) + RtlInitAnsiString(asClassName, (PCSZ)CbtCreateWnd->lpcs->lpszClass); + else + RtlInitUnicodeString(&ClassName, CbtCreateWnd->lpcs->lpszClass); + + if (! IS_ATOM(ClassName.Buffer)) + { + ArgumentLength += ClassName.Length + sizeof(WCHAR); } break; default: @@ -430,19 +449,32 @@ co_IntCallHookProc(INT HookId, CbtCreatewndExtra->Cs = *(CbtCreateWnd->lpcs); CbtCreatewndExtra->WndInsertAfter = CbtCreateWnd->hwndInsertAfter; Extra = (PCHAR) (CbtCreatewndExtra + 1); - RtlCopyMemory(Extra, WindowName->Buffer, WindowName->Length); + RtlCopyMemory(Extra, WindowName.Buffer, WindowName.Length); CbtCreatewndExtra->Cs.lpszName = (LPCWSTR) (Extra - (PCHAR) CbtCreatewndExtra); - CbtCreatewndExtra->Cs.lpszClass = ClassName->Buffer; - Extra += WindowName->Length; - *((WCHAR *) Extra) = L'\0'; - Extra += sizeof(WCHAR); - if (! IS_ATOM(ClassName->Buffer)) + CbtCreatewndExtra->Cs.lpszClass = ClassName.Buffer; + Extra += WindowName.Length; + if (Ansi) { - RtlCopyMemory(Extra, ClassName->Buffer, ClassName->Length); + *((CHAR *) Extra) = '\0'; + Extra += sizeof(CHAR); + } + else + { + *((WCHAR *) Extra) = L'\0'; + Extra += sizeof(WCHAR); + } + + if (! IS_ATOM(ClassName.Buffer)) + { + RtlCopyMemory(Extra, ClassName.Buffer, ClassName.Length); CbtCreatewndExtra->Cs.lpszClass = (LPCWSTR) MAKELONG(Extra - (PCHAR) CbtCreatewndExtra, 1); - Extra += ClassName->Length; - *((WCHAR *) Extra) = L'\0'; + Extra += ClassName.Length; + + if (Ansi) + *((CHAR *) Extra) = '\0'; + else + *((WCHAR *) Extra) = L'\0'; } break; } diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 083cf9d0f86..5c2d839d328 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -788,10 +788,66 @@ UserCallNextHookEx(PHOOK Hook, DPRINT1("HOOK WH_CBT!\n"); switch (Code) { - case HCBT_CREATEWND: /* Use Ansi. */ + case HCBT_CREATEWND: + { + LPCBT_CREATEWNDW pcbtcww = (LPCBT_CREATEWNDW)lParam; + DPRINT1("HOOK HCBT_CREATEWND\n"); - /* lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); */ + _SEH2_TRY + { + if (Ansi) + { + ProbeForRead( pcbtcww, + sizeof(CBT_CREATEWNDA), + 1); + ProbeForWrite(pcbtcww->lpcs, + sizeof(CREATESTRUCTA), + 1); + ProbeForRead( pcbtcww->lpcs->lpszName, + sizeof(CHAR), + 1); + + if (!IS_ATOM(pcbtcww->lpcs->lpszClass)) + { + ProbeForRead( pcbtcww->lpcs->lpszClass, + sizeof(CHAR), + 1); + } + } + else + { + ProbeForRead( pcbtcww, + sizeof(CBT_CREATEWNDW), + 1); + ProbeForWrite(pcbtcww->lpcs, + sizeof(CREATESTRUCTW), + 1); + ProbeForRead( pcbtcww->lpcs->lpszName, + sizeof(WCHAR), + 1); + + if (!IS_ATOM(pcbtcww->lpcs->lpszClass)) + { + ProbeForRead( pcbtcww->lpcs->lpszClass, + sizeof(WCHAR), + 1); + } + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + BadChk = TRUE; + } + _SEH2_END; + + if (BadChk) + { + DPRINT1("HOOK HCBT_CREATEWND write ERROR!\n"); + } + /* The next call handles the structures. */ + if (!BadChk) lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); break; + } case HCBT_MOVESIZE: { From 576c4e61fe091f20b7d9dbbf0a060caa94ded549 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 25 Jun 2009 21:00:16 +0000 Subject: [PATCH 098/577] - Fix ATOM check for HCBT_CREATEWND callback. svn path=/trunk/; revision=41615 --- .../subsystems/win32/win32k/ntuser/callback.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 49ed2af6617..ed9dc82fa8f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -377,14 +377,18 @@ co_IntCallHookProc(INT HookId, ArgumentLength += WindowName.Length + sizeof(WCHAR); } - if (Ansi) - RtlInitAnsiString(asClassName, (PCSZ)CbtCreateWnd->lpcs->lpszClass); - else - RtlInitUnicodeString(&ClassName, CbtCreateWnd->lpcs->lpszClass); - - if (! IS_ATOM(ClassName.Buffer)) + if (! IS_ATOM(CbtCreateWnd->lpcs->lpszClass)) { - ArgumentLength += ClassName.Length + sizeof(WCHAR); + if (Ansi) + { + RtlInitAnsiString(asClassName, (PCSZ)CbtCreateWnd->lpcs->lpszClass); + ArgumentLength += ClassName.Length + sizeof(CHAR); + } + else + { + RtlInitUnicodeString(&ClassName, CbtCreateWnd->lpcs->lpszClass); + ArgumentLength += ClassName.Length + sizeof(WCHAR); + } } break; default: From 336fb5e2d6240f9b16491318ed6f4e42727a6009 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 26 Jun 2009 00:30:54 +0000 Subject: [PATCH 099/577] - Turn off callback for HCBT_CREATEWND. svn path=/trunk/; revision=41616 --- reactos/subsystems/win32/win32k/ntuser/hook.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 5c2d839d328..9bafa824760 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -529,7 +529,7 @@ IntCallDebugHook(PHOOK Hook, case HCBT_CREATEWND: /* Handle Ansi? */ Size = sizeof(CBT_CREATEWND); - /* What shall we do? Size += sizeof(CREATESTRUCTEX); */ + /* What shall we do? Size += sizeof(HOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS); same ass CREATESTRUCTEX */ break; default: @@ -845,7 +845,10 @@ UserCallNextHookEx(PHOOK Hook, DPRINT1("HOOK HCBT_CREATEWND write ERROR!\n"); } /* The next call handles the structures. */ - if (!BadChk) lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); + if (!BadChk) + { +// lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); + } break; } From f69cbf46cc7be21f4353af79fc698f3fe347faef Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 26 Jun 2009 02:10:52 +0000 Subject: [PATCH 100/577] - Fix breakage when in HCBT_CREATEWND callback. svn path=/trunk/; revision=41617 --- reactos/dll/win32/user32/windows/hook.c | 33 ++++--------------- .../subsystems/win32/win32k/include/win32.h | 1 + .../subsystems/win32/win32k/ntuser/callback.c | 10 +++++- reactos/subsystems/win32/win32k/ntuser/hook.c | 6 ++-- 4 files changed, 20 insertions(+), 30 deletions(-) diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index d992ed390cb..f5bff7b4da0 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -412,10 +412,8 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) LRESULT Result; CREATESTRUCTW Csw; CBT_CREATEWNDW CbtCreatewndw; - UNICODE_STRING UString; CREATESTRUCTA Csa; CBT_CREATEWNDA CbtCreatewnda; - ANSI_STRING AString; PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra; WPARAM wParam; LPARAM lParam; @@ -451,18 +449,6 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) if (Common->Ansi) { memcpy(&Csa, &Csw, sizeof(CREATESTRUCTW)); - if (NULL != Csw.lpszName) - { - RtlInitUnicodeString(&UString, Csw.lpszName); - RtlUnicodeStringToAnsiString(&AString, &UString, TRUE); - Csa.lpszName = AString.Buffer; - } - if (0 != HIWORD(Csw.lpszClass)) - { - RtlInitUnicodeString(&UString, Csw.lpszClass); - RtlUnicodeStringToAnsiString(&AString, &UString, TRUE); - Csa.lpszClass = AString.Buffer; - } CbtCreatewnda.lpcs = &Csa; CbtCreatewnda.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; lParam = (LPARAM) &CbtCreatewnda; @@ -478,22 +464,17 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED); } - Result = Common->Proc(Common->Code, wParam, lParam); + if (Common->Proc) + Result = Common->Proc(Common->Code, wParam, lParam); + else + { + ERR("Common = 0x%x, Proc = 0x%x\n",Common,Common->Proc); + } switch(Common->Code) { case HCBT_CREATEWND: - if (Common->Ansi) - { - if (0 != HIWORD(Csa.lpszClass)) - { - RtlFreeHeap(GetProcessHeap(), 0, (LPSTR) Csa.lpszClass); - } - if (NULL != Csa.lpszName) - { - RtlFreeHeap(GetProcessHeap(), 0, (LPSTR) Csa.lpszName); - } - } + CbtCreatewndExtra->WndInsertAfter = CbtCreatewndw.hwndInsertAfter; break; } break; diff --git a/reactos/subsystems/win32/win32k/include/win32.h b/reactos/subsystems/win32/win32k/include/win32.h index 3f684637ba2..01de1162639 100644 --- a/reactos/subsystems/win32/win32k/include/win32.h +++ b/reactos/subsystems/win32/win32k/include/win32.h @@ -43,6 +43,7 @@ typedef struct _THREADINFO UINT cPaintsReady; /* Count of paints pending. */ UINT cTimersReady; /* Count of timers pending. */ ULONG fsHooks; + PHOOK sphkCurrent; LIST_ENTRY PtiLink; CLIENTTHREADINFO cti; // Used only when no Desktop or pcti NULL. diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index ed9dc82fa8f..94e712b7fb4 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -346,7 +346,7 @@ co_IntCallHookProc(INT HookId, PHOOKPROC_CALLBACK_ARGUMENTS Common; CBT_CREATEWNDW *CbtCreateWnd =NULL; PCHAR Extra; - PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra ; + PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL; UNICODE_STRING WindowName; UNICODE_STRING ClassName; PANSI_STRING asWindowName; @@ -546,6 +546,14 @@ co_IntCallHookProc(INT HookId, return 0; } + if (HookId == WH_CBT && Code == HCBT_CREATEWND) + { + if (CbtCreatewndExtra) + { + CbtCreateWnd->hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; + } + } + if (Argument) IntCbFreeMemory(Argument); return Result; diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 9bafa824760..e76c04be93e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -529,7 +529,7 @@ IntCallDebugHook(PHOOK Hook, case HCBT_CREATEWND: /* Handle Ansi? */ Size = sizeof(CBT_CREATEWND); - /* What shall we do? Size += sizeof(HOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS); same ass CREATESTRUCTEX */ + /* What shall we do? Size += sizeof(HOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS); same as CREATESTRUCTEX */ break; default: @@ -845,9 +845,9 @@ UserCallNextHookEx(PHOOK Hook, DPRINT1("HOOK HCBT_CREATEWND write ERROR!\n"); } /* The next call handles the structures. */ - if (!BadChk) + if (!BadChk && Hook->Proc) { -// lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); + lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); } break; } From 4e67d94e81eecfafd337680532eee8cbc01a1bb4 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Fri, 26 Jun 2009 06:34:25 +0000 Subject: [PATCH 101/577] fix formatting svn path=/trunk/; revision=41618 --- reactos/dll/win32/user32/windows/hook.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index f5bff7b4da0..dbbee3d96a8 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -132,13 +132,13 @@ CallMsgFilterA( CBT_CREATEWNDA *cbtcwA = (CBT_CREATEWNDA *)lpMsg->lParam; CBT_CREATEWNDW cbtcwW; CREATESTRUCTW csW; - MSG Msg; + MSG Msg; - Msg.hwnd = lpMsg->hwnd; - Msg.message = lpMsg->message; - Msg.time = lpMsg->time; - Msg.pt = lpMsg->pt; - Msg.wParam = lpMsg->wParam; + Msg.hwnd = lpMsg->hwnd; + Msg.message = lpMsg->message; + Msg.time = lpMsg->time; + Msg.pt = lpMsg->pt; + Msg.wParam = lpMsg->wParam; cbtcwW.lpcs = &csW; cbtcwW.hwndInsertAfter = cbtcwA->hwndInsertAfter; From c98e73cfce3afdc980c3641b492baf55916acde4 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Fri, 26 Jun 2009 07:22:34 +0000 Subject: [PATCH 102/577] revert 41599 svn path=/trunk/; revision=41619 --- reactos/ntoskrnl/po/power.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/reactos/ntoskrnl/po/power.c b/reactos/ntoskrnl/po/power.c index 6701ce2d9db..98768e34a52 100644 --- a/reactos/ntoskrnl/po/power.c +++ b/reactos/ntoskrnl/po/power.c @@ -588,16 +588,6 @@ NTAPI NtSetThreadExecutionState(IN EXECUTION_STATE esFlags, OUT EXECUTION_STATE *PreviousFlags) { - static EXECUTION_STATE current = - ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_USER_PRESENT; - EXECUTION_STATE old = current; - UNIMPLEMENTED; - - if (!(current & ES_CONTINUOUS) || (esFlags & ES_CONTINUOUS)) - current = esFlags; - - *PreviousFlags = old; - - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } From d6d058ab49b8ab3bec374c069f192de3a6f5fb6f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 26 Jun 2009 09:39:00 +0000 Subject: [PATCH 103/577] - Implement NtSetThreadExecutionState (in place of what has been committed in r41599 and reverted in 41619). svn path=/trunk/; revision=41620 --- reactos/ntoskrnl/po/power.c | 52 +++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/po/power.c b/reactos/ntoskrnl/po/power.c index 98768e34a52..dbf72a94382 100644 --- a/reactos/ntoskrnl/po/power.c +++ b/reactos/ntoskrnl/po/power.c @@ -588,6 +588,54 @@ NTAPI NtSetThreadExecutionState(IN EXECUTION_STATE esFlags, OUT EXECUTION_STATE *PreviousFlags) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PKTHREAD Thread = KeGetCurrentThread(); + KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); + EXECUTION_STATE PreviousState; + PAGED_CODE(); + + /* Validate flags */ + if (esFlags & ~(ES_CONTINUOUS | ES_USER_PRESENT)) + { + /* Fail the request */ + return STATUS_INVALID_PARAMETER; + } + + /* Check for user parameters */ + if (PreviousMode != KernelMode) + { + /* Protect the probes */ + _SEH2_TRY + { + /* Check if the pointer is valid */ + ProbeForWriteUlong(PreviousFlags); + } + _SEH2_EXCEPT(ExSystemExceptionFilter()) + { + /* It isn't -- fail */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + } + + /* Save the previous state, always masking in the continous flag */ + PreviousState = Thread->PowerState | ES_CONTINUOUS; + + /* Check if we need to update the power state */ + if (esFlags & ES_CONTINUOUS) Thread->PowerState = esFlags; + + /* Protect the write back to user mode */ + _SEH2_TRY + { + /* Return the previous flags */ + *PreviousFlags = PreviousState; + } + _SEH2_EXCEPT(ExSystemExceptionFilter()) + { + /* Something's wrong, fail */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + + /* All is good */ + return STATUS_SUCCESS; } From 28685db4e46ec519c4531ff58c06c216c800e200 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 26 Jun 2009 12:05:13 +0000 Subject: [PATCH 104/577] - Rewrite PcRegisterIoTimeout, PcUnregisterIoTimeout to support more than one PIO_TIMER_ROUTINE per device object svn path=/trunk/; revision=41621 --- .../wdm/audio/backpln/portcls/adapter.c | 8 ++ .../drivers/wdm/audio/backpln/portcls/api.c | 135 +++++++++++++++--- .../drivers/wdm/audio/backpln/portcls/undoc.c | 24 ---- 3 files changed, 125 insertions(+), 42 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c index 5849dd921c5..f89f65c77f2 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c @@ -153,6 +153,14 @@ PcAddAdapterDevice( InitializeListHead(&portcls_ext->SubDeviceList); /* prepare the physical connection list */ InitializeListHead(&portcls_ext->PhysicalConnectionList); + /* initialize timer lock */ + KeInitializeSpinLock(&portcls_ext->TimerListLock); + /* initialize timer list */ + InitializeListHead(&portcls_ext->TimerList); + /* initialize io timer */ + IoInitializeTimer(PhysicalDeviceObject, PcIoTimerRoutine, NULL); + /* start the io timer */ + IoStartTimer(PhysicalDeviceObject); /* set io flags */ fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/api.c b/reactos/drivers/wdm/audio/backpln/portcls/api.c index a03b6788028..65a5cf696cc 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/api.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/api.c @@ -40,7 +40,41 @@ PcGetTimeInterval( } /* - * @unimplemented + * @implemented + */ + +VOID +NTAPI +PcIoTimerRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PVOID Context) +{ + PPCLASS_DEVICE_EXTENSION DeviceExtension; + KIRQL OldIrql; + PLIST_ENTRY ListEntry; + PTIMER_CONTEXT CurContext; + + if (!DeviceObject || !DeviceObject->DeviceExtension) + return; + + DeviceExtension = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + KeAcquireSpinLock(&DeviceExtension->TimerListLock, &OldIrql); + + ListEntry = DeviceExtension->TimerList.Flink; + while(ListEntry != &DeviceExtension->TimerList) + { + CurContext = (PTIMER_CONTEXT)CONTAINING_RECORD(ListEntry, TIMER_CONTEXT, Entry); + + CurContext->pTimerRoutine(DeviceObject, CurContext->Context); + ListEntry = ListEntry->Flink; + } + + KeReleaseSpinLock(&DeviceExtension->TimerListLock, OldIrql); +} + +/* + * @implemented */ NTSTATUS NTAPI PcRegisterIoTimeout( @@ -48,42 +82,107 @@ PcRegisterIoTimeout( IN PIO_TIMER_ROUTINE pTimerRoutine, IN PVOID pContext) { - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; + PTIMER_CONTEXT TimerContext, CurContext; + KIRQL OldIrql; + PLIST_ENTRY ListEntry; + BOOLEAN bFound; + PPCLASS_DEVICE_EXTENSION DeviceExtension; ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); - /* FIXME - * check if timer is already used - */ + if (!pDeviceObject || !pDeviceObject->DeviceExtension) + return STATUS_INVALID_PARAMETER; - Status = IoInitializeTimer(pDeviceObject, pTimerRoutine, pContext); - if (!NT_SUCCESS(Status)) + DeviceExtension = (PPCLASS_DEVICE_EXTENSION)pDeviceObject->DeviceExtension; + + TimerContext = AllocateItem(NonPagedPool, sizeof(TIMER_CONTEXT), TAG_PORTCLASS); + if (!TimerContext) { - DPRINT1("IoInitializeTimer failed with %x\n", Status); - return Status; + DPRINT1("Failed to allocate memory\n"); + return STATUS_INSUFFICIENT_RESOURCES; } - IoStartTimer(pDeviceObject); - return STATUS_SUCCESS; + KeAcquireSpinLock(&DeviceExtension->TimerListLock, &OldIrql); + + ListEntry = DeviceExtension->TimerList.Flink; + bFound = FALSE; + while(ListEntry != &DeviceExtension->TimerList) + { + CurContext = (PTIMER_CONTEXT)CONTAINING_RECORD(ListEntry, TIMER_CONTEXT, Entry); + + if (CurContext->Context == pContext && CurContext->pTimerRoutine == pTimerRoutine) + { + bFound = TRUE; + Status = STATUS_UNSUCCESSFUL; + ExFreePool(TimerContext); + break; + } + ListEntry = ListEntry->Flink; + } + + if (!bFound) + { + TimerContext->Context = pContext; + TimerContext->pTimerRoutine = pTimerRoutine; + InsertTailList(&DeviceExtension->TimerList, &TimerContext->Entry); + } + + KeReleaseSpinLock(&DeviceExtension->TimerListLock, OldIrql); + + return Status; } /* - * @unimplemented + * @implemented */ -NTSTATUS NTAPI +NTSTATUS +NTAPI PcUnregisterIoTimeout( IN PDEVICE_OBJECT pDeviceObject, IN PIO_TIMER_ROUTINE pTimerRoutine, IN PVOID pContext) { + PTIMER_CONTEXT CurContext; + KIRQL OldIrql; + PLIST_ENTRY ListEntry; + BOOLEAN bFound; + PPCLASS_DEVICE_EXTENSION DeviceExtension; + ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); - /* FIXME - * check if timer is already used - */ + if (!pDeviceObject || !pDeviceObject->DeviceExtension) + return STATUS_INVALID_PARAMETER; - IoStopTimer(pDeviceObject); - return STATUS_SUCCESS; + + DeviceExtension = (PPCLASS_DEVICE_EXTENSION)pDeviceObject->DeviceExtension; + + + KeAcquireSpinLock(&DeviceExtension->TimerListLock, &OldIrql); + + ListEntry = DeviceExtension->TimerList.Flink; + bFound = FALSE; + + while(ListEntry != &DeviceExtension->TimerList) + { + CurContext = (PTIMER_CONTEXT)CONTAINING_RECORD(ListEntry, TIMER_CONTEXT, Entry); + + if (CurContext->Context == pContext && CurContext->pTimerRoutine == pTimerRoutine) + { + bFound = TRUE; + RemoveEntryList(&CurContext->Entry); + ExFreePool(CurContext); + break; + } + ListEntry = ListEntry->Flink; + } + + KeReleaseSpinLock(&DeviceExtension->TimerListLock, OldIrql); + + if (bFound) + return STATUS_SUCCESS; + else + return STATUS_NOT_FOUND; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.c b/reactos/drivers/wdm/audio/backpln/portcls/undoc.c index b7c736c78e2..4e3cc28a564 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.c @@ -327,27 +327,3 @@ PcValidateConnectRequest( return KsValidateConnectRequest(Irp, Factory->PinDescriptorCount, Factory->KsPinDescriptor, Connect); } - -/* PcDeleteSubdeviceDescriptor */ - -/* PcFreeEventTable */ - -/* PcFreePropertyTable */ - -/* PcGenerateEventDeferredRoutine */ - -/* PcGenerateEventList */ - -/* PcHandleDisableEventWithTable */ - -/* PcHandleEnableEventWithTable */ - -/* PcHandlePropertyWithTable */ - -/* PcPinPropertyHandler */ - -/* PcTerminateConnection */ - -/* PcValidateConnectRequest */ - -/* PcVerifyFilterIsReady */ From a74571e0a9a34bf0c96ebc0327355041788d2928 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 26 Jun 2009 13:08:09 +0000 Subject: [PATCH 105/577] - fix build broken in rev 41621 svn path=/trunk/; revision=41622 --- .../drivers/wdm/audio/backpln/portcls/private.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h index 48c1ff154a9..e572ed0de9c 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h @@ -289,6 +289,12 @@ NTAPI NewIPortWavePciStream( OUT PPORTWAVEPCISTREAM *Stream); +VOID +NTAPI +PcIoTimerRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PVOID Context); + #define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\ PropGeneral, PropInstances, PropIntersection)\ DEFINE_KSPROPERTY_TABLE(PinSet) {\ @@ -338,6 +344,9 @@ typedef struct LIST_ENTRY SubDeviceList; LIST_ENTRY PhysicalConnectionList; + LIST_ENTRY TimerList; + KSPIN_LOCK TimerListLock; + } PCLASS_DEVICE_EXTENSION, *PPCLASS_DEVICE_EXTENSION; @@ -354,4 +363,11 @@ typedef struct PIRP Irp; }CLOSESTREAM_CONTEXT, *PCLOSESTREAM_CONTEXT; +typedef struct +{ + LIST_ENTRY Entry; + PIO_TIMER_ROUTINE pTimerRoutine; + PVOID Context; +}TIMER_CONTEXT, *PTIMER_CONTEXT; + #endif From af23e9415c3834b205fbd40fda6d01bab3855c27 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 26 Jun 2009 14:17:12 +0000 Subject: [PATCH 106/577] - Callback routine expects fdo - Fix boot svn path=/trunk/; revision=41623 --- reactos/drivers/wdm/audio/backpln/portcls/adapter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c index f89f65c77f2..69ee2c9f72a 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c @@ -158,9 +158,9 @@ PcAddAdapterDevice( /* initialize timer list */ InitializeListHead(&portcls_ext->TimerList); /* initialize io timer */ - IoInitializeTimer(PhysicalDeviceObject, PcIoTimerRoutine, NULL); + IoInitializeTimer(fdo, PcIoTimerRoutine, NULL); /* start the io timer */ - IoStartTimer(PhysicalDeviceObject); + IoStartTimer(fdo); /* set io flags */ fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE; From 8b461b7616f9c72ce78b156110711eb4f93ee4cd Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 26 Jun 2009 15:51:14 +0000 Subject: [PATCH 107/577] - Write strmini.h for stream class driver svn path=/trunk/; revision=41624 --- reactos/include/ddk/strmini.h | 562 ++++++++++++++++++++++++++++++++++ 1 file changed, 562 insertions(+) create mode 100644 reactos/include/ddk/strmini.h diff --git a/reactos/include/ddk/strmini.h b/reactos/include/ddk/strmini.h new file mode 100644 index 00000000000..85248a558fe --- /dev/null +++ b/reactos/include/ddk/strmini.h @@ -0,0 +1,562 @@ +#ifndef _STREAM_H +#define _STREAM_H + +#include +#include +#include +#include + +#define STREAMAPI __stdcall +#define STREAM_SYSTEM_TIME_MASK ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF) + +#if DBG + +#define DebugPrint(x) StreamClassDebugPrint x +#define DEBUG_BREAKPOINT() DbgBreakPoint() +#define DEBUG_ASSERT(exp) \ + if ( !(exp) ) { \ + StreamClassDebugAssert( __FILE__, __LINE__, #exp, exp); \ + } +#else + +#define DebugPrint(x) +#define DEBUG_BREAKPOINT() +#define DEBUG_ASSERT(exp) + +#endif + +typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS, *PSTREAM_PHYSICAL_ADDRESS; +typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME; +typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP; + +typedef enum +{ + TIME_GET_STREAM_TIME, + TIME_READ_ONBOARD_CLOCK, + TIME_SET_ONBOARD_CLOCK +}TIME_FUNCTION; + +typedef struct _HW_TIME_CONTEXT +{ + struct _HW_DEVICE_EXTENSION *HwDeviceExtension; + struct _HW_STREAM_OBJECT *HwStreamObject; + TIME_FUNCTION Function; + ULONGLONG Time; + ULONGLONG SystemTime; +}HW_TIME_CONTEXT, *PHW_TIME_CONTEXT; + +typedef struct _HW_EVENT_DESCRIPTOR +{ + BOOLEAN Enable; + PKSEVENT_ENTRY EventEntry; + PKSEVENTDATA EventData; + union + { + struct _HW_STREAM_OBJECT * StreamObject; + struct _HW_DEVICE_EXTENSION *DeviceExtension; + }; + ULONG EnableEventSetIndex; + PVOID HwInstanceExtension; + ULONG Reserved; +} HW_EVENT_DESCRIPTOR, *PHW_EVENT_DESCRIPTOR; + + +typedef VOID (STREAMAPI * PHW_RECEIVE_STREAM_DATA_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK * SRB); +typedef VOID (STREAMAPI * PHW_RECEIVE_STREAM_CONTROL_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK * SRB); +typedef NTSTATUS (STREAMAPI * PHW_EVENT_ROUTINE) (IN PHW_EVENT_DESCRIPTOR EventDescriptor); +typedef VOID (STREAMAPI * PHW_CLOCK_FUNCTION) (IN PHW_TIME_CONTEXT HwTimeContext); + +typedef struct _HW_CLOCK_OBJECT +{ + PHW_CLOCK_FUNCTION HwClockFunction; + ULONG ClockSupportFlags; + ULONG Reserved[2]; +} HW_CLOCK_OBJECT, *PHW_CLOCK_OBJECT; + +#define CLOCK_SUPPORT_CAN_SET_ONBOARD_CLOCK 0x1 +#define CLOCK_SUPPORT_CAN_READ_ONBOARD_CLOCK 0x2 +#define CLOCK_SUPPORT_CAN_RETURN_STREAM_TIME 0x4 + +typedef struct _HW_STREAM_OBJECT +{ + ULONG SizeOfThisPacket; + ULONG StreamNumber; + PVOID HwStreamExtension; + PHW_RECEIVE_STREAM_DATA_SRB ReceiveDataPacket; + PHW_RECEIVE_STREAM_CONTROL_SRB ReceiveControlPacket; + HW_CLOCK_OBJECT HwClockObject; + BOOLEAN Dma; + BOOLEAN Pio; + PVOID HwDeviceExtension; + ULONG StreamHeaderMediaSpecific; + ULONG StreamHeaderWorkspace; + BOOLEAN Allocator; + PHW_EVENT_ROUTINE HwEventRoutine; + ULONG Reserved[2]; +} HW_STREAM_OBJECT, *PHW_STREAM_OBJECT; + +typedef struct _HW_STREAM_HEADER +{ + ULONG NumberOfStreams; + ULONG SizeOfHwStreamInformation; + ULONG NumDevPropArrayEntries; + PKSPROPERTY_SET DevicePropertiesArray; + ULONG NumDevEventArrayEntries; + PKSEVENT_SET DeviceEventsArray; + PKSTOPOLOGY Topology; + PHW_EVENT_ROUTINE DeviceEventRoutine; + LONG NumDevMethodArrayEntries; + PKSMETHOD_SET DeviceMethodsArray; +}HW_STREAM_HEADER, *PHW_STREAM_HEADER; + +typedef struct _HW_STREAM_INFORMATION +{ + ULONG NumberOfPossibleInstances; + KSPIN_DATAFLOW DataFlow; + BOOLEAN DataAccessible; + ULONG NumberOfFormatArrayEntries; + PKSDATAFORMAT* StreamFormatsArray; + PVOID ClassReserved[4]; + ULONG NumStreamPropArrayEntries; + PKSPROPERTY_SET StreamPropertiesArray; + ULONG NumStreamEventArrayEntries; + PKSEVENT_SET StreamEventsArray; + GUID* Category; + GUID* Name; + ULONG MediumsCount; + const KSPIN_MEDIUM* Mediums; + BOOLEAN BridgeStream; + ULONG Reserved[2]; +}HW_STREAM_INFORMATION, *PHW_STREAM_INFORMATION; + + +typedef struct _HW_STREAM_DESCRIPTOR +{ + HW_STREAM_HEADER StreamHeader; + HW_STREAM_INFORMATION StreamInfo; +} HW_STREAM_DESCRIPTOR, *PHW_STREAM_DESCRIPTOR; + +typedef struct _STREAM_TIME_REFERENCE +{ + STREAM_TIMESTAMP CurrentOnboardClockValue; + LARGE_INTEGER OnboardClockFrequency; + LARGE_INTEGER CurrentSystemTime; + ULONG Reserved[2]; +}STREAM_TIME_REFERENCE, *PSTREAM_TIME_REFERENCE; + +typedef struct _STREAM_DATA_INTERSECT_INFO +{ + ULONG StreamNumber; + PKSDATARANGE DataRange; + PVOID DataFormatBuffer; + ULONG SizeOfDataFormatBuffer; + +}STREAM_DATA_INTERSECT_INFO, *PSTREAM_DATA_INTERSECT_INFO; + +typedef struct _STREAM_PROPERTY_DESCRIPTOR +{ + PKSPROPERTY Property; + ULONG PropertySetID; + PVOID PropertyInfo; + ULONG PropertyInputSize; + ULONG PropertyOutputSize; +}STREAM_PROPERTY_DESCRIPTOR, *PSTREAM_PROPERTY_DESCRIPTOR; + +typedef struct _STREAM_METHOD_DESCRIPTOR +{ + ULONG MethodSetID; + PKSMETHOD Method; + PVOID MethodInfo; + LONG MethodInputSize; + LONG MethodOutputSize; +} STREAM_METHOD_DESCRIPTOR, *PSTREAM_METHOD_DESCRIPTOR; + +#define STREAM_REQUEST_BLOCK_SIZE sizeof(STREAM_REQUEST_BLOCK) + +typedef enum _SRB_COMMAND +{ + SRB_READ_DATA, + SRB_WRITE_DATA, + SRB_GET_STREAM_STATE, + SRB_SET_STREAM_STATE, + SRB_SET_STREAM_PROPERTY, + SRB_GET_STREAM_PROPERTY, + SRB_OPEN_MASTER_CLOCK, + + SRB_INDICATE_MASTER_CLOCK, + SRB_UNKNOWN_STREAM_COMMAND, + SRB_SET_STREAM_RATE, + SRB_PROPOSE_DATA_FORMAT, + SRB_CLOSE_MASTER_CLOCK, + SRB_PROPOSE_STREAM_RATE, + SRB_SET_DATA_FORMAT, + SRB_GET_DATA_FORMAT, + SRB_BEGIN_FLUSH, + SRB_END_FLUSH, + + SRB_GET_STREAM_INFO = 0x100, + SRB_OPEN_STREAM, + SRB_CLOSE_STREAM, + SRB_OPEN_DEVICE_INSTANCE, + SRB_CLOSE_DEVICE_INSTANCE, + SRB_GET_DEVICE_PROPERTY, + SRB_SET_DEVICE_PROPERTY, + SRB_INITIALIZE_DEVICE, + SRB_CHANGE_POWER_STATE, + SRB_UNINITIALIZE_DEVICE, + SRB_UNKNOWN_DEVICE_COMMAND, + SRB_PAGING_OUT_DRIVER, + SRB_GET_DATA_INTERSECTION, + SRB_INITIALIZATION_COMPLETE, + SRB_SURPRISE_REMOVAL + +#if (NTDDI_VERSION >= NTDDI_WINXP) + + ,SRB_DEVICE_METHOD + ,SRB_STREAM_METHOD + +#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1) + + ,SRB_NOTIFY_IDLE_STATE + +#endif + +#endif + +}SRB_COMMAND; + +typedef struct +{ + PHYSICAL_ADDRESS PhysicalAddress; + ULONG Length; +} KSSCATTER_GATHER, *PKSSCATTER_GATHER; + + +typedef struct _HW_STREAM_REQUEST_BLOCK +{ + ULONG SizeOfThisPacket; + SRB_COMMAND Command; + NTSTATUS Status; + PHW_STREAM_OBJECT StreamObject; + PVOID HwDeviceExtension; + PVOID SRBExtension; + + union _CommandData + { + PKSSTREAM_HEADER DataBufferArray; + PHW_STREAM_DESCRIPTOR StreamBuffer; + KSSTATE StreamState; + PSTREAM_TIME_REFERENCE TimeReference; + PSTREAM_PROPERTY_DESCRIPTOR PropertyInfo; + PKSDATAFORMAT OpenFormat; + struct _PORT_CONFIGURATION_INFORMATION *ConfigInfo; + HANDLE MasterClockHandle; + DEVICE_POWER_STATE DeviceState; + PSTREAM_DATA_INTERSECT_INFO IntersectInfo; + +#if (NTDDI_VERSION >= NTDDI_WINXP) + PVOID MethodInfo; + LONG FilterTypeIndex; +#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1) + BOOLEAN Idle; +#endif +#endif + + }CommandData; + + ULONG NumberOfBuffers; + ULONG TimeoutCounter; + ULONG TimeoutOriginal; + struct _HW_STREAM_REQUEST_BLOCK *NextSRB; + + PIRP Irp; + ULONG Flags; + PVOID HwInstanceExtension; + + union + { + ULONG NumberOfBytesToTransfer; + ULONG ActualBytesTransferred; + }; + + PKSSCATTER_GATHER ScatterGatherBuffer; + ULONG NumberOfPhysicalPages; + ULONG NumberOfScatterGatherElements; + ULONG Reserved[1]; + +}HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK; + +#define SRB_HW_FLAGS_DATA_TRANSFER 0x01 +#define SRB_HW_FLAGS_STREAM_REQUEST 0x2 + +typedef enum +{ + PerRequestExtension, + DmaBuffer, + SRBDataBuffer +}STREAM_BUFFER_TYPE; + +typedef struct _ACCESS_RANGE +{ + STREAM_PHYSICAL_ADDRESS RangeStart; + ULONG RangeLength; + BOOLEAN RangeInMemory; + ULONG Reserved; +}ACCESS_RANGE, *PACCESS_RANGE; + +typedef struct _PORT_CONFIGURATION_INFORMATION +{ + ULONG SizeOfThisPacket; + PVOID HwDeviceExtension; + PDEVICE_OBJECT ClassDeviceObject; + PDEVICE_OBJECT PhysicalDeviceObject; + ULONG SystemIoBusNumber; + INTERFACE_TYPE AdapterInterfaceType; + ULONG BusInterruptLevel; + ULONG BusInterruptVector; + KINTERRUPT_MODE InterruptMode; + ULONG DmaChannel; + ULONG NumberOfAccessRanges; + PACCESS_RANGE AccessRanges; + ULONG StreamDescriptorSize; + PIRP Irp; + PKINTERRUPT InterruptObject; + PADAPTER_OBJECT DmaAdapterObject; + PDEVICE_OBJECT RealPhysicalDeviceObject; + ULONG Reserved[1]; +}PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION; + +typedef VOID (STREAMAPI * PHW_RECEIVE_DEVICE_SRB) (IN PHW_STREAM_REQUEST_BLOCK SRB); +typedef VOID (STREAMAPI * PHW_CANCEL_SRB) (IN PHW_STREAM_REQUEST_BLOCK SRB); +typedef VOID (STREAMAPI * PHW_REQUEST_TIMEOUT_HANDLER) (IN PHW_STREAM_REQUEST_BLOCK SRB); +typedef BOOLEAN (STREAMAPI * PHW_INTERRUPT) (IN PVOID DeviceExtension); +typedef VOID (STREAMAPI * PHW_TIMER_ROUTINE) (IN PVOID Context); +typedef VOID (STREAMAPI * PHW_PRIORITY_ROUTINE) (IN PVOID Context); +typedef VOID (STREAMAPI * PHW_QUERY_CLOCK_ROUTINE) (IN PHW_TIME_CONTEXT TimeContext); +typedef BOOLEAN (STREAMAPI * PHW_RESET_ADAPTER) (IN PVOID DeviceExtension); + +typedef enum _STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE +{ + ReadyForNextStreamDataRequest, + ReadyForNextStreamControlRequest, + HardwareStarved, + StreamRequestComplete, + SignalMultipleStreamEvents, + SignalStreamEvent, + DeleteStreamEvent, + StreamNotificationMaximum +}STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE, *PSTREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE; + +typedef enum _STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE +{ + ReadyForNextDeviceRequest, + DeviceRequestComplete, + SignalMultipleDeviceEvents, + SignalDeviceEvent, + DeleteDeviceEvent, +#if (NTDDI_VERSION >= NTDDI_WINXP) + SignalMultipleDeviceInstanceEvents, +#endif + DeviceNotificationMaximum +} STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE, *PSTREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE; + +#define STREAM_CLASS_VERSION_20 0x0200 + +typedef struct _HW_INITIALIZATION_DATA { +#if (NTDDI_VERSION >= NTDDI_WINXP) + union + { + ULONG HwInitializationDataSize; + struct + { + USHORT SizeOfThisPacket; + USHORT StreamClassVersion; + }; + }; +#else + ULONG HwInitializationDataSize; +#endif + + PHW_INTERRUPT HwInterrupt; + PHW_RECEIVE_DEVICE_SRB HwReceivePacket; + PHW_CANCEL_SRB HwCancelPacket; + PHW_REQUEST_TIMEOUT_HANDLER HwRequestTimeoutHandler; + ULONG DeviceExtensionSize; + ULONG PerRequestExtensionSize; + ULONG PerStreamExtensionSize; + ULONG FilterInstanceExtensionSize; + BOOLEAN BusMasterDMA; + BOOLEAN Dma24BitAddresses; + ULONG BufferAlignment; + BOOLEAN TurnOffSynchronization; + ULONG DmaBufferSize; + +#if (NTDDI_VERSION >= NTDDI_WINXP) + ULONG NumNameExtensions; + PWCHAR *NameExtensionArray; +#else + ULONG Reserved[2]; +#endif +} HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA; + +typedef enum _STREAM_PRIORITY +{ + High, + Dispatch, + Low, + LowToHigh +}STREAM_PRIORITY, *PSTREAM_PRIORITY; + + +VOID +StreamClassAbortOutstandingRequests( + IN PVOID HwDeviceExtension, + IN PHW_STREAM_OBJECT HwStreamObject, + IN NTSTATUS Status +); + +VOID +STREAMAPI +StreamClassCallAtNewPriority( + IN PHW_STREAM_OBJECT StreamObject, + IN PVOID HwDeviceExtension, + IN STREAM_PRIORITY Priority, + IN PHW_PRIORITY_ROUTINE PriorityRoutine, + IN PVOID Context + ); + +VOID +STREAMAPI +StreamClassCompleteRequestAndMarkQueueReady( + IN PHW_STREAM_REQUEST_BLOCK Srb +); + +VOID +STREAMAPI +StreamClassDebugAssert( + IN PCHAR File, + IN ULONG Line, + IN PCHAR AssertText, + IN ULONG AssertValue +); + +VOID +__cdecl +StreamClassDebugPrint( + IN STREAM_DEBUG_LEVEL DebugPrintLevel, + IN PCCHAR DebugMessage, + ... +); + +VOID +__cdecl +StreamClassDeviceNotification( + IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType, + IN PVOID HwDeviceExtension, + ... +); + +VOID +STREAMAPI +StreamClassFilterReenumerateStreams( + IN PVOID HwInstanceExtension, + IN ULONG StreamDescriptorSize +); + +PVOID +STREAMAPI +StreamClassGetDmaBuffer( + IN PVOID HwDeviceExtension +); + + +PKSEVENT_ENTRY +StreamClassGetNextEvent( + IN PVOID HwInstanceExtension_OR_HwDeviceExtension, + IN PHW_STREAM_OBJECT HwStreamObject, + IN GUID * EventGuid, + IN ULONG EventItem, + IN PKSEVENT_ENTRY CurrentEvent +); + +STREAM_PHYSICAL_ADDRESS +STREAMAPI +StreamClassGetPhysicalAddress( + IN PVOID HwDeviceExtension, + IN PHW_STREAM_REQUEST_BLOCK HwSRB, + IN PVOID VirtualAddress, + IN STREAM_BUFFER_TYPE Type, + IN ULONG * Length +); + +VOID +StreamClassQueryMasterClock( + IN PHW_STREAM_OBJECT HwStreamObject, + IN HANDLE MasterClockHandle, + IN TIME_FUNCTION TimeFunction, + IN PHW_QUERY_CLOCK_ROUTINE ClockCallbackRoutine +); + +VOID +STREAMAPI +StreamClassQueryMasterClockSync( + IN HANDLE MasterClockHandle, + IN PHW_TIME_CONTEXT TimeContext +); + +BOOLEAN +STREAMAPI +StreamClassReadWriteConfig( + IN PVOID HwDeviceExtension, + IN BOOLEAN Read, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length +); + +VOID +STREAMAPI +StreamClassReenumerateStreams( + IN PVOID HwDeviceExtension, + IN ULONG StreamDescriptorSize +); + +NTSTATUS +STREAMAPI +StreamClassRegisterAdapter( + IN PVOID Argument1, + IN PVOID Argument2, + IN PHW_INITIALIZATION_DATA HwInitializationData +); + +#define StreamClassRegisterMinidriver StreamClassRegisterAdapter + +NTSTATUS +StreamClassRegisterFilterWithNoKSPins( + IN PDEVICE_OBJECT DeviceObject, + IN const GUID * InterfaceClassGUID, + IN ULONG PinCount, + IN BOOL * PinDirection, + IN KSPIN_MEDIUM * MediumList, + IN GUID * CategoryList +); + +VOID +STREAMAPI +StreamClassScheduleTimer( + IN PHW_STREAM_OBJECT StreamObject, + IN PVOID HwDeviceExtension, + IN ULONG NumberOfMicroseconds, + IN PHW_TIMER_ROUTINE TimerRoutine, + IN PVOID Context +); + +VOID +__cdecl +StreamClassStreamNotification( + IN STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType, + IN PHW_STREAM_OBJECT StreamObject, + IN ... +); + +#endif \ No newline at end of file From a0803f70c29f8b37831ee85021f919683f19c10a Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 26 Jun 2009 16:30:44 +0000 Subject: [PATCH 108/577] - Add STREAM_DEBUG_LEVEL svn path=/trunk/; revision=41625 --- reactos/include/ddk/strmini.h | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/reactos/include/ddk/strmini.h b/reactos/include/ddk/strmini.h index 85248a558fe..34ca8e57667 100644 --- a/reactos/include/ddk/strmini.h +++ b/reactos/include/ddk/strmini.h @@ -1,14 +1,24 @@ #ifndef _STREAM_H #define _STREAM_H -#include -#include -#include +#include #include #define STREAMAPI __stdcall #define STREAM_SYSTEM_TIME_MASK ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF) +typedef enum +{ + DebugLevelFatal = 0, + DebugLevelError, + DebugLevelWarning, + DebugLevelInfo, + DebugLevelTrace, + DebugLevelVerbose, + DebugLevelMaximum +}STREAM_DEBUG_LEVEL; + + #if DBG #define DebugPrint(x) StreamClassDebugPrint x @@ -24,7 +34,7 @@ #define DEBUG_ASSERT(exp) #endif - + typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS, *PSTREAM_PHYSICAL_ADDRESS; typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME; typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP; @@ -51,7 +61,7 @@ typedef struct _HW_EVENT_DESCRIPTOR PKSEVENT_ENTRY EventEntry; PKSEVENTDATA EventData; union - { + { struct _HW_STREAM_OBJECT * StreamObject; struct _HW_DEVICE_EXTENSION *DeviceExtension; }; @@ -60,6 +70,7 @@ typedef struct _HW_EVENT_DESCRIPTOR ULONG Reserved; } HW_EVENT_DESCRIPTOR, *PHW_EVENT_DESCRIPTOR; +struct _HW_STREAM_REQUEST_BLOCK; typedef VOID (STREAMAPI * PHW_RECEIVE_STREAM_DATA_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK * SRB); typedef VOID (STREAMAPI * PHW_RECEIVE_STREAM_CONTROL_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK * SRB); @@ -531,12 +542,12 @@ StreamClassRegisterAdapter( #define StreamClassRegisterMinidriver StreamClassRegisterAdapter -NTSTATUS +NTSTATUS StreamClassRegisterFilterWithNoKSPins( IN PDEVICE_OBJECT DeviceObject, IN const GUID * InterfaceClassGUID, IN ULONG PinCount, - IN BOOL * PinDirection, + IN BOOLEAN * PinDirection, IN KSPIN_MEDIUM * MediumList, IN GUID * CategoryList ); @@ -559,4 +570,4 @@ StreamClassStreamNotification( IN ... ); -#endif \ No newline at end of file +#endif From a39c949acfe4ea4acdfb5695a3fe905ab8987bd6 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 02:56:58 +0000 Subject: [PATCH 109/577] - Implement MiReleaseSystemPtes which is the function to deallocate System PTE allocations. - We do some minor optimizations to combine chunks if possible after a free, similar to MD Block algorithms in freeldr.c. svn path=/trunk/; revision=41626 --- reactos/ntoskrnl/mm/ARM3/syspte.c | 164 ++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/reactos/ntoskrnl/mm/ARM3/syspte.c b/reactos/ntoskrnl/mm/ARM3/syspte.c index f3c41f56a33..f6e31751f72 100644 --- a/reactos/ntoskrnl/mm/ARM3/syspte.c +++ b/reactos/ntoskrnl/mm/ARM3/syspte.c @@ -158,6 +158,170 @@ MiReserveSystemPtes(IN ULONG NumberOfPtes, return PointerPte; } +VOID +NTAPI +MiReleaseSystemPtes(IN PMMPTE StartingPte, + IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType) +{ + ULONG_PTR ClusterSize, CurrentSize; + PMMPTE CurrentPte, NextPte, PointerPte; + + // + // Check to make sure the PTE address is within bounds. + // + ASSERT(NumberOfPtes != 0); + ASSERT(StartingPte >= MmSystemPtesStart[SystemPtePoolType]); + ASSERT(StartingPte <= MmSystemPtesEnd[SystemPtePoolType]); + + // + // Zero PTEs. + // + RtlZeroMemory(StartingPte, NumberOfPtes * sizeof (MMPTE)); + + // + // Increase availability + // + MmTotalFreeSystemPtes[SystemPtePoolType] += NumberOfPtes; + + // + // Get the free cluster and start going through them + // + CurrentSize = (ULONG_PTR)(StartingPte - MmSystemPteBase); + CurrentPte = &MmFirstFreeSystemPte[SystemPtePoolType]; + while (TRUE) + { + // + // Get the first real cluster of PTEs and check if it's ours + // + PointerPte = MmSystemPteBase + CurrentPte->u.List.NextEntry; + if (CurrentSize < CurrentPte->u.List.NextEntry) + { + // + // Sanity check + // + ASSERT(((StartingPte + NumberOfPtes) <= PointerPte) || + (CurrentPte->u.List.NextEntry == -1)); + + // + // Get the next cluster in case it's the one + // + NextPte = CurrentPte + 1; + + // + // Check if this was actually a single-PTE entry + // + if (CurrentPte->u.List.OneEntry) + { + // + // We only have one page + // + ClusterSize = 1; + } + else + { + // + // The next cluster will have the page count + // + ClusterSize = (ULONG_PTR)NextPte->u.List.NextEntry; + } + + // + // So check if this cluster actually describes the entire mapping + // + if ((CurrentPte + ClusterSize) == StartingPte) + { + // + // It does -- collapse the free PTEs into the next cluster + // + NumberOfPtes += ClusterSize; + NextPte->u.List.NextEntry = NumberOfPtes; + CurrentPte->u.List.OneEntry = 0; + + // + // Make another pass + // + StartingPte = CurrentPte; + } + else + { + // + // There's still PTEs left -- make us into a cluster + // + StartingPte->u.List.NextEntry = CurrentPte->u.List.NextEntry; + CurrentPte->u.List.NextEntry = CurrentSize; + + // + // Is there just one page left? + // + if (NumberOfPtes == 1) + { + // + // Then this actually becomes a single PTE entry + // + StartingPte->u.List.OneEntry = 1; + } + else + { + // + // Otherwise, create a new cluster for the remaining pages + // + StartingPte->u.List.OneEntry = 0; + NextPte = StartingPte + 1; + NextPte->u.List.NextEntry = NumberOfPtes; + } + } + + // + // Now check if we've arrived at yet another cluster + // + if ((StartingPte + NumberOfPtes) == PointerPte) + { + // + // We'll collapse the next cluster into us + // + StartingPte->u.List.NextEntry = PointerPte->u.List.NextEntry; + StartingPte->u.List.OneEntry = 0; + NextPte = StartingPte + 1; + + // + // Check if the cluster only had one page + // + if (PointerPte->u.List.OneEntry) + { + // + // So will we... + // + ClusterSize = 1; + } + else + { + // + // Otherwise, grab the page count from the next-next cluster + // + PointerPte++; + ClusterSize = (ULONG_PTR)PointerPte->u.List.NextEntry; + } + + // + // And create the final combined cluster + // + NextPte->u.List.NextEntry = NumberOfPtes + ClusterSize; + } + + // + // We released the PTEs into their cluster (and optimized the list) + // + break; + } + + // + // Try the next cluster of PTEs... + // + CurrentPte = PointerPte; + } +} + VOID NTAPI MiInitializeSystemPtes(IN PMMPTE StartingPte, From 6e8a0cf66265b62e2249d45cd8794e946dd8932a Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 03:00:35 +0000 Subject: [PATCH 110/577] - ARM3-ify hypermap.c svn path=/trunk/; revision=41627 --- reactos/ntoskrnl/mm/ARM3/hypermap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/hypermap.c b/reactos/ntoskrnl/mm/ARM3/hypermap.c index cb59ddec543..a1280f99086 100644 --- a/reactos/ntoskrnl/mm/ARM3/hypermap.c +++ b/reactos/ntoskrnl/mm/ARM3/hypermap.c @@ -2,7 +2,7 @@ * PROJECT: ReactOS Kernel * LICENSE: BSD - See COPYING.ARM in the top level directory * FILE: ntoskrnl/mm/ARM3/hypermap.c - * PURPOSE: Hyperspace Mapping Functionality + * PURPOSE: ARM Memory Manager Hyperspace Mapping Functionality * PROGRAMMERS: ReactOS Portable Systems Group */ @@ -12,6 +12,10 @@ #define NDEBUG #include +#line 15 "ARM³::HYPERMAP" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + /* GLOBALS ********************************************************************/ PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte; From 128aefcd633e49061375304bbeec2a72d64dc868 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 03:03:24 +0000 Subject: [PATCH 111/577] - Rewrite MmMapIoSpace and MmUnmapIoSpace to use System PTEs instead. - Much faster and cleaner (will be even faster when System PTE allocation is optimized). - Better handling of esoteric caching options, especially relevant for ARM. - Handled through the MiPlatformCacheAttributes, which should be defined differently for each platform (TODO). - Handles both I/O (device) and RAM physical memory. - Correct flushing of CPU caches (not a big deal on x86, but matters on ARM). svn path=/trunk/; revision=41628 --- reactos/ntoskrnl/mm/ARM3/iosup.c | 257 +++++++++++++++++++++++ reactos/ntoskrnl/mm/ARM3/miarm.h | 16 ++ reactos/ntoskrnl/mm/iospace.c | 184 ---------------- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 2 +- 4 files changed, 274 insertions(+), 185 deletions(-) create mode 100644 reactos/ntoskrnl/mm/ARM3/iosup.c delete mode 100644 reactos/ntoskrnl/mm/iospace.c diff --git a/reactos/ntoskrnl/mm/ARM3/iosup.c b/reactos/ntoskrnl/mm/ARM3/iosup.c new file mode 100644 index 00000000000..93d2e66a8c4 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/iosup.c @@ -0,0 +1,257 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/iosup.c + * PURPOSE: ARM Memory Manager I/O Mapping Functionality + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::IOSUP" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +// +// Each architecture has its own caching attributes for both I/O and Physical +// memory mappings. +// +// This describes the attributes for the x86 architecture. It eventually needs +// to go in the appropriate i386 directory. +// +MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType] = +{ + // + // RAM + // + {MiNonCached,MiCached,MiWriteCombined,MiCached,MiNonCached,MiWriteCombined}, + + // + // Device Memory + // + {MiNonCached,MiCached,MiWriteCombined,MiCached,MiNonCached,MiWriteCombined}, +}; + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +PVOID +NTAPI +MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType) +{ + + PFN_TYPE Pfn, PageCount; + PMMPTE PointerPte; + PVOID BaseAddress; + MMPTE TempPte; + PMMPFN Pfn1 = NULL; + MI_PFN_CACHE_ATTRIBUTE CacheAttribute; + BOOLEAN IsIoMapping; + + // + // Normalize and validate the caching attributes + // + CacheType &= 0xFF; + if (CacheType >= MmMaximumCacheType) return NULL; + + // + // Calculate page count + // + PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(PhysicalAddress.LowPart, + NumberOfBytes); + + // + // Compute the PFN and check if it's a known I/O mapping + // Also translate the cache attribute + // + Pfn = (PFN_NUMBER)(PhysicalAddress.QuadPart >> PAGE_SHIFT); + IsIoMapping = (Pfn > MmHighestPhysicalPage) ? TRUE : FALSE; + if (!IsIoMapping) Pfn1 = MiGetPfnEntry(Pfn); + CacheAttribute = MiPlatformCacheAttributes[IsIoMapping][CacheType]; + + // + // Now allocate system PTEs for the mapping, and get the VA + // + PointerPte = MiReserveSystemPtes(PageCount, SystemPteSpace); + if (!PointerPte) return NULL; + BaseAddress = MiPteToAddress(PointerPte); + + // + // Check if this is uncached + // + if (CacheAttribute != MiCached) + { + // + // Flush all caches + // + KeFlushEntireTb(TRUE, TRUE); + KeInvalidateAllCaches(); + } + + // + // Now compute the VA offset + // + BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + + BYTE_OFFSET(PhysicalAddress.LowPart)); + + // + // Get the template and configure caching + // + TempPte = HyperTemplatePte; + switch (CacheAttribute) + { + case MiNonCached: + + // + // Disable the cache + // + TempPte.u.Hard.CacheDisable = 1; + TempPte.u.Hard.WriteThrough = 1; + break; + + case MiCached: + + // + // Leave defaults + // + break; + + case MiWriteCombined: + + // + // We don't support write combining yet + // + ASSERT(FALSE); + break; + + default: + + // + // Should never happen + // + ASSERT(FALSE); + break; + } + + // + // Sanity check and re-flush + // + Pfn = (PFN_NUMBER)(PhysicalAddress.QuadPart >> PAGE_SHIFT); + ASSERT((Pfn1 == MiGetPfnEntry(Pfn)) || (Pfn1 == NULL)); + KeFlushEntireTb(TRUE, TRUE); + KeInvalidateAllCaches(); + + // + // Do the mapping + // + do + { + // + // Start out with nothing + // + ASSERT(PointerPte->u.Hard.Valid == 0); + + // + // Write the PFN + // + TempPte.u.Hard.PageFrameNumber = Pfn++; + *PointerPte++ = TempPte; + } while (--PageCount); + + // + // We're done! + // + return BaseAddress; +} + +/* + * @implemented + */ +VOID +NTAPI +MmUnmapIoSpace(IN PVOID BaseAddress, + IN ULONG NumberOfBytes) +{ + PFN_NUMBER PageCount, Pfn; + PMMPTE PointerPte; + + // + // Sanity check + // + ASSERT(NumberOfBytes != 0); + + // + // Get the page count + // + PageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(BaseAddress, NumberOfBytes); + + // + // Get the PTE and PFN + // + PointerPte = MiAddressToPte(BaseAddress); + Pfn = PFN_FROM_PTE(PointerPte); + + // + // Is this an I/O mapping? + // + if (Pfn > MmHighestPhysicalPage) + { + // + // Destroy the PTE + // + RtlZeroMemory(PointerPte, PageCount * sizeof(MMPTE)); + + // + // Blow the TLB + // + KeFlushEntireTb(TRUE, TRUE); + } + + // + // Release the PTEs + // + MiReleaseSystemPtes(PointerPte, PageCount, 0); +} + +/* + * @implemented + */ +PVOID +NTAPI +MmMapVideoDisplay(IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType) +{ + PAGED_CODE(); + + // + // Call the real function + // + return MmMapIoSpace(PhysicalAddress, NumberOfBytes, CacheType); +} + +/* + * @implemented + */ +VOID +NTAPI +MmUnmapVideoDisplay(IN PVOID BaseAddress, + IN ULONG NumberOfBytes) +{ + // + // Call the real function + // + MmUnmapIoSpace(BaseAddress, NumberOfBytes); +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 0441f041760..9d490471701 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -20,6 +20,14 @@ typedef enum _MMSYSTEM_PTE_POOL_TYPE MaximumPtePoolTypes } MMSYSTEM_PTE_POOL_TYPE; +typedef enum _MI_PFN_CACHE_ATTRIBUTE +{ + MiNonCached, + MiCached, + MiWriteCombined, + MiNotMapped +} MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE; + extern MMPTE HyperTemplatePte; extern ULONG MmSizeOfNonPagedPoolInBytes; @@ -50,4 +58,12 @@ MiReserveSystemPtes( IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType ); +VOID +NTAPI +MiReleaseSystemPtes( + IN PMMPTE StartingPte, + IN ULONG NumberOfPtes, + IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/iospace.c b/reactos/ntoskrnl/mm/iospace.c deleted file mode 100644 index 7bcf5ae235f..00000000000 --- a/reactos/ntoskrnl/mm/iospace.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/iospace.c - * PURPOSE: Mapping I/O space - * - * PROGRAMMERS: David Welch (welch@mcmail.com) - */ - -/* INCLUDES *****************************************************************/ - -#include -#define NDEBUG -#include - -/* FUNCTIONS *****************************************************************/ - -/********************************************************************** - * NAME EXPORTED - * MmMapIoSpace@16 - * - * DESCRIPTION - * Maps a physical memory range into system space. - * - * ARGUMENTS - * PhysicalAddress - * First physical address to map; - * - * NumberOfBytes - * Number of bytes to map; - * - * CacheEnable - * Type of memory caching. - * - * RETURN VALUE - * The base virtual address which maps the region. - * - * NOTE - * Description moved here from include/ddk/mmfuncs.h. - * Code taken from ntoskrnl/mm/special.c. - * - * REVISIONS - * - * @implemented - */ -PVOID NTAPI -MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheEnable) -{ - PVOID Result; - ULONG Offset; - MEMORY_AREA* marea; - NTSTATUS Status; - ULONG i; - ULONG Protect; - PHYSICAL_ADDRESS BoundaryAddressMultiple; - PFN_TYPE Pfn; - - DPRINT("MmMapIoSpace(%lx, %d, %d)\n", PhysicalAddress, NumberOfBytes, CacheEnable); - - if (CacheEnable != MmNonCached && - CacheEnable != MmCached && - CacheEnable != MmWriteCombined) - { - return NULL; - } - - BoundaryAddressMultiple.QuadPart = 0; - Result = NULL; - Offset = PhysicalAddress.u.LowPart % PAGE_SIZE; - NumberOfBytes += Offset; - PhysicalAddress.QuadPart -= Offset; - Protect = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM; - if (CacheEnable != MmCached) - { - Protect |= (PAGE_NOCACHE | PAGE_WRITETHROUGH); - } - - MmLockAddressSpace(MmGetKernelAddressSpace()); - Status = MmCreateMemoryArea (MmGetKernelAddressSpace(), - MEMORY_AREA_IO_MAPPING, - &Result, - NumberOfBytes, - Protect, - &marea, - 0, - FALSE, - BoundaryAddressMultiple); - MmUnlockAddressSpace(MmGetKernelAddressSpace()); - - if (!NT_SUCCESS(Status)) - { - DPRINT("MmMapIoSpace failed (%lx)\n", Status); - return (NULL); - } - Pfn = PhysicalAddress.LowPart >> PAGE_SHIFT; - for (i = 0; i < PAGE_ROUND_UP(NumberOfBytes); i += PAGE_SIZE, Pfn++) - { - Status = MmCreateVirtualMappingForKernel((char*)Result + i, - Protect, - &Pfn, - 1); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - } - return (PVOID)((ULONG_PTR)Result + Offset); -} - - -/********************************************************************** - * NAME EXPORTED - * MmUnmapIoSpace@8 - * - * DESCRIPTION - * Unmaps a physical memory range from system space. - * - * ARGUMENTS - * BaseAddress - * The base virtual address which maps the region; - * - * NumberOfBytes - * Number of bytes to unmap. - * - * RETURN VALUE - * None. - * - * NOTE - * Code taken from ntoskrnl/mm/special.c. - * - * REVISIONS - * - * @implemented - */ -VOID NTAPI -MmUnmapIoSpace (IN PVOID BaseAddress, - IN ULONG NumberOfBytes) -{ - LONG Offset; - PVOID Address = BaseAddress; - - Offset = (ULONG_PTR)Address % PAGE_SIZE; - Address = RVA(Address, - Offset); - NumberOfBytes += Offset; - - MmLockAddressSpace(MmGetKernelAddressSpace()); - MmFreeMemoryAreaByPtr(MmGetKernelAddressSpace(), - Address, - NULL, - NULL); - MmUnlockAddressSpace(MmGetKernelAddressSpace()); -} - - -/********************************************************************** - * NAME EXPORTED - * MmMapVideoDisplay@16 - * - * @implemented - */ -PVOID NTAPI -MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType) -{ - return MmMapIoSpace (PhysicalAddress, NumberOfBytes, (BOOLEAN)CacheType); -} - - -/* - * @implemented - */ -VOID NTAPI -MmUnmapVideoDisplay (IN PVOID BaseAddress, - IN ULONG NumberOfBytes) -{ - MmUnmapIoSpace (BaseAddress, NumberOfBytes); -} - - -/* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 6320bf03ddf..2e301fed4d0 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -362,6 +362,7 @@ hypermap.c init.c + iosup.c pool.c syspte.c @@ -371,7 +372,6 @@ dbgpool.c drvlck.c freelist.c - iospace.c kmap.c marea.c mdlsup.c From 97d8658da9939d6f75d345c6921331764ebd6873 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Jun 2009 03:14:06 +0000 Subject: [PATCH 112/577] - Acquire the cancel spin lock before calling IoSetCancelRoutine - Remove some extra junk svn path=/trunk/; revision=41629 --- reactos/drivers/network/tcpip/tcpip/irp.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/reactos/drivers/network/tcpip/tcpip/irp.c b/reactos/drivers/network/tcpip/tcpip/irp.c index 104818f6aec..f2fc589d19b 100644 --- a/reactos/drivers/network/tcpip/tcpip/irp.c +++ b/reactos/drivers/network/tcpip/tcpip/irp.c @@ -16,10 +16,7 @@ VOID IRPRemember( PIRP Irp, PCHAR File, UINT Line ) { } NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) { - KIRQL Irql; - PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); - - //DbgPrint("Called: Irp %x, Status %x Event %x\n", Irp, Status, Irp->UserEvent); + KIRQL OldIrql; UntrackFL( __FILE__, __LINE__, Irp, IRP_TAG ); @@ -28,15 +25,11 @@ NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) { if( Status == STATUS_PENDING ) IoMarkIrpPending( Irp ); else { - Irql = KeGetCurrentIrql(); - + IoAcquireCancelSpinLock(&OldIrql); (void)IoSetCancelRoutine( Irp, NULL ); + IoReleaseCancelSpinLock(OldIrql); + IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); - if (KeGetCurrentIrql() != Irql) { - DbgPrint("WARNING: IO COMPLETION RETURNED AT WRONG IRQL:\n"); - DbgPrint("WARNING: IRP TYPE WAS %d\n", IrpSp->MajorFunction); - } - ASSERT(KeGetCurrentIrql() == Irql); } return Status; From dabb3e9f9808ae2a4b08b357328cce9f4138e9f6 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Jun 2009 03:23:10 +0000 Subject: [PATCH 113/577] - Don't leave the listen IRP in the queue when cancelling the listen request - Kill all the requests before closing the socket - Notify oskittcp when we are cancelling requests so it can properly close the socket svn path=/trunk/; revision=41630 --- .../drivers/network/tcpip/include/dispatch.h | 9 +++ .../drivers/network/tcpip/tcpip/dispatch.c | 10 +-- reactos/lib/drivers/ip/transport/tcp/tcp.c | 76 ++++++++++++++----- 3 files changed, 71 insertions(+), 24 deletions(-) diff --git a/reactos/drivers/network/tcpip/include/dispatch.h b/reactos/drivers/network/tcpip/include/dispatch.h index bd559517b11..b6aada9058a 100644 --- a/reactos/drivers/network/tcpip/include/dispatch.h +++ b/reactos/drivers/network/tcpip/include/dispatch.h @@ -7,6 +7,12 @@ #ifndef __DISPATCH_H #define __DISPATCH_H +typedef struct _DISCONNECT_TYPE { + UINT Type; + PVOID Context; + PIRP Irp; + PFILE_OBJECT FileObject; +} DISCONNECT_TYPE, *PDISCONNECT_TYPE; NTSTATUS DispTdiAccept( PIRP Irp); @@ -64,6 +70,9 @@ NTSTATUS DispTdiDeleteIPAddress( PIRP Irp, PIO_STACK_LOCATION IrpSp); +VOID DispDoDisconnect( + PVOID Data); + #endif /* __DISPATCH_H */ /* EOF */ diff --git a/reactos/drivers/network/tcpip/tcpip/dispatch.c b/reactos/drivers/network/tcpip/tcpip/dispatch.c index ba33f68f760..b40a3900c2d 100644 --- a/reactos/drivers/network/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/network/tcpip/tcpip/dispatch.c @@ -111,13 +111,6 @@ VOID DispDataRequestComplete( TI_DbgPrint(DEBUG_IRP, ("Done Completing IRP\n")); } -typedef struct _DISCONNECT_TYPE { - UINT Type; - PVOID Context; - PIRP Irp; - PFILE_OBJECT FileObject; -} DISCONNECT_TYPE, *PDISCONNECT_TYPE; - VOID DispDoDisconnect( PVOID Data ) { PDISCONNECT_TYPE DisType = (PDISCONNECT_TYPE)Data; @@ -250,6 +243,9 @@ VOID NTAPI DispCancelListenRequest( /* Try canceling the request */ Connection = (PCONNECTION_ENDPOINT)TranContext->Handle.ConnectionContext; + + TCPRemoveIRP(Connection, Irp); + TCPAbortListenForSocket( Connection->AddressFile->Listener, Connection ); diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index 0e943f06cdb..7e2e2e290b4 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -217,24 +217,66 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection, } if( NewState & SEL_FIN ) { - PLIST_ENTRY ListsToErase[4]; - UINT i; + TI_DbgPrint(DEBUG_TCP, ("EOF From socket\n")); - TI_DbgPrint(DEBUG_TCP, ("EOF From socket\n")); + while (!IsListEmpty(&Connection->ReceiveRequest)) + { + DISCONNECT_TYPE DisType; + PIO_STACK_LOCATION IrpSp; + Entry = RemoveHeadList(&Connection->ReceiveRequest); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; + IrpSp = IoGetCurrentIrpStackLocation((PIRP)Bucket->Request.RequestContext); - ListsToErase[0] = &Connection->ReceiveRequest; - ListsToErase[1] = &Connection->ListenRequest; - ListsToErase[2] = &Connection->ConnectRequest; - ListsToErase[3] = &Connection->SendRequest; + /* We have to notify oskittcp of the abortion */ + DisType.Type = TDI_DISCONNECT_RELEASE | TDI_DISCONNECT_ABORT; + DisType.Context = Connection; + DisType.Irp = (PIRP)Bucket->Request.RequestContext; + DisType.FileObject = IrpSp->FileObject; - for( i = 0; i < 4; i++ ) { - while( !IsListEmpty( ListsToErase[i] ) ) { - Entry = RemoveHeadList( ListsToErase[i] ); - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - Complete = Bucket->Request.RequestNotifyObject; - Complete( Bucket->Request.RequestContext, STATUS_CANCELLED, 0 ); - exFreePool( Bucket ); - } + ChewCreate(NULL, sizeof(DISCONNECT_TYPE), + DispDoDisconnect, &DisType); + } + + while (!IsListEmpty(&Connection->SendRequest)) + { + DISCONNECT_TYPE DisType; + PIO_STACK_LOCATION IrpSp; + Entry = RemoveHeadList(&Connection->SendRequest); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; + IrpSp = IoGetCurrentIrpStackLocation((PIRP)Bucket->Request.RequestContext); + + /* We have to notify oskittcp of the abortion */ + DisType.Type = TDI_DISCONNECT_RELEASE; + DisType.Context = Connection; + DisType.Irp = (PIRP)Bucket->Request.RequestContext; + DisType.FileObject = IrpSp->FileObject; + + ChewCreate(NULL, sizeof(DISCONNECT_TYPE), + DispDoDisconnect, &DisType); + } + + while (!IsListEmpty(&Connection->ListenRequest)) + { + Entry = RemoveHeadList(&Connection->ListenRequest); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; + + /* We have to notify oskittcp of the abortion */ + TCPAbortListenForSocket(Connection->AddressFile->Listener, + Connection); + + Complete( Bucket->Request.RequestContext, STATUS_CANCELLED, 0 ); + } + + while (!IsListEmpty(&Connection->ConnectRequest)) + { + Entry = RemoveHeadList(&Connection->ConnectRequest); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; + + Complete( Bucket->Request.RequestContext, STATUS_CANCELLED, 0 ); } } @@ -656,12 +698,12 @@ NTSTATUS TCPClose TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - Status = TCPTranslateError( OskitTCPClose( Connection->SocketContext ) ); - /* Make our code remove all pending IRPs */ Connection->State |= SEL_FIN; DrainSignals(); + Status = TCPTranslateError( OskitTCPClose( Connection->SocketContext ) ); + TcpipRecursiveMutexLeave( &TCPLock ); TI_DbgPrint(DEBUG_TCP,("TCPClose finished %x\n", Status)); From 689615967eadd764c469f6dbbd6e410a8df876ab Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 05:32:53 +0000 Subject: [PATCH 114/577] - Blow away the bottom 2GB of virtual address space in the ARM^3 initializer. Previously this was kind of done with MmUnmapPageTable in MmInit1, but this code (And the function, which had only been used for this purpose, are gone) - Also set the Page Directory for the system/idle process in a slightly more correct way, instead of depending on the CR3 value. Do this in ARM^3 now, and remove the older code (and the MmGetPageDirectory function, which was only used by this). svn path=/trunk/; revision=41631 --- reactos/ntoskrnl/mm/ARM3/init.c | 14 ++++++++++++++ reactos/ntoskrnl/mm/i386/page.c | 32 -------------------------------- reactos/ntoskrnl/mm/mminit.c | 6 ------ 3 files changed, 14 insertions(+), 38 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index 55d7db4dbff..b3f2ab82f6f 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -145,6 +145,20 @@ MmArmInitSystem(IN ULONG Phase, if (Phase == 0) { + // + // Set CR3 for the system process + // + PointerPte = MiAddressToPde(PAGETABLE_MAP); + PageFrameIndex = PFN_FROM_PTE(PointerPte) << PAGE_SHIFT; + PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameIndex; + + // + // Blow away user-mode + // + StartPde = MiAddressToPde(0); + EndPde = MiAddressToPde(KSEG0_BASE); + RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE)); + // // Check if this is a machine with less than 19MB of RAM // diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 51d10cf1117..ff76dd2965f 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -71,12 +71,6 @@ MiFlushTlb(PULONG Pt, PVOID Address) } } -PULONG -MmGetPageDirectory(VOID) -{ - return (PULONG)(ULONG_PTR)__readcr3(); -} - static ULONG ProtectToPTE(ULONG flProtect) { @@ -226,32 +220,6 @@ MmCreateProcessAddressSpace(IN ULONG MinWs, return TRUE; } -VOID -NTAPI -MmDeletePageTable(PEPROCESS Process, PVOID Address) -{ - PEPROCESS CurrentProcess = PsGetCurrentProcess(); - - if (Process != NULL && Process != CurrentProcess) - { - KeAttachProcess(&Process->Pcb); - } - - MiAddressToPde(Address)->u.Long = 0; - MiFlushTlb((PULONG)MiAddressToPde(Address), - MiAddressToPte(Address)); - - if (Address >= MmSystemRangeStart) - { - KeBugCheck(MEMORY_MANAGEMENT); - // MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0; - } - if (Process != NULL && Process != CurrentProcess) - { - KeDetachProcess(); - } -} - static PULONG MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) { diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 54271f65754..84806ef8d7e 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -305,9 +305,6 @@ MmInit1(VOID) /* Dump memory descriptors */ if (MiDbgEnableMdDump) MiDbgDumpMemoryDescriptors(); - /* Set the page directory */ - PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = (ULONG)MmGetPageDirectory(); - /* Get the size of FreeLDR's image allocations */ MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned; MmBootImageSize *= PAGE_SIZE; @@ -377,9 +374,6 @@ MmInit1(VOID) /* Initialize the page list */ MmInitializePageList(); - - /* Unmap low memory */ - MmDeletePageTable(NULL, 0); // // Initialize ARM³ From 9722b6109542ea0ecd094f3103c0aa1bb8b81ee7 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Jun 2009 06:59:22 +0000 Subject: [PATCH 115/577] - The timeout value passed to tsleep is in milliseconds and so_linger is in seconds so convert to milliseconds svn path=/trunk/; revision=41632 --- reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c b/reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c index 900dec138b9..1472f94c0d2 100644 --- a/reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c +++ b/reactos/lib/drivers/oskittcp/oskittcp/uipc_socket.c @@ -190,7 +190,7 @@ soclose(so) goto drop; while (so->so_state & SS_ISCONNECTED) { error = tsleep((caddr_t)&so->so_timeo, - PSOCK | PCATCH, netcls, so->so_linger); + PSOCK | PCATCH, netcls, so->so_linger * 1000); if (error) break; } From 2d20864907e05059104a63da213f821b36586096 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Jun 2009 07:03:45 +0000 Subject: [PATCH 116/577] - Use the timeout that the caller gives us if it is nonzero so we don't block forever if nobody wakes us svn path=/trunk/; revision=41633 --- reactos/lib/drivers/ip/transport/tcp/event.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c index cdb527689fa..6978eaf5d6f 100644 --- a/reactos/lib/drivers/ip/transport/tcp/event.c +++ b/reactos/lib/drivers/ip/transport/tcp/event.c @@ -112,6 +112,7 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { int TCPSleep( void *ClientData, void *token, int priority, char *msg, int tmio ) { PSLEEPING_THREAD SleepingThread; + LARGE_INTEGER Timeout; TI_DbgPrint(DEBUG_TCP, ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n", @@ -131,12 +132,14 @@ int TCPSleep( void *ClientData, void *token, int priority, char *msg, InsertTailList( &SleepingThreadsList, &SleepingThread->Entry ); TcpipReleaseFastMutex( &SleepingThreadsLock ); + Timeout.QuadPart = Int32x32To64(tmio, -10000); + TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token)); KeWaitForSingleObject( &SleepingThread->Event, - WrSuspended, + Executive, KernelMode, TRUE, - NULL ); + (tmio != 0) ? &Timeout : NULL ); TcpipAcquireFastMutex( &SleepingThreadsLock ); RemoveEntryList( &SleepingThread->Entry ); From fdf4fe9afad7ee75b65b59592fcbb91d2c710d7d Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 07:14:52 +0000 Subject: [PATCH 117/577] - Allocate enough space for the ARM3 PFN database, and fixup the calculation of the initial nonpaged pool. - The ARM3 PFN database is more of a "shadow" database not to interfere with the real ReactOS PFN database. It starts at 0xB0000000, which is where the initial nonpaged pool started (which now starts somewhere after the ARM3 PFN database). - No new behavior has been introduced other than additional physical memory consumption for the PFN DB pages, and updated memory layout in the ARM3 world. svn path=/trunk/; revision=41634 --- reactos/ntoskrnl/mm/ARM3/init.c | 50 ++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index b3f2ab82f6f..f946909b93c 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -52,8 +52,8 @@ ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; // immediately follows the PFN database, typically sharing the same PDE. It is // a very small resource (32MB on a 1GB system), and capped at 128MB. // -// Right now, we call this the "ARM Pool" and it begins at 0xB0000000 since we -// don't want to interefere with the ReactOS memory manager PFN database (yet). +// Right now, we call this the "ARM Pool" and it begins somewhere after the ARM +// PFN database (which starts at 0xB0000000). // // The expansion nonpaged pool, on the other hand, can grow much bigger (400MB // for a 1GB system). On ARM³ however, it is currently capped at 128MB. @@ -102,6 +102,18 @@ PVOID MmNonPagedPoolEnd = (PVOID)0xFFBE0000; // ULONG MmNumberOfSystemPtes; +// +// This is how many pages the PFN database will take up +// In Windows, this includes the Quark Color Table, but not in ARM³ +// +ULONG MxPfnAllocation; + + +// +// The ARM³ PFN Database +// +PMMPFN MmArmPfnDatabase; + /* PRIVATE FUNCTIONS **********************************************************/ // @@ -275,6 +287,12 @@ MmArmInitSystem(IN ULONG Phase, MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE; } + // + // Calculate the number of bytes, and then convert to pages + // + MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN); + MxPfnAllocation >>= PAGE_SHIFT; + // // Now calculate the nonpaged pool expansion VA region // @@ -315,32 +333,44 @@ MmArmInitSystem(IN ULONG Phase, MmNumberOfSystemPtes--; ASSERT(MmNumberOfSystemPtes > 1000); } + + // + // Normally, the PFN database should start after the loader images. + // This is already the case in ReactOS, but for now we want to co-exist + // with the old memory manager, so we'll create a "Shadow PFN Database" + // instead, and arbitrarly start it at 0xB0000000. + // + MmArmPfnDatabase = (PVOID)0xB0000000; + ASSERT(((ULONG_PTR)MmArmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0); // - // Non paged pool should come after the PFN database, but since we are - // co-existing with the ReactOS NP pool, our "ARM Pool" will instead - // start at this arbitrarly chosen base address. - // When ARM pool becomes non paged pool, this needs to be changed. + // Non paged pool comes after the PFN database // DPRINT1("System PTE VA starts at: %p\n", MmNonPagedSystemStart); DPRINT1("NP Expansion VA begins at: %p and ends at: %p\n", MmNonPagedPoolStart, MmNonPagedPoolEnd); - MmNonPagedPoolStart = (PVOID)0xB0000000; + MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmArmPfnDatabase + + (MxPfnAllocation << PAGE_SHIFT)); // // Now we actually need to get these many physical pages. Nonpaged pool // is actually also physically contiguous (but not the expansion) // - PageFrameIndex = MmGetContinuousPages(MmSizeOfNonPagedPoolInBytes, + PageFrameIndex = MmGetContinuousPages(MmSizeOfNonPagedPoolInBytes + + (MxPfnAllocation << PAGE_SHIFT), Low, High, BoundaryAddressMultiple, FALSE); ASSERT(PageFrameIndex != 0); + DPRINT1("PFN DB VA begins at: %p and ends at: %p\n", + MmArmPfnDatabase, + (ULONG_PTR)MmArmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT)); + DPRINT1("PFN DB PA PFN begins at: %lx\n", PageFrameIndex); DPRINT1("NP VA begins at: %p and ends at: %p\n", MmNonPagedPoolStart, (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes); - DPRINT1("NP PA PFN begins at: %lx\n", PageFrameIndex); + DPRINT1("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation); // // Now we need some pages to create the page tables for the NP system VA @@ -377,7 +407,7 @@ MmArmInitSystem(IN ULONG Phase, // // Now we need pages for the page tables which will map initial NP // - StartPde = MiAddressToPde(MmNonPagedPoolStart); + StartPde = MiAddressToPde(MmArmPfnDatabase); EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); while (StartPde <= EndPde) From 5a526879a4c353a08ff3d7365a35e24a79d3f4be Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 27 Jun 2009 07:38:02 +0000 Subject: [PATCH 118/577] tabs -> spaces use more consistent indentation svn path=/trunk/; revision=41635 --- reactos/lib/drivers/ip/transport/tcp/accept.c | 116 ++-- reactos/lib/drivers/ip/transport/tcp/event.c | 228 +++---- reactos/lib/drivers/ip/transport/tcp/if.c | 20 +- reactos/lib/drivers/ip/transport/tcp/tcp.c | 572 +++++++++--------- 4 files changed, 468 insertions(+), 468 deletions(-) diff --git a/reactos/lib/drivers/ip/transport/tcp/accept.c b/reactos/lib/drivers/ip/transport/tcp/accept.c index 6057da38310..989838aebb6 100644 --- a/reactos/lib/drivers/ip/transport/tcp/accept.c +++ b/reactos/lib/drivers/ip/transport/tcp/accept.c @@ -11,8 +11,8 @@ #include "precomp.h" NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener, - PCONNECTION_ENDPOINT Connection, - PTDI_REQUEST_KERNEL Request ) { + PCONNECTION_ENDPOINT Connection, + PTDI_REQUEST_KERNEL Request ) { NTSTATUS Status; SOCKADDR_IN OutAddr; OSK_UINT OutAddrLen; @@ -24,37 +24,37 @@ NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener, * by WSAAccept -- The returned address will be passed on to * userland after we complete this irp */ WhoIsConnecting = (PTDI_CONNECTION_INFORMATION) - Request->ReturnConnectionInformation; + Request->ReturnConnectionInformation; Status = TCPTranslateError - ( OskitTCPAccept( Listener->SocketContext, - &Connection->SocketContext, - &OutAddr, - sizeof(OutAddr), - &OutAddrLen, - Request->RequestFlags & TDI_QUERY_ACCEPT ? 0 : 1 ) ); + ( OskitTCPAccept( Listener->SocketContext, + &Connection->SocketContext, + &OutAddr, + sizeof(OutAddr), + &OutAddrLen, + Request->RequestFlags & TDI_QUERY_ACCEPT ? 0 : 1 ) ); TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status)); if( NT_SUCCESS(Status) && Status != STATUS_PENDING ) { - RequestAddressReturn = WhoIsConnecting->RemoteAddress; + RequestAddressReturn = WhoIsConnecting->RemoteAddress; - TI_DbgPrint(DEBUG_TCP,("Copying address to %x (Who %x)\n", - RequestAddressReturn, WhoIsConnecting)); + TI_DbgPrint(DEBUG_TCP,("Copying address to %x (Who %x)\n", + RequestAddressReturn, WhoIsConnecting)); RequestAddressReturn->TAAddressCount = 1; - RequestAddressReturn->Address[0].AddressLength = OutAddrLen; + RequestAddressReturn->Address[0].AddressLength = OutAddrLen; /* BSD uses the first byte of the sockaddr struct as a length. * Since windows doesn't do that we strip it */ - RequestAddressReturn->Address[0].AddressType = - (OutAddr.sin_family >> 8) & 0xff; + RequestAddressReturn->Address[0].AddressType = + (OutAddr.sin_family >> 8) & 0xff; - RtlCopyMemory( &RequestAddressReturn->Address[0].Address, - ((PCHAR)&OutAddr) + sizeof(USHORT), - sizeof(RequestAddressReturn->Address[0].Address[0]) ); + RtlCopyMemory( &RequestAddressReturn->Address[0].Address, + ((PCHAR)&OutAddr) + sizeof(USHORT), + sizeof(RequestAddressReturn->Address[0].Address[0]) ); - TI_DbgPrint(DEBUG_TCP,("Done copying\n")); + TI_DbgPrint(DEBUG_TCP,("Done copying\n")); } TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status)); @@ -71,7 +71,7 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) { TI_DbgPrint(DEBUG_TCP,("TCPListen started\n")); TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n", - Connection->SocketContext)); + Connection->SocketContext)); ASSERT(Connection); ASSERT_KM_POINTER(Connection->SocketContext); @@ -81,16 +81,16 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) { AddressToBind.sin_family = AF_INET; memcpy( &AddressToBind.sin_addr, - &Connection->AddressFile->Address.Address.IPv4Address, - sizeof(AddressToBind.sin_addr) ); + &Connection->AddressFile->Address.Address.IPv4Address, + sizeof(AddressToBind.sin_addr) ); AddressToBind.sin_port = Connection->AddressFile->Port; TI_DbgPrint(DEBUG_TCP,("AddressToBind - %x:%x\n", AddressToBind.sin_addr, AddressToBind.sin_port)); Status = TCPTranslateError( OskitTCPBind( Connection->SocketContext, - Connection, - &AddressToBind, - sizeof(AddressToBind) ) ); + Connection, + &AddressToBind, + sizeof(AddressToBind) ) ); if (NT_SUCCESS(Status)) Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, Backlog ) ); @@ -103,7 +103,7 @@ NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) { } VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener, - PCONNECTION_ENDPOINT Connection ) { + PCONNECTION_ENDPOINT Connection ) { PLIST_ENTRY ListEntry; PTDI_BUCKET Bucket; @@ -111,50 +111,50 @@ VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener, ListEntry = Listener->ListenRequest.Flink; while ( ListEntry != &Listener->ListenRequest ) { - Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry); + Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry); - if( Bucket->AssociatedEndpoint == Connection ) { - RemoveEntryList( &Bucket->Entry ); - exFreePool( Bucket ); - break; - } + if( Bucket->AssociatedEndpoint == Connection ) { + RemoveEntryList( &Bucket->Entry ); + exFreePool( Bucket ); + break; + } - ListEntry = ListEntry->Flink; + ListEntry = ListEntry->Flink; } TcpipRecursiveMutexLeave( &TCPLock ); } -NTSTATUS TCPAccept -( PTDI_REQUEST Request, - PCONNECTION_ENDPOINT Listener, - PCONNECTION_ENDPOINT Connection, - PTCP_COMPLETION_ROUTINE Complete, - PVOID Context ) { - NTSTATUS Status; - PTDI_BUCKET Bucket; +NTSTATUS TCPAccept ( PTDI_REQUEST Request, + PCONNECTION_ENDPOINT Listener, + PCONNECTION_ENDPOINT Connection, + PTCP_COMPLETION_ROUTINE Complete, + PVOID Context ) +{ + NTSTATUS Status; + PTDI_BUCKET Bucket; - TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n")); + TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n")); - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); + TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - Status = TCPServiceListeningSocket( Listener, Connection, - (PTDI_REQUEST_KERNEL)Request ); + Status = TCPServiceListeningSocket( Listener, Connection, + (PTDI_REQUEST_KERNEL)Request ); - if( Status == STATUS_PENDING ) { - Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); + if( Status == STATUS_PENDING ) { + Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); - if( Bucket ) { - Bucket->AssociatedEndpoint = Connection; - Bucket->Request.RequestNotifyObject = Complete; - Bucket->Request.RequestContext = Context; - InsertHeadList( &Listener->ListenRequest, &Bucket->Entry ); - } else - Status = STATUS_NO_MEMORY; - } + if( Bucket ) { + Bucket->AssociatedEndpoint = Connection; + Bucket->Request.RequestNotifyObject = Complete; + Bucket->Request.RequestContext = Context; + InsertHeadList( &Listener->ListenRequest, &Bucket->Entry ); + } else + Status = STATUS_NO_MEMORY; + } - TcpipRecursiveMutexLeave( &TCPLock ); + TcpipRecursiveMutexLeave( &TCPLock ); - TI_DbgPrint(DEBUG_TCP,("TCPAccept finished %x\n", Status)); - return Status; + TI_DbgPrint(DEBUG_TCP,("TCPAccept finished %x\n", Status)); + return Status; } diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c index 6978eaf5d6f..f7d2aa421aa 100644 --- a/reactos/lib/drivers/ip/transport/tcp/event.c +++ b/reactos/lib/drivers/ip/transport/tcp/event.c @@ -11,46 +11,46 @@ #include "precomp.h" int TCPSocketState(void *ClientData, - void *WhichSocket, - void *WhichConnection, - OSK_UINT NewState ) { + void *WhichSocket, + void *WhichConnection, + OSK_UINT NewState ) { PCONNECTION_ENDPOINT Connection = WhichConnection; TI_DbgPrint(MID_TRACE,("Flags: %c%c%c%c\n", - NewState & SEL_CONNECT ? 'C' : 'c', - NewState & SEL_READ ? 'R' : 'r', - NewState & SEL_FIN ? 'F' : 'f', - NewState & SEL_ACCEPT ? 'A' : 'a')); + NewState & SEL_CONNECT ? 'C' : 'c', + NewState & SEL_READ ? 'R' : 'r', + NewState & SEL_FIN ? 'F' : 'f', + NewState & SEL_ACCEPT ? 'A' : 'a')); TI_DbgPrint(DEBUG_TCP,("Called: NewState %x (Conn %x) (Change %x)\n", - NewState, Connection, - Connection ? Connection->State ^ NewState : - NewState)); + NewState, Connection, + Connection ? Connection->State ^ NewState : + NewState)); if( !Connection ) { - TI_DbgPrint(DEBUG_TCP,("Socket closing.\n")); - Connection = FileFindConnectionByContext( WhichSocket ); - if( !Connection ) - return 0; - else - TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection)); + TI_DbgPrint(DEBUG_TCP,("Socket closing.\n")); + Connection = FileFindConnectionByContext( WhichSocket ); + if( !Connection ) + return 0; + else + TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection)); } TI_DbgPrint(MID_TRACE,("Connection signalled: %d\n", - Connection->Signalled)); + Connection->Signalled)); Connection->SignalState |= NewState; if( !Connection->Signalled ) { - Connection->Signalled = TRUE; - InsertTailList( &SignalledConnections, &Connection->SignalList ); + Connection->Signalled = TRUE; + InsertTailList( &SignalledConnections, &Connection->SignalList ); } return 0; } void TCPPacketSendComplete( PVOID Context, - PNDIS_PACKET NdisPacket, - NDIS_STATUS NdisStatus ) { + PNDIS_PACKET NdisPacket, + NDIS_STATUS NdisStatus ) { TI_DbgPrint(DEBUG_TCP,("called %x\n", NdisPacket)); FreeNdisPacket(NdisPacket); TI_DbgPrint(DEBUG_TCP,("done\n")); @@ -66,32 +66,32 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { PIPv4_HEADER Header; if( *data == 0x45 ) { /* IPv4 */ - Header = (PIPv4_HEADER)data; - LocalAddress.Type = IP_ADDRESS_V4; - LocalAddress.Address.IPv4Address = Header->SrcAddr; - RemoteAddress.Type = IP_ADDRESS_V4; - RemoteAddress.Address.IPv4Address = Header->DstAddr; + Header = (PIPv4_HEADER)data; + LocalAddress.Type = IP_ADDRESS_V4; + LocalAddress.Address.IPv4Address = Header->SrcAddr; + RemoteAddress.Type = IP_ADDRESS_V4; + RemoteAddress.Address.IPv4Address = Header->DstAddr; } else { - TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n")); - OskitDumpBuffer( data, len ); - return OSK_EINVAL; + TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n")); + OskitDumpBuffer( data, len ); + return OSK_EINVAL; } if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) { - TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress))); - return OSK_EADDRNOTAVAIL; + TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress))); + return OSK_EADDRNOTAVAIL; } NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL, - MaxLLHeaderSize + len ); + MaxLLHeaderSize + len ); if (NdisStatus != NDIS_STATUS_SUCCESS) { - TI_DbgPrint(DEBUG_TCP, ("Error from NDIS: %08x\n", NdisStatus)); - return OSK_ENOBUFS; + TI_DbgPrint(DEBUG_TCP, ("Error from NDIS: %08x\n", NdisStatus)); + return OSK_ENOBUFS; } GetDataPtr( Packet.NdisPacket, MaxLLHeaderSize, - (PCHAR *)&Packet.Header, &Packet.ContigSize ); + (PCHAR *)&Packet.Header, &Packet.ContigSize ); RtlCopyMemory( Packet.Header, data, len ); @@ -110,44 +110,44 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { } int TCPSleep( void *ClientData, void *token, int priority, char *msg, - int tmio ) { + int tmio ) { PSLEEPING_THREAD SleepingThread; LARGE_INTEGER Timeout; TI_DbgPrint(DEBUG_TCP, - ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n", - token, priority, msg, tmio)); + ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n", + token, priority, msg, tmio)); SleepingThread = exAllocatePool( NonPagedPool, sizeof( *SleepingThread ) ); if( SleepingThread ) { - KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE ); - SleepingThread->SleepToken = token; + KeInitializeEvent( &SleepingThread->Event, NotificationEvent, FALSE ); + SleepingThread->SleepToken = token; - /* We're going to sleep and need to release the lock, otherwise + /* We're going to sleep and need to release the lock, otherwise it's impossible to re-enter oskittcp to deliver the event that's going to wake us */ - TcpipRecursiveMutexLeave( &TCPLock ); + TcpipRecursiveMutexLeave( &TCPLock ); - TcpipAcquireFastMutex( &SleepingThreadsLock ); - InsertTailList( &SleepingThreadsList, &SleepingThread->Entry ); - TcpipReleaseFastMutex( &SleepingThreadsLock ); + TcpipAcquireFastMutex( &SleepingThreadsLock ); + InsertTailList( &SleepingThreadsList, &SleepingThread->Entry ); + TcpipReleaseFastMutex( &SleepingThreadsLock ); Timeout.QuadPart = Int32x32To64(tmio, -10000); - TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token)); - KeWaitForSingleObject( &SleepingThread->Event, - Executive, - KernelMode, - TRUE, - (tmio != 0) ? &Timeout : NULL ); + TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token)); + KeWaitForSingleObject( &SleepingThread->Event, + Executive, + KernelMode, + TRUE, + (tmio != 0) ? &Timeout : NULL ); - TcpipAcquireFastMutex( &SleepingThreadsLock ); - RemoveEntryList( &SleepingThread->Entry ); - TcpipReleaseFastMutex( &SleepingThreadsLock ); + TcpipAcquireFastMutex( &SleepingThreadsLock ); + RemoveEntryList( &SleepingThread->Entry ); + TcpipReleaseFastMutex( &SleepingThreadsLock ); - TcpipRecursiveMutexEnter( &TCPLock, TRUE ); + TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - exFreePool( SleepingThread ); + exFreePool( SleepingThread ); } else return OSK_ENOBUFS; @@ -162,13 +162,13 @@ void TCPWakeup( void *ClientData, void *token ) { TcpipAcquireFastMutex( &SleepingThreadsLock ); Entry = SleepingThreadsList.Flink; while( Entry != &SleepingThreadsList ) { - SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry); - TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread)); - if( SleepingThread->SleepToken == token ) { - TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token)); - KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE ); - } - Entry = Entry->Flink; + SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry); + TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread)); + if( SleepingThread->SleepToken == token ) { + TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token)); + KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE ); + } + Entry = Entry->Flink; } TcpipReleaseFastMutex( &SleepingThreadsLock ); } @@ -219,7 +219,7 @@ TCPMemStartup( void ) } void *TCPMalloc( void *ClientData, - OSK_UINT Bytes, OSK_PCHAR File, OSK_UINT Line ) { + OSK_UINT Bytes, OSK_PCHAR File, OSK_UINT Line ) { void *v; ULONG Signature; @@ -231,84 +231,84 @@ void *TCPMalloc( void *ClientData, Found = 0; for ( i = 0; i < ArrayUsed && ! Found; i++ ) { - Found = ( Sizes[i] == Bytes ); - if ( Found ) { - Counts[i]++; - } + Found = ( Sizes[i] == Bytes ); + if ( Found ) { + Counts[i]++; + } } if ( ! Found ) { - if ( ArrayAllocated <= ArrayUsed ) { - NewSize = ( 0 == ArrayAllocated ? 16 : 2 * ArrayAllocated ); - NewArray = exAllocatePool( NonPagedPool, 2 * NewSize * sizeof( OSK_UINT ) ); - if ( NULL != NewArray ) { - if ( 0 != ArrayAllocated ) { - memcpy( NewArray, Sizes, - ArrayAllocated * sizeof( OSK_UINT ) ); - exFreePool( Sizes ); - memcpy( NewArray + NewSize, Counts, - ArrayAllocated * sizeof( OSK_UINT ) ); - exFreePool( Counts ); - } - Sizes = NewArray; - Counts = NewArray + NewSize; - ArrayAllocated = NewSize; - } else if ( 0 != ArrayAllocated ) { - exFreePool( Sizes ); - exFreePool( Counts ); - ArrayAllocated = 0; - } - } - if ( ArrayUsed < ArrayAllocated ) { - Sizes[ArrayUsed] = Bytes; - Counts[ArrayUsed] = 1; - ArrayUsed++; - } + if ( ArrayAllocated <= ArrayUsed ) { + NewSize = ( 0 == ArrayAllocated ? 16 : 2 * ArrayAllocated ); + NewArray = exAllocatePool( NonPagedPool, 2 * NewSize * sizeof( OSK_UINT ) ); + if ( NULL != NewArray ) { + if ( 0 != ArrayAllocated ) { + memcpy( NewArray, Sizes, + ArrayAllocated * sizeof( OSK_UINT ) ); + exFreePool( Sizes ); + memcpy( NewArray + NewSize, Counts, + ArrayAllocated * sizeof( OSK_UINT ) ); + exFreePool( Counts ); + } + Sizes = NewArray; + Counts = NewArray + NewSize; + ArrayAllocated = NewSize; + } else if ( 0 != ArrayAllocated ) { + exFreePool( Sizes ); + exFreePool( Counts ); + ArrayAllocated = 0; + } + } + if ( ArrayUsed < ArrayAllocated ) { + Sizes[ArrayUsed] = Bytes; + Counts[ArrayUsed] = 1; + ArrayUsed++; + } } if ( 0 == (++AllocationCount % MEM_PROFILE) ) { - TI_DbgPrint(DEBUG_TCP, ("Memory allocation size profile:\n")); - for ( i = 0; i < ArrayUsed; i++ ) { - TI_DbgPrint(DEBUG_TCP, - ("Size %4u Count %5u\n", Sizes[i], Counts[i])); - } - TI_DbgPrint(DEBUG_TCP, ("End of memory allocation size profile\n")); + TI_DbgPrint(DEBUG_TCP, ("Memory allocation size profile:\n")); + for ( i = 0; i < ArrayUsed; i++ ) { + TI_DbgPrint(DEBUG_TCP, + ("Size %4u Count %5u\n", Sizes[i], Counts[i])); + } + TI_DbgPrint(DEBUG_TCP, ("End of memory allocation size profile\n")); } #endif /* MEM_PROFILE */ if ( SMALL_SIZE == Bytes ) { - v = ExAllocateFromNPagedLookasideList( &SmallLookasideList ); - Signature = SIGNATURE_SMALL; + v = ExAllocateFromNPagedLookasideList( &SmallLookasideList ); + Signature = SIGNATURE_SMALL; } else if ( LARGE_SIZE == Bytes ) { - v = ExAllocateFromNPagedLookasideList( &LargeLookasideList ); - Signature = SIGNATURE_LARGE; + v = ExAllocateFromNPagedLookasideList( &LargeLookasideList ); + Signature = SIGNATURE_LARGE; } else { - v = ExAllocatePool( NonPagedPool, Bytes + sizeof(ULONG) ); - Signature = SIGNATURE_OTHER; + v = ExAllocatePool( NonPagedPool, Bytes + sizeof(ULONG) ); + Signature = SIGNATURE_OTHER; } if( v ) { - *((ULONG *) v) = Signature; - v = (void *)((char *) v + sizeof(ULONG)); - TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line ); + *((ULONG *) v) = Signature; + v = (void *)((char *) v + sizeof(ULONG)); + TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line ); } return v; } void TCPFree( void *ClientData, - void *data, OSK_PCHAR File, OSK_UINT Line ) { + void *data, OSK_PCHAR File, OSK_UINT Line ) { ULONG Signature; UntrackFL( (PCHAR)File, Line, data, FOURCC('f','b','s','d') ); data = (void *)((char *) data - sizeof(ULONG)); Signature = *((ULONG *) data); if ( SIGNATURE_SMALL == Signature ) { - ExFreeToNPagedLookasideList( &SmallLookasideList, data ); + ExFreeToNPagedLookasideList( &SmallLookasideList, data ); } else if ( SIGNATURE_LARGE == Signature ) { - ExFreeToNPagedLookasideList( &LargeLookasideList, data ); + ExFreeToNPagedLookasideList( &LargeLookasideList, data ); } else if ( SIGNATURE_OTHER == Signature ) { - ExFreePool( data ); + ExFreePool( data ); } else { - ASSERT( FALSE ); + ASSERT( FALSE ); } } diff --git a/reactos/lib/drivers/ip/transport/tcp/if.c b/reactos/lib/drivers/ip/transport/tcp/if.c index 3f78bd01ae5..fa8ac1cd38e 100644 --- a/reactos/lib/drivers/ip/transport/tcp/if.c +++ b/reactos/lib/drivers/ip/transport/tcp/if.c @@ -49,13 +49,13 @@ POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) { ifaddr->ifa_addr = (struct sockaddr *)addr_in; Status = GetInterfaceIPv4Address( IF, - ADE_UNICAST, - (PULONG)&addr_in->sin_addr.s_addr ); + ADE_UNICAST, + (PULONG)&addr_in->sin_addr.s_addr ); ASSERT(NT_SUCCESS(Status)); TI_DbgPrint(DEBUG_TCPIF,("interface %x : addr %x\n", - IF, addr_in->sin_addr.s_addr)); + IF, addr_in->sin_addr.s_addr)); ifaddr->ifa_flags = 0; /* XXX what goes here? */ ifaddr->ifa_refcnt = 0; /* Anachronistic */ @@ -68,10 +68,10 @@ POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) { } POSK_IFADDR TCPFindInterface( void *ClientData, - OSK_UINT AddrType, - OSK_UINT FindType, - OSK_SOCKADDR *ReqAddr, - OSK_IFADDR *Interface ) { + OSK_UINT AddrType, + OSK_UINT FindType, + OSK_SOCKADDR *ReqAddr, + OSK_IFADDR *Interface ) { PIP_INTERFACE IF; IP_ADDRESS Destination; struct sockaddr_in *addr_in = (struct sockaddr_in *)ReqAddr; @@ -80,8 +80,8 @@ POSK_IFADDR TCPFindInterface( void *ClientData, TI_DbgPrint(DEBUG_TCPIF,("called for type %d\n", FindType)); if( !ReqAddr ) { - TI_DbgPrint(DEBUG_TCPIF,("no addr or no ifaddr (%x)\n", ReqAddr)); - return NULL; + TI_DbgPrint(DEBUG_TCPIF,("no addr or no ifaddr (%x)\n", ReqAddr)); + return NULL; } Destination.Type = IP_ADDRESS_V4; @@ -95,7 +95,7 @@ POSK_IFADDR TCPFindInterface( void *ClientData, InterfaceData = TCPGetInterfaceData(IF); addr_in = (struct sockaddr_in *) - InterfaceData->ifa_addr; + InterfaceData->ifa_addr; TI_DbgPrint(DEBUG_TCPIF,("returning addr %x\n", addr_in->sin_addr.s_addr)); diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index 7e2e2e290b4..4b17b5fefd7 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -22,7 +22,7 @@ RECURSIVE_MUTEX TCPLock; PORT_SET TCPPorts; static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection, - ULONG NewState ) { + ULONG NewState ) { NTSTATUS Status = STATUS_SUCCESS; PTCP_COMPLETION_ROUTINE Complete; PTDI_BUCKET Bucket; @@ -35,7 +35,7 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection, /* Things that can happen when we try the initial connection */ if( NewState & SEL_CONNECT ) { - while( !IsListEmpty( &Connection->ConnectRequest ) ) { + while( !IsListEmpty( &Connection->ConnectRequest ) ) { Entry = RemoveHeadList( &Connection->ConnectRequest ); TI_DbgPrint(DEBUG_TCP, ("Connect Event\n")); @@ -58,162 +58,162 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection, } if( NewState & SEL_ACCEPT ) { - /* Handle readable on a listening socket -- - * TODO: Implement filtering - */ + /* Handle readable on a listening socket -- + * TODO: Implement filtering + */ - TI_DbgPrint(DEBUG_TCP,("Accepting new connection on %x (Queue: %s)\n", - Connection, - IsListEmpty(&Connection->ListenRequest) ? - "empty" : "nonempty")); + TI_DbgPrint(DEBUG_TCP,("Accepting new connection on %x (Queue: %s)\n", + Connection, + IsListEmpty(&Connection->ListenRequest) ? + "empty" : "nonempty")); - while( !IsListEmpty( &Connection->ListenRequest ) ) { - PIO_STACK_LOCATION IrpSp; + while( !IsListEmpty( &Connection->ListenRequest ) ) { + PIO_STACK_LOCATION IrpSp; - Entry = RemoveHeadList( &Connection->ListenRequest ); - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - Complete = Bucket->Request.RequestNotifyObject; + Entry = RemoveHeadList( &Connection->ListenRequest ); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; - Irp = Bucket->Request.RequestContext; - IrpSp = IoGetCurrentIrpStackLocation( Irp ); + Irp = Bucket->Request.RequestContext; + IrpSp = IoGetCurrentIrpStackLocation( Irp ); - TI_DbgPrint(DEBUG_TCP,("Getting the socket\n")); - Status = TCPServiceListeningSocket - ( Connection->AddressFile->Listener, - Bucket->AssociatedEndpoint, - (PTDI_REQUEST_KERNEL)&IrpSp->Parameters ); + TI_DbgPrint(DEBUG_TCP,("Getting the socket\n")); + Status = TCPServiceListeningSocket + ( Connection->AddressFile->Listener, + Bucket->AssociatedEndpoint, + (PTDI_REQUEST_KERNEL)&IrpSp->Parameters ); - TI_DbgPrint(DEBUG_TCP,("Socket: Status: %x\n")); + TI_DbgPrint(DEBUG_TCP,("Socket: Status: %x\n")); - if( Status == STATUS_PENDING ) { - InsertHeadList( &Connection->ListenRequest, &Bucket->Entry ); - break; - } else { - Complete( Bucket->Request.RequestContext, Status, 0 ); - exFreePool( Bucket ); - } - } + if( Status == STATUS_PENDING ) { + InsertHeadList( &Connection->ListenRequest, &Bucket->Entry ); + break; + } else { + Complete( Bucket->Request.RequestContext, Status, 0 ); + exFreePool( Bucket ); + } + } } /* Things that happen after we're connected */ if( NewState & SEL_READ ) { - TI_DbgPrint(DEBUG_TCP,("Readable: irp list %s\n", - IsListEmpty(&Connection->ReceiveRequest) ? - "empty" : "nonempty")); + TI_DbgPrint(DEBUG_TCP,("Readable: irp list %s\n", + IsListEmpty(&Connection->ReceiveRequest) ? + "empty" : "nonempty")); - while( !IsListEmpty( &Connection->ReceiveRequest ) ) { - OSK_UINT RecvLen = 0, Received = 0; - PVOID RecvBuffer = 0; + while( !IsListEmpty( &Connection->ReceiveRequest ) ) { + OSK_UINT RecvLen = 0, Received = 0; + PVOID RecvBuffer = 0; - Entry = RemoveHeadList( &Connection->ReceiveRequest ); - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - Complete = Bucket->Request.RequestNotifyObject; + Entry = RemoveHeadList( &Connection->ReceiveRequest ); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; - Irp = Bucket->Request.RequestContext; - Mdl = Irp->MdlAddress; + Irp = Bucket->Request.RequestContext; + Mdl = Irp->MdlAddress; - TI_DbgPrint(DEBUG_TCP, - ("Getting the user buffer from %x\n", Mdl)); + TI_DbgPrint(DEBUG_TCP, + ("Getting the user buffer from %x\n", Mdl)); - NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen ); + NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen ); - TI_DbgPrint(DEBUG_TCP, - ("Reading %d bytes to %x\n", RecvLen, RecvBuffer)); + TI_DbgPrint(DEBUG_TCP, + ("Reading %d bytes to %x\n", RecvLen, RecvBuffer)); - TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection)); - TI_DbgPrint - (DEBUG_TCP, - ("Connection->SocketContext: %x\n", - Connection->SocketContext)); - TI_DbgPrint(DEBUG_TCP, ("RecvBuffer: %x\n", RecvBuffer)); + TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection)); + TI_DbgPrint + (DEBUG_TCP, + ("Connection->SocketContext: %x\n", + Connection->SocketContext)); + TI_DbgPrint(DEBUG_TCP, ("RecvBuffer: %x\n", RecvBuffer)); - Status = TCPTranslateError - ( OskitTCPRecv( Connection->SocketContext, - RecvBuffer, - RecvLen, - &Received, - 0 ) ); + Status = TCPTranslateError + ( OskitTCPRecv( Connection->SocketContext, + RecvBuffer, + RecvLen, + &Received, + 0 ) ); - TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received)); + TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received)); - if( Status == STATUS_SUCCESS ) { - TI_DbgPrint(DEBUG_TCP,("Received %d bytes with status %x\n", - Received, Status)); + if( Status == STATUS_SUCCESS ) { + TI_DbgPrint(DEBUG_TCP,("Received %d bytes with status %x\n", + Received, Status)); - Complete( Bucket->Request.RequestContext, - STATUS_SUCCESS, Received ); - exFreePool( Bucket ); - } else if( Status == STATUS_PENDING ) { - InsertHeadList - ( &Connection->ReceiveRequest, &Bucket->Entry ); - break; - } else { - TI_DbgPrint(DEBUG_TCP, - ("Completing Receive request: %x %x\n", - Bucket->Request, Status)); - Complete( Bucket->Request.RequestContext, Status, 0 ); - exFreePool( Bucket ); - } - } + Complete( Bucket->Request.RequestContext, + STATUS_SUCCESS, Received ); + exFreePool( Bucket ); + } else if( Status == STATUS_PENDING ) { + InsertHeadList + ( &Connection->ReceiveRequest, &Bucket->Entry ); + break; + } else { + TI_DbgPrint(DEBUG_TCP, + ("Completing Receive request: %x %x\n", + Bucket->Request, Status)); + Complete( Bucket->Request.RequestContext, Status, 0 ); + exFreePool( Bucket ); + } + } } if( NewState & SEL_WRITE ) { - TI_DbgPrint(DEBUG_TCP,("Writeable: irp list %s\n", - IsListEmpty(&Connection->SendRequest) ? - "empty" : "nonempty")); + TI_DbgPrint(DEBUG_TCP,("Writeable: irp list %s\n", + IsListEmpty(&Connection->SendRequest) ? + "empty" : "nonempty")); - while( !IsListEmpty( &Connection->SendRequest ) ) { - OSK_UINT SendLen = 0, Sent = 0; - PVOID SendBuffer = 0; + while( !IsListEmpty( &Connection->SendRequest ) ) { + OSK_UINT SendLen = 0, Sent = 0; + PVOID SendBuffer = 0; - Entry = RemoveHeadList( &Connection->SendRequest ); - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - Complete = Bucket->Request.RequestNotifyObject; + Entry = RemoveHeadList( &Connection->SendRequest ); + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + Complete = Bucket->Request.RequestNotifyObject; - Irp = Bucket->Request.RequestContext; - Mdl = Irp->MdlAddress; + Irp = Bucket->Request.RequestContext; + Mdl = Irp->MdlAddress; - TI_DbgPrint(DEBUG_TCP, - ("Getting the user buffer from %x\n", Mdl)); + TI_DbgPrint(DEBUG_TCP, + ("Getting the user buffer from %x\n", Mdl)); - NdisQueryBuffer( Mdl, &SendBuffer, &SendLen ); + NdisQueryBuffer( Mdl, &SendBuffer, &SendLen ); - TI_DbgPrint(DEBUG_TCP, - ("Writing %d bytes to %x\n", SendLen, SendBuffer)); + TI_DbgPrint(DEBUG_TCP, + ("Writing %d bytes to %x\n", SendLen, SendBuffer)); - TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection)); - TI_DbgPrint - (DEBUG_TCP, - ("Connection->SocketContext: %x\n", - Connection->SocketContext)); + TI_DbgPrint(DEBUG_TCP, ("Connection: %x\n", Connection)); + TI_DbgPrint + (DEBUG_TCP, + ("Connection->SocketContext: %x\n", + Connection->SocketContext)); - Status = TCPTranslateError - ( OskitTCPSend( Connection->SocketContext, - SendBuffer, - SendLen, - &Sent, - 0 ) ); + Status = TCPTranslateError + ( OskitTCPSend( Connection->SocketContext, + SendBuffer, + SendLen, + &Sent, + 0 ) ); - TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Sent)); + TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Sent)); - if( Status == STATUS_SUCCESS ) { - TI_DbgPrint(DEBUG_TCP,("Sent %d bytes with status %x\n", - Sent, Status)); + if( Status == STATUS_SUCCESS ) { + TI_DbgPrint(DEBUG_TCP,("Sent %d bytes with status %x\n", + Sent, Status)); - Complete( Bucket->Request.RequestContext, - STATUS_SUCCESS, Sent ); - exFreePool( Bucket ); - } else if( Status == STATUS_PENDING ) { - InsertHeadList - ( &Connection->SendRequest, &Bucket->Entry ); - break; - } else { - TI_DbgPrint(DEBUG_TCP, - ("Completing Send request: %x %x\n", - Bucket->Request, Status)); - Complete( Bucket->Request.RequestContext, Status, 0 ); - exFreePool( Bucket ); - } - } + Complete( Bucket->Request.RequestContext, + STATUS_SUCCESS, Sent ); + exFreePool( Bucket ); + } else if( Status == STATUS_PENDING ) { + InsertHeadList + ( &Connection->SendRequest, &Bucket->Entry ); + break; + } else { + TI_DbgPrint(DEBUG_TCP, + ("Completing Send request: %x %x\n", + Bucket->Request, Status)); + Complete( Bucket->Request.RequestContext, Status, 0 ); + exFreePool( Bucket ); + } + } } if( NewState & SEL_FIN ) { @@ -230,9 +230,9 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection, /* We have to notify oskittcp of the abortion */ DisType.Type = TDI_DISCONNECT_RELEASE | TDI_DISCONNECT_ABORT; - DisType.Context = Connection; - DisType.Irp = (PIRP)Bucket->Request.RequestContext; - DisType.FileObject = IrpSp->FileObject; + DisType.Context = Connection; + DisType.Irp = (PIRP)Bucket->Request.RequestContext; + DisType.FileObject = IrpSp->FileObject; ChewCreate(NULL, sizeof(DISCONNECT_TYPE), DispDoDisconnect, &DisType); @@ -249,9 +249,9 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection, /* We have to notify oskittcp of the abortion */ DisType.Type = TDI_DISCONNECT_RELEASE; - DisType.Context = Connection; - DisType.Irp = (PIRP)Bucket->Request.RequestContext; - DisType.FileObject = IrpSp->FileObject; + DisType.Context = Connection; + DisType.Irp = (PIRP)Bucket->Request.RequestContext; + DisType.FileObject = IrpSp->FileObject; ChewCreate(NULL, sizeof(DISCONNECT_TYPE), DispDoDisconnect, &DisType); @@ -265,7 +265,7 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection, /* We have to notify oskittcp of the abortion */ TCPAbortListenForSocket(Connection->AddressFile->Listener, - Connection); + Connection); Complete( Bucket->Request.RequestContext, STATUS_CANCELLED, 0 ); } @@ -288,18 +288,18 @@ VOID DrainSignals() { PLIST_ENTRY ListEntry; while( !IsListEmpty( &SignalledConnections ) ) { - ListEntry = RemoveHeadList( &SignalledConnections ); - Connection = CONTAINING_RECORD( ListEntry, CONNECTION_ENDPOINT, - SignalList ); - HandleSignalledConnection( Connection, Connection->SignalState ); + ListEntry = RemoveHeadList( &SignalledConnections ); + Connection = CONTAINING_RECORD( ListEntry, CONNECTION_ENDPOINT, + SignalList ); + HandleSignalledConnection( Connection, Connection->SignalState ); } } PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ) { PCONNECTION_ENDPOINT Connection = - exAllocatePool(NonPagedPool, sizeof(CONNECTION_ENDPOINT)); + exAllocatePool(NonPagedPool, sizeof(CONNECTION_ENDPOINT)); if (!Connection) - return Connection; + return Connection; TI_DbgPrint(DEBUG_CPOINT, ("Connection point file object allocated at (0x%X).\n", Connection)); @@ -319,29 +319,29 @@ PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ) { } VOID TCPFreeConnectionEndpoint( PCONNECTION_ENDPOINT Connection ) { - TI_DbgPrint(DEBUG_TCP, ("Freeing TCP Endpoint\n")); + TI_DbgPrint(DEBUG_TCP, ("Freeing TCP Endpoint\n")); exFreePool( Connection ); } NTSTATUS TCPSocket( PCONNECTION_ENDPOINT Connection, - UINT Family, UINT Type, UINT Proto ) { + UINT Family, UINT Type, UINT Proto ) { NTSTATUS Status; TI_DbgPrint(DEBUG_TCP,("Called: Connection %x, Family %d, Type %d, " - "Proto %d\n", - Connection, Family, Type, Proto)); + "Proto %d\n", + Connection, Family, Type, Proto)); TcpipRecursiveMutexEnter( &TCPLock, TRUE ); Status = TCPTranslateError( OskitTCPSocket( Connection, - &Connection->SocketContext, - Family, - Type, - Proto ) ); + &Connection->SocketContext, + Family, + Type, + Proto ) ); ASSERT_KM_POINTER(Connection->SocketContext); TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n", - Connection->SocketContext)); + Connection->SocketContext)); TcpipRecursiveMutexLeave( &TCPLock ); @@ -358,14 +358,14 @@ VOID TCPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket) */ { TI_DbgPrint(DEBUG_TCP,("Sending packet %d (%d) to oskit\n", - IPPacket->TotalSize, - IPPacket->HeaderSize)); + IPPacket->TotalSize, + IPPacket->HeaderSize)); TcpipRecursiveMutexEnter( &TCPLock, TRUE ); OskitTCPReceiveDatagram( IPPacket->Header, - IPPacket->TotalSize, - IPPacket->HeaderSize ); + IPPacket->TotalSize, + IPPacket->HeaderSize ); DrainSignals(); @@ -374,28 +374,28 @@ VOID TCPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket) /* event.c */ int TCPSocketState( void *ClientData, - void *WhichSocket, - void *WhichConnection, - OSK_UINT NewState ); + void *WhichSocket, + void *WhichConnection, + OSK_UINT NewState ); int TCPPacketSend( void *ClientData, - OSK_PCHAR Data, - OSK_UINT Len ); + OSK_PCHAR Data, + OSK_UINT Len ); POSK_IFADDR TCPFindInterface( void *ClientData, - OSK_UINT AddrType, - OSK_UINT FindType, - OSK_SOCKADDR *ReqAddr ); + OSK_UINT AddrType, + OSK_UINT FindType, + OSK_SOCKADDR *ReqAddr ); NTSTATUS TCPMemStartup( void ); void *TCPMalloc( void *ClientData, - OSK_UINT bytes, OSK_PCHAR file, OSK_UINT line ); + OSK_UINT bytes, OSK_PCHAR file, OSK_UINT line ); void TCPFree( void *ClientData, - void *data, OSK_PCHAR file, OSK_UINT line ); + void *data, OSK_PCHAR file, OSK_UINT line ); void TCPMemShutdown( void ); int TCPSleep( void *ClientData, void *token, int priority, char *msg, - int tmio ); + int tmio ); void TCPWakeup( void *ClientData, void *token ); @@ -486,13 +486,13 @@ NTSTATUS TCPStartup(VOID) InitializeListHead( &SignalledConnections ); Status = TCPMemStartup(); if ( ! NT_SUCCESS(Status) ) { - return Status; + return Status; } Status = PortsStartup( &TCPPorts, 1, 0xfffe ); if( !NT_SUCCESS(Status) ) { - TCPMemShutdown(); - return Status; + TCPMemShutdown(); + return Status; } RegisterOskitTCPEventHandlers( &EventHandlers ); @@ -502,13 +502,13 @@ NTSTATUS TCPStartup(VOID) IPRegisterProtocol(IPPROTO_TCP, TCPReceive); ExInitializeNPagedLookasideList( - &TCPSegmentList, /* Lookaside list */ - NULL, /* Allocate routine */ - NULL, /* Free routine */ - 0, /* Flags */ - sizeof(TCP_SEGMENT), /* Size of each entry */ - TAG('T','C','P','S'), /* Tag */ - 0); /* Depth */ + &TCPSegmentList, /* Lookaside list */ + NULL, /* Allocate routine */ + NULL, /* Free routine */ + 0, /* Flags */ + sizeof(TCP_SEGMENT), /* Size of each entry */ + TAG('T','C','P','S'), /* Tag */ + 0); /* Depth */ StartTimer(); @@ -528,7 +528,7 @@ NTSTATUS TCPShutdown(VOID) LARGE_INTEGER WaitForThread; if (!TCPInitialized) - return STATUS_SUCCESS; + return STATUS_SUCCESS; WaitForThread.QuadPart = -2500000; /* 250 ms */ KeSetEvent(&TimerLoopEvent, IO_NO_INCREMENT, FALSE); @@ -579,27 +579,27 @@ NTSTATUS TCPConnect IP_ADDRESS RemoteAddress; USHORT RemotePort; PTDI_BUCKET Bucket; - PNEIGHBOR_CACHE_ENTRY NCE; + PNEIGHBOR_CACHE_ENTRY NCE; TI_DbgPrint(DEBUG_TCP,("TCPConnect: Called\n")); Status = AddrBuildAddress - ((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress, - &RemoteAddress, - &RemotePort); + ((PTRANSPORT_ADDRESS)ConnInfo->RemoteAddress, + &RemoteAddress, + &RemotePort); - if (!(NCE = RouteGetRouteToDestination(&RemoteAddress))) - { - return STATUS_NETWORK_UNREACHABLE; - } + if (!(NCE = RouteGetRouteToDestination(&RemoteAddress))) + { + return STATUS_NETWORK_UNREACHABLE; + } TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - if (Connection->State & SEL_FIN) - { - TcpipRecursiveMutexLeave( &TCPLock ); - return STATUS_REMOTE_DISCONNECT; - } + if (Connection->State & SEL_FIN) + { + TcpipRecursiveMutexLeave( &TCPLock ); + return STATUS_REMOTE_DISCONNECT; + } /* Freed in TCPSocketState */ TI_DbgPrint(DEBUG_TCP, @@ -608,43 +608,43 @@ NTSTATUS TCPConnect RemotePort)); if (!NT_SUCCESS(Status)) { - TI_DbgPrint(DEBUG_TCP, ("Could not AddrBuildAddress in TCPConnect\n")); - TcpipRecursiveMutexLeave( &TCPLock ); - return Status; + TI_DbgPrint(DEBUG_TCP, ("Could not AddrBuildAddress in TCPConnect\n")); + TcpipRecursiveMutexLeave( &TCPLock ); + return Status; } AddressToConnect.sin_family = AF_INET; AddressToBind = AddressToConnect; - AddressToBind.sin_addr.s_addr = NCE->Interface->Unicast.Address.IPv4Address; + AddressToBind.sin_addr.s_addr = NCE->Interface->Unicast.Address.IPv4Address; Status = TCPTranslateError ( OskitTCPBind( Connection->SocketContext, - Connection, - &AddressToBind, - sizeof(AddressToBind) ) ); + Connection, + &AddressToBind, + sizeof(AddressToBind) ) ); if (NT_SUCCESS(Status)) { memcpy( &AddressToConnect.sin_addr, - &RemoteAddress.Address.IPv4Address, - sizeof(AddressToConnect.sin_addr) ); + &RemoteAddress.Address.IPv4Address, + sizeof(AddressToConnect.sin_addr) ); AddressToConnect.sin_port = RemotePort; Status = TCPTranslateError - ( OskitTCPConnect( Connection->SocketContext, - Connection, - &AddressToConnect, - sizeof(AddressToConnect) ) ); + ( OskitTCPConnect( Connection->SocketContext, + Connection, + &AddressToConnect, + sizeof(AddressToConnect) ) ); - if (Status == STATUS_PENDING) - { - Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); - if( !Bucket ) return STATUS_NO_MEMORY; - - Bucket->Request.RequestNotifyObject = (PVOID)Complete; - Bucket->Request.RequestContext = Context; - - InsertHeadList( &Connection->ConnectRequest, &Bucket->Entry ); - } + if (Status == STATUS_PENDING) + { + Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); + if( !Bucket ) return STATUS_NO_MEMORY; + + Bucket->Request.RequestNotifyObject = (PVOID)Complete; + Bucket->Request.RequestContext = Context; + + InsertHeadList( &Connection->ConnectRequest, &Bucket->Entry ); + } } TcpipRecursiveMutexLeave( &TCPLock ); @@ -668,20 +668,20 @@ NTSTATUS TCPDisconnect switch( Flags & (TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE) ) { case 0: case TDI_DISCONNECT_ABORT: - Flags = 0; - break; + Flags = 0; + break; case TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE: - Flags = 2; - break; + Flags = 2; + break; case TDI_DISCONNECT_RELEASE: - Flags = 1; - break; + Flags = 1; + break; } Status = TCPTranslateError - ( OskitTCPShutdown( Connection->SocketContext, Flags ) ); + ( OskitTCPShutdown( Connection->SocketContext, Flags ) ); TcpipRecursiveMutexLeave( &TCPLock ); @@ -731,48 +731,48 @@ NTSTATUS TCPReceiveData TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - /* Closing */ - if (Connection->State & SEL_FIN) - { - TcpipRecursiveMutexLeave( &TCPLock ); - *BytesReceived = 0; - return STATUS_REMOTE_DISCONNECT; - } + /* Closing */ + if (Connection->State & SEL_FIN) + { + TcpipRecursiveMutexLeave( &TCPLock ); + *BytesReceived = 0; + return STATUS_REMOTE_DISCONNECT; + } NdisQueryBuffer( Buffer, &DataBuffer, &DataLen ); TI_DbgPrint(DEBUG_TCP,("TCP>|< Got an MDL %x (%x:%d)\n", Buffer, DataBuffer, DataLen)); Status = TCPTranslateError - ( OskitTCPRecv - ( Connection->SocketContext, - DataBuffer, - DataLen, - &Received, - ReceiveFlags ) ); + ( OskitTCPRecv + ( Connection->SocketContext, + DataBuffer, + DataLen, + &Received, + ReceiveFlags ) ); TI_DbgPrint(DEBUG_TCP,("OskitTCPReceive: %x, %d\n", Status, Received)); /* Keep this request around ... there was no data yet */ if( Status == STATUS_PENDING ) { - /* Freed in TCPSocketState */ - Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); - if( !Bucket ) { - TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n")); - TcpipRecursiveMutexLeave( &TCPLock ); - return STATUS_NO_MEMORY; - } + /* Freed in TCPSocketState */ + Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); + if( !Bucket ) { + TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n")); + TcpipRecursiveMutexLeave( &TCPLock ); + return STATUS_NO_MEMORY; + } - Bucket->Request.RequestNotifyObject = Complete; - Bucket->Request.RequestContext = Context; - *BytesReceived = 0; + Bucket->Request.RequestNotifyObject = Complete; + Bucket->Request.RequestContext = Context; + *BytesReceived = 0; - InsertTailList( &Connection->ReceiveRequest, &Bucket->Entry ); - Status = STATUS_PENDING; - TI_DbgPrint(DEBUG_TCP,("Queued read irp\n")); + InsertTailList( &Connection->ReceiveRequest, &Bucket->Entry ); + Status = STATUS_PENDING; + TI_DbgPrint(DEBUG_TCP,("Queued read irp\n")); } else { - TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Received)); - *BytesReceived = Received; + TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Received)); + *BytesReceived = Received; } TcpipRecursiveMutexLeave( &TCPLock ); @@ -803,46 +803,46 @@ NTSTATUS TCPSendData TI_DbgPrint(DEBUG_TCP,("Connection = %x\n", Connection)); TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext = %x\n", - Connection->SocketContext)); + Connection->SocketContext)); - /* Closing */ - if (Connection->State & SEL_FIN) - { - TcpipRecursiveMutexLeave( &TCPLock ); - *BytesSent = 0; - return STATUS_REMOTE_DISCONNECT; - } + /* Closing */ + if (Connection->State & SEL_FIN) + { + TcpipRecursiveMutexLeave( &TCPLock ); + *BytesSent = 0; + return STATUS_REMOTE_DISCONNECT; + } Status = TCPTranslateError - ( OskitTCPSend( Connection->SocketContext, - (OSK_PCHAR)BufferData, SendLength, - &Sent, 0 ) ); + ( OskitTCPSend( Connection->SocketContext, + (OSK_PCHAR)BufferData, SendLength, + &Sent, 0 ) ); TI_DbgPrint(DEBUG_TCP,("OskitTCPSend: %x, %d\n", Status, Sent)); /* Keep this request around ... there was no data yet */ if( Status == STATUS_PENDING ) { - /* Freed in TCPSocketState */ - Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); - if( !Bucket ) { - TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n")); - TcpipRecursiveMutexLeave( &TCPLock ); - return STATUS_NO_MEMORY; - } - - Bucket->Request.RequestNotifyObject = Complete; - Bucket->Request.RequestContext = Context; - *BytesSent = 0; - - InsertTailList( &Connection->SendRequest, &Bucket->Entry ); - TI_DbgPrint(DEBUG_TCP,("Queued write irp\n")); + /* Freed in TCPSocketState */ + Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) ); + if( !Bucket ) { + TI_DbgPrint(DEBUG_TCP,("Failed to allocate bucket\n")); + TcpipRecursiveMutexLeave( &TCPLock ); + return STATUS_NO_MEMORY; + } + + Bucket->Request.RequestNotifyObject = Complete; + Bucket->Request.RequestContext = Context; + *BytesSent = 0; + + InsertTailList( &Connection->SendRequest, &Bucket->Entry ); + TI_DbgPrint(DEBUG_TCP,("Queued write irp\n")); } else { - TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Sent)); - *BytesSent = Sent; + TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Sent)); + *BytesSent = Sent; } - + TcpipRecursiveMutexLeave( &TCPLock ); - + TI_DbgPrint(DEBUG_TCP,("Status %x\n", Status)); return Status; @@ -854,8 +854,8 @@ VOID TCPTimeout(VOID) { UINT TCPAllocatePort( UINT HintPort ) { if( HintPort ) { - if( AllocatePort( &TCPPorts, HintPort ) ) return HintPort; - else { + if( AllocatePort( &TCPPorts, HintPort ) ) return HintPort; + else { TI_DbgPrint (MID_TRACE,("We got a hint port but couldn't allocate it\n")); return (UINT)-1; @@ -908,19 +908,19 @@ VOID TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp ) { TcpipAcquireSpinLock( &Endpoint->Lock, &OldIrql ); for( i = 0; i < 4; i++ ) - { - for( Entry = ListHead[i]->Flink; - Entry != ListHead[i]; - Entry = Entry->Flink ) - { - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - if( Bucket->Request.RequestContext == Irp ) - { - RemoveEntryList( &Bucket->Entry ); - exFreePool( Bucket ); - break; - } - } + { + for( Entry = ListHead[i]->Flink; + Entry != ListHead[i]; + Entry = Entry->Flink ) + { + Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); + if( Bucket->Request.RequestContext == Irp ) + { + RemoveEntryList( &Bucket->Entry ); + exFreePool( Bucket ); + break; + } + } } TcpipReleaseSpinLock( &Endpoint->Lock, OldIrql ); From ddedfd132a72d8cb96aeca68d1790c4706698a1c Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 08:41:45 +0000 Subject: [PATCH 119/577] - Reimplement kernel stack allocation (MmCreateKernelStack, MmDeleteKernelStack, MmGrowKernelStack, MmGrowKernelStackEx): - Use System PTEs. - Allocate 12KB stacks with a 4KB guard page, and expand them up to 60KB as required. - Previous implementation always allocated 60KB, without any guard page. - The result is that on a minimal ReactOS install, simply booting up now requires an average of 0.5MB less of physical memory than before. - And once again, optimizations to the system PTE allocation code should significantly improve performance. - Should also analyze benefits of using a dead stack slist as done on Windows. (Assembla Ticket #39). svn path=/trunk/; revision=41636 --- reactos/ntoskrnl/mm/ARM3/procsup.c | 285 +++++++++++++++++++++++ reactos/ntoskrnl/mm/procsup.c | 132 ----------- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 3 files changed, 286 insertions(+), 132 deletions(-) create mode 100644 reactos/ntoskrnl/mm/ARM3/procsup.c diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c new file mode 100644 index 00000000000..be05ce67f9e --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -0,0 +1,285 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/procsup.c + * PURPOSE: ARM Memory Manager Process Related Management + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::PROCSUP" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +ULONG PagesForStacks = 0; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +MmDeleteKernelStack(IN PVOID StackBase, + IN BOOLEAN GuiStack) +{ + PMMPTE PointerPte; + PFN_NUMBER StackPages; + ULONG i; + + // + // This should be the guard page, so decrement by one + // + PointerPte = MiAddressToPte(StackBase); + PointerPte--; + + // + // Calculate pages used + // + StackPages = BYTES_TO_PAGES(GuiStack ? + KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); + + // + // Loop them + // + for (i = 0; i < StackPages; i++) + { + // + // Check if this is a valid PTE + // + if (PointerPte->u.Hard.Valid == 1) + { + // + // Nuke it + // + MmReleasePageMemoryConsumer(MC_NPPOOL, PFN_FROM_PTE(PointerPte)); + PagesForStacks--; + } + + // + // Next one + // + PointerPte--; + } + + // + // We should be at the guard page now + // + ASSERT(PointerPte->u.Hard.Valid == 0); + + // + // Release the PTEs + // + MiReleaseSystemPtes(PointerPte, StackPages + 1, SystemPteSpace); +} + +PVOID +NTAPI +MmCreateKernelStack(IN BOOLEAN GuiStack, + IN UCHAR Node) +{ + PFN_NUMBER StackPtes, StackPages; + PMMPTE PointerPte, StackPte; + PVOID BaseAddress; + MMPTE TempPte; + KIRQL OldIrql; + PFN_NUMBER PageFrameIndex; + ULONG i; + + // + // Calculate pages needed + // + if (GuiStack) + { + // + // We'll allocate 64KB stack, but only commit 12K + // + StackPtes = BYTES_TO_PAGES(KERNEL_LARGE_STACK_SIZE); + StackPages = BYTES_TO_PAGES(KERNEL_LARGE_STACK_COMMIT); + + } + else + { + // + // We'll allocate 12K and that's it + // + StackPtes = BYTES_TO_PAGES(KERNEL_STACK_SIZE); + StackPages = StackPtes; + } + + // + // Reserve stack pages, plus a guard page + // + StackPte = MiReserveSystemPtes(StackPtes + 1, SystemPteSpace); + if (!StackPte) return NULL; + + // + // Get the stack address + // + BaseAddress = MiPteToAddress(StackPte + StackPtes + 1); + + // + // Select the right PTE address where we actually start committing pages + // + PointerPte = StackPte; + if (GuiStack) PointerPte += BYTES_TO_PAGES(KERNEL_LARGE_STACK_SIZE - + KERNEL_LARGE_STACK_COMMIT); + + // + // Setup the template stack PTE + // + TempPte = HyperTemplatePte; + TempPte.u.Hard.Global = FALSE; + TempPte.u.Hard.PageFrameNumber = 0; + TempPte.u.Hard.Dirty = TRUE; + + // + // Acquire the PFN DB lock + // + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + // + // Loop each stack page + // + for (i = 0; i < StackPages; i++) + { + // + // Next PTE + // + PointerPte++; + ASSERT(PointerPte->u.Hard.Valid == 0); + + // + // Get a page + // + PageFrameIndex = MmAllocPage(MC_NPPOOL, 0); + TempPte.u.Hard.PageFrameNumber = PageFrameIndex; + + // + // Write it + // + *PointerPte = TempPte; + PagesForStacks++; + } + + // + // Release the PFN lock + // + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + // + // Return the stack address + // + return BaseAddress; +} + +NTSTATUS +NTAPI +MmGrowKernelStackEx(IN PVOID StackPointer, + IN ULONG GrowSize) +{ + PKTHREAD Thread = KeGetCurrentThread(); + PMMPTE LimitPte, NewLimitPte, LastPte; + PFN_NUMBER StackPages; + KIRQL OldIrql; + MMPTE TempPte; + PFN_NUMBER PageFrameIndex; + + // + // Make sure the stack did not overflow + // + ASSERT(((ULONG_PTR)Thread->StackBase - (ULONG_PTR)Thread->StackLimit) <= + (KERNEL_LARGE_STACK_SIZE + PAGE_SIZE)); + + // + // Get the current stack limit + // + LimitPte = MiAddressToPte(Thread->StackLimit); + ASSERT(LimitPte->u.Hard.Valid == 1); + + // + // Get the new one and make sure this isn't a retarded request + // + NewLimitPte = MiAddressToPte((PVOID)((ULONG_PTR)StackPointer - GrowSize)); + if (NewLimitPte == LimitPte) return STATUS_SUCCESS; + + // + // Now make sure you're not going past the reserved space + // + LastPte = MiAddressToPte((PVOID)((ULONG_PTR)Thread->StackBase - + KERNEL_LARGE_STACK_SIZE)); + if (NewLimitPte < LastPte) + { + // + // Sorry! + // + DPRINT1("Thread wants too much stack\n"); + return STATUS_STACK_OVERFLOW; + } + + // + // Calculate the number of new pages + // + LimitPte--; + StackPages = (LimitPte - NewLimitPte + 1); + + // + // Setup the template stack PTE + // + TempPte = HyperTemplatePte; + TempPte.u.Hard.Global = FALSE; + TempPte.u.Hard.PageFrameNumber = 0; + TempPte.u.Hard.Dirty = TRUE; + + // + // Acquire the PFN DB lock + // + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + // + // Loop each stack page + // + while (LimitPte >= NewLimitPte) + { + // + // Sanity check + // + ASSERT(LimitPte->u.Hard.Valid == 0); + + // + // Get a page + // + PageFrameIndex = MmAllocPage(MC_NPPOOL, 0); + TempPte.u.Hard.PageFrameNumber = PageFrameIndex; + + // + // Write it + // + *LimitPte-- = TempPte; + } + + // + // Release the PFN lock + // + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + // + // Set the new limit + // + Thread->StackLimit = (ULONG_PTR)MiPteToAddress(NewLimitPte); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmGrowKernelStack(IN PVOID StackPointer) +{ + // + // Call the extended version + // + return MmGrowKernelStackEx(StackPointer, KERNEL_LARGE_STACK_COMMIT); +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/procsup.c b/reactos/ntoskrnl/mm/procsup.c index 4dca5d8afa9..3a68aa0e9ad 100644 --- a/reactos/ntoskrnl/mm/procsup.c +++ b/reactos/ntoskrnl/mm/procsup.c @@ -126,38 +126,6 @@ MiCreatePebOrTeb(PEPROCESS Process, return RVA(AllocatedBase, PAGE_SIZE); } -VOID -MiFreeStackPage(PVOID Context, - MEMORY_AREA* MemoryArea, - PVOID Address, - PFN_TYPE Page, - SWAPENTRY SwapEntry, - BOOLEAN Dirty) -{ - ASSERT(SwapEntry == 0); - if (Page) MmReleasePageMemoryConsumer(MC_NPPOOL, Page); -} - -VOID -NTAPI -MmDeleteKernelStack(PVOID StackBase, - BOOLEAN GuiStack) -{ - ULONG StackSize = GuiStack ? KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE; - - /* Lock the Address Space */ - MmLockAddressSpace(MmGetKernelAddressSpace()); - - /* Delete the Stack */ - MmFreeMemoryAreaByPtr(MmGetKernelAddressSpace(), - (PVOID)((ULONG_PTR)StackBase - StackSize), - MiFreeStackPage, - NULL); - - /* Unlock the Address Space */ - MmUnlockAddressSpace(MmGetKernelAddressSpace()); -} - VOID NTAPI MmDeleteTeb(PEPROCESS Process, @@ -180,106 +148,6 @@ MmDeleteTeb(PEPROCESS Process, MmUnlockAddressSpace(ProcessAddressSpace); } -PVOID -NTAPI -MmCreateKernelStack(BOOLEAN GuiStack, - UCHAR Node) -{ - PMEMORY_AREA StackArea; - ULONG i; - PHYSICAL_ADDRESS BoundaryAddressMultiple; - ULONG StackSize = GuiStack ? KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE; - PFN_TYPE Page[KERNEL_LARGE_STACK_SIZE / PAGE_SIZE]; - PVOID KernelStack = NULL; - NTSTATUS Status; - - /* Initialize the Boundary Address */ - BoundaryAddressMultiple.QuadPart = 0; - - /* Lock the Kernel Address Space */ - MmLockAddressSpace(MmGetKernelAddressSpace()); - - /* Create a MAREA for the Kernel Stack */ - Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_KERNEL_STACK, - &KernelStack, - StackSize, - PAGE_READWRITE, - &StackArea, - FALSE, - 0, - BoundaryAddressMultiple); - - /* Unlock the Address Space */ - MmUnlockAddressSpace(MmGetKernelAddressSpace()); - - /* Check for Success */ - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create thread stack\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - /* - * Mark the Stack in use. - * Note: Currently we mark all 60KB in use for a GUI Thread. - * We should only do this inside MmGrowKernelStack. TODO! - */ - for (i = 0; i < (StackSize / PAGE_SIZE); i++) - { - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &Page[i]); - } - - /* Create a Virtual Mapping for it */ - Status = MmCreateVirtualMapping(NULL, - KernelStack, - PAGE_READWRITE, - Page, - StackSize / PAGE_SIZE); - - /* Check for success */ - if (!NT_SUCCESS(Status)) - { - DPRINT1("Could not create Virtual Mapping for Kernel Stack\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - /* Return the stack base */ - return (PVOID)((ULONG_PTR)KernelStack + - (GuiStack ? KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE)); -} - -/* - * @implemented - */ -NTSTATUS -NTAPI -MmGrowKernelStack(PVOID StackPointer) -{ - PETHREAD Thread = PsGetCurrentThread(); - - /* Make sure the stack did not overflow */ - ASSERT(((PCHAR)Thread->Tcb.StackBase - (PCHAR)Thread->Tcb.StackLimit) <= - (KERNEL_LARGE_STACK_SIZE + PAGE_SIZE)); - - /* Check if we have reserved space for our grow */ - if ((PCHAR)Thread->Tcb.StackBase - (PCHAR)Thread->Tcb.StackLimit + - KERNEL_STACK_SIZE > KERNEL_LARGE_STACK_SIZE) - { - return STATUS_STACK_OVERFLOW; - } - - /* - * We'll give you three more pages. - * NOTE: See note in MmCreateKernelStack. These pages are already being reserved. - * It would be more efficient to only grow them (commit them) here. - */ - Thread->Tcb.StackLimit -= KERNEL_STACK_SIZE; - - /* Return success */ - return STATUS_SUCCESS; -} - NTSTATUS NTAPI MmCreatePeb(PEPROCESS Process) diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 2e301fed4d0..854e1ad6e4d 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -364,6 +364,7 @@ init.c iosup.c pool.c + procsup.c syspte.c anonmem.c From ad9f3a761f2c32ed65ddc7bebcd96913c9efc85e Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 08:43:56 +0000 Subject: [PATCH 120/577] - Remove leftover performance tracing code. svn path=/trunk/; revision=41637 --- reactos/ntoskrnl/mm/ARM3/procsup.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index be05ce67f9e..5349106d6db 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -16,8 +16,6 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h" -ULONG PagesForStacks = 0; - /* PRIVATE FUNCTIONS **********************************************************/ VOID @@ -55,7 +53,6 @@ MmDeleteKernelStack(IN PVOID StackBase, // Nuke it // MmReleasePageMemoryConsumer(MC_NPPOOL, PFN_FROM_PTE(PointerPte)); - PagesForStacks--; } // @@ -161,7 +158,6 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, // Write it // *PointerPte = TempPte; - PagesForStacks++; } // From a932210bfa3aa031990a1a8fb907c84960930cc7 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Jun 2009 08:48:58 +0000 Subject: [PATCH 121/577] - Always call the completion handler so we don't leak packet descriptors - Don't remove the NCE if we fail because it may not be ours - Mark the IRPs pending before we insert them into our queue - Check that the addresses match so we don't receive somebody else's packets - Part 1 of 2 svn path=/trunk/; revision=41638 --- reactos/lib/drivers/ip/network/neighbor.c | 18 +++++++----------- reactos/lib/drivers/ip/network/router.c | 9 +-------- .../drivers/ip/transport/datagram/datagram.c | 5 ++++- reactos/lib/drivers/ip/transport/tcp/accept.c | 1 + reactos/lib/drivers/ip/transport/tcp/tcp.c | 7 ++++++- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/reactos/lib/drivers/ip/network/neighbor.c b/reactos/lib/drivers/ip/network/neighbor.c index dd1bc511035..94755c1f0a4 100644 --- a/reactos/lib/drivers/ip/network/neighbor.c +++ b/reactos/lib/drivers/ip/network/neighbor.c @@ -64,7 +64,6 @@ VOID NBSendPackets( PNEIGHBOR_CACHE_ENTRY NCE ) { /* Must be called with table lock acquired */ VOID NBFlushPacketQueue( PNEIGHBOR_CACHE_ENTRY NCE, - BOOLEAN CallComplete, NTSTATUS ErrorCode ) { PLIST_ENTRY PacketEntry; PNEIGHBOR_PACKET Packet; @@ -81,13 +80,10 @@ VOID NBFlushPacketQueue( PNEIGHBOR_CACHE_ENTRY NCE, ("PacketEntry: %x, NdisPacket %x\n", PacketEntry, Packet->Packet)); - if( CallComplete ) - { - ASSERT_KM_POINTER(Packet->Complete); - Packet->Complete( Packet->Context, - Packet->Packet, - ErrorCode ); - } + ASSERT_KM_POINTER(Packet->Complete); + Packet->Complete( Packet->Context, + Packet->Packet, + ErrorCode ); exFreePool( Packet ); } @@ -117,7 +113,7 @@ VOID NCETimeout( so maybe it's not that big a problem */ /* Flush packet queue */ - NBFlushPacketQueue( NCE, TRUE, NDIS_STATUS_REQUEST_ABORTED ); + NBFlushPacketQueue( NCE, NDIS_STATUS_REQUEST_ABORTED ); NCE->EventCount = 0; } else @@ -213,7 +209,7 @@ VOID NBShutdown(VOID) NextNCE = CurNCE->Next; /* Flush wait queue */ - NBFlushPacketQueue( CurNCE, FALSE, STATUS_SUCCESS ); + NBFlushPacketQueue( CurNCE, NDIS_STATUS_NOT_ACCEPTED ); CurNCE = NextNCE; } @@ -528,7 +524,7 @@ VOID NBRemoveNeighbor( /* Found it, now unlink it from the list */ *PrevNCE = CurNCE->Next; - NBFlushPacketQueue( CurNCE, TRUE, NDIS_STATUS_REQUEST_ABORTED ); + NBFlushPacketQueue( CurNCE, NDIS_STATUS_REQUEST_ABORTED ); exFreePool(CurNCE); break; diff --git a/reactos/lib/drivers/ip/network/router.c b/reactos/lib/drivers/ip/network/router.c index 9ad58478177..2911da9ba85 100644 --- a/reactos/lib/drivers/ip/network/router.c +++ b/reactos/lib/drivers/ip/network/router.c @@ -415,7 +415,6 @@ PFIB_ENTRY RouterCreateRoute( */ { KIRQL OldIrql; - PFIB_ENTRY FIBE; PLIST_ENTRY CurrentEntry; PLIST_ENTRY NextEntry; PFIB_ENTRY Current; @@ -450,13 +449,7 @@ PFIB_ENTRY RouterCreateRoute( return NULL; } - FIBE = RouterAddRoute(NetworkAddress, Netmask, NCE, Metric); - if (!FIBE) { - /* Not enough free resources */ - NBRemoveNeighbor(NCE); - } - - return FIBE; + return RouterAddRoute(NetworkAddress, Netmask, NCE, Metric); } diff --git a/reactos/lib/drivers/ip/transport/datagram/datagram.c b/reactos/lib/drivers/ip/transport/datagram/datagram.c index 6a7bd36ec43..ae6aa490cf9 100644 --- a/reactos/lib/drivers/ip/transport/datagram/datagram.c +++ b/reactos/lib/drivers/ip/transport/datagram/datagram.c @@ -106,7 +106,10 @@ VOID DGDeliverData( while((CurrentEntry != &AddrFile->ReceiveQueue) && (!Found)) { Current = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry); - if( DstPort == AddrFile->Port ) { + if( DstPort == AddrFile->Port && + (AddrIsEqual(DstAddress, &AddrFile->Address) || + AddrIsUnspecified(&AddrFile->Address) || + AddrIsUnspecified(DstAddress))) { Found = TRUE; /* Remove the request from the queue */ RemoveEntryList(&Current->ListEntry); diff --git a/reactos/lib/drivers/ip/transport/tcp/accept.c b/reactos/lib/drivers/ip/transport/tcp/accept.c index 989838aebb6..f80d3514655 100644 --- a/reactos/lib/drivers/ip/transport/tcp/accept.c +++ b/reactos/lib/drivers/ip/transport/tcp/accept.c @@ -148,6 +148,7 @@ NTSTATUS TCPAccept ( PTDI_REQUEST Request, Bucket->AssociatedEndpoint = Connection; Bucket->Request.RequestNotifyObject = Complete; Bucket->Request.RequestContext = Context; + IoMarkIrpPending((PIRP)Context); InsertHeadList( &Listener->ListenRequest, &Bucket->Entry ); } else Status = STATUS_NO_MEMORY; diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index 4b17b5fefd7..800a6519fa9 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -643,6 +643,8 @@ NTSTATUS TCPConnect Bucket->Request.RequestNotifyObject = (PVOID)Complete; Bucket->Request.RequestContext = Context; + IoMarkIrpPending((PIRP)Context); + InsertHeadList( &Connection->ConnectRequest, &Bucket->Entry ); } } @@ -767,8 +769,9 @@ NTSTATUS TCPReceiveData Bucket->Request.RequestContext = Context; *BytesReceived = 0; + IoMarkIrpPending((PIRP)Context); + InsertTailList( &Connection->ReceiveRequest, &Bucket->Entry ); - Status = STATUS_PENDING; TI_DbgPrint(DEBUG_TCP,("Queued read irp\n")); } else { TI_DbgPrint(DEBUG_TCP,("Got status %x, bytes %d\n", Status, Received)); @@ -833,6 +836,8 @@ NTSTATUS TCPSendData Bucket->Request.RequestNotifyObject = Complete; Bucket->Request.RequestContext = Context; *BytesSent = 0; + + IoMarkIrpPending((PIRP)Context); InsertTailList( &Connection->SendRequest, &Bucket->Entry ); TI_DbgPrint(DEBUG_TCP,("Queued write irp\n")); From fea1ac47820a9943effed9388d63e1fba67416a5 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 09:54:56 +0000 Subject: [PATCH 122/577] - This patch is lets you visually dump the entire ReactOS PFN database, useful for debugging. Surprising nobody had done in this in the past, since it wasn't too hard (but it took a bit long to figure out how to get it in there). - That's what she said. svn path=/trunk/; revision=41639 --- reactos/ntoskrnl/include/internal/kd.h | 3 +- reactos/ntoskrnl/include/internal/mm.h | 12 ++++ reactos/ntoskrnl/kd/kdmain.c | 4 ++ reactos/ntoskrnl/mm/freelist.c | 88 ++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/include/internal/kd.h b/reactos/ntoskrnl/include/internal/kd.h index bc88f5eec03..3002bad4189 100644 --- a/reactos/ntoskrnl/include/internal/kd.h +++ b/reactos/ntoskrnl/include/internal/kd.h @@ -342,7 +342,8 @@ typedef enum _KDP_DEBUG_SERVICE KdSpare1 = 0x23, /* h */ KdSpare2 = 0x17, /* i */ KdSpare3 = 0x24, /* j */ - EnterDebugger = 0x25 /* k */ + EnterDebugger = 0x25, /* k */ + ThatsWhatSheSaid = 69 /* FIGURE IT OUT */ } KDP_DEBUG_SERVICE; /* Dispatch Table for Wrapper Functions */ diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index c1509c7f848..ada4602f478 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -293,6 +293,12 @@ typedef struct ULONG PagingRequestsInLastFifteenMinutes; } MM_STATS; +// +// These two mappings are actually used by Windows itself, based on the ASSERTS +// +#define StartOfAllocation ReadInProgress +#define EndOfAllocation WriteInProgress + typedef struct _MMPFNENTRY { USHORT Modified:1; @@ -1120,6 +1126,12 @@ MmInitializePageList( VOID ); +VOID +NTAPI +MmDumpPfnDatabase( + VOID +); + PFN_TYPE NTAPI MmGetContinuousPages( diff --git a/reactos/ntoskrnl/kd/kdmain.c b/reactos/ntoskrnl/kd/kdmain.c index 8874d2142c6..a37f4a61ec3 100644 --- a/reactos/ntoskrnl/kd/kdmain.c +++ b/reactos/ntoskrnl/kd/kdmain.c @@ -85,6 +85,10 @@ KdpServiceDispatcher(ULONG Service, case EnterDebugger: DbgBreakPoint(); break; + + case ThatsWhatSheSaid: + MmDumpPfnDatabase(); + break; default: break; diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 45f0307c577..020de2cb440 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -251,6 +251,94 @@ MmAllocEarlyPage(VOID) return Pfn; } +VOID +NTAPI +MmDumpPfnDatabase(VOID) +{ + ULONG i; + PPHYSICAL_PAGE Pfn1; + PCHAR State = "????", Consumer = "Unknown"; + KIRQL OldIrql; + + OldIrql = KfRaiseIrql(HIGH_LEVEL); + + // + // Loop the PFN database + // + for (i = 0; i <= MmHighestPhysicalPage; i++) + { + Pfn1 = MiGetPfnEntry(i); + + // + // Get the consumer + // + switch (Pfn1->Flags.Consumer) + { + case MC_NPPOOL: + + Consumer = "Nonpaged Pool"; + break; + + case MC_PPOOL: + + Consumer = "Paged Pool"; + break; + + case MC_CACHE: + + Consumer = "File System Cache"; + break; + + case MC_USER: + + Consumer = "Process Working Set"; + break; + + case MC_SYSTEM: + + Consumer = "System"; + break; + } + + // + // Get the type + // + switch (Pfn1->Flags.Type) + { + case MM_PHYSICAL_PAGE_USED: + + State = "Used"; + break; + + case MM_PHYSICAL_PAGE_FREE: + + State = "Free"; + Consumer = "Free"; + break; + + case MM_PHYSICAL_PAGE_BIOS: + + State = "BIOS"; + Consumer = "System Reserved"; + break; + } + + // + // Pretty-print the page + // + DbgPrint("0x%08p:\t%04s\t%20s\t(%02d.%02d.%02d) [%08p])\n", + i << PAGE_SHIFT, + State, + Consumer, + Pfn1->ReferenceCount, + Pfn1->MapCount, + Pfn1->LockCount, + Pfn1->RmapListHead); + } + + KeLowerIrql(OldIrql); +} + VOID NTAPI MmInitializePageList(VOID) From 74ddcbe68d56b0e945b91f94e968f9d06b9f775c Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 27 Jun 2009 11:07:58 +0000 Subject: [PATCH 123/577] - KeDetachProcess & KeUnstackDetachProcess: Fix a typo when swapping back to the original process that would switch _from_ the original process to itself. We now properly swap from the _current_ process. svn path=/trunk/; revision=41640 --- reactos/ntoskrnl/ke/procobj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/procobj.c b/reactos/ntoskrnl/ke/procobj.c index a37a41492ca..26a78741ee9 100644 --- a/reactos/ntoskrnl/ke/procobj.c +++ b/reactos/ntoskrnl/ke/procobj.c @@ -535,7 +535,7 @@ KeDetachProcess(VOID) KiReleaseApcLockFromDpcLevel(&ApcLock); /* Swap Processes */ - KiSwapProcess(Thread->ApcState.Process, Thread->ApcState.Process); + KiSwapProcess(Thread->ApcState.Process, Process); /* Exit the dispatcher */ KiExitDispatcher(ApcLock.OldIrql); @@ -705,7 +705,7 @@ KeUnstackDetachProcess(IN PRKAPC_STATE ApcState) KiReleaseApcLockFromDpcLevel(&ApcLock); /* Swap Processes */ - KiSwapProcess(Thread->ApcState.Process, Thread->ApcState.Process); + KiSwapProcess(Thread->ApcState.Process, Process); /* Exit the dispatcher */ KiExitDispatcher(ApcLock.OldIrql); From 4c329721d8dbca466cf37a61a93a39ba5c2938c1 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sat, 27 Jun 2009 14:41:56 +0000 Subject: [PATCH 124/577] Add MIXERCONTROL_CONTROLTYPE_BASS_BOOST and KSDATAFORMAT_SUBTYPE_IEEE_FLOAT svn path=/trunk/; revision=41641 --- reactos/include/psdk/ksmedia.h | 6 +++++- reactos/include/psdk/mmsystem.h | 1 + reactos/lib/sdk/dxguid/dxguid-mingw.c | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/include/psdk/ksmedia.h b/reactos/include/psdk/ksmedia.h index 28973c71fe7..2f90af88e1c 100644 --- a/reactos/include/psdk/ksmedia.h +++ b/reactos/include/psdk/ksmedia.h @@ -396,10 +396,14 @@ DEFINE_GUIDSTRUCT("1D262760-E957-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SUBTYPE_M #define KSDATAFORMAT_SUBTYPE_MIDI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_MIDI) #define STATIC_KSDATAFORMAT_SUBTYPE_PCM\ - 0x00000001L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} + 0x00000001L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} DEFINE_GUIDSTRUCT("00000001-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_PCM); #define KSDATAFORMAT_SUBTYPE_PCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PCM) +#define STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT\ + 0x00000003L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} +DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); +#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) #define STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX\ 0x05589f81L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a diff --git a/reactos/include/psdk/mmsystem.h b/reactos/include/psdk/mmsystem.h index 4713d3d9149..c2c2377c1f5 100644 --- a/reactos/include/psdk/mmsystem.h +++ b/reactos/include/psdk/mmsystem.h @@ -368,6 +368,7 @@ extern "C" { #define MIXERCONTROL_CONTROLTYPE_MONO (MIXERCONTROL_CONTROLTYPE_BOOLEAN+3) #define MIXERCONTROL_CONTROLTYPE_LOUDNESS (MIXERCONTROL_CONTROLTYPE_BOOLEAN+4) #define MIXERCONTROL_CONTROLTYPE_STEREOENH (MIXERCONTROL_CONTROLTYPE_BOOLEAN+5) +#define MIXERCONTROL_CONTROLTYPE_BASS_BOOST (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 0x00002277) #define MIXERCONTROL_CONTROLTYPE_BUTTON (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BUTTON|MIXERCONTROL_CT_UNITS_BOOLEAN) #define MIXERCONTROL_CONTROLTYPE_DECIBELS (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_DECIBELS) #define MIXERCONTROL_CONTROLTYPE_SIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_SIGNED) diff --git a/reactos/lib/sdk/dxguid/dxguid-mingw.c b/reactos/lib/sdk/dxguid/dxguid-mingw.c index 9c5b567765d..a93784f4803 100644 --- a/reactos/lib/sdk/dxguid/dxguid-mingw.c +++ b/reactos/lib/sdk/dxguid/dxguid-mingw.c @@ -66,6 +66,7 @@ DEFINE_GUID(IID_IDirectMusicSynth8,0x53cab625,0x2711,0x4c9f,0x9d,0xe7,0x1b,0x7f, DEFINE_GUID(IID_IDirectMusicSynthSink,0x09823663,0x5c85,0x11d2,0xaf,0xa6,0x00,0xaa,0x00,0x24,0xd8,0xb6); DEFINE_GUID(IID_IKsFastClock,0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e); DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); /* Match ms dxsdk 2004 dec these guids exist in dxguid, tested by Magnus Olsen */ DEFINE_GUID(CLSID_DirectMusicAudioPathConfig, 0xEE0B9CA0, 0xA81E, 0x11D3, 0x9B, 0xD1, 0x00, 0x80, 0xC7, 0x15, 0x0A, 0x74); From dc74ea0bbe28a865d0dd5ccdde70a87faf111529 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 27 Jun 2009 18:36:29 +0000 Subject: [PATCH 125/577] - Implement the rest of the HCBT_ support. svn path=/trunk/; revision=41642 --- reactos/dll/win32/user32/windows/hook.c | 52 +++++++++++++------ .../subsystems/win32/win32k/ntuser/callback.c | 31 +++++++++++ .../subsystems/win32/win32k/ntuser/window.c | 5 +- 3 files changed, 69 insertions(+), 19 deletions(-) diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index dbbee3d96a8..1a7aa70f914 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -414,15 +414,17 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) CBT_CREATEWNDW CbtCreatewndw; CREATESTRUCTA Csa; CBT_CREATEWNDA CbtCreatewnda; - PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra; - WPARAM wParam; - LPARAM lParam; + PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL; + WPARAM wParam = 0; + LPARAM lParam = 0; PKBDLLHOOKSTRUCT KeyboardLlData; PMSLLHOOKSTRUCT MouseLlData; PMSG Msg; PMOUSEHOOKSTRUCT MHook; PCWPSTRUCT CWP; PCWPRETSTRUCT CWPR; + PRECTL prl; + LPCBTACTIVATESTRUCT pcbtas; Common = (PHOOKPROC_CALLBACK_ARGUMENTS) Arguments; @@ -430,39 +432,59 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) { case WH_CBT: switch(Common->Code) - { + { case HCBT_CREATEWND: CbtCreatewndExtra = (PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS) ((PCHAR) Common + Common->lParam); Csw = CbtCreatewndExtra->Cs; if (NULL != CbtCreatewndExtra->Cs.lpszName) - { + { Csw.lpszName = (LPCWSTR)((PCHAR) CbtCreatewndExtra + (ULONG) CbtCreatewndExtra->Cs.lpszName); - } + } if (0 != HIWORD(CbtCreatewndExtra->Cs.lpszClass)) - { + { Csw.lpszClass = (LPCWSTR)((PCHAR) CbtCreatewndExtra + LOWORD((ULONG) CbtCreatewndExtra->Cs.lpszClass)); - } + } wParam = Common->wParam; if (Common->Ansi) - { + { memcpy(&Csa, &Csw, sizeof(CREATESTRUCTW)); CbtCreatewnda.lpcs = &Csa; CbtCreatewnda.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; lParam = (LPARAM) &CbtCreatewnda; - } + } else - { + { CbtCreatewndw.lpcs = &Csw; CbtCreatewndw.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; lParam = (LPARAM) &CbtCreatewndw; - } + } break; + case HCBT_CLICKSKIPPED: + MHook = (PMOUSEHOOKSTRUCT)((PCHAR) Common + Common->lParam); + lParam = (LPARAM) MHook; + break; + case HCBT_MOVESIZE: + prl = (PRECTL)((PCHAR) Common + Common->lParam); + lParam = (LPARAM) prl; + break; + case HCBT_ACTIVATE: + pcbtas = (LPCBTACTIVATESTRUCT)((PCHAR) Common + Common->lParam); + lParam = (LPARAM) pcbtas; + break; + case HCBT_KEYSKIPPED: + case HCBT_MINMAX: + case HCBT_SETFOCUS: + case HCBT_SYSCOMMAND: + case HCBT_DESTROYWND: + case HCBT_QS: + break; default: + ERR("HCBT_ not supported = %d\n", Common->Code); return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED); - } + } if (Common->Proc) Result = Common->Proc(Common->Code, wParam, lParam); @@ -472,11 +494,11 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) } switch(Common->Code) - { + { case HCBT_CREATEWND: CbtCreatewndExtra->WndInsertAfter = CbtCreatewndw.hwndInsertAfter; break; - } + } break; case WH_KEYBOARD_LL: KeyboardLlData = (PKBDLLHOOKSTRUCT)((PCHAR) Common + Common->lParam); diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 94e712b7fb4..4fae54262f9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -391,6 +391,25 @@ co_IntCallHookProc(INT HookId, } } break; + + case HCBT_MOVESIZE: + ArgumentLength += sizeof(RECTL); + break; + case HCBT_ACTIVATE: + ArgumentLength += sizeof(CBTACTIVATESTRUCT); + break; + case HCBT_CLICKSKIPPED: + ArgumentLength += sizeof(MOUSEHOOKSTRUCT); + break; +/* ATM pass on */ + case HCBT_KEYSKIPPED: + case HCBT_MINMAX: + case HCBT_SETFOCUS: + case HCBT_SYSCOMMAND: +/* These types pass through. */ + case HCBT_DESTROYWND: + case HCBT_QS: + break; default: DPRINT1("Trying to call unsupported CBT hook %d\n", Code); return 0; @@ -481,6 +500,18 @@ co_IntCallHookProc(INT HookId, *((WCHAR *) Extra) = L'\0'; } break; + case HCBT_CLICKSKIPPED: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(MOUSEHOOKSTRUCT)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; + case HCBT_MOVESIZE: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(RECTL)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; + case HCBT_ACTIVATE: + RtlCopyMemory(Extra, (PVOID) lParam, sizeof(CBTACTIVATESTRUCT)); + Common->lParam = (LPARAM) (Extra - (PCHAR) Common); + break; } break; case WH_KEYBOARD_LL: diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 6b4e69659f4..faa8417ab67 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2430,13 +2430,10 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) IntDereferenceMessageQueue(Window->MessageQueue); /* Call hooks */ -#if 0 /* FIXME */ - - if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) hwnd, 0, TRUE)) + if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) Window->hSelf, 0)) { return FALSE; } -#endif IntEngWindowChanged(Window, WOC_DELETE); isChild = (0 != (Wnd->Style & WS_CHILD)); From 29572196b794a27e1f2f32e31bb28a169bd095a9 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 27 Jun 2009 18:46:10 +0000 Subject: [PATCH 126/577] fix two kernel32 locale winetests svn path=/trunk/; revision=41643 --- reactos/dll/win32/kernel32/misc/lang.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/dll/win32/kernel32/misc/lang.c b/reactos/dll/win32/kernel32/misc/lang.c index 52fe97bbb67..474f0f269d3 100644 --- a/reactos/dll/win32/kernel32/misc/lang.c +++ b/reactos/dll/win32/kernel32/misc/lang.c @@ -2533,6 +2533,8 @@ LCMapStringA ( ret = wine_get_sortkey(dwMapFlags, srcW, srclenW, lpDestStr, cchDest); if (ret == 0) SetLastError(ERROR_INSUFFICIENT_BUFFER); + else + ret++; goto map_string_exit; } From ad91dd3fcd1194a054a00bc58c4a42b1f64d7ca4 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 27 Jun 2009 19:06:00 +0000 Subject: [PATCH 127/577] - Add some defines in preparation for _WINE. - Add missing ExtDeviceMode and PrivateExtractIconsA/W to PSDK and remove from Wine-only headers, as these are defined in the official PSDK. svn path=/trunk/; revision=41644 --- reactos/include/crt/sys/types.h | 17 ++++++++++ reactos/include/psdk/dlgs.h | 5 +++ reactos/include/psdk/mmsystem.h | 44 +++++++++++++++++++++++++ reactos/include/psdk/prsht.h | 4 +++ reactos/include/psdk/winnetwk.h | 18 ++++++++++ reactos/include/psdk/winnls.h | 3 ++ reactos/include/psdk/winnt.h | 23 +++++++++++++ reactos/include/psdk/winspool.h | 6 ++++ reactos/include/psdk/winuser.h | 10 ++++++ reactos/include/reactos/wine/winspool.h | 3 -- reactos/include/reactos/wine/winuser.h | 3 -- 11 files changed, 130 insertions(+), 6 deletions(-) diff --git a/reactos/include/crt/sys/types.h b/reactos/include/crt/sys/types.h index 8ba3df7e7da..eef90b05782 100644 --- a/reactos/include/crt/sys/types.h +++ b/reactos/include/crt/sys/types.h @@ -36,4 +36,21 @@ typedef unsigned int dev_t; # endif #endif +#ifdef _WINE +#ifndef _PID_T_ +#define _PID_T_ +#ifndef _WIN64 +typedef int _pid_t; +#else +typedef __int64 _pid_t; +#endif +#ifndef NO_OLDNAMES +#ifndef __pid_t_defined +#define __pid_t_defined +typedef _pid_t pid_t; +#endif /* __pid_t_defined */ +#endif +#endif /* Not _PID_T_ */ +#endif + #endif /* !_INC_TYPES */ diff --git a/reactos/include/psdk/dlgs.h b/reactos/include/psdk/dlgs.h index 302794c5f2d..3ce96f5ec27 100644 --- a/reactos/include/psdk/dlgs.h +++ b/reactos/include/psdk/dlgs.h @@ -16,6 +16,11 @@ extern "C" { #define FORMATDLGORD30 1544 #define RUNDLGORD 1545 +#ifdef _WINE +#define OFN_DONTADDTORECENT 0x02000000 +#define OFN_ENABLEINCLUDENOTIFY 0x00400000 +#endif + #if (WINVER >= 0x0400) #define PAGESETUPDLGORD 1546 #define NEWFILEOPENORD 1547 diff --git a/reactos/include/psdk/mmsystem.h b/reactos/include/psdk/mmsystem.h index c2c2377c1f5..da8b9699c6a 100644 --- a/reactos/include/psdk/mmsystem.h +++ b/reactos/include/psdk/mmsystem.h @@ -126,6 +126,11 @@ extern "C" { #define DRV_RESTART DRVCNF_RESTART #define DRV_MCI_FIRST DRV_RESERVED #define DRV_MCI_LAST (DRV_RESERVED+0xFFF) +#ifdef _WINE +#define DRV_SUCCESS 0x0001 +#define DRV_FAILURE 0x0000 +#define DRV_EXITAPPLICATION 0x000C +#endif #define CALLBACK_TYPEMASK 0x70000 #define CALLBACK_NULL 0 #define CALLBACK_WINDOW 0x10000 @@ -905,6 +910,12 @@ extern "C" { #define MCI_OVLY_WHERE_DESTINATION 0x40000 #define MCI_OVLY_WHERE_FRAME 0x80000 #define MCI_OVLY_WHERE_VIDEO 0x100000 +#ifdef _WINE +#define MCI_OPEN_DRIVER 0x0801 +#define MCI_CLOSE_DRIVER 0x0802 +#define MCI_SOUND 0x0812 +#define MCI_SOUND_NAME 0x00000100L +#endif #define NEWTRANSPARENT 3 #define QUERYROPSUPPORT 40 #define SELECTDIB 41 @@ -922,6 +933,18 @@ extern "C" { #define SEEK_END 2 #endif +#ifdef _WINE +#define MAXWAVEDRIVERS 10 +#define MAXMIDIDRIVERS 10 +#define MAXAUXDRIVERS 10 +#define MAXMCIDRIVERS 32 +#define MAXMIXERDRIVERS 10 +#endif + +#ifdef _WINE +typedef LPCSTR HPCSTR; +#endif + typedef DWORD MCIERROR; typedef UINT MCIDEVICEID; typedef UINT(CALLBACK *YIELDPROC)(MCIDEVICEID,DWORD); @@ -1132,6 +1155,9 @@ typedef struct midievent_tag { DWORD dwEvent; DWORD dwParms[1]; } MIDIEVENT; +#ifdef _WINE +typedef struct midievent_tag *LPMIDIEVENT; +#endif typedef struct midistrmbuffver_tag { DWORD dwVersion; @@ -1508,6 +1534,24 @@ typedef struct tagMCI_SEEK_PARMS { DWORD dwTo; } MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,*LPMCI_SEEK_PARMS; +#ifdef _WINE +typedef struct tagMCI_SOUND_PARMSA { + DWORD_PTR dwCallback; + LPCSTR lpstrSoundName; +} MCI_SOUND_PARMSA, *LPMCI_SOUND_PARMSA; + +typedef struct tagMCI_SOUND_PARMSW { + DWORD_PTR dwCallback; + LPCWSTR lpstrSoundName; +} MCI_SOUND_PARMSW, *LPMCI_SOUND_PARMSW; + +#ifdef UNICODE +typedef MCI_SOUND_PARMSW MCI_SOUND_PARMS; +#else +typedef MCI_SOUND_PARMSA MCI_SOUND_PARMS; +#endif +#endif + typedef struct tagMCI_STATUS_PARMS { DWORD dwCallback; DWORD dwReturn; diff --git a/reactos/include/psdk/prsht.h b/reactos/include/psdk/prsht.h index 987653d1226..91f3e76de14 100644 --- a/reactos/include/psdk/prsht.h +++ b/reactos/include/psdk/prsht.h @@ -63,6 +63,10 @@ extern "C" { #else #define PSH_WIZARD97 0x01000000 #endif +#ifdef _WINE +#define PSH_WIZARD97_OLD 0x00002000 +#define PSH_WIZARD97_NEW 0x01000000 +#endif #endif /* _WIN32_IE >= 0x0400 */ #if (_WIN32_IE >= 0x0500) #define PSH_WIZARD_LITE 0x400000 diff --git a/reactos/include/psdk/winnetwk.h b/reactos/include/psdk/winnetwk.h index a39744919a7..c391472adce 100644 --- a/reactos/include/psdk/winnetwk.h +++ b/reactos/include/psdk/winnetwk.h @@ -287,6 +287,24 @@ DWORD WINAPI WNetRestoreConnectionA(HWND,LPCSTR); DWORD WINAPI WNetRestoreConnectionW(HWND,LPCWSTR); DWORD APIENTRY MultinetGetConnectionPerformanceA(LPNETRESOURCEA,LPNETCONNECTINFOSTRUCT); DWORD APIENTRY MultinetGetConnectionPerformanceW(LPNETRESOURCEW,LPNETCONNECTINFOSTRUCT); + +#ifdef _WINE +typedef struct tagPASSWORD_CACHE_ENTRY +{ + WORD cbEntry; + WORD cbResource; + WORD cbPassword; + BYTE iEntry; + BYTE nType; + BYTE abResource[1]; +} PASSWORD_CACHE_ENTRY; + +typedef BOOL (CALLBACK *ENUMPASSWORDPROC)(PASSWORD_CACHE_ENTRY *, DWORD); +DWORD WINAPI WNetCachePassword( LPSTR, WORD, LPSTR, WORD, BYTE, WORD ); +UINT WINAPI WNetEnumCachedPasswords( LPSTR, WORD, BYTE, ENUMPASSWORDPROC, DWORD); +DWORD WINAPI WNetGetCachedPassword( LPSTR, WORD, LPSTR, LPWORD, BYTE ); +#endif + #ifdef UNICODE #define PFNPROCESSPOLICIES PFNPROCESSPOLICIESW #define PFNRECONCILEPROFILE PFNRECONCILEPROFILEW diff --git a/reactos/include/psdk/winnls.h b/reactos/include/psdk/winnls.h index 4d956d1f54d..b63760ffae7 100644 --- a/reactos/include/psdk/winnls.h +++ b/reactos/include/psdk/winnls.h @@ -174,6 +174,9 @@ extern "C" { #endif #define CP_ACP 0 +#ifdef _WINE +#define CP_UNIXCP CP_ACP +#endif #define CP_OEMCP 1 #define CP_MACCP 2 #define CP_THREAD_ACP 3 diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index c95c1312395..d177ddc3865 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -70,11 +70,13 @@ extern "C" { #endif #endif +/*#ifdef _WINE*/ #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) #define __WINE_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) #else #define __WINE_ALLOC_SIZE(x) #endif +/*#endif*/ #ifndef FORCEINLINE #if (_MSC_VER >= 1200) @@ -881,6 +883,27 @@ typedef enum { #define LANG_YI 0x78 #define LANG_YORUBA 0x6a #define LANG_ZULU 0x35 + +#ifdef _WINE +#define LANG_ESPERANTO 0x8f +#define LANG_WALON 0x90 +#define LANG_CORNISH 0x91 + +#define LANG_GAELIC 0x94 +#define LANG_MALTESE 0x3a +#define LANG_ROMANSH 0x17 +#define LANG_SAAMI 0x3b +#define LANG_LOWER_SORBIAN 0x2e +#define LANG_UPPER_SORBIAN 0x2e +#define LANG_SUTU 0x30 +#define LANG_TAJIK 0x28 +#define LANG_TSONGA 0x31 +#define LANG_TSWANA 0x32 +#define LANG_VENDA 0x33 +#define LANG_XHOSA 0x34 +#define LANG_ZULU 0x35 +#endif + #define SUBLANG_CUSTOM_UNSPECIFIED 0x04 #define SUBLANG_CUSTOM_DEFAULT 0x03 #define SUBLANG_UI_CUSTOM_DEFAULT 0x05 diff --git a/reactos/include/psdk/winspool.h b/reactos/include/psdk/winspool.h index 5a6009fcf37..d8c91959aaf 100644 --- a/reactos/include/psdk/winspool.h +++ b/reactos/include/psdk/winspool.h @@ -827,6 +827,7 @@ BOOL WINAPI EnumPrintProcessorDatatypesA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PD BOOL WINAPI EnumPrintProcessorDatatypesW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); BOOL WINAPI EnumPrintProcessorsA(LPSTR,LPSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); BOOL WINAPI EnumPrintProcessorsW(LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD,PDWORD); +LONG WINAPI ExtDeviceMode(HWND,HANDLE,LPDEVMODEA,LPSTR,LPSTR,LPDEVMODEA,LPSTR,DWORD); BOOL WINAPI FindClosePrinterChangeNotification(HANDLE); HANDLE WINAPI FindFirstPrinterChangeNotification(HANDLE,DWORD,DWORD,PVOID); HANDLE WINAPI FindNextPrinterChangeNotification(HANDLE,PDWORD,PVOID,PVOID*); @@ -870,6 +871,11 @@ BOOL WINAPI SetPrinterA(HANDLE,DWORD,PBYTE,DWORD); BOOL WINAPI SetPrinterW(HANDLE,DWORD,PBYTE,DWORD); BOOL WINAPI SetPrinterDataA(HANDLE,LPSTR,DWORD,PBYTE,DWORD); BOOL WINAPI SetPrinterDataW(HANDLE,LPWSTR,DWORD,PBYTE,DWORD); +#ifdef _WINE +LPSTR WINAPI StartDocDlgA(HANDLE hPrinter, DOCINFOA *doc); +LPWSTR WINAPI StartDocDlgW(HANDLE hPrinter, DOCINFOW *doc); +#define StartDocDlg WINELIB_NAME_AW(StartDocDlg) +#endif DWORD WINAPI StartDocPrinterA(HANDLE,DWORD,PBYTE); DWORD WINAPI StartDocPrinterW(HANDLE,DWORD,PBYTE); BOOL WINAPI StartPagePrinter(HANDLE); diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index fa4190852e5..4237993503c 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -1938,6 +1938,9 @@ extern "C" { #define EN_VSCROLL 1538 #define LB_ADDFILE 406 #define LB_ADDSTRING 384 +#ifdef _WINE +#define LB_CARETOFF 420 +#endif #define LB_DELETESTRING 386 #define LB_DIR 397 #define LB_FINDSTRING 399 @@ -2026,6 +2029,9 @@ extern "C" { #define DCX_INTERSECTRGN 128 #define DCX_VALIDATE 0x200000 #define DCX_EXCLUDEUPDATE 0x100 +#ifdef _WINE +#define DCX_USESTYLE 0x10000 +#endif #define GMDI_GOINTOPOPUPS 2 #define GMDI_USEDISABLED 1 #define FKF_AVAILABLE 2 @@ -4151,6 +4157,8 @@ BOOL WINAPI PostThreadMessageW(DWORD,UINT,WPARAM,LPARAM); #if (_WIN32_WINNT >= 0x0501) BOOL WINAPI PrintWindow(HWND,HDC,UINT); #endif +UINT WINAPI PrivateExtractIconsA(LPCSTR,int,int,int,HICON*,UINT*,UINT,UINT); +UINT WINAPI PrivateExtractIconsW(LPCWSTR,int,int,int,HICON*,UINT*,UINT,UINT); BOOL WINAPI PtInRect(LPCRECT,POINT); HWND WINAPI RealChildWindowFromPoint(HWND,POINT); UINT WINAPI RealGetWindowClassA(HWND,LPSTR,UINT); @@ -4487,6 +4495,7 @@ typedef MONITORINFOEXW MONITORINFOEX, *LPMONITORINFOEX; #define PostAppMessage PostAppMessageW #define PostMessage PostMessageW #define PostThreadMessage PostThreadMessageW +#define PrivateExtractIcons PrivateExtractIconsW #define RealGetWindowClass RealGetWindowClassW #define RegisterClass RegisterClassW #define RegisterClassEx RegisterClassExW @@ -4654,6 +4663,7 @@ typedef MONITORINFOEXA MONITORINFOEX, *LPMONITORINFOEX; #define PostAppMessage PostAppMessageA #define PostMessage PostMessageA #define PostThreadMessage PostThreadMessageA +#define PrivateExtractIcons PrivateExtractIconsA #define RealGetWindowClass RealGetWindowClassA #define RegisterClass RegisterClassA #define RegisterClassEx RegisterClassExA diff --git a/reactos/include/reactos/wine/winspool.h b/reactos/include/reactos/wine/winspool.h index dd3084c03c1..a6d2be8b8a0 100644 --- a/reactos/include/reactos/wine/winspool.h +++ b/reactos/include/reactos/wine/winspool.h @@ -36,9 +36,6 @@ extern "C" { /* DECLARATIONS */ -LONG WINAPI ExtDeviceMode( HWND hWnd, HANDLE hInst, LPDEVMODEA pDevModeOutput, - LPSTR pDeviceName, LPSTR pPort, LPDEVMODEA pDevModeInput, LPSTR pProfile, - DWORD fMode); LPSTR WINAPI StartDocDlgA(HANDLE hPrinter, DOCINFOA *doc); LPWSTR WINAPI StartDocDlgW(HANDLE hPrinter, DOCINFOW *doc); diff --git a/reactos/include/reactos/wine/winuser.h b/reactos/include/reactos/wine/winuser.h index 8ce6344dcff..df8efa3862a 100644 --- a/reactos/include/reactos/wine/winuser.h +++ b/reactos/include/reactos/wine/winuser.h @@ -12,7 +12,4 @@ #define DCX_USESTYLE 0x00010000 #define LB_CARETOFF 0x01a4 -WINUSERAPI UINT WINAPI PrivateExtractIconsA(LPCSTR,int,int,int,HICON*,UINT*,UINT,UINT); -WINUSERAPI UINT WINAPI PrivateExtractIconsW(LPCWSTR,int,int,int,HICON*,UINT*,UINT,UINT); - #endif /* __WINE_WINUSER_H */ From dd218680c6902503a4037919e8d6a8cc84e92e04 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Sat, 27 Jun 2009 19:16:29 +0000 Subject: [PATCH 128/577] Allow sorting the list of processes in Task Manager by any column. Patch by Maxime Vernier with fixes by Sylvain Petreolle and KJK::Hyperion See issue #4608 for more details. svn path=/trunk/; revision=41645 --- .../base/applications/taskmgr/lang/bg-BG.rc | 2 +- .../base/applications/taskmgr/lang/cs-CZ.rc | 2 +- .../base/applications/taskmgr/lang/da-DK.rc | 2 +- .../base/applications/taskmgr/lang/de-DE.rc | 2 +- .../base/applications/taskmgr/lang/el-GR.rc | 2 +- .../base/applications/taskmgr/lang/en-US.rc | 2 +- .../base/applications/taskmgr/lang/es-ES.rc | 2 +- .../base/applications/taskmgr/lang/fr-FR.rc | 2 +- .../base/applications/taskmgr/lang/hu-HU.rc | 2 +- .../base/applications/taskmgr/lang/id-ID.rc | 2 +- .../base/applications/taskmgr/lang/it-IT.rc | 2 +- .../base/applications/taskmgr/lang/ja-JP.rc | 2 +- .../base/applications/taskmgr/lang/ko-KR.rc | 2 +- .../base/applications/taskmgr/lang/nl-NL.rc | 2 +- .../base/applications/taskmgr/lang/no-NO.rc | 2 +- .../base/applications/taskmgr/lang/pl-PL.rc | 2 +- .../base/applications/taskmgr/lang/pt-BR.rc | 2 +- .../base/applications/taskmgr/lang/ro-RO.rc | 2 +- .../base/applications/taskmgr/lang/ru-RU.rc | 2 +- .../base/applications/taskmgr/lang/sk-SK.rc | 2 +- .../base/applications/taskmgr/lang/sv-SE.rc | 2 +- .../base/applications/taskmgr/lang/uk-UA.rc | 2 +- .../base/applications/taskmgr/lang/zh-CN.rc | 2 +- reactos/base/applications/taskmgr/procpage.c | 643 ++++++++++++++---- 24 files changed, 515 insertions(+), 174 deletions(-) diff --git a/reactos/base/applications/taskmgr/lang/bg-BG.rc b/reactos/base/applications/taskmgr/lang/bg-BG.rc index f57bbe67170..0b2dc424d83 100644 --- a/reactos/base/applications/taskmgr/lang/bg-BG.rc +++ b/reactos/base/applications/taskmgr/lang/bg-BG.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Ïðåêðàòÿâàíå íà çàäà÷àòà",IDC_ENDPROCESS,144,203,100,14 CONTROL "&Ïîêàçâàíå íà äåéñòâèÿòà íà âñè÷êè ïîòðåáèòåëè",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/cs-CZ.rc b/reactos/base/applications/taskmgr/lang/cs-CZ.rc index df4f5f98f53..287fee830b7 100644 --- a/reactos/base/applications/taskmgr/lang/cs-CZ.rc +++ b/reactos/base/applications/taskmgr/lang/cs-CZ.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Ukonèit proces",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Zobrazit procesy všech uživatelù",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/da-DK.rc b/reactos/base/applications/taskmgr/lang/da-DK.rc index 80bb2242bbe..07d2c7bade2 100644 --- a/reactos/base/applications/taskmgr/lang/da-DK.rc +++ b/reactos/base/applications/taskmgr/lang/da-DK.rc @@ -187,7 +187,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Afslut Proces",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Vis Processor fra alle brugere",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/de-DE.rc b/reactos/base/applications/taskmgr/lang/de-DE.rc index d78db115e58..97a3f79e0b3 100644 --- a/reactos/base/applications/taskmgr/lang/de-DE.rc +++ b/reactos/base/applications/taskmgr/lang/de-DE.rc @@ -190,7 +190,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Prozess beenden",IDC_ENDPROCESS,171,189,69,14 CONTROL "Prozesse aller &Benutzer anzeigen",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/el-GR.rc b/reactos/base/applications/taskmgr/lang/el-GR.rc index f24fdefe9f3..e206ffbcbee 100644 --- a/reactos/base/applications/taskmgr/lang/el-GR.rc +++ b/reactos/base/applications/taskmgr/lang/el-GR.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&End Process",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Show processes from all users",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/en-US.rc b/reactos/base/applications/taskmgr/lang/en-US.rc index 822092597e7..75e6727f32a 100644 --- a/reactos/base/applications/taskmgr/lang/en-US.rc +++ b/reactos/base/applications/taskmgr/lang/en-US.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&End Process",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Show processes from all users",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/es-ES.rc b/reactos/base/applications/taskmgr/lang/es-ES.rc index 6472bdb5360..636a9b6a1c0 100644 --- a/reactos/base/applications/taskmgr/lang/es-ES.rc +++ b/reactos/base/applications/taskmgr/lang/es-ES.rc @@ -208,7 +208,7 @@ FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Finalizar Proceso",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Mostrar Procesos de todos los usuario",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/fr-FR.rc b/reactos/base/applications/taskmgr/lang/fr-FR.rc index 4df130bac77..41a95c6136f 100644 --- a/reactos/base/applications/taskmgr/lang/fr-FR.rc +++ b/reactos/base/applications/taskmgr/lang/fr-FR.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Terminer le processus",IDC_ENDPROCESS,171,189,71,14 CONTROL "Aff&icher les processus de tous les utilisateurs",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/hu-HU.rc b/reactos/base/applications/taskmgr/lang/hu-HU.rc index 60f18e16c7f..440a9e5b435 100644 --- a/reactos/base/applications/taskmgr/lang/hu-HU.rc +++ b/reactos/base/applications/taskmgr/lang/hu-HU.rc @@ -189,7 +189,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Folyamat befejezése",IDC_ENDPROCESS,171,189,69,14 CONTROL "Minden felhasználó folya&matait jelenítse meg",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/id-ID.rc b/reactos/base/applications/taskmgr/lang/id-ID.rc index 863cab2f51e..64abb279986 100644 --- a/reactos/base/applications/taskmgr/lang/id-ID.rc +++ b/reactos/base/applications/taskmgr/lang/id-ID.rc @@ -187,7 +187,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&End Process",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Show processes from all users",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/it-IT.rc b/reactos/base/applications/taskmgr/lang/it-IT.rc index fc648b074bb..4c25f9e1db5 100644 --- a/reactos/base/applications/taskmgr/lang/it-IT.rc +++ b/reactos/base/applications/taskmgr/lang/it-IT.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Termina Processo",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Mostra i processi di tutti gli utenti",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/ja-JP.rc b/reactos/base/applications/taskmgr/lang/ja-JP.rc index 89f7fbffcb4..3804a59c569 100644 --- a/reactos/base/applications/taskmgr/lang/ja-JP.rc +++ b/reactos/base/applications/taskmgr/lang/ja-JP.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 9, "MS UI Gothic" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "ƒvƒƒZƒX‚ÌI—¹(&E)",IDC_ENDPROCESS,171,189,69,14 CONTROL "‘Sƒ†[ƒU[‚̃vƒƒZƒX‚ð•\\ަ‚·‚é(&S)",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/ko-KR.rc b/reactos/base/applications/taskmgr/lang/ko-KR.rc index 9b84520dab0..6f25adc8f5d 100644 --- a/reactos/base/applications/taskmgr/lang/ko-KR.rc +++ b/reactos/base/applications/taskmgr/lang/ko-KR.rc @@ -190,7 +190,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "ÀÛ¾÷ ³¡³»±â(&E)",IDC_ENDPROCESS,171,189,69,14 CONTROL "¸ðµç À¯ÀúÀÇ ÇÁ·Î¼¼½º º¸À̱â(&S)",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/nl-NL.rc b/reactos/base/applications/taskmgr/lang/nl-NL.rc index d9dbb0c608d..d7b769daf03 100644 --- a/reactos/base/applications/taskmgr/lang/nl-NL.rc +++ b/reactos/base/applications/taskmgr/lang/nl-NL.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Proces beëindigen",IDC_ENDPROCESS,171,189,69,14 CONTROL "Processen van &alle gebruikers weergeven",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/no-NO.rc b/reactos/base/applications/taskmgr/lang/no-NO.rc index c198f517f7a..3344dfc0370 100644 --- a/reactos/base/applications/taskmgr/lang/no-NO.rc +++ b/reactos/base/applications/taskmgr/lang/no-NO.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "Liste2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Avslutt prosess",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Vis prosesser fra alle brukere",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/pl-PL.rc b/reactos/base/applications/taskmgr/lang/pl-PL.rc index 5580b34b427..92b16c412e7 100644 --- a/reactos/base/applications/taskmgr/lang/pl-PL.rc +++ b/reactos/base/applications/taskmgr/lang/pl-PL.rc @@ -193,7 +193,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Zakoñcz proces",IDC_ENDPROCESS,171,189,69,14 CONTROL "Po&ka¿ procesy wszystkich u¿ytkowników",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/pt-BR.rc b/reactos/base/applications/taskmgr/lang/pt-BR.rc index db883b7c2b5..78fc16c17f6 100644 --- a/reactos/base/applications/taskmgr/lang/pt-BR.rc +++ b/reactos/base/applications/taskmgr/lang/pt-BR.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Finalizar processo",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Mostrar processos de todos os usuários",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/ro-RO.rc b/reactos/base/applications/taskmgr/lang/ro-RO.rc index cfa98a78518..5f179fabe60 100644 --- a/reactos/base/applications/taskmgr/lang/ro-RO.rc +++ b/reactos/base/applications/taskmgr/lang/ro-RO.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Oprire proces",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Afiºare procese de la toþi utilizatorii",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/ru-RU.rc b/reactos/base/applications/taskmgr/lang/ru-RU.rc index d32bc3ae851..7023ff51e76 100644 --- a/reactos/base/applications/taskmgr/lang/ru-RU.rc +++ b/reactos/base/applications/taskmgr/lang/ru-RU.rc @@ -187,7 +187,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Çàâåðøèòü ïðîöåññ",IDC_ENDPROCESS,162,189,79,14 CONTROL "&Ïðîöåññû âñåõ ïîëüçîâàòåëåé",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/sk-SK.rc b/reactos/base/applications/taskmgr/lang/sk-SK.rc index bed80a47059..3d3b4fc3775 100644 --- a/reactos/base/applications/taskmgr/lang/sk-SK.rc +++ b/reactos/base/applications/taskmgr/lang/sk-SK.rc @@ -187,7 +187,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Ukonèi proces",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Zobrazi procesy všetkých používate¾ov",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/sv-SE.rc b/reactos/base/applications/taskmgr/lang/sv-SE.rc index 3e1d87d3916..d51db891649 100644 --- a/reactos/base/applications/taskmgr/lang/sv-SE.rc +++ b/reactos/base/applications/taskmgr/lang/sv-SE.rc @@ -205,7 +205,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "&Avsluta process",IDC_ENDPROCESS,171,189,69,14 CONTROL "&Visa processer från alla användare",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/uk-UA.rc b/reactos/base/applications/taskmgr/lang/uk-UA.rc index 3e1a84bed50..41737ad8ab8 100644 --- a/reactos/base/applications/taskmgr/lang/uk-UA.rc +++ b/reactos/base/applications/taskmgr/lang/uk-UA.rc @@ -188,7 +188,7 @@ STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "Çí&ÿòè çàâäàííÿ",IDC_ENDPROCESS,171,189,69,14 CONTROL "&³äîáðàæàòè ïðîöåñè âñ³õ êîðèñòóâà÷³â",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/lang/zh-CN.rc b/reactos/base/applications/taskmgr/lang/zh-CN.rc index 7068ffbb14a..bb62579df77 100644 --- a/reactos/base/applications/taskmgr/lang/zh-CN.rc +++ b/reactos/base/applications/taskmgr/lang/zh-CN.rc @@ -196,7 +196,7 @@ STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | - LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "½áÊø½ø³Ì(&E)",IDC_ENDPROCESS,171,189,69,14 CONTROL "ÏÔʾËùÓÐÓû§µÄ½ø³Ì(&S)",IDC_SHOWALLPROCESSES, diff --git a/reactos/base/applications/taskmgr/procpage.c b/reactos/base/applications/taskmgr/procpage.c index bf1ec452923..595530c1a88 100644 --- a/reactos/base/applications/taskmgr/procpage.c +++ b/reactos/base/applications/taskmgr/procpage.c @@ -4,6 +4,7 @@ * procpage.c * * Copyright (C) 1999 - 2001 Brian Palmer + * Copyright (C) 2009 Maxime Vernier * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,6 +23,14 @@ #include +#define CMP(x1, x2)\ + (x1 < x2 ? -1 : (x1 > x2 ? 1 : 0)) + +typedef struct +{ + ULONG Index; +} PROCESS_PAGE_LIST_ITEM, *LPPROCESS_PAGE_LIST_ITEM; + HWND hProcessPage; /* Process List Property Page */ HWND hProcessPageListCtrl; /* Process ListCtrl Window */ @@ -31,12 +40,20 @@ HWND hProcessPageShowAllProcessesButton;/* Process Show All Processes checkbox * static int nProcessPageWidth; static int nProcessPageHeight; - +static BOOL bProcessSort = FALSE; +static BOOL bProcessSortAscending = FALSE; static HANDLE hProcessPageEvent = NULL; /* When this event becomes signaled then we refresh the process list */ +static ULONG ProcessSortColumnIndex = 0; +int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); +void AddProcess(ULONG Index); +void UpdateProcesses(); +void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes, DWORD *dwSeconds); void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam); void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount); void ProcessPageShowContextMenu(DWORD dwProcessId); +BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData); +BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount); DWORD WINAPI ProcessPageRefreshThread(void *lpParameter); INT_PTR CALLBACK @@ -158,8 +175,7 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam) LVITEM lvitem; ULONG Index; ULONG ColumnIndex; - IO_COUNTERS iocounters; - LARGE_INTEGER time; + LPPROCESS_PAGE_LIST_ITEM pData; idctrl = (int) wParam; pnmh = (LPNMHDR) lParam; @@ -182,147 +198,11 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam) if (!(pnmdi->item.mask & LVIF_TEXT)) break; + pData = (LPPROCESS_PAGE_LIST_ITEM)pnmdi->item.lParam; + Index = pData->Index; ColumnIndex = pnmdi->item.iSubItem; - Index = pnmdi->item.iItem; - if (ColumnDataHints[ColumnIndex] == COLUMN_IMAGENAME) - PerfDataGetImageName(Index, pnmdi->item.pszText, pnmdi->item.cchTextMax); - if (ColumnDataHints[ColumnIndex] == COLUMN_PID) - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetProcessId(Index)); - if (ColumnDataHints[ColumnIndex] == COLUMN_USERNAME) - PerfDataGetUserName(Index, pnmdi->item.pszText, pnmdi->item.cchTextMax); - if (ColumnDataHints[ColumnIndex] == COLUMN_SESSIONID) - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetSessionId(Index)); - if (ColumnDataHints[ColumnIndex] == COLUMN_CPUUSAGE) - wsprintfW(pnmdi->item.pszText, L"%02d", PerfDataGetCPUUsage(Index)); - if (ColumnDataHints[ColumnIndex] == COLUMN_CPUTIME) - { - DWORD dwHours; - DWORD dwMinutes; - DWORD dwSeconds; - - time = PerfDataGetCPUTime(Index); -#ifdef _MSC_VER - dwHours = (DWORD)(time.QuadPart / 36000000000L); - dwMinutes = (DWORD)((time.QuadPart % 36000000000L) / 600000000L); - dwSeconds = (DWORD)(((time.QuadPart % 36000000000L) % 600000000L) / 10000000L); -#else - dwHours = (DWORD)(time.QuadPart / 36000000000LL); - dwMinutes = (DWORD)((time.QuadPart % 36000000000LL) / 600000000LL); - dwSeconds = (DWORD)(((time.QuadPart % 36000000000LL) % 600000000LL) / 10000000LL); -#endif - wsprintfW(pnmdi->item.pszText, L"%d:%02d:%02d", dwHours, dwMinutes, dwSeconds); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGE) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetWorkingSetSizeBytes(Index) / 1024); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - wcscat(pnmdi->item.pszText, L" K"); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_PEAKMEMORYUSAGE) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetPeakWorkingSetSizeBytes(Index) / 1024); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - wcscat(pnmdi->item.pszText, L" K"); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGEDELTA) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetWorkingSetSizeDelta(Index) / 1024); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - wcscat(pnmdi->item.pszText, L" K"); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTS) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetPageFaultCount(Index)); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTSDELTA) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetPageFaultCountDelta(Index)); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_VIRTUALMEMORYSIZE) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetVirtualMemorySizeBytes(Index) / 1024); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - wcscat(pnmdi->item.pszText, L" K"); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEDPOOL) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetPagedPoolUsagePages(Index) / 1024); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - wcscat(pnmdi->item.pszText, L" K"); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_NONPAGEDPOOL) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetNonPagedPoolUsagePages(Index) / 1024); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - wcscat(pnmdi->item.pszText, L" K"); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_BASEPRIORITY) - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetBasePriority(Index)); - if (ColumnDataHints[ColumnIndex] == COLUMN_HANDLECOUNT) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetHandleCount(Index)); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_THREADCOUNT) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetThreadCount(Index)); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_USEROBJECTS) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetUSERObjectCount(Index)); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_GDIOBJECTS) - { - wsprintfW(pnmdi->item.pszText, L"%d", PerfDataGetGDIObjectCount(Index)); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADS) - { - PerfDataGetIOCounters(Index, &iocounters); - /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadOperationCount); */ - _ui64tow(iocounters.ReadOperationCount, pnmdi->item.pszText, 10); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITES) - { - PerfDataGetIOCounters(Index, &iocounters); - /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteOperationCount); */ - _ui64tow(iocounters.WriteOperationCount, pnmdi->item.pszText, 10); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHER) - { - PerfDataGetIOCounters(Index, &iocounters); - /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherOperationCount); */ - _ui64tow(iocounters.OtherOperationCount, pnmdi->item.pszText, 10); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADBYTES) - { - PerfDataGetIOCounters(Index, &iocounters); - /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadTransferCount); */ - _ui64tow(iocounters.ReadTransferCount, pnmdi->item.pszText, 10); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITEBYTES) - { - PerfDataGetIOCounters(Index, &iocounters); - /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteTransferCount); */ - _ui64tow(iocounters.WriteTransferCount, pnmdi->item.pszText, 10); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } - if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHERBYTES) - { - PerfDataGetIOCounters(Index, &iocounters); - /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherTransferCount); */ - _ui64tow(iocounters.OtherTransferCount, pnmdi->item.pszText, 10); - CommaSeparateNumberString(pnmdi->item.pszText, pnmdi->item.cchTextMax); - } + PerfDataGetText(Index, ColumnIndex, pnmdi->item.pszText, pnmdi->item.cchTextMax); break; @@ -358,12 +238,10 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam) { case HDN_ITEMCLICK: - /* - * FIXME: Fix the column sorting - * - *ListView_SortItems(hApplicationPageListCtrl, ApplicationPageCompareFunc, NULL); - *bSortAscending = !bSortAscending; - */ + ProcessSortColumnIndex = pnmhdr->iItem; + bProcessSortAscending = !bProcessSortAscending; + (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL); + bProcessSort = TRUE; break; @@ -381,7 +259,6 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam) } } - } void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount) @@ -513,8 +390,7 @@ DWORD WINAPI ProcessPageRefreshThread(void *lpParameter) /* Reset our event */ ResetEvent(hProcessPageEvent); - if ((ULONG)SendMessageW(hProcessPageListCtrl, LVM_GETITEMCOUNT, 0, 0) != PerfDataGetProcessCount()) - SendMessageW(hProcessPageListCtrl, LVM_SETITEMCOUNT, PerfDataGetProcessCount(), /*LVSICF_NOINVALIDATEALL|*/LVSICF_NOSCROLL); + UpdateProcesses(); if (IsWindowVisible(hProcessPage)) InvalidateRect(hProcessPageListCtrl, NULL, FALSE); @@ -533,3 +409,468 @@ DWORD WINAPI ProcessPageRefreshThread(void *lpParameter) } return 0; } + +void UpdateProcesses() +{ + int i; + BOOL found = FALSE; + ULONG l; + ULONG pid; + LV_ITEM item; + LPPROCESS_PAGE_LIST_ITEM pData; + PPERFDATA pPerfData; + + /* Remove old processes */ + for (i = 0; i < ListView_GetItemCount(hProcessPageListCtrl); i++) + { + memset(&item, 0, sizeof (LV_ITEM)); + item.mask = LVIF_PARAM; + item.iItem = i; + (void)ListView_GetItem(hProcessPageListCtrl, &item); + pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam; + (void)PerfDataGet(pData->Index, &pPerfData); + pid = PerfDataGetProcessId(pData->Index); + for (l = 0; l < PerfDataGetProcessCount(); l++) + { + if (PerfDataGetProcessId(l) == pid) + { + found = TRUE; + break; + } + } + if (!found) + { + (void)ListView_DeleteItem(hApplicationPageListCtrl, i); + HeapFree(GetProcessHeap(), 0, pData); + } + } + for (l = 0; l < PerfDataGetProcessCount(); l++) + { + AddProcess(l); + } + if (bProcessSort) + { + (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL); + } +} + +BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData) +{ + BOOL bSuccessful = FALSE; + + EnterCriticalSection(&PerfDataCriticalSection); + if (Index < ProcessCount) + { + *lppData = pPerfData + Index; + bSuccessful = TRUE; + } + LeaveCriticalSection(&PerfDataCriticalSection); + return bSuccessful; +} + +void AddProcess(ULONG Index) +{ + LPPROCESS_PAGE_LIST_ITEM pData; + int i; + LV_ITEM item; + BOOL bAlreadyInList = FALSE; + ULONG pid; + + pid = PerfDataGetProcessId(Index); + + /* Check to see if it's already in our list */ + for (i=0; iIndex) == pid) + { + bAlreadyInList = TRUE; + break; + } + } + if (!bAlreadyInList) /* Add */ + { + pData = (LPPROCESS_PAGE_LIST_ITEM)HeapAlloc(GetProcessHeap(), 0, sizeof(PROCESS_PAGE_LIST_ITEM)); + pData->Index = Index; + + /* Add the item to the list */ + memset(&item, 0, sizeof(LV_ITEM)); + item.mask = LVIF_TEXT|LVIF_PARAM; + item.pszText = LPSTR_TEXTCALLBACK; + item.iItem = ListView_GetItemCount(hProcessPageListCtrl); + item.lParam = (LPARAM)pData; + (void)ListView_InsertItem(hProcessPageListCtrl, &item); + } +} + +BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount) +{ + IO_COUNTERS iocounters; + LARGE_INTEGER time; + + if (ColumnDataHints[ColumnIndex] == COLUMN_IMAGENAME) + PerfDataGetImageName(Index, lpText, nMaxCount); + if (ColumnDataHints[ColumnIndex] == COLUMN_PID) + wsprintfW(lpText, L"%d", PerfDataGetProcessId(Index)); + if (ColumnDataHints[ColumnIndex] == COLUMN_USERNAME) + PerfDataGetUserName(Index, lpText, nMaxCount); + if (ColumnDataHints[ColumnIndex] == COLUMN_SESSIONID) + wsprintfW(lpText, L"%d", PerfDataGetSessionId(Index)); + if (ColumnDataHints[ColumnIndex] == COLUMN_CPUUSAGE) + wsprintfW(lpText, L"%02d", PerfDataGetCPUUsage(Index)); + if (ColumnDataHints[ColumnIndex] == COLUMN_CPUTIME) + { + DWORD dwHours; + DWORD dwMinutes; + DWORD dwSeconds; + + time = PerfDataGetCPUTime(Index); + gethmsfromlargeint(time, &dwHours, &dwMinutes, &dwSeconds); + wsprintfW(lpText, L"%d:%02d:%02d", dwHours, dwMinutes, dwSeconds); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGE) + { + wsprintfW(lpText, L"%d", PerfDataGetWorkingSetSizeBytes(Index) / 1024); + CommaSeparateNumberString(lpText, nMaxCount); + wcscat(lpText, L" K"); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_PEAKMEMORYUSAGE) + { + wsprintfW(lpText, L"%d", PerfDataGetPeakWorkingSetSizeBytes(Index) / 1024); + CommaSeparateNumberString(lpText, nMaxCount); + wcscat(lpText, L" K"); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGEDELTA) + { + wsprintfW(lpText, L"%d", PerfDataGetWorkingSetSizeDelta(Index) / 1024); + CommaSeparateNumberString(lpText, nMaxCount); + wcscat(lpText, L" K"); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTS) + { + wsprintfW(lpText, L"%d", PerfDataGetPageFaultCount(Index)); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTSDELTA) + { + wsprintfW(lpText, L"%d", PerfDataGetPageFaultCountDelta(Index)); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_VIRTUALMEMORYSIZE) + { + wsprintfW(lpText, L"%d", PerfDataGetVirtualMemorySizeBytes(Index) / 1024); + CommaSeparateNumberString(lpText, nMaxCount); + wcscat(lpText, L" K"); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEDPOOL) + { + wsprintfW(lpText, L"%d", PerfDataGetPagedPoolUsagePages(Index) / 1024); + CommaSeparateNumberString(lpText, nMaxCount); + wcscat(lpText, L" K"); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_NONPAGEDPOOL) + { + wsprintfW(lpText, L"%d", PerfDataGetNonPagedPoolUsagePages(Index) / 1024); + CommaSeparateNumberString(lpText, nMaxCount); + wcscat(lpText, L" K"); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_BASEPRIORITY) + wsprintfW(lpText, L"%d", PerfDataGetBasePriority(Index)); + if (ColumnDataHints[ColumnIndex] == COLUMN_HANDLECOUNT) + { + wsprintfW(lpText, L"%d", PerfDataGetHandleCount(Index)); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_THREADCOUNT) + { + wsprintfW(lpText, L"%d", PerfDataGetThreadCount(Index)); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_USEROBJECTS) + { + wsprintfW(lpText, L"%d", PerfDataGetUSERObjectCount(Index)); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_GDIOBJECTS) + { + wsprintfW(lpText, L"%d", PerfDataGetGDIObjectCount(Index)); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADS) + { + PerfDataGetIOCounters(Index, &iocounters); + /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadOperationCount); */ + _ui64tow(iocounters.ReadOperationCount, lpText, 10); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITES) + { + PerfDataGetIOCounters(Index, &iocounters); + /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteOperationCount); */ + _ui64tow(iocounters.WriteOperationCount, lpText, 10); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHER) + { + PerfDataGetIOCounters(Index, &iocounters); + /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherOperationCount); */ + _ui64tow(iocounters.OtherOperationCount, lpText, 10); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADBYTES) + { + PerfDataGetIOCounters(Index, &iocounters); + /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.ReadTransferCount); */ + _ui64tow(iocounters.ReadTransferCount, lpText, 10); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITEBYTES) + { + PerfDataGetIOCounters(Index, &iocounters); + /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.WriteTransferCount); */ + _ui64tow(iocounters.WriteTransferCount, lpText, 10); + CommaSeparateNumberString(lpText, nMaxCount); + } + if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHERBYTES) + { + PerfDataGetIOCounters(Index, &iocounters); + /* wsprintfW(pnmdi->item.pszText, L"%d", iocounters.OtherTransferCount); */ + _ui64tow(iocounters.OtherTransferCount, lpText, 10); + CommaSeparateNumberString(lpText, nMaxCount); + } + + return FALSE; +} + + +void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes, DWORD *dwSeconds) +{ +#ifdef _MSC_VER + *dwHours = (DWORD)(largeint.QuadPart / 36000000000L); + *dwMinutes = (DWORD)((largeint.QuadPart % 36000000000L) / 600000000L); + *dwSeconds = (DWORD)(((largeint.QuadPart % 36000000000L) % 600000000L) / 10000000L); +#else + *dwHours = (DWORD)(largeint.QuadPart / 36000000000LL); + *dwMinutes = (DWORD)((largeint.QuadPart % 36000000000LL) / 600000000LL); + *dwSeconds = (DWORD)(((largeint.QuadPart % 36000000000LL) % 600000000LL) / 10000000LL); +#endif +} + +int largeintcmp(LARGE_INTEGER l1, LARGE_INTEGER l2) +{ + int ret = 0; + DWORD dwHours1; + DWORD dwMinutes1; + DWORD dwSeconds1; + DWORD dwHours2; + DWORD dwMinutes2; + DWORD dwSeconds2; + + gethmsfromlargeint(l1, &dwHours1, &dwMinutes1, &dwSeconds1); + gethmsfromlargeint(l2, &dwHours2, &dwMinutes2, &dwSeconds2); + ret = CMP(dwHours1, dwHours2); + if (ret == 0) + { + ret = CMP(dwMinutes1, dwMinutes2); + if (ret == 0) + { + ret = CMP(dwSeconds1, dwSeconds2); + } + } + return ret; +} + +int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + int ret = 0; + LPPROCESS_PAGE_LIST_ITEM Param1; + LPPROCESS_PAGE_LIST_ITEM Param2; + ULONG ColumnIndex; + WCHAR text1[260]; + WCHAR text2[260]; + ULONG l1; + ULONG l2; + LARGE_INTEGER time1; + LARGE_INTEGER time2; + IO_COUNTERS iocounters1; + IO_COUNTERS iocounters2; + ULONGLONG ull1; + ULONGLONG ull2; + + if (bProcessSortAscending) { + Param1 = (LPPROCESS_PAGE_LIST_ITEM)lParam1; + Param2 = (LPPROCESS_PAGE_LIST_ITEM)lParam2; + } else { + Param1 = (LPPROCESS_PAGE_LIST_ITEM)lParam2; + Param2 = (LPPROCESS_PAGE_LIST_ITEM)lParam1; + } + ColumnIndex = ProcessSortColumnIndex; + + if (ColumnDataHints[ColumnIndex] == COLUMN_IMAGENAME) + { + PerfDataGetImageName(Param1->Index, text1, sizeof (text1) / sizeof (*text1)); + PerfDataGetImageName(Param2->Index, text2, sizeof (text2) / sizeof (*text2)); + ret = _wcsicmp(text1, text2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_PID) + { + l1 = PerfDataGetProcessId(Param1->Index); + l2 = PerfDataGetProcessId(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_USERNAME) + { + PerfDataGetUserName(Param1->Index, text1, sizeof (text1) / sizeof (*text1)); + PerfDataGetUserName(Param2->Index, text2, sizeof (text2) / sizeof (*text2)); + ret = _wcsicmp(text1, text2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_SESSIONID) + { + l1 = PerfDataGetSessionId(Param1->Index); + l2 = PerfDataGetSessionId(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_CPUUSAGE) + { + l1 = PerfDataGetCPUUsage(Param1->Index); + l2 = PerfDataGetCPUUsage(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_CPUTIME) + { + time1 = PerfDataGetCPUTime(Param1->Index); + time2 = PerfDataGetCPUTime(Param2->Index); + ret = largeintcmp(time1, time2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGE) + { + l1 = PerfDataGetWorkingSetSizeBytes(Param1->Index); + l2 = PerfDataGetWorkingSetSizeBytes(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_PEAKMEMORYUSAGE) + { + l1 = PerfDataGetPeakWorkingSetSizeBytes(Param1->Index); + l2 = PerfDataGetPeakWorkingSetSizeBytes(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_MEMORYUSAGEDELTA) + { + l1 = PerfDataGetWorkingSetSizeDelta(Param1->Index); + l2 = PerfDataGetWorkingSetSizeDelta(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTS) + { + l1 = PerfDataGetPageFaultCount(Param1->Index); + l2 = PerfDataGetPageFaultCount(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEFAULTSDELTA) + { + l1 = PerfDataGetPageFaultCountDelta(Param1->Index); + l2 = PerfDataGetPageFaultCountDelta(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_VIRTUALMEMORYSIZE) + { + l1 = PerfDataGetVirtualMemorySizeBytes(Param1->Index); + l2 = PerfDataGetVirtualMemorySizeBytes(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_PAGEDPOOL) + { + l1 = PerfDataGetPagedPoolUsagePages(Param1->Index); + l2 = PerfDataGetPagedPoolUsagePages(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_NONPAGEDPOOL) + { + l1 = PerfDataGetNonPagedPoolUsagePages(Param1->Index); + l2 = PerfDataGetNonPagedPoolUsagePages(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_BASEPRIORITY) + { + l1 = PerfDataGetBasePriority(Param1->Index); + l2 = PerfDataGetBasePriority(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_HANDLECOUNT) + { + l1 = PerfDataGetHandleCount(Param1->Index); + l2 = PerfDataGetHandleCount(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_THREADCOUNT) + { + l1 = PerfDataGetThreadCount(Param1->Index); + l2 = PerfDataGetThreadCount(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_USEROBJECTS) + { + l1 = PerfDataGetUSERObjectCount(Param1->Index); + l2 = PerfDataGetUSERObjectCount(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_GDIOBJECTS) + { + l1 = PerfDataGetGDIObjectCount(Param1->Index); + l2 = PerfDataGetGDIObjectCount(Param2->Index); + ret = CMP(l1, l2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADS) + { + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); + ull1 = iocounters1.ReadOperationCount; + ull2 = iocounters2.ReadOperationCount; + ret = CMP(ull1, ull2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITES) + { + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); + ull1 = iocounters1.WriteOperationCount; + ull2 = iocounters2.WriteOperationCount; + ret = CMP(ull1, ull2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHER) + { + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); + ull1 = iocounters1.OtherOperationCount; + ull2 = iocounters2.OtherOperationCount; + ret = CMP(ull1, ull2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_IOREADBYTES) + { + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); + ull1 = iocounters1.ReadTransferCount; + ull2 = iocounters2.ReadTransferCount; + ret = CMP(ull1, ull2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_IOWRITEBYTES) + { + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); + ull1 = iocounters1.WriteTransferCount; + ull2 = iocounters2.WriteTransferCount; + ret = CMP(ull1, ull2); + } + else if (ColumnDataHints[ColumnIndex] == COLUMN_IOOTHERBYTES) + { + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); + ull1 = iocounters1.OtherTransferCount; + ull2 = iocounters2.OtherTransferCount; + ret = CMP(ull1, ull2); + } + return ret; +} From 5c0c60f056352ec539511e93259141980302e64b Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 27 Jun 2009 20:52:33 +0000 Subject: [PATCH 129/577] - Fix callback set and changed data. Process hooks if we are hooked. svn path=/trunk/; revision=41646 --- reactos/dll/win32/user32/windows/hook.c | 2 ++ .../subsystems/win32/win32k/ntuser/callback.c | 21 ++++++++++++++--- .../subsystems/win32/win32k/ntuser/window.c | 23 ++++++++++++------- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index 1a7aa70f914..26d9a184314 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -480,6 +480,8 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength) case HCBT_SYSCOMMAND: case HCBT_DESTROYWND: case HCBT_QS: + wParam = Common->wParam; + lParam = Common->lParam; break; default: ERR("HCBT_ not supported = %d\n", Common->Code); diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 4fae54262f9..cb522d0f01c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -401,7 +401,7 @@ co_IntCallHookProc(INT HookId, case HCBT_CLICKSKIPPED: ArgumentLength += sizeof(MOUSEHOOKSTRUCT); break; -/* ATM pass on */ +/* ATM pass on */ case HCBT_KEYSKIPPED: case HCBT_MINMAX: case HCBT_SETFOCUS: @@ -469,7 +469,7 @@ co_IntCallHookProc(INT HookId, case HCBT_CREATEWND: Common->lParam = (LPARAM) (Extra - (PCHAR) Common); CbtCreatewndExtra = (PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS) Extra; - CbtCreatewndExtra->Cs = *(CbtCreateWnd->lpcs); + RtlCopyMemory( &CbtCreatewndExtra->Cs, CbtCreateWnd->lpcs, sizeof(CREATESTRUCTW) ); CbtCreatewndExtra->WndInsertAfter = CbtCreateWnd->hwndInsertAfter; Extra = (PCHAR) (CbtCreatewndExtra + 1); RtlCopyMemory(Extra, WindowName.Buffer, WindowName.Length); @@ -581,7 +581,22 @@ co_IntCallHookProc(INT HookId, { if (CbtCreatewndExtra) { - CbtCreateWnd->hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; + _SEH2_TRY + { /* + The parameters could have been changed, include the coordinates + and dimensions of the window. We copy it back. + */ + CbtCreateWnd->hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; + CbtCreateWnd->lpcs->x = CbtCreatewndExtra->Cs.x; + CbtCreateWnd->lpcs->y = CbtCreatewndExtra->Cs.y; + CbtCreateWnd->lpcs->cx = CbtCreatewndExtra->Cs.cx; + CbtCreateWnd->lpcs->cy = CbtCreatewndExtra->Cs.cy; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Result = 0; + } + _SEH2_END; } } diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index faa8417ab67..a08f33ef318 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -1883,18 +1883,22 @@ AllocErr: Cs.dwExStyle = dwExStyle; CbtCreate.lpcs = &Cs; CbtCreate.hwndInsertAfter = HWND_TOP; - if (co_HOOK_CallHooks(WH_CBT, HCBT_CREATEWND, (WPARAM) hWnd, (LPARAM) &CbtCreate)) + if (ISITHOOKED(WH_CBT)) { - /* FIXME - Delete window object and remove it from the thread windows list */ - /* FIXME - delete allocated DCE */ - DPRINT1("CBT-hook returned !0\n"); - RETURN( (HWND) NULL); + if (co_HOOK_CallHooks(WH_CBT, HCBT_CREATEWND, (WPARAM) hWnd, (LPARAM) &CbtCreate)) + { + /* FIXME - Delete window object and remove it from the thread windows list */ + /* FIXME - delete allocated DCE */ + DPRINT1("CBT-hook returned !0\n"); + RETURN( (HWND) NULL); + } } - x = Cs.x; y = Cs.y; nWidth = Cs.cx; nHeight = Cs.cy; +// FIXME: Need to set the Z order in the window link list if the hook callback changed it! +// hwndInsertAfter = CbtCreate.hwndInsertAfter; /* default positioning for overlapped windows */ if(!(Wnd->Style & (WS_POPUP | WS_CHILD))) @@ -2396,9 +2400,12 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) { BOOLEAN isChild; PWINDOW Wnd; + HWND hWnd; ASSERT_REFS_CO(Window); // FIXME: temp hack? + hWnd = Window->hSelf; + Wnd = Window->Wnd; if (!Wnd) return TRUE; // FIXME: Need to finish object rewrite or lock the thread when killing the window! @@ -2430,9 +2437,9 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) IntDereferenceMessageQueue(Window->MessageQueue); /* Call hooks */ - if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) Window->hSelf, 0)) + if (ISITHOOKED(WH_CBT)) { - return FALSE; + if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) hWnd, 0)) return FALSE; } IntEngWindowChanged(Window, WOC_DELETE); From d7a781de8230d4416dd3d7802b3381bdabfa87b3 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sat, 27 Jun 2009 22:05:53 +0000 Subject: [PATCH 130/577] Taskmgr didn't build without compilation units, moving PerfDataGet to perfdata functions fixes it. svn path=/trunk/; revision=41647 --- reactos/base/applications/taskmgr/perfdata.c | 15 +++++++++++++++ reactos/base/applications/taskmgr/perfdata.h | 1 + reactos/base/applications/taskmgr/procpage.c | 15 --------------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/reactos/base/applications/taskmgr/perfdata.c b/reactos/base/applications/taskmgr/perfdata.c index c8176a4ee5c..f9f52bf966f 100644 --- a/reactos/base/applications/taskmgr/perfdata.c +++ b/reactos/base/applications/taskmgr/perfdata.c @@ -901,3 +901,18 @@ ULONG PerfDataGetTotalThreadCount(void) return ThreadCount; } + +BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData) +{ + BOOL bSuccessful = FALSE; + + EnterCriticalSection(&PerfDataCriticalSection); + if (Index < ProcessCount) + { + *lppData = pPerfData + Index; + bSuccessful = TRUE; + } + LeaveCriticalSection(&PerfDataCriticalSection); + return bSuccessful; +} + diff --git a/reactos/base/applications/taskmgr/perfdata.h b/reactos/base/applications/taskmgr/perfdata.h index de26d6acf4f..6b31394a36d 100644 --- a/reactos/base/applications/taskmgr/perfdata.h +++ b/reactos/base/applications/taskmgr/perfdata.h @@ -60,6 +60,7 @@ BOOL PerfDataInitialize(void); void PerfDataUninitialize(void); void PerfDataRefresh(void); +BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData); ULONG PerfDataGetProcessCount(void); ULONG PerfDataGetProcessorUsage(void); ULONG PerfDataGetProcessorSystemUsage(void); diff --git a/reactos/base/applications/taskmgr/procpage.c b/reactos/base/applications/taskmgr/procpage.c index 595530c1a88..840086294c8 100644 --- a/reactos/base/applications/taskmgr/procpage.c +++ b/reactos/base/applications/taskmgr/procpage.c @@ -52,7 +52,6 @@ void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam); void CommaSeparateNumberString(LPWSTR strNumber, int nMaxCount); void ProcessPageShowContextMenu(DWORD dwProcessId); -BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData); BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCount); DWORD WINAPI ProcessPageRefreshThread(void *lpParameter); @@ -454,20 +453,6 @@ void UpdateProcesses() } } -BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData) -{ - BOOL bSuccessful = FALSE; - - EnterCriticalSection(&PerfDataCriticalSection); - if (Index < ProcessCount) - { - *lppData = pPerfData + Index; - bSuccessful = TRUE; - } - LeaveCriticalSection(&PerfDataCriticalSection); - return bSuccessful; -} - void AddProcess(ULONG Index) { LPPROCESS_PAGE_LIST_ITEM pData; From b254273e3b3c25dcaeffdc70dc9627a51f4d0620 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 22:16:47 +0000 Subject: [PATCH 131/577] - Call MmArmInitSystem for a second time, this time in Phase 1. - This will call MmInitializeMemoryLimits (now implemented) which will go ahead and create the MmPhysicalMemoryBlock. - This block contains the physical memory "runs" that are valid on the system, allowing the PFN database to differentiate between valid and non-valid RAM (instead of marking things as "BIOS"). - Also this will come in handy later for various utilities. svn path=/trunk/; revision=41648 --- reactos/ntoskrnl/mm/ARM3/init.c | 174 ++++++++++++++++++++++++++++++- reactos/ntoskrnl/mm/ARM3/miarm.h | 14 +++ reactos/ntoskrnl/mm/mminit.c | 7 +- 3 files changed, 193 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index f946909b93c..20739755851 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -108,12 +108,16 @@ ULONG MmNumberOfSystemPtes; // ULONG MxPfnAllocation; - // // The ARM³ PFN Database // PMMPFN MmArmPfnDatabase; +// +// This structure describes the different pieces of RAM-backed address space +// +PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock; + /* PRIVATE FUNCTIONS **********************************************************/ // @@ -139,6 +143,142 @@ MiSyncARM3WithROS(IN PVOID AddressStart, } } +PPHYSICAL_MEMORY_DESCRIPTOR +NTAPI +MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType) +{ + PLIST_ENTRY NextEntry; + ULONG Run = 0, InitialRuns = 0; + PFN_NUMBER NextPage = -1, PageCount = 0; + PPHYSICAL_MEMORY_DESCRIPTOR Buffer, NewBuffer; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + + // + // Scan the memory descriptors + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + // + // For each one, increase the memory allocation estimate + // + InitialRuns++; + NextEntry = NextEntry->Flink; + } + + // + // Allocate the maximum we'll ever need + // + Buffer = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + + sizeof(PHYSICAL_MEMORY_RUN) * + (InitialRuns - 1), + 'lMmM'); + if (!Buffer) return NULL; + + // + // For now that's how many runs we have + // + Buffer->NumberOfRuns = InitialRuns; + + // + // Now loop through the descriptors again + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + // + // Grab each one, and check if it's one we should include + // + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType < LoaderMaximum) && + (IncludeType[MdBlock->MemoryType])) + { + // + // Add this to our running total + // + PageCount += MdBlock->PageCount; + + // + // Check if the next page is described by the next descriptor + // + if (MdBlock->BasePage == NextPage) + { + // + // Combine it into the same physical run + // + ASSERT(MdBlock->PageCount != 0); + Buffer->Run[Run - 1].PageCount += MdBlock->PageCount; + NextPage += MdBlock->PageCount; + } + else + { + // + // Otherwise just duplicate the descriptor's contents + // + Buffer->Run[Run].BasePage = MdBlock->BasePage; + Buffer->Run[Run].PageCount = MdBlock->PageCount; + NextPage = Buffer->Run[Run].BasePage + Buffer->Run[Run].PageCount; + + // + // And in this case, increase the number of runs + // + Run++; + } + } + + // + // Try the next descriptor + // + NextEntry = MdBlock->ListEntry.Flink; + } + + // + // We should not have been able to go past our initial estimate + // + ASSERT(Run <= Buffer->NumberOfRuns); + + // + // Our guess was probably exaggerated... + // + if (InitialRuns > Run) + { + // + // Allocate a more accurately sized buffer + // + NewBuffer = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + + sizeof(PHYSICAL_MEMORY_RUN) * + (Run - 1), + 'lMmM'); + if (NewBuffer) + { + // + // Copy the old buffer into the new, then free it + // + RtlCopyMemory(NewBuffer->Run, + NewBuffer->Run, + sizeof(PHYSICAL_MEMORY_RUN) * Run); + ExFreePool(Buffer); + + // + // Now use the new buffer + // + Buffer = NewBuffer; + } + } + + // + // Write the final numbers, and return it + // + Buffer->NumberOfRuns = Run; + Buffer->NumberOfPages = PageCount; + return Buffer; +} + NTSTATUS NTAPI MmArmInitSystem(IN ULONG Phase, @@ -152,6 +292,8 @@ MmArmInitSystem(IN ULONG Phase, PVOID NonPagedPoolExpansionVa, BaseAddress; NTSTATUS Status; ULONG OldCount; + BOOLEAN IncludeType[LoaderMaximum]; + ULONG i; BoundaryAddressMultiple.QuadPart = Low.QuadPart = 0; High.QuadPart = -1; @@ -565,6 +707,36 @@ MmArmInitSystem(IN ULONG Phase, MiSyncARM3WithROS(MmNonPagedPoolStart, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); } + else + { + // + // Instantiate memory that we don't consider RAM/usable + // We use the same exclusions that Windows does, in order to try to be + // compatible with WinLDR-style booting + // + for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE; + IncludeType[LoaderBad] = FALSE; + IncludeType[LoaderFirmwarePermanent] = FALSE; + IncludeType[LoaderSpecialMemory] = FALSE; + IncludeType[LoaderBBTMemory] = FALSE; + + // + // Build the physical memory block + // + MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock, + IncludeType); + for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++) + { + // + // Dump it for debugging + // + PPHYSICAL_MEMORY_RUN Run; + Run = &MmPhysicalMemoryBlock->Run[i]; + DPRINT1("PHYSICAL RAM [0x%08p to 0x%08p]\n", + Run->BasePage << PAGE_SHIFT, + (Run->BasePage + Run->PageCount) << PAGE_SHIFT); + } + } // // Always return success for now diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 9d490471701..aa9850b649d 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -28,6 +28,19 @@ typedef enum _MI_PFN_CACHE_ATTRIBUTE MiNotMapped } MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE; +typedef struct _PHYSICAL_MEMORY_RUN +{ + ULONG BasePage; + ULONG PageCount; +} PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN; + +typedef struct _PHYSICAL_MEMORY_DESCRIPTOR +{ + ULONG NumberOfRuns; + ULONG NumberOfPages; + PHYSICAL_MEMORY_RUN Run[1]; +} PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR; + extern MMPTE HyperTemplatePte; extern ULONG MmSizeOfNonPagedPoolInBytes; @@ -36,6 +49,7 @@ extern PVOID MmNonPagedPoolStart; extern PVOID MmNonPagedPoolExpansionStart; extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte; extern PMMPTE MiFirstReservedZeroingPte; +extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock; VOID NTAPI diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 84806ef8d7e..117bbcc11a3 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -376,7 +376,7 @@ MmInit1(VOID) MmInitializePageList(); // - // Initialize ARM³ + // Initialize ARM³ in phase 0 // MmArmInitSystem(0, KeLoaderBlock); @@ -391,6 +391,11 @@ MmInit1(VOID) /* Initialize working sets */ MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); + + // + // Initialize ARM³ in phase 1 + // + MmArmInitSystem(1, KeLoaderBlock); } BOOLEAN From e52bb6e5accd915316b0c764504a0f6841a1900f Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 22:39:03 +0000 Subject: [PATCH 132/577] - Actually it seems MmGetPhysicalMemoryRanges uses the MmPhysicalMemoryBlock, so go ahead and implement that function. - Thanks to Matthieu Suiche (http://www.msuiche.net/2008/09/17/retrieving-mmphysicalmemoryblock-regardless-of-the-nt-version/). - Move physical.c into ARM3 and call it dynamic.c since these functions are for Dynamic Memory (Hotplug) for Server 2003. - Remove the old copyright header, as copy-pasting 5 DDK function definitions and rewriting them to say UNIMPLEMENTED isn't much of a copyright. svn path=/trunk/; revision=41649 --- reactos/ntoskrnl/mm/ARM3/dynamic.c | 127 +++++++++++++++++++++++ reactos/ntoskrnl/mm/physical.c | 74 ------------- reactos/ntoskrnl/ntoskrnl-generic.rbuild | 2 +- 3 files changed, 128 insertions(+), 75 deletions(-) create mode 100644 reactos/ntoskrnl/mm/ARM3/dynamic.c delete mode 100644 reactos/ntoskrnl/mm/physical.c diff --git a/reactos/ntoskrnl/mm/ARM3/dynamic.c b/reactos/ntoskrnl/mm/ARM3/dynamic.c new file mode 100644 index 00000000000..3f7cf727e58 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/dynamic.c @@ -0,0 +1,127 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/dynamic.c + * PURPOSE: ARM Memory Manager Dynamic Physical Memory Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::DYNAMIC" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* FUNCTIONS *****************************************************************/ + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +MmAddPhysicalMemory (IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +MmMarkPhysicalMemoryAsBad(IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +MmMarkPhysicalMemoryAsGood(IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +MmRemovePhysicalMemory(IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @implemented + */ +PPHYSICAL_MEMORY_RANGE +NTAPI +MmGetPhysicalMemoryRanges(VOID) +{ + ULONG Size, i; + PPHYSICAL_MEMORY_RANGE Entry, Buffer; + KIRQL OldIrql; + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + + // + // Calculate how much memory we'll need + // + Size = sizeof(PHYSICAL_MEMORY_RANGE) * (MmPhysicalMemoryBlock->NumberOfRuns + 1); + + // + // Allocate a copy + // + Entry = Buffer = ExAllocatePoolWithTag(NonPagedPool, Size, 'hPmM'); + if (!Buffer) return NULL; + + // + // Lock the PFN database + // + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + // + // Make sure it hasn't changed before we had acquired the lock + // + ASSERT(Size == (sizeof(PHYSICAL_MEMORY_RANGE) * + (MmPhysicalMemoryBlock->NumberOfRuns + 1))); + + // + // Now loop our block + // + for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++) + { + // + // Copy the data, but format it into bytes + // + Entry->BaseAddress.QuadPart = MmPhysicalMemoryBlock->Run[i].BasePage << PAGE_SHIFT; + Entry->NumberOfBytes.QuadPart = MmPhysicalMemoryBlock->Run[i].PageCount << PAGE_SHIFT; + Entry++; + } + + // + // Last entry is empty + // + Entry->BaseAddress.QuadPart = 0; + Entry->NumberOfBytes.QuadPart = 0; + + // + // Release the lock and return + // + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + return Buffer; +} diff --git a/reactos/ntoskrnl/mm/physical.c b/reactos/ntoskrnl/mm/physical.c deleted file mode 100644 index 0a04f230ea3..00000000000 --- a/reactos/ntoskrnl/mm/physical.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: GPL - See COPYING in the top level directory - * FILE: ntoskrnl/mm/physical.c - * PURPOSE: Physical Memory Manipulation Routines - * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES *****************************************************************/ - -#include -#define NDEBUG -#include - -/* FUNCTIONS *****************************************************************/ - -/* - * @unimplemented - */ -NTSTATUS -NTAPI -MmAddPhysicalMemory (IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -/* - * @unimplemented - */ -NTSTATUS -NTAPI -MmMarkPhysicalMemoryAsBad(IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -/* - * @unimplemented - */ -NTSTATUS -NTAPI -MmMarkPhysicalMemoryAsGood(IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -/* - * @unimplemented - */ -NTSTATUS -NTAPI -MmRemovePhysicalMemory(IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -/* - * @unimplemented - */ -PPHYSICAL_MEMORY_RANGE -NTAPI -MmGetPhysicalMemoryRanges(VOID) -{ - UNIMPLEMENTED; - return 0; -} diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 854e1ad6e4d..cb0d4c6d7c5 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -360,6 +360,7 @@ + dynamic.c hypermap.c init.c iosup.c @@ -384,7 +385,6 @@ pagefile.c pageop.c pe.c - physical.c pool.c ppool.c procsup.c From 39374c3ad4ccbe1075c53ab7828f101a2abaa307 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 27 Jun 2009 22:51:23 +0000 Subject: [PATCH 133/577] - Copying from destination to destination isn't very smart. - Fix bug when creating the physical memory descriptor block. svn path=/trunk/; revision=41650 --- reactos/ntoskrnl/mm/ARM3/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index 20739755851..40b2036d5ad 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -260,7 +260,7 @@ MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock, // Copy the old buffer into the new, then free it // RtlCopyMemory(NewBuffer->Run, - NewBuffer->Run, + Buffer->Run, sizeof(PHYSICAL_MEMORY_RUN) * Run); ExFreePool(Buffer); From 8af77479df0da7cc17c851c51968391628072014 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 27 Jun 2009 23:12:22 +0000 Subject: [PATCH 134/577] Don't save/change/restore the DC pen in IntDrawScrollInterior, where it's not used at all. svn path=/trunk/; revision=41651 --- reactos/dll/win32/user32/controls/scrollbar.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/reactos/dll/win32/user32/controls/scrollbar.c b/reactos/dll/win32/user32/controls/scrollbar.c index fcba0efef6b..0bafefe0573 100644 --- a/reactos/dll/win32/user32/controls/scrollbar.c +++ b/reactos/dll/win32/user32/controls/scrollbar.c @@ -99,7 +99,6 @@ IntDrawScrollInterior(HWND hWnd, HDC hDC, INT nBar, BOOL Vertical, INT ThumbSize = ScrollBarInfo->xyThumbBottom - ScrollBarInfo->xyThumbTop; INT ThumbTop = ScrollBarInfo->xyThumbTop; RECT Rect; - HPEN hSavePen; HBRUSH hSaveBrush, hBrush; BOOL TopSelected = FALSE, BottomSelected = FALSE; @@ -124,7 +123,6 @@ IntDrawScrollInterior(HWND hWnd, HDC hDC, INT nBar, BOOL Vertical, hBrush = DefWndControlColor(hDC, CTLCOLOR_SCROLLBAR); } - hSavePen = SelectObject(hDC, GetSysColorPen(COLOR_WINDOWFRAME)); hSaveBrush = SelectObject(hDC, hBrush); /* Calculate the scroll rectangle */ @@ -150,7 +148,6 @@ IntDrawScrollInterior(HWND hWnd, HDC hDC, INT nBar, BOOL Vertical, Rect.bottom - Rect.top, PATCOPY); /* Cleanup and return */ - SelectObject(hDC, hSavePen); SelectObject(hDC, hSaveBrush); return; } @@ -207,7 +204,6 @@ IntDrawScrollInterior(HWND hWnd, HDC hDC, INT nBar, BOOL Vertical, DrawEdge(hDC, &Rect, EDGE_RAISED, BF_RECT | BF_MIDDLE); /* Cleanup */ - SelectObject(hDC, hSavePen); SelectObject(hDC, hSaveBrush); } From 36526f915765d3daccf711d87887c8ef35c64827 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 27 Jun 2009 23:33:57 +0000 Subject: [PATCH 135/577] Update SERVERINFO, PFNCLIENT, PFNCLIENTWORKER to Windows 7 version, add OEMBITMAPINFO, DPISERVERINFO, PERUSERSERVERINFO Add -fms-extensions compilerflag to user32, win32k, csrss, win32csr. svn path=/trunk/; revision=41652 --- reactos/dll/win32/user32/misc/desktop.c | 2 +- reactos/dll/win32/user32/user32.rbuild | 2 +- reactos/dll/win32/user32/windows/defwnd.c | 4 +- reactos/include/reactos/win32k/ntuser.h | 201 ++++++++++++------ reactos/subsystems/win32/csrss/csrss.rbuild | 1 + .../win32/csrss/win32csr/win32csr.rbuild | 1 + .../subsystems/win32/win32k/ntuser/metric.c | 6 +- .../win32/win32k/ntuser/simplecall.c | 2 +- .../win32/win32k/ntuser/sysparams.c | 4 +- .../subsystems/win32/win32k/ntuser/winsta.c | 2 +- .../win32/win32k/objects/stockobj.c | 24 +-- reactos/subsystems/win32/win32k/win32k.rbuild | 1 + 12 files changed, 166 insertions(+), 84 deletions(-) diff --git a/reactos/dll/win32/user32/misc/desktop.c b/reactos/dll/win32/user32/misc/desktop.c index fbf519987a5..c02e2a87405 100644 --- a/reactos/dll/win32/user32/misc/desktop.c +++ b/reactos/dll/win32/user32/misc/desktop.c @@ -102,7 +102,7 @@ GetSystemMetrics(int nIndex) GetConnected(); // FIXME("Global Sever Data -> %x\n",g_psi); if (nIndex < 0 || nIndex >= SM_CMETRICS) return 0; - return g_psi->SystemMetrics[nIndex]; + return g_psi->aiSysMet[nIndex]; } diff --git a/reactos/dll/win32/user32/user32.rbuild b/reactos/dll/win32/user32/user32.rbuild index 5f955a654b5..897c69a7a51 100644 --- a/reactos/dll/win32/user32/user32.rbuild +++ b/reactos/dll/win32/user32/user32.rbuild @@ -11,7 +11,7 @@ win32ksys pseh ntdll - + -fms-extensions -fno-unit-at-a-time diff --git a/reactos/dll/win32/crypt32/crypt32.rc b/reactos/dll/win32/crypt32/crypt32.rc deleted file mode 100644 index 1afa8a75296..00000000000 --- a/reactos/dll/win32/crypt32/crypt32.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * crypt32 dll resources - * - * Copyright (C) 2006 Juan Lang - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "cryptres.h" - -#include "version.rc" - -#include "crypt32_De.rc" -#include "crypt32_En.rc" -#include "crypt32_Fr.rc" -#include "crypt32_Ko.rc" -#include "crypt32_Nl.rc" -#include "crypt32_No.rc" -#include "crypt32_Pt.rc" -#include "crypt32_Sv.rc" diff --git a/reactos/dll/win32/crypt32/crypt32.spec b/reactos/dll/win32/crypt32/crypt32.spec index 3591d17d234..534bee7319f 100644 --- a/reactos/dll/win32/crypt32/crypt32.spec +++ b/reactos/dll/win32/crypt32/crypt32.spec @@ -20,6 +20,7 @@ @ stdcall CertCreateCTLContext(long ptr long) @ stdcall CertCreateCertificateChainEngine(ptr ptr) @ stdcall CertCreateCertificateContext(long ptr long) +@ stdcall CertCreateContext(long long ptr long long ptr) @ stdcall CertCreateSelfSignCertificate(long ptr long ptr ptr ptr ptr ptr) @ stdcall CertDeleteCRLFromStore(ptr) @ stdcall CertDeleteCTLFromStore(ptr) @@ -162,7 +163,7 @@ @ stdcall CryptQueryObject(long ptr long long long ptr ptr ptr ptr ptr ptr) @ stdcall CryptRegisterDefaultOIDFunction(long str long wstr) @ stdcall CryptRegisterOIDFunction(long str str wstr str) -@ stub CryptRegisterOIDInfo +@ stdcall CryptRegisterOIDInfo(ptr long) @ stdcall CryptSIPAddProvider(ptr) @ stdcall CryptSIPCreateIndirectData(ptr ptr ptr) @ stdcall CryptSIPGetSignedDataMsg(ptr ptr long ptr ptr) diff --git a/reactos/dll/win32/crypt32/crypt32_De.rc b/reactos/dll/win32/crypt32/crypt32_De.rc index 1d9cbb790e0..0a8bd3871e4 100644 --- a/reactos/dll/win32/crypt32/crypt32_De.rc +++ b/reactos/dll/win32/crypt32/crypt32_De.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL #pragma code_page(65001) @@ -239,5 +241,3 @@ STRINGTABLE DISCARDABLE IDS_NETSCAPE_SMIME_CA "S/MIME Zertifikationsautorität" IDS_NETSCAPE_SIGN_CA "Zertifikationsautorität der Signatur" } - -#pragma code_page(default) diff --git a/reactos/dll/win32/crypt32/crypt32_En.rc b/reactos/dll/win32/crypt32/crypt32_En.rc index e24ce860f67..4670029f310 100644 --- a/reactos/dll/win32/crypt32/crypt32_En.rc +++ b/reactos/dll/win32/crypt32/crypt32_En.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/crypt32/crypt32_Fr.rc b/reactos/dll/win32/crypt32/crypt32_Fr.rc index 35ade1e1a9e..030a3a98500 100644 --- a/reactos/dll/win32/crypt32/crypt32_Fr.rc +++ b/reactos/dll/win32/crypt32/crypt32_Fr.rc @@ -2,6 +2,7 @@ * crypt32 dll French resources * * Copyright 2006-2009 Jonathan Ernst + * Copyright 2009 Frédéric Delanoy * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,221 +19,225 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + +#pragma code_page(65001) + LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE { - IDS_AUTHORITY_KEY_ID "Identifiant de l'authorité de la clé" - IDS_KEY_ATTRIBUTES "Attributs de la clé" - IDS_KEY_USAGE_RESTRICTION "Restrictions de l'utilisation de la clé" - IDS_SUBJECT_ALT_NAME "Subject Alternative Name" - IDS_ISSUER_ALT_NAME "Issuer Alternative Name" - IDS_BASIC_CONSTRAINTS "Basic Constraints" - IDS_KEY_USAGE "Utilisation de la clé" - IDS_CERT_POLICIES "Certificate Policies" - IDS_SUBJECT_KEY_IDENTIFIER "Subject Key Identifier" - IDS_CRL_REASON_CODE "CRL Reason Code" - IDS_CRL_DIST_POINTS "CRL Distribution Points" - IDS_ENHANCED_KEY_USAGE "Enhanced Key Usage" - IDS_AUTHORITY_INFO_ACCESS "Authority Information Access" - IDS_CERT_EXTENSIONS "Certificate Extensions" - IDS_NEXT_UPDATE_LOCATION "Next Update Location" - IDS_YES_OR_NO_TRUST "Yes or No Trust" - IDS_EMAIL_ADDRESS "Email Address" - IDS_UNSTRUCTURED_NAME "Unstructured Name" - IDS_CONTENT_TYPE "Content Type" - IDS_MESSAGE_DIGEST "Message Digest" - IDS_SIGNING_TIME "Signing Time" - IDS_COUNTER_SIGN "Counter Sign" - IDS_CHALLENGE_PASSWORD "Challenge Password" - IDS_UNSTRUCTURED_ADDRESS "Unstructured Address" - IDS_SMIME_CAPABILITIES "SMIME Capabilities" - IDS_PREFER_SIGNED_DATA "Prefer Signed Data" - IDS_CPS "CPS" + IDS_AUTHORITY_KEY_ID "Identifiant de l'autorité de la clé" + IDS_KEY_ATTRIBUTES "Attributs de la clé" + IDS_KEY_USAGE_RESTRICTION "Restrictions de l'utilisation de la clé" + IDS_SUBJECT_ALT_NAME "Nom alternatif du sujet" + IDS_ISSUER_ALT_NAME "Nom alternatif de l'émetteur" + IDS_BASIC_CONSTRAINTS "Contraintes de base" + IDS_KEY_USAGE "Utilisation de la clé" + IDS_CERT_POLICIES "Politiques de certificats" + IDS_SUBJECT_KEY_IDENTIFIER "Identifiant de clé du sujet" + IDS_CRL_REASON_CODE "Code de raison pour la LRC" + IDS_CRL_DIST_POINTS "Points de distribution de LRC" + IDS_ENHANCED_KEY_USAGE "Utilisation complémentaire de la clé" + IDS_AUTHORITY_INFO_ACCESS "Accès aux informations de l'autorité" + IDS_CERT_EXTENSIONS "Extensions de certificats" + IDS_NEXT_UPDATE_LOCATION "Emplacement de la mise à jour suivante" + IDS_YES_OR_NO_TRUST "Confiance Oui ou Non" + IDS_EMAIL_ADDRESS "Adresse électronique" + IDS_UNSTRUCTURED_NAME "Nom non structuré" + IDS_CONTENT_TYPE "Type de contenu" + IDS_MESSAGE_DIGEST "Empreinte du message" + IDS_SIGNING_TIME "Heure de la signature" + IDS_COUNTER_SIGN "Contresignature" + IDS_CHALLENGE_PASSWORD "Mot de passe défi" + IDS_UNSTRUCTURED_ADDRESS "Adresse non structurée" + IDS_SMIME_CAPABILITIES "Aptitudes SMIME" + IDS_PREFER_SIGNED_DATA "Préférer les données signées" + IDS_CPS "Énoncé des pratiques de certification (CPS)" IDS_USER_NOTICE "Notice utilisateur" - IDS_OCSP "On-line Certificate Status Protocol" - IDS_CA_ISSUER "Certification Authority Issuer" - IDS_CERT_TEMPLATE_NAME "Certification Template Name" - IDS_CERT_TYPE "Certificate Type" + IDS_OCSP "Protocole de vérification en ligne de certificat" + IDS_CA_ISSUER "Émetteur de l'autorité de certification" + IDS_CERT_TEMPLATE_NAME "Nom de modèle de certification" + IDS_CERT_TYPE "Type de certificat" IDS_CERT_MANIFOLD "Certificate Manifold" IDS_NETSCAPE_CERT_TYPE "Type de certificat Netscape" IDS_NETSCAPE_BASE_URL "URL Netscape de base" - IDS_NETSCAPE_REVOCATION_URL "URL Netscape de révocation" - IDS_NETSCAPE_CA_REVOCATION_URL "URL Netscape de révocation du certificat" + IDS_NETSCAPE_REVOCATION_URL "URL Netscape de révocation" + IDS_NETSCAPE_CA_REVOCATION_URL "URL Netscape de révocation de l'AC" IDS_NETSCAPE_CERT_RENEWAL_URL "URL Netscape de renouvellement du certificat" - IDS_NETSCAPE_CA_POLICY_URL "Netscape CA Policy URL" - IDS_NETSCAPE_SSL_SERVER_NAME "Netscape SSL ServerName" + IDS_NETSCAPE_CA_POLICY_URL "URL Netscape des stratégies d'ACL" + IDS_NETSCAPE_SSL_SERVER_NAME "Nom du serveur SSL de Netscape" IDS_NETSCAPE_COMMENT "Commentaire Netscape" IDS_SPC_SP_AGENCY_INFO "SpcSpAgencyInfo" IDS_SPC_FINANCIAL_CRITERIA "SpcFinancialCriteria" IDS_SPC_MINIMAL_CRITERIA "SpcMinimalCriteria" - IDS_COUNTRY "Pays/Région" + IDS_COUNTRY "Pays/Région" IDS_ORGANIZATION "Organisation" - IDS_ORGANIZATIONAL_UNIT "Unité d'organisation" + IDS_ORGANIZATIONAL_UNIT "Unité d'organisation" IDS_COMMON_NAME "Nom commun" - IDS_LOCALITY "Locality" - IDS_STATE_OR_PROVINCE "État ou province" + IDS_LOCALITY "Localité" + IDS_STATE_OR_PROVINCE "État ou province" IDS_TITLE "Titre" - IDS_GIVEN_NAME "Nom donné" + IDS_GIVEN_NAME "Nom donné" IDS_INITIALS "Initiales" IDS_SUR_NAME "Nom de famille" - IDS_DOMAIN_COMPONENT "Domain Component" + IDS_DOMAIN_COMPONENT "Composant de domaine" IDS_STREET_ADDRESS "Adresse" - IDS_SERIAL_NUMBER "Numéro de série" + IDS_SERIAL_NUMBER "Numéro de série" IDS_CA_VERSION "Version du CA" - IDS_CROSS_CA_VERSION "Cross CA Version" - IDS_SERIALIZED_SIG_SERIAL_NUMBER "Serialized Signature Serial Number" + IDS_CROSS_CA_VERSION "Version de certification croisées d'AC" + IDS_SERIALIZED_SIG_SERIAL_NUMBER "Numéro de série de signature sérialisée" IDS_PRINCIPAL_NAME "Nom principal" - IDS_WINDOWS_PRODUCT_UPDATE "Mise à jour de Windows" - IDS_ENROLLMENT_NAME_VALUE_PAIR "Enrollment Name Value Pair" - IDS_OS_VERSION "Version du système d'exploitation" - IDS_ENROLLMENT_CSP "Enrollment CSP" - IDS_CRL_NUMBER "Numéro CRL" - IDS_DELTA_CRL_INDICATOR "Delta CRL Indicator" - IDS_ISSUING_DIST_POINT "Issuing Distribution Point" - IDS_FRESHEST_CRL "Freshest CRL" + IDS_WINDOWS_PRODUCT_UPDATE "Mise à jour de Windows" + IDS_ENROLLMENT_NAME_VALUE_PAIR "Paire nom/value d'enrôlement" + IDS_OS_VERSION "Version du système d'exploitation" + IDS_ENROLLMENT_CSP "Fournisseur de service cryptographique (CSP) d'enrôlement" + IDS_CRL_NUMBER "Numéro de la LRC" + IDS_DELTA_CRL_INDICATOR "Indicateur de delta-LRC" + IDS_ISSUING_DIST_POINT "Point de distribution d'émission" + IDS_FRESHEST_CRL "LRC la plus récente" IDS_NAME_CONSTRAINTS "Contraintes de nom" - IDS_POLICY_MAPPINGS "Policy Mappings" - IDS_POLICY_CONSTRAINTS "Policy Constraints" - IDS_CROSS_CERT_DIST_POINTS "Cross-Certificate Distribution Points" - IDS_APPLICATION_POLICIES "Application Policies" - IDS_APPLICATION_POLICY_MAPPINGS "Application Policy Mappings" - IDS_APPLICATION_POLICY_CONSTRAINTS "Application Policy Constraints" - IDS_CMC_DATA "Données CMC" - IDS_CMC_RESPONSE "Réponse CMC" - IDS_UNSIGNED_CMC_REQUEST "Unsigned CMC Request" - IDS_CMC_STATUS_INFO "CMC Status Info" - IDS_CMC_EXTENSIONS "CMC Extensions" - IDS_CMC_ATTRIBUTES "CMC Attributes" - IDS_PKCS_7_DATA "Données PKCS 7" - IDS_PKCS_7_SIGNED "Signé avec PKCS 7" - IDS_PKCS_7_ENVELOPED "Enveloppé avec PKCS 7" - IDS_PKCS_7_SIGNED_ENVELOPED "Enveloppé et signé avec PKCS 7" - IDS_PKCS_7_DIGESTED "Haché avec PKCS 7" - IDS_PKCS_7_ENCRYPTED "Chiffré avec PKCS 7" - IDS_PREVIOUS_CA_CERT_HASH "Previous CA Certificate Hash" - IDS_CRL_VIRTUAL_BASE "Virtual Base CRL Number" - IDS_CRL_NEXT_PUBLISH "Next CRL Publish" + IDS_POLICY_MAPPINGS "Mappings de politiques" + IDS_POLICY_CONSTRAINTS "Contraintes de politiques" + IDS_CROSS_CERT_DIST_POINTS "Points de distribution de certificats croisés" + IDS_APPLICATION_POLICIES "Politiques applicatives" + IDS_APPLICATION_POLICY_MAPPINGS "Mappings de politiques applicatives" + IDS_APPLICATION_POLICY_CONSTRAINTS "Contraintes de politiques applicatives" + IDS_CMC_DATA "Données CMC" + IDS_CMC_RESPONSE "Réponse CMC" + IDS_UNSIGNED_CMC_REQUEST "Requête CMC non signée" + IDS_CMC_STATUS_INFO "Informations sur le statut CMC" + IDS_CMC_EXTENSIONS "Extensions CMC" + IDS_CMC_ATTRIBUTES "Attributs CMC" + IDS_PKCS_7_DATA "Données PKCS 7" + IDS_PKCS_7_SIGNED "Signé avec PKCS 7" + IDS_PKCS_7_ENVELOPED "Enveloppé avec PKCS 7" + IDS_PKCS_7_SIGNED_ENVELOPED "Enveloppé et signé avec PKCS 7" + IDS_PKCS_7_DIGESTED "Haché avec PKCS 7" + IDS_PKCS_7_ENCRYPTED "Chiffré avec PKCS 7" + IDS_PREVIOUS_CA_CERT_HASH "Empreinte précédente du certificat de l'AC" + IDS_CRL_VIRTUAL_BASE "Numéro de LRC de base virtuelle" + IDS_CRL_NEXT_PUBLISH "Prochaine publication de LRC" IDS_CA_EXCHANGE "Certificat de chiffrement CA" - IDS_KEY_RECOVERY_AGENT "Key Recovery Agent" - IDS_CERTIFICATE_TEMPLATE "Certificate Template Information" - IDS_ENTERPRISE_ROOT_OID "Enterprise Root OID" + IDS_KEY_RECOVERY_AGENT "Agent de recouvrement de clé" + IDS_CERTIFICATE_TEMPLATE "Informations sur le modèle de certificats" + IDS_ENTERPRISE_ROOT_OID "OID racine de l'entreprise" IDS_RDN_DUMMY_SIGNER "Signataire factice" - IDS_ARCHIVED_KEY_ATTR "Clé de chiffrement privée" - IDS_CRL_SELF_CDP "Published CRL Locations" - IDS_REQUIRE_CERT_CHAIN_POLICY "Enforce Certificate Chain Policy" - IDS_TRANSACTION_ID "Transaction Id" - IDS_SENDER_NONCE "Sender Nonce" - IDS_RECIPIENT_NONCE "Recipient Nonce" - IDS_REG_INFO "Reg Info" - IDS_GET_CERTIFICATE "Get Certificate" - IDS_GET_CRL "Get CRL" - IDS_REVOKE_REQUEST "Revoke Request" - IDS_QUERY_PENDING "Query Pending" - IDS_SORTED_CTL "Certificate Trust List" - IDS_ARCHIVED_KEY_CERT_HASH "Archived Key Certificate Hash" - IDS_PRIVATE_KEY_USAGE_PERIOD "Private Key Usage Period" - IDS_CLIENT_INFORMATION "Client Information" - IDS_SERVER_AUTHENTICATION "Server Authentication" - IDS_CLIENT_AUTHENTICATION "Client Authentication" - IDS_CODE_SIGNING "Code Signing" - IDS_SECURE_EMAIL "Secure Email" - IDS_TIME_STAMPING "Time Stamping" - IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft Trust List Signing" - IDS_MICROSOFT_TIME_STAMPING "Microsoft Time Stamping" - IDS_IPSEC_END_SYSTEM "IP security end system" - IDS_IPSEC_TUNNEL "IP security tunnel termination" - IDS_IPSEC_USER "IP security user" - IDS_EFS "Encrypting File System" - IDS_WHQL_CRYPTO "Windows Hardware Driver Verification" - IDS_NT5_CRYPTO "Windows System Component Verification" - IDS_OEM_WHQL_CRYPTO "OEM Windows System Component Verification" - IDS_EMBEDDED_NT_CRYPTO "Embedded Windows System Component Verification" - IDS_KEY_PACK_LICENSES "Key Pack Licenses" - IDS_LICENSE_SERVER "License Server Verification" - IDS_SMART_CARD_LOGON "Smart Card Logon" - IDS_DIGITAL_RIGHTS "Digital Rights" - IDS_QUALIFIED_SUBORDINATION "Qualified Subordination" - IDS_KEY_RECOVERY "Récupération de clé" + IDS_ARCHIVED_KEY_ATTR "Clé de chiffrement privée" + IDS_CRL_SELF_CDP "Emplacement des LRC publiées" + IDS_REQUIRE_CERT_CHAIN_POLICY "Requérir une polique de chaîne de certification" + IDS_TRANSACTION_ID "Identifiant de transaction" + IDS_SENDER_NONCE "Nonce de l'émetteur" + IDS_RECIPIENT_NONCE "Nonce du récepteur" + IDS_REG_INFO "Informations d'enregistrement" + IDS_GET_CERTIFICATE "Obtenir un certificat" + IDS_GET_CRL "Obtenir une LRC" + IDS_REVOKE_REQUEST "Révoquer une requête" + IDS_QUERY_PENDING "Requête en attente" + IDS_SORTED_CTL "Liste de certificats de confiance" + IDS_ARCHIVED_KEY_CERT_HASH "Empreinte du certificat de clé archivée" + IDS_PRIVATE_KEY_USAGE_PERIOD "Période d'utilisation de la clé privée" + IDS_CLIENT_INFORMATION "Informations sur le client" + IDS_SERVER_AUTHENTICATION "Authentification du serveur" + IDS_CLIENT_AUTHENTICATION "Authentification du client" + IDS_CODE_SIGNING "Signature de code" + IDS_SECURE_EMAIL "Messagerie sécurisé" + IDS_TIME_STAMPING "Horodatage" + IDS_MICROSOFT_TRUST_LIST_SIGNING "Signature de la liste de confiance Microsoft" + IDS_MICROSOFT_TIME_STAMPING "Horodatage Microsoft" + IDS_IPSEC_END_SYSTEM "Système terminal IPsec" + IDS_IPSEC_TUNNEL "Terminaison du tunnel IPsec" + IDS_IPSEC_USER "Utilisateur IPsec" + IDS_EFS "Système de fichiers chiffré (EFS)" + IDS_WHQL_CRYPTO "Vérification des pilotes matériels de Windows" + IDS_NT5_CRYPTO "Vérification des composants système de Windows" + IDS_OEM_WHQL_CRYPTO "Vérification des composants système de Windows OEM" + IDS_EMBEDDED_NT_CRYPTO "Vérification des composants système de Windows embarqué" + IDS_KEY_PACK_LICENSES "Licences de jeux de clés" + IDS_LICENSE_SERVER "Vérification du serveur de licence" + IDS_SMART_CARD_LOGON "Connexion avec carte à puce" + IDS_DIGITAL_RIGHTS "Droits numériques" + IDS_QUALIFIED_SUBORDINATION "Subordination conditionnelle" + IDS_KEY_RECOVERY "Recouvrement de clé" IDS_DOCUMENT_SIGNING "Signature de document" - IDS_IPSEC_IKE_INTERMEDIATE "IP security IKE intermediate" - IDS_FILE_RECOVERY "Récupération de fichier" + IDS_IPSEC_IKE_INTERMEDIATE "Intermédiaire IKE IPsec" + IDS_FILE_RECOVERY "Restauration de fichier" IDS_ROOT_LIST_SIGNER "Signataires de la liste racine" - IDS_ANY_APPLICATION_POLICIES "All application policies" - IDS_DS_EMAIL_REPLICATION "Directory Service Email Replication" - IDS_ENROLLMENT_AGENT "Certificate Request Agent" - IDS_LIFETIME_SIGNING "Lifetime Signing" - IDS_ANY_CERT_POLICY "All issuance policies" + IDS_ANY_APPLICATION_POLICIES "Toutes les politiques applicatives" + IDS_DS_EMAIL_REPLICATION "Réplication de courriers électroniques du service d'annuaire" + IDS_ENROLLMENT_AGENT "Agent de demande de certificat" + IDS_LIFETIME_SIGNING "Signature à vie" + IDS_ANY_CERT_POLICY "Toutes les politiques d'émission" } STRINGTABLE DISCARDABLE { - IDS_LOCALIZEDNAME_ROOT "Autorités de certification de confiance" + IDS_LOCALIZEDNAME_ROOT "Autorités de certification de confiance" IDS_LOCALIZEDNAME_MY "Personnel" - IDS_LOCALIZEDNAME_CA "Autorités intermédiaires" + IDS_LOCALIZEDNAME_CA "Autorités intermédiaires" IDS_LOCALIZEDNAME_ADDRESSBOOK "Autres personnes" - IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Éditeurs de confiance" + IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Éditeurs de confiance" } STRINGTABLE DISCARDABLE { - IDS_KEY_ID "KeyID=" - IDS_CERT_ISSUER "Certificate Issuer" - IDS_CERT_SERIAL_NUMBER "Certificate Serial Number=" - IDS_ALT_NAME_OTHER_NAME "Other Name=" - IDS_ALT_NAME_RFC822_NAME "Email Address=" - IDS_ALT_NAME_DNS_NAME "DNS Name=" - IDS_ALT_NAME_DIRECTORY_NAME "Directory Address" + IDS_KEY_ID "ID de clé =" + IDS_CERT_ISSUER "Émetteur du certificat" + IDS_CERT_SERIAL_NUMBER "Numéro de série du certificat =" + IDS_ALT_NAME_OTHER_NAME "Autre nom =" + IDS_ALT_NAME_RFC822_NAME "Adresse électronique =" + IDS_ALT_NAME_DNS_NAME "Nom DNS =" + IDS_ALT_NAME_DIRECTORY_NAME "Adresse du répertoire" IDS_ALT_NAME_URL "URL=" - IDS_ALT_NAME_IP_ADDRESS "Adresse IP=" - IDS_ALT_NAME_MASK "Mask=" - IDS_ALT_NAME_REGISTERED_ID "Registered ID=" - IDS_USAGE_UNKNOWN "Unknown Key Usage" - IDS_SUBJECT_TYPE "Subject Type=" - IDS_SUBJECT_TYPE_CA "CA" - IDS_SUBJECT_TYPE_END_CERT "End Entity" - IDS_PATH_LENGTH "Path Length Constraint=" + IDS_ALT_NAME_IP_ADDRESS "Adresse IP =" + IDS_ALT_NAME_MASK "Masque =" + IDS_ALT_NAME_REGISTERED_ID "ID enregistré =" + IDS_USAGE_UNKNOWN "Utilisation de la clé inconnue" + IDS_SUBJECT_TYPE "Type de sujet =" + IDS_SUBJECT_TYPE_CA "AC" + IDS_SUBJECT_TYPE_END_CERT "Entité terminale" + IDS_PATH_LENGTH "Contrainte de longueur de chemin =" IDS_PATH_LENGTH_NONE "Aucune" - IDS_INFO_NOT_AVAILABLE "Information Not Available" - IDS_AIA "Authority Info Access" - IDS_ACCESS_METHOD "Access Method=" + IDS_INFO_NOT_AVAILABLE "Informations non disponibles" + IDS_AIA "Accès aux informations de l'autorité" + IDS_ACCESS_METHOD "Méthode d'accès =" IDS_ACCESS_METHOD_OCSP "OCSP" - IDS_ACCESS_METHOD_CA_ISSUERS "CA Issuers" - IDS_ACCESS_METHOD_UNKNOWN "Unknown Access Method" - IDS_ACCESS_LOCATION "Alternative Name" - IDS_CRL_DIST_POINT "CRL Distribution Point" - IDS_CRL_DIST_POINT_NAME "Distribution Point Name" - IDS_CRL_DIST_POINT_FULL_NAME "Full Name" - IDS_CRL_DIST_POINT_RDN_NAME "RDN Name" - IDS_CRL_DIST_POINT_REASON "CRL Reason=" - IDS_CRL_DIST_POINT_ISSUER "CRL Issuer" - IDS_REASON_KEY_COMPROMISE "Key Compromise" - IDS_REASON_CA_COMPROMISE "CA Compromise" - IDS_REASON_AFFILIATION_CHANGED "Affiliation Changed" - IDS_REASON_SUPERSEDED "Superseded" - IDS_REASON_CESSATION_OF_OPERATION "Operation Ceased" - IDS_REASON_CERTIFICATE_HOLD "Certificate Hold" - IDS_FINANCIAL_CRITERIA "Financial Information=" - IDS_FINANCIAL_CRITERIA_AVAILABLE "Available" - IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Not Available" - IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Meets Criteria=" + IDS_ACCESS_METHOD_CA_ISSUERS "Émetteurs de l'AC" + IDS_ACCESS_METHOD_UNKNOWN "Méthode d'accès inconnue" + IDS_ACCESS_LOCATION "Nom alternatif" + IDS_CRL_DIST_POINT "Point de distribution de LRC" + IDS_CRL_DIST_POINT_NAME "Nom du point de distribution" + IDS_CRL_DIST_POINT_FULL_NAME "Nom complet" + IDS_CRL_DIST_POINT_RDN_NAME "Nom distingué relatif (RDN)" + IDS_CRL_DIST_POINT_REASON "Raison de la LRC =" + IDS_CRL_DIST_POINT_ISSUER "Émetteur de la LRC" + IDS_REASON_KEY_COMPROMISE "Clé compromise" + IDS_REASON_CA_COMPROMISE "AC compromise" + IDS_REASON_AFFILIATION_CHANGED "Affiliation modifiée" + IDS_REASON_SUPERSEDED "Supplanté" + IDS_REASON_CESSATION_OF_OPERATION "Cessation de opérations" + IDS_REASON_CERTIFICATE_HOLD "Certificat suspendu" + IDS_FINANCIAL_CRITERIA "Informations financières =" + IDS_FINANCIAL_CRITERIA_AVAILABLE "Disponible" + IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Non disponible" + IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Respecte les critères =" IDS_YES "Oui" IDS_NO "Non" - IDS_DIGITAL_SIGNATURE "Signature numérique" - IDS_NON_REPUDIATION "Non-répudiation" - IDS_KEY_ENCIPHERMENT "Key Encipherment" - IDS_DATA_ENCIPHERMENT "Data Encipherment" - IDS_KEY_AGREEMENT "Key Agreement" - IDS_CERT_SIGN "Certificate Signing" - IDS_OFFLINE_CRL_SIGN "Off-line CRL Signing" - IDS_CRL_SIGN "CRL Signing" + IDS_DIGITAL_SIGNATURE "Signature numérique" + IDS_NON_REPUDIATION "Non-répudiation" + IDS_KEY_ENCIPHERMENT "Chiffrement de la clé" + IDS_DATA_ENCIPHERMENT "Chiffrement de données" + IDS_KEY_AGREEMENT "Accord sur la clé" + IDS_CERT_SIGN "Signature de certificat" + IDS_OFFLINE_CRL_SIGN "Signature de LRC hors-ligne" + IDS_CRL_SIGN "Signature de LRC" IDS_ENCIPHER_ONLY "Chiffrement seul" - IDS_DECIPHER_ONLY "Déchiffrement seul" - IDS_NETSCAPE_SSL_CLIENT "SSL Client Authentication" - IDS_NETSCAPE_SSL_SERVER "SSL Server Authentication" + IDS_DECIPHER_ONLY "Déchiffrement seul" + IDS_NETSCAPE_SSL_CLIENT "Authentification de client SSL" + IDS_NETSCAPE_SSL_SERVER "Authentification de serveur SSL" IDS_NETSCAPE_SMIME "S/MIME" IDS_NETSCAPE_SIGN "Signature" - IDS_NETSCAPE_SSL_CA "SSL CA" - IDS_NETSCAPE_SMIME_CA "S/MIME CA" + IDS_NETSCAPE_SSL_CA "AC SSL" + IDS_NETSCAPE_SMIME_CA "AC S/MIME" IDS_NETSCAPE_SIGN_CA "Signature CA" } diff --git a/reactos/dll/win32/crypt32/crypt32_Ko.rc b/reactos/dll/win32/crypt32/crypt32_Ko.rc index 51e3fc32f67..1a0535300a5 100644 --- a/reactos/dll/win32/crypt32/crypt32_Ko.rc +++ b/reactos/dll/win32/crypt32/crypt32_Ko.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/crypt32/crypt32_Nl.rc b/reactos/dll/win32/crypt32/crypt32_Nl.rc index 70ea2bac05d..e12d25d775f 100644 --- a/reactos/dll/win32/crypt32/crypt32_Nl.rc +++ b/reactos/dll/win32/crypt32/crypt32_Nl.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/crypt32/crypt32_No.rc b/reactos/dll/win32/crypt32/crypt32_No.rc index 18de84b8c4b..26652860105 100644 --- a/reactos/dll/win32/crypt32/crypt32_No.rc +++ b/reactos/dll/win32/crypt32/crypt32_No.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/crypt32/crypt32_Pt.rc b/reactos/dll/win32/crypt32/crypt32_Pt.rc index 424f8ea7aee..5c5d3b701fb 100644 --- a/reactos/dll/win32/crypt32/crypt32_Pt.rc +++ b/reactos/dll/win32/crypt32/crypt32_Pt.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/crypt32/crypt32_Ro.rc b/reactos/dll/win32/crypt32/crypt32_Ro.rc new file mode 100644 index 00000000000..65d1c1eb91b --- /dev/null +++ b/reactos/dll/win32/crypt32/crypt32_Ro.rc @@ -0,0 +1,243 @@ +/* + * crypt32 dll Romanian resources + * + * Copyright (C) 2009 Paul Chitescu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "cryptres.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_AUTHORITY_KEY_ID "Identificatorul cheii autorității" + IDS_KEY_ATTRIBUTES "Atributele cheii" + IDS_KEY_USAGE_RESTRICTION "RestricÈ›ii de folosire a cheii" + IDS_SUBJECT_ALT_NAME "Nume alternativ al subiectului" + IDS_ISSUER_ALT_NAME "Nume alternativ al emitentului" + IDS_BASIC_CONSTRAINTS "Constrângeri de bază" + IDS_KEY_USAGE "Folosirea cheii" + IDS_CERT_POLICIES "Politicile certificatului" + IDS_SUBJECT_KEY_IDENTIFIER "Identificatorul subiectului cheii" + IDS_CRL_REASON_CODE "Codul motivului CRL" + IDS_CRL_DIST_POINTS "Puncte de distribuire CRL" + IDS_ENHANCED_KEY_USAGE "Extensii de folosirea a cheii" + IDS_AUTHORITY_INFO_ACCESS "Acces la informaÈ›iile de autoritate" + IDS_CERT_EXTENSIONS "Extensiile certificatului" + IDS_NEXT_UPDATE_LOCATION "Următoarea locaÈ›ie de actualizare" + IDS_YES_OR_NO_TRUST "ÃŽncredere Da sau Nu" + IDS_EMAIL_ADDRESS "Adresă de e-mail" + IDS_UNSTRUCTURED_NAME "Nume nestructurat" + IDS_CONTENT_TYPE "Tipul conÈ›inutului" + IDS_MESSAGE_DIGEST "Rezumatul mesajului" + IDS_SIGNING_TIME "Momentul semnării" + IDS_COUNTER_SIGN "Contrasemnat" + IDS_CHALLENGE_PASSWORD "Parola de provocare" + IDS_UNSTRUCTURED_ADDRESS "Adresă nestructurată" + IDS_SMIME_CAPABILITIES "Capabilități S/MIME" + IDS_PREFER_SIGNED_DATA "Preferă datele semnate" + IDS_CPS "CPS" + IDS_USER_NOTICE "Notiță utilizator" + IDS_OCSP "Protocol online de verificare a stării certificatului" + IDS_CA_ISSUER "Autoritatea de certificare emitentă" + IDS_CERT_TEMPLATE_NAME "Numele È™ablonului de certificat" + IDS_CERT_TYPE "Tipul certificatului" + IDS_CERT_MANIFOLD "Ramurile certificatului" + IDS_NETSCAPE_CERT_TYPE "Tipul certificatului Netscape" + IDS_NETSCAPE_BASE_URL "URL-ul de bază Netscape" + IDS_NETSCAPE_REVOCATION_URL "URL-ul de revocare Netscape" + IDS_NETSCAPE_CA_REVOCATION_URL "URL-ul de revocare a CA Netscape" + IDS_NETSCAPE_CERT_RENEWAL_URL "URL-ul de înnoire a certificatului Netscape" + IDS_NETSCAPE_CA_POLICY_URL "URL-ul politicii CA Netscape" + IDS_NETSCAPE_SSL_SERVER_NAME "Nume server SSL Netscape" + IDS_NETSCAPE_COMMENT "Comentariul Netscape" + IDS_SPC_SP_AGENCY_INFO "InformaÈ›iiAgenÈ›ieSpcSp" + IDS_SPC_FINANCIAL_CRITERIA "CriteriiFinanciareSpc" + IDS_SPC_MINIMAL_CRITERIA "CriteriiMinimaleSpc" + IDS_COUNTRY "Èšara/regiunea" + IDS_ORGANIZATION "OrganizaÈ›ia" + IDS_ORGANIZATIONAL_UNIT "Unitatea organizaÈ›ională" + IDS_COMMON_NAME "Nume uzual" + IDS_LOCALITY "Localitatea" + IDS_STATE_OR_PROVINCE "Statul sau provincia" + IDS_TITLE "Titlul" + IDS_GIVEN_NAME "Prenume" + IDS_INITIALS "IniÈ›iale" + IDS_SUR_NAME "Nume" + IDS_DOMAIN_COMPONENT "Componentă de domeniu" + IDS_STREET_ADDRESS "Adresa" + IDS_SERIAL_NUMBER "Număr de serie" + IDS_CA_VERSION "Versiunea CA" + IDS_CROSS_CA_VERSION "Versiunea încruciÈ™ată CA" + IDS_SERIALIZED_SIG_SERIAL_NUMBER "Număr de serie al semnăturii serializate" + IDS_PRINCIPAL_NAME "Nume principal" + IDS_WINDOWS_PRODUCT_UPDATE "Actualizarea produsului Windows" + IDS_ENROLLMENT_NAME_VALUE_PAIR "Pereche nume-valoare de înscriere" + IDS_OS_VERSION "Versiunea sistemului de operare" + IDS_ENROLLMENT_CSP "CSP de înscriere" + IDS_CRL_NUMBER "Numărul CRL" + IDS_DELTA_CRL_INDICATOR "Indicator diferență CRL" + IDS_ISSUING_DIST_POINT "Punct de distribuÈ›ie emitent" + IDS_FRESHEST_CRL "Cel mai proaspăt CRL" + IDS_NAME_CONSTRAINTS "Constrângeri de nume" + IDS_POLICY_MAPPINGS "Mapări de politică" + IDS_POLICY_CONSTRAINTS "Constrângeri de politică" + IDS_CROSS_CERT_DIST_POINTS "Puncte încruciÈ™ate de distribuÈ›ie certificate" + IDS_APPLICATION_POLICIES "Politici de aplicaÈ›ie" + IDS_APPLICATION_POLICY_MAPPINGS "Mapări de politică aplicaÈ›ie" + IDS_APPLICATION_POLICY_CONSTRAINTS "Constrângeri de politică aplicaÈ›ie" + IDS_CMC_DATA "Date CMC" + IDS_CMC_RESPONSE "Răspuns CMC" + IDS_UNSIGNED_CMC_REQUEST "Cerere CMC nesemnată" + IDS_CMC_STATUS_INFO "InformaÈ›ii de stare CMC" + IDS_CMC_EXTENSIONS "Extensii CMC" + IDS_CMC_ATTRIBUTES "Atribute CMC" + IDS_PKCS_7_DATA "Date PKCS 7" + IDS_PKCS_7_SIGNED "PKCS 7 semnat" + IDS_PKCS_7_ENVELOPED "PKCS 7 încapsulat" + IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 semnat È™i încapsulat" + IDS_PKCS_7_DIGESTED "PKCS 7 rezumat" + IDS_PKCS_7_ENCRYPTED "PKCS 7 criptat" + IDS_PREVIOUS_CA_CERT_HASH "Rezumatul certificatului CA anterior" + IDS_CRL_VIRTUAL_BASE "Baza virtuală a numerelor CRL" + IDS_CRL_NEXT_PUBLISH "Următorul editor CRL" + IDS_CA_EXCHANGE "Certificat de criptare CA" + IDS_KEY_RECOVERY_AGENT "Agent de recuperare a cheilor" + IDS_CERTIFICATE_TEMPLATE "Șablon de informaÈ›ii de certificat" + IDS_ENTERPRISE_ROOT_OID "OID rădăcină al întreprinderii" + IDS_RDN_DUMMY_SIGNER "Semnatar implicit" + IDS_ARCHIVED_KEY_ATTR "Cheie privată criptată" + IDS_CRL_SELF_CDP "LocaÈ›ii CRL publicate" + IDS_REQUIRE_CERT_CHAIN_POLICY "Impune politica de certificare în lanÈ›" + IDS_TRANSACTION_ID "Identificator de tranzacÈ›ie" + IDS_SENDER_NONCE "Identificator unic al expeditorului" + IDS_RECIPIENT_NONCE "Identificator unic al destinatarului" + IDS_REG_INFO "InformaÈ›ii de înregistrare" + IDS_GET_CERTIFICATE "ObÈ›inere certificat" + IDS_GET_CRL "ObÈ›inere CRL" + IDS_REVOKE_REQUEST "Cerere de revocare" + IDS_QUERY_PENDING "Interogare în curs" + IDS_SORTED_CTL "Lista certificatelor de încredere" + IDS_ARCHIVED_KEY_CERT_HASH "Rezumatul certificatului cheii arhivate" + IDS_PRIVATE_KEY_USAGE_PERIOD "Perioada de folosire a cheii private" + IDS_CLIENT_INFORMATION "InformaÈ›ii client" + IDS_SERVER_AUTHENTICATION "Autentificare server" + IDS_CLIENT_AUTHENTICATION "Autentificare client" + IDS_CODE_SIGNING "Semnarea codului" + IDS_SECURE_EMAIL "E-mail securizat" + IDS_TIME_STAMPING "Marcare temporală" + IDS_MICROSOFT_TRUST_LIST_SIGNING "Semnare listă de încredere Microsoft" + IDS_MICROSOFT_TIME_STAMPING "Marcare temporală Microsoft" + IDS_IPSEC_END_SYSTEM "Sistem terminal de securitate IP" + IDS_IPSEC_TUNNEL "Capăt de tunel de securitate IP" + IDS_IPSEC_USER "Utilizator de securitate IP" + IDS_EFS "Sistem de fiÈ™iere criptat" + IDS_WHQL_CRYPTO "Verificarea driverelor hardware Windows" + IDS_NT5_CRYPTO "Verificarea componentelor sistem Windows" + IDS_OEM_WHQL_CRYPTO "Verificarea componentelor sistem Windows OEM" + IDS_EMBEDDED_NT_CRYPTO "Verificarea componentelor sistem Windows Embedded" + IDS_KEY_PACK_LICENSES "LicenÈ›iere pachet de chei" + IDS_LICENSE_SERVER "Verificarea serverului de licență" + IDS_SMART_CARD_LOGON "Log on cu Smart Card" + IDS_DIGITAL_RIGHTS "Drepturi digitale" + IDS_QUALIFIED_SUBORDINATION "Subordonare calificată" + IDS_KEY_RECOVERY "Recuperare de chei" + IDS_DOCUMENT_SIGNING "Semnare de documente" + IDS_IPSEC_IKE_INTERMEDIATE "Intermediar IKE de securitate IP" + IDS_FILE_RECOVERY "Recuperare de fiÈ™iere" + IDS_ROOT_LIST_SIGNER "Semnatarul listei rădăcină" + IDS_ANY_APPLICATION_POLICIES "Toate politicile de aplicaÈ›ie" + IDS_DS_EMAIL_REPLICATION "Replicarea serviciilor repertoar de e-mail" + IDS_ENROLLMENT_AGENT "Agent de cerere de certificate" + IDS_LIFETIME_SIGNING "Semnare pe toată durata vieÈ›ii" + IDS_ANY_CERT_POLICY "Toate politicile de emitere" +} + +STRINGTABLE DISCARDABLE +{ + IDS_LOCALIZEDNAME_ROOT "Autorități de încredere de bază de certificare" + IDS_LOCALIZEDNAME_MY "Personale" + IDS_LOCALIZEDNAME_CA "Autorități intermediare de certificare" + IDS_LOCALIZEDNAME_ADDRESSBOOK "Alte persoane" + IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Editor de încredere" +} + +STRINGTABLE DISCARDABLE +{ + IDS_KEY_ID "KeyID=" + IDS_CERT_ISSUER "Emitentul certificatului" + IDS_CERT_SERIAL_NUMBER "Numărul de serie al certificatului=" + IDS_ALT_NAME_OTHER_NAME "Nume alternativ=" + IDS_ALT_NAME_RFC822_NAME "Addresa de e-mail=" + IDS_ALT_NAME_DNS_NAME "Nume de DNS=" + IDS_ALT_NAME_DIRECTORY_NAME "Adresa de repertoar" + IDS_ALT_NAME_URL "URL=" + IDS_ALT_NAME_IP_ADDRESS "Adresa IP=" + IDS_ALT_NAME_MASK "Masca=" + IDS_ALT_NAME_REGISTERED_ID "Identificator înregistrat=" + IDS_USAGE_UNKNOWN "Folosire necunoscută a cheii" + IDS_SUBJECT_TYPE "Tipul subiectului=" + IDS_SUBJECT_TYPE_CA "CA" + IDS_SUBJECT_TYPE_END_CERT "Entitate finală" + IDS_PATH_LENGTH "Constrângere de lungime a căii=" + IDS_PATH_LENGTH_NONE "Fără" + IDS_INFO_NOT_AVAILABLE "InformaÈ›ie indisponibilă" + IDS_AIA "Acces la informaÈ›iile de autoritate" + IDS_ACCESS_METHOD "Metoda de acces=" + IDS_ACCESS_METHOD_OCSP "OCSP" + IDS_ACCESS_METHOD_CA_ISSUERS "EmitenÈ›i CA" + IDS_ACCESS_METHOD_UNKNOWN "Metodă de acces necunoscută" + IDS_ACCESS_LOCATION "Nume alternativ" + IDS_CRL_DIST_POINT "Punct de distribuÈ›ie CRL" + IDS_CRL_DIST_POINT_NAME "Numele punctului de distribuÈ›ie" + IDS_CRL_DIST_POINT_FULL_NAME "Nume complet" + IDS_CRL_DIST_POINT_RDN_NAME "Nume RDN" + IDS_CRL_DIST_POINT_REASON "Motiv CRL=" + IDS_CRL_DIST_POINT_ISSUER "Emitent CRL" + IDS_REASON_KEY_COMPROMISE "Cheia compromisă" + IDS_REASON_CA_COMPROMISE "CA compromisă" + IDS_REASON_AFFILIATION_CHANGED "Afiliere schimbată" + IDS_REASON_SUPERSEDED "ÃŽnlocuit" + IDS_REASON_CESSATION_OF_OPERATION "ÃŽncetarea operaÈ›iunilor" + IDS_REASON_CERTIFICATE_HOLD "Certificat reÈ›inut" + IDS_FINANCIAL_CRITERIA "InformaÈ›ia financiară=" + IDS_FINANCIAL_CRITERIA_AVAILABLE "Disponibilă" + IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Indisponibilă" + IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "ÃŽndeplineÈ™te criteriul=" + IDS_YES "Da" + IDS_NO "Nu" + IDS_DIGITAL_SIGNATURE "Semnătură digitală" + IDS_NON_REPUDIATION "Non-repudiere" + IDS_KEY_ENCIPHERMENT "Cifrare cheie" + IDS_DATA_ENCIPHERMENT "Cifrare date" + IDS_KEY_AGREEMENT "ÃŽnÈ›elegere la cheie" + IDS_CERT_SIGN "Semnare certificat" + IDS_OFFLINE_CRL_SIGN "Semnare CRL offline" + IDS_CRL_SIGN "Semnare CRL" + IDS_ENCIPHER_ONLY "Doar cifrează" + IDS_DECIPHER_ONLY "Doar descifrează" + IDS_NETSCAPE_SSL_CLIENT "Autentificare client SSL" + IDS_NETSCAPE_SSL_SERVER "Autentificare server SSL" + IDS_NETSCAPE_SMIME "S/MIME" + IDS_NETSCAPE_SIGN "Semnătură" + IDS_NETSCAPE_SSL_CA "SSL CA" + IDS_NETSCAPE_SMIME_CA "S/MIME CA" + IDS_NETSCAPE_SIGN_CA "Semnătură CA" +} diff --git a/reactos/dll/win32/crypt32/crypt32_Sv.rc b/reactos/dll/win32/crypt32/crypt32_Sv.rc index a0e9df5a011..4a242fe10a6 100644 --- a/reactos/dll/win32/crypt32/crypt32_Sv.rc +++ b/reactos/dll/win32/crypt32/crypt32_Sv.rc @@ -17,6 +17,9 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + +#include "cryptres.h" + #pragma code_page(65001) LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL @@ -160,5 +163,3 @@ STRINGTABLE DISCARDABLE IDS_FILE_RECOVERY "File Recovery" IDS_ROOT_LIST_SIGNER "Root List Signer" } - -#pragma code_page(default) diff --git a/reactos/dll/win32/crypt32/cryptres.h b/reactos/dll/win32/crypt32/cryptres.h index fe2fd91b580..f9845be25ab 100644 --- a/reactos/dll/win32/crypt32/cryptres.h +++ b/reactos/dll/win32/crypt32/cryptres.h @@ -18,6 +18,8 @@ #ifndef __WINE_CRYPTRES_H__ #define __WINE_CRYPTRES_H__ +#include + #define IDS_AUTHORITY_KEY_ID 1000 #define IDS_KEY_ATTRIBUTES 1001 #define IDS_KEY_USAGE_RESTRICTION 1002 diff --git a/reactos/dll/win32/crypt32/decode.c b/reactos/dll/win32/crypt32/decode.c index 2c2b543e852..7a33e6afa5e 100644 --- a/reactos/dll/win32/crypt32/decode.c +++ b/reactos/dll/win32/crypt32/decode.c @@ -523,7 +523,7 @@ static BOOL CRYPT_AsnDecodeSequence(struct AsnDecodeSequenceItem items[], for (i = 0; i < cItem; i++) { bytesNeeded += items[i].size; - structSize += items[i].minSize; + structSize = max( structSize, items[i].offset + items[i].minSize ); } if (pcbDecoded) *pcbDecoded = 1 + lenBytes + cbDecoded; diff --git a/reactos/dll/win32/crypt32/encode.c b/reactos/dll/win32/crypt32/encode.c index 67a0155e584..258384c7318 100644 --- a/reactos/dll/win32/crypt32/encode.c +++ b/reactos/dll/win32/crypt32/encode.c @@ -564,13 +564,12 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLEntries(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { - DWORD cCRLEntry = *(const DWORD *)pvStructInfo; DWORD bytesNeeded, dataLen, lenBytes, i; - const CRL_ENTRY *rgCRLEntry = *(const CRL_ENTRY *const *) - ((const BYTE *)pvStructInfo + sizeof(DWORD)); + const CRL_INFO *info = pvStructInfo; + const CRL_ENTRY *rgCRLEntry = info->rgCRLEntry; BOOL ret = TRUE; - for (i = 0, dataLen = 0; ret && i < cCRLEntry; i++) + for (i = 0, dataLen = 0; ret && i < info->cCRLEntry; i++) { DWORD size; @@ -594,7 +593,7 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLEntries(DWORD dwCertEncodingType, *pbEncoded++ = ASN_SEQUENCEOF; CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); pbEncoded += lenBytes; - for (i = 0; i < cCRLEntry; i++) + for (i = 0; i < info->cCRLEntry; i++) { DWORD size = dataLen; @@ -659,7 +658,7 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLInfo(DWORD dwCertEncodingType, } if (info->cCRLEntry) { - items[cItem].pvStructInfo = &info->cCRLEntry; + items[cItem].pvStructInfo = info; items[cItem].encodeFunc = CRYPT_AsnEncodeCRLEntries; cItem++; } diff --git a/reactos/dll/win32/crypt32/oid.c b/reactos/dll/win32/crypt32/oid.c index 927481ff256..f0ea8ea8767 100644 --- a/reactos/dll/win32/crypt32/oid.c +++ b/reactos/dll/win32/crypt32/oid.c @@ -664,6 +664,16 @@ error_close_key: return TRUE; } +/*********************************************************************** + * CryptRegisterOIDInfo (CRYPT32.@) + */ +BOOL WINAPI CryptRegisterOIDInfo(PCCRYPT_OID_INFO pInfo, DWORD dwFlags) +{ + FIXME("(%p, %x): stub\n", pInfo, dwFlags ); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + /*********************************************************************** * CryptUnregisterOIDFunction (CRYPT32.@) */ From bf334e3e90afe8a62f1580d4ea4d2897a410af67 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 4 Jul 2009 11:44:39 +0000 Subject: [PATCH 227/577] sync cryptdlg with wine 1.1.25 svn path=/trunk/; revision=41766 --- reactos/dll/win32/cryptdlg/cryptdlg.rbuild | 8 +++- reactos/dll/win32/cryptdlg/cryptdlg_De.rc | 2 + reactos/dll/win32/cryptdlg/cryptdlg_En.rc | 2 + reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc | 2 + reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc | 2 + reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc | 41 +++++++++++++++++++ reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc | 2 + .../cryptdlg/{cryptdlg.rc => cryptdlg_Ro.rc} | 32 ++++++++++----- reactos/dll/win32/cryptdlg/cryptres.h | 2 + 9 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc rename reactos/dll/win32/cryptdlg/{cryptdlg.rc => cryptdlg_Ro.rc} (53%) diff --git a/reactos/dll/win32/cryptdlg/cryptdlg.rbuild b/reactos/dll/win32/cryptdlg/cryptdlg.rbuild index cc86691a7fd..6a56a7a294e 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg.rbuild +++ b/reactos/dll/win32/cryptdlg/cryptdlg.rbuild @@ -15,5 +15,11 @@ wintrust ntdll main.c - cryptdlg.rc + cryptdlg_De.rc + cryptdlg_En.rc + cryptdlg_Fr.rc + cryptdlg_Ko.rc + cryptdlg_Lt.rc + cryptdlg_Nl.rc + cryptdlg_Ro.rc diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_De.rc b/reactos/dll/win32/cryptdlg/cryptdlg_De.rc index 647171d8983..d3181ef51b0 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg_De.rc +++ b/reactos/dll/win32/cryptdlg/cryptdlg_De.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_En.rc b/reactos/dll/win32/cryptdlg/cryptdlg_En.rc index 99126c42898..3ab5f94cbbd 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg_En.rc +++ b/reactos/dll/win32/cryptdlg/cryptdlg_En.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc index 23de9ebd572..f71be3ae0fd 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc +++ b/reactos/dll/win32/cryptdlg/cryptdlg_Fr.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc index 3778a57b71d..548a74d7939 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc +++ b/reactos/dll/win32/cryptdlg/cryptdlg_Ko.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc new file mode 100644 index 00000000000..a9674946ba5 --- /dev/null +++ b/reactos/dll/win32/cryptdlg/cryptdlg_Lt.rc @@ -0,0 +1,41 @@ +/* + * cryptdlg dll Lithuanian resources + * + * Copyright 2009 Aurimas FiÅ¡eras + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "cryptres.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_CERT_POLICY "Liudijimo politika" + IDS_POLICY_ID "Politikos identifikatorius: " + IDS_POLICY_QUALIFIER_INFO "Politikos kvalifikatoriaus informacija" + IDS_POLICY_QUALIFIER_ID "Politikos kvalifikatoriaus identifikatorius=" + IDS_CPS "CPS" + IDS_USER_NOTICE "Naudotojo praneÅ¡imas" + IDS_QUALIFIER "Kvalifikatorius" + IDS_NOTICE_REF "PraneÅ¡imo nuoroda" + IDS_ORGANIZATION "Organizacija=" + IDS_NOTICE_NUM "PraneÅ¡imo numeris=" + IDS_NOTICE_TEXT "PraneÅ¡imo tekstas=" +} diff --git a/reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc index 27b09357eb0..3e8aca0d11a 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc +++ b/reactos/dll/win32/cryptdlg/cryptdlg_Nl.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptres.h" + LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/cryptdlg/cryptdlg.rc b/reactos/dll/win32/cryptdlg/cryptdlg_Ro.rc similarity index 53% rename from reactos/dll/win32/cryptdlg/cryptdlg.rc rename to reactos/dll/win32/cryptdlg/cryptdlg_Ro.rc index a4946529a14..17b60e0ef5c 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg.rc +++ b/reactos/dll/win32/cryptdlg/cryptdlg_Ro.rc @@ -1,7 +1,7 @@ /* - * cryptdlg dll resources + * cryptdlg dll Romanian resources * - * Copyright 2008 Juan Lang + * Copyright 2009 Paul Chitescu * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,13 +17,25 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" + #include "cryptres.h" -#include "cryptdlg_De.rc" -#include "cryptdlg_En.rc" -#include "cryptdlg_Fr.rc" -#include "cryptdlg_Ko.rc" -#include "cryptdlg_Nl.rc" +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_CERT_POLICY "Politica certificatului" + IDS_POLICY_ID "Identificatorul politicii: " + IDS_POLICY_QUALIFIER_INFO "InformaÈ›ia calificatorului politicii" + IDS_POLICY_QUALIFIER_ID "Identificatorul calificatorului politicii=" + IDS_CPS "CPS" + IDS_USER_NOTICE "Notiță utilizator" + IDS_QUALIFIER "Calificator" + IDS_NOTICE_REF "ReferinÈ›a notiÈ›ei" + IDS_ORGANIZATION "OrganizaÈ›ia=" + IDS_NOTICE_NUM "Numărul notiÈ›ei=" + IDS_NOTICE_TEXT "Textul notiÈ›ei=" +} diff --git a/reactos/dll/win32/cryptdlg/cryptres.h b/reactos/dll/win32/cryptdlg/cryptres.h index b64459aca78..4d3c2d2ffb3 100644 --- a/reactos/dll/win32/cryptdlg/cryptres.h +++ b/reactos/dll/win32/cryptdlg/cryptres.h @@ -18,6 +18,8 @@ #ifndef __CRYPTRES_H__ #define __CRYPTRES_H__ +#include + #define IDS_CERT_POLICY 100 #define IDS_POLICY_ID 101 #define IDS_POLICY_QUALIFIER_INFO 102 From 954c70f444f3f2570b02592be68113bc0efc7628 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Jul 2009 11:45:42 +0000 Subject: [PATCH 228/577] Remove useless function svn path=/trunk/; revision=41767 --- reactos/subsystems/win32/win32k/objects/palette.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/palette.c b/reactos/subsystems/win32/win32k/objects/palette.c index 6fae07223d6..f787fbb6f71 100644 --- a/reactos/subsystems/win32/win32k/objects/palette.c +++ b/reactos/subsystems/win32/win32k/objects/palette.c @@ -14,7 +14,7 @@ static UINT SystemPaletteUse = SYSPAL_NOSTATIC; /* the program need save the pallete and restore it */ -const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] = +const PALETTEENTRY g_sysPalTemplate[NB_RESERVED_COLORS] = { // first 10 entries in the system palette // red green blue flags @@ -45,11 +45,6 @@ const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] = { 0xff, 0xff, 0xff, PC_SYS_USED } // last 10 }; -const PALETTEENTRY* FASTCALL COLOR_GetSystemPaletteTemplate(void) -{ - return (const PALETTEENTRY*)&COLOR_sysPalTemplate; -} - INT APIENTRY COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, XLATEOBJ *XlateObj, COLORREF col, BOOL skipReserved) { @@ -106,7 +101,6 @@ HPALETTE FASTCALL PALETTE_Init(VOID) #ifndef NO_MAPPING PALOBJ *palObj; #endif - const PALETTEENTRY* __sysPalTemplate = (const PALETTEENTRY*)COLOR_GetSystemPaletteTemplate(); // create default palette (20 system colors) palPtr = ExAllocatePoolWithTag(PagedPool, @@ -119,9 +113,9 @@ HPALETTE FASTCALL PALETTE_Init(VOID) palPtr->palNumEntries = NB_RESERVED_COLORS; for (i=0; ipalPalEntry[i].peRed = __sysPalTemplate[i].peRed; - palPtr->palPalEntry[i].peGreen = __sysPalTemplate[i].peGreen; - palPtr->palPalEntry[i].peBlue = __sysPalTemplate[i].peBlue; + palPtr->palPalEntry[i].peRed = g_sysPalTemplate[i].peRed; + palPtr->palPalEntry[i].peGreen = g_sysPalTemplate[i].peGreen; + palPtr->palPalEntry[i].peBlue = g_sysPalTemplate[i].peBlue; palPtr->palPalEntry[i].peFlags = 0; } From 1e74322bd6851e91b60a06bee8090141820aecdc Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 4 Jul 2009 11:47:38 +0000 Subject: [PATCH 229/577] sync cryptui with wine 1.1.25 svn path=/trunk/; revision=41768 --- reactos/dll/win32/cryptui/cryptui.rbuild | 5 + reactos/dll/win32/cryptui/cryptui.rc | 10 - reactos/dll/win32/cryptui/cryptui_De.rc | 4 +- reactos/dll/win32/cryptui/cryptui_En.rc | 2 + reactos/dll/win32/cryptui/cryptui_Fr.rc | 466 +++++++++++++++++++++++ reactos/dll/win32/cryptui/cryptui_Ko.rc | 1 + reactos/dll/win32/cryptui/cryptui_Nl.rc | 2 + reactos/dll/win32/cryptui/cryptuires.h | 4 + reactos/dll/win32/cryptui/main.c | 22 +- 9 files changed, 493 insertions(+), 23 deletions(-) create mode 100644 reactos/dll/win32/cryptui/cryptui_Fr.rc diff --git a/reactos/dll/win32/cryptui/cryptui.rbuild b/reactos/dll/win32/cryptui/cryptui.rbuild index 932bffe383c..b8cffc0a9a1 100644 --- a/reactos/dll/win32/cryptui/cryptui.rbuild +++ b/reactos/dll/win32/cryptui/cryptui.rbuild @@ -9,6 +9,11 @@ main.c cryptui.rc + cryptui_De.rc + cryptui_En.rc + cryptui_Fr.rc + cryptui_Ko.rc + cryptui_Nl.rc wine kernel32 user32 diff --git a/reactos/dll/win32/cryptui/cryptui.rc b/reactos/dll/win32/cryptui/cryptui.rc index ef998f883e9..00d490273ef 100644 --- a/reactos/dll/win32/cryptui/cryptui.rc +++ b/reactos/dll/win32/cryptui/cryptui.rc @@ -17,11 +17,6 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "commctrl.h" -#include "dlgs.h" #include "cryptuires.h" @@ -45,8 +40,3 @@ IDB_CERT_WATERMARK BITMAP LOADONCALL DISCARDABLE certwatermark.bmp /* @makedep: certheader.bmp */ IDB_CERT_HEADER BITMAP LOADONCALL DISCARDABLE certheader.bmp - -#include "cryptui_De.rc" -#include "cryptui_En.rc" -#include "cryptui_Ko.rc" -#include "cryptui_Nl.rc" diff --git a/reactos/dll/win32/cryptui/cryptui_De.rc b/reactos/dll/win32/cryptui/cryptui_De.rc index dcd7ac8e443..d34d88332cc 100644 --- a/reactos/dll/win32/cryptui/cryptui_De.rc +++ b/reactos/dll/win32/cryptui/cryptui_De.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptuires.h" + #pragma code_page(65001) LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL @@ -461,5 +463,3 @@ BEGIN LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 115,67,174,100 END - -#pragma code_page(default) diff --git a/reactos/dll/win32/cryptui/cryptui_En.rc b/reactos/dll/win32/cryptui/cryptui_En.rc index b10e1015522..1335f0ebe3b 100644 --- a/reactos/dll/win32/cryptui/cryptui_En.rc +++ b/reactos/dll/win32/cryptui/cryptui_En.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptuires.h" + LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/cryptui/cryptui_Fr.rc b/reactos/dll/win32/cryptui/cryptui_Fr.rc new file mode 100644 index 00000000000..22fceda0cda --- /dev/null +++ b/reactos/dll/win32/cryptui/cryptui_Fr.rc @@ -0,0 +1,466 @@ +/* + * cryptui dll French resources + * + * Copyright 2009 Frédéric Delanoy + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "cryptuires.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_CERTIFICATE "Certificat" + IDS_CERTIFICATEINFORMATION "Informations sur le certificat" + IDS_CERT_INFO_BAD_SIG "Ce certificat a une signature invalide. Le certificat peut avoir été modifié ou corrompu." + IDS_CERT_INFO_UNTRUSTED_CA "Ce certificat racine n'est pas approuvé. Pour lui faire confiance, ajoutez-le au magasin de certificats racine de confiance de votre système." + IDS_CERT_INFO_UNTRUSTED_ROOT "Ce certificat n'a pu être validé par un certificat racine de confiance." + IDS_CERT_INFO_PARTIAL_CHAIN "L'émetteur de ce certificat n'a pas été trouvé." + IDS_CERT_INFO_BAD_PURPOSES "Impossible de vérifier tous les rôles prévus pour ce certificat." + IDS_CERT_INFO_PURPOSES "Ce certificat n'est prévu que pour les rôles suivants :" + IDS_SUBJECT_HEADING "Émis pour : " + IDS_ISSUER_HEADING "Émis par : " + IDS_VALID_FROM "Valide à partir du " + IDS_VALID_TO " jusqu'au " + IDS_CERTIFICATE_BAD_SIGNATURE "Ce certificat a une signature invalide." + IDS_CERTIFICATE_BAD_TIME "Ce certificat a expiré ou n'est pas encore valable." + IDS_CERTIFICATE_BAD_TIMENEST "La période de validité de ce certificat dépasse celle de son émetteur." + IDS_CERTIFICATE_REVOKED "Ce certificat a été révoqué par son émetteur." + IDS_CERTIFICATE_VALID "Ce certificat est valide." + IDS_FIELD "Champ" + IDS_VALUE "Valeur" + IDS_FIELDS_ALL "" + IDS_FIELDS_V1 "Champs de version 1 uniquement" + IDS_FIELDS_EXTENSIONS "Extensions uniquement" + IDS_FIELDS_CRITICAL_EXTENSIONS "Extensions critiques uniquement" + IDS_FIELDS_PROPERTIES "Propriétés uniquement" + IDS_FIELD_VERSION "Version" + IDS_FIELD_SERIAL_NUMBER "Numéro de série" + IDS_FIELD_ISSUER "Émetteur" + IDS_FIELD_VALID_FROM "Valide à partir du" + IDS_FIELD_VALID_TO "Valide jusqu'au" + IDS_FIELD_SUBJECT "Sujet" + IDS_FIELD_PUBLIC_KEY "Clé publique" + IDS_FIELD_PUBLIC_KEY_FORMAT "%s (%d bits)" + IDS_PROP_HASH "Empreinte SHA1" + IDS_PROP_ENHKEY_USAGE "Utilisation complémentaire de la clé (propriété)" + IDS_PROP_FRIENDLY_NAME "Nom convivial" + IDS_PROP_DESCRIPTION "Description" + IDS_CERTIFICATE_PROPERTIES "Propriétés du certificat" + IDS_CERTIFICATE_PURPOSE_ERROR "Veuillez entrer l'OID sous la forme 1.2.3.4" + IDS_CERTIFICATE_PURPOSE_EXISTS "L'OID que vous avez entré existe déjà." + IDS_SELECT_STORE_TITLE "Sélectionnez le magasin de certificats" + IDS_SELECT_STORE "Veuillez sélectionner un magasin de certificats." + IDS_IMPORT_WIZARD "Assistant d'importation de certificats" + IDS_IMPORT_TYPE_MISMATCH "Le fichier contient des objets ne satisfaisant pas aux critères spécifiés. Veuillez sélectionner un autre fichier." + IDS_IMPORT_FILE_TITLE "Fichier à importer" + IDS_IMPORT_FILE_SUBTITLE "Spécifiez le fichier à importer." + IDS_IMPORT_STORE_TITLE "Magasin de certificats" + IDS_IMPORT_STORE_SUBTITLE "Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance." + IDS_IMPORT_FILTER_CERT "Certificat X.509 (*.cer; *.crt)" + IDS_IMPORT_FILTER_PFX "Échange d'informations personnelles (*.pfx; *.p12)" + IDS_IMPORT_FILTER_CRL "Liste de révocation de certificats (*.crl)" + IDS_IMPORT_FILTER_CTL "Liste de certificats de confiance (*.stl)" + IDS_IMPORT_FILTER_SERIALIZED_STORE "Magasin de certificats sérialisés Microsoft (*.sst)" + IDS_IMPORT_FILTER_CMS "Messages CMS/PKCS #7 (*.spc; *.p7b)" + IDS_IMPORT_FILTER_ALL "Tous les fichiers (*.*)" + IDS_IMPORT_EMPTY_FILE "Sélectionnez un fichier." + IDS_IMPORT_BAD_FORMAT "Le format du fichier n'est pas reconnu. Sélectionnez un autre fichier." + IDS_IMPORT_OPEN_FAILED "N'a pu ouvrir " + IDS_IMPORT_DEST_DETERMINED "Déterminé par le programme" + IDS_IMPORT_SELECT_STORE "Veuillez sélectionner un magasin" + IDS_IMPORT_STORE_SELECTION "Magasin de certificats sélectionné" + IDS_IMPORT_DEST_AUTOMATIC "Déterminé automatiquement par le programme" + IDS_IMPORT_FILE "Fichier" + IDS_IMPORT_CONTENT "Contenu" + IDS_IMPORT_CONTENT_CERT "Certificat" + IDS_IMPORT_CONTENT_CRL "Liste de révocation de certificats" + IDS_IMPORT_CONTENT_CTL "Liste de certificats de confiance" + IDS_IMPORT_CONTENT_CMS "Message CMS/PKCS #7" + IDS_IMPORT_CONTENT_PFX "Échange d'informations personnelles" + IDS_IMPORT_CONTENT_STORE "Magasin de certificats" + IDS_IMPORT_SUCCEEDED "L'importation a réussi." + IDS_IMPORT_FAILED "L'importation a échoué." + IDS_WIZARD_TITLE_FONT "Arial" + IDS_PURPOSE_ALL "" + IDS_PURPOSE_ADVANCED "" + IDS_SUBJECT_COLUMN "Émis pour" + IDS_ISSUER_COLUMN "Émis par" + IDS_EXPIRATION_COLUMN "Date d'expiration" + IDS_FRIENDLY_NAME_COLUMN "Nom convivial" + IDS_ALLOWED_PURPOSE_ALL "" + IDS_ALLOWED_PURPOSE_NONE "" + IDS_WARN_REMOVE_MY "Vous ne pourrez plus déchiffrer ou signer de messages avec ce certificat.\nVoulez-vous réellement supprimer ce certificat ?" + IDS_WARN_REMOVE_PLURAL_MY "Vous ne pourrez plus déchiffrer ou signer de messages avec ces certificats.\nVoulez-vous réellement supprimer ces certificats ?" + IDS_WARN_REMOVE_ADDRESSBOOK "Vous ne pourrez plus chiffrer ou vérifier de signature de messages avec ce certificat.\nVoulez-vous réellement supprimer ce certificat ?" + IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Vous ne pourrez plus chiffrer ou vérifier de signature de messages avec ces certificats.\nVoulez-vous réellement supprimer ces certificats ?" + IDS_WARN_REMOVE_CA "Les certificats émis par cette autorité de certification ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ce certificat ?" + IDS_WARN_REMOVE_PLURAL_CA "Les certificats émis par cette autorité de certification ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ces certificats ?" + IDS_WARN_REMOVE_ROOT "Les certificats émis par cette autorité de certification racine, ou par toute autorité de certification qu'elle valide, ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ce certificat racine de confiance ?" + IDS_WARN_REMOVE_PLURAL_ROOT "Les certificats émis par ces autorités de certification racines, ou par toute autorité de certification qu'elles valident, ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ces certificats racines de confiance ?" + IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Les logiciels signés par cet éditeur ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ce certificat ?" + IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Les logiciels signés par ces éditeurs ne seront plus considérés comme valables.\nVoulez-vous réellement supprimer ces certificats ?" + IDS_WARN_REMOVE_DEFAULT "Voulez-vous réellement supprimer ce certificat ?" + IDS_WARN_REMOVE_PLURAL_DEFAULT "Voulez-vous réellement supprimer ces certificats ?" + IDS_CERT_MGR "Certificats" + IDS_PURPOSE_SERVER_AUTH "Prouve l'identité d'un ordinateur distant" + IDS_PURPOSE_CLIENT_AUTH "Prouve votre identité à un ordinateur distant" + IDS_PURPOSE_CODE_SIGNING "Garantit que des logiciels proviennent bien d'un éditeur de logiciels donné\nProtège le logiciel contre toute altération après publication" + IDS_PURPOSE_EMAIL_PROTECTION "Protège les courriers électroniques" + IDS_PURPOSE_IPSEC "Permet des communications sécurisées sur Internet" + IDS_PURPOSE_TIMESTAMP_SIGNING "Permet de signer des données avec l'heure courante" + IDS_PURPOSE_CTL_USAGE_SIGNING "Permet de signer numériquement une liste de certificats de confiance" + IDS_PURPOSE_EFS "Permet le chiffrement de données sur disque" + IDS_PURPOSE_EFS_RECOVERY "Restauration de fichier" + IDS_PURPOSE_WHQL "Vérification des pilotes matériels de Windows" + IDS_PURPOSE_NT5 "Vérification des composants système de Windows" + IDS_PURPOSE_OEM_WHQL "Vérification des composants système de Windows OEM" + IDS_PURPOSE_EMBEDDED_NT "Vérification des composants système de Windows embarqué" + IDS_PURPOSE_ROOT_LIST_SIGNER "Signataire de la liste racine" + IDS_PURPOSE_QUALIFIED_SUBORDINATION "Subordination conditionnelle" + IDS_PURPOSE_KEY_RECOVERY "Recouvrement de clé" + IDS_PURPOSE_DOCUMENT_SIGNING "Signature de documents" + IDS_PURPOSE_LIFETIME_SIGNING "Signature à vie" + IDS_PURPOSE_DRM "Droits numériques" + IDS_PURPOSE_LICENSES "Licences de jeux de clés" + IDS_PURPOSE_LICENSE_SERVER "Vérification du serveur de licences" + IDS_PURPOSE_ENROLLMENT_AGENT "Agent de demande de certificat" + IDS_PURPOSE_SMARTCARD_LOGON "Connexion avec carte à puce" + IDS_PURPOSE_CA_EXCHANGE "Archivage de clé privée" + IDS_PURPOSE_KEY_RECOVERY_AGENT "Agent de recouvrement de clé" + IDS_PURPOSE_DS_EMAIL_REPLICATION "Réplication de courriers électroniques du service d'annuaire" + IDS_EXPORT_WIZARD "Assistant Exportation de certificat" + IDS_EXPORT_FORMAT_TITLE "Format d'export" + IDS_EXPORT_FORMAT_SUBTITLE "Choisissez le format dans lequel le contenu sera sauvé." + IDS_EXPORT_FILE_TITLE "Nom du fichier à exporter" + IDS_EXPORT_FILE_SUBTITLE "Choisissez le nom du fichier dans lequel le contenu sera sauvé." + IDS_EXPORT_FILE_EXISTS "Le fichier spécifié existe déjà. Voulez-vous le remplacer ?" + IDS_EXPORT_FILTER_CERT "Binaire codé DER X.509 (*.cer)" + IDS_EXPORT_FILTER_BASE64_CERT "Binaire codé Base64 X.509 (*.cer)" + IDS_EXPORT_FILTER_CRL "Liste de révocation de certificats (*.crl)" + IDS_EXPORT_FILTER_CTL "Liste de certificats de confiance (*.stl)" + IDS_EXPORT_FILTER_CMS "Messages CMS/PKCS #7 (*.p7b)" + IDS_EXPORT_FILTER_PFX "Échange d'informations personnelles (*.pfx)" + IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Magasin de certificats sérialisés (*.sst)" + IDS_EXPORT_FORMAT "Format de fichier" + IDS_EXPORT_INCLUDE_CHAIN "Inclure tous les certificats dans le chemin de certification" + IDS_EXPORT_KEYS "Exporter des clés" + IDS_YES "Oui" + IDS_NO "Non" + IDS_EXPORT_SUCCEEDED "L'export a réussi." + IDS_EXPORT_FAILED "L'export a échoué." + IDS_EXPORT_PRIVATE_KEY_TITLE "Exporter la clé privée" + IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Le certificat contient une clé privée qui peut être exportée avec le certificat." + IDS_EXPORT_PASSWORD_TITLE "Entrez le mot de passe" + IDS_EXPORT_PASSWORD_SUBTITLE "Vous pouvez protéger une clé privée par un mot de passe." + IDS_EXPORT_PASSWORD_MISMATCH "Les mots de passe ne correspondent pas." + IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Note : la clé privée de ce certificat n'a pu être ouverte." + IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Note : la clé privée de ce certificat n'est pas exportable." +} + +IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Général" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", -1, "Static", WS_BORDER|SS_WHITERECT, 6,10,241,200 + CONTROL "", IDC_CERTIFICATE_ICON,"RichEdit20W", + ES_READONLY|WS_DISABLED,8,11,26,26 + CONTROL "", IDC_CERTIFICATE_INFO,"RichEdit20W", + ES_READONLY|WS_DISABLED,34,11,212,26 + CONTROL "", -1, "Static", SS_BLACKFRAME, 16,37,222,1 + CONTROL "", IDC_CERTIFICATE_STATUS,"RichEdit20W", + ES_READONLY|ES_MULTILINE,8,38,238,78 + CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1 + CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W", + ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90 + PUSHBUTTON "&Installer un certificat...", IDC_ADDTOSTORE,103,216,70,14 + PUSHBUTTON "&Déclaration de l'émetteur", IDC_ISSUERSTATEMENT,177,216,70,14 +END + +IDD_DETAIL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Détails" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Afficher :", -1, 6,12,40,14 + COMBOBOX IDC_DETAIL_SELECT, 28,10,100,14, + CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP + CONTROL "", IDC_DETAIL_LIST, "SysListView32", + LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 6,28,241,100 + CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W", + ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70 + PUSHBUTTON "É&diter les propriétés...", IDC_EDITPROPERTIES,103,216,70,14 + PUSHBUTTON "&Copier dans le fichier...", IDC_EXPORT,177,216,70,14 +END + +IDD_HIERARCHY DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Chemin de certification" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Chemin de &certification", -1,6,10,245,165, BS_GROUPBOX + CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER, + 13,22,231,130 + PUSHBUTTON "&Voir le certificat", IDC_VIEWCERTIFICATE,175,156,70,14 + LTEXT "É&tant du certificat :", IDC_CERTIFICATESTATUS,6,183,70,14 + CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W", + WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36 +END + +IDD_USERNOTICE DIALOG DISCARDABLE 0, 0, 255, 256 +CAPTION "Avis de non-responsabilité" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_USERNOTICE,"RichEdit20W", + WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200 + PUSHBUTTON "Fermer", IDOK,103,216,70,14 + PUSHBUTTON "&Informations complémentaires", IDC_CPS,177,216,70,14 +END + +IDD_CERT_PROPERTIES_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Général" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Nom convivial :", -1, 6,14,60,14 + EDITTEXT IDC_FRIENDLY_NAME, 60,12,191,14, ES_AUTOHSCROLL|WS_TABSTOP + LTEXT "&Description:", -1, 6,32,60,14 + EDITTEXT IDC_DESCRIPTION, 60,30,191,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + GROUPBOX "Rôles du certificat", -1,6,48,245,165, BS_GROUPBOX + AUTORADIOBUTTON "Activer &tous les rôles prévus pour ce certificat", + IDC_ENABLE_ALL_PURPOSES, 12,58,180,14, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "&Désactiver tous les rôles prévus pour ce certificat", + IDC_DISABLE_ALL_PURPOSES, 12,70,180,14, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "N'activer &que les rôles suivants pour ce certificat :", + IDC_ENABLE_SELECTED_PURPOSES, 12,82,180,14, BS_AUTORADIOBUTTON + CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 24,100,220,90 + PUSHBUTTON "&Ajouter un rôle...", IDC_ADD_PURPOSE,184,194,60,14 +END + +IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68 +CAPTION "Ajouter un rôle" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Adjoindre l'identifiant d'objet (OIS) au rôle de certificat à ajouter :", + -1, 6,6,190,28 + EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + PUSHBUTTON "OK", IDOK, 33,48,60,14 + PUSHBUTTON "Annuler", IDCANCEL, 100,48,60,14 +END + +IDD_SELECT_STORE DIALOG DISCARDABLE 0,0,200,136 +CAPTION "Sélectionner un magasin de certificats" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Sélectionnez le magasin de certificats à utiliser :", IDC_STORE_TEXT, 6,6,190,28 + CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP, + 6,28,188,70 + CHECKBOX "&Montrer les magasins (emplacements de stockage) physiques", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14, + BS_AUTOCHECKBOX|WS_TABSTOP + PUSHBUTTON "OK", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Annuler", IDCANCEL, 144,118,50,14 +END + +IDD_IMPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant d'importation de certificats" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Bienvenue dans l'assistant d'importation de certificats", IDC_IMPORT_TITLE, + 115,1,195,40 + LTEXT "Cet assistant vous aide à importer des certificats, des listes de révocation de certificats et des listes de certificats de confiance dans un magasin de certificats à partir d'un fichier.", + -1, 115,33,195,16 + LTEXT "Un certificat peut être utilisé pour vous identifier, ou pour identifier l'ordinateur avec lequel vous communiquez. Il peut également être utilisé à des fins d'authentification ou de signature de messages. Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance.", + -1, 115,56,195,40 + LTEXT "Pour continuer, cliquez Suivant.", + -1, 115,103,195,8 +END + +IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant Importation de certificats" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Nom du fichier :", -1, 21,1,195,10 + EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "Parco&urir...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14 + LTEXT "Remarque : les formats de fichiers suivants peuvent contenir plus d'un certificat, liste de révocation de certificats ou liste de certificats de confiance :", + -1, 21,26,265,16 + LTEXT "Standard de syntaxe de message cryptographique - Messages PKCS #7 (.p7b)", + -1, 31,49,265,10 + LTEXT "Échange d'informations personnelles - PKCS #12 (.pfx, .p12)", + -1, 31,64,265,10 + LTEXT "Magasin de certificats sérialisés Microsoft (.sst)", + -1, 31,79,265,10 +END + +IDD_IMPORT_STORE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant Importation de certificats" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wine peut sélectionner automatiquement un magasin de certificats, ou vous pouvez spécifier l'emplacement des certificats.", + -1, 21,1,195,20 + AUTORADIOBUTTON "Sélectionner &automatiquement un magasin de certificats", + IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "Placer tous les certificats dans le &magasin suivant :", + IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON + EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY + PUSHBUTTON "&Parcourir...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14 +END + +IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant Importation de certificat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Clôturer l'assistant d'importation de certificat", IDC_IMPORT_TITLE, + 115,1,195,40 + LTEXT "Vous avez terminé avec succès l'assistant d'importation de certificat.", + -1, 115,33,195,24 + LTEXT "Vous avez spécifié les paramètres suivants :", + -1, 115,57,195,12 + CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 115,67,174,100 +END + +IDD_CERT_MGR DIALOG DISCARDABLE 0,0,335,270 +CAPTION "Certificats" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Rôle prévu :", -1, 7,9,100,12 + COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14, + CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP + CONTROL "", IDC_MGR_STORES, "SysTabControl32", + WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140 + CONTROL "", IDC_MGR_CERTS, "SysListView32", + LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111 + PUSHBUTTON "&Importer...", IDC_MGR_IMPORT, 7,172,51,14 + PUSHBUTTON "&Exporter...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED + PUSHBUTTON "&Supprimer", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED + PUSHBUTTON "&Avancé...", IDC_MGR_ADVANCED, 277,172,51,14 + GROUPBOX "Rôles prévus pour le certificat", -1,7,194,321,47, BS_GROUPBOX + LTEXT "", IDC_MGR_PURPOSES, 13,208,252,30 + PUSHBUTTON "&Détails...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED + PUSHBUTTON "&Fermer", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON +END + +IDD_CERT_MGR_ADVANCED DIALOG DISCARDABLE 0,0,248,176 +CAPTION "Options avancées" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Rôle du certificat", -1, 7,7,234,141, BS_GROUPBOX + LTEXT "Sélectionnez un ou plusieurs rôles à lister quand les options avancées sont sélectionnées.", + -1, 14,18,220,16 + LTEXT "&Rôles du certificat :", -1, 14,41,90,12, WS_TABSTOP + CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 14,51,220,90 + PUSHBUTTON "OK", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Annuler", IDCANCEL, 190,155,51,14 +END + +IDD_EXPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant d'exportation de certificats" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Bienvenue dans l'assistant d'exportation de certificats", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "Cet assistant vous aide à exporter des certificats, des listes de révocation de certificats et des listes de certificats de confiance dans un fichier à partir d'un magasin de certificats.", + -1, 115,33,195,16 + LTEXT "Un certificat peut être utilisé pour vous identifier, ou pour identifier l'ordinateur avec lequel vous communiquez. Il peut également être utilisé à des fins d'authentification ou de signature de messages. Les magasins de certificats sont des collections de certificats, de listes de révocation de certificats et de listes de certificats de confiance.", + -1, 115,56,195,40 + LTEXT "Pour continuer, cliquez Suivant.", + -1, 115,103,195,8 +END + +IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant Exportation de certificat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Si vous choisissez d'exporter la clé privée, on vous demandera un mot de passe pour protéger la clé privée dans une page ultérieure.", -1, 21,1,195,23 + LTEXT "Voulez-vous exporter la clé privée ?", -1, 21,24,195,15 + AUTORADIOBUTTON "&Oui, exporter la clé privée", + IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "&Non, ne pas exporter la clé privée", + IDC_EXPORT_PRIVATE_KEY_NO, 31,48,200,12, BS_AUTORADIOBUTTON + LTEXT "", IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE, 21,60,200,24 +END + +IDD_EXPORT_PASSWORD DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant Exportation de certificat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Mot de passe :", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + LTEXT "&Confirmez le mot de passe:", -1, 21,35,195,10 + EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP +END + +IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant Exportation de certificat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Sélectionnez le format à utiliser :", -1, 21,1,195,10 + AUTORADIOBUTTON "Binaire codé &DER X.509 (*.cer)", + IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "Binaire codé Ba&se64 X.509 (.cer):", + IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "Standard de syntaxe de message cryptographique - Messages PKCS #7 (.p7b)", + IDC_EXPORT_FORMAT_CMS, 31,42,200,12, BS_AUTORADIOBUTTON + CHECKBOX "&Inclure tous les certificats dans le chemin de certification si possible" + IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + AUTORADIOBUTTON "Échange d'informations &Personnelles - PKCS #12 (.pfx)", + IDC_EXPORT_FORMAT_PFX, 31,72,200,12, BS_AUTORADIOBUTTON|WS_DISABLED + CHECKBOX "Inclure &tous les certificats dans le chemin de certification si possible", + IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,200,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "&Activer le chiffrement fort", + IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "&Effacer la clé privée si l'export a réussi", + IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,200,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED +END + +IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant Exportation de certificat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Nom du fichier :", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "Parco&urir...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14 +END + +IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Assistant Exportation de certificat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Clôturer l'assistant d'exportation de certificat", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "Vous avez terminé avec succès l'assistant d'importation de certificat.", + -1, 115,33,195,24 + LTEXT "Vous avez spécifié les paramètres suivants :", + -1, 115,57,195,12 + CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 115,67,174,100 +END diff --git a/reactos/dll/win32/cryptui/cryptui_Ko.rc b/reactos/dll/win32/cryptui/cryptui_Ko.rc index 57e91386bd8..6cbf6fee8b1 100644 --- a/reactos/dll/win32/cryptui/cryptui_Ko.rc +++ b/reactos/dll/win32/cryptui/cryptui_Ko.rc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptuires.h" LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT diff --git a/reactos/dll/win32/cryptui/cryptui_Nl.rc b/reactos/dll/win32/cryptui/cryptui_Nl.rc index d046d376b8a..a346083f29d 100644 --- a/reactos/dll/win32/cryptui/cryptui_Nl.rc +++ b/reactos/dll/win32/cryptui/cryptui_Nl.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "cryptuires.h" + LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE diff --git a/reactos/dll/win32/cryptui/cryptuires.h b/reactos/dll/win32/cryptui/cryptuires.h index b46ea4e128e..716dba5e3a6 100644 --- a/reactos/dll/win32/cryptui/cryptuires.h +++ b/reactos/dll/win32/cryptui/cryptuires.h @@ -18,6 +18,10 @@ #ifndef __CRYPTUIRES_H_ #define __CRYPTUIRES_H_ +#include +#include +#include + #define IDS_CERTIFICATE 1000 #define IDS_CERTIFICATEINFORMATION 1001 #define IDS_CERT_INFO_BAD_SIG 1002 diff --git a/reactos/dll/win32/cryptui/main.c b/reactos/dll/win32/cryptui/main.c index f15420b4bca..c11868aa456 100644 --- a/reactos/dll/win32/cryptui/main.c +++ b/reactos/dll/win32/cryptui/main.c @@ -2146,7 +2146,7 @@ static CRYPT_OBJID_BLOB *find_policy_qualifier(CERT_POLICIES_INFO *policies, return ret; } -static WCHAR *get_cps_str_from_qualifier(CRYPT_OBJID_BLOB *qualifier) +static WCHAR *get_cps_str_from_qualifier(const CRYPT_OBJID_BLOB *qualifier) { LPWSTR qualifierStr = NULL; CERT_NAME_VALUE *qualifierValue; @@ -2167,7 +2167,7 @@ static WCHAR *get_cps_str_from_qualifier(CRYPT_OBJID_BLOB *qualifier) return qualifierStr; } -static WCHAR *get_user_notice_from_qualifier(CRYPT_OBJID_BLOB *qualifier) +static WCHAR *get_user_notice_from_qualifier(const CRYPT_OBJID_BLOB *qualifier) { LPWSTR str = NULL; CERT_POLICY_QUALIFIER_USER_NOTICE *qualifierValue; @@ -2773,7 +2773,7 @@ static void add_v1_fields(HWND hwnd, struct detail_data *data) add_v1_field(hwnd, data, &v1_fields[i]); } -static WCHAR *crypt_format_extension(PCERT_EXTENSION ext, DWORD formatStrType) +static WCHAR *crypt_format_extension(const CERT_EXTENSION *ext, DWORD formatStrType) { WCHAR *str = NULL; DWORD size; @@ -2788,7 +2788,7 @@ static WCHAR *crypt_format_extension(PCERT_EXTENSION ext, DWORD formatStrType) return str; } -static WCHAR *field_format_extension_hex_with_ascii(PCERT_EXTENSION ext) +static WCHAR *field_format_extension_hex_with_ascii(const CERT_EXTENSION *ext) { WCHAR *str = NULL; @@ -3986,7 +3986,7 @@ static void show_cert_chain(HWND hwnd, struct hierarchy_data *data) } } -static void set_certificate_status(HWND hwnd, CRYPT_PROVIDER_CERT *cert) +static void set_certificate_status(HWND hwnd, const CRYPT_PROVIDER_CERT *cert) { /* Select all the text in the control, the next update will replace it */ SendMessageW(hwnd, EM_SETSEL, 0, -1); @@ -5602,7 +5602,7 @@ static PCRYPT_KEY_PROV_INFO export_get_private_key_info(PCCERT_CONTEXT cert) return info; } -static BOOL export_acquire_private_key(PCRYPT_KEY_PROV_INFO info, +static BOOL export_acquire_private_key(const CRYPT_KEY_PROV_INFO *info, HCRYPTPROV *phProv) { BOOL ret; @@ -5733,7 +5733,7 @@ static BOOL export_info_has_private_key(PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo) return ret; } -static void export_format_enable_controls(HWND hwnd, struct ExportWizData *data) +static void export_format_enable_controls(HWND hwnd, const struct ExportWizData *data) { int defaultFormatID; @@ -5874,7 +5874,7 @@ static LRESULT CALLBACK export_format_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, return ret; } -static void export_password_mismatch(HWND hwnd, struct ExportWizData *data) +static void export_password_mismatch(HWND hwnd, const struct ExportWizData *data) { WCHAR title[MAX_STRING_LEN], error[MAX_STRING_LEN]; LPCWSTR pTitle; @@ -5979,7 +5979,7 @@ static LRESULT CALLBACK export_password_dlg_proc(HWND hwnd, UINT msg, return ret; } -static LPWSTR export_append_extension(struct ExportWizData *data, +static LPWSTR export_append_extension(const struct ExportWizData *data, LPWSTR fileName) { static const WCHAR cer[] = { '.','c','e','r',0 }; @@ -6305,7 +6305,7 @@ static LRESULT CALLBACK export_file_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, return ret; } -static void show_export_details(HWND lv, struct ExportWizData *data) +static void show_export_details(HWND lv, const struct ExportWizData *data) { WCHAR text[MAX_STRING_LEN]; LVITEMW item; @@ -6783,7 +6783,7 @@ static LRESULT CALLBACK export_finish_dlg_proc(HWND hwnd, UINT msg, WPARAM wp, } static BOOL show_export_ui(DWORD dwFlags, HWND hwndParent, - LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, void *pvoid) + LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, const void *pvoid) { PROPSHEETHEADERW hdr; PROPSHEETPAGEW pages[6]; From 2a8f77e56f9248091892f5eaab4b792ae7b36fa2 Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 4 Jul 2009 11:49:53 +0000 Subject: [PATCH 230/577] sync jscript with wine 1.1.25 svn path=/trunk/; revision=41769 --- reactos/dll/win32/jscript/array.c | 2 +- reactos/dll/win32/jscript/bool.c | 2 +- reactos/dll/win32/jscript/date.c | 1473 ++++++++++++++++++++++++-- reactos/dll/win32/jscript/dispex.c | 2 +- reactos/dll/win32/jscript/function.c | 19 +- reactos/dll/win32/jscript/jscript.h | 5 +- reactos/dll/win32/jscript/number.c | 2 +- reactos/dll/win32/jscript/object.c | 2 +- reactos/dll/win32/jscript/regexp.c | 2 +- reactos/dll/win32/jscript/string.c | 2 +- 10 files changed, 1400 insertions(+), 111 deletions(-) diff --git a/reactos/dll/win32/jscript/array.c b/reactos/dll/win32/jscript/array.c index 8f0802e8e93..cd40e432517 100644 --- a/reactos/dll/win32/jscript/array.c +++ b/reactos/dll/win32/jscript/array.c @@ -829,7 +829,7 @@ HRESULT create_array_constr(script_ctx_t *ctx, DispatchEx **ret) if(FAILED(hres)) return hres; - hres = create_builtin_function(ctx, ArrayConstr_value, PROPF_CONSTR, &array->dispex, ret); + hres = create_builtin_function(ctx, ArrayConstr_value, NULL, PROPF_CONSTR, &array->dispex, ret); IDispatchEx_Release(_IDispatchEx_(&array->dispex)); return hres; diff --git a/reactos/dll/win32/jscript/bool.c b/reactos/dll/win32/jscript/bool.c index 1add8efb768..7e3bf7ac738 100644 --- a/reactos/dll/win32/jscript/bool.c +++ b/reactos/dll/win32/jscript/bool.c @@ -142,7 +142,7 @@ HRESULT create_bool_constr(script_ctx_t *ctx, DispatchEx **ret) if(FAILED(hres)) return hres; - hres = create_builtin_function(ctx, BoolConstr_value, PROPF_CONSTR, &bool->dispex, ret); + hres = create_builtin_function(ctx, BoolConstr_value, NULL, PROPF_CONSTR, &bool->dispex, ret); jsdisp_release(&bool->dispex); return hres; diff --git a/reactos/dll/win32/jscript/date.c b/reactos/dll/win32/jscript/date.c index 3fd856eaebb..9dcc8a7391b 100644 --- a/reactos/dll/win32/jscript/date.c +++ b/reactos/dll/win32/jscript/date.c @@ -35,6 +35,10 @@ typedef struct { DOUBLE time; LONG bias; + SYSTEMTIME standardDate; + LONG standardBias; + SYSTEMTIME daylightDate; + LONG daylightBias; } DateInstance; static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; @@ -83,18 +87,33 @@ static const WCHAR setUTCMonthW[] = {'s','e','t','U','T','C','M','o','n','t','h' static const WCHAR setFullYearW[] = {'s','e','t','F','u','l','l','Y','e','a','r',0}; static const WCHAR setUTCFullYearW[] = {'s','e','t','U','T','C','F','u','l','l','Y','e','a','r',0}; -/*ECMA-262 3th Edition 15.9.1.2 */ +static const WCHAR UTCW[] = {'U','T','C',0}; +static const WCHAR parseW[] = {'p','a','r','s','e',0}; + +/*ECMA-262 3rd Edition 15.9.1.2 */ #define MS_PER_DAY 86400000 #define MS_PER_HOUR 3600000 #define MS_PER_MINUTE 60000 -/* ECMA-262 3th Edition 15.9.1.2 */ +/* ECMA-262 3rd Edition 15.9.1.2 */ static inline DOUBLE day(DOUBLE time) { return floor(time / MS_PER_DAY); } -/* ECMA-262 3th Edition 15.9.1.3 */ +/* ECMA-262 3rd Edition 15.9.1.2 */ +static inline DOUBLE time_within_day(DOUBLE time) +{ + DOUBLE ret; + + ret = fmod(time, MS_PER_DAY); + if(ret < 0) + ret += MS_PER_DAY; + + return ret; +} + +/* ECMA-262 3rd Edition 15.9.1.3 */ static inline DOUBLE days_in_year(DOUBLE year) { int y; @@ -109,26 +128,54 @@ static inline DOUBLE days_in_year(DOUBLE year) return 366; } -/* ECMA-262 3th Edition 15.9.1.3 */ +/* ECMA-262 3rd Edition 15.9.1.3 */ static inline DOUBLE day_from_year(DOUBLE year) { - int y; - if(year != (int)year) return ret_nan(); - y = year; - return 365*(y-1970) + floor((y-1969)/4) - - floor((y-1901)/100) + floor((y-1601)/400); + return floor(365.0*(year-1970) + floor((year-1969)/4) + - floor((year-1901)/100) + floor((year-1601)/400)); } -/* ECMA-262 3th Edition 15.9.1.3 */ +static inline int day_from_month(int month, int in_leap_year) +{ + switch(month) + { + case 0: + return 0; + case 1: + return 31; + case 2: + return 59+in_leap_year; + case 3: + return 90+in_leap_year; + case 4: + return 120+in_leap_year; + case 5: + return 151+in_leap_year; + case 6: + return 181+in_leap_year; + case 7: + return 212+in_leap_year; + case 8: + return 243+in_leap_year; + case 9: + return 273+in_leap_year; + case 10: + return 304+in_leap_year; + default: + return 334+in_leap_year; + } +} + +/* ECMA-262 3rd Edition 15.9.1.3 */ static inline DOUBLE time_from_year(DOUBLE year) { return MS_PER_DAY*day_from_year(year); } -/* ECMA-262 3th Edition 15.9.1.3 */ +/* ECMA-262 3rd Edition 15.9.1.3 */ static inline DOUBLE year_from_time(DOUBLE time) { int y; @@ -146,7 +193,7 @@ static inline DOUBLE year_from_time(DOUBLE time) return y; } -/* ECMA-262 3th Edition 15.9.1.3 */ +/* ECMA-262 3rd Edition 15.9.1.3 */ static inline int in_leap_year(DOUBLE time) { if(days_in_year(year_from_time(time))==366) @@ -154,13 +201,13 @@ static inline int in_leap_year(DOUBLE time) return 0; } -/* ECMA-262 3th Edition 15.9.1.4 */ +/* ECMA-262 3rd Edition 15.9.1.4 */ static inline int day_within_year(DOUBLE time) { return day(time) - day_from_year(year_from_time(time)); } -/* ECMA-262 3th Edition 15.9.1.4 */ +/* ECMA-262 3rd Edition 15.9.1.4 */ static inline DOUBLE month_from_time(DOUBLE time) { int ily = in_leap_year(time); @@ -183,7 +230,7 @@ static inline DOUBLE month_from_time(DOUBLE time) return 11; } -/* ECMA-262 3th Edition 15.9.1.5 */ +/* ECMA-262 3rd Edition 15.9.1.5 */ static inline DOUBLE date_from_time(DOUBLE time) { int dwy = day_within_year(time); @@ -207,7 +254,7 @@ static inline DOUBLE date_from_time(DOUBLE time) return dwy-333-ily; } -/* ECMA-262 3th Edition 15.9.1.6 */ +/* ECMA-262 3rd Edition 15.9.1.6 */ static inline DOUBLE week_day(DOUBLE time) { DOUBLE ret; @@ -221,7 +268,81 @@ static inline DOUBLE week_day(DOUBLE time) return ret; } -/* ECMA-262 3th Edition 15.9.1.10 */ +static inline DOUBLE convert_time(int year, SYSTEMTIME st) +{ + DOUBLE time; + int set_week_day; + + if(st.wMonth == 0) + return ret_nan(); + + if(st.wYear != 0) + year = st.wYear; + + time = time_from_year(year); + time += (DOUBLE)day_from_month(st.wMonth-1, in_leap_year(time)) * MS_PER_DAY; + + if(st.wYear == 0) { + set_week_day = st.wDayOfWeek-week_day(time); + if(set_week_day < 0) + set_week_day += 7; + time += set_week_day * MS_PER_DAY; + + time += (DOUBLE)(st.wDay-1) * 7 * MS_PER_DAY; + if(month_from_time(time) != st.wMonth-1) + time -= 7 * MS_PER_DAY; + } + else + time += st.wDay * MS_PER_DAY; + + time += st.wHour * MS_PER_HOUR; + time += st.wMinute * MS_PER_MINUTE; + + return time; +} + +/* ECMA-262 3rd Edition 15.9.1.9 */ +static inline DOUBLE daylight_saving_ta(DOUBLE time, DateInstance *date) +{ + int year = year_from_time(time); + DOUBLE standardTime, daylightTime; + + if(isnan(time)) + return 0; + + standardTime = convert_time(year, date->standardDate); + daylightTime = convert_time(year, date->daylightDate); + + if(isnan(standardTime) || isnan(daylightTime)) + return 0; + else if(standardTime > daylightTime) { + if(daylightTime <= time && time < standardTime) + return date->daylightBias; + + return date->standardBias; + } + else { + if(standardTime <= time && time < daylightTime) + return date->standardBias; + + return date->daylightBias; + } +} + +/* ECMA-262 3rd Edition 15.9.1.9 */ +static inline DOUBLE local_time(DOUBLE time, DateInstance *date) +{ + return time - (daylight_saving_ta(time, date)+date->bias)*MS_PER_MINUTE; +} + +/* ECMA-262 3rd Edition 15.9.1.9 */ +static inline DOUBLE utc(DOUBLE time, DateInstance *date) +{ + time += date->bias * MS_PER_MINUTE; + return time + daylight_saving_ta(time, date)*MS_PER_MINUTE; +} + +/* ECMA-262 3rd Edition 15.9.1.10 */ static inline DOUBLE hour_from_time(DOUBLE time) { DOUBLE ret; @@ -235,7 +356,7 @@ static inline DOUBLE hour_from_time(DOUBLE time) return ret; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.1.10 */ static inline DOUBLE min_from_time(DOUBLE time) { DOUBLE ret; @@ -249,7 +370,7 @@ static inline DOUBLE min_from_time(DOUBLE time) return ret; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.1.10 */ static inline DOUBLE sec_from_time(DOUBLE time) { DOUBLE ret; @@ -263,7 +384,7 @@ static inline DOUBLE sec_from_time(DOUBLE time) return ret; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.1.10 */ static inline DOUBLE ms_from_time(DOUBLE time) { DOUBLE ret; @@ -277,6 +398,36 @@ static inline DOUBLE ms_from_time(DOUBLE time) return ret; } +/* ECMA-262 3rd Edition 15.9.1.11 */ +static inline DOUBLE make_time(DOUBLE hour, DOUBLE min, DOUBLE sec, DOUBLE ms) +{ + return hour*MS_PER_HOUR + min*MS_PER_MINUTE + sec*1000 + ms; +} + +/* ECMA-262 3rd Edition 15.9.1.12 */ +static inline DOUBLE make_day(DOUBLE year, DOUBLE month, DOUBLE day) +{ + DOUBLE time; + + year += floor(month/12); + + month = fmod(month, 12); + if(month<0) month += 12; + + time = time_from_year(year); + + day += floor(time / MS_PER_DAY); + day += day_from_month(month, in_leap_year(time)); + + return day-1; +} + +/* ECMA-262 3rd Edition 15.9.1.13 */ +static inline DOUBLE make_date(DOUBLE day, DOUBLE time) +{ + return day*MS_PER_DAY + time; +} + /* ECMA-262 3rd Edition 15.9.1.14 */ static inline DOUBLE time_clip(DOUBLE time) { @@ -287,18 +438,204 @@ static inline DOUBLE time_clip(DOUBLE time) return floor(time); } +static SYSTEMTIME create_systemtime(DOUBLE time) +{ + SYSTEMTIME st; + + st.wYear = year_from_time(time); + st.wMonth = month_from_time(time) + 1; + st.wDayOfWeek = week_day(time); + st.wDay = date_from_time(time); + st.wHour = hour_from_time(time); + st.wMinute = min_from_time(time); + st.wSecond = sec_from_time(time); + st.wMilliseconds = ms_from_time(time); + + return st; +} + +/* ECMA-262 3rd Edition 15.9.1.2 */ static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR NaNW[] = { 'N','a','N',0 }; + static const WCHAR formatW[] = { '%','s',' ','%','s',' ','%','d',' ', + '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ', + 'U','T','C','%','c','%','0','2','d','%','0','2','d',' ','%','d','%','s',0 }; + static const WCHAR formatUTCW[] = { '%','s',' ','%','s',' ','%','d',' ', + '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ', + 'U','T','C',' ','%','d','%','s',0 }; + static const WCHAR ADW[] = { 0 }; + static const WCHAR BCW[] = { ' ','B','.','C','.',0 }; + + static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, + LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, + LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6 }; + static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, + LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4, + LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, + LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, + LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10, + LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 }; + + BOOL formatAD = TRUE; + BSTR week, month; + DateInstance *date; + BSTR date_str; + DOUBLE time; + int len, size, year, day, offset; + DWORD lcid_en, week_id, month_id; + WCHAR sign = '-'; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + date = (DateInstance*)dispex; + + if(isnan(date->time)) { + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(NaNW); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + } + return S_OK; + } + + time = local_time(date->time, date); + + if(retv) { + len = 21; + + lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT); + + week_id = week_ids[(int)week_day(time)]; + size = GetLocaleInfoW(lcid_en, week_id, NULL, 0); + week = SysAllocStringLen(NULL, size); + if(!week) + return E_OUTOFMEMORY; + GetLocaleInfoW(lcid_en, week_id, week, size); + len += size-1; + + month_id = month_ids[(int)month_from_time(time)]; + size = GetLocaleInfoW(lcid_en, month_id, NULL, 0); + month = SysAllocStringLen(NULL, size); + if(!month) { + SysFreeString(week); + return E_OUTOFMEMORY; + } + GetLocaleInfoW(lcid_en, month_id, month, size); + len += size-1; + + year = year_from_time(time); + if(year<0) + year = -year+1; + do { + year /= 10; + len++; + } while(year); + + year = year_from_time(time); + if(year<0) { + formatAD = FALSE; + year = -year+1; + len += 5; + } + + day = date_from_time(time); + do { + day /= 10; + len++; + } while(day); + day = date_from_time(time); + + offset = date->bias + + daylight_saving_ta(time, date); + + if(offset == 0) len -= 5; + else if(offset < 0) { + sign = '+'; + offset = -offset; + } + + date_str = SysAllocStringLen(NULL, len); + if(!date_str) { + SysFreeString(week); + SysFreeString(month); + return E_OUTOFMEMORY; + } + + if(offset) + sprintfW(date_str, formatW, week, month, day, + (int)hour_from_time(time), (int)min_from_time(time), + (int)sec_from_time(time), sign, offset/60, offset%60, + year, formatAD?ADW:BCW); + else + sprintfW(date_str, formatUTCW, week, month, day, + (int)hour_from_time(time), (int)min_from_time(time), + (int)sec_from_time(time), year, formatAD?ADW:BCW); + + SysFreeString(week); + SysFreeString(month); + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = date_str; + } + return S_OK; } +/* ECMA-262 3rd Edition 15.9.1.5 */ static HRESULT Date_toLocaleString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR NaNW[] = { 'N','a','N',0 }; + SYSTEMTIME st; + DateInstance *date; + BSTR date_str; + int date_len, time_len; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + date = (DateInstance*)dispex; + + if(isnan(date->time)) { + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(NaNW); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + } + return S_OK; + } + + st = create_systemtime(local_time(date->time, date)); + + if(st.wYear<1601 || st.wYear>9999) + return Date_toString(dispex, lcid, flags, dp, retv, ei, caller); + + if(retv) { + date_len = GetDateFormatW(lcid, DATE_LONGDATE, &st, NULL, NULL, 0); + time_len = GetTimeFormatW(lcid, 0, &st, NULL, NULL, 0); + date_str = SysAllocStringLen(NULL, date_len+time_len-1); + if(!date_str) + return E_OUTOFMEMORY; + GetDateFormatW(lcid, DATE_LONGDATE, &st, NULL, date_str, date_len); + GetTimeFormatW(lcid, 0, &st, NULL, &date_str[date_len], time_len); + date_str[date_len-1] = ' '; + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = date_str; + } + return S_OK; } static HRESULT Date_hasOwnProperty(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -329,39 +666,381 @@ static HRESULT Date_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM return E_NOTIMPL; } +/* ECMA-262 3rd Edition 15.9.5.42 */ static HRESULT Date_toUTCString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR NaNW[] = { 'N','a','N',0 }; + static const WCHAR formatADW[] = { '%','s',',',' ','%','d',' ','%','s',' ','%','d',' ', + '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ','U','T','C',0 }; + static const WCHAR formatBCW[] = { '%','s',',',' ','%','d',' ','%','s',' ','%','d',' ','B','.','C','.',' ', + '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ','U','T','C',0 }; + + static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, + LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, + LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6 }; + static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, + LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4, + LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, + LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, + LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10, + LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 }; + + BOOL formatAD = TRUE; + BSTR week, month; + DateInstance *date; + BSTR date_str; + int len, size, year, day; + DWORD lcid_en, week_id, month_id; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + date = (DateInstance*)dispex; + + if(isnan(date->time)) { + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(NaNW); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + } + return S_OK; + } + + if(retv) { + len = 17; + + lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT); + + week_id = week_ids[(int)week_day(date->time)]; + size = GetLocaleInfoW(lcid_en, week_id, NULL, 0); + week = SysAllocStringLen(NULL, size); + if(!week) + return E_OUTOFMEMORY; + GetLocaleInfoW(lcid_en, week_id, week, size); + len += size-1; + + month_id = month_ids[(int)month_from_time(date->time)]; + size = GetLocaleInfoW(lcid_en, month_id, NULL, 0); + month = SysAllocStringLen(NULL, size); + if(!month) { + SysFreeString(week); + return E_OUTOFMEMORY; + } + GetLocaleInfoW(lcid_en, month_id, month, size); + len += size-1; + + year = year_from_time(date->time); + if(year<0) + year = -year+1; + do { + year /= 10; + len++; + } while(year); + + year = year_from_time(date->time); + if(year<0) { + formatAD = FALSE; + year = -year+1; + len += 5; + } + + day = date_from_time(date->time); + do { + day /= 10; + len++; + } while(day); + day = date_from_time(date->time); + + date_str = SysAllocStringLen(NULL, len); + if(!date_str) { + SysFreeString(week); + SysFreeString(month); + return E_OUTOFMEMORY; + } + sprintfW(date_str, formatAD?formatADW:formatBCW, week, day, month, year, + (int)hour_from_time(date->time), (int)min_from_time(date->time), + (int)sec_from_time(date->time)); + + SysFreeString(week); + SysFreeString(month); + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = date_str; + } + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.3 */ static HRESULT Date_toDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR NaNW[] = { 'N','a','N',0 }; + static const WCHAR formatADW[] = { '%','s',' ','%','s',' ','%','d',' ','%','d',0 }; + static const WCHAR formatBCW[] = { '%','s',' ','%','s',' ','%','d',' ','%','d',' ','B','.','C','.',0 }; + + static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, + LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, + LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6 }; + static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, + LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4, + LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, + LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, + LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10, + LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 }; + + BOOL formatAD = TRUE; + BSTR week, month; + DateInstance *date; + BSTR date_str; + DOUBLE time; + int len, size, year, day; + DWORD lcid_en, week_id, month_id; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + date = (DateInstance*)dispex; + + if(isnan(date->time)) { + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(NaNW); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + } + return S_OK; + } + + time = local_time(date->time, date); + + if(retv) { + len = 5; + + lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT); + + week_id = week_ids[(int)week_day(time)]; + size = GetLocaleInfoW(lcid_en, week_id, NULL, 0); + week = SysAllocStringLen(NULL, size); + if(!week) + return E_OUTOFMEMORY; + GetLocaleInfoW(lcid_en, week_id, week, size); + len += size-1; + + month_id = month_ids[(int)month_from_time(time)]; + size = GetLocaleInfoW(lcid_en, month_id, NULL, 0); + month = SysAllocStringLen(NULL, size); + if(!month) { + SysFreeString(week); + return E_OUTOFMEMORY; + } + GetLocaleInfoW(lcid_en, month_id, month, size); + len += size-1; + + year = year_from_time(time); + if(year<0) + year = -year+1; + do { + year /= 10; + len++; + } while(year); + + year = year_from_time(time); + if(year<0) { + formatAD = FALSE; + year = -year+1; + len += 5; + } + + day = date_from_time(time); + do { + day /= 10; + len++; + } while(day); + day = date_from_time(time); + + date_str = SysAllocStringLen(NULL, len); + if(!date_str) { + SysFreeString(week); + SysFreeString(month); + return E_OUTOFMEMORY; + } + sprintfW(date_str, formatAD?formatADW:formatBCW, week, month, day, year); + + SysFreeString(week); + SysFreeString(month); + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = date_str; + } + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.4 */ static HRESULT Date_toTimeString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR NaNW[] = { 'N','a','N',0 }; + static const WCHAR formatW[] = { '%','0','2','d',':','%','0','2','d',':','%','0','2','d', + ' ','U','T','C','%','c','%','0','2','d','%','0','2','d',0 }; + static const WCHAR formatUTCW[] = { '%','0','2','d',':','%','0','2','d', + ':','%','0','2','d',' ','U','T','C',0 }; + DateInstance *date; + BSTR date_str; + DOUBLE time; + WCHAR sign; + int offset; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + date = (DateInstance*)dispex; + + if(isnan(date->time)) { + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(NaNW); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + } + return S_OK; + } + + time = local_time(date->time, date); + + if(retv) { + date_str = SysAllocStringLen(NULL, 17); + if(!date_str) + return E_OUTOFMEMORY; + + offset = date->bias + + daylight_saving_ta(time, date); + + if(offset < 0) { + sign = '+'; + offset = -offset; + } + else sign = '-'; + + if(offset) + sprintfW(date_str, formatW, (int)hour_from_time(time), + (int)min_from_time(time), (int)sec_from_time(time), + sign, offset/60, offset%60); + else + sprintfW(date_str, formatUTCW, (int)hour_from_time(time), + (int)min_from_time(time), (int)sec_from_time(time)); + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = date_str; + } + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.6 */ static HRESULT Date_toLocaleDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR NaNW[] = { 'N','a','N',0 }; + SYSTEMTIME st; + DateInstance *date; + BSTR date_str; + int len; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + date = (DateInstance*)dispex; + + if(isnan(date->time)) { + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(NaNW); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + } + return S_OK; + } + + st = create_systemtime(local_time(date->time, date)); + + if(st.wYear<1601 || st.wYear>9999) + return Date_toDateString(dispex, lcid, flags, dp, retv, ei, caller); + + if(retv) { + len = GetDateFormatW(lcid, DATE_LONGDATE, &st, NULL, NULL, 0); + date_str = SysAllocStringLen(NULL, len); + if(!date_str) + return E_OUTOFMEMORY; + GetDateFormatW(lcid, DATE_LONGDATE, &st, NULL, date_str, len); + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = date_str; + } + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.7 */ static HRESULT Date_toLocaleTimeString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + static const WCHAR NaNW[] = { 'N','a','N',0 }; + SYSTEMTIME st; + DateInstance *date; + BSTR date_str; + int len; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + date = (DateInstance*)dispex; + + if(isnan(date->time)) { + if(retv) { + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = SysAllocString(NaNW); + if(!V_BSTR(retv)) + return E_OUTOFMEMORY; + } + return S_OK; + } + + st = create_systemtime(local_time(date->time, date)); + + if(st.wYear<1601 || st.wYear>9999) + return Date_toTimeString(dispex, lcid, flags, dp, retv, ei, caller); + + if(retv) { + len = GetTimeFormatW(lcid, 0, &st, NULL, NULL, 0); + date_str = SysAllocStringLen(NULL, len); + if(!date_str) + return E_OUTOFMEMORY; + GetTimeFormatW(lcid, 0, &st, NULL, date_str, len); + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = date_str; + } + return S_OK; } /* ECMA-262 3rd Edition 15.9.5.9 */ @@ -382,7 +1061,7 @@ static HRESULT Date_getTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM return S_OK; } -/* ECMA-262 3th Edition 15.9.1.3 */ +/* ECMA-262 3rd Edition 15.9.5.10 */ static HRESULT Date_getFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -395,14 +1074,14 @@ static HRESULT Date_getFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPP if(retv) { DateInstance *date = (DateInstance*)dispex; - DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + DOUBLE time = local_time(date->time, date); num_set_val(retv, year_from_time(time)); } return S_OK; } -/* ECMA-262 3th Edition 15.9.1.3 */ +/* ECMA-262 3rd Edition 15.9.5.11 */ static HRESULT Date_getUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -420,7 +1099,7 @@ static HRESULT Date_getUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DI return S_OK; } -/* ECMA-262 3th Edition 15.9.1.4 */ +/* ECMA-262 3rd Edition 15.9.5.12 */ static HRESULT Date_getMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -433,14 +1112,14 @@ static HRESULT Date_getMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA if(retv) { DateInstance *date = (DateInstance*)dispex; - DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + DOUBLE time = local_time(date->time, date); num_set_val(retv, month_from_time(time)); } return S_OK; } -/* ECMA-262 3th Edition 15.9.1.4 */ +/* ECMA-262 3rd Edition 15.9.5.13 */ static HRESULT Date_getUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -458,7 +1137,7 @@ static HRESULT Date_getUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPP return S_OK; } -/* ECMA-262 3th Edition 15.9.1.5 */ +/* ECMA-262 3rd Edition 15.9.5.14 */ static HRESULT Date_getDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -471,14 +1150,14 @@ static HRESULT Date_getDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM if(retv) { DateInstance *date = (DateInstance*)dispex; - DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + DOUBLE time = local_time(date->time, date); num_set_val(retv, date_from_time(time)); } return S_OK; } -/* ECMA-262 3th Edition 15.9.1.5 */ +/* ECMA-262 3rd Edition 15.9.5.15 */ static HRESULT Date_getUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -496,7 +1175,7 @@ static HRESULT Date_getUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA return S_OK; } -/* ECMA-262 3th Edition 15.9.1.6 */ +/* ECMA-262 3rd Edition 15.9.5.16 */ static HRESULT Date_getDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -509,14 +1188,14 @@ static HRESULT Date_getDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS if(retv) { DateInstance *date = (DateInstance*)dispex; - DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + DOUBLE time = local_time(date->time, date); num_set_val(retv, week_day(time)); } return S_OK; } -/* ECMA-262 3th Edition 15.9.1.6 */ +/* ECMA-262 3rd Edition 15.9.5.17 */ static HRESULT Date_getUTCDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -534,7 +1213,7 @@ static HRESULT Date_getUTCDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR return S_OK; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.5.18 */ static HRESULT Date_getHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -547,14 +1226,14 @@ static HRESULT Date_getHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA if(retv) { DateInstance *date = (DateInstance*)dispex; - DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + DOUBLE time = local_time(date->time, date); num_set_val(retv, hour_from_time(time)); } return S_OK; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.5.19 */ static HRESULT Date_getUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -572,7 +1251,7 @@ static HRESULT Date_getUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP return S_OK; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.5.20 */ static HRESULT Date_getMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -585,14 +1264,14 @@ static HRESULT Date_getMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA if(retv) { DateInstance *date = (DateInstance*)dispex; - DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + DOUBLE time = local_time(date->time, date); num_set_val(retv, min_from_time(time)); } return S_OK; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.5.21 */ static HRESULT Date_getUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -610,7 +1289,7 @@ static HRESULT Date_getUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DIS return S_OK; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.5.22 */ static HRESULT Date_getSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -623,14 +1302,14 @@ static HRESULT Date_getSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA if(retv) { DateInstance *date = (DateInstance*)dispex; - DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + DOUBLE time = local_time(date->time, date); num_set_val(retv, sec_from_time(time)); } return S_OK; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.5.23 */ static HRESULT Date_getUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -648,7 +1327,7 @@ static HRESULT Date_getUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DIS return S_OK; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.5.24 */ static HRESULT Date_getMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -661,14 +1340,14 @@ static HRESULT Date_getMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, D if(retv) { DateInstance *date = (DateInstance*)dispex; - DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + DOUBLE time = local_time(date->time, date); num_set_val(retv, ms_from_time(time)); } return S_OK; } -/* ECMA-262 3th Edition 15.9.1.10 */ +/* ECMA-262 3rd Edition 15.9.5.25 */ static HRESULT Date_getUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -686,13 +1365,26 @@ static HRESULT Date_getUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.26 */ static HRESULT Date_getTimezoneOffset(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, floor( + (date->time-local_time(date->time, date))/MS_PER_MINUTE)); + } + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.27 */ static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { @@ -726,12 +1418,14 @@ static HRESULT Date_setTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.28 */ static HRESULT Date_setMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { VARIANT v; HRESULT hres; DateInstance *date; + DOUBLE t; TRACE("\n"); @@ -751,7 +1445,10 @@ static HRESULT Date_setMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, D return hres; date = (DateInstance*)dispex; - date->time = time_clip(date->time - ms_from_time(date->time) + num_val(&v)); + t = local_time(date->time, date); + t = make_date(day(t), make_time(hour_from_time(t), min_from_time(t), + sec_from_time(t), num_val(&v))); + date->time = time_clip(utc(t, date)); if(retv) num_set_val(retv, date->time); @@ -759,18 +1456,52 @@ static HRESULT Date_setMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, D return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.29 */ static HRESULT Date_setUTCMilliseconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - return Date_setMilliseconds(dispex, lcid, flags, dp, retv, ei, caller); + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + t = date->time; + t = make_date(day(t), make_time(hour_from_time(t), min_from_time(t), + sec_from_time(t), num_val(&v))); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.30 */ static HRESULT Date_setSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { VARIANT v; HRESULT hres; DateInstance *date; + DOUBLE t, sec, ms; TRACE("\n"); @@ -785,12 +1516,25 @@ static HRESULT Date_setSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA return S_OK; } + date = (DateInstance*)dispex; + t = local_time(date->time, date); + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); if(FAILED(hres)) return hres; + sec = num_val(&v); - date = (DateInstance*)dispex; - date->time = time_clip(date->time - (sec_from_time(date->time) - num_val(&v))*1000.0); + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + ms = num_val(&v); + } + else ms = ms_from_time(t); + + t = make_date(day(t), make_time(hour_from_time(t), + min_from_time(t), sec, ms)); + date->time = time_clip(utc(t, date)); if(retv) num_set_val(retv, date->time); @@ -798,18 +1542,62 @@ static HRESULT Date_setSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.31 */ static HRESULT Date_setUTCSeconds(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - return Date_setSeconds(dispex, lcid, flags, dp, retv, ei, caller); + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t, sec, ms; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + date = (DateInstance*)dispex; + t = date->time; + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + sec = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + ms = num_val(&v); + } + else ms = ms_from_time(t); + + t = make_date(day(t), make_time(hour_from_time(t), + min_from_time(t), sec, ms)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.33 */ static HRESULT Date_setMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { VARIANT v; HRESULT hres; DateInstance *date; + DOUBLE t, min, sec, ms; TRACE("\n"); @@ -824,12 +1612,33 @@ static HRESULT Date_setMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA return S_OK; } + date = (DateInstance*)dispex; + t = local_time(date->time, date); + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); if(FAILED(hres)) return hres; + min = num_val(&v); - date = (DateInstance*)dispex; - date->time = time_clip(date->time - (min_from_time(date->time) - num_val(&v))*MS_PER_MINUTE); + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + sec = num_val(&v); + } + else sec = sec_from_time(t); + + if(arg_cnt(dp) > 2) { + hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v); + if(FAILED(hres)) + return hres; + ms = num_val(&v); + } + else ms = ms_from_time(t); + + t = make_date(day(t), make_time(hour_from_time(t), + min, sec, ms)); + date->time = time_clip(utc(t, date)); if(retv) num_set_val(retv, date->time); @@ -837,18 +1646,70 @@ static HRESULT Date_setMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPA return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.34 */ static HRESULT Date_setUTCMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - return Date_setMinutes(dispex, lcid, flags, dp, retv, ei, caller); + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t, min, sec, ms; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + date = (DateInstance*)dispex; + t = date->time; + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + min = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + sec = num_val(&v); + } + else sec = sec_from_time(t); + + if(arg_cnt(dp) > 2) { + hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v); + if(FAILED(hres)) + return hres; + ms = num_val(&v); + } + else ms = ms_from_time(t); + + t = make_date(day(t), make_time(hour_from_time(t), + min, sec, ms)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.35 */ static HRESULT Date_setHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { VARIANT v; HRESULT hres; DateInstance *date; + DOUBLE t, hour, min, sec, ms; TRACE("\n"); @@ -863,14 +1724,40 @@ static HRESULT Date_setHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return S_OK; } + date = (DateInstance*)dispex; + t = local_time(date->time, date); + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); if(FAILED(hres)) return hres; + hour = num_val(&v); - date = (DateInstance*)dispex; - date->time = time_clip(date->time - - (hour_from_time(date->time - date->bias*MS_PER_MINUTE) - - num_val(&v))*MS_PER_HOUR); + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + min = num_val(&v); + } + else min = min_from_time(t); + + if(arg_cnt(dp) > 2) { + hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v); + if(FAILED(hres)) + return hres; + sec = num_val(&v); + } + else sec = sec_from_time(t); + + if(arg_cnt(dp) > 3) { + hres = to_number(dispex->ctx, get_arg(dp, 3), ei, &v); + if(FAILED(hres)) + return hres; + ms = num_val(&v); + } + else ms = ms_from_time(t); + + t = make_date(day(t), make_time(hour, min, sec, ms)); + date->time = time_clip(utc(t, date)); if(retv) num_set_val(retv, date->time); @@ -878,12 +1765,77 @@ static HRESULT Date_setHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARA return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.36 */ static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { VARIANT v; HRESULT hres; DateInstance *date; + DOUBLE t, hour, min, sec, ms; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + date = (DateInstance*)dispex; + t = date->time; + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + hour = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + min = num_val(&v); + } + else min = min_from_time(t); + + if(arg_cnt(dp) > 2) { + hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v); + if(FAILED(hres)) + return hres; + sec = num_val(&v); + } + else sec = sec_from_time(t); + + if(arg_cnt(dp) > 3) { + hres = to_number(dispex->ctx, get_arg(dp, 3), ei, &v); + if(FAILED(hres)) + return hres; + ms = num_val(&v); + } + else ms = ms_from_time(t); + + t = make_date(day(t), make_time(hour, min, sec, ms)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; +} + +/* ECMA-262 3rd Edition 15.9.5.36 */ +static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) +{ + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t; TRACE("\n"); @@ -903,8 +1855,10 @@ static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP return hres; date = (DateInstance*)dispex; - date->time = time_clip(date->time - - (hour_from_time(date->time) - num_val(&v))*MS_PER_HOUR); + t = local_time(date->time, date); + t = make_date(make_day(year_from_time(t), month_from_time(t), + num_val(&v)), time_within_day(t)); + date->time = time_clip(utc(t, date)); if(retv) num_set_val(retv, date->time); @@ -912,46 +1866,248 @@ static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP return S_OK; } -static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) -{ - FIXME("\n"); - return E_NOTIMPL; -} - +/* ECMA-262 3rd Edition 15.9.5.37 */ static HRESULT Date_setUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + t = date->time; + t = make_date(make_day(year_from_time(t), month_from_time(t), + num_val(&v)), time_within_day(t)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.38 */ static HRESULT Date_setMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t, month, ddate; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + date = (DateInstance*)dispex; + t = local_time(date->time, date); + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + month = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + ddate = num_val(&v); + } + else ddate = date_from_time(t); + + t = make_date(make_day(year_from_time(t), month, ddate), + time_within_day(t)); + date->time = time_clip(utc(t, date)); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.39 */ static HRESULT Date_setUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t, month, ddate; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + date = (DateInstance*)dispex; + t = date->time; + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + month = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + ddate = num_val(&v); + } + else ddate = date_from_time(t); + + t = make_date(make_day(year_from_time(t), month, ddate), + time_within_day(t)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.40 */ static HRESULT Date_setFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t, year, month, ddate; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + date = (DateInstance*)dispex; + t = local_time(date->time, date); + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + year = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + month = num_val(&v); + } + else month = month_from_time(t); + + if(arg_cnt(dp) > 2) { + hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v); + if(FAILED(hres)) + return hres; + ddate = num_val(&v); + } + else ddate = date_from_time(t); + + t = make_date(make_day(year, month, ddate), time_within_day(t)); + date->time = time_clip(utc(t, date)); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } +/* ECMA-262 3rd Edition 15.9.5.41 */ static HRESULT Date_setUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t, year, month, ddate; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + date = (DateInstance*)dispex; + t = date->time; + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + year = num_val(&v); + + if(arg_cnt(dp) > 1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v); + if(FAILED(hres)) + return hres; + month = num_val(&v); + } + else month = month_from_time(t); + + if(arg_cnt(dp) > 2) { + hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &v); + if(FAILED(hres)) + return hres; + ddate = num_val(&v); + } + else ddate = date_from_time(t); + + t = make_date(make_day(year, month, ddate), time_within_day(t)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } static HRESULT Date_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, @@ -1040,11 +2196,113 @@ static HRESULT create_date(script_ctx_t *ctx, BOOL use_constr, DOUBLE time, Disp date->time = time; date->bias = tzi.Bias; + date->standardDate = tzi.StandardDate; + date->standardBias = tzi.StandardBias; + date->daylightDate = tzi.DaylightDate; + date->daylightBias = tzi.DaylightBias; *ret = &date->dispex; return S_OK; } +static HRESULT DateConstr_parse(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT DateConstr_UTC(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) +{ + VARIANT year, month, vdate, hours, minutes, seconds, ms; + DOUBLE y; + int arg_no = arg_cnt(dp); + HRESULT hres; + + TRACE("\n"); + + if(arg_no>0) { + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &year); + if(FAILED(hres)) + return hres; + y = num_val(&year); + if(0<=y && y<=99) + y += 1900; + } + else y = 1900; + + if(arg_no>1) { + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &month); + if(FAILED(hres)) + return hres; + } + else { + V_VT(&month) = VT_R8; + V_R8(&month) = 0; + } + + if(arg_no>2) { + hres = to_number(dispex->ctx, get_arg(dp, 2), ei, &vdate); + if(FAILED(hres)) + return hres; + } + else { + V_VT(&vdate) = VT_R8; + V_R8(&vdate) = 1; + } + + if(arg_no>3) { + hres = to_number(dispex->ctx, get_arg(dp, 3), ei, &hours); + if(FAILED(hres)) + return hres; + } + else { + V_VT(&hours) = VT_R8; + V_R8(&hours) = 0; + } + + if(arg_no>4) { + hres = to_number(dispex->ctx, get_arg(dp, 4), ei, &minutes); + if(FAILED(hres)) + return hres; + } + else { + V_VT(&minutes) = VT_R8; + V_R8(&minutes) = 0; + } + + if(arg_no>5) { + hres = to_number(dispex->ctx, get_arg(dp, 5), ei, &seconds); + if(FAILED(hres)) + return hres; + } + else { + V_VT(&seconds) = VT_R8; + V_R8(&seconds) = 0; + } + + if(arg_no>6) { + hres = to_number(dispex->ctx, get_arg(dp, 6), ei, &ms); + if(FAILED(hres)) + return hres; + } + else { + V_VT(&ms) = VT_R8; + V_R8(&ms) = 0; + } + + if(retv) { + V_VT(retv) = VT_R8; + V_R8(retv) = time_clip(make_date( + make_day(y, num_val(&month), num_val(&vdate)), + make_time(num_val(&hours), num_val(&minutes), + num_val(&seconds), num_val(&ms)))); + } + + return S_OK; +} + static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -1095,9 +2353,20 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP break; } - default: - FIXME("unimplemented argcnt %d\n", arg_cnt(dp)); - return E_NOTIMPL; + /* ECMA-262 3rd Edition 15.9.3.1 */ + default: { + VARIANT ret_date; + DateInstance *di; + + DateConstr_UTC(dispex, lcid, flags, dp, &ret_date, ei, sp); + + hres = create_date(dispex->ctx, TRUE, num_val(&ret_date), &date); + if(FAILED(hres)) + return hres; + + di = (DateInstance*)date; + di->time = utc(di->time, di); + } } V_VT(retv) = VT_DISPATCH; @@ -1112,6 +2381,20 @@ static HRESULT DateConstr_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP return S_OK; } +static const builtin_prop_t DateConstr_props[] = { + {UTCW, DateConstr_UTC, PROPF_METHOD}, + {parseW, DateConstr_parse, PROPF_METHOD} +}; + +static const builtin_info_t DateConstr_info = { + JSCLASS_FUNCTION, + {NULL, Function_value, 0}, + sizeof(DateConstr_props)/sizeof(*DateConstr_props), + DateConstr_props, + NULL, + NULL +}; + HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx **ret) { DispatchEx *date; @@ -1121,7 +2404,7 @@ HRESULT create_date_constr(script_ctx_t *ctx, DispatchEx **ret) if(FAILED(hres)) return hres; - hres = create_builtin_function(ctx, DateConstr_value, PROPF_CONSTR, date, ret); + hres = create_builtin_function(ctx, DateConstr_value, &DateConstr_info, PROPF_CONSTR, date, ret); jsdisp_release(date); return hres; diff --git a/reactos/dll/win32/jscript/dispex.c b/reactos/dll/win32/jscript/dispex.c index 86410af4ec7..a387ecdbff6 100644 --- a/reactos/dll/win32/jscript/dispex.c +++ b/reactos/dll/win32/jscript/dispex.c @@ -293,7 +293,7 @@ static HRESULT prop_get(DispatchEx *This, dispex_prop_t *prop, LCID lcid, DISPPA case PROP_BUILTIN: if(prop->u.p->flags & PROPF_METHOD) { DispatchEx *obj; - hres = create_builtin_function(This->ctx, prop->u.p->invoke, prop->u.p->flags, NULL, &obj); + hres = create_builtin_function(This->ctx, prop->u.p->invoke, NULL, prop->u.p->flags, NULL, &obj); if(FAILED(hres)) break; diff --git a/reactos/dll/win32/jscript/function.c b/reactos/dll/win32/jscript/function.c index 314d58558e8..d780aeebde1 100644 --- a/reactos/dll/win32/jscript/function.c +++ b/reactos/dll/win32/jscript/function.c @@ -341,7 +341,7 @@ static HRESULT Function_isPrototypeOf(DispatchEx *dispex, LCID lcid, WORD flags, return E_NOTIMPL; } -static HRESULT Function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, +HRESULT Function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { FunctionInstance *function; @@ -435,7 +435,8 @@ static HRESULT FunctionProt_value(DispatchEx *dispex, LCID lcid, WORD flags, DIS return E_NOTIMPL; } -static HRESULT create_function(script_ctx_t *ctx, DWORD flags, BOOL funcprot, DispatchEx *prototype, FunctionInstance **ret) +static HRESULT create_function(script_ctx_t *ctx, const builtin_info_t *builtin_info, DWORD flags, + BOOL funcprot, DispatchEx *prototype, FunctionInstance **ret) { FunctionInstance *function; HRESULT hres; @@ -446,6 +447,8 @@ static HRESULT create_function(script_ctx_t *ctx, DWORD flags, BOOL funcprot, Di if(funcprot) hres = init_dispex(&function->dispex, ctx, &Function_info, prototype); + else if(builtin_info) + hres = init_dispex_from_constr(&function->dispex, ctx, builtin_info, ctx->function_constr); else hres = init_dispex_from_constr(&function->dispex, ctx, &Function_info, ctx->function_constr); if(FAILED(hres)) @@ -473,13 +476,13 @@ static HRESULT create_function(script_ctx_t *ctx, DWORD flags, BOOL funcprot, Di return S_OK; } -HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc, DWORD flags, - DispatchEx *prototype, DispatchEx **ret) +HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc, + const builtin_info_t *builtin_info, DWORD flags, DispatchEx *prototype, DispatchEx **ret) { FunctionInstance *function; HRESULT hres; - hres = create_function(ctx, flags, FALSE, prototype, &function); + hres = create_function(ctx, builtin_info, flags, FALSE, prototype, &function); if(FAILED(hres)) return hres; @@ -502,7 +505,7 @@ HRESULT create_source_function(parser_ctx_t *ctx, parameter_t *parameters, sourc if(FAILED(hres)) return hres; - hres = create_function(ctx->script, PROPF_CONSTR, FALSE, prototype, &function); + hres = create_function(ctx->script, NULL, PROPF_CONSTR, FALSE, prototype, &function); jsdisp_release(prototype); if(FAILED(hres)) return hres; @@ -534,13 +537,13 @@ HRESULT init_function_constr(script_ctx_t *ctx) FunctionInstance *prot, *constr; HRESULT hres; - hres = create_function(ctx, PROPF_CONSTR, TRUE, NULL, &prot); + hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, NULL, &prot); if(FAILED(hres)) return hres; prot->value_proc = FunctionProt_value; - hres = create_function(ctx, PROPF_CONSTR, TRUE, &prot->dispex, &constr); + hres = create_function(ctx, NULL, PROPF_CONSTR, TRUE, &prot->dispex, &constr); jsdisp_release(&prot->dispex); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/jscript/jscript.h b/reactos/dll/win32/jscript/jscript.h index 6cf3535c92f..7a4158c631f 100644 --- a/reactos/dll/win32/jscript/jscript.h +++ b/reactos/dll/win32/jscript/jscript.h @@ -132,7 +132,10 @@ HRESULT jsdisp_propget_name(DispatchEx*,LPCWSTR,LCID,VARIANT*,jsexcept_t*,IServi HRESULT jsdisp_propget_idx(DispatchEx*,DWORD,LCID,VARIANT*,jsexcept_t*,IServiceProvider*); HRESULT jsdisp_get_id(DispatchEx*,const WCHAR*,DWORD,DISPID*); -HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,DWORD,DispatchEx*,DispatchEx**); +HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const builtin_info_t*,DWORD, + DispatchEx*,DispatchEx**); +HRESULT Function_value(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*); + HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**); HRESULT create_math(script_ctx_t*,DispatchEx**); diff --git a/reactos/dll/win32/jscript/number.c b/reactos/dll/win32/jscript/number.c index d909cdb851a..d6591d06317 100644 --- a/reactos/dll/win32/jscript/number.c +++ b/reactos/dll/win32/jscript/number.c @@ -263,7 +263,7 @@ HRESULT create_number_constr(script_ctx_t *ctx, DispatchEx **ret) return hres; V_VT(&number->num) = VT_I4; - hres = create_builtin_function(ctx, NumberConstr_value, PROPF_CONSTR, &number->dispex, ret); + hres = create_builtin_function(ctx, NumberConstr_value, NULL, PROPF_CONSTR, &number->dispex, ret); jsdisp_release(&number->dispex); return hres; diff --git a/reactos/dll/win32/jscript/object.c b/reactos/dll/win32/jscript/object.c index 02d80de02fd..9474bc4f8bc 100644 --- a/reactos/dll/win32/jscript/object.c +++ b/reactos/dll/win32/jscript/object.c @@ -154,7 +154,7 @@ HRESULT create_object_constr(script_ctx_t *ctx, DispatchEx **ret) if(FAILED(hres)) return hres; - hres = create_builtin_function(ctx, ObjectConstr_value, PROPF_CONSTR, object, ret); + hres = create_builtin_function(ctx, ObjectConstr_value, NULL, PROPF_CONSTR, object, ret); jsdisp_release(object); return hres; diff --git a/reactos/dll/win32/jscript/regexp.c b/reactos/dll/win32/jscript/regexp.c index fe552b10778..0acc47815c8 100644 --- a/reactos/dll/win32/jscript/regexp.c +++ b/reactos/dll/win32/jscript/regexp.c @@ -3685,7 +3685,7 @@ HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx **ret) if(FAILED(hres)) return hres; - hres = create_builtin_function(ctx, RegExpConstr_value, PROPF_CONSTR, ®exp->dispex, ret); + hres = create_builtin_function(ctx, RegExpConstr_value, NULL, PROPF_CONSTR, ®exp->dispex, ret); jsdisp_release(®exp->dispex); return hres; diff --git a/reactos/dll/win32/jscript/string.c b/reactos/dll/win32/jscript/string.c index 82c1043490e..9f2ab9b2f3a 100644 --- a/reactos/dll/win32/jscript/string.c +++ b/reactos/dll/win32/jscript/string.c @@ -1370,7 +1370,7 @@ HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx **ret) if(FAILED(hres)) return hres; - hres = create_builtin_function(ctx, StringConstr_value, PROPF_CONSTR, &string->dispex, ret); + hres = create_builtin_function(ctx, StringConstr_value, NULL, PROPF_CONSTR, &string->dispex, ret); jsdisp_release(&string->dispex); return hres; From b6a256d5f2b750411f800e1e93063aecf3d4b02b Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Sat, 4 Jul 2009 11:52:35 +0000 Subject: [PATCH 231/577] sync localui with wine 1.1.25 svn path=/trunk/; revision=41770 --- reactos/dll/win32/localui/localui.h | 2 + reactos/dll/win32/localui/localui.rbuild | 15 ++++++ reactos/dll/win32/localui/localui.rc | 20 -------- reactos/dll/win32/localui/ui_Da.rc | 2 + reactos/dll/win32/localui/ui_De.rc | 2 + reactos/dll/win32/localui/ui_En.rc | 2 + reactos/dll/win32/localui/ui_Fr.rc | 5 +- reactos/dll/win32/localui/ui_Ko.rc | 2 + reactos/dll/win32/localui/ui_Lt.rc | 59 ++++++++++++++++++++++++ reactos/dll/win32/localui/ui_Nl.rc | 2 + reactos/dll/win32/localui/ui_No.rc | 2 + reactos/dll/win32/localui/ui_Pl.rc | 2 + reactos/dll/win32/localui/ui_Pt.rc | 2 + reactos/dll/win32/localui/ui_Ro.rc | 4 +- reactos/dll/win32/localui/ui_Ru.rc | 2 + reactos/dll/win32/localui/ui_Si.rc | 4 +- reactos/dll/win32/localui/ui_Sv.rc | 2 + reactos/dll/win32/localui/ui_Zh.rc | 4 +- 18 files changed, 105 insertions(+), 28 deletions(-) create mode 100644 reactos/dll/win32/localui/ui_Lt.rc diff --git a/reactos/dll/win32/localui/localui.h b/reactos/dll/win32/localui/localui.h index aa244bdc824..25424da568c 100644 --- a/reactos/dll/win32/localui/localui.h +++ b/reactos/dll/win32/localui/localui.h @@ -21,6 +21,8 @@ #ifndef __WINE_LOCALUI__ #define __WINE_LOCALUI__ +#include +#include /* ## Resource-ID ## */ #define ADDPORT_DIALOG 100 diff --git a/reactos/dll/win32/localui/localui.rbuild b/reactos/dll/win32/localui/localui.rbuild index 7ee4b144c90..7172c2225b2 100644 --- a/reactos/dll/win32/localui/localui.rbuild +++ b/reactos/dll/win32/localui/localui.rbuild @@ -8,6 +8,21 @@ localui.c localui.rc + ui_Da.rc + ui_De.rc + ui_En.rc + ui_Fr.rc + ui_Ko.rc + ui_Lt.rc + ui_Nl.rc + ui_No.rc + ui_Pl.rc + ui_Pt.rc + ui_Ro.rc + ui_Ru.rc + ui_Si.rc + ui_Sv.rc + ui_Zh.rc wine winspool user32 diff --git a/reactos/dll/win32/localui/localui.rc b/reactos/dll/win32/localui/localui.rc index 815cac0ed9f..cdf7bb4c7e8 100644 --- a/reactos/dll/win32/localui/localui.rc +++ b/reactos/dll/win32/localui/localui.rc @@ -19,10 +19,6 @@ * */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winver.h" #include "localui.h" #define WINE_FILENAME_STR "localui.dll" @@ -36,19 +32,3 @@ #define WINE_PRODUCTVERSION_STR "5.1.2600.2180" #include "wine/wine_common_ver.rc" - - -#include "ui_Da.rc" -#include "ui_De.rc" -#include "ui_En.rc" -#include "ui_Fr.rc" -#include "ui_Ko.rc" -#include "ui_Nl.rc" -#include "ui_No.rc" -#include "ui_Pl.rc" -#include "ui_Pt.rc" -#include "ui_Ro.rc" -#include "ui_Ru.rc" -#include "ui_Si.rc" -#include "ui_Sv.rc" -#include "ui_Zh.rc" diff --git a/reactos/dll/win32/localui/ui_Da.rc b/reactos/dll/win32/localui/ui_Da.rc index 97299266959..861ba8f2ddf 100644 --- a/reactos/dll/win32/localui/ui_Da.rc +++ b/reactos/dll/win32/localui/ui_Da.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_DANISH, SUBLANG_DEFAULT ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_De.rc b/reactos/dll/win32/localui/ui_De.rc index 2fe35fc4e77..5f65a803737 100644 --- a/reactos/dll/win32/localui/ui_De.rc +++ b/reactos/dll/win32/localui/ui_De.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_En.rc b/reactos/dll/win32/localui/ui_En.rc index c2de6263a8a..5a218680472 100644 --- a/reactos/dll/win32/localui/ui_En.rc +++ b/reactos/dll/win32/localui/ui_En.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_Fr.rc b/reactos/dll/win32/localui/ui_Fr.rc index 261fa0b7dd2..70e4baf06ee 100644 --- a/reactos/dll/win32/localui/ui_Fr.rc +++ b/reactos/dll/win32/localui/ui_Fr.rc @@ -17,6 +17,9 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + +#include "localui.h" + #pragma code_page(65001) LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL @@ -53,5 +56,3 @@ STRINGTABLE DISCARDABLE IDS_PORTEXISTS "Le port %s existe déjà" IDS_NOTHINGTOCONFIG "Ce port n'a pas d'options de configuration" } - -#pragma code_page(default) diff --git a/reactos/dll/win32/localui/ui_Ko.rc b/reactos/dll/win32/localui/ui_Ko.rc index 9a380308422..d86b7ef58a5 100644 --- a/reactos/dll/win32/localui/ui_Ko.rc +++ b/reactos/dll/win32/localui/ui_Ko.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_Lt.rc b/reactos/dll/win32/localui/ui_Lt.rc new file mode 100644 index 00000000000..87997d0f75b --- /dev/null +++ b/reactos/dll/win32/localui/ui_Lt.rc @@ -0,0 +1,59 @@ +/* + * Lithuanian resources for localui + * + * Copyright 2009 Aurimas FiÅ¡eras + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "localui.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION +CAPTION "PridÄ—ti vietinį prievadÄ…" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Ä®veskite pridedamo prievado vardÄ…:", -1, 7, 13, 194, 13, WS_VISIBLE + EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL + DEFPUSHBUTTON "Gerai", IDOK, 199, 10, 40, 14, WS_VISIBLE + PUSHBUTTON "Atsisakyti", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE +END + + +LPTCONFIG_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION +CAPTION "KonfigÅ«ruoti LPT prievadÄ…" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Laukimo laikas (sekundÄ—mis)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX + LTEXT "&Perdavimo pakartojimas:", -1, 14, 22, 90, 13, WS_VISIBLE + EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER + DEFPUSHBUTTON "Gerai", IDOK, 164, 10, 50, 14, WS_VISIBLE + PUSHBUTTON "Atsisakyti", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE +END + + +STRINGTABLE DISCARDABLE +{ + IDS_LOCALPORT "Vietinis prievadas" + IDS_INVALIDNAME "'%s' yra netinkamas prievado vardas" + IDS_PORTEXISTS "Prievadas %s jau egzistuoja" + IDS_NOTHINGTOCONFIG "Å is prievadas neturi parinkÄių konfigÅ«ravimui" +} diff --git a/reactos/dll/win32/localui/ui_Nl.rc b/reactos/dll/win32/localui/ui_Nl.rc index 59c58ffd3aa..21d7cc84fae 100644 --- a/reactos/dll/win32/localui/ui_Nl.rc +++ b/reactos/dll/win32/localui/ui_Nl.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_No.rc b/reactos/dll/win32/localui/ui_No.rc index 3a46bc8ee88..8ed9e00c8aa 100644 --- a/reactos/dll/win32/localui/ui_No.rc +++ b/reactos/dll/win32/localui/ui_No.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_Pl.rc b/reactos/dll/win32/localui/ui_Pl.rc index 74a5015e00a..822763d7dae 100644 --- a/reactos/dll/win32/localui/ui_Pl.rc +++ b/reactos/dll/win32/localui/ui_Pl.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_POLISH, SUBLANG_DEFAULT ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_Pt.rc b/reactos/dll/win32/localui/ui_Pt.rc index 7bad5211ead..7f1684820f7 100644 --- a/reactos/dll/win32/localui/ui_Pt.rc +++ b/reactos/dll/win32/localui/ui_Pt.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_Ro.rc b/reactos/dll/win32/localui/ui_Ro.rc index 43edfe6a4b1..a1b1c771fa1 100644 --- a/reactos/dll/win32/localui/ui_Ro.rc +++ b/reactos/dll/win32/localui/ui_Ro.rc @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL #pragma code_page(65001) @@ -53,5 +55,3 @@ STRINGTABLE DISCARDABLE IDS_PORTEXISTS "Portul %s existsă deja" IDS_NOTHINGTOCONFIG "Acest port nu are opÈ›iuni de configurat" } - -#pragma code_page(default) diff --git a/reactos/dll/win32/localui/ui_Ru.rc b/reactos/dll/win32/localui/ui_Ru.rc index 96e78f1971b..3402f37b000 100644 --- a/reactos/dll/win32/localui/ui_Ru.rc +++ b/reactos/dll/win32/localui/ui_Ru.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_Si.rc b/reactos/dll/win32/localui/ui_Si.rc index 961a2e046d4..6810c7ce733 100644 --- a/reactos/dll/win32/localui/ui_Si.rc +++ b/reactos/dll/win32/localui/ui_Si.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + #pragma code_page(65001) LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT @@ -54,5 +56,3 @@ STRINGTABLE DISCARDABLE IDS_PORTEXISTS "Vrata z imenom %s že obstajajo" IDS_NOTHINGTOCONFIG "Ta vrata nimajo možnosti nastavitve" } - -#pragma code_page(default) diff --git a/reactos/dll/win32/localui/ui_Sv.rc b/reactos/dll/win32/localui/ui_Sv.rc index 3cd22fd8c70..e137079ffe4 100644 --- a/reactos/dll/win32/localui/ui_Sv.rc +++ b/reactos/dll/win32/localui/ui_Sv.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 diff --git a/reactos/dll/win32/localui/ui_Zh.rc b/reactos/dll/win32/localui/ui_Zh.rc index 197ac1dd38d..f43dde9afbd 100644 --- a/reactos/dll/win32/localui/ui_Zh.rc +++ b/reactos/dll/win32/localui/ui_Zh.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "localui.h" + /* Chinese text is encoded in UTF-8 */ #pragma code_page(65001) @@ -90,5 +92,3 @@ STRINGTABLE DISCARDABLE IDS_PORTEXISTS "ç«¯å£ %s 已經存在" IDS_NOTHINGTOCONFIG "é€™å€‹ç«¯å£æ²’有å¯è¨­å®šé¸é …" } - -#pragma code_page(default) From 43005003c02f7ab10e5a5f1083facc9d44b29f96 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Jul 2009 13:56:33 +0000 Subject: [PATCH 232/577] Implement PALETTE_ulGetNearestPaletteIndex and PALETTE_ulGetRGBColorFromIndex, replacing COLOR_LookupNearestColor and COLOR_PaletteLookupPixel Implement PALETTE_vGetBitMasks svn path=/trunk/; revision=41771 --- .../subsystems/win32/win32k/include/palette.h | 10 ++ .../subsystems/win32/win32k/objects/palette.c | 115 ++++++++++-------- 2 files changed, 77 insertions(+), 48 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/palette.h b/reactos/subsystems/win32/win32k/include/palette.h index 646c8d7c1a8..8b557948b02 100644 --- a/reactos/subsystems/win32/win32k/include/palette.h +++ b/reactos/subsystems/win32/win32k/include/palette.h @@ -80,9 +80,19 @@ INT APIENTRY PALETTE_SetMapping(PALOBJ* palPtr, UINT uStart, UINT uNum, BO INT FASTCALL PALETTE_ToPhysical (PDC dc, COLORREF color); INT FASTCALL PALETTE_GetObject(PPALETTE pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer); +ULONG NTAPI PALETTE_ulGetNearestPaletteIndex(PALETTE* ppal, ULONG iColor); +VOID NTAPI PALETTE_vGetBitMasks(PPALETTE ppal, PULONG pulColors); PPALETTEENTRY FASTCALL ReturnSystemPalette (VOID); HPALETTE FASTCALL GdiSelectPalette(HDC, HPALETTE, BOOL); +FORCEINLINE +ULONG +PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex) +{ + return RGB(ppal->IndexedColors[ulIndex].peRed, + ppal->IndexedColors[ulIndex].peGreen, + ppal->IndexedColors[ulIndex].peBlue); +} #endif /* not _WIN32K_PALETTE_H */ diff --git a/reactos/subsystems/win32/win32k/objects/palette.c b/reactos/subsystems/win32/win32k/objects/palette.c index f787fbb6f71..f1bf5ba6b86 100644 --- a/reactos/subsystems/win32/win32k/objects/palette.c +++ b/reactos/subsystems/win32/win32k/objects/palette.c @@ -45,45 +45,6 @@ const PALETTEENTRY g_sysPalTemplate[NB_RESERVED_COLORS] = { 0xff, 0xff, 0xff, PC_SYS_USED } // last 10 }; -INT APIENTRY COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, - XLATEOBJ *XlateObj, COLORREF col, BOOL skipReserved) -{ - int i, best = 0, diff = 0x7fffffff; - int r, g, b; - - for( i = 0; i < size && diff ; i++ ) - { -#if 0 - if(!(palPalEntry[i].peFlags & PC_SYS_USED) || (skipReserved && palPalEntry[i].peFlags & PC_SYS_RESERVED)) - continue; -#endif - - r = abs((SHORT)palPalEntry[i].peRed - GetRValue(col)); - g = abs((SHORT)palPalEntry[i].peGreen - GetGValue(col)); - b = abs((SHORT)palPalEntry[i].peBlue - GetBValue(col)); - - r = r*r + g*g + b*b; - - if( r < diff ) { best = i; diff = r; } - } - - if (XlateObj == NULL) - return best; - else - return (XlateObj->pulXlate) ? (INT)XlateObj->pulXlate[best] : best; -} - -COLORREF APIENTRY COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF color ) -{ - INT index; - - index = COLOR_PaletteLookupPixel(palPalEntry, size, NULL, color, FALSE); - return RGB( - palPalEntry[index].peRed, - palPalEntry[index].peGreen, - palPalEntry[index].peBlue); -} - unsigned short GetNumberOfBits(unsigned int dwMask) { unsigned short wBits; @@ -258,7 +219,7 @@ PALETTE_Cleanup(PVOID ObjectBody) } INT FASTCALL -PALETTE_GetObject(PPALETTE pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer) +PALETTE_GetObject(PPALETTE ppal, INT cbCount, LPLOGBRUSH lpBuffer) { if (!lpBuffer) { @@ -266,10 +227,69 @@ PALETTE_GetObject(PPALETTE pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer) } if ((UINT)cbCount < sizeof(WORD)) return 0; - *((WORD*)lpBuffer) = (WORD)pGdiObject->NumColors; + *((WORD*)lpBuffer) = (WORD)ppal->NumColors; return sizeof(WORD); } +ULONG +NTAPI +PALETTE_ulGetNearestPaletteIndex(PALETTE* ppal, ULONG iColor) +{ + ULONG ulDiff, ulColorDiff, ulMinimalDiff = 0xFFFFFF; + ULONG i, ulBestIndex = 0; + PALETTEENTRY peColor = *(PPALETTEENTRY)&iColor; + + /* Loop all palette entries, break on exact match */ + for (i = 0; i < ppal->NumColors && ulMinimalDiff != 0; i++) + { + /* Calculate distance in the color cube */ + ulDiff = peColor.peRed - ppal->IndexedColors[i].peRed; + ulColorDiff = ulDiff * ulDiff; + ulDiff = peColor.peGreen - ppal->IndexedColors[i].peGreen; + ulColorDiff += ulDiff * ulDiff; + ulDiff = peColor.peBlue - ppal->IndexedColors[i].peBlue; + ulColorDiff += ulDiff * ulDiff; + + /* Check for a better match */ + if (ulColorDiff < ulMinimalDiff) + { + ulBestIndex = i; + ulMinimalDiff = ulColorDiff; + } + } + + return ulBestIndex; +} + +VOID +NTAPI +PALETTE_vGetBitMasks(PPALETTE ppal, PULONG pulColors) +{ + ASSERT(pulColors); + + switch (ppal->Mode) + { + case PAL_INDEXED: + case PAL_RGB: + pulColors[0] = RGB(0xFF, 0x00, 0x00); + pulColors[1] = RGB(0x00, 0xFF, 0x00); + pulColors[2] = RGB(0x00, 0x00, 0xFF); + break; + + case PAL_BGR: + pulColors[0] = RGB(0x00, 0x00, 0xFF); + pulColors[1] = RGB(0x00, 0xFF, 0x00); + pulColors[2] = RGB(0xFF, 0x00, 0x00); + break; + + case PAL_BITFIELDS: + pulColors[0] = ppal->RedMask; + pulColors[1] = ppal->GreenMask; + pulColors[2] = ppal->BlueMask; + break; + } +} + VOID FASTCALL ColorCorrection(PPALETTE PalGDI, PPALETTEENTRY PaletteEntry, ULONG Colors) @@ -585,9 +605,12 @@ COLORREF APIENTRY NtGdiGetNearestColor(HDC hDC, COLORREF Color) switch (palGDI->Mode) { case PAL_INDEXED: - nearest = COLOR_LookupNearestColor(palGDI->IndexedColors, - palGDI->NumColors, Color); + { + ULONG index; + index = PALETTE_ulGetNearestPaletteIndex(palGDI, Color); + nearest = PALETTE_ulGetRGBColorFromIndex(palGDI, index); break; + } case PAL_BGR: case PAL_RGB: nearest = Color; @@ -621,11 +644,7 @@ NtGdiGetNearestPaletteIndex( if (ppal) { /* Return closest match for the given RGB color */ - index = COLOR_PaletteLookupPixel(ppal->IndexedColors, - ppal->NumColors, - NULL, - crColor, - FALSE); + index = PALETTE_ulGetNearestPaletteIndex(ppal, crColor); PALETTE_UnlockPalette(ppal); } From 0aeef709682f2d4ca36a16502802d606cce1a9ee Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 4 Jul 2009 16:31:11 +0000 Subject: [PATCH 233/577] - Updates and changes to, with one add on and removal: MenuWindowProc (Not supported in kernel space), PopupMenuWndProcA, PostMessage, SendNotifyMessage and win32k hook debugs. - Patch by Smiley : Wrong PostMessage and SendNotifyMessage behavior, see Bug 4646. - Reference: Related to TranslateMessage: http://msdn.microsoft.com/en-us/library/aa912145.aspx , Related to PopupMenuWndProcA: Registration of Atom classes, Unicode only: http://www.reactos.org/archives/public/ros-dev/2007-October/009976.html svn path=/trunk/; revision=41772 --- reactos/dll/win32/user32/user32.pspec | 4 +- reactos/dll/win32/user32/windows/menu.c | 100 ++++++- reactos/dll/win32/user32/windows/message.c | 248 +++++++----------- reactos/include/reactos/win32k/ntuser.h | 11 +- reactos/subsystems/win32/win32k/ntuser/hook.c | 10 +- .../subsystems/win32/win32k/ntuser/message.c | 125 +++------ reactos/subsystems/win32/win32k/w32ksvc.db | 1 - 7 files changed, 239 insertions(+), 260 deletions(-) diff --git a/reactos/dll/win32/user32/user32.pspec b/reactos/dll/win32/user32/user32.pspec index b31f81c378a..9e5fb22caa5 100644 --- a/reactos/dll/win32/user32/user32.pspec +++ b/reactos/dll/win32/user32/user32.pspec @@ -483,8 +483,8 @@ @ stdcall MapVirtualKeyW(long long) @ stdcall MapWindowPoints(long long ptr long) @ stdcall MenuItemFromPoint(long long double) ; Direct call NtUserMenuItemFromPoint -@ stdcall MenuWindowProcA (long long long long) -@ stdcall MenuWindowProcW (long long long long) +@ stdcall MenuWindowProcA (long ptr long long long) +@ stdcall MenuWindowProcW (long ptr long long long) @ stdcall MessageBeep(long) @ stdcall MessageBoxA(long str str long) @ stdcall MessageBoxExA(long str str long long) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index 359992213a4..480e369b303 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -72,6 +72,7 @@ typedef struct POINT Pt; } MTRACKER; +static LRESULT WINAPI PopupMenuWndProcA(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); /********************************************************************* @@ -971,6 +972,70 @@ MenuDrawPopupMenu(HWND Wnd, HDC Dc, HMENU Menu) } } +static LRESULT WINAPI +PopupMenuWndProcA(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + TRACE("YES! hwnd=%x msg=0x%04x wp=0x%04lx lp=0x%08lx\n", Wnd, Message, wParam, lParam); + + switch(Message) + { + case WM_CREATE: + { + CREATESTRUCTA *cs = (CREATESTRUCTA *) lParam; + SetWindowLongPtrA(Wnd, 0, (LONG) cs->lpCreateParams); + return 0; + } + + case WM_MOUSEACTIVATE: /* We don't want to be activated */ + return MA_NOACTIVATE; + + case WM_PAINT: + { + PAINTSTRUCT ps; + BeginPaint(Wnd, &ps); + MenuDrawPopupMenu(Wnd, ps.hdc, (HMENU)GetWindowLongPtrA(Wnd, 0)); + EndPaint(Wnd, &ps); + return 0; + } + + case WM_ERASEBKGND: + return 1; + + case WM_DESTROY: + /* zero out global pointer in case resident popup window was destroyed. */ + if (Wnd == TopPopup) + { + TopPopup = NULL; + } + break; + + case WM_SHOWWINDOW: + if (0 != wParam) + { + if (0 == GetWindowLongPtrA(Wnd, 0)) + { + OutputDebugStringA("no menu to display\n"); + } + } + else + { + SetWindowLongPtrA(Wnd, 0, 0); + } + break; + + case MM_SETMENUHANDLE: + SetWindowLongPtrA(Wnd, 0, wParam); + break; + + case MM_GETMENUHANDLE: + return GetWindowLongPtrA(Wnd, 0); + + default: + return DefWindowProcA(Wnd, Message, wParam, lParam); + } + return 0; +} + static LRESULT WINAPI PopupMenuWndProcW(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam) { @@ -5161,33 +5226,56 @@ GetMenuContextHelpId(HMENU hmenu) /* * @unimplemented */ -LRESULT +BOOL WINAPI MenuWindowProcA( HWND hWnd, + ULONG_PTR Result, UINT Msg, WPARAM wParam, LPARAM lParam ) { - UNIMPLEMENTED; - return FALSE; + if ( Msg < WM_USER) + { + LRESULT lResult; + lResult = PopupMenuWndProcA(hWnd, Msg, wParam, lParam ); + if (Result) + { + Result = (ULONG_PTR)lResult; + return TRUE; + } + return FALSE; + } + return NtUserMessageCall(hWnd, Msg, wParam, lParam, Result, FNID_MENU, TRUE); + } /* * @unimplemented */ -LRESULT +BOOL WINAPI MenuWindowProcW( HWND hWnd, + ULONG_PTR Result, UINT Msg, WPARAM wParam, LPARAM lParam ) { - UNIMPLEMENTED; - return FALSE; + if ( Msg < WM_USER) + { + LRESULT lResult; + lResult = PopupMenuWndProcW(hWnd, Msg, wParam, lParam ); + if (Result) + { + Result = (ULONG_PTR)lResult; + return TRUE; + } + return FALSE; + } + return NtUserMessageCall(hWnd, Msg, wParam, lParam, Result, FNID_MENU, FALSE); } /* diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index 86d70b32da7..40c43c53eea 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -1632,51 +1632,12 @@ PeekMessageW( return Res; } - -/* - * @implemented - */ +// +// Worker function for post message. +// BOOL -WINAPI -PostMessageA( - HWND Wnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam) -{ - MSG AnsiMsg, UcMsg; - MSG KMMsg; - LRESULT Result; - - AnsiMsg.hwnd = Wnd; - AnsiMsg.message = Msg; - AnsiMsg.wParam = wParam; - AnsiMsg.lParam = lParam; - if (! MsgiAnsiToUnicodeMessage(&UcMsg, &AnsiMsg)) - { - return FALSE; - } - - if (! MsgiUMToKMMessage(&UcMsg, &KMMsg, TRUE)) - { - MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); - return FALSE; - } - Result = NtUserPostMessage(KMMsg.hwnd, KMMsg.message, - KMMsg.wParam, KMMsg.lParam); - MsgiUMToKMCleanup(&UcMsg, &KMMsg); - MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); - - return Result; -} - - -/* - * @implemented - */ -BOOL -WINAPI -PostMessageW( +FASTCALL +PostMessageWorker( HWND Wnd, UINT Msg, WPARAM wParam, @@ -1690,60 +1651,25 @@ PostMessageW( UMMsg.wParam = wParam; UMMsg.lParam = lParam; if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, TRUE)) - { - return FALSE; - } - Result = NtUserPostMessage(KMMsg.hwnd, KMMsg.message, - KMMsg.wParam, KMMsg.lParam); + { + return FALSE; + } + Result = NtUserPostMessage( KMMsg.hwnd, + KMMsg.message, + KMMsg.wParam, + KMMsg.lParam); + MsgiUMToKMCleanup(&UMMsg, &KMMsg); return Result; } +/* + * @implemented + */ BOOL WINAPI -PostMessageWX( - HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam) -{ - LRESULT Ret; - - /* Check for combo box or a list box to send names. */ - if (Msg == CB_DIR || Msg == LB_DIR) - { - /* - Set DDL_POSTMSGS, so use the PostMessage function to send messages to the - combo/list box. Forces a call like DlgDirListComboBox. - */ - wParam |= DDL_POSTMSGS; - return NtUserPostMessage(hWnd, Msg, wParam, lParam); - } - - /* No drop files or current Process, just post message. */ - if ( (Msg != WM_DROPFILES) || - ( NtUserQueryWindow( hWnd, QUERY_WINDOW_UNIQUE_PROCESS_ID) == - PtrToUint(NtCurrentTeb()->ClientId.UniqueProcess) ) ) - { - return NtUserPostMessage(hWnd, Msg, wParam, lParam); - } - - /* We have drop files or this is not the same process for this window. */ - - /* Just incase, check wParam for Global memory handle and send size. */ - Ret = SendMessageW( hWnd, - WM_COPYGLOBALDATA, - (WPARAM)GlobalSize((HGLOBAL)wParam), // Zero if not a handle. - (LPARAM)wParam); // Send wParam as lParam. - - if ( Ret ) return NtUserPostMessage(hWnd, Msg, (WPARAM)Ret, lParam); - - return FALSE; -} -BOOL -WINAPI -PostMessageAX( +PostMessageA( HWND hWnd, UINT Msg, WPARAM wParam, @@ -1762,13 +1688,58 @@ PostMessageAX( return FALSE; } - Ret = PostMessageWX( hWnd, UcMsg.message, UcMsg.wParam, UcMsg.lParam); + Ret = PostMessageW( hWnd, UcMsg.message, UcMsg.wParam, UcMsg.lParam); MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); return Ret; } +/* + * @implemented + */ +BOOL +WINAPI +PostMessageW( + HWND hWnd, + UINT Msg, + WPARAM wParam, + LPARAM lParam) +{ + LRESULT Ret; + + /* Check for combo box or a list box to send names. */ + if (Msg == CB_DIR || Msg == LB_DIR) + { + /* + Set DDL_POSTMSGS, so use the PostMessage function to send messages to the + combo/list box. Forces a call like DlgDirListComboBox. + */ + wParam |= DDL_POSTMSGS; + return PostMessageWorker(hWnd, Msg, wParam, lParam); + } + + /* No drop files or current Process, just post message. */ + if ( (Msg != WM_DROPFILES) || + ( NtUserQueryWindow( hWnd, QUERY_WINDOW_UNIQUE_PROCESS_ID) == + PtrToUint(NtCurrentTeb()->ClientId.UniqueProcess) ) ) + { + return PostMessageWorker(hWnd, Msg, wParam, lParam); + } + + /* We have drop files and this is not the same process for this window. */ + + /* Just incase, check wParam for Global memory handle and send size. */ + Ret = SendMessageW( hWnd, + WM_COPYGLOBALDATA, + (WPARAM)GlobalSize((HGLOBAL)wParam), // Zero if not a handle. + (LPARAM)wParam); // Send wParam as lParam. + + if ( Ret ) return PostMessageWorker(hWnd, Msg, (WPARAM)Ret, lParam); + + return FALSE; +} + /* * @implemented */ @@ -2113,9 +2084,8 @@ SendMessageTimeoutW( return Result; } - /* - * @unimplemented + * @implemented */ BOOL WINAPI @@ -2125,35 +2095,26 @@ SendNotifyMessageA( WPARAM wParam, LPARAM lParam) { + BOOL Ret; MSG AnsiMsg, UcMsg; - MSG KMMsg; - LRESULT Result; AnsiMsg.hwnd = hWnd; AnsiMsg.message = Msg; AnsiMsg.wParam = wParam; AnsiMsg.lParam = lParam; if (! MsgiAnsiToUnicodeMessage(&UcMsg, &AnsiMsg)) - { - return FALSE; - } + { + return FALSE; + } + Ret = SendNotifyMessageW(hWnd, UcMsg.message, UcMsg.wParam, UcMsg.lParam); - if (! MsgiUMToKMMessage(&UcMsg, &KMMsg, TRUE)) - { - MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); - return FALSE; - } - Result = NtUserSendNotifyMessage(KMMsg.hwnd, KMMsg.message, - KMMsg.wParam, KMMsg.lParam); - MsgiUMToKMCleanup(&UcMsg, &KMMsg); MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); - return Result; + return Ret; } - /* - * @unimplemented + * @implemented */ BOOL WINAPI @@ -2171,52 +2132,20 @@ SendNotifyMessageW( UMMsg.wParam = wParam; UMMsg.lParam = lParam; if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, TRUE)) - { - return FALSE; - } - Result = NtUserSendNotifyMessage(KMMsg.hwnd, KMMsg.message, - KMMsg.wParam, KMMsg.lParam); - MsgiUMToKMCleanup(&UMMsg, &KMMsg); - - return Result; -} - -BOOL -WINAPI -SendNotifyMessageAX( - HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam) -{ - BOOL Ret; - MSG AnsiMsg, UcMsg; - - AnsiMsg.hwnd = hWnd; - AnsiMsg.message = Msg; - AnsiMsg.wParam = wParam; - AnsiMsg.lParam = lParam; - if (! MsgiAnsiToUnicodeMessage(&UcMsg, &AnsiMsg)) { return FALSE; } - /* ATM, ReactOS does not support Ansi in win32k. */ - Ret = NtUserMessageCall(hWnd, UcMsg.message, UcMsg.wParam, UcMsg.lParam, 0, FNID_SENDNOTIFYMESSAGE, FALSE); + Result = NtUserMessageCall( hWnd, + KMMsg.message, + KMMsg.wParam, + KMMsg.lParam, + 0, + FNID_SENDNOTIFYMESSAGE, + FALSE); - MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg); + MsgiUMToKMCleanup(&UMMsg, &KMMsg); - return Ret; -} - -BOOL -WINAPI -SendNotifyMessageWX( - HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam) -{ - return NtUserMessageCall(hWnd, Msg, wParam, lParam, 0, FNID_SENDNOTIFYMESSAGE, FALSE); + return Result; } /* @@ -2234,6 +2163,8 @@ TranslateMessageEx(CONST MSG *lpMsg, DWORD unk) return(NtUserTranslateMessage((LPMSG)lpMsg, (HKL)unk)); default: + if ( lpMsg->message & ~WM_MAXIMUM ) + SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } } @@ -2245,7 +2176,20 @@ TranslateMessageEx(CONST MSG *lpMsg, DWORD unk) BOOL WINAPI TranslateMessage(CONST MSG *lpMsg) { - return(TranslateMessageEx((LPMSG)lpMsg, 0)); + BOOL Ret = FALSE; + +// Ref: msdn ImmGetVirtualKey: +// http://msdn.microsoft.com/en-us/library/aa912145.aspx +/* + if ( (LOWORD(lpMsg->wParam) != VK_PROCESSKEY) || + !(Ret = IMM_ImmTranslateMessage( lpMsg->hwnd, + lpMsg->message, + lpMsg->wParam, + lpMsg->lParam)) )*/ + { + Ret = TranslateMessageEx((LPMSG)lpMsg, 0); + } + return Ret; } diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index d177d165a7f..47b4b77292e 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -566,6 +566,7 @@ typedef struct _USERCONNECT #define WM_SYSTIMER 280 #define WM_POPUPSYSTEMMENU 787 #define WM_CBT 1023 // ReactOS only. +#define WM_MAXIMUM 0x0001FFFF // // Non SDK DCE types. @@ -3078,16 +3079,6 @@ NtUserSendMessageTimeout(HWND hWnd, ULONG_PTR *uResult, PNTUSERSENDMESSAGEINFO Info); -/* use NtUserMessageCall */ -BOOL -NTAPI -NtUserSendNotifyMessage( - HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam); - - typedef struct _SETSCROLLBARINFO { int nTrackPos; diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index e76c04be93e..4263352e742 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -785,14 +785,14 @@ UserCallNextHookEx(PHOOK Hook, } case WH_CBT: - DPRINT1("HOOK WH_CBT!\n"); + DPRINT("HOOK WH_CBT!\n"); switch (Code) { case HCBT_CREATEWND: { LPCBT_CREATEWNDW pcbtcww = (LPCBT_CREATEWNDW)lParam; - DPRINT1("HOOK HCBT_CREATEWND\n"); + DPRINT("HOOK HCBT_CREATEWND\n"); _SEH2_TRY { if (Ansi) @@ -856,7 +856,7 @@ UserCallNextHookEx(PHOOK Hook, { RECTL rt; - DPRINT1("HOOK HCBT_MOVESIZE\n"); + DPRINT("HOOK HCBT_MOVESIZE\n"); if (lParam) { @@ -893,7 +893,7 @@ UserCallNextHookEx(PHOOK Hook, { CBTACTIVATESTRUCT CbAs; - DPRINT1("HOOK HCBT_ACTIVATE\n"); + DPRINT("HOOK HCBT_ACTIVATE\n"); if (lParam) { _SEH2_TRY @@ -927,7 +927,7 @@ UserCallNextHookEx(PHOOK Hook, /* The rest just use default. */ default: - DPRINT1("HOOK HCBT_ %d\n",Code); + DPRINT("HOOK HCBT_ %d\n",Code); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); break; } diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 45ff2b8ed90..ca812175742 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1314,10 +1314,14 @@ UserPostMessage(HWND Wnd, LPARAM lParam) { PTHREADINFO pti; - MSG UserModeMsg, KernelModeMsg; + MSG Message; LARGE_INTEGER LargeTickCount; - NTSTATUS Status; - PMSGMEMORY MsgMemoryEntry; + + if (FindMsgMemory(Msg) != 0) + { + SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); + return FALSE; + } pti = PsGetCurrentThreadWin32Thread(); if (Wnd == HWND_BROADCAST) @@ -1358,24 +1362,14 @@ UserPostMessage(HWND Wnd, } else { - UserModeMsg.hwnd = Wnd; - UserModeMsg.message = Msg; - UserModeMsg.wParam = wParam; - UserModeMsg.lParam = lParam; - MsgMemoryEntry = FindMsgMemory(UserModeMsg.message); - Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg, MsgMemoryEntry); - if (! NT_SUCCESS(Status)) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - IntGetCursorLocation(pti->Desktop->WindowStation, - &KernelModeMsg.pt); + Message.hwnd = Wnd; + Message.message = Msg; + Message.wParam = wParam; + Message.lParam = lParam; + IntGetCursorLocation(pti->Desktop->WindowStation, &Message.pt); KeQueryTickCount(&LargeTickCount); - pti->timeLast = KernelModeMsg.time = MsqCalculateMessageTime(&LargeTickCount); - MsqPostMessage(Window->MessageQueue, &KernelModeMsg, - NULL != MsgMemoryEntry && 0 != KernelModeMsg.lParam, - QS_POSTMESSAGE); + pti->timeLast = Message.time = MsqCalculateMessageTime(&LargeTickCount); + MsqPostMessage(Window->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); } } @@ -1410,14 +1404,20 @@ NtUserPostThreadMessage(DWORD idThread, WPARAM wParam, LPARAM lParam) { - MSG UserModeMsg, KernelModeMsg; + MSG Message; PETHREAD peThread; PTHREADINFO pThread; NTSTATUS Status; - PMSGMEMORY MsgMemoryEntry; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserPostThreadMessage\n"); + + if (FindMsgMemory(Msg) != 0) + { + SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); + return FALSE; + } + UserEnterExclusive(); Status = PsLookupThreadByThreadId((HANDLE)idThread,&peThread); @@ -1431,21 +1431,11 @@ NtUserPostThreadMessage(DWORD idThread, RETURN( FALSE); } - UserModeMsg.hwnd = NULL; - UserModeMsg.message = Msg; - UserModeMsg.wParam = wParam; - UserModeMsg.lParam = lParam; - MsgMemoryEntry = FindMsgMemory(UserModeMsg.message); - Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg, MsgMemoryEntry); - if (! NT_SUCCESS(Status)) - { - ObDereferenceObject( peThread ); - SetLastWin32Error(ERROR_INVALID_PARAMETER); - RETURN( FALSE); - } - MsqPostMessage(pThread->MessageQueue, &KernelModeMsg, - NULL != MsgMemoryEntry && 0 != KernelModeMsg.lParam, - QS_POSTMESSAGE); + Message.hwnd = NULL; + Message.message = Msg; + Message.wParam = wParam; + Message.lParam = lParam; + MsqPostMessage(pThread->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); ObDereferenceObject( peThread ); RETURN( TRUE); } @@ -1682,7 +1672,7 @@ co_IntPostOrSendMessage(HWND hWnd, } pti = PsGetCurrentThreadWin32Thread(); - if(Window->MessageQueue != pti->MessageQueue) + if(Window->MessageQueue != pti->MessageQueue && FindMsgMemory(Msg) ==0) { Result = UserPostMessage(hWnd, Msg, wParam, lParam); } @@ -1878,6 +1868,13 @@ UserSendNotifyMessage(HWND hWnd, LPARAM lParam) { BOOL Result = TRUE; + + if (FindMsgMemory(Msg) != 0) + { + SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); + return FALSE; + } + // Basicly the same as IntPostOrSendMessage if (hWnd == HWND_BROADCAST) //Handle Broadcast { @@ -1902,10 +1899,7 @@ UserSendNotifyMessage(HWND hWnd, ULONG_PTR PResult; PTHREADINFO pti; PWINDOW_OBJECT Window; - NTSTATUS Status; - MSG UserModeMsg; - MSG KernelModeMsg; - PMSGMEMORY MsgMemoryEntry; + MSG Message; if(!(Window = UserGetWindowObject(hWnd))) return FALSE; @@ -1916,55 +1910,18 @@ UserSendNotifyMessage(HWND hWnd, } else { // Handle message and callback. - UserModeMsg.hwnd = hWnd; - UserModeMsg.message = Msg; - UserModeMsg.wParam = wParam; - UserModeMsg.lParam = lParam; - MsgMemoryEntry = FindMsgMemory(UserModeMsg.message); - Status = CopyMsgToKernelMem(&KernelModeMsg, &UserModeMsg, MsgMemoryEntry); - if (! NT_SUCCESS(Status)) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - Result = co_IntSendMessageTimeoutSingle( - KernelModeMsg.hwnd, KernelModeMsg.message, - KernelModeMsg.wParam, KernelModeMsg.lParam, - SMTO_NORMAL, 0, &PResult); + Message.hwnd = hWnd; + Message.message = Msg; + Message.wParam = wParam; + Message.lParam = lParam; - Status = CopyMsgToUserMem(&UserModeMsg, &KernelModeMsg); - if (! NT_SUCCESS(Status)) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } + Result = co_IntSendMessageTimeoutSingle( hWnd, Msg, wParam, lParam, SMTO_NORMAL, 0, &PResult); } } return Result; } -BOOL APIENTRY -NtUserSendNotifyMessage(HWND hWnd, - UINT Msg, - WPARAM wParam, - LPARAM lParam) -{ - DECLARE_RETURN(BOOL); - - DPRINT("EnterNtUserSendNotifyMessage\n"); - UserEnterExclusive(); - - RETURN(UserSendNotifyMessage(hWnd, Msg, wParam, lParam)); - -CLEANUP: - DPRINT("Leave NtUserSendNotifyMessage, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; - -} - - BOOL APIENTRY NtUserWaitMessage(VOID) { diff --git a/reactos/subsystems/win32/win32k/w32ksvc.db b/reactos/subsystems/win32/win32k/w32ksvc.db index 3a8e5e71f94..4645c9c0aaa 100644 --- a/reactos/subsystems/win32/win32k/w32ksvc.db +++ b/reactos/subsystems/win32/win32k/w32ksvc.db @@ -699,5 +699,4 @@ NtUserRegisterClassEx 6 NtUserMonitorFromWindow 2 NtUserSendMessage 5 NtUserSendMessageTimeout 8 -NtUserSendNotifyMessage 4 NtUserSetScrollBarInfo 3 From 77c9c52324dcde187c5a9b6339f324ba08c79e73 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 4 Jul 2009 16:43:59 +0000 Subject: [PATCH 234/577] - Cleanup patch tab removeal. svn path=/trunk/; revision=41773 --- .../subsystems/win32/win32k/ntuser/message.c | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index ca812175742..b08452a47c9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1317,11 +1317,11 @@ UserPostMessage(HWND Wnd, MSG Message; LARGE_INTEGER LargeTickCount; - if (FindMsgMemory(Msg) != 0) - { - SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); - return FALSE; - } + if (FindMsgMemory(Msg) != 0) + { + SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); + return FALSE; + } pti = PsGetCurrentThreadWin32Thread(); if (Wnd == HWND_BROADCAST) @@ -1412,11 +1412,11 @@ NtUserPostThreadMessage(DWORD idThread, DPRINT("Enter NtUserPostThreadMessage\n"); - if (FindMsgMemory(Msg) != 0) - { - SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); - return FALSE; - } + if (FindMsgMemory(Msg) != 0) + { + SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); + return FALSE; + } UserEnterExclusive(); @@ -1869,11 +1869,11 @@ UserSendNotifyMessage(HWND hWnd, { BOOL Result = TRUE; - if (FindMsgMemory(Msg) != 0) - { - SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); - return FALSE; - } + if (FindMsgMemory(Msg) != 0) + { + SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); + return FALSE; + } // Basicly the same as IntPostOrSendMessage if (hWnd == HWND_BROADCAST) //Handle Broadcast From 3c12bab49c98bf77d4fbad2f17078d8cbb0f8207 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 4 Jul 2009 21:28:39 +0000 Subject: [PATCH 235/577] - Revert r41761 svn path=/trunk/; revision=41775 --- reactos/base/services/dhcp/adapter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/services/dhcp/adapter.c b/reactos/base/services/dhcp/adapter.c index c7394949ba6..4eca48b4295 100644 --- a/reactos/base/services/dhcp/adapter.c +++ b/reactos/base/services/dhcp/adapter.c @@ -159,7 +159,7 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) { if( AdapterKey ) IPAddress = RegReadString( AdapterKey, NULL, "IPAddress" ); - if( IPAddress && !strcmp( IPAddress, "0.0.0.0" ) ) { + if( IPAddress && strcmp( IPAddress, "0.0.0.0" ) ) { /* Non-automatic case */ DH_DbgPrint (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (static %s)\n", From 3df7c8cf6a68ebc9f64ea439151207d9b79dc145 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 5 Jul 2009 02:21:35 +0000 Subject: [PATCH 236/577] - Implement the client shutdown procedure. Tested with wine user32 msg undocumented 0x3B tests. Wine tests: msg: 6175 tests executed (0 marked as todo, 937 failures), 5 skipped. - Add missing end session types. - Reference: winproc.c WM_CLIENTSHUTDOWN http://wiki.winprog.org/wiki/Windows_messages svn path=/trunk/; revision=41776 --- reactos/dll/win32/user32/windows/defwnd.c | 7 ++ reactos/include/psdk/winuser.h | 2 + reactos/include/reactos/win32k/ntuser.h | 1 + .../subsystems/win32/win32k/ntuser/defwnd.c | 96 ++++++++++++++++++- 4 files changed, 102 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/user32/windows/defwnd.c b/reactos/dll/win32/user32/windows/defwnd.c index 8520c5284a1..5f5bdc73b54 100644 --- a/reactos/dll/win32/user32/windows/defwnd.c +++ b/reactos/dll/win32/user32/windows/defwnd.c @@ -1463,6 +1463,13 @@ User32DefWindowProc(HWND hWnd, break; } + case WM_CLIENTSHUTDOWN: + { + LRESULT lResult; + NtUserMessageCall( hWnd, Msg, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE); + return lResult; + } + case WM_CANCELMODE: { iMenuSysKey = 0; diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index 128c09b3112..55d5197cf49 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -2539,6 +2539,8 @@ extern "C" { #endif /* (_WIN32_WINNT >= 0x0400) */ #if (WINVER >= 0x0400) #define ENDSESSION_LOGOFF 0x80000000 +#define ENDSESSION_CRITICAL 0x40000000 +#define ENDSESSION_CLOSEAPP 0x00000001 #endif #if (WINVER >= 0x0500) #define CHILDID_SELF 0 diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 47b4b77292e..66455270786 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -562,6 +562,7 @@ typedef struct _USERCONNECT // // Non SDK Window Message types. // +#define WM_CLIENTSHUTDOWN 59 #define WM_COPYGLOBALDATA 73 #define WM_SYSTIMER 280 #define WM_POPUPSYSTEMMENU 787 diff --git a/reactos/subsystems/win32/win32k/ntuser/defwnd.c b/reactos/subsystems/win32/win32k/ntuser/defwnd.c index e399163ce31..38a3a62e1e9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/defwnd.c +++ b/reactos/subsystems/win32/win32k/ntuser/defwnd.c @@ -12,6 +12,91 @@ #define NDEBUG #include +// Client Shutdown messages +#define MCS_SHUTDOWNTIMERS 1 +#define MCS_QUERYENDSESSION 2 +// Client Shutdown returns +#define MCSR_GOODFORSHUTDOWN 1 +#define MCSR_SHUTDOWNFINISHED 2 +#define MCSR_DONOTSHUTDOWN 3 + +/* + Based on CSRSS and described in pages 1115 - 1118 "Windows Internals, Fifth Edition". + Apparently CSRSS sends out messages to do this w/o going into win32k internals. + */ +static +LRESULT FASTCALL +IntClientShutdown( + PWINDOW_OBJECT pWindow, + WPARAM wParam, + LPARAM lParam +) +{ + LPARAM lParams; + BOOL KillTimers; + INT i; + LRESULT lResult = MCSR_GOODFORSHUTDOWN; + HWND *List; + + lParams = wParam & (ENDSESSION_LOGOFF|ENDSESSION_CRITICAL|ENDSESSION_CLOSEAPP); + KillTimers = wParam & MCS_SHUTDOWNTIMERS ? TRUE : FALSE; +/* + First, send end sessions to children. + */ + List = IntWinListChildren(pWindow); + + if (List) + { + for (i = 0; List[i]; i++) + { + PWINDOW_OBJECT WndChild; + + if (!(WndChild = UserGetWindowObject(List[i])) || !WndChild->Wnd) + continue; + + if (wParam & MCS_QUERYENDSESSION) + { + if (!co_IntSendMessage(WndChild->hSelf, WM_QUERYENDSESSION, 0, lParams)) + { + lResult = MCSR_DONOTSHUTDOWN; + break; + } + } + else + { + co_IntSendMessage(WndChild->hSelf, WM_ENDSESSION, KillTimers, lParams); + if (KillTimers) + { + MsqRemoveTimersWindow(WndChild->MessageQueue, WndChild->hSelf); + } + lResult = MCSR_SHUTDOWNFINISHED; + } + } + ExFreePool(List); + } + if (List && (lResult == MCSR_DONOTSHUTDOWN)) return lResult; +/* + Send to the caller. + */ + if (wParam & MCS_QUERYENDSESSION) + { + if (!co_IntSendMessage(pWindow->hSelf, WM_QUERYENDSESSION, 0, lParams)) + { + lResult = MCSR_DONOTSHUTDOWN; + } + } + else + { + co_IntSendMessage(pWindow->hSelf, WM_ENDSESSION, KillTimers, lParams); + if (KillTimers) + { + MsqRemoveTimersWindow(pWindow->MessageQueue, pWindow->hSelf); + } + lResult = MCSR_SHUTDOWNFINISHED; + } + return lResult; +} + /* Win32k counterpart of User DefWindowProc */ @@ -35,10 +120,10 @@ IntDefWindowProc( { case WM_SYSCOMMAND: { - DPRINT1("hwnd %p WM_SYSCOMMAND %lx %lx\n", Window->hSelf, wParam, lParam ); - if (!ISITHOOKED(WH_CBT)) break; - lResult = co_HOOK_CallHooks(WH_CBT, HCBT_SYSCOMMAND, wParam, lParam); - break; + DPRINT1("hwnd %p WM_SYSCOMMAND %lx %lx\n", Window->hSelf, wParam, lParam ); + if (!ISITHOOKED(WH_CBT)) break; + lResult = co_HOOK_CallHooks(WH_CBT, HCBT_SYSCOMMAND, wParam, lParam); + break; } case WM_SHOWWINDOW: { @@ -59,6 +144,9 @@ IntDefWindowProc( } } break; + case WM_CLIENTSHUTDOWN: + return IntClientShutdown(Window, wParam, lParam); + case WM_CBT: { if (!ISITHOOKED(WH_CBT)) break; From 4419fee70ad539c97917b8090402afba16cb1da1 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 5 Jul 2009 04:00:59 +0000 Subject: [PATCH 237/577] - Discontinue the use of thread information for the hook check and use client information. - Moved code around to make it readable. svn path=/trunk/; revision=41777 --- reactos/dll/win32/user32/include/user32.h | 4 +- reactos/dll/win32/user32/windows/message.c | 54 ++++++++++++++-------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/reactos/dll/win32/user32/include/user32.h b/reactos/dll/win32/user32/include/user32.h index 9fac57e4f4d..cfcaba8c4be 100644 --- a/reactos/dll/win32/user32/include/user32.h +++ b/reactos/dll/win32/user32/include/user32.h @@ -90,9 +90,9 @@ SharedPtrToKernel(PVOID Ptr) } static __inline BOOL -IsThreadHooked(PW32THREADINFO ti) +IsThreadHooked(PCLIENTINFO pci) { - return ti->fsHooks != 0; + return pci->fsHooks != 0; } static __inline PDESKTOPINFO diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index 40c43c53eea..c5fe9859f4a 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -1801,7 +1801,7 @@ SendMessageW(HWND Wnd, PW32THREADINFO ti = GetW32ThreadInfo(); Window = ValidateHwnd(Wnd); - if (Window != NULL && SharedPtrToUser(Window->ti) == ti && !IsThreadHooked(ti)) + if (Window != NULL && SharedPtrToUser(Window->ti) == ti && !IsThreadHooked(GetWin32ClientInfo())) { /* NOTE: We can directly send messages to the window procedure if *all* the following conditions are met: @@ -1819,23 +1819,30 @@ SendMessageW(HWND Wnd, UMMsg.wParam = wParam; UMMsg.lParam = lParam; if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, FALSE)) - { - return FALSE; - } + { + return FALSE; + } Info.Ansi = FALSE; - Result = NtUserSendMessage(KMMsg.hwnd, KMMsg.message, - KMMsg.wParam, KMMsg.lParam, &Info); + Result = NtUserSendMessage( KMMsg.hwnd, + KMMsg.message, + KMMsg.wParam, + KMMsg.lParam, + &Info); if (! Info.HandledByKernel) - { - MsgiUMToKMCleanup(&UMMsg, &KMMsg); - /* We need to send the message ourselves */ - Result = IntCallWindowProcW(Info.Ansi, Info.Proc, UMMsg.hwnd, UMMsg.message, - UMMsg.wParam, UMMsg.lParam); - } + { + MsgiUMToKMCleanup(&UMMsg, &KMMsg); + /* We need to send the message ourselves */ + Result = IntCallWindowProcW( Info.Ansi, + Info.Proc, + UMMsg.hwnd, + UMMsg.message, + UMMsg.wParam, + UMMsg.lParam); + } else if (! MsgiUMToKMReply(&UMMsg, &KMMsg, &Result)) - { - return FALSE; - } + { + return FALSE; + } return Result; } @@ -1858,7 +1865,7 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) PW32THREADINFO ti = GetW32ThreadInfo(); Window = ValidateHwnd(Wnd); - if (Window != NULL && SharedPtrToUser(Window->ti) == ti && !IsThreadHooked(ti)) + if (Window != NULL && SharedPtrToUser(Window->ti) == ti && !IsThreadHooked(GetWin32ClientInfo())) { /* NOTE: We can directly send messages to the window procedure if *all* the following conditions are met: @@ -1886,8 +1893,11 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) return FALSE; } Info.Ansi = TRUE; - Result = NtUserSendMessage(KMMsg.hwnd, KMMsg.message, - KMMsg.wParam, KMMsg.lParam, &Info); + Result = NtUserSendMessage( KMMsg.hwnd, + KMMsg.message, + KMMsg.wParam, + KMMsg.lParam, + &Info); if (! Info.HandledByKernel) { /* We need to send the message ourselves */ @@ -1904,8 +1914,12 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) /* Unicode winproc. Although we started out with an Ansi message we already converted it to Unicode for the kernel call. Reuse that message to avoid another conversion */ - Result = IntCallWindowProcW(Info.Ansi, Info.Proc, UcMsg.hwnd, - UcMsg.message, UcMsg.wParam, UcMsg.lParam); + Result = IntCallWindowProcW( Info.Ansi, + Info.Proc, + UcMsg.hwnd, + UcMsg.message, + UcMsg.wParam, + UcMsg.lParam); if (! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result)) { return FALSE; From 0d5243017db14262d23708cd02e8642f2809075f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 5 Jul 2009 07:47:41 +0000 Subject: [PATCH 238/577] - Move PostThreadMessage internals into its own function. svn path=/trunk/; revision=41778 --- .../subsystems/win32/win32k/ntuser/message.c | 97 ++++++++++++------- 1 file changed, 60 insertions(+), 37 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index b08452a47c9..0053dbf7883 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1307,6 +1307,55 @@ CopyMsgToUserMem(MSG *UserModeMsg, MSG *KernelModeMsg) return STATUS_SUCCESS; } +BOOL FASTCALL +UserPostThreadMessage( DWORD idThread, + UINT Msg, + WPARAM wParam, + LPARAM lParam) +{ + MSG Message; + PETHREAD peThread; + PTHREADINFO pThread; + LARGE_INTEGER LargeTickCount; + NTSTATUS Status; + + DPRINT1("UserPostThreadMessage wParam 0x%x lParam 0x%x\n", wParam,lParam); + + if (FindMsgMemory(Msg) != 0) + { + SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); + return FALSE; + } + + Status = PsLookupThreadByThreadId((HANDLE)idThread,&peThread); + + if( Status == STATUS_SUCCESS ) + { + pThread = (PTHREADINFO)peThread->Tcb.Win32Thread; + if( !pThread || !pThread->MessageQueue ) + { + ObDereferenceObject( peThread ); + return FALSE; + } + + Message.hwnd = NULL; + Message.message = Msg; + Message.wParam = wParam; + Message.lParam = lParam; + IntGetCursorLocation(pThread->Desktop->WindowStation, &Message.pt); + KeQueryTickCount(&LargeTickCount); + pThread->timeLast = Message.time = MsqCalculateMessageTime(&LargeTickCount); + MsqPostMessage(pThread->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); + ObDereferenceObject( peThread ); + return TRUE; + } + else + { + SetLastNtError( Status ); + } + return FALSE; +} + BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, @@ -1323,6 +1372,12 @@ UserPostMessage(HWND Wnd, return FALSE; } + if (!Wnd) + return UserPostThreadMessage( PtrToInt(PsGetCurrentThreadId()), + Msg, + wParam, + lParam); + pti = PsGetCurrentThreadWin32Thread(); if (Wnd == HWND_BROADCAST) { @@ -1372,7 +1427,6 @@ UserPostMessage(HWND Wnd, MsqPostMessage(Window->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); } } - return TRUE; } @@ -1388,7 +1442,7 @@ NtUserPostMessage(HWND hWnd, DPRINT("Enter NtUserPostMessage\n"); UserEnterExclusive(); - RETURN(UserPostMessage(hWnd, Msg, wParam, lParam)); + RETURN( UserPostMessage(hWnd, Msg, wParam, lParam)); CLEANUP: DPRINT("Leave NtUserPostMessage, ret=%i\n",_ret_); @@ -1404,46 +1458,15 @@ NtUserPostThreadMessage(DWORD idThread, WPARAM wParam, LPARAM lParam) { - MSG Message; - PETHREAD peThread; - PTHREADINFO pThread; - NTSTATUS Status; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserPostThreadMessage\n"); - - if (FindMsgMemory(Msg) != 0) - { - SetLastWin32Error(ERROR_MESSAGE_SYNC_ONLY ); - return FALSE; - } - UserEnterExclusive(); - Status = PsLookupThreadByThreadId((HANDLE)idThread,&peThread); - - if( Status == STATUS_SUCCESS ) - { - pThread = (PTHREADINFO)peThread->Tcb.Win32Thread; - if( !pThread || !pThread->MessageQueue ) - { - ObDereferenceObject( peThread ); - RETURN( FALSE); - } - - Message.hwnd = NULL; - Message.message = Msg; - Message.wParam = wParam; - Message.lParam = lParam; - MsqPostMessage(pThread->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); - ObDereferenceObject( peThread ); - RETURN( TRUE); - } - else - { - SetLastNtError( Status ); - RETURN( FALSE); - } + RETURN( UserPostThreadMessage( idThread, + Msg, + wParam, + lParam)); CLEANUP: DPRINT("Leave NtUserPostThreadMessage, ret=%i\n",_ret_); From bc9c521a8487a17aa0718fcf5620e9b98a77ce1a Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 5 Jul 2009 14:08:10 +0000 Subject: [PATCH 239/577] If exception occurs, leave critical section. Bug #4431. svn path=/trunk/; revision=41779 --- .../subsystems/win32/win32k/ntuser/painting.c | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index d260e01b785..ad92de34cde 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -1813,6 +1813,7 @@ BOOL UserDrawCaption( /* FIXME: Draw the Icon when pWnd == NULL but hIcon is valid */ if (pWnd != NULL) UserDrawSysMenuButton(pWnd, hMemDc, &r, FALSE); + r.left += IconWidth; r.top --; } @@ -1848,8 +1849,8 @@ BOOL UserDrawCaption( /* FIXME: hFont isn't handled */ if (str) UserDrawCaptionText(hMemDc, str, &r, uFlags); - else if (pWnd != NULL) - UserDrawCaptionText(hMemDc, &pWnd->Wnd->WindowName, &r, uFlags); + else if (pWnd != NULL) + UserDrawCaptionText(hMemDc, &pWnd->Wnd->WindowName, &r, uFlags); } if(!NtGdiBitBlt(hDc, lpRc->left, lpRc->top, @@ -1902,9 +1903,10 @@ NtUserDrawCaptionTemp( UINT uFlags) { PWINDOW_OBJECT pWnd = NULL; - RECTL SafeRect; UNICODE_STRING SafeStr = {0}; - BOOL Ret = FALSE; + NTSTATUS Status = STATUS_SUCCESS; + RECTL SafeRect; + BOOL Ret; UserEnterExclusive(); @@ -1930,17 +1932,26 @@ NtUserDrawCaptionTemp( SafeStr.Length, sizeof(WCHAR)); } - Ret = UserDrawCaption(pWnd, hDC, &SafeRect, hFont, hIcon, &SafeStr, uFlags); } - else - Ret = UserDrawCaption(pWnd, hDC, &SafeRect, hFont, hIcon, NULL, uFlags); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - SetLastNtError(_SEH2_GetExceptionCode()); + Status = _SEH2_GetExceptionCode(); } _SEH2_END; + if (Status != STATUS_SUCCESS) + { + SetLastNtError(Status); + UserLeave(); + return FALSE; + } + + if (str != NULL) + Ret = UserDrawCaption(pWnd, hDC, &SafeRect, hFont, hIcon, &SafeStr, uFlags); + else + Ret = UserDrawCaption(pWnd, hDC, &SafeRect, hFont, hIcon, NULL, uFlags); + UserLeave(); return Ret; } From 94fe2f6efe6931168f5e59f6b117dee4fd336faf Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 5 Jul 2009 14:51:07 +0000 Subject: [PATCH 240/577] Update Norwegian translations. Lars Martin Hambro, bug #4655. svn path=/trunk/; revision=41780 --- reactos/base/applications/paint/lang/no-NO.rc | 6 +- reactos/base/shell/cmd/lang/no-NO.rc | 64 ++++++- reactos/dll/win32/netshell/lang/no-NO.rc | 173 +++++++++--------- reactos/dll/win32/shell32/lang/no-NO.rc | 2 +- 4 files changed, 146 insertions(+), 99 deletions(-) diff --git a/reactos/base/applications/paint/lang/no-NO.rc b/reactos/base/applications/paint/lang/no-NO.rc index a26ca00820c..7847f9a01ef 100644 --- a/reactos/base/applications/paint/lang/no-NO.rc +++ b/reactos/base/applications/paint/lang/no-NO.rc @@ -46,7 +46,7 @@ BEGIN MENUITEM SEPARATOR POPUP "Forstørre" BEGIN - POPUP "User defined" + POPUP "Egendefinert" BEGIN MENUITEM "12,5%", IDM_VIEWZOOM125 MENUITEM "25%", IDM_VIEWZOOM25 @@ -57,8 +57,8 @@ BEGIN MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "Show grid", IDM_VIEWSHOWGRID - MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE + MENUITEM "Vis rutenett", IDM_VIEWSHOWGRID + MENUITEM "Vis miniatyr", IDM_VIEWSHOWMINIATURE END MENUITEM "Full skjerm\tCtrl+F", IDM_VIEWFULLSCREEN END diff --git a/reactos/base/shell/cmd/lang/no-NO.rc b/reactos/base/shell/cmd/lang/no-NO.rc index ff0d7c3e4c5..2b1c1c941ca 100644 --- a/reactos/base/shell/cmd/lang/no-NO.rc +++ b/reactos/base/shell/cmd/lang/no-NO.rc @@ -243,7 +243,10 @@ Skriv ECHO uten parameter for STRING_ECHO_HELP5, "ECHO er %s\n" -STRING_EXIT_HELP, "Avslutt kommandotolk.\n\nEXIT\n" +STRING_EXIT_HELP, "Avslutt kommando linje interpreter.\n\nAVSLUTT [/b] [ExitCode]\n\n\ + /B Avslutt bare en batch fil. \n\ + Hvis det kjøres en batch fil på utsiden vil den avslutte cmd.exe\n\ + ExitCode Denne verdien vil bli utpekt til ERRORLEVEL ved avslutting\n" STRING_FOR_HELP1, "Kjør en spesifisert kommando for hver fil i en gruppe med filer\n\n\ FOR %variabel IN (gruppe) DO kommando [parametere]\n\n\ @@ -397,6 +400,46 @@ STRING_REN_HELP2, " %lu fil endret navn\n" STRING_REN_HELP3, " %lu filer endret navn\n" +STRING_REPLACE_HELP1, "Replaces files.\n\n\ +REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]\n\ +REPLACE [drive1:][path1]filename [drive2:][path2] [/P] [/R] [/S] [/W] [/U]\n\n\ + [drive1:][path1]filename Specifies the source file or files.\n\ + [drive2:][path2] Specifies the directory where files are to be\n\ + replaced.\n\ + /A Adds new files to destination directory. Cannot\n\ + use with /S or /U switches.\n\ + /P Prompts for confirmation before replacing a file or\n\ + adding a source file.\n\ + /R Replaces read-only files as well as unprotected\n\ + files.\n\ + /S Replaces files in all subdirectories of the\n\ + destination directory. Cannot use with the /A\n\ + switch.\n\ + /W Waits for you to insert a disk before beginning.\n\ + /U Replaces (updates) only files that are older than\n\ + source files. Cannot use with the /A switch.\n" + +STRING_REPLACE_HELP2, "Source path required\n" + +STRING_REPLACE_HELP3, "No files replaced\n" + +STRING_REPLACE_HELP4, "%lu file(s) replaced\n" + +STRING_REPLACE_HELP5, "Replacing %s\n" + +STRING_REPLACE_HELP6, "Replace %s\n" + +STRING_REPLACE_HELP7, "No files added\n" + +STRING_REPLACE_HELP8, "%lu file(s) added\n" + +STRING_REPLACE_HELP9, "Add %s (Y/N) " + +STRING_REPLACE_HELP10, "Replace %s (Y/N) " + +STRING_REPLACE_HELP11, "Adding %s\n" + + STRING_SHIFT_HELP, "Endre posisjon for erstattelig parameter i et satsvis fil.\n\n\ SHIFT [NED]" @@ -511,6 +554,7 @@ MAX maksimer vinduet\n\ RESTORE gjenopprett vinduet\n\ tittel ny tittel\n" + STRING_HELP1, "Liste av alle tilgjengelige kommandoer (+ beskrivelse)\n\n\ kommando /? For mer informasjon om en bestemt kommando\n\n\ ? Lister alle tilgjengelige kommando uten beskrivelse).\n\ @@ -557,7 +601,6 @@ RMDIR Fjerner en mappe.\n\ SCREEN Flytter markør.\n\ SET Vis, sett, eller fjern ReactOS miljøvariabel.\n\ SHIFT Shift plass for erstattelige parameter i satsvise filer.\n" - STRING_HELP2, "START Start et separat vindu til å kjøre et spesifisert program eller kommando.\n\ Utfører kommando.\n\ TIME Vis eller sett system tid.\n\ @@ -573,9 +616,8 @@ VOL Vis et volums navn og serienummer.\n" STRING_CHOICE_OPTION, "YN" STRING_COPY_OPTION, "YNA" - +STRING_ASSOC_ERROR, "Fil association ble ikke funnet for utvidelsen %s\n" STRING_ALIAS_ERROR, "Kommando linje for lang etter alias utvidelse!\n" -STRING_ASSOC_ERROR, "File association not found for extension %s\n" STRING_BATCH_ERROR, "Feil ved åpning av satsvis fil\n" STRING_CHCP_ERROR1, "Aktiv tegntabell: %u\n" STRING_CHCP_ERROR4, "Ugyldig tegntabell\n" @@ -643,8 +685,16 @@ STRING_ERROR_DRIVER_NOT_READY, "Stasjonen er ikke klar" STRING_PATH_ERROR, "CMD: Ikke i miljøet '%s'\n" -STRING_REACTOS_VERSION, "ReactOS Operating System [Version %s-%s]\n" -STRING_CMD_SHELLINFO, "\nReactOS Kommandotolk\nVersion %s %s" +STRING_REPLACE_ERROR1, "Invalid switch - %s\n" +STRING_REPLACE_ERROR2, "Mappen ble ikke funnet - %s\n" +STRING_REPLACE_ERROR3, "The filename, directory name, or volume label syntax is incorrect.\n" +STRING_REPLACE_ERROR4, "Invalid parameter combination\n" +STRING_REPLACE_ERROR5, "Tilgang nektet - %s\n" +STRING_REPLACE_ERROR6, "Ingen filer ble funnet - %s\n" +STRING_REPLACE_ERROR7, "Extended Error 32\n" + +STRING_REACTOS_VERSION, "ReactOS Operativsystem [Versjon %s-%s]\n" +STRING_CMD_SHELLINFO, "\nReactOS Kommandotolk\nVersjon %s %s" STRING_VERSION_RUNVER, " kjører på %s" STRING_COPY_FILE , " %d file(r) kopiert\n" STRING_DELETE_WIPE, "slettet" @@ -656,7 +706,7 @@ STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n" STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n" STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n" STRING_MORE, "More? " -STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break pressed. Cancel batch file? (Yes/No/All) " +STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break trykket. Avbryt batch filen? (Ja/Nei/Alt) " STRING_INVALID_OPERAND, "Ugyldig operand." STRING_EXPECTED_CLOSE_PAREN, "Forventet ')'." diff --git a/reactos/dll/win32/netshell/lang/no-NO.rc b/reactos/dll/win32/netshell/lang/no-NO.rc index 6970dd5e2f2..31fafa28464 100644 --- a/reactos/dll/win32/netshell/lang/no-NO.rc +++ b/reactos/dll/win32/netshell/lang/no-NO.rc @@ -5,23 +5,23 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Generielt" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55 - LTEXT "Koble til med:", -1, 9,9,217,8 - EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_DISABLED | WS_TABSTOP - PUSHBUTTON "&Konfigurere", IDC_CONFIGURE, 189, 38, 50, 14 - LTEXT "Komponentene bruker følgende elementer for tilkobling:", -1, 9, 59, 217, 8 - PUSHBUTTON "&Installere", IDC_INSTALL, 9, 130, 65, 14, WS_DISABLED | WS_TABSTOP - PUSHBUTTON "&Avinstallere", IDC_UNINSTALL, 90, 130, 65, 14, WS_DISABLED | WS_TABSTOP - PUSHBUTTON "&Egenskaper", IDC_PROPERTIES, 174, 130, 65, 14 - GROUPBOX "Beskrivelse", -1, 9, 153, 230, 46, BS_GROUPBOX - LTEXT "Komponent beskrivelse kommer her...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP - CHECKBOX "Vis ikon i oppgavelinjen når tilkoblet", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "Gi beskjed hvis denne tilkoblingen har begrenset eller ingen tilkobling", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CONTROL "", IDC_COMPONENTSLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 9, 71, 230, 55 + LTEXT "Koble til med:", -1, 9,9,217,8 + EDITTEXT IDC_NETCARDNAME, 9, 21, 230, 12, WS_BORDER | WS_TABSTOP | ES_READONLY + PUSHBUTTON "&Konfigurere", IDC_CONFIGURE, 189, 38, 50, 14 + LTEXT "Komponentene bruker følgende elementer for tilkobling:", -1, 9, 59, 217, 8 + PUSHBUTTON "&Installere", IDC_INSTALL, 9, 130, 65, 14, WS_DISABLED | WS_TABSTOP + PUSHBUTTON "&Avinstallere", IDC_UNINSTALL, 90, 130, 65, 14, WS_DISABLED | WS_TABSTOP + PUSHBUTTON "&Egenskaper", IDC_PROPERTIES, 174, 130, 65, 14 + GROUPBOX "Beskrivelse", -1, 9, 153, 230, 46, BS_GROUPBOX + LTEXT "Komponent beskrivelse kommer her...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP + CHECKBOX "Vis ikon i oppgavelinjen når tilkoblet", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "Gi beskjed hvis denne tilkoblingen har begrenset eller ingen tilkobling", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP END IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Allgemein" +CAPTION "Generielt" FONT 8, "MS Shell Dlg" BEGIN END @@ -31,25 +31,22 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION CAPTION "Generielt" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Tilkobling", -1, 9, 8, 182, 58, BS_GROUPBOX - LTEXT "Status:", -1, 19, 20, 60, 8 - LTEXT "Varighet:", -1, 19, 34, 60, 8 - LTEXT "Hastighet:", -1, 19, 48, 60, 8 - GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX - RTEXT "Sendt", -1, 26, 90, 60, 8 - ICON IDI_HORIZONTAL, -1, 90, 85, 18, 20 - ICON IDI_NETSTAT, -1, 110, 85, 18, 20 - ICON IDI_HORIZONTAL, -1, 130, 85, 18, 20 - LTEXT "Mottatt", -1, 149, 90, 37, 8 - LTEXT "Byte:", -1, 17, 115, 32, 8 - RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 - ICON IDI_VERTICAL, -1, 110, 108, 18, 20 - RTEXT "000.000.000", IDC_RECEIVED, 139, 115, 44, 8 - PUSHBUTTON "&Egenskaper", IDC_STATUS_PROPERTIES, 10, 150, 50, 14 - PUSHBUTTON "&Deaktiver", IDC_ENDISABLE, 66, 150, 50, 14 - RTEXT "",IDC_STATUS,83,20,98,8 - RTEXT "",IDC_DURATION,83,34,98,8 - RTEXT "",IDC_SPEED,83,48,98,8 + GROUPBOX "Tilkobling", -1, 9, 8, 182, 58, BS_GROUPBOX + LTEXT "Status:", -1, 19, 20, 60, 8 + LTEXT "Varighet:", -1, 19, 34, 60, 8 + LTEXT "Hastighet:", -1, 19, 48, 60, 8 + GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX + RTEXT "Sendt", -1, 26, 90, 60, 8 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + LTEXT "Mottatt", -1, 149, 90, 37, 8 + LTEXT "Byte:", -1, 17, 115, 32, 8 + RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 + RTEXT "000.000.000", IDC_RECEIVED, 139, 115, 44, 8 + PUSHBUTTON "&Egenskaper", IDC_STATUS_PROPERTIES, 10, 150, 50, 14 + PUSHBUTTON "&Deaktiver", IDC_ENDISABLE, 66, 150, 50, 14 + RTEXT "",IDC_STATUS,83,20,98,8 + RTEXT "",IDC_DURATION,83,34,98,8 + RTEXT "",IDC_SPEED,83,48,98,8 END IDD_LAN_NETSTATUSADVANCED DIALOGEX DISCARDABLE 0, 0, 200,180 @@ -57,18 +54,18 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Hjelp" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Tilkoblingsstatus", -1, 9, 8, 200, 88, BS_GROUPBOX - LTEXT "Adressetype:", -1, 22, 20, 80, 8 - LTEXT "IP adresse:", -1, 22, 34, 80, 8 - LTEXT "Subnet maske:", -1, 22, 48, 80, 8 - LTEXT "Standard Gateway:", -1, 22, 62, 80, 8 - - RTEXT "Ikke tilgjengelig", IDC_DETAILSTYPE, 122, 20, 80, 8 - RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8 - RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8 - RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8 - - PUSHBUTTON "&Detaljer...", IDC_DETAILS, 22, 76, 62, 14 + GROUPBOX "Tilkoblingsstatus", -1, 9, 8, 200, 88, BS_GROUPBOX + LTEXT "Adressetype:", -1, 22, 20, 80, 8 + LTEXT "IP adresse:", -1, 22, 34, 80, 8 + LTEXT "Subnet maske:", -1, 22, 48, 80, 8 + LTEXT "Standard Gateway:", -1, 22, 62, 80, 8 + + RTEXT "Ikke tilgjengelig", IDC_DETAILSTYPE, 122, 20, 80, 8 + RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8 + RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8 + RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8 + + PUSHBUTTON "&Detaljer...", IDC_DETAILS, 22, 76, 62, 14 END IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200 @@ -76,54 +73,54 @@ STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Nettverk tilkobling detaljer" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Nettverk tilkobling &detaljer:", -1, 15, 9, 170, 12 - CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130 - PUSHBUTTON "&Lukk", IDC_CLOSE, 125, 165, 62, 14 + LTEXT "Nettverk tilkobling &detaljer:", -1, 15, 9, 170, 12 + CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130 + PUSHBUTTON "&Lukk", IDC_CLOSE, 125, 165, 62, 14 END STRINGTABLE DISCARDABLE BEGIN - IDS_PHYSICAL_ADDRESS "Physical Address" - IDS_IP_ADDRESS "IP addresse" - IDS_SUBNET_MASK "Subnet Mask" - IDS_DEF_GATEWAY "Default Gateway" - IDS_DHCP_SERVER "DHCP Server" - IDS_LEASE_OBTAINED "Lease Obtained" - IDS_LEASE_EXPIRES "Lease Expires" - IDS_DNS_SERVERS "DNS Servers" - IDS_WINS_SERVERS "WINS Servers" - IDS_PROPERTY "Property" - IDS_VALUE "Value" - IDS_NETWORKCONNECTION "Nettverk tilkobling" - IDS_SHV_COLUMN_NAME "Navn" - IDS_SHV_COLUMN_TYPE "Type" - IDS_SHV_COLUMN_STATE "Status" - IDS_SHV_COLUMN_DEVNAME "Enhetsnavn" - IDS_SHV_COLUMN_PHONE "Telefon # eller vert address" - IDS_SHV_COLUMN_OWNER "Eier" - IDS_TYPE_ETHERNET "Nettverk eller høy-hastighet internett" - IDS_STATUS_NON_OPERATIONAL "Deaktivert" - IDS_STATUS_UNREACHABLE "Ikke tilkoblet" - IDS_STATUS_DISCONNECTED "Nettverk kabel er frakoblet" - IDS_STATUS_CONNECTING "Henter nettverk addresse" - IDS_STATUS_CONNECTED "Tilkoblet" - IDS_STATUS_OPERATIONAL "Tilkoblet" + IDS_PHYSICAL_ADDRESS "Fysisk adresse" + IDS_IP_ADDRESS "IP addresse" + IDS_SUBNET_MASK "Subnet Maske" + IDS_DEF_GATEWAY "Standard Gateway" + IDS_DHCP_SERVER "DHCP tjener" + IDS_LEASE_OBTAINED "Lease Obtained" + IDS_LEASE_EXPIRES "Lease Expires" + IDS_DNS_SERVERS "DNS tjenere" + IDS_WINS_SERVERS "WINS tjenere" + IDS_PROPERTY "Egenskaper" + IDS_VALUE "Verdi" + IDS_NETWORKCONNECTION "Nettverk tilkobling" + IDS_SHV_COLUMN_NAME "Navn" + IDS_SHV_COLUMN_TYPE "Type" + IDS_SHV_COLUMN_STATE "Status" + IDS_SHV_COLUMN_DEVNAME "Enhetsnavn" + IDS_SHV_COLUMN_PHONE "Telefon # eller vert addresse" + IDS_SHV_COLUMN_OWNER "Eier" + IDS_TYPE_ETHERNET "Nettverk eller høy-hastighet internett" + IDS_STATUS_NON_OPERATIONAL "Deaktivert" + IDS_STATUS_UNREACHABLE "Ikke tilkoblet" + IDS_STATUS_DISCONNECTED "Nettverkkabel er frakoblet" + IDS_STATUS_CONNECTING "Henter nettverk addresse" + IDS_STATUS_CONNECTED "Tilkoblet" + IDS_STATUS_OPERATIONAL "Tilkoblet" - IDS_NET_ACTIVATE "Aktivere" - IDS_NET_DEACTIVATE "Deaktivere" - IDS_NET_STATUS "Status" - IDS_NET_REPAIR "Reparere" - IDS_NET_CREATELINK "Opprett snarvei" - IDS_NET_DELETE "Slett" - IDS_NET_PROPERTIES "Egenskaper" + IDS_NET_ACTIVATE "Aktivere" + IDS_NET_DEACTIVATE "Deaktivere" + IDS_NET_STATUS "Status" + IDS_NET_REPAIR "Reparere" + IDS_NET_CREATELINK "Opprett snarvei" + IDS_NET_DELETE "Slett" + IDS_NET_RENAME "Rename" + IDS_NET_PROPERTIES "Egenskaper" - IDS_FORMAT_BIT "%u Bit/s" - IDS_FORMAT_KBIT "%u KBit/s" - IDS_FORMAT_MBIT "%u MBit/s" - IDS_FORMAT_GBIT "%u GBit/s" - IDS_DURATION_DAY "%d dag %s" - IDS_DURATION_DAYS "%d dager %s" - IDS_ASSIGNED_DHCP "Tilordnet av DHCP" - IDS_ASSIGNED_MANUAL "Manuelt konfigurert" + IDS_FORMAT_BIT "%u Bit/s" + IDS_FORMAT_KBIT "%u KBit/s" + IDS_FORMAT_MBIT "%u MBit/s" + IDS_FORMAT_GBIT "%u GBit/s" + IDS_DURATION_DAY "%d dag %s" + IDS_DURATION_DAYS "%d dager %s" + IDS_ASSIGNED_DHCP "Tilordnet av DHCP" + IDS_ASSIGNED_MANUAL "Manuelt konfigurert" END - diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index 1d4267895c8..3a694bcc048 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -457,7 +457,7 @@ FONT 8, "MS Shell Dlg" BEGIN ICON 45, 14344, 10, 10, 21, 20, SS_REALSIZECONTROL LTEXT "Er du sikker på at du vil logge av?", -1, 43, 11, 140, 22 - DEFPUSHBUTTON "&Log Off", IDOK, 57, 40, 60, 14 + DEFPUSHBUTTON "&Logg av", IDOK, 57, 40, 60, 14 PUSHBUTTON "Avbryt", IDCANCEL, 122, 40, 60, 14 END From c8fc6c56e52ed088323a8f8743515e9eae4d1ae8 Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Sun, 5 Jul 2009 15:02:29 +0000 Subject: [PATCH 241/577] If you hit the close button the taskmanager shouldn't start up anymore svn path=/trunk/; revision=41781 --- reactos/dll/win32/msgina/gui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/msgina/gui.c b/reactos/dll/win32/msgina/gui.c index a617b6f6160..d3e2a9afb9d 100644 --- a/reactos/dll/win32/msgina/gui.c +++ b/reactos/dll/win32/msgina/gui.c @@ -259,7 +259,7 @@ LoggedOnWindowProc( } case WM_CLOSE: { - EndDialog(hwndDlg, IDNO); + EndDialog(hwndDlg, WLX_SAS_ACTION_NONE); return TRUE; } } From fe902d9d860b999692c2ec876c8eea8a66155259 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 6 Jul 2009 04:13:55 +0000 Subject: [PATCH 242/577] - Register us as a protocol and start the loopback adapter only after we are fully initialized - Start the loopback adapter before registering as a protocol so binding happens in the correct order (will be important for my next commit) - TODO: Cleanup this code svn path=/trunk/; revision=41782 --- reactos/drivers/network/tcpip/tcpip/main.c | 91 +++++++++++----------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/reactos/drivers/network/tcpip/tcpip/main.c b/reactos/drivers/network/tcpip/tcpip/main.c index fae68ad89f3..e92bcd9351e 100644 --- a/reactos/drivers/network/tcpip/tcpip/main.c +++ b/reactos/drivers/network/tcpip/tcpip/main.c @@ -885,6 +885,51 @@ DriverEntry( return Status; } + /* Use direct I/O */ + IPDeviceObject->Flags |= DO_DIRECT_IO; + RawIPDeviceObject->Flags |= DO_DIRECT_IO; + UDPDeviceObject->Flags |= DO_DIRECT_IO; + TCPDeviceObject->Flags |= DO_DIRECT_IO; + + /* Initialize the driver object with this driver's entry points */ + DriverObject->MajorFunction[IRP_MJ_CREATE] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = TiDispatchInternal; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TiDispatch; + + DriverObject->DriverUnload = TiUnload; + + /* Initialize our periodic timer and its associated DPC object. When the + timer expires, the IPTimeout deferred procedure call (DPC) is queued */ + ExInitializeWorkItem( &IpWorkItem, IPTimeout, NULL ); + KeInitializeDpc(&IPTimeoutDpc, IPTimeoutDpcFn, NULL); + KeInitializeTimer(&IPTimer); + + /* Start the periodic timer with an initial and periodic + relative expiration time of IP_TIMEOUT milliseconds */ + DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000; + KeSetTimerEx(&IPTimer, DueTime, IP_TIMEOUT, &IPTimeoutDpc); + + /* Open loopback adapter */ + Status = LoopRegisterAdapter(NULL, NULL); + if (!NT_SUCCESS(Status)) { + TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status)); + TCPShutdown(); + UDPShutdown(); + RawIPShutdown(); + IPShutdown(); + ChewShutdown(); + IoDeleteDevice(IPDeviceObject); + IoDeleteDevice(RawIPDeviceObject); + IoDeleteDevice(UDPDeviceObject); + IoDeleteDevice(TCPDeviceObject); + exFreePool(EntityList); + NdisFreePacketPool(GlobalPacketPool); + NdisFreeBufferPool(GlobalBufferPool); + return Status; + } + /* Register protocol with NDIS */ /* This used to be IP_DEVICE_NAME but the DDK says it has to match your entry in the SCM */ Status = LANRegisterProtocol(&strNdisDeviceName); @@ -913,52 +958,6 @@ DriverEntry( return Status; } - /* Open loopback adapter */ - Status = LoopRegisterAdapter(NULL, NULL); - if (!NT_SUCCESS(Status)) { - TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status)); - TCPShutdown(); - UDPShutdown(); - RawIPShutdown(); - IPShutdown(); - ChewShutdown(); - IoDeleteDevice(IPDeviceObject); - IoDeleteDevice(RawIPDeviceObject); - IoDeleteDevice(UDPDeviceObject); - IoDeleteDevice(TCPDeviceObject); - exFreePool(EntityList); - NdisFreePacketPool(GlobalPacketPool); - NdisFreeBufferPool(GlobalBufferPool); - LANUnregisterProtocol(); - return Status; - } - - /* Use direct I/O */ - IPDeviceObject->Flags |= DO_DIRECT_IO; - RawIPDeviceObject->Flags |= DO_DIRECT_IO; - UDPDeviceObject->Flags |= DO_DIRECT_IO; - TCPDeviceObject->Flags |= DO_DIRECT_IO; - - /* Initialize the driver object with this driver's entry points */ - DriverObject->MajorFunction[IRP_MJ_CREATE] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLEANUP] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = TiDispatchInternal; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TiDispatch; - - DriverObject->DriverUnload = TiUnload; - - /* Initialize our periodic timer and its associated DPC object. When the - timer expires, the IPTimeout deferred procedure call (DPC) is queued */ - ExInitializeWorkItem( &IpWorkItem, IPTimeout, NULL ); - KeInitializeDpc(&IPTimeoutDpc, IPTimeoutDpcFn, NULL); - KeInitializeTimer(&IPTimer); - - /* Start the periodic timer with an initial and periodic - relative expiration time of IP_TIMEOUT milliseconds */ - DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000; - KeSetTimerEx(&IPTimer, DueTime, IP_TIMEOUT, &IPTimeoutDpc); - return STATUS_SUCCESS; } From 5477d3c2ff024d5dfbc6d95ec963b7793bd70fa4 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 6 Jul 2009 07:54:28 +0000 Subject: [PATCH 243/577] - Fix return value of tdiGetMibForIfEntity so it doesn't return a failure status on success svn path=/trunk/; revision=41783 --- reactos/dll/win32/iphlpapi/ifenum_reactos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/iphlpapi/ifenum_reactos.c b/reactos/dll/win32/iphlpapi/ifenum_reactos.c index 5a10caab17c..a37d5e0d03d 100644 --- a/reactos/dll/win32/iphlpapi/ifenum_reactos.c +++ b/reactos/dll/win32/iphlpapi/ifenum_reactos.c @@ -280,7 +280,7 @@ NTSTATUS tdiGetMibForIfEntity entry->ent.if_descr); TRACE("} status %08x\n",status); - return status; + return STATUS_SUCCESS; } NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, From 797cea831c051f8a0fe04454aa188a78153f2a87 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 6 Jul 2009 16:22:11 +0000 Subject: [PATCH 244/577] - Update NtGdiOpenDCW to the newest sdk. svn path=/trunk/; revision=41784 --- reactos/dll/win32/gdi32/objects/dc.c | 1 + reactos/include/psdk/ntgdi.h | 1 + reactos/subsystems/win32/win32k/objects/dclife.c | 1 + reactos/subsystems/win32/win32k/w32ksvc.db | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index ff3be454e46..20f63471b5e 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -64,6 +64,7 @@ IntCreateDICW ( LPCWSTR lpwszDriver, (PDEVMODEW) lpInitData, (lpwszOutput ? &Output : NULL), iType, // DCW 0 and ICW 1. + Display, hspool, (PVOID) NULL, // NULL for now. (PVOID) &UMdhpdev ); diff --git a/reactos/include/psdk/ntgdi.h b/reactos/include/psdk/ntgdi.h index a27339ee806..e8050217a23 100644 --- a/reactos/include/psdk/ntgdi.h +++ b/reactos/include/psdk/ntgdi.h @@ -2085,6 +2085,7 @@ NtGdiOpenDCW( IN DEVMODEW *pdm, // See note for NtGdiResetDC IN PUNICODE_STRING pustrLogAddr, IN ULONG iType, + IN BOOL bDisplay, IN OPTIONAL HANDLE hspool, IN OPTIONAL VOID *pDriverInfo2, // this is "typedef struct _DRIVER_INFO_2W DRIVER_INFO_2W;" OUT VOID *pUMdhpdev diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index e7805ba9c56..97d86561c94 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -358,6 +358,7 @@ NtGdiOpenDCW( DEVMODEW *InitData, PUNICODE_STRING pustrLogAddr, ULONG iType, + BOOL bDisplay, HANDLE hspool, VOID *pDriverInfo2, VOID *pUMdhpdev) diff --git a/reactos/subsystems/win32/win32k/w32ksvc.db b/reactos/subsystems/win32/win32k/w32ksvc.db index 4645c9c0aaa..76a8450d4e0 100644 --- a/reactos/subsystems/win32/win32k/w32ksvc.db +++ b/reactos/subsystems/win32/win32k/w32ksvc.db @@ -235,7 +235,7 @@ NtGdiMonoBitmap 1 NtGdiMoveTo 4 NtGdiOffsetClipRgn 3 NtGdiOffsetRgn 3 -NtGdiOpenDCW 7 +NtGdiOpenDCW 8 NtGdiPatBlt 6 NtGdiPolyPatBlt 5 NtGdiPathToRegion 1 From 57aa46671d000c14769a025857fd2793b1ed3993 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 6 Jul 2009 16:24:00 +0000 Subject: [PATCH 245/577] - Update apitests. svn path=/trunk/; revision=41785 --- rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def b/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def index ec3c7cc0805..6d3634bab66 100644 --- a/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def +++ b/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def @@ -241,7 +241,7 @@ NtGdiMonoBitmap@4 NtGdiMoveTo@16 NtGdiOffsetClipRgn@12 NtGdiOffsetRgn@12 -NtGdiOpenDCW@28 +NtGdiOpenDCW@32 NtGdiPatBlt@24 NtGdiPolyPatBlt@20 NtGdiPathToRegion@4 From 4ff21182dd080e1d94925a5da8b850353467b61d Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Mon, 6 Jul 2009 18:19:05 +0000 Subject: [PATCH 246/577] Reverting incomplete commit r41782 on request of the author svn path=/trunk/; revision=41786 --- reactos/drivers/network/tcpip/tcpip/main.c | 91 +++++++++++----------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/reactos/drivers/network/tcpip/tcpip/main.c b/reactos/drivers/network/tcpip/tcpip/main.c index e92bcd9351e..fae68ad89f3 100644 --- a/reactos/drivers/network/tcpip/tcpip/main.c +++ b/reactos/drivers/network/tcpip/tcpip/main.c @@ -885,51 +885,6 @@ DriverEntry( return Status; } - /* Use direct I/O */ - IPDeviceObject->Flags |= DO_DIRECT_IO; - RawIPDeviceObject->Flags |= DO_DIRECT_IO; - UDPDeviceObject->Flags |= DO_DIRECT_IO; - TCPDeviceObject->Flags |= DO_DIRECT_IO; - - /* Initialize the driver object with this driver's entry points */ - DriverObject->MajorFunction[IRP_MJ_CREATE] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLEANUP] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = TiDispatchInternal; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TiDispatch; - - DriverObject->DriverUnload = TiUnload; - - /* Initialize our periodic timer and its associated DPC object. When the - timer expires, the IPTimeout deferred procedure call (DPC) is queued */ - ExInitializeWorkItem( &IpWorkItem, IPTimeout, NULL ); - KeInitializeDpc(&IPTimeoutDpc, IPTimeoutDpcFn, NULL); - KeInitializeTimer(&IPTimer); - - /* Start the periodic timer with an initial and periodic - relative expiration time of IP_TIMEOUT milliseconds */ - DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000; - KeSetTimerEx(&IPTimer, DueTime, IP_TIMEOUT, &IPTimeoutDpc); - - /* Open loopback adapter */ - Status = LoopRegisterAdapter(NULL, NULL); - if (!NT_SUCCESS(Status)) { - TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status)); - TCPShutdown(); - UDPShutdown(); - RawIPShutdown(); - IPShutdown(); - ChewShutdown(); - IoDeleteDevice(IPDeviceObject); - IoDeleteDevice(RawIPDeviceObject); - IoDeleteDevice(UDPDeviceObject); - IoDeleteDevice(TCPDeviceObject); - exFreePool(EntityList); - NdisFreePacketPool(GlobalPacketPool); - NdisFreeBufferPool(GlobalBufferPool); - return Status; - } - /* Register protocol with NDIS */ /* This used to be IP_DEVICE_NAME but the DDK says it has to match your entry in the SCM */ Status = LANRegisterProtocol(&strNdisDeviceName); @@ -958,6 +913,52 @@ DriverEntry( return Status; } + /* Open loopback adapter */ + Status = LoopRegisterAdapter(NULL, NULL); + if (!NT_SUCCESS(Status)) { + TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status)); + TCPShutdown(); + UDPShutdown(); + RawIPShutdown(); + IPShutdown(); + ChewShutdown(); + IoDeleteDevice(IPDeviceObject); + IoDeleteDevice(RawIPDeviceObject); + IoDeleteDevice(UDPDeviceObject); + IoDeleteDevice(TCPDeviceObject); + exFreePool(EntityList); + NdisFreePacketPool(GlobalPacketPool); + NdisFreeBufferPool(GlobalBufferPool); + LANUnregisterProtocol(); + return Status; + } + + /* Use direct I/O */ + IPDeviceObject->Flags |= DO_DIRECT_IO; + RawIPDeviceObject->Flags |= DO_DIRECT_IO; + UDPDeviceObject->Flags |= DO_DIRECT_IO; + TCPDeviceObject->Flags |= DO_DIRECT_IO; + + /* Initialize the driver object with this driver's entry points */ + DriverObject->MajorFunction[IRP_MJ_CREATE] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = TiDispatchInternal; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TiDispatch; + + DriverObject->DriverUnload = TiUnload; + + /* Initialize our periodic timer and its associated DPC object. When the + timer expires, the IPTimeout deferred procedure call (DPC) is queued */ + ExInitializeWorkItem( &IpWorkItem, IPTimeout, NULL ); + KeInitializeDpc(&IPTimeoutDpc, IPTimeoutDpcFn, NULL); + KeInitializeTimer(&IPTimer); + + /* Start the periodic timer with an initial and periodic + relative expiration time of IP_TIMEOUT milliseconds */ + DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000; + KeSetTimerEx(&IPTimer, DueTime, IP_TIMEOUT, &IPTimeoutDpc); + return STATUS_SUCCESS; } From e3a50e4fbbe49a76b35a3a2e570eb937622b0086 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 6 Jul 2009 18:26:57 +0000 Subject: [PATCH 247/577] Fix compilation with latest GCC. svn path=/trunk/; revision=41787 --- reactos/boot/freeldr/freeldr/windows/wlmemory.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/wlmemory.c index c3650349452..2de36ab08e2 100644 --- a/reactos/boot/freeldr/freeldr/windows/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/wlmemory.c @@ -922,8 +922,8 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG Pcr, IN ULONG Tss) Ke386SetInterruptDescriptorTable(IdtDesc); // Jump to proper CS and clear prefetch queue - asm("ljmp $0x08, $mb1\n" - "mb1:\n"); + asm("ljmp $0x08, $1f\n" + "1:\n"); // Set SS selector asm(".intel_syntax noprefix\n"); From b045cc3db590eed5e40940416b981c09dd911648 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Mon, 6 Jul 2009 18:28:11 +0000 Subject: [PATCH 248/577] "Fix" MDL PROBE FAILED! bug #4663. svn path=/trunk/; revision=41788 --- reactos/ntoskrnl/mm/ARM3/mdlsup.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index 3bc121cd77b..8cee23c7d36 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -679,6 +679,7 @@ MmProbeAndLockPages(IN PMDL Mdl, // Oops :( // ProbeStatus = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; From 9e489f0c75b29a10d09d55bffa163803d7109081 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 6 Jul 2009 20:56:17 +0000 Subject: [PATCH 249/577] - Update UpdateLayeredWindow and Indirect. svn path=/trunk/; revision=41789 --- reactos/dll/win32/user32/windows/message.c | 2 +- reactos/dll/win32/user32/windows/window.c | 47 +++++++++++++++++-- reactos/include/reactos/win32k/ntuser.h | 3 +- .../subsystems/win32/win32k/ntuser/window.c | 3 +- reactos/subsystems/win32/win32k/w32ksvc.db | 2 +- 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index c5fe9859f4a..6e0294c70c1 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -1654,7 +1654,7 @@ PostMessageWorker( { return FALSE; } - Result = NtUserPostMessage( KMMsg.hwnd, + Result = NtUserPostMessage( Wnd, KMMsg.message, KMMsg.wParam, KMMsg.lParam); diff --git a/reactos/dll/win32/user32/windows/window.c b/reactos/dll/win32/user32/windows/window.c index b643c2501bb..bd3158da685 100644 --- a/reactos/dll/win32/user32/windows/window.c +++ b/reactos/dll/win32/user32/windows/window.c @@ -1608,14 +1608,55 @@ ShowOwnedPopups(HWND hWnd, /* - * @unimplemented + * @implemented + */ +BOOL WINAPI +UpdateLayeredWindow( HWND hwnd, + HDC hdcDst, + POINT *pptDst, + SIZE *psize, + HDC hdcSrc, + POINT *pptSrc, + COLORREF crKey, + BLENDFUNCTION *pbl, + DWORD dwFlags) +{ + if ( dwFlags & ULW_EX_NORESIZE) + dwFlags = ~(ULW_EX_NORESIZE|ULW_OPAQUE|ULW_ALPHA|ULW_COLORKEY); + return NtUserUpdateLayeredWindow( hwnd, + hdcDst, + pptDst, + psize, + hdcSrc, + pptSrc, + crKey, + pbl, + dwFlags, + NULL); +} + +/* + * @implemented */ BOOL WINAPI UpdateLayeredWindowIndirect(HWND hwnd, const UPDATELAYEREDWINDOWINFO *info) { - UNIMPLEMENTED; - return FALSE; + if (info && info->cbSize == sizeof(info)) + { + return NtUserUpdateLayeredWindow( hwnd, + info->hdcDst, + (POINT *)info->pptDst, + (SIZE *)info->psize, + info->hdcSrc, + (POINT *)info->pptSrc, + info->crKey, + (BLENDFUNCTION *)info->pblend, + info->dwFlags, + (RECT *)info->prcDirty); + } + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; } diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 66455270786..8db559c09d8 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -2744,7 +2744,8 @@ NtUserUpdateLayeredWindow( POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend, - DWORD dwFlags); + DWORD dwFlags, + RECT *prcDirty); BOOL NTAPI diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index cd859f818c1..1f3b6556d64 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -4653,7 +4653,8 @@ NtUserUpdateLayeredWindow( POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend, - DWORD dwFlags) + DWORD dwFlags, + RECT *prcDirty) { UNIMPLEMENTED diff --git a/reactos/subsystems/win32/win32k/w32ksvc.db b/reactos/subsystems/win32/win32k/w32ksvc.db index 76a8450d4e0..c2b76fc123b 100644 --- a/reactos/subsystems/win32/win32k/w32ksvc.db +++ b/reactos/subsystems/win32/win32k/w32ksvc.db @@ -583,7 +583,7 @@ NtUserUnregisterUserApiHook 0 NtUserUnregisterHotKey 2 NtUserUpdateInputContext 3 NtUserUpdateInstance 3 -NtUserUpdateLayeredWindow 9 +NtUserUpdateLayeredWindow 10 NtUserGetLayeredWindowAttributes 4 NtUserSetLayeredWindowAttributes 4 NtUserUpdatePerUserSystemParameters 2 From 49042185f80d9fab8925f20791ec5dd6fdbc9144 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 6 Jul 2009 20:56:48 +0000 Subject: [PATCH 250/577] - fix build. svn path=/trunk/; revision=41790 --- reactos/dll/win32/user32/user32.pspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/user32/user32.pspec b/reactos/dll/win32/user32/user32.pspec index 9e5fb22caa5..4189aad0417 100644 --- a/reactos/dll/win32/user32/user32.pspec +++ b/reactos/dll/win32/user32/user32.pspec @@ -712,8 +712,8 @@ @ stdcall UnregisterHotKey(long long) NtUserUnregisterHotKey @ stub UnregisterMessagePumpHook @ stub UnregisterUserApiHook -@ stdcall UpdateLayeredWindow(long long ptr ptr long ptr long ptr long) NtUserUpdateLayeredWindow -@ stub UpdateLayeredWindowIndirect +@ stdcall UpdateLayeredWindow(long long ptr ptr long ptr long ptr long) +@ stdcall UpdateLayeredWindowIndirect(long ptr) @ stdcall UpdatePerUserSystemParameters(long long) @ stdcall UpdateWindow(long) @ stdcall User32InitializeImmEntryTable(ptr) From a4009f2c99b047691986c7259bb3d053b81f6fcb Mon Sep 17 00:00:00 2001 From: James Tabor Date: Mon, 6 Jul 2009 20:57:23 +0000 Subject: [PATCH 251/577] - Update apptest. svn path=/trunk/; revision=41791 --- rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def b/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def index 6d3634bab66..bcb96025bea 100644 --- a/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def +++ b/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.def @@ -587,7 +587,7 @@ NtUserUnregisterUserApiHook@0 NtUserUnregisterHotKey@8 NtUserUpdateInputContext@12 NtUserUpdateInstance@12 -NtUserUpdateLayeredWindow@36 +NtUserUpdateLayeredWindow@40 NtUserGetLayeredWindowAttributes@16 NtUserSetLayeredWindowAttributes@16 NtUserUpdatePerUserSystemParameters@8 From 1ab79b4fa339f442ef8cd20d1397fafaccfeb9e4 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Mon, 6 Jul 2009 23:35:59 +0000 Subject: [PATCH 252/577] - Remove a deprecated check from MmpAccessFault -- PsGetCurrentProcess doesn't return NULL since revision 24148. svn path=/trunk/; revision=41792 --- reactos/ntoskrnl/mm/mmfault.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/reactos/ntoskrnl/mm/mmfault.c b/reactos/ntoskrnl/mm/mmfault.c index e0a9c677a7e..490e77c314c 100644 --- a/reactos/ntoskrnl/mm/mmfault.c +++ b/reactos/ntoskrnl/mm/mmfault.c @@ -63,11 +63,6 @@ MmpAccessFault(KPROCESSOR_MODE Mode, DPRINT1("Page fault at high IRQL was %d\n", KeGetCurrentIrql()); return(STATUS_UNSUCCESSFUL); } - if (PsGetCurrentProcess() == NULL) - { - DPRINT("No current process\n"); - return(STATUS_UNSUCCESSFUL); - } /* * Find the memory area for the faulting address From 775000286f549c9c07f7928aef6f26f0f1ef9cea Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 7 Jul 2009 00:06:54 +0000 Subject: [PATCH 253/577] - Check window is still alive. svn path=/trunk/; revision=41793 --- reactos/subsystems/win32/win32k/ntuser/winpos.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index ba19166ed19..cca1c449b5e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -895,6 +895,8 @@ co_WinPosSetWindowPos( ASSERT_REFS_CO(Window); + if (!Window->Wnd) return FALSE; + /* FIXME: Get current active window from active queue. */ /* From 94b14962cf8c244daab6f34e038509c9306c7e13 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 7 Jul 2009 03:23:27 +0000 Subject: [PATCH 254/577] - Hit another one. Check window is still alive. svn path=/trunk/; revision=41794 --- reactos/subsystems/win32/win32k/ntuser/window.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 1f3b6556d64..2097013a688 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -190,6 +190,8 @@ IntIsWindow(HWND hWnd) PWINDOW_OBJECT FASTCALL IntGetParent(PWINDOW_OBJECT Wnd) { + if (!Wnd->Wnd) return NULL; + if (Wnd->Wnd->Style & WS_POPUP) { return UserGetWindowObject(Wnd->hOwner); From fc4ea7b821a8614369955ad6c86c5af92def9b82 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 7 Jul 2009 04:40:54 +0000 Subject: [PATCH 255/577] - Set Size to the size of the buffer we allocated (it previously had stack garbage in it which prevented proper buffer sizing) - Fixes a buffer overwrite - Multiple NIC support is here! (DHCP currently doesn't work for multiple NICs so a static IP address is needed for now) svn path=/trunk/; revision=41795 --- reactos/base/services/dhcp/adapter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/services/dhcp/adapter.c b/reactos/base/services/dhcp/adapter.c index 4eca48b4295..329abaa5b0e 100644 --- a/reactos/base/services/dhcp/adapter.c +++ b/reactos/base/services/dhcp/adapter.c @@ -212,7 +212,7 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) { void AdapterInit() { PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE)); - DWORD Error, Size, i; + DWORD Error, Size = sizeof(MIB_IFTABLE), i; PDHCP_ADAPTER Adapter = NULL; struct interface_info *ifi = NULL; From bfee1bad6438d77b9928cc5d447c8c80c4055458 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 7 Jul 2009 04:47:48 +0000 Subject: [PATCH 256/577] - Remove a bad ASSERT - TCPPacketSendComplete isn't called from oskittcp svn path=/trunk/; revision=41796 --- reactos/lib/drivers/ip/transport/tcp/event.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c index 8b8a6be6475..bd67997dc14 100644 --- a/reactos/lib/drivers/ip/transport/tcp/event.c +++ b/reactos/lib/drivers/ip/transport/tcp/event.c @@ -54,8 +54,6 @@ void TCPPacketSendComplete( PVOID Context, PNDIS_PACKET NdisPacket, NDIS_STATUS NdisStatus ) { TI_DbgPrint(DEBUG_TCP,("called %x\n", NdisPacket)); - ASSERT_LOCKED(&TCPLock); - FreeNdisPacket(NdisPacket); TI_DbgPrint(DEBUG_TCP,("done\n")); } From 4837e387d00af7b13326ef33da95e2117e1cbc77 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 7 Jul 2009 05:29:37 +0000 Subject: [PATCH 257/577] - Recommit r41782 now that DHCP is ready for the fix - Start the indexes at 0 (Software loopback will take index 0) svn path=/trunk/; revision=41797 --- reactos/drivers/network/tcpip/tcpip/main.c | 91 +++++++++++----------- reactos/lib/drivers/ip/network/ip.c | 2 +- 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/reactos/drivers/network/tcpip/tcpip/main.c b/reactos/drivers/network/tcpip/tcpip/main.c index fae68ad89f3..e92bcd9351e 100644 --- a/reactos/drivers/network/tcpip/tcpip/main.c +++ b/reactos/drivers/network/tcpip/tcpip/main.c @@ -885,6 +885,51 @@ DriverEntry( return Status; } + /* Use direct I/O */ + IPDeviceObject->Flags |= DO_DIRECT_IO; + RawIPDeviceObject->Flags |= DO_DIRECT_IO; + UDPDeviceObject->Flags |= DO_DIRECT_IO; + TCPDeviceObject->Flags |= DO_DIRECT_IO; + + /* Initialize the driver object with this driver's entry points */ + DriverObject->MajorFunction[IRP_MJ_CREATE] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = TiDispatchInternal; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TiDispatch; + + DriverObject->DriverUnload = TiUnload; + + /* Initialize our periodic timer and its associated DPC object. When the + timer expires, the IPTimeout deferred procedure call (DPC) is queued */ + ExInitializeWorkItem( &IpWorkItem, IPTimeout, NULL ); + KeInitializeDpc(&IPTimeoutDpc, IPTimeoutDpcFn, NULL); + KeInitializeTimer(&IPTimer); + + /* Start the periodic timer with an initial and periodic + relative expiration time of IP_TIMEOUT milliseconds */ + DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000; + KeSetTimerEx(&IPTimer, DueTime, IP_TIMEOUT, &IPTimeoutDpc); + + /* Open loopback adapter */ + Status = LoopRegisterAdapter(NULL, NULL); + if (!NT_SUCCESS(Status)) { + TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status)); + TCPShutdown(); + UDPShutdown(); + RawIPShutdown(); + IPShutdown(); + ChewShutdown(); + IoDeleteDevice(IPDeviceObject); + IoDeleteDevice(RawIPDeviceObject); + IoDeleteDevice(UDPDeviceObject); + IoDeleteDevice(TCPDeviceObject); + exFreePool(EntityList); + NdisFreePacketPool(GlobalPacketPool); + NdisFreeBufferPool(GlobalBufferPool); + return Status; + } + /* Register protocol with NDIS */ /* This used to be IP_DEVICE_NAME but the DDK says it has to match your entry in the SCM */ Status = LANRegisterProtocol(&strNdisDeviceName); @@ -913,52 +958,6 @@ DriverEntry( return Status; } - /* Open loopback adapter */ - Status = LoopRegisterAdapter(NULL, NULL); - if (!NT_SUCCESS(Status)) { - TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status)); - TCPShutdown(); - UDPShutdown(); - RawIPShutdown(); - IPShutdown(); - ChewShutdown(); - IoDeleteDevice(IPDeviceObject); - IoDeleteDevice(RawIPDeviceObject); - IoDeleteDevice(UDPDeviceObject); - IoDeleteDevice(TCPDeviceObject); - exFreePool(EntityList); - NdisFreePacketPool(GlobalPacketPool); - NdisFreeBufferPool(GlobalBufferPool); - LANUnregisterProtocol(); - return Status; - } - - /* Use direct I/O */ - IPDeviceObject->Flags |= DO_DIRECT_IO; - RawIPDeviceObject->Flags |= DO_DIRECT_IO; - UDPDeviceObject->Flags |= DO_DIRECT_IO; - TCPDeviceObject->Flags |= DO_DIRECT_IO; - - /* Initialize the driver object with this driver's entry points */ - DriverObject->MajorFunction[IRP_MJ_CREATE] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLEANUP] = TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = TiDispatchInternal; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TiDispatch; - - DriverObject->DriverUnload = TiUnload; - - /* Initialize our periodic timer and its associated DPC object. When the - timer expires, the IPTimeout deferred procedure call (DPC) is queued */ - ExInitializeWorkItem( &IpWorkItem, IPTimeout, NULL ); - KeInitializeDpc(&IPTimeoutDpc, IPTimeoutDpcFn, NULL); - KeInitializeTimer(&IPTimer); - - /* Start the periodic timer with an initial and periodic - relative expiration time of IP_TIMEOUT milliseconds */ - DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000; - KeSetTimerEx(&IPTimer, DueTime, IP_TIMEOUT, &IPTimeoutDpc); - return STATUS_SUCCESS; } diff --git a/reactos/lib/drivers/ip/network/ip.c b/reactos/lib/drivers/ip/network/ip.c index ae930975bb5..2046e35be77 100644 --- a/reactos/lib/drivers/ip/network/ip.c +++ b/reactos/lib/drivers/ip/network/ip.c @@ -242,7 +242,7 @@ BOOLEAN IPRegisterInterface( */ { KIRQL OldIrql; - UINT ChosenIndex = 1; + UINT ChosenIndex = 0; BOOLEAN IndexHasBeenChosen; IF_LIST_ITER(Interface); From 552a269ce80d178c530ef48cab221664accb9a28 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 7 Jul 2009 16:19:23 +0000 Subject: [PATCH 258/577] - Add another Vista function WindowFromPhysicalPoint to user32. svn path=/trunk/; revision=41798 --- reactos/dll/win32/user32/user32.pspec | 1 + reactos/include/psdk/winuser.h | 3 +++ reactos/include/reactos/win32k/ntuser.h | 5 +++++ reactos/subsystems/win32/win32k/ntuser/window.c | 10 ++++++++++ reactos/subsystems/win32/win32k/w32ksvc.db | 1 + 5 files changed, 20 insertions(+) diff --git a/reactos/dll/win32/user32/user32.pspec b/reactos/dll/win32/user32/user32.pspec index 4189aad0417..2b6da356ed9 100644 --- a/reactos/dll/win32/user32/user32.pspec +++ b/reactos/dll/win32/user32/user32.pspec @@ -740,6 +740,7 @@ @ stdcall WinHelpW(long wstr long long) @ stdcall WindowFromDC(long) @ stdcall WindowFromPoint(double) +@ stdcall WindowFromPhysicalPoint(double) NtUserWindowFromPhysicalPoint @ stdcall keybd_event(long long long long) @ stdcall mouse_event(long long long long long) @ varargs wsprintfA(str str) diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index 55d5197cf49..e24fdbda29a 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -4447,6 +4447,9 @@ SHORT WINAPI VkKeyScanW(WCHAR); DWORD WINAPI WaitForInputIdle(HANDLE,DWORD); BOOL WINAPI WaitMessage(void); HWND WINAPI WindowFromDC(HDC hDC); +#if (_WIN32_WINNT >= 0x0600) +HWND WINAPI WindowFromPhysicalPoint(POINT); +#endif HWND WINAPI WindowFromPoint(POINT); UINT WINAPI WinExec(LPCSTR,UINT); BOOL WINAPI WinHelpA(HWND,LPCSTR,UINT,ULONG_PTR); diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 8db559c09d8..9bb69f464aa 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -2812,6 +2812,11 @@ NtUserWin32PoolAllocationStats( DWORD Unknown4, DWORD Unknown5); +HWND +NTAPI +NtUserWindowFromPhysicalPoint( + POINT Point); + HWND NTAPI NtUserWindowFromPoint( diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 2097013a688..105a988084f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -4663,6 +4663,16 @@ NtUserUpdateLayeredWindow( return 0; } +/* + * @unimplemented + */ +HWND APIENTRY +NtUserWindowFromPhysicalPoint(POINT Point) +{ + UNIMPLEMENTED + + return NULL; +} /* * @implemented diff --git a/reactos/subsystems/win32/win32k/w32ksvc.db b/reactos/subsystems/win32/win32k/w32ksvc.db index c2b76fc123b..7ffc925bb03 100644 --- a/reactos/subsystems/win32/win32k/w32ksvc.db +++ b/reactos/subsystems/win32/win32k/w32ksvc.db @@ -596,6 +596,7 @@ NtUserWaitForInputIdle 3 NtUserWaitForMsgAndEvent 1 NtUserWaitMessage 0 NtUserWin32PoolAllocationStats 6 +NtUserWindowFromPhysicalPoint 2 NtUserWindowFromPoint 2 NtUserYieldTask 0 NtUserRemoteConnect 3 From e80cf32fd5a51e01b158f71c7edbbeedaf4d74bf Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Tue, 7 Jul 2009 16:19:34 +0000 Subject: [PATCH 259/577] Geoffroy Couprie : - Fix a printf case, where the exponent is zero - Implement exponent increment/decrement for printf in scientific notation My changes : - Change some lessequal/greaterequal to equal - Exchange OR with AND operation - Modify patch identation to match current code, remove FIXME - Skipped the ecvt part of the patch (not needed, sprint has the bugs) - Fixes five msvcrt printf winetests, see bug #4584 for more information svn path=/trunk/; revision=41799 --- reactos/lib/sdk/crt/stdio/lnx_sprintf.c | 35 ++++++++++++++++++------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/reactos/lib/sdk/crt/stdio/lnx_sprintf.c b/reactos/lib/sdk/crt/stdio/lnx_sprintf.c index 82465b24e9b..79daca4e7ea 100644 --- a/reactos/lib/sdk/crt/stdio/lnx_sprintf.c +++ b/reactos/lib/sdk/crt/stdio/lnx_sprintf.c @@ -168,7 +168,7 @@ numberf(char * buf, char * end, double num, char exp_sign, int size, int precisi int ro = 0; int isize; - double frac, intr; + double num2, frac, intr; double p; char c, sign, digits[66]; @@ -185,7 +185,12 @@ numberf(char * buf, char * end, double num, char exp_sign, int size, int precisi if ( exp_sign == 'g' || exp_sign == 'G' || exp_sign == 'e' || exp_sign == 'E' ) { ie = ((unsigned int)n.n->exponent - (unsigned int)0x3ff); - exponent = ie/3.321928; + if (*n.__n == 0.0) + exponent = 0.0; + else + { + exponent = ie/3.321928; + } } if ( exp_sign == 'g' || exp_sign == 'G' ) @@ -201,17 +206,27 @@ numberf(char * buf, char * end, double num, char exp_sign, int size, int precisi if ( exp_sign == 'e' || exp_sign == 'E' ) { frac = modf(exponent,&e); - /* FIXME: this exponent over-/underflow scheme doesn't comply with the wanted behaviour - * needed at all or completely different in original? */ -#if 0 - if ( frac > 0.5 ) - e++; - else if ( frac < -0.5 ) + if (num < 0.0) e--; -#endif + if (frac >= 0.5) + e++; + else if (frac < -0.5) + e--; + + num2 = num/pow(10.0L,(long double)e); + if (num2 < 1.0 && num2 > -1.0) + { + e--; + num2 = num/pow(10.0L,(long double)e); + } + else if (num2 < -10.0 && num2 > 10.0) + { + e++; + num2 = num/pow(10.0L,(long double)e); + } /* size-5 because "e+abc" is going to follow */ - buf = numberf(buf, end, num/pow(10.0L,(long double)e), 'f', size-5, precision, type); + buf = numberf(buf, end, num2, 'f', size-5, precision, type); isize = 4; while(*(buf-1) == ' ') { From 453d1d907700a58e1b8024af7114e17a60e430b3 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Tue, 7 Jul 2009 16:58:36 +0000 Subject: [PATCH 260/577] AlphaBlend: - Return immediately if any bitmap size is smaller than zero - Also check calculated input bitmap size against source size - Remove outdated FIXME - Fixes three gdi32 bitmap winetests svn path=/trunk/; revision=41800 --- reactos/subsystems/win32/win32k/eng/alphablend.c | 9 +++------ reactos/subsystems/win32/win32k/objects/bitblt.c | 6 ++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/alphablend.c b/reactos/subsystems/win32/win32k/eng/alphablend.c index 7ccab538e12..30ba88fd386 100644 --- a/reactos/subsystems/win32/win32k/eng/alphablend.c +++ b/reactos/subsystems/win32/win32k/eng/alphablend.c @@ -54,7 +54,6 @@ EngAlphaBlend(IN SURFOBJ *psoDest, BlendObj->BlendFunction.BlendFlags, BlendObj->BlendFunction.SourceConstantAlpha, BlendObj->BlendFunction.AlphaFormat); - /* Validate output */ OutputRect = *DestRect; if (OutputRect.right < OutputRect.left) @@ -68,14 +67,12 @@ EngAlphaBlend(IN SURFOBJ *psoDest, OutputRect.right = DestRect->left; } - /* Validate input */ - - /* FIXME when WindowOrg.x or .y are negitve this check are not vaild, - * we need convert the inputRect to the windows org and do it right */ InputRect = *SourceRect; if ( (InputRect.top < 0) || (InputRect.bottom < 0) || - (InputRect.left < 0) || (InputRect.right < 0) ) + (InputRect.left < 0) || (InputRect.right < 0) || + InputRect.right > psoSource->sizlBitmap.cx || + InputRect.bottom > psoSource->sizlBitmap.cy ) { SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index fe5d994efa0..29159a35d6e 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -49,6 +49,12 @@ NtGdiAlphaBlend( BLENDOBJ BlendObj; BlendObj.BlendFunction = BlendFunc; + if (WidthDest < 0 || HeightDest < 0 || WidthSrc < 0 || HeightSrc < 0) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + DCDest = DC_LockDc(hDCDest); if (NULL == DCDest) { From 1aef6c7fa4b18d2000263cedeafbfb232d26c28d Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 8 Jul 2009 00:48:05 +0000 Subject: [PATCH 261/577] Reverting part of r40006 that introduced a regression (Arch Blackmann HAS been committing to mingw-w64). A real fix, if this is hiding a bug elsewhere, will have to wait until a proper vendor drop of mingw-w64 svn path=/trunk/; revision=41801 --- reactos/lib/3rdparty/mingw/crtexe.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/lib/3rdparty/mingw/crtexe.c b/reactos/lib/3rdparty/mingw/crtexe.c index 23368b6c778..a3e613d7adc 100644 --- a/reactos/lib/3rdparty/mingw/crtexe.c +++ b/reactos/lib/3rdparty/mingw/crtexe.c @@ -88,7 +88,7 @@ static _startupinfo startinfo; extern void _pei386_runtime_relocator (void); static long CALLBACK _gnu_exception_handler (EXCEPTION_POINTERS * exception_data); -static LONG __mingw_vex(EXCEPTION_POINTERS * exception_data); +//static LONG __mingw_vex(EXCEPTION_POINTERS * exception_data); #ifdef WPRFLAG static void duplicate_ppstrings (int ac, wchar_t ***av); #else @@ -216,7 +216,7 @@ __tmainCRTStartup (void) #if defined(__i386__) || defined(_M_IX86) __writefsdword(0, 0xffffffff); #endif - AddVectoredExceptionHandler (0, (PVECTORED_EXCEPTION_HANDLER)__mingw_vex); + //AddVectoredExceptionHandler (0, (PVECTORED_EXCEPTION_HANDLER)__mingw_vex); SetUnhandledExceptionFilter (_gnu_exception_handler); _fpreset (); @@ -402,6 +402,7 @@ _gnu_exception_handler (EXCEPTION_POINTERS * exception_data) return action; } +#if 0 static LONG __mingw_vex(EXCEPTION_POINTERS * exception_data) { /* TODO this is not chainablem, therefore need rewrite. Disabled the ill code. */ @@ -426,6 +427,7 @@ static LONG __mingw_vex(EXCEPTION_POINTERS * exception_data) #endif return _gnu_exception_handler(exception_data); } +#endif #ifdef WPRFLAG From 43a5a4bdb570e7c8c7623aec4f147799285704d6 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 8 Jul 2009 07:02:33 +0000 Subject: [PATCH 262/577] - Remove an old hack (r14812) which limited ROS to use only one DNS server svn path=/trunk/; revision=41802 --- reactos/base/services/dhcp/dhclient.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/base/services/dhcp/dhclient.c b/reactos/base/services/dhcp/dhclient.c index 0a59701dba2..c92900d273a 100644 --- a/reactos/base/services/dhcp/dhclient.c +++ b/reactos/base/services/dhcp/dhclient.c @@ -462,8 +462,6 @@ void set_name_servers( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) { int i, addrs = new_lease->options[DHO_DOMAIN_NAME_SERVERS].len / sizeof(ULONG); - /* XXX I'm setting addrs to 1 until we are ready up the chain */ - addrs = 1; nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) ); if( nsbuf) { From 137c0f6dd530fd5e9f020ffee05b1e8a357daf07 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 8 Jul 2009 07:33:12 +0000 Subject: [PATCH 263/577] - Fix retrieval of the default gateway (missing default gateway in ipconfig) svn path=/trunk/; revision=41803 --- reactos/dll/win32/iphlpapi/iphlpapi_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/iphlpapi/iphlpapi_main.c b/reactos/dll/win32/iphlpapi/iphlpapi_main.c index 0e249f83f70..a908f492d0a 100644 --- a/reactos/dll/win32/iphlpapi/iphlpapi_main.c +++ b/reactos/dll/win32/iphlpapi/iphlpapi_main.c @@ -103,7 +103,7 @@ DWORD getInterfaceGatewayByIndex(DWORD index) for (ndx = 0; ndx < numRoutes; ndx++) { - if ((table->routes[ndx].ifIndex == (index - 1)) && (table->routes[ndx].dest == 0)) + if ((table->routes[ndx].ifIndex == (index)) && (table->routes[ndx].dest == 0)) retVal = table->routes[ndx].gateway; } HeapFree(GetProcessHeap(), 0, table); From 8d45a2401ac5136f9b7adcdd16211cdc56cd7a12 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 8 Jul 2009 14:33:25 +0000 Subject: [PATCH 264/577] Allow activating tasks svn path=/trunk/; revision=41805 --- reactos/base/shell/explorer-new/taskswnd.c | 101 ++++++++++++++++++--- 1 file changed, 90 insertions(+), 11 deletions(-) diff --git a/reactos/base/shell/explorer-new/taskswnd.c b/reactos/base/shell/explorer-new/taskswnd.c index e1e578d36b4..63fb9f34d14 100644 --- a/reactos/base/shell/explorer-new/taskswnd.c +++ b/reactos/base/shell/explorer-new/taskswnd.c @@ -1028,6 +1028,21 @@ TaskSwitchWnd_AddTask(IN OUT PTASK_SWITCH_WND This, return TaskItem != NULL; } +static BOOL +TaskSwitchWnd_ActivateTaskItem(IN OUT PTASK_SWITCH_WND This, + IN OUT PTASK_ITEM TaskItem) +{ + if (TaskItem != NULL) + { + DbgPrint("Activate window 0x%p on button %d\n", TaskItem->hWnd, TaskItem->Index); + } + + TaskSwitchWnd_CheckActivateTaskItem(This, + TaskItem); + + return FALSE; +} + static BOOL TaskSwitchWnd_ActivateTask(IN OUT PTASK_SWITCH_WND This, IN HWND hWnd) @@ -1041,20 +1056,14 @@ TaskSwitchWnd_ActivateTask(IN OUT PTASK_SWITCH_WND This, TaskItem = TaskSwitchWnd_FindOtherTaskItem(This, hWnd); } - - if (TaskItem != NULL) - { - DbgPrint("Activate window 0x%p on button %d\n", hWnd, TaskItem->Index); - } - else + + if (TaskItem == NULL) { DbgPrint("Activate window 0x%p, could not find task\n", hWnd); } - TaskSwitchWnd_CheckActivateTaskItem(This, - TaskItem); - - return FALSE; + return TaskSwitchWnd_ActivateTaskItem(This, + TaskItem); } static BOOL @@ -1634,6 +1643,75 @@ TaskSwitchWnd_EnableGrouping(IN OUT PTASK_SWITCH_WND This, FALSE); } +static VOID +TaskSwitchWnd_HandleTaskItemClick(IN OUT PTASK_SWITCH_WND This, + IN OUT PTASK_ITEM TaskItem) +{ + BOOL bMinimize; + + if (IsWindow(TaskItem->hWnd)) + { + bMinimize = !IsIconic(TaskItem->hWnd) && + TaskItem == This->ActiveTaskItem; + + if (!bMinimize && IsIconic(TaskItem->hWnd)) + { + PostMessage(TaskItem->hWnd, + WM_SYSCOMMAND, + SC_RESTORE, + 0); + } + + SetForegroundWindow(TaskItem->hWnd); + + if (bMinimize) + { + PostMessage(TaskItem->hWnd, + WM_SYSCOMMAND, + SC_MINIMIZE, + 0); + } + } +} + +static VOID +TaskSwitchWnd_HandleTaskGroupClick(IN OUT PTASK_SWITCH_WND This, + IN OUT PTASK_GROUP TaskGroup) +{ + /* TODO: Show task group menu */ +} + +static BOOL +TaskSwitchWnd_HandleButtonClick(IN OUT PTASK_SWITCH_WND This, + IN WORD wIndex) +{ + PTASK_ITEM TaskItem; + PTASK_GROUP TaskGroup; + + if (This->IsGroupingEnabled) + { + TaskGroup = FindTaskGroupByIndex(This, + (INT)wIndex); + if (TaskGroup != NULL && TaskGroup->IsCollapsed) + { + TaskSwitchWnd_HandleTaskGroupClick(This, + TaskGroup); + return TRUE; + } + } + + TaskItem = FindTaskItemByIndex(This, + (INT)wIndex); + if (TaskItem != NULL) + { + TaskSwitchWnd_HandleTaskItemClick(This, + TaskItem); + return TRUE; + } + + return FALSE; +} + static LRESULT TaskSwichWnd_HandleItemPaint(IN OUT PTASK_SWITCH_WND This, IN OUT NMTBCUSTOMDRAW *nmtbcd) @@ -1860,7 +1938,8 @@ TaskSwitchWndProc(IN HWND hwnd, { if (lParam != 0 && (HWND)lParam == This->hWndToolbar) { - DbgPrint("WM_COMMAND %u:%u (%u)\n", (UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (UINT)wParam); + TaskSwitchWnd_HandleButtonClick(This, + LOWORD(wParam)); } break; } From 3fc14e03317357b8fe62ca538a97c3d0c24201be Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Jul 2009 16:19:11 +0000 Subject: [PATCH 265/577] [FORMATTING] no code change svn path=/trunk/; revision=41806 --- .../subsystems/win32/win32k/objects/bitblt.c | 240 +++++++++--------- 1 file changed, 123 insertions(+), 117 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index 29159a35d6e..31ff102bade 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -27,18 +27,18 @@ BOOL APIENTRY NtGdiAlphaBlend( - HDC hDCDest, - LONG XOriginDest, - LONG YOriginDest, - LONG WidthDest, - LONG HeightDest, - HDC hDCSrc, - LONG XOriginSrc, - LONG YOriginSrc, - LONG WidthSrc, - LONG HeightSrc, - BLENDFUNCTION BlendFunc, - HANDLE hcmXform) + HDC hDCDest, + LONG XOriginDest, + LONG YOriginDest, + LONG WidthDest, + LONG HeightDest, + HDC hDCSrc, + LONG XOriginSrc, + LONG YOriginSrc, + LONG WidthSrc, + LONG HeightSrc, + BLENDFUNCTION BlendFunc, + HANDLE hcmXform) { PDC DCDest; PDC DCSrc; @@ -62,6 +62,7 @@ NtGdiAlphaBlend( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (DCDest->dctype == DC_TYPE_INFO) { DC_UnlockDc(DCDest); @@ -79,6 +80,7 @@ NtGdiAlphaBlend( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (DCSrc->dctype == DC_TYPE_INFO) { DC_UnlockDc(DCSrc); @@ -135,15 +137,13 @@ NtGdiAlphaBlend( return FALSE; } + BitmapSrc = DCSrc->dclevel.pSurface; + if (!BitmapSrc) { - BitmapSrc = DCSrc->dclevel.pSurface; - if (!BitmapSrc) - { - if (hDCSrc != hDCDest) - DC_UnlockDc(DCSrc); - DC_UnlockDc(DCDest); - return FALSE; - } + if (hDCSrc != hDCDest) + DC_UnlockDc(DCSrc); + DC_UnlockDc(DCDest); + return FALSE; } /* Create the XLATEOBJ. */ @@ -176,17 +176,17 @@ NtGdiAlphaBlend( BOOL APIENTRY NtGdiBitBlt( - HDC hDCDest, - INT XDest, - INT YDest, - INT Width, - INT Height, - HDC hDCSrc, - INT XSrc, - INT YSrc, - DWORD ROP, - IN DWORD crBackColor, - IN FLONG fl) + HDC hDCDest, + INT XDest, + INT YDest, + INT Width, + INT Height, + HDC hDCSrc, + INT XSrc, + INT YSrc, + DWORD ROP, + IN DWORD crBackColor, + IN FLONG fl) { PDC DCDest; PDC DCSrc = NULL; @@ -204,6 +204,7 @@ NtGdiBitBlt( DPRINT("Invalid destination dc handle (0x%08x) passed to NtGdiBitBlt\n", hDCDest); return FALSE; } + if (DCDest->dctype == DC_TYPE_INFO) { DC_UnlockDc(DCDest); @@ -319,17 +320,17 @@ cleanup: BOOL APIENTRY NtGdiTransparentBlt( - HDC hdcDst, - INT xDst, - INT yDst, - INT cxDst, - INT cyDst, - HDC hdcSrc, - INT xSrc, - INT ySrc, - INT cxSrc, - INT cySrc, - COLORREF TransColor) + HDC hdcDst, + INT xDst, + INT yDst, + INT cxDst, + INT cyDst, + HDC hdcSrc, + INT xSrc, + INT ySrc, + INT cxSrc, + INT cySrc, + COLORREF TransColor) { PDC DCDest, DCSrc; RECTL rcDest, rcSrc; @@ -361,10 +362,12 @@ NtGdiTransparentBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if(hdcDst == hdcSrc) { DCSrc = DCDest; } + if (DCSrc->dctype == DC_TYPE_INFO) { DC_UnlockDc(DCSrc); @@ -487,12 +490,20 @@ SwapROP3_SrcDst(BYTE bRop3) #define DSTERASE 0x00220326 /* dest = dest & (~src) : DSna */ BOOL APIENTRY -NtGdiMaskBlt ( - HDC hdcDest, INT nXDest, INT nYDest, - INT nWidth, INT nHeight, HDC hdcSrc, - INT nXSrc, INT nYSrc, HBITMAP hbmMask, - INT xMask, INT yMask, DWORD dwRop, - IN DWORD crBackColor) +NtGdiMaskBlt( + HDC hdcDest, + INT nXDest, + INT nYDest, + INT nWidth, + INT nHeight, + HDC hdcSrc, + INT nXSrc, + INT nYSrc, + HBITMAP hbmMask, + INT xMask, + INT yMask, + DWORD dwRop, + IN DWORD crBackColor) { HBITMAP hOldMaskBitmap, hBitmap2, hOldBitmap2, hBitmap3, hOldBitmap3; HDC hDCMask, hDC1, hDC2; @@ -682,17 +693,17 @@ NtGdiMaskBlt ( BOOL APIENTRY NtGdiPlgBlt( - IN HDC hdcTrg, - IN LPPOINT pptlTrg, - IN HDC hdcSrc, - IN INT xSrc, - IN INT ySrc, - IN INT cxSrc, - IN INT cySrc, - IN HBITMAP hbmMask, - IN INT xMask, - IN INT yMask, - IN DWORD crBackColor) + IN HDC hdcTrg, + IN LPPOINT pptlTrg, + IN HDC hdcSrc, + IN INT xSrc, + IN INT ySrc, + IN INT cxSrc, + IN INT cySrc, + IN HBITMAP hbmMask, + IN INT xMask, + IN INT yMask, + IN DWORD crBackColor) { UNIMPLEMENTED; return FALSE; @@ -700,19 +711,19 @@ NtGdiPlgBlt( BOOL APIENTRY GreStretchBltMask( - HDC hDCDest, - INT XOriginDest, - INT YOriginDest, - INT WidthDest, - INT HeightDest, - HDC hDCSrc, - INT XOriginSrc, - INT YOriginSrc, - INT WidthSrc, - INT HeightSrc, - DWORD ROP, - IN DWORD dwBackColor, - HDC hDCMask) + HDC hDCDest, + INT XOriginDest, + INT YOriginDest, + INT WidthDest, + INT HeightDest, + HDC hDCSrc, + INT XOriginSrc, + INT YOriginSrc, + INT WidthSrc, + INT HeightSrc, + DWORD ROP, + IN DWORD dwBackColor, + HDC hDCMask) { PDC DCDest; PDC DCSrc = NULL; @@ -732,6 +743,7 @@ GreStretchBltMask( SetLastWin32Error(ERROR_INVALID_PARAMETER); return FALSE; } + DCDest = DC_LockDc(hDCDest); if (NULL == DCDest) { @@ -739,6 +751,7 @@ GreStretchBltMask( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (DCDest->dctype == DC_TYPE_INFO) { DC_UnlockDc(DCDest); @@ -839,7 +852,7 @@ GreStretchBltMask( if (DCMask) { BitmapMask = DCMask->dclevel.pSurface; - if (BitmapMask && + if (BitmapMask && (BitmapMask->SurfObj.sizlBitmap.cx != WidthSrc || BitmapMask->SurfObj.sizlBitmap.cy != HeightSrc)) { @@ -857,7 +870,7 @@ GreStretchBltMask( XlateObj, &DestRect, &SourceRect, - NULL, + NULL, &DCDest->eboFill.BrushObject, &BrushOrigin, ROP3_TO_ROP4(ROP)); @@ -883,18 +896,18 @@ failed: BOOL APIENTRY NtGdiStretchBlt( - HDC hDCDest, - INT XOriginDest, - INT YOriginDest, - INT WidthDest, - INT HeightDest, - HDC hDCSrc, - INT XOriginSrc, - INT YOriginSrc, - INT WidthSrc, - INT HeightSrc, - DWORD ROP, - IN DWORD dwBackColor) + HDC hDCDest, + INT XOriginDest, + INT YOriginDest, + INT WidthDest, + INT HeightDest, + HDC hDCSrc, + INT XOriginSrc, + INT YOriginSrc, + INT WidthSrc, + INT HeightSrc, + DWORD ROP, + IN DWORD dwBackColor) { return GreStretchBltMask( hDCDest, @@ -915,13 +928,13 @@ NtGdiStretchBlt( BOOL FASTCALL IntPatBlt( - PDC dc, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP, - PBRUSH BrushObj) + PDC dc, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP, + PBRUSH BrushObj) { RECTL DestRect; SURFACE *psurf; @@ -993,11 +1006,11 @@ IntPatBlt( BOOL FASTCALL IntGdiPolyPatBlt( - HDC hDC, - DWORD dwRop, - PPATRECT pRects, - int cRects, - ULONG Reserved) + HDC hDC, + DWORD dwRop, + PPATRECT pRects, + int cRects, + ULONG Reserved) { int i; PPATRECT r; @@ -1049,12 +1062,12 @@ IntGdiPolyPatBlt( BOOL APIENTRY NtGdiPatBlt( - HDC hDC, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP) + HDC hDC, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP) { PBRUSH pbrush; DC *dc; @@ -1094,14 +1107,7 @@ NtGdiPatBlt( return FALSE; } - ret = IntPatBlt( - dc, - XLeft, - YLeft, - Width, - Height, - ROP, - pbrush); + ret = IntPatBlt(dc, XLeft, YLeft, Width, Height, ROP, pbrush); BRUSH_UnlockBrush(pbrush); DC_UnlockDc(dc); @@ -1111,11 +1117,11 @@ NtGdiPatBlt( BOOL APIENTRY NtGdiPolyPatBlt( - HDC hDC, - DWORD dwRop, - IN PPOLYPATBLT pRects, - IN DWORD cRects, - IN DWORD Mode) + HDC hDC, + DWORD dwRop, + IN PPOLYPATBLT pRects, + IN DWORD cRects, + IN DWORD Mode) { PPATRECT rb = NULL; NTSTATUS Status = STATUS_SUCCESS; From 6ddc722505a3a1940bf806c7489b5946cacca068 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 8 Jul 2009 16:57:12 +0000 Subject: [PATCH 266/577] Simplify code, thx Ged svn path=/trunk/; revision=41807 --- reactos/base/shell/explorer-new/taskswnd.c | 35 ++++++++++++---------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/reactos/base/shell/explorer-new/taskswnd.c b/reactos/base/shell/explorer-new/taskswnd.c index 63fb9f34d14..85829561a03 100644 --- a/reactos/base/shell/explorer-new/taskswnd.c +++ b/reactos/base/shell/explorer-new/taskswnd.c @@ -1030,7 +1030,7 @@ TaskSwitchWnd_AddTask(IN OUT PTASK_SWITCH_WND This, static BOOL TaskSwitchWnd_ActivateTaskItem(IN OUT PTASK_SWITCH_WND This, - IN OUT PTASK_ITEM TaskItem) + IN OUT PTASK_ITEM TaskItem OPTIONAL) { if (TaskItem != NULL) { @@ -1647,30 +1647,33 @@ static VOID TaskSwitchWnd_HandleTaskItemClick(IN OUT PTASK_SWITCH_WND This, IN OUT PTASK_ITEM TaskItem) { - BOOL bMinimize; - + BOOL bIsMinimized; + BOOL bIsActive; + if (IsWindow(TaskItem->hWnd)) { - bMinimize = !IsIconic(TaskItem->hWnd) && - TaskItem == This->ActiveTaskItem; - - if (!bMinimize && IsIconic(TaskItem->hWnd)) - { - PostMessage(TaskItem->hWnd, - WM_SYSCOMMAND, - SC_RESTORE, - 0); - } + bIsMinimized = IsIconic(TaskItem->hWnd); + bIsActive = (TaskItem == This->ActiveTaskItem); - SetForegroundWindow(TaskItem->hWnd); - - if (bMinimize) + if (!bIsMinimized && bIsActive) { PostMessage(TaskItem->hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); } + else + { + if (bIsMinimized) + { + PostMessage(TaskItem->hWnd, + WM_SYSCOMMAND, + SC_RESTORE, + 0); + } + + SetForegroundWindow(TaskItem->hWnd); + } } } From 24fe0f5f8ce852b9b6839695adeb2ace6e564b33 Mon Sep 17 00:00:00 2001 From: Jeffrey Morlan Date: Wed, 8 Jul 2009 17:28:21 +0000 Subject: [PATCH 267/577] In cmd: free all memory before exiting to prevent "memory leak" messages (bug 4510). Also, CMD /? should exit with a code of 1 instead of 0. svn path=/trunk/; revision=41808 --- reactos/base/shell/cmd/cmd.c | 89 +++++++++++++++--------------------- 1 file changed, 36 insertions(+), 53 deletions(-) diff --git a/reactos/base/shell/cmd/cmd.c b/reactos/base/shell/cmd/cmd.c index 0ec4d674e0b..0ef2ce25a9a 100644 --- a/reactos/base/shell/cmd/cmd.c +++ b/reactos/base/shell/cmd/cmd.c @@ -739,42 +739,22 @@ ExecuteCommand(PARSED_COMMAND *Cmd) return Ret; } -BOOL -GrowIfNecessary_dbg ( UINT needed, LPTSTR* ret, UINT* retlen, const char *file, int line ) -{ - if ( *ret && needed < *retlen ) - return TRUE; - *retlen = needed; - if ( *ret ) - cmd_free ( *ret ); -#ifdef _DEBUG_MEM - *ret = (LPTSTR)cmd_alloc_dbg ( *retlen * sizeof(TCHAR), file, line ); -#else - *ret = (LPTSTR)cmd_alloc ( *retlen * sizeof(TCHAR) ); -#endif - if ( !*ret ) - SetLastError ( ERROR_OUTOFMEMORY ); - return *ret != NULL; -} -#define GrowIfNecessary(x, y, z) GrowIfNecessary_dbg(x, y, z, __FILE__, __LINE__) - LPTSTR GetEnvVar(LPCTSTR varName) { static LPTSTR ret = NULL; - static UINT retlen = 0; UINT size; - size = GetEnvironmentVariable ( varName, ret, retlen ); - if ( size > retlen ) + cmd_free(ret); + ret = NULL; + size = GetEnvironmentVariable(varName, NULL, 0); + if (size > 0) { - if ( !GrowIfNecessary ( size, &ret, &retlen ) ) - return NULL; - size = GetEnvironmentVariable ( varName, ret, retlen ); + ret = cmd_alloc(size * sizeof(TCHAR)); + if (ret != NULL) + GetEnvironmentVariable(varName, ret, size + 1); } - if ( size ) - return ret; - return NULL; + return ret; } LPCTSTR @@ -1636,9 +1616,6 @@ Initialize() NtReadVirtualMemoryPtr = (NtReadVirtualMemoryProc)GetProcAddress(NtDllModule, "NtReadVirtualMemory"); } - cmdLine = GetCommandLine(); - TRACE ("[command args: %s]\n", debugstr_aw(cmdLine)); - InitLocale (); /* get default input and output console handles */ @@ -1652,9 +1629,32 @@ Initialize() if (GetEnvironmentVariable(_T("PROMPT"),lpBuffer, sizeof(lpBuffer) / sizeof(lpBuffer[0])) == 0) SetEnvironmentVariable (_T("PROMPT"), _T("$P$G")); +#ifdef FEATURE_DIR_STACK + /* initialize directory stack */ + InitDirectoryStack (); +#endif + +#ifdef FEATURE_HISTORY + /*initialize history*/ + InitHistory(); +#endif + + /* Set COMSPEC environment variable */ + if (0 != GetModuleFileName (NULL, ModuleName, _MAX_PATH + 1)) + { + ModuleName[_MAX_PATH] = _T('\0'); + SetEnvironmentVariable (_T("COMSPEC"), ModuleName); + } + + /* add ctrl break handler */ + AddBreakHandler (); + SetConsoleMode (hIn, ENABLE_PROCESSED_INPUT); + cmdLine = GetCommandLine(); + TRACE ("[command args: %s]\n", debugstr_aw(cmdLine)); + for (ptr = cmdLine; *ptr; ptr++) { if (*ptr == _T('/')) @@ -1663,7 +1663,9 @@ Initialize() if (option == _T('?')) { ConOutResPaging(TRUE,STRING_CMD_HELP8); - cmd_exit(0); + nErrorLevel = 1; + bExit = TRUE; + return; } else if (option == _T('P')) { @@ -1731,27 +1733,6 @@ Initialize() ConOutPuts(_T("(C) Copyright 1998-") _T(COPYRIGHT_YEAR) _T(" ReactOS Team.")); } -#ifdef FEATURE_DIR_STACK - /* initialize directory stack */ - InitDirectoryStack (); -#endif - - -#ifdef FEATURE_HISTORY - /*initialize history*/ - InitHistory(); -#endif - - /* Set COMSPEC environment variable */ - if (0 != GetModuleFileName (NULL, ModuleName, _MAX_PATH + 1)) - { - ModuleName[_MAX_PATH] = _T('\0'); - SetEnvironmentVariable (_T("COMSPEC"), ModuleName); - } - - /* add ctrl break handler */ - AddBreakHandler (); - if (AutoRun) { ExecuteAutoRunFile(HKEY_LOCAL_MACHINE); @@ -1796,6 +1777,8 @@ static VOID Cleanup() CleanHistory(); #endif + /* free GetEnvVar's buffer */ + GetEnvVar(NULL); /* remove ctrl break handler */ RemoveBreakHandler (); From dfccee750df6d343eed3a4d6e6f51a8adb91fad0 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 8 Jul 2009 19:30:02 +0000 Subject: [PATCH 268/577] modified tests/pseh2/psehtest.c Test case for bug #4663 (still unsolved) New sanity check for correct unlinking of the frame. !!!EIGHTY TESTS OUT OF NINETY-THREE CURRENTLY FAIL THIS!!! svn path=/trunk/; revision=41810 --- rostests/tests/pseh2/psehtest.c | 71 +++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/rostests/tests/pseh2/psehtest.c b/rostests/tests/pseh2/psehtest.c index 5b193975c4f..5981f7a4735 100644 --- a/rostests/tests/pseh2/psehtest.c +++ b/rostests/tests/pseh2/psehtest.c @@ -2304,6 +2304,45 @@ DEFINE_TEST(test_bug_4004) return return_arg(i1) + return_arg(i2) + return_arg(i3) == return_positive() * 3; } //}}} + +/* #4663: *///{{{ +DEFINE_TEST(test_bug_4663) +{ + int i1, i2; + + i1 = return_zero(); + i2 = return_zero(); + + _SEH2_TRY + { + _SEH2_TRY + { + RaiseException(0xE00DEAD0, 0, 0, NULL); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + if (i1 == return_zero()) + { + i1 = return_one(); + } + } + _SEH2_END; + + if (i1 == return_one()) + { + i1 = return_minusone(); + RaiseException(0xE00DEAD0, 0, 0, NULL); + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + i2 = return_one(); + } + _SEH2_END; + + return ((i1 == return_minusone()) && (i2 == return_one())); +} +//}}} //}}} static @@ -2334,11 +2373,20 @@ DECLSPEC_NOINLINE int sanity_check(int ret, struct volatile_context * before, struct volatile_context * after) { if(ret && memcmp(before, after, sizeof(before))) + { ok(0, "volatile context corrupted\n"); + ret = 0; + } return ret; } +static +int passthrough_handler(struct _EXCEPTION_RECORD * e, void * f, struct _CONTEXT * c, void * d) +{ + return ExceptionContinueSearch; +} + static DECLSPEC_NOINLINE int call_test(int (* func)(void)) @@ -2346,9 +2394,18 @@ int call_test(int (* func)(void)) static int ret; static struct volatile_context before, after; static LPTOP_LEVEL_EXCEPTION_FILTER prev_unhandled_exception; + static _SEH2Registration_t * prev_frame; + _SEH2Registration_t passthrough_frame; prev_unhandled_exception = SetUnhandledExceptionFilter(&unhandled_exception); +#if defined(_X86_) + prev_frame = (_SEH2Registration_t *)__readfsdword(0); + passthrough_frame.SER_Prev = prev_frame; + passthrough_frame.SER_Handler = passthrough_handler; + __writefsdword(0, (unsigned long)&passthrough_frame); +#endif + #if defined(__GNUC__) && defined(__i386__) __asm__ __volatile__ ( @@ -2378,6 +2435,16 @@ int call_test(int (* func)(void)) ret = func(); #endif +#if defined(_X86_) + if((_SEH2Registration_t *)__readfsdword(0) != &passthrough_frame || passthrough_frame.SER_Prev != prev_frame) + { + ok(0, "exception registration list corrupted\n"); + ret = 0; + } + else + __writefsdword(0, (unsigned long)prev_frame); +#endif + SetUnhandledExceptionFilter(prev_unhandled_exception); return ret; } @@ -2501,12 +2568,16 @@ void testsuite_syntax(void) USE_TEST(test_abnorm_8), USE_TEST(test_bug_4004), + USE_TEST(test_bug_4663), }; size_t i; for(i = 0; i < sizeof(testsuite) / sizeof(testsuite[0]); ++ i) + { + //printf("%s\n", testsuite[i].name); ok(call_test(testsuite[i].func), "%s failed\n", testsuite[i].name); + } } const struct test winetest_testlist[] = { From d6dcda9708fbd659a8cb9d58451b6f1c7f17b458 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 8 Jul 2009 19:40:54 +0000 Subject: [PATCH 269/577] modified tests/pseh2/psehtest.c Don't use ok() when we mean trace() Fix the stack after corruption of the registration list Revised figures: "only" FOURTY of ninety-three tests fail with a corrupted registration list svn path=/trunk/; revision=41811 --- rostests/tests/pseh2/psehtest.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rostests/tests/pseh2/psehtest.c b/rostests/tests/pseh2/psehtest.c index 5981f7a4735..4fd7f787c94 100644 --- a/rostests/tests/pseh2/psehtest.c +++ b/rostests/tests/pseh2/psehtest.c @@ -2348,7 +2348,7 @@ DEFINE_TEST(test_bug_4663) static LONG WINAPI unhandled_exception(PEXCEPTION_POINTERS ExceptionInfo) { - ok(0, "unhandled exception %08lX thrown from %p\n", ExceptionInfo->ExceptionRecord->ExceptionCode, ExceptionInfo->ExceptionRecord->ExceptionAddress); + trace("unhandled exception %08lX thrown from %p\n", ExceptionInfo->ExceptionRecord->ExceptionCode, ExceptionInfo->ExceptionRecord->ExceptionAddress); return EXCEPTION_CONTINUE_SEARCH; } @@ -2374,8 +2374,8 @@ int sanity_check(int ret, struct volatile_context * before, struct volatile_cont { if(ret && memcmp(before, after, sizeof(before))) { - ok(0, "volatile context corrupted\n"); - ret = 0; + trace("volatile context corrupted\n"); + return 0; } return ret; @@ -2438,11 +2438,11 @@ int call_test(int (* func)(void)) #if defined(_X86_) if((_SEH2Registration_t *)__readfsdword(0) != &passthrough_frame || passthrough_frame.SER_Prev != prev_frame) { - ok(0, "exception registration list corrupted\n"); + trace("exception registration list corrupted\n"); ret = 0; } - else - __writefsdword(0, (unsigned long)prev_frame); + + __writefsdword(0, (unsigned long)prev_frame); #endif SetUnhandledExceptionFilter(prev_unhandled_exception); From 9060c87badf86525e8032b9d116058ffca6dca1b Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 8 Jul 2009 19:52:48 +0000 Subject: [PATCH 270/577] modified include/reactos/libs/pseh/pseh2.h Only leave the frame in the outermost _SEH2_END (like in PSEH1) svn path=/trunk/; revision=41812 --- reactos/include/reactos/libs/pseh/pseh2.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/reactos/include/reactos/libs/pseh/pseh2.h b/reactos/include/reactos/libs/pseh/pseh2.h index 0523231c2f7..d2035358a38 100644 --- a/reactos/include/reactos/libs/pseh/pseh2.h +++ b/reactos/include/reactos/libs/pseh/pseh2.h @@ -194,16 +194,18 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) #define __SEH_ENTER_SCOPE(TRYLEVEL_) (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) : __SEH_ENTER_TRYLEVEL(TRYLEVEL_)) #define __SEH_ENTER_HANDLE_SCOPE(TRYLEVEL_, HANDLE_) (({ __SEH_BARRIER; __asm__ __volatile__("mov %%esp, %0" : "=m" ((TRYLEVEL_)->SHT_Esp)); __SEH_BARRIER; }), (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_HANDLE_TRYLEVEL((TRYLEVEL_), (HANDLE_)) : __SEH_ENTER_HANDLE_TRYLEVEL((TRYLEVEL_), (HANDLE_)))) -#define __SEH_LEAVE_SCOPE() \ +#define __SEH_LEAVE_TRYLEVEL() \ + if(!_SEHTopTryLevel) \ + { \ + __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \ + } \ + +#define __SEH_LEAVE_FRAME() \ if(_SEHTopTryLevel) \ { \ _SEH2LeaveFrame(); \ __asm__ __volatile__("mov %0, %%esp" : : "g" (_SEHStackPointer)); \ - } \ - else \ - { \ - __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \ - } \ + } #define __SEH_END_SCOPE_CHAIN \ static __attribute__((unused)) const int _SEH2ScopeKind = 1; \ @@ -289,7 +291,7 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) \ _SEHAbnormalTermination = 0; \ \ - __SEH_LEAVE_SCOPE(); \ + __SEH_LEAVE_TRYLEVEL(); \ \ _SEHFinally(); \ goto _SEHEndExcept; \ @@ -362,7 +364,7 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) __attribute__((unused)) __SEH_DEFINE_FINALLY(_SEHFinally) { __SEH_RETURN_FINALLY(); } \ \ _SEHAfterTry:; \ - __SEH_LEAVE_SCOPE(); \ + __SEH_LEAVE_TRYLEVEL(); \ \ goto _SEHEndExcept; \ \ @@ -377,6 +379,8 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) } \ \ _SEHEndExcept:; \ + \ + __SEH_LEAVE_FRAME(); \ } \ __SEH_END_SCOPE; From 973a9493c459ccb7557b539b268560749363ef34 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Wed, 8 Jul 2009 20:06:11 +0000 Subject: [PATCH 271/577] According to http://msdn.microsoft.com/en-us/library/tcxf1dw6(VS.71).aspx and http://www.cplusplus.com/reference/clibrary/cstdio/printf/ there are no %le and %lf printf formats. The 'l' specifier is used for integers or wide characters, 'L' for long double. Outputting a double doesn't require any additional specifier (see http://msdn.microsoft.com/en-us/library/hf4y5e3w(VS.71).aspx). svn path=/trunk/; revision=41813 --- reactos/base/applications/calc/utl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/base/applications/calc/utl.c b/reactos/base/applications/calc/utl.c index 745ff265fc3..599115e9883 100644 --- a/reactos/base/applications/calc/utl.c +++ b/reactos/base/applications/calc/utl.c @@ -21,9 +21,9 @@ void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, int size, int base) /* calculate the width of integer number */ width = (rpn->f==0) ? 1 : (int)log10(fabs(rpn->f))+1; if (calc.sci_out == TRUE || width > MAX_LD_WIDTH || width < -MAX_LD_WIDTH) - ptr = buffer + _stprintf(buffer, TEXT("%#le"), rpn->f); + ptr = buffer + _stprintf(buffer, TEXT("%#e"), rpn->f); else { - ptr = buffer + _stprintf(buffer, TEXT("%#*.*lf"), width, ((MAX_LD_WIDTH-width-1)>=0) ? MAX_LD_WIDTH-width-1 : 0, rpn->f); + ptr = buffer + _stprintf(buffer, TEXT("%#*.*f"), width, ((MAX_LD_WIDTH-width-1)>=0) ? MAX_LD_WIDTH-width-1 : 0, rpn->f); dst = _tcschr(buffer, TEXT('.')); while (--ptr > dst) if (*ptr != TEXT('0')) From 3728596a8eb5c8e10abb13be6b81e67a0a340b8a Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 8 Jul 2009 20:28:33 +0000 Subject: [PATCH 272/577] modified pseh2/psehtest.c We need a bigger boat. Improve the test for bug #4663 svn path=/trunk/; revision=41814 --- rostests/tests/pseh2/psehtest.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/rostests/tests/pseh2/psehtest.c b/rostests/tests/pseh2/psehtest.c index 4fd7f787c94..f83e7e18591 100644 --- a/rostests/tests/pseh2/psehtest.c +++ b/rostests/tests/pseh2/psehtest.c @@ -2310,37 +2310,37 @@ DEFINE_TEST(test_bug_4663) { int i1, i2; - i1 = return_zero(); - i2 = return_zero(); + i1 = return_positive(); + i2 = return_positive(); _SEH2_TRY { _SEH2_TRY { - RaiseException(0xE00DEAD0, 0, 0, NULL); + RaiseException(0xE00DEAD0, 0, 0, 0); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - if (i1 == return_zero()) + if (i1 == return_positive()) { - i1 = return_one(); + i1 = return_positive() + 1; } } _SEH2_END; - if (i1 == return_one()) + if (i1 == return_positive() + 1) { - i1 = return_minusone(); - RaiseException(0xE00DEAD0, 0, 0, NULL); + i1 = return_negative(); + RaiseException(0xE00DEAD0, 0, 0, 0); } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - i2 = return_one(); + i2 = return_negative(); } _SEH2_END; - return ((i1 == return_minusone()) && (i2 == return_one())); + return ((i1 == return_negative()) && (i2 == return_negative())); } //}}} //}}} @@ -2574,10 +2574,7 @@ void testsuite_syntax(void) size_t i; for(i = 0; i < sizeof(testsuite) / sizeof(testsuite[0]); ++ i) - { - //printf("%s\n", testsuite[i].name); ok(call_test(testsuite[i].func), "%s failed\n", testsuite[i].name); - } } const struct test winetest_testlist[] = { From 488bf139221b2411b04e181f2d545d39679bdce5 Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 8 Jul 2009 20:32:50 +0000 Subject: [PATCH 273/577] modified lib/pseh/i386/framebased-gcchack.c Notorious ass-clown Arch Blackmann forgot to pop the trylevel that handled an exception. Subsequent throws would keep being caught by the same trylevel over and over again, and infinite loops are indeed possible. Eat shit and die, Arch If test_bug_4663 test in the PSEH2 test suite is actually representative of the bug, the bug itself may have been fixed svn path=/trunk/; revision=41815 --- reactos/lib/pseh/i386/framebased-gcchack.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/lib/pseh/i386/framebased-gcchack.c b/reactos/lib/pseh/i386/framebased-gcchack.c index af725a4da1c..fa59b4d15a6 100644 --- a/reactos/lib/pseh/i386/framebased-gcchack.c +++ b/reactos/lib/pseh/i386/framebased-gcchack.c @@ -192,6 +192,7 @@ void _SEH2Handle(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel) _SEH2GlobalUnwind(frame); _SEH2LocalUnwind(frame, &fulltrylevel->SHT_Common); + frame->SF_TopTryLevel = fulltrylevel->SHT_Common.ST_Next; __SEH2Handle ( From c589c03a223fafe78412acf8ea9f603fa8592a39 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Wed, 8 Jul 2009 20:41:58 +0000 Subject: [PATCH 274/577] - NtUserMessageCall: Fix probe-and-capture for the FNID_BROADCASTSYSTEMMESSAGE case -- win32k must copy user mode buffers to safe memory before reading from them (or wrap the operations in SEH). Copy the buffer to the stack as it is small. svn path=/trunk/; revision=41816 --- .../subsystems/win32/win32k/ntuser/message.c | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 0053dbf7883..def10f6d043 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -2051,7 +2051,7 @@ NtUserMessageCall( break; case FNID_BROADCASTSYSTEMMESSAGE: { - PBROADCASTPARM parm; + BROADCASTPARM parm; DWORD_PTR RetVal = 0; if (ResultInfo) @@ -2061,7 +2061,7 @@ NtUserMessageCall( ProbeForWrite((PVOID)ResultInfo, sizeof(BROADCASTPARM), 1); - parm = (PBROADCASTPARM)ResultInfo; + RtlCopyMemory(&parm, (PVOID)ResultInfo, sizeof(BROADCASTPARM)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -2073,15 +2073,15 @@ NtUserMessageCall( else break; - if ( parm->recipients & BSM_ALLDESKTOPS || - parm->recipients == BSM_ALLCOMPONENTS ) + if ( parm.recipients & BSM_ALLDESKTOPS || + parm.recipients == BSM_ALLCOMPONENTS ) { } - else if (parm->recipients & BSM_APPLICATIONS) + else if (parm.recipients & BSM_APPLICATIONS) { - if (parm->flags & BSF_QUERY) + if (parm.flags & BSF_QUERY) { - if (parm->flags & BSF_FORCEIFHUNG || parm->flags & BSF_NOHANG) + if (parm.flags & BSF_FORCEIFHUNG || parm.flags & BSF_NOHANG) { co_IntSendMessageTimeout( HWND_BROADCAST, Msg, @@ -2091,7 +2091,7 @@ NtUserMessageCall( 2000, &RetVal); } - else if (parm->flags & BSF_NOTIMEOUTIFNOTHUNG) + else if (parm.flags & BSF_NOTIMEOUTIFNOTHUNG) { co_IntSendMessageTimeout( HWND_BROADCAST, Msg, @@ -2112,11 +2112,11 @@ NtUserMessageCall( &RetVal); } } - else if (parm->flags & BSF_POSTMESSAGE) + else if (parm.flags & BSF_POSTMESSAGE) { Ret = UserPostMessage(HWND_BROADCAST, Msg, wParam, lParam); } - else if ( parm->flags & BSF_SENDNOTIFYMESSAGE) + else if ( parm.flags & BSF_SENDNOTIFYMESSAGE) { Ret = UserSendNotifyMessage(HWND_BROADCAST, Msg, wParam, lParam); } From 915bec118bf247526dfb2e0deaa91d97ac69e7cb Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Wed, 8 Jul 2009 21:04:54 +0000 Subject: [PATCH 275/577] - Revert 41788, replaced by a real fix in 41815. See issue #4663 for more details. svn path=/trunk/; revision=41817 --- reactos/ntoskrnl/mm/ARM3/mdlsup.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index 8cee23c7d36..3bc121cd77b 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -679,7 +679,6 @@ MmProbeAndLockPages(IN PMDL Mdl, // Oops :( // ProbeStatus = _SEH2_GetExceptionCode(); - _SEH2_YIELD(break); } _SEH2_END; From 9a36897e482f0f56bd4e6d84ae7996a7a9eede17 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Jul 2009 21:05:37 +0000 Subject: [PATCH 276/577] IntGdiPolyPatBlt: Don't unnecessarily update the dc's brush, improve and simplyfy code, svn path=/trunk/; revision=41818 --- .../subsystems/win32/win32k/objects/bitblt.c | 148 +++++++++--------- 1 file changed, 72 insertions(+), 76 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index 31ff102bade..d3bd319c70a 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -928,79 +928,81 @@ NtGdiStretchBlt( BOOL FASTCALL IntPatBlt( - PDC dc, + PDC pdc, INT XLeft, INT YLeft, INT Width, INT Height, - DWORD ROP, - PBRUSH BrushObj) + DWORD dwRop, + PBRUSH pbrush) { RECTL DestRect; SURFACE *psurf; EBRUSHOBJ eboFill; POINTL BrushOrigin; - BOOL ret = TRUE; + BOOL ret; - ASSERT(BrushObj); + ASSERT(pbrush); - psurf = dc->dclevel.pSurface; + psurf = pdc->dclevel.pSurface; if (psurf == NULL) { SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } - if (!(BrushObj->flAttrs & GDIBRUSH_IS_NULL)) + if (pbrush->flAttrs & GDIBRUSH_IS_NULL) { - if (Width > 0) - { - DestRect.left = XLeft; - DestRect.right = XLeft + Width; - } - else - { - DestRect.left = XLeft + Width + 1; - DestRect.right = XLeft + 1; - } - - if (Height > 0) - { - DestRect.top = YLeft; - DestRect.bottom = YLeft + Height; - } - else - { - DestRect.top = YLeft + Height + 1; - DestRect.bottom = YLeft + 1; - } - - IntLPtoDP(dc, (LPPOINT)&DestRect, 2); - - DestRect.left += dc->ptlDCOrig.x; - DestRect.top += dc->ptlDCOrig.y; - DestRect.right += dc->ptlDCOrig.x; - DestRect.bottom += dc->ptlDCOrig.y; - - BrushOrigin.x = BrushObj->ptOrigin.x + dc->ptlDCOrig.x; - BrushOrigin.y = BrushObj->ptOrigin.y + dc->ptlDCOrig.y; - - EBRUSHOBJ_vInit(&eboFill, BrushObj, dc->rosdc.XlateBrush); - - ret = IntEngBitBlt( - &psurf->SurfObj, - NULL, - NULL, - dc->rosdc.CombinedClip, - NULL, - &DestRect, - NULL, - NULL, - &eboFill.BrushObject, // use pDC->eboFill - &BrushOrigin, - ROP3_TO_ROP4(ROP)); + return TRUE; } + if (Width > 0) + { + DestRect.left = XLeft; + DestRect.right = XLeft + Width; + } + else + { + DestRect.left = XLeft + Width + 1; + DestRect.right = XLeft + 1; + } + + if (Height > 0) + { + DestRect.top = YLeft; + DestRect.bottom = YLeft + Height; + } + else + { + DestRect.top = YLeft + Height + 1; + DestRect.bottom = YLeft + 1; + } + + IntLPtoDP(pdc, (LPPOINT)&DestRect, 2); + + DestRect.left += pdc->ptlDCOrig.x; + DestRect.top += pdc->ptlDCOrig.y; + DestRect.right += pdc->ptlDCOrig.x; + DestRect.bottom += pdc->ptlDCOrig.y; + + BrushOrigin.x = pbrush->ptOrigin.x + pdc->ptlDCOrig.x; + BrushOrigin.y = pbrush->ptOrigin.y + pdc->ptlDCOrig.y; + + EBRUSHOBJ_vInit(&eboFill, pbrush, pdc->rosdc.XlateBrush); + + ret = IntEngBitBlt( + &psurf->SurfObj, + NULL, + NULL, + pdc->rosdc.CombinedClip, + NULL, + &DestRect, + NULL, + NULL, + &eboFill.BrushObject, // use pDC->eboFill + &BrushOrigin, + ROP3_TO_ROP4(dwRop)); + return ret; } @@ -1009,52 +1011,46 @@ IntGdiPolyPatBlt( HDC hDC, DWORD dwRop, PPATRECT pRects, - int cRects, + INT cRects, ULONG Reserved) { - int i; - PPATRECT r; + INT i; PBRUSH pbrush; - PDC_ATTR pdcattr; - DC *dc; + PDC pdc; - dc = DC_LockDc(hDC); - if (dc == NULL) + pdc = DC_LockDc(hDC); + if (!pdc) { SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } - if (dc->dctype == DC_TYPE_INFO) + + if (pdc->dctype == DC_TYPE_INFO) { - DC_UnlockDc(dc); + DC_UnlockDc(pdc); /* Yes, Windows really returns TRUE in this case */ return TRUE; } - pdcattr = dc->pdcattr; - - if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY)) - DC_vUpdateFillBrush(dc); - - for (r = pRects, i = 0; i < cRects; i++) + for (i = 0; i < cRects; i++) { - pbrush = BRUSH_LockBrush(r->hBrush); + pbrush = BRUSH_LockBrush(pRects->hBrush); if(pbrush != NULL) { IntPatBlt( - dc, - r->r.left, - r->r.top, - r->r.right, - r->r.bottom, + pdc, + pRects->r.left, + pRects->r.top, + pRects->r.right, + pRects->r.bottom, dwRop, pbrush); BRUSH_UnlockBrush(pbrush); } - r++; + pRects++; } - DC_UnlockDc(dc); + DC_UnlockDc(pdc); return TRUE; } From 903a26ae64e1d7435f91e206760be2d2b91de9a9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Jul 2009 21:35:33 +0000 Subject: [PATCH 277/577] BltMask: remove unnecessary check svn path=/trunk/; revision=41819 --- reactos/subsystems/win32/win32k/eng/bitblt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/bitblt.c b/reactos/subsystems/win32/win32k/eng/bitblt.c index 0f28b1b17c0..7272e0fdf17 100644 --- a/reactos/subsystems/win32/win32k/eng/bitblt.c +++ b/reactos/subsystems/win32/win32k/eng/bitblt.c @@ -78,7 +78,7 @@ BltMask(SURFOBJ* psoDest, fnDest_PutPixel = DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_PutPixel; if (psurfPattern) { - XlateObj = pebo ? pebo->XlateObject : NULL; + XlateObj = pebo->XlateObject; PatternY = (prclDest->top - pptlBrush->y) % PatternHeight; if (PatternY < 0) { @@ -101,7 +101,7 @@ BltMask(SURFOBJ* psoDest, if (*pjMskCurrent & fjMaskBit) { fnDest_PutPixel(psoDest, x, y, - XLATEOBJ_iXlate(XlateObj, + XLATEOBJ_iXlate(XlateObj, fnPattern_GetPixel(psoPattern, PatternX, PatternY))); } fjMaskBit = _rotr8(fjMaskBit, 1); From 69d04cfc3485ad1d2f627a591d2719e990b2a36c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Jul 2009 21:53:35 +0000 Subject: [PATCH 278/577] Get rid of the DCs XlateBrush and XlatePen. The resulting code isn't any better yet, but this step is needed for the upcoming xlateobj rewrite. svn path=/trunk/; revision=41820 --- reactos/subsystems/win32/win32k/eng/xlate.c | 49 +++++++++++ reactos/subsystems/win32/win32k/include/dc.h | 2 - .../subsystems/win32/win32k/include/inteng.h | 3 + .../subsystems/win32/win32k/objects/bitblt.c | 6 +- .../subsystems/win32/win32k/objects/dclife.c | 6 +- .../subsystems/win32/win32k/objects/dcobjs.c | 84 ++++--------------- 6 files changed, 72 insertions(+), 78 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/xlate.c b/reactos/subsystems/win32/win32k/eng/xlate.c index c5914edf606..7dd66d74ed8 100644 --- a/reactos/subsystems/win32/win32k/eng/xlate.c +++ b/reactos/subsystems/win32/win32k/eng/xlate.c @@ -671,4 +671,53 @@ XLATEOBJ_cGetPalette(XLATEOBJ *XlateObj, ULONG PalOutType, ULONG cPal, return 0; } +// HACK! +XLATEOBJ* +IntCreateBrushXlate(PDC pdc, BRUSH *pbrush) +{ + SURFACE * psurf; + XLATEOBJ *pxlo = NULL; + HPALETTE hPalette = NULL; + + psurf = pdc->dclevel.pSurface; + if (psurf) + { + hPalette = psurf->hDIBPalette; + } + if (!hPalette) hPalette = pPrimarySurface->DevInfo.hpalDefault; + + if (pbrush->flAttrs & GDIBRUSH_IS_NULL) + { + pxlo = NULL; + } + else if (pbrush->flAttrs & GDIBRUSH_IS_SOLID) + { + pxlo = IntEngCreateXlate(0, PAL_RGB, hPalette, NULL); + } + else + { + SURFACE *psurfPattern = SURFACE_LockSurface(pbrush->hbmPattern); + if (psurfPattern == NULL) + return FALSE; + + /* Special case: 1bpp pattern */ + if (psurfPattern->SurfObj.iBitmapFormat == BMF_1BPP) + { + if (pdc->rosdc.bitsPerPixel != 1) + pxlo = IntEngCreateSrcMonoXlate(hPalette, + pdc->pdcattr->crBackgroundClr, + pbrush->BrushAttr.lbColor); + } + else if (pbrush->flAttrs & GDIBRUSH_IS_DIB) + { + pxlo = IntEngCreateXlate(0, 0, hPalette, psurfPattern->hDIBPalette); + } + + SURFACE_UnlockSurface(psurfPattern); + } + + return pxlo; +} + + /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/dc.h b/reactos/subsystems/win32/win32k/include/dc.h index a85bcf784a0..1bda87a2cae 100644 --- a/reactos/subsystems/win32/win32k/include/dc.h +++ b/reactos/subsystems/win32/win32k/include/dc.h @@ -21,8 +21,6 @@ typedef struct _ROS_DC_INFO BYTE bitsPerPixel; CLIPOBJ *CombinedClip; - XLATEOBJ *XlateBrush; - XLATEOBJ *XlatePen; UNICODE_STRING DriverName; diff --git a/reactos/subsystems/win32/win32k/include/inteng.h b/reactos/subsystems/win32/win32k/include/inteng.h index 164cc06a5d4..f31f94e9f45 100644 --- a/reactos/subsystems/win32/win32k/include/inteng.h +++ b/reactos/subsystems/win32/win32k/include/inteng.h @@ -107,6 +107,9 @@ IntEngCreateSrcMonoXlate(HPALETTE PaletteDest, ULONG Color0, ULONG Color1); +XLATEOBJ* +IntCreateBrushXlate(PDC pdc, BRUSH *pbrush); + HPALETTE FASTCALL IntEngGetXlatePalette(XLATEOBJ *XlateObj, ULONG Palette); diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index d3bd319c70a..db91e471b76 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -941,6 +941,7 @@ IntPatBlt( EBRUSHOBJ eboFill; POINTL BrushOrigin; BOOL ret; + XLATEOBJ *pxlo; ASSERT(pbrush); @@ -988,7 +989,8 @@ IntPatBlt( BrushOrigin.x = pbrush->ptOrigin.x + pdc->ptlDCOrig.x; BrushOrigin.y = pbrush->ptOrigin.y + pdc->ptlDCOrig.y; - EBRUSHOBJ_vInit(&eboFill, pbrush, pdc->rosdc.XlateBrush); + pxlo = IntCreateBrushXlate(pdc, pbrush); + EBRUSHOBJ_vInit(&eboFill, pbrush, pxlo); ret = IntEngBitBlt( &psurf->SurfObj, @@ -1003,6 +1005,8 @@ IntPatBlt( &BrushOrigin, ROP3_TO_ROP4(dwRop)); + EngDeleteXlate(pxlo); + return ret; } diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index 97d86561c94..b11062107b6 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -500,10 +500,6 @@ IntGdiDeleteDC(HDC hDC, BOOL Force) NtGdiSelectBrush (DCHandle, STOCK_WHITE_BRUSH); NtGdiSelectFont (DCHandle, STOCK_SYSTEM_FONT); DC_LockDC (DCHandle); NtGdiSelectXxx does not recognize stock objects yet */ - if (DCToDelete->rosdc.XlateBrush != NULL) - EngDeleteXlate(DCToDelete->rosdc.XlateBrush); - if (DCToDelete->rosdc.XlatePen != NULL) - EngDeleteXlate(DCToDelete->rosdc.XlatePen); } if (DCToDelete->rosdc.hClipRgn) { @@ -719,7 +715,7 @@ NewNtGdiDeleteObjectApp(HANDLE DCHandle) return GreDeleteObject((HGDIOBJ) DCHandle); default: - return FALSE; + return FALSE; } } return (DCHandle != NULL); diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index ec45654ade2..ffe7ebb19c3 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -1,4 +1,4 @@ -/* +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: Functions for creation and destruction of DCs @@ -11,60 +11,6 @@ #define NDEBUG #include -// HACK! -static -BOOLEAN -IntUpdateBrushXlate(PDC pdc, XLATEOBJ **ppxlo, BRUSH *pbrush) -{ - SURFACE * psurf; - XLATEOBJ *pxlo = NULL; - HPALETTE hPalette = NULL; - - psurf = pdc->dclevel.pSurface; - if (psurf) - { - hPalette = psurf->hDIBPalette; - } - if (!hPalette) hPalette = pPrimarySurface->DevInfo.hpalDefault; - - if (pbrush->flAttrs & GDIBRUSH_IS_NULL) - { - pxlo = NULL; - } - else if (pbrush->flAttrs & GDIBRUSH_IS_SOLID) - { - pxlo = IntEngCreateXlate(0, PAL_RGB, hPalette, NULL); - } - else - { - SURFACE *psurfPattern = SURFACE_LockSurface(pbrush->hbmPattern); - if (psurfPattern == NULL) - return FALSE; - - /* Special case: 1bpp pattern */ - if (psurfPattern->SurfObj.iBitmapFormat == BMF_1BPP) - { - if (pdc->rosdc.bitsPerPixel != 1) - pxlo = IntEngCreateSrcMonoXlate(hPalette, - pdc->pdcattr->crBackgroundClr, - pbrush->BrushAttr.lbColor); - } - else if (pbrush->flAttrs & GDIBRUSH_IS_DIB) - { - pxlo = IntEngCreateXlate(0, 0, hPalette, psurfPattern->hDIBPalette); - } - - SURFACE_UnlockSurface(psurfPattern); - } - - if (*ppxlo != NULL) - EngDeleteXlate(*ppxlo); - - *ppxlo = pxlo; - return TRUE; -} - - VOID FASTCALL DC_vUpdateFillBrush(PDC pdc) @@ -94,28 +40,27 @@ DC_vUpdateFillBrush(PDC pdc) } } + /* ROS HACK, should use surf xlate */ + pxlo = IntCreateBrushXlate(pdc, pdc->dclevel.pbrFill); + /* Check if the EBRUSHOBJ needs update */ if (pdcattr->ulDirty_ & DIRTY_FILL) { pbrFill = pdc->dclevel.pbrFill; - /* ROS HACK, should use surf xlate */ - IntUpdateBrushXlate(pdc, &pdc->rosdc.XlateBrush, pbrFill); - /* Update eboFill, realizing it, if needed */ - EBRUSHOBJ_vUpdate(&pdc->eboFill, pbrFill, pdc->rosdc.XlateBrush); + EBRUSHOBJ_vUpdate(&pdc->eboFill, pbrFill, pxlo); } /* Check for DC brush */ if (pdcattr->hbrush == StockObjects[DC_BRUSH]) { - /* ROS HACK, should use surf xlate */ - pxlo = pdc->rosdc.XlateBrush; - /* Update the eboFill's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboFill, pdcattr->crPenClr, pxlo); } + EngDeleteXlate(pxlo); + /* Clear flags */ pdcattr->ulDirty_ &= ~(DIRTY_FILL | DC_BRUSH_DIRTY); } @@ -149,28 +94,27 @@ DC_vUpdateLineBrush(PDC pdc) } } + /* ROS HACK, should use surf xlate */ + pxlo = IntCreateBrushXlate(pdc, pdc->dclevel.pbrFill); + /* Check if the EBRUSHOBJ needs update */ if (pdcattr->ulDirty_ & DIRTY_LINE) { pbrLine = pdc->dclevel.pbrLine; - /* ROS HACK, should use surf xlate */ - IntUpdateBrushXlate(pdc, &pdc->rosdc.XlatePen, pbrLine); - /* Update eboLine, realizing it, if needed */ - EBRUSHOBJ_vUpdate(&pdc->eboLine, pbrLine, pdc->rosdc.XlatePen); + EBRUSHOBJ_vUpdate(&pdc->eboLine, pbrLine, pxlo); } /* Check for DC pen */ if (pdcattr->hpen == StockObjects[DC_PEN]) { - /* ROS HACK, should use surf xlate */ - pxlo = pdc->rosdc.XlatePen; - /* Update the eboLine's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboLine, pdcattr->crPenClr, pxlo); } + EngDeleteXlate(pxlo); + /* Clear flags */ pdcattr->ulDirty_ &= ~(DIRTY_LINE | DC_PEN_DIRTY); } @@ -434,7 +378,7 @@ NtGdiSelectClipPath( BOOL success = FALSE; PDC_ATTR pdcattr; PDC pdc; - + pdc = DC_LockDc(hDC); if (!pdc) { From 62951bd92572b8fb8da0dcdd51e48af2195e482a Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Thu, 9 Jul 2009 06:16:10 +0000 Subject: [PATCH 279/577] - Update Russian translation svn path=/trunk/; revision=41823 --- reactos/base/applications/paint/lang/ru-RU.rc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/base/applications/paint/lang/ru-RU.rc b/reactos/base/applications/paint/lang/ru-RU.rc index e6ede843c62..b35e490b1ae 100644 --- a/reactos/base/applications/paint/lang/ru-RU.rc +++ b/reactos/base/applications/paint/lang/ru-RU.rc @@ -41,7 +41,7 @@ BEGIN MENUITEM SEPARATOR POPUP "Ìàñ&øòàá" BEGIN - POPUP "User defined" + POPUP "Âûáðàòü" BEGIN MENUITEM "12,5%", IDM_VIEWZOOM125 MENUITEM "25%", IDM_VIEWZOOM25 @@ -52,8 +52,8 @@ BEGIN MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "Show grid", IDM_VIEWSHOWGRID - MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE + MENUITEM "Ïîêàçàòü ñåòêó", IDM_VIEWSHOWGRID + MENUITEM "Ïîêàçàòü ýñêèç", IDM_VIEWSHOWMINIATURE END MENUITEM "Ïîëíûé ýêðàí\tCtrl+F", IDM_VIEWFULLSCREEN END @@ -173,7 +173,7 @@ BEGIN IDS_INFOTEXT, "Paint äëÿ ReactOS ðàñïðîñòðàíÿåòñÿ ïîä ëèöåíçèåé GNU Lesser General Public License (LGPL) âåðñèè 3 (see www.gnu.org)" IDS_SAVEPROMPTTEXT, "Ñîõðàíèòü èçìåíåíèÿ â %s?" IDS_DEFAULTFILENAME, "Áåç_èìåíè.bmp" - IDS_MINIATURETITLE, "Miniature" + IDS_MINIATURETITLE, "Ýñêèç" IDS_TOOLTIP1, "Âûäåëåíèå ïðîèçâîëüíîé îáëàñòè" IDS_TOOLTIP2, "Âûäåëåíèå" IDS_TOOLTIP3, "Ëàñòèê" From 16e52e7c46b108d91d43748eef9f17719740d3cd Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Thu, 9 Jul 2009 09:33:49 +0000 Subject: [PATCH 280/577] - Fix a critical bug in the German hack which was causing the last PDE not to be synched with the ReactOS Memory Manager (or worse, the first, if there was only one PDE). - Add a new file which will hold the executive layer above the pool allocator (the Ex* routines). - This should eventually be moved to \ex. - Note that the current ReactOS pool Ex* routines are in \mm, which is dead wrong. - Define the POOL_DESCRIPTOR and POOL_HEADER structures for the NT 5.2 pool. - Define, create, and implement the routine to initialize a pool vector. - For now, we assume you want the nonpaged pool vector/descriptor. - Call this routine from the ARM3 initialization routine. - No changes to system behavior other than the bugfix above. svn path=/trunk/; revision=41824 --- reactos/ntoskrnl/mm/ARM3/expool.c | 85 ++++++++++++++++++++++++ reactos/ntoskrnl/mm/ARM3/init.c | 9 ++- reactos/ntoskrnl/mm/ARM3/miarm.h | 57 ++++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 4 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 reactos/ntoskrnl/mm/ARM3/expool.c diff --git a/reactos/ntoskrnl/mm/ARM3/expool.c b/reactos/ntoskrnl/mm/ARM3/expool.c new file mode 100644 index 00000000000..75f4e48d07d --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/expool.c @@ -0,0 +1,85 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/expool.c + * PURPOSE: ARM Memory Manager Executive Pool Manager + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::EXPOOL" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +POOL_DESCRIPTOR NonPagedPoolDescriptor; +PPOOL_DESCRIPTOR PoolVector[2]; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +ExInitializePoolDescriptor(IN PPOOL_DESCRIPTOR PoolDescriptor, + IN POOL_TYPE PoolType, + IN ULONG PoolIndex, + IN ULONG Threshold, + IN PVOID PoolLock) +{ + PLIST_ENTRY NextEntry, LastEntry; + + // + // Setup the descriptor based on the caller's request + // + PoolDescriptor->PoolType = PoolType; + PoolDescriptor->PoolIndex = PoolIndex; + PoolDescriptor->Threshold = Threshold; + PoolDescriptor->LockAddress = PoolLock; + + // + // Initialize accounting data + // + PoolDescriptor->RunningAllocs = 0; + PoolDescriptor->RunningDeAllocs = 0; + PoolDescriptor->TotalPages = 0; + PoolDescriptor->TotalBytes = 0; + PoolDescriptor->TotalBigPages = 0; + + // + // Nothing pending for now + // + PoolDescriptor->PendingFrees = NULL; + PoolDescriptor->PendingFreeDepth = 0; + + // + // Loop all the descriptor's allocation lists and initialize them + // + NextEntry = PoolDescriptor->ListHeads; + LastEntry = NextEntry + POOL_LISTS_PER_PAGE; + while (NextEntry < LastEntry) InitializeListHead(NextEntry++); +} + +VOID +NTAPI +InitializePool(IN POOL_TYPE PoolType, + IN ULONG Threshold) +{ + ASSERT(PoolType == NonPagedPool); + + // + // Initialize the nonpaged pool descirptor + // + PoolVector[PoolType] = &NonPagedPoolDescriptor; + ExInitializePoolDescriptor(PoolVector[PoolType], + PoolType, + 0, + Threshold, + NULL); +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index ceff5f1dc3d..f31d0dbd935 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -132,7 +132,7 @@ MiSyncARM3WithROS(IN PVOID AddressStart, // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder // ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart); - while (Pde < ADDR_TO_PDE_OFFSET(AddressEnd)) + while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd)) { // // This both odious and heinous @@ -707,8 +707,13 @@ MmArmInitSystem(IN ULONG Phase, // Sync us up with ReactOS Mm // MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); - MiSyncARM3WithROS(MmNonPagedPoolStart, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); + MiSyncARM3WithROS(MmArmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); + + // + // Initialize the nonpaged pool + // + InitializePool(NonPagedPool, 0); } else { diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 86b498a6e0b..e22c46af4f0 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -13,6 +13,56 @@ #define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024) #define MI_MAX_FREE_PAGE_LISTS 4 +// +// FIXFIX: These should go in ex.h after the pool merge +// +#define POOL_BLOCK_SIZE 8 +#define POOL_LISTS_PER_PAGE (PAGE_SIZE / POOL_BLOCK_SIZE) + +typedef struct _POOL_DESCRIPTOR +{ + POOL_TYPE PoolType; + ULONG PoolIndex; + ULONG RunningAllocs; + ULONG RunningDeAllocs; + ULONG TotalPages; + ULONG TotalBigPages; + ULONG Threshold; + PVOID LockAddress; + PVOID PendingFrees; + LONG PendingFreeDepth; + SIZE_T TotalBytes; + SIZE_T Spare0; + LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE]; +} POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR; + +typedef struct _POOL_HEADER +{ + union + { + struct + { + USHORT PreviousSize:9; + USHORT PoolIndex:7; + USHORT BlockSize:9; + USHORT PoolType:7; + }; + ULONG Ulong1; + }; + union + { + ULONG PoolTag; + struct + { + USHORT AllocatorBackTraceIndex; + USHORT PoolTagHash; + }; + }; +} POOL_HEADER, *PPOOL_HEADER; +// +// END FIXFIX +// + typedef enum _MMSYSTEM_PTE_POOL_TYPE { SystemPteSpace, @@ -62,6 +112,13 @@ MiInitializeArmPool( VOID ); +VOID +NTAPI +InitializePool( // + IN POOL_TYPE PoolType, + IN ULONG Threshold +); + VOID NTAPI MiInitializeSystemPtes( diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 75d60eb298a..5fcb2078b51 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -363,6 +363,7 @@ contmem.c drvmgmt.c dynamic.c + expool.c hypermap.c init.c iosup.c From fb73a624285f07fcf3cb8f6c197b6e3198245965 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 9 Jul 2009 13:23:00 +0000 Subject: [PATCH 281/577] - Stop removing good code, Arch! svn path=/trunk/; revision=41828 --- reactos/drivers/wdm/audio/legacy/wdmaud/control.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c index c34e1e94930..795f0ffcfd0 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c @@ -184,6 +184,12 @@ WdmAudControlOpen( return SetIrpIoStatus(Irp, STATUS_NO_MEMORY, 0); } + InstanceInfo->Property.Set = KSPROPSETID_Sysaudio; + InstanceInfo->Property.Id = KSPROPERTY_SYSAUDIO_INSTANCE_INFO; + InstanceInfo->Property.Flags = KSPROPERTY_TYPE_SET; + InstanceInfo->Flags = 0; + InstanceInfo->DeviceNumber = FilterId; + DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE || DeviceInfo->DeviceType == MIDI_IN_DEVICE_TYPE || From 7b83de4325891297991eeb97348e410a4d8ee24b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Jul 2009 13:36:42 +0000 Subject: [PATCH 282/577] - Move GDI_DEBUG stuff to make it compile again - Comment out some GDI_DEBUG prints related to deferred deletion, as this floods the log too much svn path=/trunk/; revision=41829 --- reactos/subsystems/win32/win32k/objects/gdiobj.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index d2bcae3d3b8..86a8bb8232f 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -8,6 +8,8 @@ /** INCLUDES ******************************************************************/ +//#define GDI_DEBUG + #include #define NDEBUG #include @@ -26,6 +28,8 @@ DPRINT("%s:%i: Delay\n", __FILE__, __LINE__); \ KeDelayExecutionThread(KernelMode, FALSE, &ShortDelay) +#include "gdidbg.c" + /* static */ /* FIXME: -fno-unit-at-a-time breaks this */ BOOL INTERNAL_CALL GDI_CleanupDummy(PVOID ObjectBody); @@ -78,10 +82,6 @@ OBJ_TYPE_INFO ObjTypeInfo[BASE_OBJTYPE_COUNT] = static LARGE_INTEGER ShortDelay; -/** DEBUGGING *****************************************************************/ -//#define GDI_DEBUG -#include "gdidbg.c" - /** INTERNAL FUNCTIONS ********************************************************/ /* @@ -576,8 +576,8 @@ LockHandle: { Object->BaseFlags |= BASEFLAG_READY_TO_DIE; DPRINT("Object %p, ulShareCount = %d\n", Object->hHmgr, Object->ulShareCount); - GDIDBG_TRACECALLER(); - GDIDBG_TRACESHARELOCKER(GDI_HANDLE_GET_INDEX(hObj)); + //GDIDBG_TRACECALLER(); + //GDIDBG_TRACESHARELOCKER(GDI_HANDLE_GET_INDEX(hObj)); (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); /* Don't wait on shared locks */ return FALSE; From c70e3fd433fa537f7a24401dfaa6fe87205975dd Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 9 Jul 2009 14:09:27 +0000 Subject: [PATCH 283/577] - Fix a few bugs in the sample rate conversion code - Might fix playback for audio samples out of audio adapter supported range svn path=/trunk/; revision=41830 --- .../drivers/wdm/audio/filters/kmixer/pin.c | 58 ++++++++++--------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/reactos/drivers/wdm/audio/filters/kmixer/pin.c b/reactos/drivers/wdm/audio/filters/kmixer/pin.c index 2a5b0aaea25..71f817ce684 100644 --- a/reactos/drivers/wdm/audio/filters/kmixer/pin.c +++ b/reactos/drivers/wdm/audio/filters/kmixer/pin.c @@ -34,6 +34,8 @@ PerformSampleRateConversion( DPRINT("PerformSampleRateConversion OldRate %u NewRate %u BytesPerSample %u NumChannels %u Irql %u\n", OldRate, NewRate, BytesPerSample, NumChannels, KeGetCurrentIrql()); + ASSERT(BytesPerSample == 1 || BytesPerSample == 2 || BytesPerSample == 4); + /* first acquire float save context */ Status = KeSaveFloatingPointState(&FloatSave); @@ -43,9 +45,9 @@ PerformSampleRateConversion( return Status; } - NumSamples = BufferLength / BytesPerSample; + NumSamples = BufferLength / (BytesPerSample * NumChannels); - FloatIn = ExAllocatePool(NonPagedPool, NumSamples * sizeof(FLOAT)); + FloatIn = ExAllocatePool(NonPagedPool, NumSamples * NumChannels * sizeof(FLOAT)); if (!FloatIn) { KeRestoreFloatingPointState(&FloatSave); @@ -54,7 +56,7 @@ PerformSampleRateConversion( NewSamples = lrintf(((FLOAT)NumSamples * ((FLOAT)NewRate / (FLOAT)OldRate))) + 2; - FloatOut = ExAllocatePool(NonPagedPool, NewSamples * sizeof(FLOAT)); + FloatOut = ExAllocatePool(NonPagedPool, NewSamples * NumChannels * sizeof(FLOAT)); if (!FloatOut) { ExFreePool(FloatIn); @@ -62,7 +64,7 @@ PerformSampleRateConversion( return STATUS_INSUFFICIENT_RESOURCES; } - ResultOut = ExAllocatePool(NonPagedPool, NewSamples * (BytesPerSample/8)); + ResultOut = ExAllocatePool(NonPagedPool, NewSamples * NumChannels * BytesPerSample); if (!FloatOut) { ExFreePool(FloatIn); @@ -83,31 +85,24 @@ PerformSampleRateConversion( } /* fixme use asm */ - if (BytesPerSample == 8) + if (BytesPerSample == 1) { - for(Index = 0; Index < NumSamples; Index++) - FloatIn[Index] = (float)Buffer[Index]; + for(Index = 0; Index < NumSamples * NumChannels; Index++) + FloatIn[Index] = (float)(Buffer[Index] / (1.0 * 0x80)); } - else if (BytesPerSample == 16) + else if (BytesPerSample == 2) { - PUSHORT Res = (PUSHORT)ResultOut; - for(Index = 0; Index < NumSamples; Index++) - FloatIn[Index] = (float)_byteswap_ushort(Res[Index]); + src_short_to_float_array((short*)Buffer, FloatIn, NumSamples * NumChannels); } - else + else if (BytesPerSample == 4) { - UNIMPLEMENTED - KeRestoreFloatingPointState(&FloatSave); - ExFreePool(FloatIn); - ExFreePool(FloatOut); - ExFreePool(ResultOut); - return STATUS_UNSUCCESSFUL; + src_int_to_float_array((int*)Buffer, FloatIn, NumSamples * NumChannels); } Data.data_in = FloatIn; Data.data_out = FloatOut; - Data.input_frames = NumSamples / NumChannels; - Data.output_frames = NewSamples / NumChannels; + Data.input_frames = NumSamples; + Data.output_frames = NewSamples; Data.src_ratio = (double)NewRate / (double)OldRate; error = src_process(State, &Data); @@ -121,26 +116,33 @@ PerformSampleRateConversion( return STATUS_UNSUCCESSFUL; } - if (BytesPerSample == 8) + if (BytesPerSample == 1) { + /* FIXME perform over/under clipping */ + for(Index = 0; Index < Data.output_frames_gen * NumChannels; Index++) - ResultOut[Index] = lrintf(FloatOut[Index]); + ResultOut[Index] = (lrintf(FloatOut[Index]) >> 24); } - else if (BytesPerSample == 16) + else if (BytesPerSample == 2) { PUSHORT Res = (PUSHORT)ResultOut; - for(Index = 0; Index < Data.output_frames_gen * NumChannels; Index++) - Res[Index] = _byteswap_ushort(lrintf(FloatOut[Index])); + src_float_to_short_array(FloatIn, (short*)Res, Data.output_frames_gen * NumChannels); + } + else if (BytesPerSample == 4) + { + PULONG Res = (PULONG)ResultOut; + + src_float_to_int_array(FloatIn, (int*)Res, Data.output_frames_gen * NumChannels); } + *Result = ResultOut; - *ResultLength = Data.output_frames_gen * (BytesPerSample/8) * NumChannels; + *ResultLength = Data.output_frames_gen * BytesPerSample * NumChannels; ExFreePool(FloatIn); ExFreePool(FloatOut); src_delete(State); KeRestoreFloatingPointState(&FloatSave); - return STATUS_SUCCESS; } @@ -654,7 +656,7 @@ Pin_fnFastWrite( StreamHeader->DataUsed, InputFormat->WaveFormatEx.nSamplesPerSec, OutputFormat->WaveFormatEx.nSamplesPerSec, - OutputFormat->WaveFormatEx.wBitsPerSample, + OutputFormat->WaveFormatEx.wBitsPerSample / 8, OutputFormat->WaveFormatEx.nChannels, &BufferOut, &BufferLength); From 52f4e2b161b72af04e4870ec55692a3454d57fec Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Thu, 9 Jul 2009 14:56:59 +0000 Subject: [PATCH 284/577] Add an assertion. Bug #4670. svn path=/trunk/; revision=41831 --- reactos/subsystems/win32/win32k/ntuser/winpos.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index cca1c449b5e..e5b278d73d1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -733,6 +733,8 @@ WinPosInternalMoveWindow(PWINDOW_OBJECT Window, INT MoveX, INT MoveY) { PWINDOW_OBJECT Child; + ASSERT(Window != Window->FirstChild); + Window->Wnd->WindowRect.left += MoveX; Window->Wnd->WindowRect.right += MoveX; Window->Wnd->WindowRect.top += MoveY; From 557132549218db75399099bda1ed637a851689d3 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 9 Jul 2009 15:55:29 +0000 Subject: [PATCH 285/577] - Don't overwrite previously set flags svn path=/trunk/; revision=41832 --- reactos/dll/win32/msafd/misc/sndrcv.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/msafd/misc/sndrcv.c b/reactos/dll/win32/msafd/misc/sndrcv.c index a2c8cb552f3..bb77f637cd2 100644 --- a/reactos/dll/win32/msafd/misc/sndrcv.c +++ b/reactos/dll/win32/msafd/misc/sndrcv.c @@ -166,7 +166,7 @@ WSPRecv(SOCKET Handle, /* Using Overlapped Structure and a Completition Routine, so use an APC */ APCFunction = NULL; // should be a private io completition function inside us APCContext = lpCompletionRoutine; - RecvInfo.AfdFlags = AFD_SKIP_FIO; + RecvInfo.AfdFlags |= AFD_SKIP_FIO; } IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; @@ -318,7 +318,7 @@ WSPRecvFrom(SOCKET Handle, /* Using Overlapped Structure and a Completition Routine, so use an APC */ APCFunction = NULL; // should be a private io completition function inside us APCContext = lpCompletionRoutine; - RecvInfo.AfdFlags = AFD_SKIP_FIO; + RecvInfo.AfdFlags |= AFD_SKIP_FIO; } IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; @@ -445,7 +445,7 @@ WSPSend(SOCKET Handle, /* Using Overlapped Structure and a Completition Routine, so use an APC */ APCFunction = NULL; // should be a private io completition function inside us APCContext = lpCompletionRoutine; - SendInfo.AfdFlags = AFD_SKIP_FIO; + SendInfo.AfdFlags |= AFD_SKIP_FIO; } IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; @@ -577,7 +577,7 @@ WSPSendTo(SOCKET Handle, /* Using Overlapped Structure and a Completition Routine, so use an APC */ APCFunction = NULL; // should be a private io completition function inside us APCContext = lpCompletionRoutine; - SendInfo.AfdFlags = AFD_SKIP_FIO; + SendInfo.AfdFlags |= AFD_SKIP_FIO; } IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal; From e99d1fe3f9dd27a236ae4e0bfa8a5eeb4081a26b Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 9 Jul 2009 16:47:11 +0000 Subject: [PATCH 286/577] - Implement IOCTL_AFD_SET_INFO - We currently disregard the value of BlockingMode so this causes no behavior change svn path=/trunk/; revision=41833 --- reactos/drivers/network/afd/afd/info.c | 29 +++++++++++++++++++++++ reactos/drivers/network/afd/afd/main.c | 7 +++--- reactos/drivers/network/afd/include/afd.h | 6 ++++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c index 561235634d3..4af2d8595e3 100644 --- a/reactos/drivers/network/afd/afd/info.c +++ b/reactos/drivers/network/afd/afd/info.c @@ -69,6 +69,35 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, return UnlockAndMaybeComplete( FCB, Status, Irp, 0 ); } +NTSTATUS NTAPI +AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, + PIO_STACK_LOCATION IrpSp ) { + NTSTATUS Status = STATUS_SUCCESS; + PAFD_INFO InfoReq = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer; + PFILE_OBJECT FileObject = IrpSp->FileObject; + PAFD_FCB FCB = FileObject->FsContext; + + if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); + + _SEH2_TRY { + switch (InfoReq->InformationClass) { + case AFD_INFO_BLOCKING_MODE: + AFD_DbgPrint(MID_TRACE,("Blocking mode set to %d\n", InfoReq->Information.Ulong)); + FCB->BlockingMode = InfoReq->Information.Ulong; + break; + default: + AFD_DbgPrint(MIN_TRACE,("Unknown request %d\n", InfoReq->InformationClass)); + break; + } + } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { + Status = STATUS_INVALID_PARAMETER; + } _SEH2_END; + + AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status)); + + return UnlockAndMaybeComplete(FCB, Status, Irp, 0); +} + NTSTATUS NTAPI AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index 65ca7ecea2a..099e1586995 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -422,6 +422,9 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) case IOCTL_AFD_GET_INFO: return AfdGetInfo( DeviceObject, Irp, IrpSp ); + case IOCTL_AFD_SET_INFO: + return AfdSetInfo( DeviceObject, Irp, IrpSp ); + case IOCTL_AFD_GET_CONTEXT: return AfdGetContext( DeviceObject, Irp, IrpSp ); @@ -447,10 +450,6 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_TDI_HANDLES\n")); break; - case IOCTL_AFD_SET_INFO: - AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_INFO\n")); - break; - case IOCTL_AFD_SET_CONNECT_DATA: AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA\n")); break; diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index f0f806d2811..fd707b9ce26 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -178,7 +178,7 @@ typedef struct _AFD_STORED_DATAGRAM { typedef struct _AFD_FCB { BOOLEAN Locked, Critical, Overread; - UINT State, Flags; + UINT State, Flags, BlockingMode; KIRQL OldIrql; UINT LockCount; PVOID CurrentThread; @@ -236,6 +236,10 @@ NTSTATUS NTAPI AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ); +NTSTATUS NTAPI +AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, + PIO_STACK_LOCATION IrpSp ); + NTSTATUS NTAPI AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ); From 2d834b1bdde5ceba4f28a04bc5ee8b44429c9052 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Jul 2009 21:41:58 +0000 Subject: [PATCH 287/577] freeldr: Remove duplicated / unused files for amd64 architecture See issue #4672 for more details. svn path=/trunk/; revision=41834 --- .../freeldr/freeldr/arch/amd64/hardware.c | 1893 ----------------- .../boot/freeldr/freeldr/arch/amd64/hwacpi.c | 5 - .../boot/freeldr/freeldr/arch/amd64/hwapm.c | 98 - .../boot/freeldr/freeldr/arch/amd64/hwpci.c | 346 --- .../freeldr/freeldr/arch/amd64/i386disk.c | 199 -- .../boot/freeldr/freeldr/arch/amd64/i386rtl.c | 87 - .../boot/freeldr/freeldr/arch/amd64/i386vid.c | 244 --- .../boot/freeldr/freeldr/arch/amd64/mach.c | 70 - .../boot/freeldr/freeldr/arch/amd64/pccons.c | 128 -- .../boot/freeldr/freeldr/arch/amd64/pcdisk.c | 455 ---- .../boot/freeldr/freeldr/arch/amd64/pcmem.c | 249 --- .../boot/freeldr/freeldr/arch/amd64/pcrtc.c | 5 - .../boot/freeldr/freeldr/arch/amd64/pcvideo.c | 1122 ---------- 13 files changed, 4901 deletions(-) delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/hardware.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/hwacpi.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/hwapm.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/hwpci.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/i386disk.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/i386rtl.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/i386vid.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/mach.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/pccons.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/pcdisk.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/pcmem.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/pcrtc.c delete mode 100644 reactos/boot/freeldr/freeldr/arch/amd64/pcvideo.c diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/hardware.c b/reactos/boot/freeldr/freeldr/arch/amd64/hardware.c deleted file mode 100644 index f3a890d3b14..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/hardware.c +++ /dev/null @@ -1,1893 +0,0 @@ -/* - * FreeLoader - * - * Copyright (C) 2003, 2004 Eric Kohl - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#define NDEBUG -#include - -#define MILLISEC (10) -#define PRECISION (8) - -#define HZ (100) -#define CLOCK_TICK_RATE (1193182) -#define LATCH (CLOCK_TICK_RATE / HZ) - - -/* No Mouse */ -#define MOUSE_TYPE_NONE 0 -/* Microsoft Mouse with 2 buttons */ -#define MOUSE_TYPE_MICROSOFT 1 -/* Logitech Mouse with 3 buttons */ -#define MOUSE_TYPE_LOGITECH 2 -/* Microsoft Wheel Mouse (aka Z Mouse) */ -#define MOUSE_TYPE_WHEELZ 3 -/* Mouse Systems Mouse */ -#define MOUSE_TYPE_MOUSESYSTEMS 4 - - -/* PS2 stuff */ - -/* Controller registers. */ -#define CONTROLLER_REGISTER_STATUS 0x64 -#define CONTROLLER_REGISTER_CONTROL 0x64 -#define CONTROLLER_REGISTER_DATA 0x60 - -/* Controller commands. */ -#define CONTROLLER_COMMAND_READ_MODE 0x20 -#define CONTROLLER_COMMAND_WRITE_MODE 0x60 -#define CONTROLLER_COMMAND_GET_VERSION 0xA1 -#define CONTROLLER_COMMAND_MOUSE_DISABLE 0xA7 -#define CONTROLLER_COMMAND_MOUSE_ENABLE 0xA8 -#define CONTROLLER_COMMAND_TEST_MOUSE 0xA9 -#define CONTROLLER_COMMAND_SELF_TEST 0xAA -#define CONTROLLER_COMMAND_KEYBOARD_TEST 0xAB -#define CONTROLLER_COMMAND_KEYBOARD_DISABLE 0xAD -#define CONTROLLER_COMMAND_KEYBOARD_ENABLE 0xAE -#define CONTROLLER_COMMAND_WRITE_MOUSE_OUTPUT_BUFFER 0xD3 -#define CONTROLLER_COMMAND_WRITE_MOUSE 0xD4 - -/* Controller status */ -#define CONTROLLER_STATUS_OUTPUT_BUFFER_FULL 0x01 -#define CONTROLLER_STATUS_INPUT_BUFFER_FULL 0x02 -#define CONTROLLER_STATUS_SELF_TEST 0x04 -#define CONTROLLER_STATUS_COMMAND 0x08 -#define CONTROLLER_STATUS_UNLOCKED 0x10 -#define CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL 0x20 -#define CONTROLLER_STATUS_GENERAL_TIMEOUT 0x40 -#define CONTROLLER_STATUS_PARITY_ERROR 0x80 -#define AUX_STATUS_OUTPUT_BUFFER_FULL (CONTROLLER_STATUS_OUTPUT_BUFFER_FULL | \ - CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) - -/* Timeout in ms for sending to keyboard controller. */ -#define CONTROLLER_TIMEOUT 250 - -static CHAR Hex[] = "0123456789abcdef"; -static unsigned int delay_count = 1; - -extern ULONG reactos_disk_count; -extern ARC_DISK_SIGNATURE reactos_arc_disk_info[]; -extern char reactos_arc_strings[32][256]; - -/* FUNCTIONS ****************************************************************/ - - -static VOID -__StallExecutionProcessor(ULONG Loops) -{ - volatile register unsigned int i; - for (i = 0; i < Loops; i++); -} - - -VOID StallExecutionProcessor(ULONG Microseconds) -{ - ULONGLONG LoopCount = ((ULONGLONG)delay_count * (ULONGLONG)Microseconds) / 1000ULL; - __StallExecutionProcessor((ULONG)LoopCount); -} - - -static ULONG -Read8254Timer(VOID) -{ - ULONG Count; - - WRITE_PORT_UCHAR((PUCHAR)0x43, 0x00); - Count = READ_PORT_UCHAR((PUCHAR)0x40); - Count |= READ_PORT_UCHAR((PUCHAR)0x40) << 8; - - return Count; -} - - -static VOID -WaitFor8254Wraparound(VOID) -{ - ULONG CurCount; - ULONG PrevCount = ~0; - LONG Delta; - - CurCount = Read8254Timer(); - - do - { - PrevCount = CurCount; - CurCount = Read8254Timer(); - Delta = CurCount - PrevCount; - - /* - * This limit for delta seems arbitrary, but it isn't, it's - * slightly above the level of error a buggy Mercury/Neptune - * chipset timer can cause. - */ - } - while (Delta < 300); -} - - -VOID -HalpCalibrateStallExecution(VOID) -{ - ULONG i; - ULONG calib_bit; - ULONG CurCount; - - /* Initialise timer interrupt with MILLISECOND ms interval */ - WRITE_PORT_UCHAR((PUCHAR)0x43, 0x34); /* binary, mode 2, LSB/MSB, ch 0 */ - WRITE_PORT_UCHAR((PUCHAR)0x40, LATCH & 0xff); /* LSB */ - WRITE_PORT_UCHAR((PUCHAR)0x40, LATCH >> 8); /* MSB */ - - /* Stage 1: Coarse calibration */ - - WaitFor8254Wraparound(); - - delay_count = 1; - - do { - delay_count <<= 1; /* Next delay count to try */ - - WaitFor8254Wraparound(); - - __StallExecutionProcessor(delay_count); /* Do the delay */ - - CurCount = Read8254Timer(); - } while (CurCount > LATCH / 2); - - delay_count >>= 1; /* Get bottom value for delay */ - - /* Stage 2: Fine calibration */ - - calib_bit = delay_count; /* Which bit are we going to test */ - - for(i=0;i>= 1; /* Next bit to calibrate */ - if(!calib_bit) break; /* If we have done all bits, stop */ - - delay_count |= calib_bit; /* Set the bit in delay_count */ - - WaitFor8254Wraparound(); - - __StallExecutionProcessor(delay_count); /* Do the delay */ - - CurCount = Read8254Timer(); - if (CurCount <= LATCH / 2) /* If a tick has passed, turn the */ - delay_count &= ~calib_bit; /* calibrated bit back off */ - } - - /* We're finished: Do the finishing touches */ - delay_count /= (MILLISEC / 2); /* Calculate delay_count for 1ms */ -} - -static VOID -DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PNP_BIOS_DEVICE_NODE DeviceNode; - PCM_PNP_BIOS_INSTALLATION_CHECK InstData; - PCONFIGURATION_COMPONENT_DATA BusKey; - ULONG x; - ULONG NodeSize = 0; - ULONG NodeCount = 0; - UCHAR NodeNumber; - ULONG FoundNodeCount; - int i; - ULONG PnpBufferSize; - ULONG Size; - char *Ptr; - - InstData = (PCM_PNP_BIOS_INSTALLATION_CHECK)PnpBiosSupported(); - if (InstData == NULL || strncmp((CHAR*)InstData->Signature, "$PnP", 4)) - { - DbgPrint((DPRINT_HWDETECT, "PnP-BIOS not supported\n")); - return; - } - DbgPrint((DPRINT_HWDETECT, "Signature '%c%c%c%c'\n", - InstData->Signature[0], InstData->Signature[1], - InstData->Signature[2], InstData->Signature[3])); - - - x = PnpBiosGetDeviceNodeCount(&NodeSize, &NodeCount); - NodeCount &= 0xFF; // needed since some fscked up BIOSes return - // wrong info (e.g. Mac Virtual PC) - // e.g. look: http://my.execpc.com/~geezer/osd/pnp/pnp16.c - if (x != 0 || NodeSize == 0 || NodeCount == 0) - { - DbgPrint((DPRINT_HWDETECT, "PnP-BIOS failed to enumerate device nodes\n")); - return; - } - DbgPrint((DPRINT_HWDETECT, "PnP-BIOS supported\n")); - DbgPrint((DPRINT_HWDETECT, "MaxNodeSize %u NodeCount %u\n", NodeSize, NodeCount)); - DbgPrint((DPRINT_HWDETECT, "Estimated buffer size %u\n", NodeSize * NodeCount)); - - /* Create component key */ - FldrCreateComponentKey(SystemKey, - L"MultifunctionAdapter", - *BusNumber, - AdapterClass, - MultiFunctionAdapter, - &BusKey); - (*BusNumber)++; - - /* Set the component information */ - FldrSetComponentInformation(BusKey, - 0x0, - 0x0, - 0xFFFFFFFF); - - /* Set the identifier */ - FldrSetIdentifier(BusKey, "PNP BIOS"); - - /* Set 'Configuration Data' value */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + (NodeSize * NodeCount); - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - memset(PartialResourceList, 0, Size); - - /* Initialize resource descriptor */ - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 1; - PartialResourceList->PartialDescriptors[0].Type = - CmResourceTypeDeviceSpecific; - PartialResourceList->PartialDescriptors[0].ShareDisposition = - CmResourceShareUndetermined; - - Ptr = (char *)(((ULONG_PTR)&PartialResourceList->PartialDescriptors[0]) + - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); - - /* Set instalation check data */ - memcpy (Ptr, InstData, sizeof(CM_PNP_BIOS_INSTALLATION_CHECK)); - Ptr += sizeof(CM_PNP_BIOS_INSTALLATION_CHECK); - - /* Copy device nodes */ - FoundNodeCount = 0; - PnpBufferSize = sizeof(CM_PNP_BIOS_INSTALLATION_CHECK); - for (i = 0; i < 0xFF; i++) - { - NodeNumber = (UCHAR)i; - - x = PnpBiosGetDeviceNode(&NodeNumber, (PVOID)DISKREADBUFFER); - if (x == 0) - { - DeviceNode = (PCM_PNP_BIOS_DEVICE_NODE)DISKREADBUFFER; - - DbgPrint((DPRINT_HWDETECT, - "Node: %u Size %u (0x%x)\n", - DeviceNode->Node, - DeviceNode->Size, - DeviceNode->Size)); - - memcpy (Ptr, - DeviceNode, - DeviceNode->Size); - - Ptr += DeviceNode->Size; - PnpBufferSize += DeviceNode->Size; - - FoundNodeCount++; - if (FoundNodeCount >= NodeCount) - break; - } - } - - /* Set real data size */ - PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize = - PnpBufferSize; - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + PnpBufferSize; - - DbgPrint((DPRINT_HWDETECT, "Real buffer size: %u\n", PnpBufferSize)); - DbgPrint((DPRINT_HWDETECT, "Resource size: %u\n", Size)); - - FldrSetConfigurationData(BusKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); -} - - - -static VOID -SetHarddiskConfigurationData(PCONFIGURATION_COMPONENT_DATA DiskKey, - ULONG DriveNumber) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry; - EXTENDED_GEOMETRY ExtGeometry; - GEOMETRY Geometry; - ULONG Size; - - /* Set 'Configuration Data' value */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + - sizeof(CM_DISK_GEOMETRY_DEVICE_DATA); - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate a full resource descriptor\n")); - return; - } - - memset(PartialResourceList, 0, Size); - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 1; - PartialResourceList->PartialDescriptors[0].Type = - CmResourceTypeDeviceSpecific; -// PartialResourceList->PartialDescriptors[0].ShareDisposition = -// PartialResourceList->PartialDescriptors[0].Flags = - PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize = - sizeof(CM_DISK_GEOMETRY_DEVICE_DATA); - - /* Get pointer to geometry data */ - DiskGeometry = (PVOID)(((ULONG_PTR)PartialResourceList) + sizeof(CM_PARTIAL_RESOURCE_LIST)); - - /* Get the disk geometry */ - ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY); - if (DiskGetExtendedDriveParameters(DriveNumber, &ExtGeometry, ExtGeometry.Size)) - { - DiskGeometry->BytesPerSector = ExtGeometry.BytesPerSector; - DiskGeometry->NumberOfCylinders = ExtGeometry.Cylinders; - DiskGeometry->SectorsPerTrack = ExtGeometry.SectorsPerTrack; - DiskGeometry->NumberOfHeads = ExtGeometry.Heads; - } - else if(MachDiskGetDriveGeometry(DriveNumber, &Geometry)) - { - DiskGeometry->BytesPerSector = Geometry.BytesPerSector; - DiskGeometry->NumberOfCylinders = Geometry.Cylinders; - DiskGeometry->SectorsPerTrack = Geometry.Sectors; - DiskGeometry->NumberOfHeads = Geometry.Heads; - } - else - { - DbgPrint((DPRINT_HWDETECT, "Reading disk geometry failed\n")); - MmHeapFree(PartialResourceList); - return; - } - DbgPrint((DPRINT_HWDETECT, - "Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n", - DriveNumber, - DiskGeometry->NumberOfCylinders, - DiskGeometry->NumberOfHeads, - DiskGeometry->SectorsPerTrack, - DiskGeometry->BytesPerSector)); - - FldrSetConfigurationData(DiskKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); -} - - -static VOID -SetHarddiskIdentifier(PCONFIGURATION_COMPONENT_DATA DiskKey, - ULONG DriveNumber) -{ - PMASTER_BOOT_RECORD Mbr; - ULONG *Buffer; - ULONG i; - ULONG Checksum; - ULONG Signature; - CHAR Identifier[20]; - CHAR ArcName[256]; - - /* Read the MBR */ - if (!MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER)) - { - DbgPrint((DPRINT_HWDETECT, "Reading MBR failed\n")); - return; - } - - Buffer = (ULONG*)DISKREADBUFFER; - Mbr = (PMASTER_BOOT_RECORD)DISKREADBUFFER; - - Signature = Mbr->Signature; - DbgPrint((DPRINT_HWDETECT, "Signature: %x\n", Signature)); - - /* Calculate the MBR checksum */ - Checksum = 0; - for (i = 0; i < 128; i++) - { - Checksum += Buffer[i]; - } - Checksum = ~Checksum + 1; - DbgPrint((DPRINT_HWDETECT, "Checksum: %x\n", Checksum)); - - /* Fill out the ARC disk block */ - reactos_arc_disk_info[reactos_disk_count].Signature = Signature; - reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum; - sprintf(ArcName, "multi(0)disk(0)rdisk(%lu)", reactos_disk_count); - strcpy(reactos_arc_strings[reactos_disk_count], ArcName); - reactos_arc_disk_info[reactos_disk_count].ArcName = - reactos_arc_strings[reactos_disk_count]; - reactos_disk_count++; - - /* Convert checksum and signature to identifier string */ - Identifier[0] = Hex[(Checksum >> 28) & 0x0F]; - Identifier[1] = Hex[(Checksum >> 24) & 0x0F]; - Identifier[2] = Hex[(Checksum >> 20) & 0x0F]; - Identifier[3] = Hex[(Checksum >> 16) & 0x0F]; - Identifier[4] = Hex[(Checksum >> 12) & 0x0F]; - Identifier[5] = Hex[(Checksum >> 8) & 0x0F]; - Identifier[6] = Hex[(Checksum >> 4) & 0x0F]; - Identifier[7] = Hex[Checksum & 0x0F]; - Identifier[8] = '-'; - Identifier[9] = Hex[(Signature >> 28) & 0x0F]; - Identifier[10] = Hex[(Signature >> 24) & 0x0F]; - Identifier[11] = Hex[(Signature >> 20) & 0x0F]; - Identifier[12] = Hex[(Signature >> 16) & 0x0F]; - Identifier[13] = Hex[(Signature >> 12) & 0x0F]; - Identifier[14] = Hex[(Signature >> 8) & 0x0F]; - Identifier[15] = Hex[(Signature >> 4) & 0x0F]; - Identifier[16] = Hex[Signature & 0x0F]; - Identifier[17] = '-'; - Identifier[18] = 'A'; - Identifier[19] = 0; - DbgPrint((DPRINT_HWDETECT, "Identifier: %s\n", Identifier)); - - /* Set identifier */ - FldrSetIdentifier(DiskKey, Identifier); -} - -static ULONG -GetFloppyCount(VOID) -{ - UCHAR Data; - - WRITE_PORT_UCHAR((PUCHAR)0x70, 0x10); - Data = READ_PORT_UCHAR((PUCHAR)0x71); - - return ((Data & 0xF0) ? 1 : 0) + ((Data & 0x0F) ? 1 : 0); -} - - -static UCHAR -GetFloppyType(UCHAR DriveNumber) -{ - UCHAR Data; - - WRITE_PORT_UCHAR((PUCHAR)0x70, 0x10); - Data = READ_PORT_UCHAR((PUCHAR)0x71); - - if (DriveNumber == 0) - return Data >> 4; - else if (DriveNumber == 1) - return Data & 0x0F; - - return 0; -} - - -static PVOID -GetInt1eTable(VOID) -{ - PUSHORT SegPtr = (PUSHORT)0x7A; - PUSHORT OfsPtr = (PUSHORT)0x78; - - return (PVOID)((ULONG_PTR)(((ULONG)(*SegPtr)) << 4) + (ULONG)(*OfsPtr)); -} - - -static VOID -DetectBiosFloppyPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - PCM_FLOPPY_DEVICE_DATA FloppyData; - CHAR Identifier[20]; - PCONFIGURATION_COMPONENT_DATA PeripheralKey; - ULONG Size; - ULONG FloppyNumber; - UCHAR FloppyType; - ULONG MaxDensity[6] = {0, 360, 1200, 720, 1440, 2880}; - PUCHAR Ptr; - - for (FloppyNumber = 0; FloppyNumber < 2; FloppyNumber++) - { - FloppyType = GetFloppyType(FloppyNumber); - - if ((FloppyType > 5) || (FloppyType == 0)) - continue; - - DiskResetController(FloppyNumber); - - Ptr = GetInt1eTable(); - - FldrCreateComponentKey(ControllerKey, - L"FloppyDiskPeripheral", - FloppyNumber, - PeripheralClass, - FloppyDiskPeripheral, - &PeripheralKey); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(PeripheralKey, - Input | Output, - FloppyNumber, - 0xFFFFFFFF); - - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + - sizeof(CM_FLOPPY_DEVICE_DATA); - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - memset(PartialResourceList, 0, Size); - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 1; - - PartialDescriptor = &PartialResourceList->PartialDescriptors[0]; - PartialDescriptor->Type = CmResourceTypeDeviceSpecific; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_FLOPPY_DEVICE_DATA); - - FloppyData = (PVOID)(((ULONG_PTR)PartialResourceList) + sizeof(CM_PARTIAL_RESOURCE_LIST)); - FloppyData->Version = 2; - FloppyData->Revision = 0; - FloppyData->MaxDensity = MaxDensity[FloppyType]; - FloppyData->MountDensity = 0; - RtlCopyMemory(&FloppyData->StepRateHeadUnloadTime, - Ptr, - 11); - FloppyData->MaximumTrackValue = (FloppyType == 1) ? 39 : 79; - FloppyData->DataTransferRate = 0; - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(PeripheralKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); - - /* Set 'Identifier' value */ - sprintf(Identifier, "FLOPPY%ld", FloppyNumber + 1); - FldrSetIdentifier(PeripheralKey, Identifier); - } -} - - -static VOID -DetectBiosFloppyController(PCONFIGURATION_COMPONENT_DATA BusKey, - PCONFIGURATION_COMPONENT_DATA ControllerKey) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - ULONG Size; - ULONG FloppyCount; - - FloppyCount = GetFloppyCount(); - DbgPrint((DPRINT_HWDETECT, - "Floppy count: %u\n", - FloppyCount)); - - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + - 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - memset(PartialResourceList, 0, Size); - - /* Initialize resource descriptor */ - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 3; - - /* Set IO Port */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[0]; - PartialDescriptor->Type = CmResourceTypePort; - PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; - PartialDescriptor->Flags = CM_RESOURCE_PORT_IO; - PartialDescriptor->u.Port.Start.LowPart = 0x03F0; - PartialDescriptor->u.Port.Start.HighPart = 0x0; - PartialDescriptor->u.Port.Length = 8; - - /* Set Interrupt */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[1]; - PartialDescriptor->Type = CmResourceTypeInterrupt; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; - PartialDescriptor->u.Interrupt.Level = 6; - PartialDescriptor->u.Interrupt.Vector = 6; - PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; - - /* Set DMA channel */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[2]; - PartialDescriptor->Type = CmResourceTypeDma; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->Flags = 0; - PartialDescriptor->u.Dma.Channel = 2; - PartialDescriptor->u.Dma.Port = 0; - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(ControllerKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); - - if (FloppyCount) DetectBiosFloppyPeripheral(ControllerKey); -} - -static VOID -DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA SystemKey, - PCONFIGURATION_COMPONENT_DATA BusKey) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_INT13_DRIVE_PARAMETER Int13Drives; - GEOMETRY Geometry; - PCONFIGURATION_COMPONENT_DATA DiskKey, ControllerKey; - ULONG DiskCount; - ULONG Size; - ULONG i; - BOOLEAN Changed; - - /* Count the number of visible drives */ - DiskReportError(FALSE); - DiskCount = 0; - - /* There are some really broken BIOSes out there. There are even BIOSes - * that happily report success when you ask them to read from non-existent - * harddisks. So, we set the buffer to known contents first, then try to - * read. If the BIOS reports success but the buffer contents haven't - * changed then we fail anyway */ - memset((PVOID) DISKREADBUFFER, 0xcd, 512); - while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER)) - { - Changed = FALSE; - for (i = 0; ! Changed && i < 512; i++) - { - Changed = ((PUCHAR)DISKREADBUFFER)[i] != 0xcd; - } - if (! Changed) - { - DbgPrint((DPRINT_HWDETECT, "BIOS reports success for disk %d but data didn't change\n", - (int)DiskCount)); - break; - } - DiskCount++; - memset((PVOID) DISKREADBUFFER, 0xcd, 512); - } - DiskReportError(TRUE); - DbgPrint((DPRINT_HWDETECT, "BIOS reports %d harddisk%s\n", - (int)DiskCount, (DiskCount == 1) ? "": "s")); - - FldrCreateComponentKey(BusKey, - L"DiskController", - 0, - ControllerClass, - DiskController, - &ControllerKey); - DbgPrint((DPRINT_HWDETECT, "Created key: DiskController\\0\n")); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(ControllerKey, - Output | Input | Removable, - 0, - 0xFFFFFFFF); - - DetectBiosFloppyController(BusKey, ControllerKey); - - /* Allocate resource descriptor */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + - sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount; - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - /* Initialize resource descriptor */ - memset(PartialResourceList, 0, Size); - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 1; - PartialResourceList->PartialDescriptors[0].Type = CmResourceTypeDeviceSpecific; - PartialResourceList->PartialDescriptors[0].ShareDisposition = 0; - PartialResourceList->PartialDescriptors[0].Flags = 0; - PartialResourceList->PartialDescriptors[0].u.DeviceSpecificData.DataSize = - sizeof(CM_INT13_DRIVE_PARAMETER) * DiskCount; - - /* Get harddisk Int13 geometry data */ - Int13Drives = (PVOID)(((ULONG_PTR)PartialResourceList) + sizeof(CM_PARTIAL_RESOURCE_LIST)); - for (i = 0; i < DiskCount; i++) - { - if (MachDiskGetDriveGeometry(0x80 + i, &Geometry)) - { - Int13Drives[i].DriveSelect = 0x80 + i; - Int13Drives[i].MaxCylinders = Geometry.Cylinders - 1; - Int13Drives[i].SectorsPerTrack = Geometry.Sectors; - Int13Drives[i].MaxHeads = Geometry.Heads - 1; - Int13Drives[i].NumberDrives = DiskCount; - - DbgPrint((DPRINT_HWDETECT, - "Disk %x: %u Cylinders %u Heads %u Sectors %u Bytes\n", - 0x80 + i, - Geometry.Cylinders - 1, - Geometry.Heads -1, - Geometry.Sectors, - Geometry.BytesPerSector)); - } - } - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(SystemKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); - - /* Create and fill subkey for each harddisk */ - for (i = 0; i < DiskCount; i++) - { - /* Create disk key */ - FldrCreateComponentKey(ControllerKey, - L"DiskPeripheral", - i, - PeripheralClass, - DiskPeripheral, - &DiskKey); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(DiskKey, - Output | Input, - 0, - 0xFFFFFFFF); - - /* Set disk values */ - SetHarddiskConfigurationData(DiskKey, 0x80 + i); - SetHarddiskIdentifier(DiskKey, 0x80 + i); - } -} - -static VOID -InitializeSerialPort(ULONG Port, - ULONG LineControl) -{ - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 3, 0x80); /* set DLAB on */ - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port, 0x60); /* speed LO byte */ - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 1, 0); /* speed HI byte */ - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 3, LineControl); - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 1, 0); /* set comm and DLAB to 0 */ - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, 0x09); /* DR int enable */ - READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5); /* clear error bits */ -} - - -static ULONG -DetectSerialMouse(ULONG Port) -{ - CHAR Buffer[4]; - ULONG i; - ULONG TimeOut; - UCHAR LineControl; - - /* Shutdown mouse or something like that */ - LineControl = READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4); - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, (LineControl & ~0x02) | 0x01); - StallExecutionProcessor(100000); - - /* - * Clear buffer - * Maybe there is no serial port although BIOS reported one (this - * is the case on Apple hardware), or the serial port is misbehaving, - * therefore we must give up after some time. - */ - TimeOut = 200; - while (READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5) & 0x01) - { - if (--TimeOut == 0) - return MOUSE_TYPE_NONE; - READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port); - } - - /* - * Send modem control with 'Data Terminal Ready', 'Request To Send' and - * 'Output Line 2' message. This enables mouse to identify. - */ - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, 0x0b); - - /* Wait 10 milliseconds for the mouse getting ready */ - StallExecutionProcessor(10000); - - /* Read first four bytes, which contains Microsoft Mouse signs */ - TimeOut = 200; - for (i = 0; i < 4; i++) - { - while (((READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5) & 1) == 0) && (TimeOut > 0)) - { - StallExecutionProcessor(1000); - --TimeOut; - if (TimeOut == 0) - return MOUSE_TYPE_NONE; - } - Buffer[i] = READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port); - } - - DbgPrint((DPRINT_HWDETECT, - "Mouse data: %x %x %x %x\n", - Buffer[0],Buffer[1],Buffer[2],Buffer[3])); - - /* Check that four bytes for signs */ - for (i = 0; i < 4; ++i) - { - if (Buffer[i] == 'B') - { - /* Sign for Microsoft Ballpoint */ -// DbgPrint("Microsoft Ballpoint device detected\n"); -// DbgPrint("THIS DEVICE IS NOT SUPPORTED, YET\n"); - return MOUSE_TYPE_NONE; - } - else if (Buffer[i] == 'M') - { - /* Sign for Microsoft Mouse protocol followed by button specifier */ - if (i == 3) - { - /* Overflow Error */ - return MOUSE_TYPE_NONE; - } - - switch (Buffer[i + 1]) - { - case '3': - DbgPrint((DPRINT_HWDETECT, - "Microsoft Mouse with 3-buttons detected\n")); - return MOUSE_TYPE_LOGITECH; - - case 'Z': - DbgPrint((DPRINT_HWDETECT, - "Microsoft Wheel Mouse detected\n")); - return MOUSE_TYPE_WHEELZ; - - /* case '2': */ - default: - DbgPrint((DPRINT_HWDETECT, - "Microsoft Mouse with 2-buttons detected\n")); - return MOUSE_TYPE_MICROSOFT; - } - } - } - - return MOUSE_TYPE_NONE; -} - - -static ULONG -GetSerialMousePnpId(ULONG Port, char *Buffer) -{ - ULONG TimeOut; - ULONG i = 0; - char c; - char x; - - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, 0x09); - - /* Wait 10 milliseconds for the mouse getting ready */ - StallExecutionProcessor(10000); - - WRITE_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 4, 0x0b); - - StallExecutionProcessor(10000); - - for (;;) - { - TimeOut = 200; - while (((READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5) & 1) == 0) && (TimeOut > 0)) - { - StallExecutionProcessor(1000); - --TimeOut; - if (TimeOut == 0) - { - return 0; - } - } - - c = READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port); - if (c == 0x08 || c == 0x28) - break; - } - - Buffer[i++] = c; - x = c + 1; - - for (;;) - { - TimeOut = 200; - while (((READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port + 5) & 1) == 0) && (TimeOut > 0)) - { - StallExecutionProcessor(1000); - --TimeOut; - if (TimeOut == 0) - return 0; - } - c = READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)Port); - Buffer[i++] = c; - if (c == x) - break; - if (i >= 256) - break; - } - - return i; -} - - -static VOID -DetectSerialPointerPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey, - ULONG Base) -{ - CM_PARTIAL_RESOURCE_LIST PartialResourceList; - char Buffer[256]; - CHAR Identifier[256]; - PCONFIGURATION_COMPONENT_DATA PeripheralKey; - ULONG MouseType; - ULONG Length; - ULONG i; - ULONG j; - ULONG k; - - DbgPrint((DPRINT_HWDETECT, - "DetectSerialPointerPeripheral()\n")); - - Identifier[0] = 0; - - InitializeSerialPort(Base, 2); - MouseType = DetectSerialMouse(Base); - - if (MouseType != MOUSE_TYPE_NONE) - { - Length = GetSerialMousePnpId(Base, Buffer); - DbgPrint((DPRINT_HWDETECT, - "PnP ID length: %u\n", - Length)); - - if (Length != 0) - { - /* Convert PnP sting to ASCII */ - if (Buffer[0] == 0x08) - { - for (i = 0; i < Length; i++) - Buffer[i] += 0x20; - } - Buffer[Length] = 0; - - DbgPrint((DPRINT_HWDETECT, - "PnP ID string: %s\n", - Buffer)); - - /* Copy PnpId string */ - for (i = 0; i < 7; i++) - { - Identifier[i] = Buffer[3+i]; - } - memcpy(&Identifier[7], - L" - ", - 3 * sizeof(WCHAR)); - - /* Skip device serial number */ - i = 10; - if (Buffer[i] == '\\') - { - for (j = ++i; i < Length; ++i) - { - if (Buffer[i] == '\\') - break; - } - if (i >= Length) - i -= 3; - } - - /* Skip PnP class */ - if (Buffer[i] == '\\') - { - for (j = ++i; i < Length; ++i) - { - if (Buffer[i] == '\\') - break; - } - - if (i >= Length) - i -= 3; - } - - /* Skip compatible PnP Id */ - if (Buffer[i] == '\\') - { - for (j = ++i; i < Length; ++i) - { - if (Buffer[i] == '\\') - break; - } - if (Buffer[j] == '*') - ++j; - if (i >= Length) - i -= 3; - } - - /* Get product description */ - if (Buffer[i] == '\\') - { - for (j = ++i; i < Length; ++i) - { - if (Buffer[i] == ';') - break; - } - if (i >= Length) - i -= 3; - if (i > j + 1) - { - for (k = 0; k < i - j; k++) - { - Identifier[k + 10] = Buffer[k + j]; - } - Identifier[10 + (i-j)] = 0; - } - } - - DbgPrint((DPRINT_HWDETECT, - "Identifier string: %s\n", - Identifier)); - } - - if (Length == 0 || strlen(Identifier) < 11) - { - switch (MouseType) - { - case MOUSE_TYPE_LOGITECH: - strcpy (Identifier, - "LOGITECH SERIAL MOUSE"); - break; - - case MOUSE_TYPE_WHEELZ: - strcpy (Identifier, - "MICROSOFT SERIAL MOUSE WITH WHEEL"); - break; - - case MOUSE_TYPE_MICROSOFT: - default: - strcpy (Identifier, - "MICROSOFT SERIAL MOUSE"); - break; - } - } - - /* Create 'PointerPeripheral' key */ - FldrCreateComponentKey(ControllerKey, - L"PointerPeripheral", - 0, - PeripheralClass, - PointerPeripheral, - &PeripheralKey); - DbgPrint((DPRINT_HWDETECT, - "Created key: PointerPeripheral\\0\n")); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(PeripheralKey, - Input, - 0, - 0xFFFFFFFF); - - /* Set 'Configuration Data' value */ - memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST)); - PartialResourceList.Version = 1; - PartialResourceList.Revision = 1; - PartialResourceList.Count = 0; - - FldrSetConfigurationData(PeripheralKey, - &PartialResourceList, - sizeof(CM_PARTIAL_RESOURCE_LIST) - - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); - - /* Set 'Identifier' value */ - FldrSetIdentifier(PeripheralKey, Identifier); - } -} - - -static VOID -DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - PCM_SERIAL_DEVICE_DATA SerialDeviceData; - ULONG Irq[4] = {4, 3, 4, 3}; - ULONG Base; - CHAR Buffer[80]; - PUSHORT BasePtr; - ULONG ControllerNumber = 0; - PCONFIGURATION_COMPONENT_DATA ControllerKey; - ULONG i; - ULONG Size; - - DbgPrint((DPRINT_HWDETECT, "DetectSerialPorts()\n")); - - ControllerNumber = 0; - BasePtr = (PUSHORT)0x400; - for (i = 0; i < 4; i++, BasePtr++) - { - Base = (ULONG)*BasePtr; - if (Base == 0) - continue; - - DbgPrint((DPRINT_HWDETECT, - "Found COM%u port at 0x%x\n", - i + 1, - Base)); - - /* Create controller key */ - FldrCreateComponentKey(BusKey, - L"SerialController", - ControllerNumber, - ControllerClass, - SerialController, - &ControllerKey); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(ControllerKey, - Output | Input | ConsoleIn | ConsoleOut, - ControllerNumber, - 0xFFFFFFFF); - - /* Build full device descriptor */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + - 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) + - sizeof(CM_SERIAL_DEVICE_DATA); - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - continue; - } - memset(PartialResourceList, 0, Size); - - /* Initialize resource descriptor */ - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 3; - - /* Set IO Port */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[0]; - PartialDescriptor->Type = CmResourceTypePort; - PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; - PartialDescriptor->Flags = CM_RESOURCE_PORT_IO; - PartialDescriptor->u.Port.Start.LowPart = Base; - PartialDescriptor->u.Port.Start.HighPart = 0x0; - PartialDescriptor->u.Port.Length = 7; - - /* Set Interrupt */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[1]; - PartialDescriptor->Type = CmResourceTypeInterrupt; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; - PartialDescriptor->u.Interrupt.Level = Irq[i]; - PartialDescriptor->u.Interrupt.Vector = 0; - PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; - - /* Set serial data (device specific) */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[2]; - PartialDescriptor->Type = CmResourceTypeDeviceSpecific; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->Flags = 0; - PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_SERIAL_DEVICE_DATA); - - SerialDeviceData = - (PCM_SERIAL_DEVICE_DATA)&PartialResourceList->PartialDescriptors[3]; - SerialDeviceData->BaudClock = 1843200; /* UART Clock frequency (Hertz) */ - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(ControllerKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); - - /* Set 'Identifier' value */ - sprintf(Buffer, "COM%ld", i + 1); - FldrSetIdentifier(ControllerKey, Buffer); - DbgPrint((DPRINT_HWDETECT, - "Created value: Identifier %s\n", - Buffer)); - - if (!Rs232PortInUse(Base)) - { - /* Detect serial mouse */ - DetectSerialPointerPeripheral(ControllerKey, Base); - } - - ControllerNumber++; - } -} - - -static VOID -DetectParallelPorts(PCONFIGURATION_COMPONENT_DATA BusKey) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - ULONG Irq[3] = {7, 5, (ULONG)-1}; - CHAR Buffer[80]; - PCONFIGURATION_COMPONENT_DATA ControllerKey; - PUSHORT BasePtr; - ULONG Base; - ULONG ControllerNumber; - ULONG i; - ULONG Size; - - DbgPrint((DPRINT_HWDETECT, "DetectParallelPorts() called\n")); - - ControllerNumber = 0; - BasePtr = (PUSHORT)0x408; - for (i = 0; i < 3; i++, BasePtr++) - { - Base = (ULONG)*BasePtr; - if (Base == 0) - continue; - - DbgPrint((DPRINT_HWDETECT, - "Parallel port %u: %x\n", - ControllerNumber, - Base)); - - /* Create controller key */ - FldrCreateComponentKey(BusKey, - L"ParallelController", - ControllerNumber, - ControllerClass, - ParallelController, - &ControllerKey); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(ControllerKey, - Output, - ControllerNumber, - 0xFFFFFFFF); - - /* Build full device descriptor */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST); - if (Irq[i] != (ULONG)-1) - Size += sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - continue; - } - memset(PartialResourceList, 0, Size); - - /* Initialize resource descriptor */ - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = (Irq[i] != (ULONG)-1) ? 2 : 1; - - /* Set IO Port */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[0]; - PartialDescriptor->Type = CmResourceTypePort; - PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; - PartialDescriptor->Flags = CM_RESOURCE_PORT_IO; - PartialDescriptor->u.Port.Start.LowPart = Base; - PartialDescriptor->u.Port.Start.HighPart = 0x0; - PartialDescriptor->u.Port.Length = 3; - - /* Set Interrupt */ - if (Irq[i] != (ULONG)-1) - { - PartialDescriptor = &PartialResourceList->PartialDescriptors[1]; - PartialDescriptor->Type = CmResourceTypeInterrupt; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; - PartialDescriptor->u.Interrupt.Level = Irq[i]; - PartialDescriptor->u.Interrupt.Vector = 0; - PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; - } - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(ControllerKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); - - /* Set 'Identifier' value */ - sprintf(Buffer, "PARALLEL%ld", i + 1); - FldrSetIdentifier(ControllerKey, Buffer); - DbgPrint((DPRINT_HWDETECT, - "Created value: Identifier %s\n", - Buffer)); - - ControllerNumber++; - } - - DbgPrint((DPRINT_HWDETECT, "DetectParallelPorts() done\n")); -} - - -static BOOLEAN -DetectKeyboardDevice(VOID) -{ - UCHAR Status; - UCHAR Scancode; - ULONG Loops; - BOOLEAN Result = TRUE; - - /* Identify device */ - WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, - 0xF2); - - /* Wait for reply */ - for (Loops = 0; Loops < 100; Loops++) - { - StallExecutionProcessor(10000); - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0) - break; - } - - if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0) - { - /* PC/XT keyboard or no keyboard */ - Result = FALSE; - } - - Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); - if (Scancode != 0xFA) - { - /* No ACK received */ - Result = FALSE; - } - - StallExecutionProcessor(10000); - - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0) - { - /* Found AT keyboard */ - return Result; - } - - Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); - if (Scancode != 0xAB) - { - /* No 0xAB received */ - Result = FALSE; - } - - StallExecutionProcessor(10000); - - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) == 0) - { - /* No byte in buffer */ - Result = FALSE; - } - - Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); - if (Scancode != 0x41) - { - /* No 0x41 received */ - Result = FALSE; - } - - /* Found MF-II keyboard */ - return Result; -} - - -static VOID -DetectKeyboardPeripheral(PCONFIGURATION_COMPONENT_DATA ControllerKey) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - PCM_KEYBOARD_DEVICE_DATA KeyboardData; - PCONFIGURATION_COMPONENT_DATA PeripheralKey; - ULONG Size; - - /* HACK: don't call DetectKeyboardDevice() as it fails in Qemu 0.8.2 */ - if (TRUE || DetectKeyboardDevice()) - { - /* Create controller key */ - FldrCreateComponentKey(ControllerKey, - L"KeyboardPeripheral", - 0, - PeripheralClass, - KeyboardPeripheral, - &PeripheralKey); - DbgPrint((DPRINT_HWDETECT, "Created key: KeyboardPeripheral\\0\n")); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(PeripheralKey, - Input | ConsoleIn, - 0, - 0xFFFFFFFF); - - /* Set 'Configuration Data' value */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + - sizeof(CM_KEYBOARD_DEVICE_DATA); - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - /* Initialize resource descriptor */ - memset(PartialResourceList, 0, Size); - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 1; - - PartialDescriptor = &PartialResourceList->PartialDescriptors[0]; - PartialDescriptor->Type = CmResourceTypeDeviceSpecific; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(CM_KEYBOARD_DEVICE_DATA); - - KeyboardData = (PCM_KEYBOARD_DEVICE_DATA)(PartialDescriptor + 1); - KeyboardData->Version = 1; - KeyboardData->Revision = 1; - KeyboardData->Type = 4; - KeyboardData->Subtype = 0; - KeyboardData->KeyboardFlags = 0x20; - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(PeripheralKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); - - /* Set 'Identifier' value */ - FldrSetIdentifier(PeripheralKey, "PCAT_ENHANCED"); - } -} - - -static VOID -DetectKeyboardController(PCONFIGURATION_COMPONENT_DATA BusKey) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - PCONFIGURATION_COMPONENT_DATA ControllerKey; - ULONG Size; - - /* Create controller key */ - FldrCreateComponentKey(BusKey, - L"KeyboardController", - 0, - ControllerClass, - KeyboardController, - &ControllerKey); - DbgPrint((DPRINT_HWDETECT, "Created key: KeyboardController\\0\n")); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(ControllerKey, - Input | ConsoleIn, - 0, - 0xFFFFFFFF); - - /* Set 'Configuration Data' value */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + - 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - /* Initialize resource descriptor */ - memset(PartialResourceList, 0, Size); - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 3; - - /* Set Interrupt */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[0]; - PartialDescriptor->Type = CmResourceTypeInterrupt; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; - PartialDescriptor->u.Interrupt.Level = 1; - PartialDescriptor->u.Interrupt.Vector = 0; - PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; - - /* Set IO Port 0x60 */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[1]; - PartialDescriptor->Type = CmResourceTypePort; - PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; - PartialDescriptor->Flags = CM_RESOURCE_PORT_IO; - PartialDescriptor->u.Port.Start.LowPart = 0x60; - PartialDescriptor->u.Port.Start.HighPart = 0x0; - PartialDescriptor->u.Port.Length = 1; - - /* Set IO Port 0x64 */ - PartialDescriptor = &PartialResourceList->PartialDescriptors[2]; - PartialDescriptor->Type = CmResourceTypePort; - PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; - PartialDescriptor->Flags = CM_RESOURCE_PORT_IO; - PartialDescriptor->u.Port.Start.LowPart = 0x64; - PartialDescriptor->u.Port.Start.HighPart = 0x0; - PartialDescriptor->u.Port.Length = 1; - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(ControllerKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); - - DetectKeyboardPeripheral(ControllerKey); -} - - -static VOID -PS2ControllerWait(VOID) -{ - ULONG Timeout; - UCHAR Status; - - for (Timeout = 0; Timeout < CONTROLLER_TIMEOUT; Timeout++) - { - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_INPUT_BUFFER_FULL) == 0) - return; - - /* Sleep for one millisecond */ - StallExecutionProcessor(1000); - } -} - - -static BOOLEAN -DetectPS2AuxPort(VOID) -{ -#if 1 - /* Current detection is too unreliable. Just do as if - * the PS/2 aux port is always present - */ - return TRUE; -#else - ULONG Loops; - UCHAR Status; - - /* Put the value 0x5A in the output buffer using the - * "WriteAuxiliary Device Output Buffer" command (0xD3). - * Poll the Status Register for a while to see if the value really turns up - * in the Data Register. If the KEYBOARD_STATUS_MOUSE_OBF bit is also set - * to 1 in the Status Register, we assume this controller has an - * Auxiliary Port (a.k.a. Mouse Port). - */ - PS2ControllerWait(); - WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_CONTROL, - CONTROLLER_COMMAND_WRITE_MOUSE_OUTPUT_BUFFER); - PS2ControllerWait(); - - /* 0x5A is a random dummy value */ - WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, - 0x5A); - - for (Loops = 0; Loops < 10; Loops++) - { - StallExecutionProcessor(10000); - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0) - break; - } - - READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); - - return (Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL); -#endif -} - - -static BOOLEAN -DetectPS2AuxDevice(VOID) -{ - UCHAR Scancode; - UCHAR Status; - ULONG Loops; - BOOLEAN Result = TRUE; - - PS2ControllerWait(); - WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_CONTROL, - CONTROLLER_COMMAND_WRITE_MOUSE); - PS2ControllerWait(); - - /* Identify device */ - WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, - 0xF2); - - /* Wait for reply */ - for (Loops = 0; Loops < 100; Loops++) - { - StallExecutionProcessor(10000); - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_OUTPUT_BUFFER_FULL) != 0) - break; - } - - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) - Result = FALSE; - - Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); - if (Scancode != 0xFA) - Result = FALSE; - - StallExecutionProcessor(10000); - - Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); - if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) - Result = FALSE; - - Scancode = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA); - if (Scancode != 0x00) - Result = FALSE; - - return Result; -} - - -static VOID -DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey) -{ - CM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCONFIGURATION_COMPONENT_DATA ControllerKey; - PCONFIGURATION_COMPONENT_DATA PeripheralKey; - - if (DetectPS2AuxPort()) - { - DbgPrint((DPRINT_HWDETECT, "Detected PS2 port\n")); - - /* Create controller key */ - FldrCreateComponentKey(BusKey, - L"PointerController", - 0, - ControllerClass, - PointerController, - &ControllerKey); - DbgPrint((DPRINT_HWDETECT, "Created key: PointerController\\0\n")); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(ControllerKey, - Input, - 0, - 0xFFFFFFFF); - - memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST)); - - /* Initialize resource descriptor */ - PartialResourceList.Version = 1; - PartialResourceList.Revision = 1; - PartialResourceList.Count = 1; - - /* Set Interrupt */ - PartialResourceList.PartialDescriptors[0].Type = CmResourceTypeInterrupt; - PartialResourceList.PartialDescriptors[0].ShareDisposition = CmResourceShareUndetermined; - PartialResourceList.PartialDescriptors[0].Flags = CM_RESOURCE_INTERRUPT_LATCHED; - PartialResourceList.PartialDescriptors[0].u.Interrupt.Level = 12; - PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 0; - PartialResourceList.PartialDescriptors[0].u.Interrupt.Affinity = 0xFFFFFFFF; - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(ControllerKey, - &PartialResourceList, - sizeof(CM_PARTIAL_RESOURCE_LIST)); - - if (DetectPS2AuxDevice()) - { - DbgPrint((DPRINT_HWDETECT, "Detected PS2 mouse\n")); - - /* Create peripheral key */ - FldrCreateComponentKey(ControllerKey, - L"PointerPeripheral", - 0, - ControllerClass, - PointerPeripheral, - &PeripheralKey); - DbgPrint((DPRINT_HWDETECT, "Created key: PointerPeripheral\\0\n")); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(PeripheralKey, - Input, - 0, - 0xFFFFFFFF); - - /* Initialize resource descriptor */ - memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST)); - PartialResourceList.Version = 1; - PartialResourceList.Revision = 1; - PartialResourceList.Count = 0; - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(PeripheralKey, - &PartialResourceList, - sizeof(CM_PARTIAL_RESOURCE_LIST) - - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); - - /* Set 'Identifier' value */ - FldrSetIdentifier(PeripheralKey, "MICROSOFT PS2 MOUSE"); - } - } -} - - -static VOID -DetectDisplayController(PCONFIGURATION_COMPONENT_DATA BusKey) -{ - CHAR Buffer[80]; - PCONFIGURATION_COMPONENT_DATA ControllerKey; - USHORT VesaVersion; - - FldrCreateComponentKey(BusKey, - L"DisplayController", - 0, - ControllerClass, - DisplayController, - &ControllerKey); - DbgPrint((DPRINT_HWDETECT, "Created key: DisplayController\\0\n")); - - /* Set 'ComponentInformation' value */ - FldrSetComponentInformation(ControllerKey, - 0x00, - 0, - 0xFFFFFFFF); - - /* FIXME: Set 'ComponentInformation' value */ - - VesaVersion = BiosIsVesaSupported(); - if (VesaVersion != 0) - { - DbgPrint((DPRINT_HWDETECT, - "VESA version %c.%c\n", - (VesaVersion >> 8) + '0', - (VesaVersion & 0xFF) + '0')); - } - else - { - DbgPrint((DPRINT_HWDETECT, - "VESA not supported\n")); - } - - if (VesaVersion >= 0x0200) - { - strcpy(Buffer, - "VBE Display"); - } - else - { - strcpy(Buffer, - "VGA Display"); - } - - /* Set 'Identifier' value */ - FldrSetIdentifier(ControllerKey, Buffer); - - /* FIXME: Add display peripheral (monitor) data */ -} - - -static VOID -DetectIsaBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCONFIGURATION_COMPONENT_DATA BusKey; - ULONG Size; - - /* Create new bus key */ - FldrCreateComponentKey(SystemKey, - L"MultifunctionAdapter", - *BusNumber, - AdapterClass, - MultiFunctionAdapter, - &BusKey); - - /* Set 'Component Information' value similar to my NT4 box */ - FldrSetComponentInformation(BusKey, - 0x0, - 0x0, - 0xFFFFFFFF); - - /* Increment bus number */ - (*BusNumber)++; - - /* Set 'Identifier' value */ - FldrSetIdentifier(BusKey, "ISA"); - - /* Set 'Configuration Data' value */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) - - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - PartialResourceList = MmHeapAlloc(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - /* Initialize resource descriptor */ - memset(PartialResourceList, 0, Size); - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 0; - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(BusKey, PartialResourceList, Size); - MmHeapFree(PartialResourceList); - - /* Detect ISA/BIOS devices */ - DetectBiosDisks(SystemKey, BusKey); - - DetectSerialPorts(BusKey); - - DetectParallelPorts(BusKey); - - DetectKeyboardController(BusKey); - - DetectPS2Mouse(BusKey); - - DetectDisplayController(BusKey); - - /* FIXME: Detect more ISA devices */ -} - - -PCONFIGURATION_COMPONENT_DATA -PcHwDetect(VOID) -{ - PCONFIGURATION_COMPONENT_DATA SystemKey; - ULONG BusNumber = 0; - - DbgPrint((DPRINT_HWDETECT, "DetectHardware()\n")); - - /* Create the 'System' key */ - FldrCreateSystemKey(&SystemKey); - - /* Set empty component information */ - FldrSetComponentInformation(SystemKey, - 0x0, - 0x0, - 0xFFFFFFFF); - - /* Detect buses */ - DetectPciBios(SystemKey, &BusNumber); - DetectApmBios(SystemKey, &BusNumber); - DetectPnpBios(SystemKey, &BusNumber); - DetectIsaBios(SystemKey, &BusNumber); - DetectAcpiBios(SystemKey, &BusNumber); - - DbgPrint((DPRINT_HWDETECT, "DetectHardware() Done\n")); - - return SystemKey; -} - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/hwacpi.c b/reactos/boot/freeldr/freeldr/arch/amd64/hwacpi.c deleted file mode 100644 index cc7cdcd19af..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/hwacpi.c +++ /dev/null @@ -1,5 +0,0 @@ -/* No need to duplicate code ; import the i386 version */ - -#include "../i386/hwacpi.c" - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/hwapm.c b/reactos/boot/freeldr/freeldr/arch/amd64/hwapm.c deleted file mode 100644 index 4296c76164c..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/hwapm.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * FreeLoader - * - * Copyright (C) 2004 Eric Kohl - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#define NDEBUG -#include - -static BOOLEAN -FindApmBios(VOID) -{ - REGS RegsIn; - REGS RegsOut; - - RegsIn.b.ah = 0x53; - RegsIn.b.al = 0x00; - RegsIn.w.bx = 0x0000; - - Int386(0x15, &RegsIn, &RegsOut); - - if (INT386_SUCCESS(RegsOut)) - { - DbgPrint((DPRINT_HWDETECT, "Found APM BIOS\n")); - DbgPrint((DPRINT_HWDETECT, "AH: %x\n", RegsOut.b.ah)); - DbgPrint((DPRINT_HWDETECT, "AL: %x\n", RegsOut.b.al)); - DbgPrint((DPRINT_HWDETECT, "BH: %x\n", RegsOut.b.bh)); - DbgPrint((DPRINT_HWDETECT, "BL: %x\n", RegsOut.b.bl)); - DbgPrint((DPRINT_HWDETECT, "CX: %x\n", RegsOut.w.cx)); - - return TRUE; - } - - DbgPrint((DPRINT_HWDETECT, "No APM BIOS found\n")); - - return FALSE; -} - - -VOID -DetectApmBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) -{ - PCONFIGURATION_COMPONENT_DATA BiosKey; - CM_PARTIAL_RESOURCE_LIST PartialResourceList; - - if (FindApmBios()) - { - /* Create new bus key */ - FldrCreateComponentKey(SystemKey, - L"MultifunctionAdapter", - *BusNumber, - AdapterClass, - MultiFunctionAdapter, - &BiosKey); - - /* Set 'Component Information' */ - FldrSetComponentInformation(BiosKey, - 0x0, - 0x0, - 0xFFFFFFFF); - - /* Set 'Configuration Data' value */ - memset(&PartialResourceList, 0, sizeof(CM_PARTIAL_RESOURCE_LIST)); - PartialResourceList.Version = 0; - PartialResourceList.Revision = 0; - PartialResourceList.Count = 0; - FldrSetConfigurationData(BiosKey, - &PartialResourceList, - sizeof(CM_PARTIAL_RESOURCE_LIST) - - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); - - /* Increment bus number */ - (*BusNumber)++; - - /* Set 'Identifier' value */ - FldrSetIdentifier(BiosKey, "APM"); - } - - /* FIXME: Add configuration data */ -} - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/hwpci.c b/reactos/boot/freeldr/freeldr/arch/amd64/hwpci.c deleted file mode 100644 index de293334c5f..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/hwpci.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * FreeLoader - * - * Copyright (C) 2004 Eric Kohl - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#define NDEBUG -#include - -typedef struct _ROUTING_SLOT -{ - UCHAR BusNumber; - UCHAR DeviceNumber; - UCHAR LinkA; - USHORT BitmapA; - UCHAR LinkB; - USHORT BitmapB; - UCHAR LinkC; - USHORT BitmapC; - UCHAR LinkD; - USHORT BitmapD; - UCHAR SlotNumber; - UCHAR Reserved; -} __attribute__((packed)) ROUTING_SLOT, *PROUTING_SLOT; - -typedef struct _PCI_IRQ_ROUTING_TABLE -{ - ULONG Signature; - USHORT Version; - USHORT Size; - UCHAR RouterBus; - UCHAR RouterSlot; - USHORT ExclusiveIRQs; - ULONG CompatibleRouter; - ULONG MiniportData; - UCHAR Reserved[11]; - UCHAR Checksum; - ROUTING_SLOT Slot[1]; -} __attribute__((packed)) PCI_IRQ_ROUTING_TABLE, *PPCI_IRQ_ROUTING_TABLE; - -typedef struct _PCI_REGISTRY_INFO -{ - UCHAR MajorRevision; - UCHAR MinorRevision; - UCHAR NoBuses; - UCHAR HardwareMechanism; -} PCI_REGISTRY_INFO, *PPCI_REGISTRY_INFO; - -static PPCI_IRQ_ROUTING_TABLE -GetPciIrqRoutingTable(VOID) -{ - PPCI_IRQ_ROUTING_TABLE Table; - PUCHAR Ptr; - ULONG Sum; - ULONG i; - - Table = (PPCI_IRQ_ROUTING_TABLE)0xF0000; - while ((ULONG_PTR)Table < 0x100000) - { - if (Table->Signature == 0x52495024) - { - DbgPrint((DPRINT_HWDETECT, - "Found signature\n")); - - Ptr = (PUCHAR)Table; - Sum = 0; - for (i = 0; i < Table->Size; i++) - { - Sum += Ptr[i]; - } - - if ((Sum & 0xFF) != 0) - { - DbgPrint((DPRINT_HWDETECT, - "Invalid routing table\n")); - return NULL; - } - - DbgPrint((DPRINT_HWDETECT, - "Valid checksum\n")); - - return Table; - } - - Table = (PPCI_IRQ_ROUTING_TABLE)((ULONG_PTR)Table + 0x10); - } - - return NULL; -} - - -static BOOLEAN -FindPciBios(PPCI_REGISTRY_INFO BusData) -{ - REGS RegsIn; - REGS RegsOut; - - RegsIn.b.ah = 0xB1; /* Subfunction B1h */ - RegsIn.b.al = 0x01; /* PCI BIOS present */ - - Int386(0x1A, &RegsIn, &RegsOut); - - if (INT386_SUCCESS(RegsOut) && RegsOut.d.edx == 0x20494350 && RegsOut.b.ah == 0) - { - DbgPrint((DPRINT_HWDETECT, "Found PCI bios\n")); - - DbgPrint((DPRINT_HWDETECT, "AL: %x\n", RegsOut.b.al)); - DbgPrint((DPRINT_HWDETECT, "BH: %x\n", RegsOut.b.bh)); - DbgPrint((DPRINT_HWDETECT, "BL: %x\n", RegsOut.b.bl)); - DbgPrint((DPRINT_HWDETECT, "CL: %x\n", RegsOut.b.cl)); - - BusData->NoBuses = RegsOut.b.cl + 1; - BusData->MajorRevision = RegsOut.b.bh; - BusData->MinorRevision = RegsOut.b.bl; - BusData->HardwareMechanism = RegsOut.b.cl; - - return TRUE; - } - - - DbgPrint((DPRINT_HWDETECT, "No PCI bios found\n")); - - return FALSE; -} - - -static VOID -DetectPciIrqRoutingTable(PCONFIGURATION_COMPONENT_DATA BusKey) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - PPCI_IRQ_ROUTING_TABLE Table; - PCONFIGURATION_COMPONENT_DATA TableKey; - ULONG Size; - - Table = GetPciIrqRoutingTable(); - if (Table != NULL) - { - DbgPrint((DPRINT_HWDETECT, "Table size: %u\n", Table->Size)); - - FldrCreateComponentKey(BusKey, - L"RealModeIrqRoutingTable", - 0, - PeripheralClass, - RealModeIrqRoutingTable, - &TableKey); - - /* Set 'Component Information' */ - FldrSetComponentInformation(TableKey, - 0x0, - 0x0, - 0xFFFFFFFF); - - /* Set 'Identifier' value */ - FldrSetIdentifier(TableKey, "PCI Real-mode IRQ Routing Table"); - - /* Set 'Configuration Data' value */ - Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors) + - 2 * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) + Table->Size; - PartialResourceList = MmAllocateMemory(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - /* Initialize resource descriptor */ - memset(PartialResourceList, 0, Size); - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 2; - - PartialDescriptor = &PartialResourceList->PartialDescriptors[0]; - PartialDescriptor->Type = CmResourceTypeBusNumber; - PartialDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; - PartialDescriptor->u.BusNumber.Start = 0; - PartialDescriptor->u.BusNumber.Length = 1; - - PartialDescriptor = &PartialResourceList->PartialDescriptors[1]; - PartialDescriptor->Type = CmResourceTypeDeviceSpecific; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->u.DeviceSpecificData.DataSize = Table->Size; - - memcpy(&PartialResourceList->PartialDescriptors[2], - Table, Table->Size); - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(TableKey, PartialResourceList, Size); - MmFreeMemory(PartialResourceList); - } -} - - -VOID -DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) -{ - PCM_PARTIAL_RESOURCE_LIST PartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; - PCI_REGISTRY_INFO BusData; - PCONFIGURATION_COMPONENT_DATA BiosKey; - ULONG Size; - PCONFIGURATION_COMPONENT_DATA BusKey; - ULONG i; - CHAR szPci[] = "PCI"; - - /* Report the PCI BIOS */ - if (FindPciBios(&BusData)) - { - /* Create new bus key */ - FldrCreateComponentKey(SystemKey, - L"MultifunctionAdapter", - *BusNumber, - AdapterClass, - MultiFunctionAdapter, - &BiosKey); - - /* Set 'Component Information' */ - FldrSetComponentInformation(BiosKey, - 0x0, - 0x0, - 0xFFFFFFFF); - - /* Increment bus number */ - (*BusNumber)++; - - /* Set 'Identifier' value */ - FldrSetIdentifier(BiosKey, "PCI BIOS"); - - /* Set 'Configuration Data' value */ - Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, - PartialDescriptors); - PartialResourceList = MmAllocateMemory(Size); - if (PartialResourceList == NULL) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - /* Initialize resource descriptor */ - memset(PartialResourceList, 0, Size); - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(BiosKey, PartialResourceList, Size); - MmFreeMemory(PartialResourceList); - - DetectPciIrqRoutingTable(BiosKey); - - /* Report PCI buses */ - for (i = 0; i < (ULONG)BusData.NoBuses; i++) - { - /* Create the bus key */ - FldrCreateComponentKey(SystemKey, - L"MultifunctionAdapter", - *BusNumber, - AdapterClass, - MultiFunctionAdapter, - &BusKey); - - /* Set 'Component Information' */ - FldrSetComponentInformation(BusKey, - 0x0, - 0x0, - 0xFFFFFFFF); - - /* Check if this is the first bus */ - if (i == 0) - { - /* Set 'Configuration Data' value */ - Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, - PartialDescriptors) + - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) + - sizeof(PCI_REGISTRY_INFO); - PartialResourceList = MmAllocateMemory(Size); - if (!PartialResourceList) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - /* Initialize resource descriptor */ - memset(PartialResourceList, 0, Size); - PartialResourceList->Version = 1; - PartialResourceList->Revision = 1; - PartialResourceList->Count = 1; - PartialDescriptor = &PartialResourceList->PartialDescriptors[0]; - PartialDescriptor->Type = CmResourceTypeDeviceSpecific; - PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; - PartialDescriptor->u.DeviceSpecificData.DataSize = sizeof(PCI_REGISTRY_INFO); - memcpy(&PartialResourceList->PartialDescriptors[1], - &BusData, - sizeof(PCI_REGISTRY_INFO)); - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(BusKey, PartialResourceList, Size); - MmFreeMemory(PartialResourceList); - } - else - { - /* Set 'Configuration Data' value */ - Size = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, - PartialDescriptors); - PartialResourceList = MmAllocateMemory(Size); - if (!PartialResourceList) - { - DbgPrint((DPRINT_HWDETECT, - "Failed to allocate resource descriptor\n")); - return; - } - - /* Initialize resource descriptor */ - memset(PartialResourceList, 0, Size); - - /* Set 'Configuration Data' value */ - FldrSetConfigurationData(BusKey, PartialResourceList, Size); - MmFreeMemory(PartialResourceList); - } - - /* Increment bus number */ - (*BusNumber)++; - - /* Set 'Identifier' value */ - FldrSetIdentifier(BusKey, szPci); - } - } -} - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386disk.c b/reactos/boot/freeldr/freeldr/arch/amd64/i386disk.c deleted file mode 100644 index 3a0874c84d3..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386disk.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * FreeLoader - * Copyright (C) 1998-2003 Brian Palmer - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#define NDEBUG -#include - -///////////////////////////////////////////////////////////////////////////////////////////// -// FUNCTIONS -///////////////////////////////////////////////////////////////////////////////////////////// - -BOOLEAN DiskResetController(ULONG DriveNumber) -{ - REGS RegsIn; - REGS RegsOut; - - DbgPrint((DPRINT_DISK, "DiskResetController(0x%x) DISK OPERATION FAILED -- RESETTING CONTROLLER\n", DriveNumber)); - - // BIOS Int 13h, function 0 - Reset disk system - // AH = 00h - // DL = drive (if bit 7 is set both hard disks and floppy disks reset) - // Return: - // AH = status - // CF clear if successful - // CF set on error - RegsIn.b.ah = 0x00; - RegsIn.b.dl = DriveNumber; - - // Reset the disk controller - Int386(0x13, &RegsIn, &RegsOut); - - return INT386_SUCCESS(RegsOut); -} - -BOOLEAN DiskInt13ExtensionsSupported(ULONG DriveNumber) -{ - REGS RegsIn; - REGS RegsOut; - - DbgPrint((DPRINT_DISK, "DiskInt13ExtensionsSupported()\n")); - - // IBM/MS INT 13 Extensions - INSTALLATION CHECK - // AH = 41h - // BX = 55AAh - // DL = drive (80h-FFh) - // Return: - // CF set on error (extensions not supported) - // AH = 01h (invalid function) - // CF clear if successful - // BX = AA55h if installed - // AH = major version of extensions - // 01h = 1.x - // 20h = 2.0 / EDD-1.0 - // 21h = 2.1 / EDD-1.1 - // 30h = EDD-3.0 - // AL = internal use - // CX = API subset support bitmap - // DH = extension version (v2.0+ ??? -- not present in 1.x) - // - // Bitfields for IBM/MS INT 13 Extensions API support bitmap - // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported - // Bit 1, removable drive controller functions (AH=45h,46h,48h,49h,INT 15/AH=52h) supported - // Bit 2, enhanced disk drive (EDD) functions (AH=48h,AH=4Eh) supported - // extended drive parameter table is valid - // Bits 3-15 reserved - RegsIn.b.ah = 0x41; - RegsIn.w.bx = 0x55AA; - RegsIn.b.dl = DriveNumber; - - // Reset the disk controller - Int386(0x13, &RegsIn, &RegsOut); - - if (!INT386_SUCCESS(RegsOut)) - { - // CF set on error (extensions not supported) - return FALSE; - } - - if (RegsOut.w.bx != 0xAA55) - { - // BX = AA55h if installed - return FALSE; - } - - // Note: - // The original check is too strict because some BIOSes report that - // extended disk access functions are not suported when booting - // from a CD (e.g. Phoenix BIOS v6.00PG). Argh! -#if 0 - if (!(RegsOut.w.cx & 0x0001)) - { - // CX = API subset support bitmap - // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported - return FALSE; - } -#endif - - // Use this relaxed check instead - if (RegsOut.w.cx == 0x0000) - { - // CX = API subset support bitmap - return FALSE; - } - - return TRUE; -} - -VOID DiskStopFloppyMotor(VOID) -{ - WRITE_PORT_UCHAR((PUCHAR)0x3F2, 0); -} - -BOOLEAN DiskGetExtendedDriveParameters(ULONG DriveNumber, PVOID Buffer, USHORT BufferSize) -{ - REGS RegsIn; - REGS RegsOut; - PUSHORT Ptr = (PUSHORT)(BIOSCALLBUFFER); - - DbgPrint((DPRINT_DISK, "DiskGetExtendedDriveParameters()\n")); - - // Initialize transfer buffer - *Ptr = BufferSize; - - // BIOS Int 13h, function 48h - Get drive parameters - // AH = 48h - // DL = drive (bit 7 set for hard disk) - // DS:SI = result buffer - // Return: - // CF set on error - // AH = status (07h) - // CF clear if successful - // AH = 00h - // DS:SI -> result buffer - RegsIn.b.ah = 0x48; - RegsIn.b.dl = DriveNumber; - RegsIn.x.ds = BIOSCALLBUFSEGMENT; // DS:SI -> result buffer - RegsIn.w.si = BIOSCALLBUFOFFSET; - - // Get drive parameters - Int386(0x13, &RegsIn, &RegsOut); - - if (!INT386_SUCCESS(RegsOut)) - { - return FALSE; - } - - memcpy(Buffer, Ptr, BufferSize); - - DbgPrint((DPRINT_DISK, "size of buffer: %x\n", Ptr[0])); - DbgPrint((DPRINT_DISK, "information flags: %x\n", Ptr[1])); - DbgPrint((DPRINT_DISK, "number of physical cylinders on drive: %u\n", *(PULONG)&Ptr[2])); - DbgPrint((DPRINT_DISK, "number of physical heads on drive: %u\n", *(PULONG)&Ptr[4])); - DbgPrint((DPRINT_DISK, "number of physical sectors per track: %u\n", *(PULONG)&Ptr[6])); - DbgPrint((DPRINT_DISK, "total number of sectors on drive: %I64u\n", *(unsigned long long*)&Ptr[8])); - DbgPrint((DPRINT_DISK, "bytes per sector: %u\n", Ptr[12])); - if (Ptr[0] >= 0x1e) - { - DbgPrint((DPRINT_DISK, "EED configuration parameters: %x:%x\n", Ptr[13], Ptr[14])); - if (Ptr[13] != 0xffff && Ptr[14] != 0xffff) - { - PUCHAR SpecPtr = (PUCHAR)(ULONG_PTR)((Ptr[13] << 4) + Ptr[14]); - DbgPrint((DPRINT_DISK, "SpecPtr: %x\n", SpecPtr)); - DbgPrint((DPRINT_DISK, "physical I/O port base address: %x\n", *(PUSHORT)&SpecPtr[0])); - DbgPrint((DPRINT_DISK, "disk-drive control port address: %x\n", *(PUSHORT)&SpecPtr[2])); - DbgPrint((DPRINT_DISK, "drive flags: %x\n", SpecPtr[4])); - DbgPrint((DPRINT_DISK, "proprietary information: %x\n", SpecPtr[5])); - DbgPrint((DPRINT_DISK, "IRQ for drive: %u\n", SpecPtr[6])); - DbgPrint((DPRINT_DISK, "sector count for multi-sector transfers: %u\n", SpecPtr[7])); - DbgPrint((DPRINT_DISK, "DMA control: %x\n", SpecPtr[8])); - DbgPrint((DPRINT_DISK, "programmed I/O control: %x\n", SpecPtr[9])); - DbgPrint((DPRINT_DISK, "drive options: %x\n", *(PUSHORT)&SpecPtr[10])); - } - } - if (Ptr[0] >= 0x42) - { - DbgPrint((DPRINT_DISK, "signature: %x\n", Ptr[15])); - } - - return TRUE; -} - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386rtl.c b/reactos/boot/freeldr/freeldr/arch/amd64/i386rtl.c deleted file mode 100644 index ff3ac988a37..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386rtl.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * FreeLoader - * Copyright (C) 1998-2003 Brian Palmer - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -void PcBeep(void) -{ - sound(700); - delay(200); - sound(0); -} - -void delay(unsigned msec) -{ - REGS Regs; - unsigned usec; - unsigned msec_this; - - // Int 15h AH=86h - // BIOS - WAIT (AT,PS) - // - // AH = 86h - // CX:DX = interval in microseconds - // Return: - // CF clear if successful (wait interval elapsed) - // CF set on error or AH=83h wait already in progress - // AH = status (see #00496) - - // Note: The resolution of the wait period is 977 microseconds on - // many systems because many BIOSes use the 1/1024 second fast - // interrupt from the AT real-time clock chip which is available on INT 70; - // because newer BIOSes may have much more precise timers available, it is - // not possible to use this function accurately for very short delays unless - // the precise behavior of the BIOS is known (or found through testing) - - while (msec) - { - msec_this = msec; - - if (msec_this > 4000) - { - msec_this = 4000; - } - - usec = msec_this * 1000; - - Regs.b.ah = 0x86; - Regs.w.cx = usec >> 16; - Regs.w.dx = usec & 0xffff; - Int386(0x15, &Regs, &Regs); - - msec -= msec_this; - } -} - -void sound(int freq) -{ - int scale; - - if (freq == 0) - { - WRITE_PORT_UCHAR((PUCHAR)0x61, READ_PORT_UCHAR((PUCHAR)0x61) & ~3); - return; - } - - scale = 1193046 / freq; - WRITE_PORT_UCHAR((PUCHAR)0x43, 0xb6); - WRITE_PORT_UCHAR((PUCHAR)0x42, scale & 0xff); - WRITE_PORT_UCHAR((PUCHAR)0x42, scale >> 8); - WRITE_PORT_UCHAR((PUCHAR)0x61, READ_PORT_UCHAR((PUCHAR)0x61) | 3); -} diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/i386vid.c b/reactos/boot/freeldr/freeldr/arch/amd64/i386vid.c deleted file mode 100644 index 1c33ee6804e..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/i386vid.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - * FreeLoader - * Copyright (C) 1998-2003 Brian Palmer - * Portions from Linux video.S - Display adapter & video mode setup, version 2.13 (14-May-99) - * Copyright (C) 1995 -- 1999 Martin Mares - * Based on the original setup.S code (C) Linus Torvalds and Mats Anderson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#define NDEBUG -#include - -typedef struct -{ - UCHAR Signature[4]; // (ret) signature ("VESA") - // (call) VESA 2.0 request signature ("VBE2"), required to receive - // version 2.0 info - USHORT VesaVersion; // VESA version number (one-digit minor version -- 0102h = v1.2) - ULONG OemNamePtr; // pointer to OEM name - // "761295520" for ATI - ULONG Capabilities; // capabilities flags (see #00078) - ULONG SupportedModeListPtr; // pointer to list of supported VESA and OEM video modes - // (list of words terminated with FFFFh) - USHORT TotalVideoMemory; // total amount of video memory in 64K blocks - - // ---VBE v1.x --- - //UCHAR Reserved[236]; - - // ---VBE v2.0 --- - USHORT OemSoftwareVersion; // OEM software version (BCD, high byte = major, low byte = minor) - ULONG VendorNamePtr; // pointer to vendor name - ULONG ProductNamePtr; // pointer to product name - ULONG ProductRevisionStringPtr; // pointer to product revision string - USHORT VBE_AF_Version; // (if capabilities bit 3 set) VBE/AF version (BCD) - // 0100h for v1.0P - ULONG AcceleratedModeListPtr; // (if capabilities bit 3 set) pointer to list of supported - // accelerated video modes (list of words terminated with FFFFh) - UCHAR Reserved[216]; // reserved for VBE implementation - UCHAR ScratchPad[256]; // OEM scratchpad (for OEM strings, etc.) -} PACKED VESA_SVGA_INFO, *PVESA_SVGA_INFO; - -// Bitfields for VESA capabilities: -// -// Bit(s) Description (Table 00078) -// 0 DAC can be switched into 8-bit mode -// 1 non-VGA controller -// 2 programmed DAC with blank bit (i.e. only during blanking interval) -// 3 (VBE v3.0) controller supports hardware stereoscopic signalling -// 3 controller supports VBE/AF v1.0P extensions -// 4 (VBE v3.0) if bit 3 set: -// =0 stereo signalling via external VESA stereo connector -// =1 stereo signalling via VESA EVC connector -// 4 (VBE/AF v1.0P) must call EnableDirectAccess to access framebuffer -// 5 (VBE/AF v1.0P) controller supports hardware mouse cursor -// 6 (VBE/AF v1.0P) controller supports hardware clipping -// 7 (VBE/AF v1.0P) controller supports transparent BitBLT -// 8-31 reserved (0) - -// Notes: The list of supported video modes is stored in the reserved -// portion of the SuperVGA information record by some implementations, -// and it may thus be necessary to either copy the mode list or use a -// different buffer for all subsequent VESA calls. Not all of the video -// modes in the list of mode numbers may be supported, e.g. if they require -// more memory than currently installed or are not supported by the -// attached monitor. Check any mode you intend to use through AX=4F01h first.. -// The 1.1 VESA document specifies 242 reserved bytes at the end, so the -// buffer should be 262 bytes to ensure that it is not overrun; for v2.0, -// the buffer should be 512 bytes. The S3 specific video modes will most -// likely follow the FFFFh terminator at the end of the standard modes. -// A search must then be made to find them, FFFFh will also terminate this -// second list. In some cases, only a "stub" VBE may be present, supporting -// only AX=4F00h; this case may be assumed if the list of supported video modes -// is empty (consisting of a single word of FFFFh) -#if 0 -static VOID BiosSetVideoFont8x16(VOID) -{ - REGS Regs; - - // Int 10h AX=1114h - // VIDEO - TEXT-MODE CHARGEN - LOAD ROM 8x16 CHARACTER SET (VGA) - // - // AX = 1114h - // BL = block to load - // Return: - // Nothing - Regs.w.ax = 0x1114; - Regs.b.bl = 0; - Int386(0x10, &Regs, &Regs); -} - -static VOID VideoSetTextCursorPosition(ULONG X, ULONG Y) -{ -} - -static ULONG VideoGetTextCursorPositionX(VOID) -{ - REGS Regs; - - // Int 10h AH=03h - // VIDEO - GET CURSOR POSITION AND SIZE - // - // AH = 03h - // BH = page number - // 0-3 in modes 2&3 - // 0-7 in modes 0&1 - // 0 in graphics modes - // Return: - // AX = 0000h (Phoenix BIOS) - // CH = start scan line - // CL = end scan line - // DH = row (00h is top) - // DL = column (00h is left) - Regs.b.ah = 0x03; - Regs.b.bh = 0x00; - Int386(0x10, &Regs, &Regs); - - return Regs.b.dl; -} - -static ULONG VideoGetTextCursorPositionY(VOID) -{ - REGS Regs; - - // Int 10h AH=03h - // VIDEO - GET CURSOR POSITION AND SIZE - // - // AH = 03h - // BH = page number - // 0-3 in modes 2&3 - // 0-7 in modes 0&1 - // 0 in graphics modes - // Return: - // AX = 0000h (Phoenix BIOS) - // CH = start scan line - // CL = end scan line - // DH = row (00h is top) - // DL = column (00h is left) - Regs.b.ah = 0x03; - Regs.b.bh = 0x00; - Int386(0x10, &Regs, &Regs); - - return Regs.b.dh; -} -#endif - -USHORT BiosIsVesaSupported(VOID) -{ - REGS Regs; - PVESA_SVGA_INFO SvgaInfo = (PVESA_SVGA_INFO)BIOSCALLBUFFER; - //USHORT* VideoModes; - //USHORT Index; - - DbgPrint((DPRINT_UI, "BiosIsVesaSupported()\n")); - - RtlZeroMemory(SvgaInfo, sizeof(VESA_SVGA_INFO)); - - // Make sure we receive version 2.0 info - SvgaInfo->Signature[0] = 'V'; - SvgaInfo->Signature[1] = 'B'; - SvgaInfo->Signature[2] = 'E'; - SvgaInfo->Signature[3] = '2'; - - // Int 10h AX=4F00h - // VESA SuperVGA BIOS (VBE) - GET SuperVGA INFORMATION - // - // AX = 4F00h - // ES:DI -> buffer for SuperVGA information (see #00077) - // Return: - // AL = 4Fh if function supported - // AH = status - // 00h successful - // ES:DI buffer filled - // 01h failed - // ---VBE v2.0--- - // 02h function not supported by current hardware configuration - // 03h function invalid in current video mode - // - // Determine whether VESA BIOS extensions are present and the - // capabilities supported by the display adapter - // - // Installation check;VESA SuperVGA - Regs.w.ax = 0x4F00; - Regs.w.es = BIOSCALLBUFSEGMENT; - Regs.w.di = BIOSCALLBUFOFFSET; - Int386(0x10, &Regs, &Regs); - - DbgPrint((DPRINT_UI, "AL = 0x%x\n", Regs.b.al)); - DbgPrint((DPRINT_UI, "AH = 0x%x\n", Regs.b.ah)); - - if (Regs.w.ax != 0x004F) - { - DbgPrint((DPRINT_UI, "Failed.\n")); - return 0x0000; - } - - DbgPrint((DPRINT_UI, "Supported.\n")); - DbgPrint((DPRINT_UI, "SvgaInfo->Signature[4] = %c%c%c%c\n", SvgaInfo->Signature[0], SvgaInfo->Signature[1], SvgaInfo->Signature[2], SvgaInfo->Signature[3])); - DbgPrint((DPRINT_UI, "SvgaInfo->VesaVersion = v%d.%d\n", ((SvgaInfo->VesaVersion >> 8) & 0xFF), (SvgaInfo->VesaVersion & 0xFF))); - DbgPrint((DPRINT_UI, "SvgaInfo->OemNamePtr = 0x%x\n", SvgaInfo->OemNamePtr)); - DbgPrint((DPRINT_UI, "SvgaInfo->Capabilities = 0x%x\n", SvgaInfo->Capabilities)); - DbgPrint((DPRINT_UI, "SvgaInfo->VideoMemory = %dK\n", SvgaInfo->TotalVideoMemory * 64)); - DbgPrint((DPRINT_UI, "---VBE v2.0 ---\n")); - DbgPrint((DPRINT_UI, "SvgaInfo->OemSoftwareVersion = v%d.%d\n", ((SvgaInfo->OemSoftwareVersion >> 8) & 0x0F) + (((SvgaInfo->OemSoftwareVersion >> 12) & 0x0F) * 10), (SvgaInfo->OemSoftwareVersion & 0x0F) + (((SvgaInfo->OemSoftwareVersion >> 4) & 0x0F) * 10))); - DbgPrint((DPRINT_UI, "SvgaInfo->VendorNamePtr = 0x%x\n", SvgaInfo->VendorNamePtr)); - DbgPrint((DPRINT_UI, "SvgaInfo->ProductNamePtr = 0x%x\n", SvgaInfo->ProductNamePtr)); - DbgPrint((DPRINT_UI, "SvgaInfo->ProductRevisionStringPtr = 0x%x\n", SvgaInfo->ProductRevisionStringPtr)); - DbgPrint((DPRINT_UI, "SvgaInfo->VBE/AF Version = 0x%x (BCD WORD)\n", SvgaInfo->VBE_AF_Version)); - - //DbgPrint((DPRINT_UI, "\nSupported VESA and OEM video modes:\n")); - //VideoModes = (USHORT*)SvgaInfo->SupportedModeListPtr; - //for (Index=0; VideoModes[Index]!=0xFFFF; Index++) - //{ - // DbgPrint((DPRINT_UI, "Mode %d: 0x%x\n", Index, VideoModes[Index])); - //} - - //if (SvgaInfo->VesaVersion >= 0x0200) - //{ - // DbgPrint((DPRINT_UI, "\nSupported accelerated video modes (VESA v2.0):\n")); - // VideoModes = (USHORT*)SvgaInfo->AcceleratedModeListPtr; - // for (Index=0; VideoModes[Index]!=0xFFFF; Index++) - // { - // DbgPrint((DPRINT_UI, "Mode %d: 0x%x\n", Index, VideoModes[Index])); - // } - //} - - DbgPrint((DPRINT_UI, "\n")); - - return SvgaInfo->VesaVersion; -} diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/mach.c b/reactos/boot/freeldr/freeldr/arch/amd64/mach.c deleted file mode 100644 index bd168ea69d2..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/mach.c +++ /dev/null @@ -1,70 +0,0 @@ -/* $Id: machpc.c 32173 2008-02-07 00:43:09Z ros-arm-bringup $ - * - * FreeLoader - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -VOID -MachInit(const char *CmdLine) -{ -// EnableA20(); -//DbgPrint((DPRINT_MEMORY, "MachInit.\n")); - /* Setup vtbl */ - MachVtbl.ConsPutChar = PcConsPutChar; - MachVtbl.ConsKbHit = PcConsKbHit; - MachVtbl.ConsGetCh = PcConsGetCh; - MachVtbl.VideoClearScreen = PcVideoClearScreen; - MachVtbl.VideoSetDisplayMode = PcVideoSetDisplayMode; - MachVtbl.VideoGetDisplaySize = PcVideoGetDisplaySize; - MachVtbl.VideoGetBufferSize = PcVideoGetBufferSize; - MachVtbl.VideoSetTextCursorPosition = PcVideoSetTextCursorPosition; - MachVtbl.VideoSetTextCursorPosition = PcVideoSetTextCursorPosition; - MachVtbl.VideoHideShowTextCursor = PcVideoHideShowTextCursor; - MachVtbl.VideoPutChar = PcVideoPutChar; - MachVtbl.VideoCopyOffScreenBufferToVRAM = PcVideoCopyOffScreenBufferToVRAM; - MachVtbl.VideoIsPaletteFixed = PcVideoIsPaletteFixed; - MachVtbl.VideoSetPaletteColor = PcVideoSetPaletteColor; - MachVtbl.VideoGetPaletteColor = PcVideoGetPaletteColor; - MachVtbl.VideoSync = PcVideoSync; - MachVtbl.Beep = PcBeep; - MachVtbl.PrepareForReactOS = PcPrepareForReactOS; - MachVtbl.GetMemoryMap = PcMemGetMemoryMap; - MachVtbl.DiskGetBootVolume = DiskGetBootVolume; - MachVtbl.DiskGetSystemVolume = DiskGetSystemVolume; - MachVtbl.DiskGetBootPath = DiskGetBootPath; - MachVtbl.DiskGetBootDevice = DiskGetBootDevice; - MachVtbl.DiskBootingFromFloppy = DiskBootingFromFloppy; - MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; - MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors; - MachVtbl.DiskGetPartitionEntry = DiskGetPartitionEntry; - MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry; - MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount; - MachVtbl.GetTime = PcGetTime; - MachVtbl.HwDetect = PcHwDetect; -} - -VOID -PcPrepareForReactOS(IN BOOLEAN Setup) -{ - // - // On PC, prepare video and turn off the floppy motor - // -// PcVideoPrepareForReactOS(Setup); -// DiskStopFloppyMotor(); -} -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pccons.c b/reactos/boot/freeldr/freeldr/arch/amd64/pccons.c deleted file mode 100644 index a146f01b33f..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/pccons.c +++ /dev/null @@ -1,128 +0,0 @@ -/* $Id: pccons.c 21917 2006-05-16 23:09:41Z hpoussin $ - * - * FreeLoader - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#define TEXTMODE_BUFFER 0xb8000 -#define TEXTMODE_BUFFER_SIZE 0x8000 - -#define TEXT_COLS 80 -#define TEXT_LINES 25 - -VOID -PcConsPutChar(int Ch) -{ - REGS Regs; - - /* If we are displaying a CR '\n' then do a LF also */ - if ('\n' == Ch) - { - /* Display the LF */ - PcConsPutChar('\r'); - } - - /* If we are displaying a TAB '\t' then display 8 spaces ' ' */ - if ('\t' == Ch) - { - /* Display the 8 spaces ' ' */ - PcConsPutChar(' '); - PcConsPutChar(' '); - PcConsPutChar(' '); - PcConsPutChar(' '); - PcConsPutChar(' '); - PcConsPutChar(' '); - PcConsPutChar(' '); - PcConsPutChar(' '); - return; - } - - /* Int 10h AH=0Eh - * VIDEO - TELETYPE OUTPUT - * - * AH = 0Eh - * AL = character to write - * BH = page number - * BL = foreground color (graphics modes only) - */ - Regs.b.ah = 0x0E; - Regs.b.al = Ch; - Regs.w.bx = 1; - Int386(0x10, &Regs, &Regs); -} - -BOOLEAN -PcConsKbHit(VOID) -{ - REGS Regs; - - /* Int 16h AH=01h - * KEYBOARD - CHECK FOR KEYSTROKE - * - * AH = 01h - * Return: - * ZF set if no keystroke available - * ZF clear if keystroke available - * AH = BIOS scan code - * AL = ASCII character - */ - Regs.b.ah = 0x01; - Int386(0x16, &Regs, &Regs); - - return 0 == (Regs.x.eflags & I386FLAG_ZF); -} - -int -PcConsGetCh(void) -{ - REGS Regs; - static BOOLEAN ExtendedKey = FALSE; - static char ExtendedScanCode = 0; - - /* If the last time we were called an - * extended key was pressed then return - * that keys scan code. */ - if (ExtendedKey) - { - ExtendedKey = FALSE; - return ExtendedScanCode; - } - - /* Int 16h AH=00h - * KEYBOARD - GET KEYSTROKE - * - * AH = 00h - * Return: - * AH = BIOS scan code - * AL = ASCII character - */ - Regs.b.ah = 0x00; - Int386(0x16, &Regs, &Regs); - - /* Check for an extended keystroke */ - if (0 == Regs.b.al) - { - ExtendedKey = TRUE; - ExtendedScanCode = Regs.b.ah; - } - - /* Return keystroke */ - return Regs.b.al; -} - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pcdisk.c b/reactos/boot/freeldr/freeldr/arch/amd64/pcdisk.c deleted file mode 100644 index cd35497cc6b..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/pcdisk.c +++ /dev/null @@ -1,455 +0,0 @@ -/* - * FreeLoader - * Copyright (C) 1998-2003 Brian Palmer - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#define NDEBUG -#include - -typedef struct -{ - UCHAR PacketSize; // 00h - Size of packet (10h or 18h) - UCHAR Reserved; // 01h - Reserved (0) - USHORT LBABlockCount; // 02h - Number of blocks to transfer (max 007Fh for Phoenix EDD) - USHORT TransferBufferOffset; // 04h - Transfer buffer offset (seg:off) - USHORT TransferBufferSegment; // Transfer buffer segment (seg:off) - ULONGLONG LBAStartBlock; // 08h - Starting absolute block number - //ULONGLONG TransferBuffer64; // 10h - (EDD-3.0, optional) 64-bit flat address of transfer buffer - // used if DWORD at 04h is FFFFh:FFFFh - // Commented since some earlier BIOSes refuse to work with - // such extended structure -} PACKED I386_DISK_ADDRESS_PACKET, *PI386_DISK_ADDRESS_PACKET; - -///////////////////////////////////////////////////////////////////////////////////////////// -// FUNCTIONS -///////////////////////////////////////////////////////////////////////////////////////////// - -static BOOLEAN PcDiskResetController(ULONG DriveNumber) -{ - REGS RegsIn; - REGS RegsOut; - - DbgPrint((DPRINT_DISK, "PcDiskResetController(0x%x) DISK OPERATION FAILED -- RESETTING CONTROLLER\n", DriveNumber)); - - // BIOS Int 13h, function 0 - Reset disk system - // AH = 00h - // DL = drive (if bit 7 is set both hard disks and floppy disks reset) - // Return: - // AH = status - // CF clear if successful - // CF set on error - RegsIn.b.ah = 0x00; - RegsIn.b.dl = DriveNumber; - - // Reset the disk controller - Int386(0x13, &RegsIn, &RegsOut); - - return INT386_SUCCESS(RegsOut); -} - -static BOOLEAN PcDiskReadLogicalSectorsLBA(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) -{ - REGS RegsIn; - REGS RegsOut; - ULONG RetryCount; - PI386_DISK_ADDRESS_PACKET Packet = (PI386_DISK_ADDRESS_PACKET)(BIOSCALLBUFFER); - - DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectorsLBA() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer)); - - // BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ - RegsIn.b.ah = 0x42; // Subfunction 42h - RegsIn.b.dl = DriveNumber; // Drive number in DL (0 - floppy, 0x80 - harddisk) - RegsIn.x.ds = BIOSCALLBUFSEGMENT; // DS:SI -> disk address packet - RegsIn.w.si = BIOSCALLBUFOFFSET; - - // Setup disk address packet - RtlZeroMemory(Packet, sizeof(I386_DISK_ADDRESS_PACKET)); - Packet->PacketSize = sizeof(I386_DISK_ADDRESS_PACKET); - Packet->Reserved = 0; - Packet->LBABlockCount = SectorCount; - Packet->TransferBufferOffset = ((ULONG_PTR)Buffer) & 0x0F; - Packet->TransferBufferSegment = ((ULONG_PTR)Buffer) >> 4; - Packet->LBAStartBlock = SectorNumber; - - // BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ - // Return: - // CF clear if successful - // AH = 00h - // CF set on error - // AH = error code - // disk address packet's block count field set to the - // number of blocks successfully transferred - - // Retry 3 times - for (RetryCount=0; RetryCount<3; RetryCount++) - { - Int386(0x13, &RegsIn, &RegsOut); - - // If it worked return TRUE - if (INT386_SUCCESS(RegsOut)) - { - return TRUE; - } - // If it was a corrected ECC error then the data is still good - else if (RegsOut.b.ah == 0x11) - { - return TRUE; - } - // If it failed the do the next retry - else - { - PcDiskResetController(DriveNumber); - - continue; - } - } - - // If we get here then the read failed - DiskError("Disk Read Failed in LBA mode", RegsOut.b.ah); - - return FALSE; -} - -static BOOLEAN PcDiskReadLogicalSectorsCHS(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) -{ - ULONG PhysicalSector; - ULONG PhysicalHead; - ULONG PhysicalTrack; - GEOMETRY DriveGeometry; - ULONG NumberOfSectorsToRead; - REGS RegsIn; - REGS RegsOut; - ULONG RetryCount; - - DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectorsCHS()\n")); - - // - // Get the drive geometry - // - if (!MachDiskGetDriveGeometry(DriveNumber, &DriveGeometry) || - DriveGeometry.Sectors == 0 || - DriveGeometry.Heads == 0) - { - return FALSE; - } - - while (SectorCount) - { - - // - // Calculate the physical disk offsets - // - PhysicalSector = 1 + (SectorNumber % DriveGeometry.Sectors); - PhysicalHead = (SectorNumber / DriveGeometry.Sectors) % DriveGeometry.Heads; - PhysicalTrack = (SectorNumber / DriveGeometry.Sectors) / DriveGeometry.Heads; - - // - // Calculate how many sectors we need to read this round - // - if (PhysicalSector > 1) - { - if (SectorCount >= (DriveGeometry.Sectors - (PhysicalSector - 1))) - NumberOfSectorsToRead = (DriveGeometry.Sectors - (PhysicalSector - 1)); - else - NumberOfSectorsToRead = SectorCount; - } - else - { - if (SectorCount >= DriveGeometry.Sectors) - NumberOfSectorsToRead = DriveGeometry.Sectors; - else - NumberOfSectorsToRead = SectorCount; - } - - // - // Make sure the read is within the geometry boundaries - // - if ((PhysicalHead >= DriveGeometry.Heads) || - (PhysicalTrack >= DriveGeometry.Cylinders) || - ((NumberOfSectorsToRead + PhysicalSector) > (DriveGeometry.Sectors + 1)) || - (PhysicalSector > DriveGeometry.Sectors)) - { - DiskError("Disk read exceeds drive geometry limits.", 0); - return FALSE; - } - - // BIOS Int 13h, function 2 - Read Disk Sectors - // AH = 02h - // AL = number of sectors to read (must be nonzero) - // CH = low eight bits of cylinder number - // CL = sector number 1-63 (bits 0-5) - // high two bits of cylinder (bits 6-7, hard disk only) - // DH = head number - // DL = drive number (bit 7 set for hard disk) - // ES:BX -> data buffer - // Return: - // CF set on error - // if AH = 11h (corrected ECC error), AL = burst length - // CF clear if successful - // AH = status - // AL = number of sectors transferred - // (only valid if CF set for some BIOSes) - RegsIn.b.ah = 0x02; - RegsIn.b.al = NumberOfSectorsToRead; - RegsIn.b.ch = (PhysicalTrack & 0xFF); - RegsIn.b.cl = (PhysicalSector + ((PhysicalTrack & 0x300) >> 2)); - RegsIn.b.dh = PhysicalHead; - RegsIn.b.dl = DriveNumber; - RegsIn.w.es = ((ULONG_PTR)Buffer) >> 4; - RegsIn.w.bx = ((ULONG_PTR)Buffer) & 0x0F; - - // - // Perform the read - // Retry 3 times - // - for (RetryCount=0; RetryCount<3; RetryCount++) - { - Int386(0x13, &RegsIn, &RegsOut); - - // If it worked break out - if (INT386_SUCCESS(RegsOut)) - { - break; - } - // If it was a corrected ECC error then the data is still good - else if (RegsOut.b.ah == 0x11) - { - break; - } - // If it failed the do the next retry - else - { - PcDiskResetController(DriveNumber); - - continue; - } - } - - // If we retried 3 times then fail - if (RetryCount >= 3) - { - DiskError("Disk Read Failed in CHS mode, after retrying 3 times", RegsOut.b.ah); - return FALSE; - } - - // I have learned that not all bioses return - // the sector read count in the AL register (at least mine doesn't) - // even if the sectors were read correctly. So instead - // of checking the sector read count we will rely solely - // on the carry flag being set on error - - Buffer = (PVOID)((ULONG_PTR)Buffer + (NumberOfSectorsToRead * DriveGeometry.BytesPerSector)); - SectorCount -= NumberOfSectorsToRead; - SectorNumber += NumberOfSectorsToRead; - } - - return TRUE; -} - -static BOOLEAN PcDiskInt13ExtensionsSupported(ULONG DriveNumber) -{ - static ULONG LastDriveNumber = 0xffffffff; - static BOOLEAN LastSupported; - REGS RegsIn; - REGS RegsOut; - - DbgPrint((DPRINT_DISK, "PcDiskInt13ExtensionsSupported()\n")); - - if (DriveNumber == LastDriveNumber) - { - DbgPrint((DPRINT_DISK, "Using cached value %s for drive 0x%x\n", LastSupported ? "TRUE" : "FALSE", DriveNumber)); - return LastSupported; - } - - // Some BIOSes report that extended disk access functions are not supported - // when booting from a CD (e.g. Phoenix BIOS v6.00PG and Insyde BIOS shipping - // with Intel Macs). Therefore we just return TRUE if we're booting from a CD - - // we can assume that all El Torito capable BIOSes support INT 13 extensions. - // We simply detect whether we're booting from CD by checking whether the drive - // number is >= 0x90. It's 0x90 on the Insyde BIOS, and 0x9F on most other BIOSes. - if (DriveNumber >= 0x90) - { - LastSupported = TRUE; - return TRUE; - } - - LastDriveNumber = DriveNumber; - - // IBM/MS INT 13 Extensions - INSTALLATION CHECK - // AH = 41h - // BX = 55AAh - // DL = drive (80h-FFh) - // Return: - // CF set on error (extensions not supported) - // AH = 01h (invalid function) - // CF clear if successful - // BX = AA55h if installed - // AH = major version of extensions - // 01h = 1.x - // 20h = 2.0 / EDD-1.0 - // 21h = 2.1 / EDD-1.1 - // 30h = EDD-3.0 - // AL = internal use - // CX = API subset support bitmap - // DH = extension version (v2.0+ ??? -- not present in 1.x) - // - // Bitfields for IBM/MS INT 13 Extensions API support bitmap - // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported - // Bit 1, removable drive controller functions (AH=45h,46h,48h,49h,INT 15/AH=52h) supported - // Bit 2, enhanced disk drive (EDD) functions (AH=48h,AH=4Eh) supported - // extended drive parameter table is valid - // Bits 3-15 reserved - RegsIn.b.ah = 0x41; - RegsIn.w.bx = 0x55AA; - RegsIn.b.dl = DriveNumber; - - // Reset the disk controller - Int386(0x13, &RegsIn, &RegsOut); - - if (!INT386_SUCCESS(RegsOut)) - { - // CF set on error (extensions not supported) - LastSupported = FALSE; - return FALSE; - } - - if (RegsOut.w.bx != 0xAA55) - { - // BX = AA55h if installed - LastSupported = FALSE; - return FALSE; - } - - if (!(RegsOut.w.cx & 0x0001)) - { - // CX = API subset support bitmap - // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported - printf("Suspicious API subset support bitmap 0x%x on device 0x%lx\n", RegsOut.w.cx, DriveNumber); - LastSupported = FALSE; - return FALSE; - } - - LastSupported = TRUE; - return TRUE; -} - -BOOLEAN PcDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) -{ - - DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer)); - - // - // Check to see if it is a fixed disk drive - // If so then check to see if Int13 extensions work - // If they do then use them, otherwise default back to BIOS calls - // - if ((DriveNumber >= 0x80) && PcDiskInt13ExtensionsSupported(DriveNumber)) - { - DbgPrint((DPRINT_DISK, "Using Int 13 Extensions for read. PcDiskInt13ExtensionsSupported(%d) = %s\n", DriveNumber, PcDiskInt13ExtensionsSupported(DriveNumber) ? "TRUE" : "FALSE")); - - // - // LBA is easy, nothing to calculate - // Just do the read - // - return PcDiskReadLogicalSectorsLBA(DriveNumber, SectorNumber, SectorCount, Buffer); - } - else - { - // LBA is not supported default to the CHS calls - return PcDiskReadLogicalSectorsCHS(DriveNumber, SectorNumber, SectorCount, Buffer); - } - - return TRUE; -} - -BOOLEAN -PcDiskGetDriveGeometry(ULONG DriveNumber, PGEOMETRY Geometry) -{ - REGS RegsIn; - REGS RegsOut; - ULONG Cylinders; - - DbgPrint((DPRINT_DISK, "DiskGetDriveGeometry()\n")); - - /* BIOS Int 13h, function 08h - Get drive parameters - * AH = 08h - * DL = drive (bit 7 set for hard disk) - * ES:DI = 0000h:0000h to guard against BIOS bugs - * Return: - * CF set on error - * AH = status (07h) - * CF clear if successful - * AH = 00h - * AL = 00h on at least some BIOSes - * BL = drive type (AT/PS2 floppies only) - * CH = low eight bits of maximum cylinder number - * CL = maximum sector number (bits 5-0) - * high two bits of maximum cylinder number (bits 7-6) - * DH = maximum head number - * DL = number of drives - * ES:DI -> drive parameter table (floppies only) - */ - RegsIn.b.ah = 0x08; - RegsIn.b.dl = DriveNumber; - RegsIn.w.es = 0x0000; - RegsIn.w.di = 0x0000; - - /* Get drive parameters */ - Int386(0x13, &RegsIn, &RegsOut); - - if (! INT386_SUCCESS(RegsOut)) - { - return FALSE; - } - - Cylinders = (RegsOut.b.cl & 0xC0) << 2; - Cylinders += RegsOut.b.ch; - Cylinders++; - Geometry->Cylinders = Cylinders; - Geometry->Heads = RegsOut.b.dh + 1; - Geometry->Sectors = RegsOut.b.cl & 0x3F; - Geometry->BytesPerSector = 512; /* Just assume 512 bytes per sector */ - - return TRUE; -} - -ULONG -PcDiskGetCacheableBlockCount(ULONG DriveNumber) -{ - GEOMETRY Geometry; - - /* If LBA is supported then the block size will be 64 sectors (32k) - * If not then the block size is the size of one track */ - if (DiskInt13ExtensionsSupported(DriveNumber)) - { - return 64; - } - /* Get the disk geometry - * If this fails then we will just return 1 sector to be safe */ - else if (! PcDiskGetDriveGeometry(DriveNumber, &Geometry)) - { - return 1; - } - else - { - return Geometry.Sectors; - } -} - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pcmem.c b/reactos/boot/freeldr/freeldr/arch/amd64/pcmem.c deleted file mode 100644 index 914a363cc9a..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/pcmem.c +++ /dev/null @@ -1,249 +0,0 @@ -/* $Id: pcmem.c 24238 2006-09-23 16:50:39Z fireball $ - * - * FreeLoader - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Note: Most of this code comes from the old file "i386mem.c", which - * was Copyright (C) 1998-2003 Brian Palmer - */ - -#include - -#define NDEBUG -#include - -static ULONG -PcMemGetExtendedMemorySize(VOID) -{ - REGS RegsIn; - REGS RegsOut; - ULONG MemorySize; - - DbgPrint((DPRINT_MEMORY, "GetExtendedMemorySize()\n")); - - /* Int 15h AX=E801h - * Phoenix BIOS v4.0 - GET MEMORY SIZE FOR >64M CONFIGURATIONS - * - * AX = E801h - * Return: - * CF clear if successful - * AX = extended memory between 1M and 16M, in K (max 3C00h = 15MB) - * BX = extended memory above 16M, in 64K blocks - * CX = configured memory 1M to 16M, in K - * DX = configured memory above 16M, in 64K blocks - * CF set on error - */ - RegsIn.w.ax = 0xE801; - Int386(0x15, &RegsIn, &RegsOut); - - DbgPrint((DPRINT_MEMORY, "Int15h AX=E801h\n")); - DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n", RegsOut.w.ax)); - DbgPrint((DPRINT_MEMORY, "BX = 0x%x\n", RegsOut.w.bx)); - DbgPrint((DPRINT_MEMORY, "CX = 0x%x\n", RegsOut.w.cx)); - DbgPrint((DPRINT_MEMORY, "DX = 0x%x\n", RegsOut.w.dx)); - DbgPrint((DPRINT_MEMORY, "CF set = %s\n\n", (RegsOut.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE")); - - if (INT386_SUCCESS(RegsOut)) - { - /* If AX=BX=0000h the use CX and DX */ - if (RegsOut.w.ax == 0) - { - /* Return extended memory size in K */ - MemorySize = RegsOut.w.dx * 64; - MemorySize += RegsOut.w.cx; - return MemorySize; - } - else - { - /* Return extended memory size in K */ - MemorySize = RegsOut.w.bx * 64; - MemorySize += RegsOut.w.ax; - return MemorySize; - } - } - - /* If we get here then Int15 Func E801h didn't work */ - /* So try Int15 Func 88h */ - - /* Int 15h AH=88h - * SYSTEM - GET EXTENDED MEMORY SIZE (286+) - * - * AH = 88h - * Return: - * CF clear if successful - * AX = number of contiguous KB starting at absolute address 100000h - * CF set on error - * AH = status - * 80h invalid command (PC,PCjr) - * 86h unsupported function (XT,PS30) - */ - RegsIn.b.ah = 0x88; - Int386(0x15, &RegsIn, &RegsOut); - - DbgPrint((DPRINT_MEMORY, "Int15h AH=88h\n")); - DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n", RegsOut.w.ax)); - DbgPrint((DPRINT_MEMORY, "CF set = %s\n\n", (RegsOut.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE")); - - if (INT386_SUCCESS(RegsOut) && RegsOut.w.ax != 0) - { - MemorySize = RegsOut.w.ax; - return MemorySize; - } - - /* If we get here then Int15 Func 88h didn't work */ - /* So try reading the CMOS */ - WRITE_PORT_UCHAR((PUCHAR)0x70, 0x31); - MemorySize = READ_PORT_UCHAR((PUCHAR)0x71); - MemorySize = (MemorySize & 0xFFFF); - MemorySize = (MemorySize << 8); - - DbgPrint((DPRINT_MEMORY, "Int15h Failed\n")); - DbgPrint((DPRINT_MEMORY, "CMOS reports: 0x%x\n", MemorySize)); - - return MemorySize; -} - -static ULONG -PcMemGetConventionalMemorySize(VOID) -{ - REGS Regs; - - DbgPrint((DPRINT_MEMORY, "GetConventionalMemorySize()\n")); - - /* Int 12h - * BIOS - GET MEMORY SIZE - * - * Return: - * AX = kilobytes of contiguous memory starting at absolute address 00000h - * - * This call returns the contents of the word at 0040h:0013h; - * in PC and XT, this value is set from the switches on the motherboard - */ - Regs.w.ax = 0; - Int386(0x12, &Regs, &Regs); - - DbgPrint((DPRINT_MEMORY, "Int12h\n")); - DbgPrint((DPRINT_MEMORY, "AX = 0x%x\n\n", Regs.w.ax)); - - return (ULONG)Regs.w.ax; -} - -static ULONG -PcMemGetBiosMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize) -{ - REGS Regs; - ULONG MapCount; - - DbgPrint((DPRINT_MEMORY, "GetBiosMemoryMap()\n")); - - /* Int 15h AX=E820h - * Newer BIOSes - GET SYSTEM MEMORY MAP - * - * AX = E820h - * EAX = 0000E820h - * EDX = 534D4150h ('SMAP') - * EBX = continuation value or 00000000h to start at beginning of map - * ECX = size of buffer for result, in bytes (should be >= 20 bytes) - * ES:DI -> buffer for result - * Return: - * CF clear if successful - * EAX = 534D4150h ('SMAP') - * ES:DI buffer filled - * EBX = next offset from which to copy or 00000000h if all done - * ECX = actual length returned in bytes - * CF set on error - * AH = error code (86h) - */ - Regs.x.eax = 0x0000E820; - Regs.x.edx = 0x534D4150; /* ('SMAP') */ - Regs.x.ebx = 0x00000000; - Regs.x.ecx = sizeof(BIOS_MEMORY_MAP); - Regs.w.es = BIOSCALLBUFSEGMENT; - Regs.w.di = BIOSCALLBUFOFFSET; - for (MapCount = 0; MapCount < MaxMemoryMapSize; MapCount++) - { - Int386(0x15, &Regs, &Regs); - - DbgPrint((DPRINT_MEMORY, "Memory Map Entry %d\n", MapCount)); - DbgPrint((DPRINT_MEMORY, "Int15h AX=E820h\n")); - DbgPrint((DPRINT_MEMORY, "EAX = 0x%x\n", Regs.x.eax)); - DbgPrint((DPRINT_MEMORY, "EBX = 0x%x\n", Regs.x.ebx)); - DbgPrint((DPRINT_MEMORY, "ECX = 0x%x\n", Regs.x.ecx)); - DbgPrint((DPRINT_MEMORY, "CF set = %s\n", (Regs.x.eflags & I386FLAG_CF) ? "TRUE" : "FALSE")); - - /* If the BIOS didn't return 'SMAP' in EAX then - * it doesn't support this call */ - if (Regs.x.eax != 0x534D4150) - { - break; - } - - /* Copy data to caller's buffer */ - RtlCopyMemory(&BiosMemoryMap[MapCount], (PVOID)BIOSCALLBUFFER, Regs.x.ecx); - - DbgPrint((DPRINT_MEMORY, "BaseAddress: 0x%p\n", (PVOID)BiosMemoryMap[MapCount].BaseAddress)); - DbgPrint((DPRINT_MEMORY, "Length: 0x%p\n", (PVOID)BiosMemoryMap[MapCount].Length)); - DbgPrint((DPRINT_MEMORY, "Type: 0x%x\n", BiosMemoryMap[MapCount].Type)); - DbgPrint((DPRINT_MEMORY, "Reserved: 0x%x\n", BiosMemoryMap[MapCount].Reserved)); - DbgPrint((DPRINT_MEMORY, "\n")); - - /* If the continuation value is zero or the - * carry flag is set then this was - * the last entry so we're done */ - if (Regs.x.ebx == 0x00000000 || !INT386_SUCCESS(Regs)) - { - MapCount++; - DbgPrint((DPRINT_MEMORY, "End Of System Memory Map!\n\n")); - break; - } - - /* Setup the registers for the next call */ - Regs.x.eax = 0x0000E820; - Regs.x.edx = 0x534D4150; /* ('SMAP') */ - /* Regs.x.ebx = 0x00000001; Continuation value already set by the BIOS */ - Regs.x.ecx = sizeof(BIOS_MEMORY_MAP); - Regs.w.es = BIOSCALLBUFSEGMENT; - Regs.w.di = BIOSCALLBUFOFFSET; - } - - return MapCount; -} - -ULONG -PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize) -{ - ULONG EntryCount; - - EntryCount = PcMemGetBiosMemoryMap(BiosMemoryMap, MaxMemoryMapSize); - - /* If the BIOS didn't provide a memory map, synthesize one */ - if (0 == EntryCount && 2 <= MaxMemoryMapSize) - { - /* Conventional memory */ - BiosMemoryMap[0].BaseAddress = 0; - BiosMemoryMap[0].Length = PcMemGetConventionalMemorySize() * 1024; - BiosMemoryMap[0].Type = BiosMemoryUsable; - /* Extended memory */ - BiosMemoryMap[1].BaseAddress = 1024 * 1024; - BiosMemoryMap[1].Length = PcMemGetExtendedMemorySize() * 1024; - BiosMemoryMap[1].Type = BiosMemoryUsable; - EntryCount = 2; - } - - return EntryCount; -} - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pcrtc.c b/reactos/boot/freeldr/freeldr/arch/amd64/pcrtc.c deleted file mode 100644 index 1e9234fcdad..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/pcrtc.c +++ /dev/null @@ -1,5 +0,0 @@ -/* No need to duplicate code ; import the i386 version */ - -#include "../i386/pcrtc.c" - -/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/pcvideo.c b/reactos/boot/freeldr/freeldr/arch/amd64/pcvideo.c deleted file mode 100644 index fd3668c38b4..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/amd64/pcvideo.c +++ /dev/null @@ -1,1122 +0,0 @@ -/* $Id: pcvideo.c 31712 2008-01-11 11:35:09Z hpoussin $ - * - * FreeLoader - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#define NDEBUG -#include - -#define VIDEOPORT_PALETTE_READ 0x03C7 -#define VIDEOPORT_PALETTE_WRITE 0x03C8 -#define VIDEOPORT_PALETTE_DATA 0x03C9 -#define VIDEOPORT_VERTICAL_RETRACE 0x03DA - -#define VIDEOVGA_MEM_ADDRESS 0xA0000 -#define VIDEOTEXT_MEM_ADDRESS 0xB8000 -#define VIDEOTEXT_MEM_SIZE 0x8000 - -#define VIDEOCARD_CGA_OR_OTHER 0 -#define VIDEOCARD_EGA 1 -#define VIDEOCARD_VGA 2 - -#define VIDEOMODE_NORMAL_TEXT 0 -#define VIDEOMODE_EXTENDED_TEXT 1 -#define VIDEOMODE_80X28 0x501C -#define VIDEOMODE_80X30 0x501E -#define VIDEOMODE_80X34 0x5022 -#define VIDEOMODE_80X43 0x502B -#define VIDEOMODE_80X60 0x503C -#define VIDEOMODE_132X25 0x8419 -#define VIDEOMODE_132X43 0x842B -#define VIDEOMODE_132X50 0x8432 -#define VIDEOMODE_132X60 0x843C - -#define VERTRES_200_SCANLINES 0x00 -#define VERTRES_350_SCANLINES 0x01 -#define VERTRES_400_SCANLINES 0x02 - -typedef struct -{ - USHORT ModeAttributes; /* mode attributes (see #00080) */ - UCHAR WindowAttributesA; /* window attributes, window A (see #00081) */ - UCHAR WindowsAttributesB; /* window attributes, window B (see #00081) */ - USHORT WindowGranularity; /* window granularity in KB */ - USHORT WindowSize; /* window size in KB */ - USHORT WindowAStartSegment; /* start segment of window A (0000h if not supported) */ - USHORT WindowBStartSegment; /* start segment of window B (0000h if not supported) */ - ULONG WindowPositioningFunction; /* -> FAR window positioning function (equivalent to AX=4F05h) */ - USHORT BytesPerScanLine; /* bytes per scan line */ - /* ---remainder is optional for VESA modes in v1.0/1.1, needed for OEM modes--- */ - USHORT WidthInPixels; /* width in pixels (graphics) or characters (text) */ - USHORT HeightInPixels; /* height in pixels (graphics) or characters (text) */ - UCHAR CharacterWidthInPixels; /* width of character cell in pixels */ - UCHAR CharacterHeightInPixels; /* height of character cell in pixels */ - UCHAR NumberOfMemoryPlanes; /* number of memory planes */ - UCHAR BitsPerPixel; /* number of bits per pixel */ - UCHAR NumberOfBanks; /* number of banks */ - UCHAR MemoryModel; /* memory model type (see #00082) */ - UCHAR BankSize; /* size of bank in KB */ - UCHAR NumberOfImagePanes; /* number of image pages (less one) that will fit in video RAM */ - UCHAR Reserved1; /* reserved (00h for VBE 1.0-2.0, 01h for VBE 3.0) */ - /* ---VBE v1.2+ --- */ - UCHAR RedMaskSize; /* red mask size */ - UCHAR RedMaskPosition; /* red field position */ - UCHAR GreenMaskSize; /* green mask size */ - UCHAR GreenMaskPosition; /* green field size */ - UCHAR BlueMaskSize; /* blue mask size */ - UCHAR BlueMaskPosition; /* blue field size */ - UCHAR ReservedMaskSize; /* reserved mask size */ - UCHAR ReservedMaskPosition; /* reserved mask position */ - UCHAR DirectColorModeInfo; /* direct color mode info */ - /* bit 0:Color ramp is programmable */ - /* bit 1:Bytes in reserved field may be used by application */ - /* ---VBE v2.0+ --- */ - ULONG LinearVideoBufferAddress; /* physical address of linear video buffer */ - ULONG OffscreenMemoryPointer; /* pointer to start of offscreen memory */ - USHORT OffscreenMemorySize; /* KB of offscreen memory */ - /* ---VBE v3.0 --- */ - USHORT LinearBytesPerScanLine; /* bytes per scan line in linear modes */ - UCHAR BankedNumberOfImages; /* number of images (less one) for banked video modes */ - UCHAR LinearNumberOfImages; /* number of images (less one) for linear video modes */ - UCHAR LinearRedMaskSize; /* linear modes:Size of direct color red mask (in bits) */ - UCHAR LinearRedMaskPosition; /* linear modes:Bit position of red mask LSB (e.g. shift count) */ - UCHAR LinearGreenMaskSize; /* linear modes:Size of direct color green mask (in bits) */ - UCHAR LinearGreenMaskPosition; /* linear modes:Bit position of green mask LSB (e.g. shift count) */ - UCHAR LinearBlueMaskSize; /* linear modes:Size of direct color blue mask (in bits) */ - UCHAR LinearBlueMaskPosition; /* linear modes:Bit position of blue mask LSB (e.g. shift count) */ - UCHAR LinearReservedMaskSize; /* linear modes:Size of direct color reserved mask (in bits) */ - UCHAR LinearReservedMaskPosition; /* linear modes:Bit position of reserved mask LSB */ - ULONG MaximumPixelClock; /* maximum pixel clock for graphics video mode, in Hz */ - UCHAR Reserved2[190]; /* 190 BYTEs reserved (0) */ -} PACKED SVGA_MODE_INFORMATION, *PSVGA_MODE_INFORMATION; - -static ULONG BiosVideoMode; /* Current video mode as known by BIOS */ -static ULONG ScreenWidth = 80; /* Screen Width in characters */ -static ULONG ScreenHeight = 25; /* Screen Height in characters */ -static ULONG BytesPerScanLine = 160; /* Number of bytes per scanline (delta) */ -static VIDEODISPLAYMODE DisplayMode = VideoTextMode; /* Current display mode */ -static BOOLEAN VesaVideoMode = FALSE; /* Are we using a VESA mode? */ -static SVGA_MODE_INFORMATION VesaVideoModeInformation; /* Only valid when in VESA mode */ -static ULONG CurrentMemoryBank = 0; /* Currently selected VESA bank */ - -static ULONG -PcVideoDetectVideoCard(VOID) -{ - REGS Regs; - - /* Int 10h AH=12h BL=10h - * VIDEO - ALTERNATE FUNCTION SELECT (PS,EGA,VGA,MCGA) - GET EGA INFO - * - * AH = 12h - * BL = 10h - * Return: - * BH = video state - * 00h color mode in effect (I/O port 3Dxh) - * 01h mono mode in effect (I/O port 3Bxh) - * BL = installed memory (00h = 64K, 01h = 128K, 02h = 192K, 03h = 256K) - * CH = feature connector bits - * CL = switch settings - * AH destroyed (at least by Tseng ET4000 BIOS v8.00n) - * - * Installation check;EGA - */ - Regs.b.ah = 0x12; - Regs.b.bl = 0x10; - Int386(0x10, &Regs, &Regs); - - /* If BL is still equal to 0x10 then there is no EGA/VGA present */ - if (0x10 == Regs.b.bl) - { - return VIDEOCARD_CGA_OR_OTHER; - } - - /* Int 10h AX=1A00h - * VIDEO - GET DISPLAY COMBINATION CODE (PS,VGA/MCGA) - * - * AX = 1A00h - * Return: - * AL = 1Ah if function was supported - * BL = active display code - * BH = alternate display code - * - * This function is commonly used to check for the presence of a VGA. - * - * Installation check;VGA - * - * Values for display combination code: - * 00h no display - * 01h monochrome adapter w/ monochrome display - * 02h CGA w/ color display - * 03h reserved - * 04h EGA w/ color display - * 05h EGA w/ monochrome display - * 06h PGA w/ color display - * 07h VGA w/ monochrome analog display - * 08h VGA w/ color analog display - * 09h reserved - * 0Ah MCGA w/ digital color display - * 0Bh MCGA w/ monochrome analog display - * 0Ch MCGA w/ color analog display - * FFh unknown display type - */ - Regs.b.ah = 0x12; - Regs.b.bl = 0x10; - Int386(0x10, &Regs, &Regs); - - if (0x1a == Regs.b.al) - { - return VIDEOCARD_VGA; - } - else - { - return VIDEOCARD_EGA; - } -} - -static VOID PcVideoSetBiosMode(ULONG VideoMode) -{ - REGS Regs; - - /* Int 10h AH=00h - * VIDEO - SET VIDEO MODE - * - * AH = 00h - * AL = desired video mode - * Return: - * AL = video mode flag (Phoenix, AMI BIOS) - * 20h mode > 7 - * 30h modes 0-5 and 7 - * 3Fh mode 6 - * AL = CRT controller mode byte (Phoenix 386 BIOS v1.10) - */ - Regs.b.ah = 0x00; - Regs.b.al = VideoMode; - Int386(0x10, &Regs, &Regs); -} - -static VOID -PcVideoSetFont8x8(VOID) -{ - REGS Regs; - - /* Int 10h AX=1112h - * VIDEO - TEXT-MODE CHARGEN - LOAD ROM 8x8 DBL-DOT PATTERNS (PS,EGA,VGA) - * - * AX = 1112h - * BL = block to load - * Return: - * Nothing - */ - Regs.w.ax = 0x1112; - Regs.b.bl = 0x00; - Int386(0x10, &Regs, &Regs); -} - -static VOID -PcVideoSetFont8x14(VOID) -{ - REGS Regs; - - /* Int 10h AX=1111h - * VIDEO - TEXT-MODE CHARGEN - LOAD ROM MONOCHROME PATTERNS (PS,EGA,VGA) - * - * AX = 1111h - * BL = block to load - * Return: - * Nothing - */ - Regs.w.ax = 0x1111; - Regs.b.bl = 0; - Int386(0x10, &Regs, &Regs); -} - -static VOID -PcVideoSelectAlternatePrintScreen(VOID) -{ - REGS Regs; - - /* Int 10h AH=12h BL=20h - * VIDEO - ALTERNATE FUNCTION SELECT (PS,EGA,VGA,MCGA) - ALTERNATE PRTSC - * - * AH = 12h - * BL = 20h select alternate print screen routine - * Return: - * Nothing - * - * Installs a PrtSc routine from the video card's BIOS to replace the - * default PrtSc handler from the ROM BIOS, which usually does not - * understand screen heights other than 25 lines. - * - * Some adapters disable print-screen instead of enhancing it. - */ - Regs.b.ah = 0x12; - Regs.b.bl = 0x20; - Int386(0x10, &Regs, &Regs); -} - -static VOID -PcVideoDisableCursorEmulation(VOID) -{ - REGS Regs; - - /* Int 10h AH=12h BL=34h - * VIDEO - ALTERNATE FUNCTION SELECT (VGA) - CURSOR EMULATION - * - * AH = 12h - * BL = 34h - * AL = new state - * 00h enable alphanumeric cursor emulation - * 01h disable alphanumeric cursor emulation - * Return: - * AL = 12h if function supported - * - * Specify whether the BIOS should automatically remap cursor start/end - * according to the current character height in text modes. - */ - Regs.b.ah = 0x12; - Regs.b.bl = 0x34; - Regs.b.al = 0x01; - Int386(0x10, &Regs, &Regs); -} - -static VOID -PcVideoDefineCursor(ULONG StartScanLine, ULONG EndScanLine) -{ - REGS Regs; - - /* Int 10h AH=01h - * VIDEO - SET TEXT-MODE CURSOR SHAPE - * - * AH = 01h - * CH = cursor start and options - * CL = bottom scan line containing cursor (bits 0-4) - * Return: - * Nothing - * - * Specify the starting and ending scan lines to be occupied - * by the hardware cursor in text modes. - * - * AMI 386 BIOS and AST Premier 386 BIOS will lock up the - * system if AL is not equal to the current video mode. - * - * Bitfields for cursor start and options: - * - * Bit(s) Description - * 7 should be zero - * 6,5 cursor blink - * (00=normal, 01=invisible, 10=erratic, 11=slow). - * (00=normal, other=invisible on EGA/VGA) - * 4-0 topmost scan line containing cursor - */ - Regs.b.ah = 0x01; - Regs.b.al = 0x03; - Regs.b.ch = StartScanLine; - Regs.b.cl = EndScanLine; - Int386(0x10, &Regs, &Regs); -} - -static VOID -PcVideoSetVerticalResolution(ULONG ScanLines) -{ - REGS Regs; - - /* Int 10h AH=12h BL=30h - * VIDEO - ALTERNATE FUNCTION SELECT (VGA) - SELECT VERTICAL RESOLUTION - * - * AH = 12h - * BL = 30h - * AL = vertical resolution - * 00h 200 scan lines - * 01h 350 scan lines - * 02h 400 scan lines - * Return: - * AL = 12h if function supported - * - * Specifiy the number of scan lines used to display text modes. - * - * The specified resolution will take effect on the next mode set. - */ - Regs.b.ah = 0x12; - Regs.b.bl = 0x30; - Regs.b.al = ScanLines; - Int386(0x10, &Regs, &Regs); -} - -static VOID -PcVideoSet480ScanLines(VOID) -{ - INT_PTR CRTC; - - /* Read CRTC port */ - CRTC = READ_PORT_UCHAR((PUCHAR)0x03CC); - - if (CRTC & 1) - { - CRTC = 0x3D4; - } - else - { - CRTC = 0x3B4; - } - - /* Vertical sync end (also unlocks CR0-7) */ - WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x11); - WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0x0C); - - /* Vertical total */ - WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x06); - WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0x0B); - - /* (vertical) overflow */ - WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x07); - WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0x3E); - - /* Vertical sync start */ - WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x10); - WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0xEA); - - /* Vertical display end */ - WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x12); - WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0xDF); - - /* Vertical blank start */ - WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x15); - WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0xE7); - - /* Vertical blank end */ - WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x16); - WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0x04); - - /* Misc output register (read) */ - CRTC = READ_PORT_UCHAR((PUCHAR)0x03CC); - - /* Preserve clock select bits and color bit */ - CRTC = (CRTC & 0x0D); - /* Set correct sync polarity */ - CRTC = (CRTC | 0xE2); - - /* (write) */ - WRITE_PORT_UCHAR((PUCHAR)0x03C2, CRTC); -} - -static VOID -PcVideoSetDisplayEnd(VOID) -{ - INT_PTR CRTC; - - /* Read CRTC port */ - CRTC = READ_PORT_UCHAR((PUCHAR)0x03CC); - - if (CRTC & 1) - { - CRTC = 0x3D4; - } - else - { - CRTC = 0x3B4; - } - - /* Vertical display end */ - WRITE_PORT_UCHAR((PUCHAR)CRTC, 0x12); - WRITE_PORT_UCHAR((PUCHAR)CRTC+1, 0xDF); -} - -static BOOLEAN -PcVideoVesaGetSVGAModeInformation(USHORT Mode, PSVGA_MODE_INFORMATION ModeInformation) -{ - REGS Regs; - - RtlZeroMemory((PVOID)BIOSCALLBUFFER, 256); - - /* VESA SuperVGA BIOS - GET SuperVGA MODE INFORMATION - * AX = 4F01h - * CX = SuperVGA video mode (see #04082 for bitfields) - * ES:DI -> 256-byte buffer for mode information (see #00079) - * Return: - * AL = 4Fh if function supported - * AH = status - * 00h successful - * ES:DI buffer filled - * 01h failed - * - * Desc: Determine the attributes of the specified video mode - * - * Note: While VBE 1.1 and higher will zero out all unused bytes - * of the buffer, v1.0 did not, so applications that want to be - * backward compatible should clear the buffer before calling - */ - Regs.w.ax = 0x4F01; - Regs.w.cx = Mode; - Regs.w.es = BIOSCALLBUFSEGMENT; - Regs.w.di = BIOSCALLBUFOFFSET; - Int386(0x10, &Regs, &Regs); - - if (Regs.w.ax != 0x004F) - { - return FALSE; - } - - RtlCopyMemory(ModeInformation, (PVOID)BIOSCALLBUFFER, sizeof(SVGA_MODE_INFORMATION)); - - DbgPrint((DPRINT_UI, "\n")); - DbgPrint((DPRINT_UI, "BiosVesaGetSVGAModeInformation() mode 0x%x\n", Mode)); - DbgPrint((DPRINT_UI, "ModeAttributes = 0x%x\n", ModeInformation->ModeAttributes)); - DbgPrint((DPRINT_UI, "WindowAttributesA = 0x%x\n", ModeInformation->WindowAttributesA)); - DbgPrint((DPRINT_UI, "WindowAttributesB = 0x%x\n", ModeInformation->WindowsAttributesB)); - DbgPrint((DPRINT_UI, "WindowGranularity = %dKB\n", ModeInformation->WindowGranularity)); - DbgPrint((DPRINT_UI, "WindowSize = %dKB\n", ModeInformation->WindowSize)); - DbgPrint((DPRINT_UI, "WindowAStartSegment = 0x%x\n", ModeInformation->WindowAStartSegment)); - DbgPrint((DPRINT_UI, "WindowBStartSegment = 0x%x\n", ModeInformation->WindowBStartSegment)); - DbgPrint((DPRINT_UI, "WindowPositioningFunction = 0x%x\n", ModeInformation->WindowPositioningFunction)); - DbgPrint((DPRINT_UI, "BytesPerScanLine = %d\n", ModeInformation->BytesPerScanLine)); - DbgPrint((DPRINT_UI, "WidthInPixels = %d\n", ModeInformation->WidthInPixels)); - DbgPrint((DPRINT_UI, "HeightInPixels = %d\n", ModeInformation->HeightInPixels)); - DbgPrint((DPRINT_UI, "CharacterWidthInPixels = %d\n", ModeInformation->CharacterWidthInPixels)); - DbgPrint((DPRINT_UI, "CharacterHeightInPixels = %d\n", ModeInformation->CharacterHeightInPixels)); - DbgPrint((DPRINT_UI, "NumberOfMemoryPlanes = %d\n", ModeInformation->NumberOfMemoryPlanes)); - DbgPrint((DPRINT_UI, "BitsPerPixel = %d\n", ModeInformation->BitsPerPixel)); - DbgPrint((DPRINT_UI, "NumberOfBanks = %d\n", ModeInformation->NumberOfBanks)); - DbgPrint((DPRINT_UI, "MemoryModel = %d\n", ModeInformation->MemoryModel)); - DbgPrint((DPRINT_UI, "BankSize = %d\n", ModeInformation->BankSize)); - DbgPrint((DPRINT_UI, "NumberOfImagePlanes = %d\n", ModeInformation->NumberOfImagePanes)); - DbgPrint((DPRINT_UI, "---VBE v1.2+ ---\n")); - DbgPrint((DPRINT_UI, "RedMaskSize = %d\n", ModeInformation->RedMaskSize)); - DbgPrint((DPRINT_UI, "RedMaskPosition = %d\n", ModeInformation->RedMaskPosition)); - DbgPrint((DPRINT_UI, "GreenMaskSize = %d\n", ModeInformation->GreenMaskSize)); - DbgPrint((DPRINT_UI, "GreenMaskPosition = %d\n", ModeInformation->GreenMaskPosition)); - DbgPrint((DPRINT_UI, "BlueMaskSize = %d\n", ModeInformation->BlueMaskSize)); - DbgPrint((DPRINT_UI, "BlueMaskPosition = %d\n", ModeInformation->BlueMaskPosition)); - DbgPrint((DPRINT_UI, "ReservedMaskSize = %d\n", ModeInformation->ReservedMaskSize)); - DbgPrint((DPRINT_UI, "ReservedMaskPosition = %d\n", ModeInformation->ReservedMaskPosition)); - DbgPrint((DPRINT_UI, "\n")); - - return TRUE; -} - -static BOOLEAN -PcVideoSetBiosVesaMode(USHORT Mode) -{ - REGS Regs; - - /* Int 10h AX=4F02h - * VESA SuperVGA BIOS - SET SuperVGA VIDEO MODE - * - * AX = 4F02h - * BX = new video mode - * ES:DI -> (VBE 3.0+) CRTC information block, bit mode bit 11 set - * Return: - * AL = 4Fh if function supported - * AH = status - * 00h successful - * 01h failed - * - * Values for VESA video mode: - * 00h-FFh OEM video modes (see #00010 at AH=00h) - * 100h 640x400x256 - * 101h 640x480x256 - * 102h 800x600x16 - * 103h 800x600x256 - * 104h 1024x768x16 - * 105h 1024x768x256 - * 106h 1280x1024x16 - * 107h 1280x1024x256 - * 108h 80x60 text - * 109h 132x25 text - * 10Ah 132x43 text - * 10Bh 132x50 text - * 10Ch 132x60 text - * ---VBE v1.2+ --- - * 10Dh 320x200x32K - * 10Eh 320x200x64K - * 10Fh 320x200x16M - * 110h 640x480x32K - * 111h 640x480x64K - * 112h 640x480x16M - * 113h 800x600x32K - * 114h 800x600x64K - * 115h 800x600x16M - * 116h 1024x768x32K - * 117h 1024x768x64K - * 118h 1024x768x16M - * 119h 1280x1024x32K (1:5:5:5) - * 11Ah 1280x1024x64K (5:6:5) - * 11Bh 1280x1024x16M - * ---VBE 2.0+ --- - * 120h 1600x1200x256 - * 121h 1600x1200x32K - * 122h 1600x1200x64K - * 81FFh special full-memory access mode - * - * Notes: The special mode 81FFh preserves the contents of the video memory and gives - * access to all of the memory; VESA recommends that the special mode be a packed-pixel - * mode. For VBE 2.0+, it is required that the VBE implement the mode, but not place it - * in the list of available modes (mode information for this mode can be queried - * directly, however).. As of VBE 2.0, VESA will no longer define video mode numbers - */ - Regs.w.ax = 0x4F02; - Regs.w.bx = Mode; - Int386(0x10, &Regs, &Regs); - - if (0x004F != Regs.w.ax) - { - return FALSE; - } - - return TRUE; -} - -static BOOLEAN -PcVideoSetMode80x25(VOID) -{ - PcVideoSetBiosMode(0x03); - ScreenWidth = 80; - ScreenHeight = 25; - - return TRUE; -} - -static BOOLEAN -PcVideoSetMode80x50_80x43(VOID) -{ - if (VIDEOCARD_VGA == PcVideoDetectVideoCard()) - { - PcVideoSetBiosMode(0x12); - PcVideoSetFont8x8(); - PcVideoSelectAlternatePrintScreen(); - PcVideoDisableCursorEmulation(); - PcVideoDefineCursor(6, 7); - ScreenWidth = 80; - ScreenHeight = 50; - } - else if (VIDEOCARD_EGA == PcVideoDetectVideoCard()) - { - PcVideoSetBiosMode(0x03); - PcVideoSetFont8x8(); - PcVideoSelectAlternatePrintScreen(); - PcVideoDisableCursorEmulation(); - PcVideoDefineCursor(6, 7); - ScreenWidth = 80; - ScreenHeight = 43; - } - else /* VIDEOCARD_CGA_OR_OTHER */ - { - return FALSE; - } - - return TRUE; -} - -static BOOLEAN -PcVideoSetMode80x28(VOID) -{ - /* FIXME: Is this VGA-only? */ - PcVideoSetMode80x25(); - PcVideoSetFont8x14(); - PcVideoDefineCursor(11, 12); - ScreenWidth = 80; - ScreenHeight = 28; - - return TRUE; -} - -static BOOLEAN -PcVideoSetMode80x30(VOID) -{ - /* FIXME: Is this VGA-only? */ - PcVideoSetMode80x25(); - PcVideoSet480ScanLines(); - ScreenWidth = 80; - ScreenHeight = 30; - - return TRUE; -} - -static BOOLEAN -PcVideoSetMode80x34(VOID) -{ - /* FIXME: Is this VGA-only? */ - PcVideoSetMode80x25(); - PcVideoSet480ScanLines(); - PcVideoSetFont8x14(); - PcVideoDefineCursor(11, 12); - PcVideoSetDisplayEnd(); - ScreenWidth = 80; - ScreenHeight = 34; - - return TRUE; -} - -static BOOLEAN -PcVideoSetMode80x43(VOID) -{ - /* FIXME: Is this VGA-only? */ - PcVideoSetVerticalResolution(VERTRES_350_SCANLINES); - PcVideoSetMode80x25(); - PcVideoSetFont8x8(); - PcVideoSelectAlternatePrintScreen(); - PcVideoDisableCursorEmulation(); - PcVideoDefineCursor(6, 7); - ScreenWidth = 80; - ScreenHeight = 43; - - return TRUE; -} - -static BOOLEAN -PcVideoSetMode80x60(VOID) -{ - /* FIXME: Is this VGA-only? */ - PcVideoSetMode80x25(); - PcVideoSet480ScanLines(); - PcVideoSetFont8x8(); - PcVideoSelectAlternatePrintScreen(); - PcVideoDisableCursorEmulation(); - PcVideoDefineCursor(6, 7); - PcVideoSetDisplayEnd(); - ScreenWidth = 80; - ScreenHeight = 60; - - return TRUE; -} - -static BOOLEAN -PcVideoSetMode(ULONG NewMode) -{ - CurrentMemoryBank = 0; - - /* Set the values for the default text modes - * If they are setting a graphics mode then - * these values will be changed. - */ - BiosVideoMode = NewMode; - ScreenWidth = 80; - ScreenHeight = 25; - BytesPerScanLine = 160; - DisplayMode = VideoTextMode; - VesaVideoMode = FALSE; - - switch (NewMode) - { - case VIDEOMODE_NORMAL_TEXT: - case 0x03: /* BIOS 80x25 text mode number */ - return PcVideoSetMode80x25(); - case VIDEOMODE_EXTENDED_TEXT: - return PcVideoSetMode80x50_80x43(); - case VIDEOMODE_80X28: - return PcVideoSetMode80x28(); - case VIDEOMODE_80X30: - return PcVideoSetMode80x30(); - case VIDEOMODE_80X34: - return PcVideoSetMode80x34(); - case VIDEOMODE_80X43: - return PcVideoSetMode80x43(); - case VIDEOMODE_80X60: - return PcVideoSetMode80x60(); - } - - if (0x12 == NewMode) - { - /* 640x480x16 */ - PcVideoSetBiosMode(NewMode); - WRITE_PORT_USHORT((USHORT*)0x03CE, 0x0F01); /* For some reason this is necessary? */ - ScreenWidth = 640; - ScreenHeight = 480; - BytesPerScanLine = 80; - BiosVideoMode = NewMode; - DisplayMode = VideoGraphicsMode; - - return TRUE; - } - else if (0x13 == NewMode) - { - /* 320x200x256 */ - PcVideoSetBiosMode(NewMode); - ScreenWidth = 320; - ScreenHeight = 200; - BytesPerScanLine = 320; - BiosVideoMode = NewMode; - DisplayMode = VideoGraphicsMode; - - return TRUE; - } - else if (0x0108 <= NewMode && NewMode <= 0x010C) - { - /* VESA Text Mode */ - if (! PcVideoVesaGetSVGAModeInformation(NewMode, &VesaVideoModeInformation)) - { - return FALSE; - } - - if (! PcVideoSetBiosVesaMode(NewMode)) - { - return FALSE; - } - - ScreenWidth = VesaVideoModeInformation.WidthInPixels; - ScreenHeight = VesaVideoModeInformation.HeightInPixels; - BytesPerScanLine = VesaVideoModeInformation.BytesPerScanLine; - BiosVideoMode = NewMode; - DisplayMode = VideoTextMode; - VesaVideoMode = TRUE; - - return TRUE; - } - else - { - /* VESA Graphics Mode */ - if (! PcVideoVesaGetSVGAModeInformation(NewMode, &VesaVideoModeInformation)) - { - return FALSE; - } - - if (! PcVideoSetBiosVesaMode(NewMode)) - { - return FALSE; - } - - ScreenWidth = VesaVideoModeInformation.WidthInPixels; - ScreenHeight = VesaVideoModeInformation.HeightInPixels; - BytesPerScanLine = VesaVideoModeInformation.BytesPerScanLine; - BiosVideoMode = NewMode; - DisplayMode = VideoTextMode; - VesaVideoMode = TRUE; - - return TRUE; - } - - return FALSE; -} - -static VOID -PcVideoSetBlinkBit(BOOLEAN Enable) -{ - REGS Regs; - - /* Int 10h AX=1003h - * VIDEO - TOGGLE INTENSITY/BLINKING BIT (Jr, PS, TANDY 1000, EGA, VGA) - * - * AX = 1003h - * BL = new state - * 00h background intensity enabled - * 01h blink enabled - * BH = 00h to avoid problems on some adapters - * Return: - * Nothing - * - * Note: although there is no function to get - * the current status, bit 5 of 0040h:0065h - * indicates the state. - */ - Regs.w.ax = 0x1003; - Regs.w.bx = Enable ? 0x0001 : 0x0000; - Int386(0x10, &Regs, &Regs); -} - -static VOID -PcVideoSetMemoryBank(USHORT BankNumber) -{ - REGS Regs; - - if (CurrentMemoryBank != BankNumber) - { - /* Int 10h AX=4F05h - * VESA SuperVGA BIOS - CPU VIDEO MEMORY CONTROL - * - * AX = 4F05h - * BH = subfunction - * 00h select video memory window - * 01h get video memory window - * DX = window address in video memory (in granularity units) - * Return: - * DX = window address in video memory (in gran. units) - * BL = window number - * 00h window A - * 01h window B. - * Return: - * AL = 4Fh if function supported - * AH = status - * 00h successful - * 01h failed - */ - Regs.w.ax = 0x4F05; - Regs.w.bx = 0x0000; - Regs.w.dx = BankNumber; - Int386(0x10, &Regs, &Regs); - - if (0x004F == Regs.w.ax) - { - CurrentMemoryBank = BankNumber; - } - } -} - -VIDEODISPLAYMODE -PcVideoSetDisplayMode(char *DisplayModeName, BOOLEAN Init) -{ - ULONG VideoMode = VIDEOMODE_NORMAL_TEXT; - - if (NULL == DisplayModeName || '\0' == *DisplayModeName) - { - PcVideoSetBlinkBit(! Init); - return DisplayMode; - } - - if (VIDEOCARD_CGA_OR_OTHER == PcVideoDetectVideoCard()) - { - DbgPrint((DPRINT_UI, "CGA or other display adapter detected.\n")); - printf("CGA or other display adapter detected.\n"); - printf("Using 80x25 text mode.\n"); - VideoMode = VIDEOMODE_NORMAL_TEXT; - } - else if (VIDEOCARD_EGA == PcVideoDetectVideoCard()) - { - DbgPrint((DPRINT_UI, "EGA display adapter detected.\n")); - printf("EGA display adapter detected.\n"); - printf("Using 80x25 text mode.\n"); - VideoMode = VIDEOMODE_NORMAL_TEXT; - } - else /* if (VIDEOCARD_VGA == PcVideoDetectVideoCard()) */ - { - DbgPrint((DPRINT_UI, "VGA display adapter detected.\n")); - - if (0 == _stricmp(DisplayModeName, "NORMAL_VGA")) - { - VideoMode = VIDEOMODE_NORMAL_TEXT; - } - else if (0 == _stricmp(DisplayModeName, "EXTENDED_VGA")) - { - VideoMode = VIDEOMODE_EXTENDED_TEXT; - } - else - { - VideoMode = atoi(DisplayModeName); - } - } - - if (! PcVideoSetMode(VideoMode)) - { - printf("Error: unable to set video display mode 0x%x\n", (int) VideoMode); - printf("Defaulting to 80x25 text mode.\n"); - printf("Press any key to continue.\n"); - PcConsGetCh(); - - PcVideoSetMode(VIDEOMODE_NORMAL_TEXT); - } - - PcVideoSetBlinkBit(! Init); - - - return DisplayMode; -} - -VOID -PcVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth) -{ - *Width = ScreenWidth; - *Height = ScreenHeight; - if (VideoGraphicsMode == DisplayMode && VesaVideoMode) - { - if (16 == VesaVideoModeInformation.BitsPerPixel) - { - /* 16-bit color modes give green an extra bit (5:6:5) - * 15-bit color modes have just 5:5:5 for R:G:B */ - *Depth = (6 == VesaVideoModeInformation.GreenMaskSize ? 16 : 15); - } - else - { - *Depth = VesaVideoModeInformation.BitsPerPixel; - } - } - else - { - *Depth = 0; - } -} - -ULONG -PcVideoGetBufferSize(VOID) -{ - return ScreenHeight * BytesPerScanLine; -} - -VOID -PcVideoSetTextCursorPosition(ULONG X, ULONG Y) -{ - REGS Regs; - - /* Int 10h AH=02h - * VIDEO - SET CURSOR POSITION - * - * AH = 02h - * BH = page number - * 0-3 in modes 2&3 - * 0-7 in modes 0&1 - * 0 in graphics modes - * DH = row (00h is top) - * DL = column (00h is left) - * Return: - * Nothing - */ - Regs.b.ah = 0x02; - Regs.b.bh = 0x00; - Regs.b.dh = Y; - Regs.b.dl = X; - Int386(0x10, &Regs, &Regs); -} - -VOID -PcVideoHideShowTextCursor(BOOLEAN Show) -{ - if (Show) - { - PcVideoDefineCursor(0x0D, 0x0E); - } - else - { - PcVideoDefineCursor(0x20, 0x00); - } -} - -VOID -PcVideoCopyOffScreenBufferToVRAM(PVOID Buffer) -{ - ULONG BanksToCopy; - ULONG BytesInLastBank; - ULONG CurrentBank; - ULONG BankSize; - - /* PcVideoWaitForVerticalRetrace(); */ - - /* Text mode (BIOS or VESA) */ - if (VideoTextMode == DisplayMode) - { - RtlCopyMemory((PVOID) VIDEOTEXT_MEM_ADDRESS, Buffer, PcVideoGetBufferSize()); - } - /* VESA graphics mode */ - else if (VideoGraphicsMode == DisplayMode && VesaVideoMode) - { - BankSize = VesaVideoModeInformation.WindowGranularity << 10; - BanksToCopy = (VesaVideoModeInformation.HeightInPixels * VesaVideoModeInformation.BytesPerScanLine) / BankSize; - BytesInLastBank = (VesaVideoModeInformation.HeightInPixels * VesaVideoModeInformation.BytesPerScanLine) % BankSize; - - /* Copy all the banks but the last one because - * it is probably a partial bank */ - for (CurrentBank = 0; CurrentBank < BanksToCopy; CurrentBank++) - { - PcVideoSetMemoryBank(CurrentBank); - RtlCopyMemory((PVOID) VIDEOVGA_MEM_ADDRESS, (char *) Buffer + CurrentBank * BankSize, BankSize); - } - - /* Copy the remaining bytes into the last bank */ - PcVideoSetMemoryBank(CurrentBank); - RtlCopyMemory((PVOID)VIDEOVGA_MEM_ADDRESS, (char *) Buffer + CurrentBank * BankSize, BytesInLastBank); - } - /* BIOS graphics mode */ - else - { - UNIMPLEMENTED; - } -} - -VOID -PcVideoClearScreen(UCHAR Attr) -{ - USHORT AttrChar; - USHORT *BufPtr; - - AttrChar = ((USHORT) Attr << 8) | ' '; - for (BufPtr = (USHORT *) VIDEOTEXT_MEM_ADDRESS; - BufPtr < (USHORT *) (VIDEOTEXT_MEM_ADDRESS + VIDEOTEXT_MEM_SIZE); - BufPtr++) - { - *BufPtr = AttrChar; - } -} - -VOID -PcVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y) -{ - USHORT *BufPtr; - - BufPtr = (USHORT *) (ULONG_PTR)(VIDEOTEXT_MEM_ADDRESS + Y * BytesPerScanLine + X * 2); - *BufPtr = ((USHORT) Attr << 8) | (Ch & 0xff); -} - -BOOLEAN -PcVideoIsPaletteFixed(VOID) -{ - return FALSE; -} - -VOID -PcVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue) -{ - WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_WRITE, Color); - WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA, Red); - WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA, Green); - WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA, Blue); -} - -VOID -PcVideoGetPaletteColor(UCHAR Color, UCHAR* Red, UCHAR* Green, UCHAR* Blue) -{ - WRITE_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_READ, Color); - *Red = READ_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA); - *Green = READ_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA); - *Blue = READ_PORT_UCHAR((UCHAR*) VIDEOPORT_PALETTE_DATA); -} - -VOID -PcVideoSync(VOID) -{ - while (1 == (READ_PORT_UCHAR((UCHAR*)VIDEOPORT_VERTICAL_RETRACE) & 0x08)) - { - /* - * Keep reading the port until bit 3 is clear - * This waits for the current retrace to end and - * we can catch the next one so we know we are - * getting a full retrace. - */ - } - - while (0 == (READ_PORT_UCHAR((UCHAR*)VIDEOPORT_VERTICAL_RETRACE) & 0x08)) - { - /* - * Keep reading the port until bit 3 is set - * Now that we know we aren't doing a vertical - * retrace we need to wait for the next one. - */ - } -} - -VOID -PcVideoPrepareForReactOS(IN BOOLEAN Setup) -{ - if (Setup) - { - PcVideoSetMode80x50_80x43(); - } - else - { - PcVideoSetBiosMode(0x12); - } - PcVideoHideShowTextCursor(FALSE); -} - -/* EOF */ From d50238833bf43f6827afe5157b931242bec73ed5 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 9 Jul 2009 21:49:04 +0000 Subject: [PATCH 288/577] - Fix a bug which was responsible for most audio-related crashes - Found by DosX (Gregor Schneider) - Fix memory leak See issue #4674 for more details. svn path=/trunk/; revision=41835 --- reactos/drivers/ksfilter/ks/topology.c | 5 ++--- reactos/drivers/wdm/audio/sysaudio/control.c | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/topology.c b/reactos/drivers/ksfilter/ks/topology.c index 21404d1b34e..a887eab8f90 100644 --- a/reactos/drivers/ksfilter/ks/topology.c +++ b/reactos/drivers/ksfilter/ks/topology.c @@ -19,7 +19,7 @@ KspCreateObjectType( OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING Name; - Name.Length = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize; + Name.Length = Name.MaximumLength = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize; Name.MaximumLength += sizeof(WCHAR); Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength); @@ -52,8 +52,7 @@ KspCreateObjectType( NULL, IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK); - // HACK HACK HACK HACK - //ExFreePool(Name.Buffer); + ExFreePool(Name.Buffer); return Status; } diff --git a/reactos/drivers/wdm/audio/sysaudio/control.c b/reactos/drivers/wdm/audio/sysaudio/control.c index fd1ca41ddb9..2463107b8db 100644 --- a/reactos/drivers/wdm/audio/sysaudio/control.c +++ b/reactos/drivers/wdm/audio/sysaudio/control.c @@ -42,7 +42,7 @@ KspCreateObjectType( OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING Name; - Name.Length = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize; + Name.Length = Name.MaximumLength = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize; Name.MaximumLength += sizeof(WCHAR); Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength); @@ -75,6 +75,8 @@ KspCreateObjectType( NULL, IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK); + ExFreePool(Name.Buffer); + return Status; } @@ -984,6 +986,7 @@ SysAudioHandleProperty( RtlStringFromGUID(&Property->Set, &GuidString); DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); + DbgBreakPoint(); RtlFreeUnicodeString(&GuidString); return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); } From e421f65c2bc0a6974218902fda4fff150fde01c1 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 9 Jul 2009 22:04:31 +0000 Subject: [PATCH 289/577] - Remove obsolete DbgBreakPoint svn path=/trunk/; revision=41836 --- reactos/drivers/wdm/audio/sysaudio/control.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/drivers/wdm/audio/sysaudio/control.c b/reactos/drivers/wdm/audio/sysaudio/control.c index 2463107b8db..8fca496c99f 100644 --- a/reactos/drivers/wdm/audio/sysaudio/control.c +++ b/reactos/drivers/wdm/audio/sysaudio/control.c @@ -986,7 +986,6 @@ SysAudioHandleProperty( RtlStringFromGUID(&Property->Set, &GuidString); DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); - DbgBreakPoint(); RtlFreeUnicodeString(&GuidString); return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); } From 2dbd55ac667473dcff7103d562838c2449b0b794 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Fri, 10 Jul 2009 01:06:09 +0000 Subject: [PATCH 290/577] - Fix a serious bug in KiDispatchException; DbgkForwardException got called with the SecondChance parameter set to FALSE when forwarding second chance exceptions to user mode debuggers! This bug, introduced in revision 23802, made second chance exceptions appear as first chance to user mode debuggers (meaning unhandled exceptions wouldn't get caught). Bug exposed by the ntdll winetest. svn path=/trunk/; revision=41837 --- reactos/ntoskrnl/ke/i386/exp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index a346b8a9214..4424a3d6416 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -1029,7 +1029,7 @@ DispatchToUser: } /* Try second chance */ - if (DbgkForwardException(ExceptionRecord, TRUE, FALSE)) + if (DbgkForwardException(ExceptionRecord, TRUE, TRUE)) { /* Handled, get out */ goto Exit; From 4af59e7e3397570a0f5aeb13a1b43be054c06348 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 10 Jul 2009 01:15:51 +0000 Subject: [PATCH 291/577] - Use the target hardware address to find the correct DHCP_ADAPTER for the received packet svn path=/trunk/; revision=41838 --- reactos/base/services/dhcp/adapter.c | 17 +++++++++++++++++ reactos/base/services/dhcp/dispatch.c | 12 +++++++++++- reactos/base/services/dhcp/include/rosdhcp.h | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/reactos/base/services/dhcp/adapter.c b/reactos/base/services/dhcp/adapter.c index 329abaa5b0e..3459a7263ee 100644 --- a/reactos/base/services/dhcp/adapter.c +++ b/reactos/base/services/dhcp/adapter.c @@ -355,6 +355,23 @@ PDHCP_ADAPTER AdapterFindInfo( struct interface_info *ip ) { return NULL; } +PDHCP_ADAPTER AdapterFindByHardwareAddress( u_int8_t haddr[16], u_int8_t hlen ) { + PDHCP_ADAPTER Adapter; + PLIST_ENTRY ListEntry; + + for(ListEntry = AdapterList.Flink; + ListEntry != &AdapterList; + ListEntry = ListEntry->Flink) { + Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry ); + if (Adapter->DhclientInfo.hw_address.hlen == hlen && + !memcmp(Adapter->DhclientInfo.hw_address.haddr, + haddr, + hlen)) return Adapter; + } + + return NULL; +} + PDHCP_ADAPTER AdapterGetFirst() { if( IsListEmpty( &AdapterList ) ) return NULL; else { return CONTAINING_RECORD diff --git a/reactos/base/services/dhcp/dispatch.c b/reactos/base/services/dhcp/dispatch.c index b88d5e26956..cc6575dca7b 100644 --- a/reactos/base/services/dhcp/dispatch.c +++ b/reactos/base/services/dhcp/dispatch.c @@ -231,6 +231,7 @@ got_one(struct protocol *l) struct dhcp_packet packet; } u; struct interface_info *ip = l->local; + PDHCP_ADAPTER adapter; if ((result = receive_packet(ip, u.packbuf, sizeof(u), &from, &hfrom)) == -1) { @@ -257,7 +258,16 @@ got_one(struct protocol *l) ifrom.len = 4; memcpy(ifrom.iabuf, &from.sin_addr, ifrom.len); - (*bootp_packet_handler)(ip, &u.packet, result, + + adapter = AdapterFindByHardwareAddress(u.packet.chaddr, + u.packet.hlen); + + if (!adapter) { + warning("Discarding packet with a non-matching target physical address\n"); + return; + } + + (*bootp_packet_handler)(&adapter->DhclientInfo, &u.packet, result, from.sin_port, ifrom, &hfrom); } } diff --git a/reactos/base/services/dhcp/include/rosdhcp.h b/reactos/base/services/dhcp/include/rosdhcp.h index 7f71a53ae9b..092b877888e 100644 --- a/reactos/base/services/dhcp/include/rosdhcp.h +++ b/reactos/base/services/dhcp/include/rosdhcp.h @@ -76,6 +76,7 @@ extern PDHCP_ADAPTER AdapterGetFirst(); extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER); extern PDHCP_ADAPTER AdapterFindIndex( unsigned int AdapterIndex ); extern PDHCP_ADAPTER AdapterFindInfo( struct interface_info *info ); +extern PDHCP_ADAPTER AdapterFindByHardwareAddress( u_int8_t haddr[16], u_int8_t hlen ); extern VOID ApiInit(); extern VOID ApiLock(); extern VOID ApiUnlock(); From 312cc466368cdd619bfe79e72c7dcbf6f09f825b Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Fri, 10 Jul 2009 10:02:37 +0000 Subject: [PATCH 292/577] - Add user mode buffer probing for NtCreateKey, NtEnumerateKey, NtEnumerateValueKey, NtQueryKey, NtQueryValueKey svn path=/trunk/; revision=41839 --- reactos/ntoskrnl/config/ntapi.c | 102 +++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/config/ntapi.c b/reactos/ntoskrnl/config/ntapi.c index 3a95860dd1f..3dd8e4f7a31 100644 --- a/reactos/ntoskrnl/config/ntapi.c +++ b/reactos/ntoskrnl/config/ntapi.c @@ -23,9 +23,9 @@ NtCreateKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG TitleIndex, - IN PUNICODE_STRING Class, + IN PUNICODE_STRING Class OPTIONAL, IN ULONG CreateOptions, - OUT PULONG Disposition) + OUT PULONG Disposition OPTIONAL) { NTSTATUS Status = STATUS_SUCCESS; KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); @@ -58,6 +58,8 @@ NtCreateKey(OUT PHANDLE KeyHandle, ProbeForRead(ObjectAttributes, sizeof(OBJECT_ATTRIBUTES), sizeof(ULONG)); + + if (Disposition) ProbeForWriteUlong(Disposition); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -228,6 +230,7 @@ NtEnumerateKey(IN HANDLE KeyHandle, IN ULONG Length, OUT PULONG ResultLength) { + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); NTSTATUS Status; PCM_KEY_BODY KeyObject; REG_ENUMERATE_KEY_INFORMATION EnumerateKeyInfo; @@ -254,6 +257,29 @@ NtEnumerateKey(IN HANDLE KeyHandle, NULL); if (!NT_SUCCESS(Status)) return Status; + if (PreviousMode != KernelMode) + { + _SEH2_TRY + { + ProbeForWriteUlong(ResultLength); + ProbeForWrite(KeyInformation, + Length, + sizeof(ULONG)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + if (!NT_SUCCESS(Status)) + { + /* Dereference and return status */ + ObDereferenceObject(KeyObject); + return Status; + } + } + /* Setup the callback */ PostOperationInfo.Object = (PVOID)KeyObject; EnumerateKeyInfo.Object = (PVOID)KeyObject; @@ -293,6 +319,7 @@ NtEnumerateValueKey(IN HANDLE KeyHandle, IN ULONG Length, OUT PULONG ResultLength) { + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); NTSTATUS Status; PCM_KEY_BODY KeyObject; REG_ENUMERATE_VALUE_KEY_INFORMATION EnumerateValueKeyInfo; @@ -319,6 +346,29 @@ NtEnumerateValueKey(IN HANDLE KeyHandle, NULL); if (!NT_SUCCESS(Status)) return Status; + if (PreviousMode != KernelMode) + { + _SEH2_TRY + { + ProbeForWriteUlong(ResultLength); + ProbeForWrite(KeyValueInformation, + Length, + sizeof(ULONG)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + if (!NT_SUCCESS(Status)) + { + /* Dereference and return status */ + ObDereferenceObject(KeyObject); + return Status; + } + } + /* Setup the callback */ PostOperationInfo.Object = (PVOID)KeyObject; EnumerateValueKeyInfo.Object = (PVOID)KeyObject; @@ -358,6 +408,7 @@ NtQueryKey(IN HANDLE KeyHandle, IN ULONG Length, OUT PULONG ResultLength) { + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); NTSTATUS Status; PCM_KEY_BODY KeyObject; REG_QUERY_KEY_INFORMATION QueryKeyInfo; @@ -414,6 +465,29 @@ NtQueryKey(IN HANDLE KeyHandle, /* Quit on failure */ if (!NT_SUCCESS(Status)) return Status; + if (PreviousMode != KernelMode) + { + _SEH2_TRY + { + ProbeForWriteUlong(ResultLength); + ProbeForWrite(KeyInformation, + Length, + sizeof(ULONG)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + if (!NT_SUCCESS(Status)) + { + /* Dereference and return status */ + ObDereferenceObject(KeyObject); + return Status; + } + } + /* Setup the callback */ PostOperationInfo.Object = (PVOID)KeyObject; QueryKeyInfo.Object = (PVOID)KeyObject; @@ -452,6 +526,7 @@ NtQueryValueKey(IN HANDLE KeyHandle, IN ULONG Length, OUT PULONG ResultLength) { + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); NTSTATUS Status; PCM_KEY_BODY KeyObject; REG_QUERY_VALUE_KEY_INFORMATION QueryValueKeyInfo; @@ -470,6 +545,29 @@ NtQueryValueKey(IN HANDLE KeyHandle, NULL); if (!NT_SUCCESS(Status)) return Status; + if (PreviousMode != KernelMode) + { + _SEH2_TRY + { + ProbeForWriteUlong(ResultLength); + ProbeForWrite(KeyValueInformation, + Length, + sizeof(ULONG)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + if (!NT_SUCCESS(Status)) + { + /* Dereference and return status */ + ObDereferenceObject(KeyObject); + return Status; + } + } + /* Make sure the name is aligned properly */ if ((ValueNameCopy.Length & (sizeof(WCHAR) - 1))) { From 660f744f6f853b1afafcccd9ab59422e09dfd55b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 10 Jul 2009 13:40:36 +0000 Subject: [PATCH 293/577] Add static palettes gpalRGB and gpalBGR. They will be used later. svn path=/trunk/; revision=41840 --- reactos/subsystems/win32/win32k/include/palette.h | 3 +++ reactos/subsystems/win32/win32k/objects/palette.c | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/reactos/subsystems/win32/win32k/include/palette.h b/reactos/subsystems/win32/win32k/include/palette.h index 8b557948b02..d50d939bd38 100644 --- a/reactos/subsystems/win32/win32k/include/palette.h +++ b/reactos/subsystems/win32/win32k/include/palette.h @@ -58,6 +58,9 @@ typedef struct _PALETTE HDEV hPDev; } PALETTE, *PPALETTE; +extern PALETTE gpalRGB, gpalBGR; + + HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode, ULONG NumColors, ULONG *Colors, diff --git a/reactos/subsystems/win32/win32k/objects/palette.c b/reactos/subsystems/win32/win32k/objects/palette.c index f1bf5ba6b86..70c3a79775f 100644 --- a/reactos/subsystems/win32/win32k/objects/palette.c +++ b/reactos/subsystems/win32/win32k/objects/palette.c @@ -14,6 +14,8 @@ static UINT SystemPaletteUse = SYSPAL_NOSTATIC; /* the program need save the pallete and restore it */ +PALETTE gpalRGB, gpalBGR; + const PALETTEENTRY g_sysPalTemplate[NB_RESERVED_COLORS] = { // first 10 entries in the system palette @@ -98,6 +100,16 @@ HPALETTE FASTCALL PALETTE_Init(VOID) /* palette_size = visual->map_entries; */ + gpalRGB.Mode = PAL_RGB; + gpalRGB.RedMask = RGB(0xFF, 0x00, 0x00); + gpalRGB.GreenMask = RGB(0x00, 0xFF, 0x00); + gpalRGB.BlueMask = RGB(0x00, 0x00, 0xFF); + + gpalBGR.Mode = PAL_BGR; + gpalBGR.RedMask = RGB(0x00, 0x00, 0xFF); + gpalBGR.GreenMask = RGB(0x00, 0xFF, 0x00); + gpalBGR.BlueMask = RGB(0xFF, 0x00, 0x00); + return hpalette; } From 976cb25f51add6ab3e85a309ffa6aa8929b7c933 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 10 Jul 2009 14:41:14 +0000 Subject: [PATCH 294/577] - Add create item flags svn path=/trunk/; revision=41841 --- reactos/include/psdk/ks.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/include/psdk/ks.h b/reactos/include/psdk/ks.h index 24fba94018a..6094507879e 100644 --- a/reactos/include/psdk/ks.h +++ b/reactos/include/psdk/ks.h @@ -1719,6 +1719,11 @@ typedef struct Objects ??? SORT ME! */ +#define KSCREATE_ITEM_SECURITYCHANGED 0x1 +#define KSCREATE_ITEM_WILDCARD 0x2 +#define KSCREATE_ITEM_NOPARAMETERS 0x4 +#define KSCREATE_ITEM_FREEONSTOP 0x8 + typedef struct { PDRIVER_DISPATCH Create; From b046ce1926e3ddb71003b8f46b2c4ca4283c049f Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 10 Jul 2009 15:14:56 +0000 Subject: [PATCH 295/577] [KS] - The pin creation parameters are now placed right after the reference string. Handle this case in KsValidateConnectRequest - Only store the passed create items, no need to copy the passed create items. This is required for enabling dynamic audio devices - Fix copying of the object class in KsAllocateObjectHeader - Check for KSCREATE_ITEM_IRP_STORAGE flag in KsCreate [PORTCLS] - Reduce initial audio buffer to about 1/3 second which greatly improves performance [SYSAUDIO] - Remove concept of audio subdevices - Remove imported KsCreatePin - Replace OpenDevice loop hack svn path=/trunk/; revision=41842 --- reactos/drivers/ksfilter/ks/connectivity.c | 17 +- reactos/drivers/ksfilter/ks/irp.c | 272 +++++++++------- reactos/drivers/ksfilter/ks/kstypes.h | 6 +- reactos/drivers/ksfilter/ks/misc.c | 6 +- reactos/drivers/ksfilter/ks/topology.c | 51 ++- .../wdm/audio/backpln/portcls/irpstream.c | 2 +- .../wdm/audio/backpln/portcls/port_topology.c | 83 +++-- .../drivers/wdm/audio/filters/kmixer/filter.c | 2 +- reactos/drivers/wdm/audio/sysaudio/control.c | 136 +------- reactos/drivers/wdm/audio/sysaudio/deviface.c | 306 ++++++++++-------- .../drivers/wdm/audio/sysaudio/dispatcher.c | 4 +- reactos/drivers/wdm/audio/sysaudio/main.c | 13 +- reactos/drivers/wdm/audio/sysaudio/sysaudio.h | 21 +- 13 files changed, 458 insertions(+), 461 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/connectivity.c b/reactos/drivers/ksfilter/ks/connectivity.c index d2744ff76a8..73921ee2163 100644 --- a/reactos/drivers/ksfilter/ks/connectivity.c +++ b/reactos/drivers/ksfilter/ks/connectivity.c @@ -45,15 +45,23 @@ KsValidateConnectRequest( PKSPIN_CONNECT ConnectDetails; LPWSTR PinName = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}\\"; PKSDATAFORMAT DataFormat; + LPWSTR Offset; IoStack = IoGetCurrentIrpStackLocation(Irp); if (!IoStack->FileObject->FileName.Buffer) return STATUS_INVALID_PARAMETER; - if (wcsncmp(IoStack->FileObject->FileName.Buffer, PinName, wcslen(PinName))) + if (IoStack->FileObject->FileName.Length < wcslen(PinName) + sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT)) return STATUS_INVALID_PARAMETER; - ConnectDetails = (PKSPIN_CONNECT)(IoStack->FileObject->FileName.Buffer + wcslen(PinName)); + Offset = wcsstr(IoStack->FileObject->FileName.Buffer, PinName); + if (!Offset) + { + /* request is not targeted for a pin */ + return STATUS_INVALID_PARAMETER; + } + + ConnectDetails = (PKSPIN_CONNECT)(Offset + wcslen(PinName)); if (ConnectDetails->PinToHandle != NULL) { @@ -61,11 +69,6 @@ KsValidateConnectRequest( return STATUS_NOT_IMPLEMENTED; } - if (IoStack->FileObject->FileName.Length < wcslen(PinName) + sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT)) - return STATUS_INVALID_PARAMETER; - - ConnectDetails = (PKSPIN_CONNECT)(IoStack->FileObject->FileName.Buffer + wcslen(PinName)); - if (ConnectDetails->PinId >= DescriptorsCount) return STATUS_INVALID_PARAMETER; diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index 5c34c72ec8f..336f8e783dc 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -104,14 +104,15 @@ KsAddObjectCreateItemToDeviceHeader( /* now scan the list and check for a free item */ for(Index = 0; Index < Header->MaxItems; Index++) { - if (!Header->ItemList[Index].bCreated) - { - if (FreeIndex == (ULONG)-1) - FreeIndex = Index; + ASSERT(Header->ItemList[Index].CreateItem); - continue; + if (Header->ItemList[Index].CreateItem->Create == NULL) + { + FreeIndex = Index; + break; } - else if (!wcsicmp(ObjectClass, Header->ItemList[Index].CreateItem.ObjectClass.Buffer)) + + if (!wcsicmp(ObjectClass, Header->ItemList[Index].CreateItem->ObjectClass.Buffer)) { /* the same object class already exists */ return STATUS_OBJECT_NAME_COLLISION; @@ -120,26 +121,17 @@ KsAddObjectCreateItemToDeviceHeader( /* found a free index */ if (FreeIndex == (ULONG)-1) { - /* allocate a new device entry */ - PDEVICE_ITEM Item = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_ITEM) * (Header->MaxItems + 1), TAG_DEVICE_HEADER); - if (!Item) - return STATUS_INSUFFICIENT_RESOURCES; - - RtlMoveMemory(Item, Header->ItemList, Header->MaxItems * sizeof(DEVICE_ITEM)); - ExFreePoolWithTag(Header->ItemList, TAG_DEVICE_HEADER); - - Header->ItemList = Item; - FreeIndex = Header->MaxItems; - Header->MaxItems++; + /* no empty space found */ + return STATUS_ALLOTTED_SPACE_EXCEEDED; } - /* store the new item */ - Header->ItemList[FreeIndex].bCreated = TRUE; - Header->ItemList[FreeIndex].CreateItem.Create = Create; - Header->ItemList[FreeIndex].CreateItem.Context = Context; - RtlInitUnicodeString(&Header->ItemList[FreeIndex].CreateItem.ObjectClass, ObjectClass); - Header->ItemList[FreeIndex].CreateItem.SecurityDescriptor = SecurityDescriptor; - Header->ItemList[FreeIndex].CreateItem.Flags = 0; + /* initialize create item */ + Header->ItemList[FreeIndex].CreateItem->Create = Create; + Header->ItemList[FreeIndex].CreateItem->Context = Context; + RtlInitUnicodeString(&Header->ItemList[FreeIndex].CreateItem->ObjectClass, ObjectClass); + Header->ItemList[FreeIndex].CreateItem->SecurityDescriptor = SecurityDescriptor; + + return STATUS_SUCCESS; } @@ -187,12 +179,8 @@ KsAllocateDeviceHeader( for(Index = 0; Index < ItemsCount; Index++) { - /* copy provided create items */ - RtlMoveMemory(&Header->ItemList[Index].CreateItem, &ItemsList[Index], sizeof(KSOBJECT_CREATE_ITEM)); - if (ItemsList[Index].Create!= NULL) - { - Header->ItemList[Index].bCreated = TRUE; - } + /* store provided create items */ + Header->ItemList[Index].CreateItem = &ItemsList[Index]; } Header->MaxItems = ItemsCount; } @@ -294,7 +282,6 @@ KsAllocateObjectHeader( PDEVICE_EXTENSION DeviceExtension; PKSIDEVICE_HEADER DeviceHeader; PKSIOBJECT_HEADER ObjectHeader; - WCHAR ObjectClass[50]; if (!Header) return STATUS_INVALID_PARAMETER_1; @@ -312,18 +299,10 @@ KsAllocateObjectHeader( /* get device header */ DeviceHeader = DeviceExtension->DeviceHeader; - ObjectClass[0] = L'\0'; + /* sanity check */ + ASSERT(IoStack->FileObject); /* check for an file object */ - if (IoStack->FileObject != NULL) - { - /* validate the file name */ - if (IoStack->FileObject->FileName.Length >= 38) - { - RtlMoveMemory(ObjectClass, IoStack->FileObject->FileName.Buffer, 38 * sizeof(WCHAR)); - ObjectClass[38] = L'\0'; - DPRINT("ObjectClass %S\n", ObjectClass); - } - } + /* allocate the object header */ ObjectHeader = ExAllocatePoolWithTag(NonPagedPool, sizeof(KSIOBJECT_HEADER), TAG_DEVICE_HEADER); if (!ObjectHeader) @@ -333,13 +312,17 @@ KsAllocateObjectHeader( RtlZeroMemory(ObjectHeader, sizeof(KSIOBJECT_HEADER)); /* do we have a name */ - if (ObjectClass[0]) + if (IoStack->FileObject->FileName.Buffer) { - ObjectHeader->ObjectClass = ExAllocatePoolWithTag(NonPagedPool, 40 * sizeof(WCHAR), TAG_DEVICE_HEADER); - if (ObjectHeader->ObjectClass) + /* copy object class */ + ObjectHeader->ObjectClass.MaximumLength = IoStack->FileObject->FileName.MaximumLength; + ObjectHeader->ObjectClass.Buffer = ExAllocatePoolWithTag(NonPagedPool, ObjectHeader->ObjectClass.MaximumLength, TAG_DEVICE_HEADER); + if (!ObjectHeader->ObjectClass.Buffer) { - wcscpy(ObjectHeader->ObjectClass, ObjectClass); + ExFreePoolWithTag(ObjectHeader, TAG_DEVICE_HEADER); + return STATUS_INSUFFICIENT_RESOURCES; } + RtlCopyUnicodeString(&ObjectHeader->ObjectClass, &IoStack->FileObject->FileName); } /* copy dispatch table */ @@ -362,7 +345,6 @@ KsAllocateObjectHeader( { /* the object header is for a audio filter */ ASSERT(DeviceHeader->DeviceIndex < DeviceHeader->MaxItems); - DeviceHeader->ItemList[DeviceHeader->DeviceIndex].ObjectHeader = ObjectHeader; IoStack->FileObject->FsContext = ObjectHeader; } @@ -370,7 +352,7 @@ KsAllocateObjectHeader( *Header = ObjectHeader; - DPRINT("KsAllocateObjectHeader ObjectClass %S FileObject %p, ObjectHeader %p\n", ObjectClass, IoStack->FileObject, ObjectHeader); + DPRINT("KsAllocateObjectHeader ObjectClass %S FileObject %p, ObjectHeader %p\n", ObjectHeader->ObjectClass.Buffer, IoStack->FileObject, ObjectHeader); return STATUS_SUCCESS; @@ -725,8 +707,9 @@ KsCreate( PDEVICE_EXTENSION DeviceExtension; PKSIDEVICE_HEADER DeviceHeader; ULONG Index; - NTSTATUS Status = STATUS_SUCCESS; + NTSTATUS Status; KIRQL OldLevel; + ULONG Length; DPRINT("KS / CREATE\n"); /* get current stack location */ @@ -738,56 +721,85 @@ KsCreate( /* acquire list lock */ KeAcquireSpinLock(&DeviceHeader->ItemListLock, &OldLevel); + + /* sanity check */ + ASSERT(IoStack->FileObject); + + if (IoStack->FileObject->FileName.Buffer == NULL && DeviceHeader->MaxItems == 1) + { + /* hack for bug 4566 */ + if (!DeviceHeader->ItemList[0].CreateItem || !DeviceHeader->ItemList[0].CreateItem->Create) + { + /* no valid create item */ + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + /* release lock */ + KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel); + /* return status */ + return STATUS_UNSUCCESSFUL; + } + + /* set object create item */ + KSCREATE_ITEM_IRP_STORAGE(Irp) = DeviceHeader->ItemList[0].CreateItem; + + /* call create function */ + Status = DeviceHeader->ItemList[0].CreateItem->Create(DeviceObject, Irp); + /* release lock */ + KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel); + /* return result */ + return Status; + } + + + /* hack for bug 4566 */ + if (IoStack->FileObject->FileName.Buffer == NULL) + { + DPRINT("Using reference string hack\n"); + /* release lock */ + KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel); + Irp->IoStatus.Information = 0; + /* set return status */ + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; + } + /* loop all device items */ for(Index = 0; Index < DeviceHeader->MaxItems; Index++) { - if (DeviceHeader->ItemList[Index].bCreated && DeviceHeader->ItemList[Index].ObjectHeader == NULL) + /* is there a create item */ + if (DeviceHeader->ItemList[Index].CreateItem == NULL) + continue; + + /* check if the create item is initialized */ + if (!DeviceHeader->ItemList[Index].CreateItem->Create) + continue; + + ASSERT(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer); + DPRINT("CreateItem %p Request %S\n", DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer, + IoStack->FileObject->FileName.Buffer); + + /* get object class length */ + Length = wcslen(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer); + /* now check if the object class is the same */ + if (!_wcsnicmp(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer, &IoStack->FileObject->FileName.Buffer[1], Length) || + (DeviceHeader->ItemList[Index].CreateItem->Flags & KSCREATE_ITEM_WILDCARD)) { + /* setup create parameters */ DeviceHeader->DeviceIndex = Index; /* set object create item */ - KSCREATE_ITEM_IRP_STORAGE(Irp) = &DeviceHeader->ItemList[Index].CreateItem; - Status = DeviceHeader->ItemList[Index].CreateItem.Create(DeviceObject, Irp); + KSCREATE_ITEM_IRP_STORAGE(Irp) = DeviceHeader->ItemList[Index].CreateItem; - /* FIXME IoRegisterDeviceInterface does not support reference strings */ - /* FIXME Check the irp target with the create item's object class */ - if (NT_SUCCESS(Status)) - { - /* release lock */ - KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel); - return Status; - } + /* call create function */ + Status = DeviceHeader->ItemList[Index].CreateItem->Create(DeviceObject, Irp); + + /* release lock */ + KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel); + + /* return result */ + return Status; } - else if (DeviceHeader->ItemList[Index].bCreated && IoStack->FileObject->FileName.Buffer != NULL) - { - ULONG Length; - - ASSERT(DeviceHeader->ItemList[Index].ObjectHeader); - ASSERT(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem); - ASSERT(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer); - - Length = wcslen(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer); - - /* filter for that type has already exists */ - if (!_wcsnicmp(DeviceHeader->ItemList[Index].ObjectHeader->CreateItem->ObjectClass.Buffer, - IoStack->FileObject->FileName.Buffer, - Length)) - { - if (IoStack->FileObject->FileName.Buffer[0] != L'{') - { - RtlMoveMemory(IoStack->FileObject->FileName.Buffer, &IoStack->FileObject->FileName.Buffer[Length+1], - IoStack->FileObject->FileName.Length - (Length + 1) * sizeof(WCHAR)); - - IoStack->FileObject->FileName.Length -= (Length + 1)* sizeof(WCHAR); - } - - - KSCREATE_ITEM_IRP_STORAGE(Irp) = &DeviceHeader->ItemList[Index].CreateItem; - Status = DeviceHeader->ItemList[Index].CreateItem.Create(DeviceObject, Irp); - KeReleaseSpinLock(&DeviceHeader->ItemListLock, OldLevel); - return Status; - } - } - } /* release lock */ @@ -810,7 +822,6 @@ KsClose( PKSIOBJECT_HEADER ObjectHeader; PDEVICE_EXTENSION DeviceExtension; PKSIDEVICE_HEADER DeviceHeader; - ULONG Index; /* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -827,20 +838,20 @@ KsClose( ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext; KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem; - - for(Index = 0; Index < DeviceHeader->MaxItems; Index++) - { - if (DeviceHeader->ItemList[Index].ObjectHeader == ObjectHeader) - { - DeviceHeader->ItemList[Index].ObjectHeader = NULL; - } - } return ObjectHeader->DispatchTable.Close(DeviceObject, Irp); } else { +#if 0 DPRINT1("Expected Object Header FileObject %p FsContext %p\n", IoStack->FileObject, IoStack->FileObject->FsContext); KeBugCheckEx(0, 0, 0, 0, 0); +#else + DPRINT("Using reference string hack\n"); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; +#endif return STATUS_SUCCESS; } } @@ -853,10 +864,63 @@ KsDeviceControl( { PIO_STACK_LOCATION IoStack; PKSIOBJECT_HEADER ObjectHeader; + PKSIDEVICE_HEADER DeviceHeader; + PDEVICE_EXTENSION DeviceExtension; + ULONG Length, Index; + LPWSTR Buffer; /* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); + /* hack for bug 4566 */ + if (IoStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_OBJECT_CLASS) + { + /* get device extension */ + DeviceExtension = (PDEVICE_EXTENSION)IoStack->DeviceObject->DeviceExtension; + /* get device header */ + DeviceHeader = DeviceExtension->DeviceHeader; + + /* retrieve all available reference strings registered */ + Length = 0; + + for(Index = 0; Index < DeviceHeader->MaxItems; Index++) + { + if (!DeviceHeader->ItemList[Index].CreateItem || !DeviceHeader->ItemList[Index].CreateItem->Create || !DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer) + continue; + + Length += wcslen(DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer) + 1; + } + + /* add extra zero */ + Length += 1; + + /* allocate the buffer */ + Buffer = ExAllocatePool(NonPagedPool, Length * sizeof(WCHAR)); + if (!Buffer) + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_INSUFFICIENT_RESOURCES; + } + + *((LPWSTR*)Irp->UserBuffer) = Buffer; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(LPWSTR); + + for(Index = 0; Index < DeviceHeader->MaxItems; Index++) + { + if (!DeviceHeader->ItemList[Index].CreateItem || !DeviceHeader->ItemList[Index].CreateItem->Create || !DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer) + continue; + + wcscpy(Buffer, DeviceHeader->ItemList[Index].CreateItem->ObjectClass.Buffer); + Buffer += wcslen(Buffer) + 1; + } + *Buffer = L'\0'; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; + } + DPRINT("KS / DeviceControl\n"); if (IoStack->FileObject && IoStack->FileObject->FsContext) { @@ -864,14 +928,6 @@ KsDeviceControl( KSCREATE_ITEM_IRP_STORAGE(Irp) = ObjectHeader->CreateItem; - if (IoStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_OBJECT_CLASS) - { - *((LPWSTR*)Irp->UserBuffer) = ObjectHeader->CreateItem->ObjectClass.Buffer; - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = sizeof(LPWSTR); - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_SUCCESS; - } return ObjectHeader->DispatchTable.DeviceIoControl(DeviceObject, Irp); } else diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index 68a563c7747..89f2cf70a97 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -6,17 +6,15 @@ struct KSIDEVICE_HEADER; typedef struct { KSDISPATCH_TABLE DispatchTable; - LPWSTR ObjectClass; ULONG ItemCount; PKSOBJECT_CREATE_ITEM CreateItem; + UNICODE_STRING ObjectClass; }KSIOBJECT_HEADER, *PKSIOBJECT_HEADER; typedef struct { - BOOL bCreated; - PKSIOBJECT_HEADER ObjectHeader; - KSOBJECT_CREATE_ITEM CreateItem; + PKSOBJECT_CREATE_ITEM CreateItem; }DEVICE_ITEM, *PDEVICE_ITEM; diff --git a/reactos/drivers/ksfilter/ks/misc.c b/reactos/drivers/ksfilter/ks/misc.c index c40226662f2..a20d2dd181f 100644 --- a/reactos/drivers/ksfilter/ks/misc.c +++ b/reactos/drivers/ksfilter/ks/misc.c @@ -282,16 +282,18 @@ KsSynchronousIoControlDevice( if (!DeviceObject) return STATUS_UNSUCCESSFUL; + /* get object header */ ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; +#if 0 if (!ObjectHeader) { DPRINT("Expected object header\n"); return STATUS_UNSUCCESSFUL; } - +#endif /* check if there is fast device io function */ - if (ObjectHeader->DispatchTable.FastDeviceIoControl) + if (ObjectHeader && ObjectHeader->DispatchTable.FastDeviceIoControl) { IoStatusBlock.Status = STATUS_UNSUCCESSFUL; IoStatusBlock.Information = 0; diff --git a/reactos/drivers/ksfilter/ks/topology.c b/reactos/drivers/ksfilter/ks/topology.c index a887eab8f90..07d7d855855 100644 --- a/reactos/drivers/ksfilter/ks/topology.c +++ b/reactos/drivers/ksfilter/ks/topology.c @@ -17,26 +17,56 @@ KspCreateObjectType( NTSTATUS Status; IO_STATUS_BLOCK IoStatusBlock; OBJECT_ATTRIBUTES ObjectAttributes; + PFILE_OBJECT FileObject; UNICODE_STRING Name; + PKSIOBJECT_HEADER ObjectHeader; - Name.Length = Name.MaximumLength = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize; + /* acquire parent file object */ + Status = ObReferenceObjectByHandle(ParentHandle, + GENERIC_READ | GENERIC_WRITE, + IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed to reference parent %x\n", Status); + return Status; + } + + /* get parent object header */ + ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; + /* sanity check */ + ASSERT(ObjectHeader); + + /* calculate request length */ + Name.Length = 0; + Name.MaximumLength = wcslen(ObjectType) * sizeof(WCHAR) + CreateParametersSize + ObjectHeader->ObjectClass.MaximumLength + 2 * sizeof(WCHAR); Name.MaximumLength += sizeof(WCHAR); + /* acquire request buffer */ Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength); - + /* check for success */ if (!Name.Buffer) { + /* insufficient resources */ + ObDereferenceObject(FileObject); return STATUS_INSUFFICIENT_RESOURCES; } - wcscpy(Name.Buffer, ObjectType); - Name.Buffer[wcslen(ObjectType)] = '\\'; - - RtlMoveMemory(Name.Buffer + wcslen(ObjectType) +1, CreateParameters, CreateParametersSize); - + /* build a request which looks like \Parent\{ObjectGuid}\CreateParameters + * For pins the parent is the reference string used in registration + * For clocks it is full path for pin\{ClockGuid}\ClockCreateParams + */ + + RtlAppendUnicodeStringToString(&Name, &ObjectHeader->ObjectClass); + RtlAppendUnicodeToString(&Name, L"\\"); + RtlAppendUnicodeToString(&Name, ObjectType); + RtlAppendUnicodeToString(&Name, L"\\"); + /* append create parameters */ + RtlMoveMemory(Name.Buffer + (Name.Length / sizeof(WCHAR)), CreateParameters, CreateParametersSize); + Name.Length += CreateParametersSize; Name.Buffer[Name.Length / 2] = L'\0'; + InitializeObjectAttributes(&ObjectAttributes, &Name, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE | OBJ_OPENIF, ParentHandle, NULL); - - + /* create the instance */ Status = IoCreateFile(NodeHandle, DesiredAccess, &ObjectAttributes, @@ -52,7 +82,10 @@ KspCreateObjectType( NULL, IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK); + /* free request buffer */ ExFreePool(Name.Buffer); + /* release parent handle */ + ObDereferenceObject(FileObject); return Status; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c index 1fecad8d28f..dd5de4d2ccc 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c @@ -314,7 +314,7 @@ IIrpQueue_fnMinimumDataAvailable( if (This->StartStream) return TRUE; - if (This->DataFormat->WaveFormatEx.nAvgBytesPerSec < This->NumDataAvailable) + if (This->DataFormat->WaveFormatEx.nAvgBytesPerSec/3 < This->NumDataAvailable) { This->StartStream = TRUE; Result = TRUE; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c index 4b8b7e34d22..fcacc43ef12 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c @@ -542,6 +542,8 @@ PcCreateItemDispatch( IIrpTarget *Filter; PKSOBJECT_CREATE_ITEM CreateItem; PPIN_WORKER_CONTEXT Context; + LPWSTR Buffer; + static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"; DPRINT1("PcCreateItemDispatch called DeviceObject %p\n", DeviceObject); @@ -604,60 +606,55 @@ PcCreateItemDispatch( return Status; } - /* is just the filter requested */ - if (IoStack->FileObject->FileName.Buffer == NULL) + /* get the buffer */ + Buffer = IoStack->FileObject->FileName.Buffer; + + /* check if the request contains a pin request */ + if (!wcsstr(Buffer, KS_NAME_PIN)) { - /* create the dispatch object */ + /* creator just wants the filter object */ Status = NewDispatchObject(Irp, Filter, CreateItem->ObjectClass.Buffer); DPRINT1("Filter %p\n", Filter); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; } else { - LPWSTR Buffer = IoStack->FileObject->FileName.Buffer; - - static LPWSTR KS_NAME_PIN = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"; - - /* is the request for a new pin */ - if (!wcsncmp(KS_NAME_PIN, Buffer, wcslen(KS_NAME_PIN))) + /* try to create new pin */ + Context = AllocateItem(NonPagedPool, sizeof(PIN_WORKER_CONTEXT), TAG_PORTCLASS); + if (!Context) { - /* try to create new pin */ - Context = AllocateItem(NonPagedPool, sizeof(PIN_WORKER_CONTEXT), TAG_PORTCLASS); - if (!Context) - { - DPRINT("Failed to allocate worker context\n"); - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_INSUFFICIENT_RESOURCES; - } - /* allocate work item */ - Context->WorkItem = IoAllocateWorkItem(DeviceObject); - if (!Context->WorkItem) - { - DPRINT("Failed to allocate workitem\n"); - FreeItem(Context, TAG_PORTCLASS); - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_INSUFFICIENT_RESOURCES; - } - - Context->Filter = Filter; - Context->Irp = Irp; - - DPRINT("Queueing IRP %p Irql %u\n", Irp, KeGetCurrentIrql()); + DPRINT("Failed to allocate worker context\n"); Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = STATUS_PENDING; - IoMarkIrpPending(Irp); - IoQueueWorkItem(Context->WorkItem, CreatePinWorkerRoutine, DelayedWorkQueue, (PVOID)Context); - return STATUS_PENDING; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_INSUFFICIENT_RESOURCES; } + /* allocate work item */ + Context->WorkItem = IoAllocateWorkItem(DeviceObject); + if (!Context->WorkItem) + { + DPRINT("Failed to allocate workitem\n"); + FreeItem(Context, TAG_PORTCLASS); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_INSUFFICIENT_RESOURCES; + } + + Context->Filter = Filter; + Context->Irp = Irp; + + DPRINT("Queueing IRP %p Irql %u\n", Irp, KeGetCurrentIrql()); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_PENDING; + IoMarkIrpPending(Irp); + IoQueueWorkItem(Context->WorkItem, CreatePinWorkerRoutine, DelayedWorkQueue, (PVOID)Context); + return STATUS_PENDING; } - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; } diff --git a/reactos/drivers/wdm/audio/filters/kmixer/filter.c b/reactos/drivers/wdm/audio/filters/kmixer/filter.c index 68400372d39..a71e8fceea9 100644 --- a/reactos/drivers/wdm/audio/filters/kmixer/filter.c +++ b/reactos/drivers/wdm/audio/filters/kmixer/filter.c @@ -201,7 +201,7 @@ DispatchCreateKMix( if (Buffer) { /* is the request for a new pin */ - if (!wcsncmp(KS_NAME_PIN, Buffer, wcslen(KS_NAME_PIN))) + if (!wcsstr(KS_NAME_PIN, Buffer)) { Status = CreatePin(Irp); diff --git a/reactos/drivers/wdm/audio/sysaudio/control.c b/reactos/drivers/wdm/audio/sysaudio/control.c index 8fca496c99f..1b582d6c9d8 100644 --- a/reactos/drivers/wdm/audio/sysaudio/control.c +++ b/reactos/drivers/wdm/audio/sysaudio/control.c @@ -20,97 +20,13 @@ const GUID KSDATAFORMAT_SPECIFIER_WAVEFORMATEX = {0x05589f81L, 0xc356, 0x11ce, NTSTATUS ComputeCompatibleFormat( - IN PKSAUDIO_SUBDEVICE_ENTRY Entry, + IN PKSAUDIO_DEVICE_ENTRY Entry, IN ULONG PinId, IN PSYSAUDIODEVEXT DeviceExtension, IN PKSDATAFORMAT_WAVEFORMATEX ClientFormat, OUT PKSDATAFORMAT_WAVEFORMATEX MixerFormat); -NTSTATUS -NTAPI -KspCreateObjectType( - IN HANDLE ParentHandle, - IN LPWSTR ObjectType, - PVOID CreateParameters, - UINT CreateParametersSize, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE NodeHandle) -{ - NTSTATUS Status; - IO_STATUS_BLOCK IoStatusBlock; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING Name; - - Name.Length = Name.MaximumLength = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize; - Name.MaximumLength += sizeof(WCHAR); - Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength); - - if (!Name.Buffer) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - wcscpy(Name.Buffer, ObjectType); - Name.Buffer[wcslen(ObjectType)] = '\\'; - - RtlMoveMemory(Name.Buffer + wcslen(ObjectType) +1, CreateParameters, CreateParametersSize); - - Name.Buffer[Name.Length / 2] = L'\0'; - InitializeObjectAttributes(&ObjectAttributes, &Name, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE | OBJ_OPENIF, ParentHandle, NULL); - - - Status = IoCreateFile(NodeHandle, - DesiredAccess, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - 0, - FILE_OPEN, - FILE_SYNCHRONOUS_IO_NONALERT, - NULL, - 0, - CreateFileTypeNone, - NULL, - IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK); - - ExFreePool(Name.Buffer); - - return Status; -} - -KSDDKAPI -NTSTATUS -NTAPI -KsoCreatePin( - IN HANDLE FilterHandle, - IN PKSPIN_CONNECT Connect, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE ConnectionHandle, - IN LPWSTR ObjectClass) -{ - WCHAR szBuffer[100]; - UINT ConnectSize = sizeof(KSPIN_CONNECT); - - PKSDATAFORMAT_WAVEFORMATEX Format = (PKSDATAFORMAT_WAVEFORMATEX)(Connect + 1); - if (Format->DataFormat.FormatSize == sizeof(KSDATAFORMAT) || - Format->DataFormat.FormatSize == sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX)) - { - ConnectSize += Format->DataFormat.FormatSize; - } - - swprintf(szBuffer, L"%s\\{146F1A80-4791-11D0-A5D6-28DB04C10000}", ObjectClass); - - return KspCreateObjectType(FilterHandle, - szBuffer, - (PVOID)Connect, - ConnectSize, - DesiredAccess, - ConnectionHandle); -} - - NTSTATUS SetIrpIoStatus( IN PIRP Irp, @@ -131,38 +47,20 @@ SetIrpIoStatus( } -PKSAUDIO_SUBDEVICE_ENTRY +PKSAUDIO_DEVICE_ENTRY GetListEntry( IN PLIST_ENTRY Head, IN ULONG Index) { - PKSAUDIO_DEVICE_ENTRY DeviceEntry; - PKSAUDIO_SUBDEVICE_ENTRY SubDeviceEntry; - PLIST_ENTRY SubEntry, Entry = Head->Flink; - - while(Entry != Head) - { - DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)CONTAINING_RECORD(Entry, KSAUDIO_DEVICE_ENTRY, Entry); - if (Index < DeviceEntry->NumSubDevices) - { - SubEntry = DeviceEntry->SubDeviceList.Flink; - while(SubEntry != &DeviceEntry->SubDeviceList && Index--) - SubEntry = SubEntry->Flink; - - SubDeviceEntry = (PKSAUDIO_SUBDEVICE_ENTRY)CONTAINING_RECORD(SubEntry, KSAUDIO_SUBDEVICE_ENTRY, Entry); - return SubDeviceEntry; - } - else - { - Index -= DeviceEntry->NumSubDevices; - } + PLIST_ENTRY Entry = Head->Flink; + while(Index-- && Entry != Head) Entry = Entry->Flink; - } - DPRINT1("Not Found index %u\n", Index); + if (Entry == Head) + return NULL; - return NULL; + return (PKSAUDIO_DEVICE_ENTRY)CONTAINING_RECORD(Entry, KSAUDIO_DEVICE_ENTRY, Entry); } NTSTATUS @@ -171,7 +69,7 @@ SysAudioOpenVirtualDevice( IN ULONG DeviceNumber, PSYSAUDIODEVEXT DeviceExtension) { - PKSAUDIO_SUBDEVICE_ENTRY Entry; + PKSAUDIO_DEVICE_ENTRY Entry; PKSOBJECT_CREATE_ITEM CreateItem; /* access the create item */ @@ -243,7 +141,7 @@ CreateMixerPinAndSetFormat( HANDLE PinHandle; PFILE_OBJECT FileObject; - Status = KsoCreatePin(KMixerHandle, PinConnect, GENERIC_READ | GENERIC_WRITE, &PinHandle, L"KMixer"); + Status = KsCreatePin(KMixerHandle, PinConnect, GENERIC_READ | GENERIC_WRITE, &PinHandle);//, L"KMixer"); if (!NT_SUCCESS(Status)) { @@ -305,7 +203,7 @@ CreatePinWorkerRoutine( /* Let's try to create the audio irp pin */ - Status = KsoCreatePin(WorkerContext->Entry->Handle, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle, WorkerContext->Entry->ObjectClass); + Status = KsCreatePin(WorkerContext->Entry->Handle, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle); if (!NT_SUCCESS(Status)) { @@ -345,7 +243,7 @@ CreatePinWorkerRoutine( } /* Retry with Mixer format */ - Status = KsoCreatePin(WorkerContext->Entry->Handle, MixerPinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle, WorkerContext->Entry->ObjectClass); + Status = KsCreatePin(WorkerContext->Entry->Handle, MixerPinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle); //, WorkerContext->Entry->ObjectClass); if (!NT_SUCCESS(Status)) { /* This should not fail */ @@ -390,7 +288,7 @@ CreatePinWorkerRoutine( DPRINT1("creating virtual pin\n"); /* now create the virtual audio pin which is exposed to wdmaud */ - Status = KsoCreatePin(Filter, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &VirtualPinHandle, L"SysAudio"); + Status = KsCreatePin(Filter, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &VirtualPinHandle); //, L"SysAudio"); if (!NT_SUCCESS(Status)) { @@ -454,7 +352,7 @@ HandleSysAudioFilterPinProperties( { PIO_STACK_LOCATION IoStack; NTSTATUS Status; - PKSAUDIO_SUBDEVICE_ENTRY Entry; + PKSAUDIO_DEVICE_ENTRY Entry; ULONG BytesReturned; PKSP_PIN Pin; @@ -541,7 +439,7 @@ HandleSysAudioFilterPinProperties( NTSTATUS ComputeCompatibleFormat( - IN PKSAUDIO_SUBDEVICE_ENTRY Entry, + IN PKSAUDIO_DEVICE_ENTRY Entry, IN ULONG PinId, IN PSYSAUDIODEVEXT DeviceExtension, IN PKSDATAFORMAT_WAVEFORMATEX ClientFormat, @@ -676,7 +574,7 @@ ComputeCompatibleFormat( NTSTATUS GetPinInstanceCount( - PKSAUDIO_SUBDEVICE_ENTRY Entry, + PKSAUDIO_DEVICE_ENTRY Entry, PKSPIN_CINSTANCES PinInstances, PKSPIN_CONNECT PinConnect) { @@ -701,7 +599,7 @@ HandleSysAudioFilterPinCreation( PDEVICE_OBJECT DeviceObject) { ULONG Length; - PKSAUDIO_SUBDEVICE_ENTRY Entry; + PKSAUDIO_DEVICE_ENTRY Entry; KSPIN_CONNECT * PinConnect; PIO_STACK_LOCATION IoStack; PSYSAUDIO_INSTANCE_INFO InstanceInfo; @@ -848,7 +746,7 @@ SysAudioHandleProperty( PULONG Index; PKSPROPERTY Property; PSYSAUDIODEVEXT DeviceExtension; - PKSAUDIO_SUBDEVICE_ENTRY Entry; + PKSAUDIO_DEVICE_ENTRY Entry; PSYSAUDIO_INSTANCE_INFO InstanceInfo; ULONG BytesReturned; PKSOBJECT_CREATE_ITEM CreateItem; diff --git a/reactos/drivers/wdm/audio/sysaudio/deviface.c b/reactos/drivers/wdm/audio/sysaudio/deviface.c index d76cb5f3e81..d9a85676221 100644 --- a/reactos/drivers/wdm/audio/sysaudio/deviface.c +++ b/reactos/drivers/wdm/audio/sysaudio/deviface.c @@ -18,7 +18,7 @@ const GUID DMOCATEGORY_ACOUSTIC_ECHO_CANCEL = {0xBF963D80L, 0xC559, 0x11D0, { VOID QueryFilterRoutine( - IN PKSAUDIO_SUBDEVICE_ENTRY DeviceEntry) + IN PKSAUDIO_DEVICE_ENTRY DeviceEntry) { KSPROPERTY PropertyRequest; KSP_PIN PinRequest; @@ -32,15 +32,6 @@ QueryFilterRoutine( DPRINT("Querying filter...\n"); - Status = KsSynchronousIoControlDevice(DeviceEntry->FileObject, KernelMode, IOCTL_KS_OBJECT_CLASS, NULL, 0, &DeviceEntry->ObjectClass, sizeof(LPWSTR), &BytesReturned); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to query object class Status %x\n", Status); - return; - } - - DPRINT("ObjectClass %S\n", DeviceEntry->ObjectClass); - PropertyRequest.Set = KSPROPSETID_Pin; PropertyRequest.Flags = KSPROPERTY_TYPE_GET; PropertyRequest.Id = KSPROPERTY_PIN_CTYPES; @@ -114,9 +105,6 @@ QueryFilterRoutine( DPRINT("Num Pins %u Num WaveIn Pins %u Name WaveOut Pins %u\n", DeviceEntry->NumberOfPins, NumWaveInPin, NumWaveOutPin); } - - - VOID NTAPI FilterPinWorkerRoutine( @@ -124,21 +112,11 @@ FilterPinWorkerRoutine( IN PVOID Context) { PKSAUDIO_DEVICE_ENTRY DeviceEntry; - PKSAUDIO_SUBDEVICE_ENTRY SubDeviceEntry; - PLIST_ENTRY ListEntry; - PFILTER_WORKER_CONTEXT Ctx = (PFILTER_WORKER_CONTEXT)Context; DeviceEntry = Ctx->DeviceEntry; - ListEntry = DeviceEntry->SubDeviceList.Flink; - while(ListEntry != &DeviceEntry->SubDeviceList) - { - SubDeviceEntry = (PKSAUDIO_SUBDEVICE_ENTRY)CONTAINING_RECORD(ListEntry, KSAUDIO_SUBDEVICE_ENTRY, Entry); - QueryFilterRoutine(SubDeviceEntry); - ListEntry = ListEntry->Flink; - } - + QueryFilterRoutine(DeviceEntry); /* free work item */ IoFreeWorkItem(Ctx->WorkItem); @@ -177,7 +155,7 @@ OpenDevice( if (!NT_SUCCESS(Status)) { - DPRINT("ZwCreateFile failed with %x\n", Status); + DPRINT("ZwCreateFile failed with %x %S\n", Status, DeviceName->Buffer); return Status; } @@ -195,125 +173,92 @@ OpenDevice( } NTSTATUS -NTAPI -DeviceInterfaceChangeCallback( - IN PVOID NotificationStructure, - IN PVOID Context) +InsertAudioDevice( + IN PDEVICE_OBJECT DeviceObject, + IN PUNICODE_STRING DeviceName, + IN LPWSTR ReferenceString) { - DEVICE_INTERFACE_CHANGE_NOTIFICATION * Event; NTSTATUS Status = STATUS_SUCCESS; + PFILTER_WORKER_CONTEXT Ctx = NULL; + PIO_WORKITEM WorkItem = NULL; PSYSAUDIODEVEXT DeviceExtension; PKSAUDIO_DEVICE_ENTRY DeviceEntry = NULL; - PKSAUDIO_SUBDEVICE_ENTRY SubDeviceEntry; - PIO_WORKITEM WorkItem = NULL; - PFILTER_WORKER_CONTEXT Ctx = NULL; - PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)Context; + /* a new device has arrived */ + DeviceEntry = ExAllocatePool(NonPagedPool, sizeof(KSAUDIO_DEVICE_ENTRY)); + if (!DeviceEntry) + { + /* no memory */ + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* initialize audio device entry */ + RtlZeroMemory(DeviceEntry, sizeof(KSAUDIO_DEVICE_ENTRY)); + + /* allocate filter ctx */ + Ctx = ExAllocatePool(NonPagedPool, sizeof(FILTER_WORKER_CONTEXT)); + if (!Ctx) + { + /* no memory */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + /* allocate work item */ + WorkItem = IoAllocateWorkItem(DeviceObject); + if (!WorkItem) + { + /* no memory */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + /* set device name */ + DeviceEntry->DeviceName.Length = 0; + DeviceEntry->DeviceName.MaximumLength = DeviceName->MaximumLength + 10 * sizeof(WCHAR); + + /* hack for bug 4566 */ + if (ReferenceString) + { + DeviceEntry->DeviceName.MaximumLength += (wcslen(ReferenceString) + 2) * sizeof(WCHAR); + } + + DeviceEntry->DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceEntry->DeviceName.MaximumLength); + + if (!DeviceEntry->DeviceName.Buffer) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\??\\"); + RtlAppendUnicodeStringToString(&DeviceEntry->DeviceName, DeviceName); + + if (ReferenceString) + { + RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\"); + RtlAppendUnicodeToString(&DeviceEntry->DeviceName, ReferenceString); + } + + Status = OpenDevice(&DeviceEntry->DeviceName, &DeviceEntry->Handle, &DeviceEntry->FileObject); + + if (!NT_SUCCESS(Status)) + { + goto cleanup; + } + + Ctx->DeviceEntry = DeviceEntry; + Ctx->WorkItem = WorkItem; + + /* fetch device extension */ DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension; + /* insert new audio device */ + ExInterlockedInsertTailList(&DeviceExtension->KsAudioDeviceList, &DeviceEntry->Entry, &DeviceExtension->Lock); + InterlockedIncrement((PLONG)&DeviceExtension->NumberOfKsAudioDevices); - Event = (DEVICE_INTERFACE_CHANGE_NOTIFICATION*)NotificationStructure; - - if (IsEqualGUIDAligned(&Event->Event, - &GUID_DEVICE_INTERFACE_ARRIVAL)) - { - - /* a new device has arrived */ - DeviceEntry = ExAllocatePool(NonPagedPool, sizeof(KSAUDIO_DEVICE_ENTRY)); - if (!DeviceEntry) - { - /* no memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* initialize audio device entry */ - RtlZeroMemory(DeviceEntry, sizeof(KSAUDIO_DEVICE_ENTRY)); - - /* allocate filter ctx */ - Ctx = ExAllocatePool(NonPagedPool, sizeof(FILTER_WORKER_CONTEXT)); - if (!Ctx) - { - /* no memory */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - /* allocate work item */ - WorkItem = IoAllocateWorkItem(DeviceObject); - if (!WorkItem) - { - /* no memory */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - /* set device name */ - DeviceEntry->DeviceName.Length = 0; - DeviceEntry->DeviceName.MaximumLength = Event->SymbolicLinkName->Length + 10 * sizeof(WCHAR); - DeviceEntry->DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceEntry->DeviceName.MaximumLength); - - if (!DeviceEntry->DeviceName.Buffer) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - if (!NT_SUCCESS(RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\??\\"))) - { - DPRINT1("RtlAppendUnicodeToString failed with %x\n", Status); - goto cleanup; - } - - if (!NT_SUCCESS(RtlAppendUnicodeStringToString(&DeviceEntry->DeviceName, Event->SymbolicLinkName))) - { - DPRINT1("RtlAppendUnicodeStringToString failed with %x\n", Status); - goto cleanup; - } - - /* FIXME Ros does not support device interface strings */ - /* Workarround: repeatly call IoCreateFile untill ks wont find a create item which has no object header attached */ - - InitializeListHead(&DeviceEntry->SubDeviceList); - do - { - SubDeviceEntry = ExAllocatePool(NonPagedPool, sizeof(KSAUDIO_SUBDEVICE_ENTRY)); - if (SubDeviceEntry) - { - RtlZeroMemory(SubDeviceEntry, sizeof(KSAUDIO_SUBDEVICE_ENTRY)); - Status = OpenDevice(&DeviceEntry->DeviceName, &SubDeviceEntry->Handle, &SubDeviceEntry->FileObject); - if (NT_SUCCESS(Status)) - { - InsertTailList(&DeviceEntry->SubDeviceList, &SubDeviceEntry->Entry); - DeviceEntry->NumSubDevices++; - /* increment audio device count */ - InterlockedIncrement((PLONG)&DeviceExtension->NumberOfKsAudioDevices); - } - else - { - ExFreePool(SubDeviceEntry); - break; - } - } - }while(NT_SUCCESS(Status) && SubDeviceEntry != NULL); - - DPRINT("Successfully opened audio device %u Device %S NumberOfSubDevices %u\n", DeviceExtension->NumberOfKsAudioDevices, DeviceEntry->DeviceName.Buffer, DeviceEntry->NumSubDevices); - - Ctx->DeviceEntry = DeviceEntry; - Ctx->WorkItem = WorkItem; - - /* fetch device extension */ - DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension; - /* insert new audio device */ - ExInterlockedInsertTailList(&DeviceExtension->KsAudioDeviceList, &DeviceEntry->Entry, &DeviceExtension->Lock); - - IoQueueWorkItem(WorkItem, FilterPinWorkerRoutine, DelayedWorkQueue, (PVOID)Ctx); - return Status; - } - else - { - DPRINT("Remove interface to audio device!\n"); - UNIMPLEMENTED - return STATUS_SUCCESS; - } + DPRINT("Successfully opened audio device %u Device %S\n", DeviceExtension->NumberOfKsAudioDevices, DeviceEntry->DeviceName.Buffer); + IoQueueWorkItem(WorkItem, FilterPinWorkerRoutine, DelayedWorkQueue, (PVOID)Ctx); + return Status; cleanup: if (Ctx) @@ -331,6 +276,93 @@ cleanup: } return Status; + +} + + +NTSTATUS +NTAPI +DeviceInterfaceChangeCallback( + IN PVOID NotificationStructure, + IN PVOID Context) +{ + DEVICE_INTERFACE_CHANGE_NOTIFICATION * Event; + NTSTATUS Status = STATUS_SUCCESS; + PSYSAUDIODEVEXT DeviceExtension; + UNICODE_STRING DeviceName; + HANDLE Handle; + PFILE_OBJECT FileObject; + LPWSTR ReferenceString; + ULONG BytesReturned; + + + PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)Context; + + DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension; + + Event = (DEVICE_INTERFACE_CHANGE_NOTIFICATION*)NotificationStructure; + + if (IsEqualGUIDAligned(&Event->Event, + &GUID_DEVICE_INTERFACE_ARRIVAL)) + { + /* + * 1) Open the filter w/o reference string + * 2) Retrieve reference strings with our private IOCTL_KS_OBJECT_CLASS + * 3) Append these reference strings to symbolic link we got + * * see bug 4566 + */ + + DeviceName.Length = 0; + DeviceName.MaximumLength = Event->SymbolicLinkName->Length + 10 * sizeof(WCHAR); + + DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceName.MaximumLength); + + if (!DeviceName.Buffer) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlAppendUnicodeToString(&DeviceName, L"\\??\\"); + RtlAppendUnicodeStringToString(&DeviceName, Event->SymbolicLinkName); + + + Status = OpenDevice(&DeviceName, &Handle, &FileObject); + if (!NT_SUCCESS(Status)) + { + ExFreePool(DeviceName.Buffer); + return Status; + } + + Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_OBJECT_CLASS, NULL, 0, &ReferenceString, sizeof(LPWSTR), &BytesReturned); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed Status %x\n", Status); + + ExFreePool(DeviceName.Buffer); + ObDereferenceObject(FileObject); + ZwClose(Handle); + return Status; + } + + while(*ReferenceString) + { + Status = InsertAudioDevice(DeviceObject, Event->SymbolicLinkName, ReferenceString); + ReferenceString += wcslen(ReferenceString) + 1; + } + //ExFreePool(ReferenceString); + ObDereferenceObject(FileObject); + ZwClose(Handle); + ExFreePool(DeviceName.Buffer); + return Status; + } + else + { + DPRINT("Remove interface to audio device!\n"); + UNIMPLEMENTED + return STATUS_SUCCESS; + } + + } NTSTATUS diff --git a/reactos/drivers/wdm/audio/sysaudio/dispatcher.c b/reactos/drivers/wdm/audio/sysaudio/dispatcher.c index 218772bfffb..078bf418258 100644 --- a/reactos/drivers/wdm/audio/sysaudio/dispatcher.c +++ b/reactos/drivers/wdm/audio/sysaudio/dispatcher.c @@ -201,7 +201,7 @@ DispatchCreateSysAudio( if (Buffer) { /* is the request for a new pin */ - if (!wcsncmp(KS_NAME_PIN, Buffer, wcslen(KS_NAME_PIN))) + if (wcsstr(Buffer, KS_NAME_PIN)) { Status = CreateDispatcher(Irp); DPRINT("Virtual pin Status %x FileObject %p\n", Status, IoStatus->FileObject); @@ -259,6 +259,7 @@ SysAudioAllocateDeviceHeader( RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM)); CreateItem->Create = DispatchCreateSysAudio; RtlInitUnicodeString(&CreateItem->ObjectClass, L"SysAudio"); + CreateItem->Flags = KSCREATE_ITEM_WILDCARD; Status = KsAllocateDeviceHeader(&DeviceExtension->KsDeviceHeader, 1, @@ -271,7 +272,6 @@ SysAudioOpenKMixer( IN SYSAUDIODEVEXT *DeviceExtension) { NTSTATUS Status; - UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\kmixer"); UNICODE_STRING DevicePath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\kmixer"); diff --git a/reactos/drivers/wdm/audio/sysaudio/main.c b/reactos/drivers/wdm/audio/sysaudio/main.c index 628e8d1112b..6cdf2527cf8 100644 --- a/reactos/drivers/wdm/audio/sysaudio/main.c +++ b/reactos/drivers/wdm/audio/sysaudio/main.c @@ -34,9 +34,8 @@ SysAudio_Shutdown( IN PIRP Irp) { PKSAUDIO_DEVICE_ENTRY DeviceEntry; - PKSAUDIO_SUBDEVICE_ENTRY SubDeviceEntry; PSYSAUDIODEVEXT DeviceExtension; - PLIST_ENTRY Entry, SubEntry; + PLIST_ENTRY Entry; DPRINT1("SysAudio_Shutdown called\n"); @@ -50,16 +49,6 @@ SysAudio_Shutdown( DPRINT1("Freeing item %wZ\n", &DeviceEntry->DeviceName); RtlFreeUnicodeString(&DeviceEntry->DeviceName); - while(!IsListEmpty(&DeviceEntry->SubDeviceList)) - { - SubEntry = RemoveHeadList(&DeviceEntry->SubDeviceList); - SubDeviceEntry = (PKSAUDIO_SUBDEVICE_ENTRY)CONTAINING_RECORD(SubEntry, KSAUDIO_SUBDEVICE_ENTRY, Entry); - - ZwClose(SubDeviceEntry->Handle); - ObDereferenceObject(SubDeviceEntry->FileObject); - ExFreePool(SubDeviceEntry->Pins); - ExFreePool(SubDeviceEntry); - } ExFreePool(DeviceEntry); } diff --git a/reactos/drivers/wdm/audio/sysaudio/sysaudio.h b/reactos/drivers/wdm/audio/sysaudio/sysaudio.h index 9673f21729a..8defc5b84c7 100644 --- a/reactos/drivers/wdm/audio/sysaudio/sysaudio.h +++ b/reactos/drivers/wdm/audio/sysaudio/sysaudio.h @@ -22,7 +22,8 @@ typedef struct typedef struct { - LIST_ENTRY Entry; // linked list entry to KSAUDIO_DEVICE_ENTRY + LIST_ENTRY Entry; // device entry for KsAudioDeviceList + UNICODE_STRING DeviceName; // symbolic link of audio device HANDLE Handle; // handle to audio sub device PFILE_OBJECT FileObject; // file objecto to audio sub device @@ -30,18 +31,6 @@ typedef struct ULONG NumberOfPins; // number of pins of audio device PIN_INFO * Pins; // array of PIN_INFO - LPWSTR ObjectClass; // object class of sub device - -}KSAUDIO_SUBDEVICE_ENTRY, *PKSAUDIO_SUBDEVICE_ENTRY; - -typedef struct -{ - LIST_ENTRY Entry; // device entry for KsAudioDeviceList - UNICODE_STRING DeviceName; // symbolic link of audio device - - ULONG NumSubDevices; // number of subdevices - LIST_ENTRY SubDeviceList; // audio sub device list - }KSAUDIO_DEVICE_ENTRY, *PKSAUDIO_DEVICE_ENTRY; typedef struct @@ -71,7 +60,7 @@ typedef struct { HANDLE Handle; // audio irp pin handle ULONG PinId; // pin id of device - PKSAUDIO_SUBDEVICE_ENTRY AudioEntry; // pointer to audio device entry + PKSAUDIO_DEVICE_ENTRY AudioEntry; // pointer to audio device entry HANDLE hMixerPin; // handle to mixer pin }DISPATCH_CONTEXT, *PDISPATCH_CONTEXT; @@ -86,7 +75,7 @@ typedef struct PIRP Irp; BOOL CreateRealPin; BOOL CreateMixerPin; - PKSAUDIO_SUBDEVICE_ENTRY Entry; + PKSAUDIO_DEVICE_ENTRY Entry; KSPIN_CONNECT * PinConnect; PDISPATCH_CONTEXT DispatchContext; PSYSAUDIODEVEXT DeviceExtension; @@ -129,7 +118,7 @@ OpenDevice( IN PHANDLE HandleOut, IN PFILE_OBJECT * FileObjectOut); -PKSAUDIO_SUBDEVICE_ENTRY +PKSAUDIO_DEVICE_ENTRY GetListEntry( IN PLIST_ENTRY Head, IN ULONG Index); From 6de49104bf801675633e07cc74e7c6731852738d Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Fri, 10 Jul 2009 16:55:08 +0000 Subject: [PATCH 296/577] Update Winfile to Wine HEAD. svn path=/trunk/; revision=41845 --- rosapps/applications/winfile/lang/Lt.rc | 263 +++++++++++++++++++++ rosapps/applications/winfile/lang/cs-CZ.rc | 2 + rosapps/applications/winfile/lang/da-DK.rc | 2 + rosapps/applications/winfile/lang/de-DE.rc | 56 +++-- rosapps/applications/winfile/lang/en-US.rc | 2 + rosapps/applications/winfile/lang/es-ES.rc | 2 + rosapps/applications/winfile/lang/fr-FR.rc | 167 ++++++------- rosapps/applications/winfile/lang/hu-HU.rc | 2 + rosapps/applications/winfile/lang/it-IT.rc | 2 + rosapps/applications/winfile/lang/ja-JP.rc | 4 +- rosapps/applications/winfile/lang/ko-KR.rc | 2 + rosapps/applications/winfile/lang/nl-NL.rc | 2 + rosapps/applications/winfile/lang/no-NO.rc | 2 + rosapps/applications/winfile/lang/pl-PL.rc | 2 + rosapps/applications/winfile/lang/pt-BR.rc | 146 ++++++++---- rosapps/applications/winfile/lang/ru-RU.rc | 2 + rosapps/applications/winfile/lang/sl-SI.rc | 4 +- rosapps/applications/winfile/lang/sv-SE.rc | 2 + rosapps/applications/winfile/lang/tr-TR.rc | 2 + rosapps/applications/winfile/lang/zh-CN.rc | 4 +- rosapps/applications/winfile/resource.h | 2 + 21 files changed, 510 insertions(+), 162 deletions(-) create mode 100644 rosapps/applications/winfile/lang/Lt.rc diff --git a/rosapps/applications/winfile/lang/Lt.rc b/rosapps/applications/winfile/lang/Lt.rc new file mode 100644 index 00000000000..32cec0efea7 --- /dev/null +++ b/rosapps/applications/winfile/lang/Lt.rc @@ -0,0 +1,263 @@ +/* + * WineFile + * Lithuanian Language Support + * + * Copyright 2009 Aurimas FiÅ¡eras + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +/* Menu */ + +IDM_WINEFILE MENU FIXED IMPURE +{ + POPUP "&Failas" { + MENUITEM "&Atverti\tEnter", ID_ACTIVATE + MENUITEM "Pe&rkelti...\tF7", ID_FILE_MOVE + MENUITEM "&Kopijuoti...\tF8", ID_FILE_COPY + MENUITEM "IÅ¡karpin&Ä—je...\tF9", 118 + MENUITEM "&Å alinti\tDel", ID_FILE_DELETE + MENUITEM "Per&vadinti...", 109 + MENUITEM "Savy&bÄ—s...\tAlt+Enter", ID_EDIT_PROPERTIES + MENUITEM SEPARATOR + MENUITEM "&Glaudinti...", 119 + MENUITEM "IÅ¡sk&leisti...", 120 + MENUITEM SEPARATOR + MENUITEM "&Vykdyti...", ID_EXECUTE + MENUITEM "&Spausdinti...", 102 + MENUITEM "Susieti...", 103 + MENUITEM SEPARATOR + MENUITEM "Suk&urti katalogÄ…...", 111 + MENUITEM "&IeÅ¡koti...", 104 + MENUITEM "&PažymÄ—ti failus...", 116 + MENUITEM SEPARATOR +#ifndef _NO_EXTENSIONS + MENUITEM "IÅ¡&eiti\tAlt+X", ID_FILE_EXIT +#else + MENUITEM "IÅ¡&eiti", ID_FILE_EXIT +#endif + } + + POPUP "&Diskas" { + MENUITEM "&Kopijuoti diskÄ…...", 201 + MENUITEM "&Pavadinti diskÄ…...", 202 + MENUITEM SEPARATOR + MENUITEM "&Ženklinti diskÄ…...", ID_FORMAT_DISK +#ifdef _WIN95 + MENUITEM "&Sukurti sisteminį diskÄ…...", -1 /*TODO*/ +#endif + MENUITEM SEPARATOR + MENUITEM "Pri&jungti tinklo diskÄ…", ID_CONNECT_NETWORK_DRIVE + MENUITEM "&Atjungti tinklo diskÄ…", ID_DISCONNECT_NETWORK_DRIVE + MENUITEM SEPARATOR + MENUITEM "&Bendrinti kaip...", 254 + MENUITEM "&Panaikinti bendrumÄ…...", 255 + MENUITEM SEPARATOR + MENUITEM "&IÅ¡rinkti diskÄ…...", 251 + } + + POPUP "&Katalogai" { + MENUITEM "&Kitas lygis\t+", 301 + MENUITEM "IÅ¡skleisti &medį\t*", 302 + MENUITEM "IÅ¡skleisti &viskÄ…\tStrg+*", 303 + MENUITEM "Suskleisti m&edį\t-", 304 + MENUITEM SEPARATOR + MENUITEM "&PažymÄ—ti vaikus", 505 + } + + POPUP "&Rodymas" { + MENUITEM "&Medis ir katalogai", 413 + MENUITEM "&Tik medis", 411 + MENUITEM "Tik &katalogai", 412 + MENUITEM SEPARATOR + MENUITEM "&Skaidyti", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&Vardas", ID_VIEW_NAME + MENUITEM "Visa failo &informacija", ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "&DalinÄ— informacija...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "&Rikiuoti pagal vardÄ…", ID_VIEW_SORT_NAME + MENUITEM "Rikiuoti &pagal tipÄ…", ID_VIEW_SORT_TYPE + MENUITEM "Rikiuoti pagal d&ydį", ID_VIEW_SORT_SIZE + MENUITEM "Rikiuoti pagal d&atÄ…", ID_VIEW_SORT_DATE + MENUITEM SEPARATOR + MENUITEM "&Filtruoti pagal...", ID_VIEW_FILTER + } + + POPUP "&Parinktys" { + MENUITEM "&Patvirtinimas...", 501 + MENUITEM "&Å riftas...", ID_SELECT_FONT + MENUITEM "Adaptuoti įrankių &juostÄ…...", 512 + MENUITEM SEPARATOR + MENUITEM "&Ä®rankių juosta", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "&Diskų juosta", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&BÅ«senos juosta", ID_VIEW_STATUSBAR, CHECKED +#ifndef _NO_EXTENSIONS + MENUITEM "&Visas ekranas\tCtrl+Shift+S", ID_VIEW_FULLSCREEN +#endif + MENUITEM SEPARATOR + MENUITEM "&Suskleisti vykdant", 504 + MENUITEM "&IÅ¡einant iÅ¡saugoti nuostatas", ID_VIEW_SAVESETTINGS + } + + + POPUP "&Saugumas" { + MENUITEM "&Prieiga...", 605 + MENUITEM "&Registravimas...", 606 + MENUITEM "&Savininkas...", 607 + } + + POPUP "&Langas" { + MENUITEM "Naujas &langas", ID_WINDOW_NEW + MENUITEM "IÅ¡dÄ—styti pa&kopomis\tCtrl+F5", ID_WINDOW_CASCADE + MENUITEM "IÅ¡kloti &gulsÄiai", ID_WINDOW_TILE_HORZ + MENUITEM "IÅ¡kloti &staÄiai\tCtrl+F4", ID_WINDOW_TILE_VERT +#ifndef _NO_EXTENSIONS + MENUITEM "IÅ¡dÄ—styti &automatiÅ¡kai", ID_WINDOW_AUTOSORT +#endif + MENUITEM "IÅ¡dÄ—styti si&mbolius", ID_WINDOW_ARRANGE + MENUITEM "At&naujinti\tF5", ID_REFRESH + } + + POPUP "&Žinynas" { + MENUITEM "Žinyno &temos\tF1", ID_HELP + MENUITEM "&PaieÅ¡ka žinyne...\tF1", ID_HELP + MENUITEM "Žinyno &naudojimas\tF1", ID_HELP_USING + MENUITEM SEPARATOR + MENUITEM "&Apie Winefile...", ID_ABOUT + } +} + + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Vykdyti" +FONT 8, "MS Shell Dlg" +{ + CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 + CONTROL "&Komanda:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL + CONTROL "Kaip &simbolį", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 + DEFPUSHBUTTON "Gerai", 1, 158, 6, 47, 14 + PUSHBUTTON "Atsisakyti", 2, 158, 23, 47, 14 + PUSHBUTTON "&Žinynas", 254, 158, 43, 47, 14 +} + +IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "IÅ¡rinkite paskirtį" +FONT 8, "MS Shell Dlg" +{ + CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 + CONTROL "&Kelias:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL + DEFPUSHBUTTON "Gerai", 1, 158, 6, 47, 14 + PUSHBUTTON "Atsisakyti", 2, 158, 23, 47, 14 + PUSHBUTTON "&Parinkti", 254, 158, 43, 47, 14 +} + +IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Pagal failo tipÄ…" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Vardas:",-1,7,8,26,10 + EDITTEXT IDC_VIEW_PATTERN,35,7,59,12,ES_AUTOHSCROLL + GROUPBOX "Failų tipai",-1,7,23,87,56 + CONTROL "&Katalogai",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 + CONTROL "&Programos",IDC_VIEW_TYPE_PROGRAMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 + CONTROL "&Dokumentai",IDC_VIEW_TYPE_DOCUMENTS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 + CONTROL "Kiti &failai",IDC_VIEW_TYPE_OTHERS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 + CONTROL "Rodyti paslÄ—ptus/&sisteminius failus",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,122,9 + DEFPUSHBUTTON "Gerai",IDOK,104,7,50,14 + PUSHBUTTON "Atsisakyti",IDCANCEL,104,24,50,14 +END + +IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "%s savybÄ—s" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Gerai",IDOK,191,7,50,14 + PUSHBUTTON "Atsisakyti",IDCANCEL,191,29,50,14 + LTEXT "&Failo vardas:",-1,7,7,59,9 + EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Visas &kelias:",-1,7,18,59,9 + EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Pask. keitimas:",-1,7,29,59,9 + EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Versija:",-1,7,40,59,9 + EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "&Autoriaus teisÄ—s:",-1,7,51,59,9 + EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Dydis:",-1,7,62,59,9 + EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + GROUPBOX "Požymiai",-1,7,79,158,46 + CONTROL "&Tik skaitymui",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 + CONTROL "&PaslÄ—ptas",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 + CONTROL "&Archyvuotinas",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 + CONTROL "&Sisteminis",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 + CONTROL "Su&glaudintas",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 + GROUPBOX "&Versijos informacija",-1,7,129,234,79 + LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL +END + + +STRINGTABLE +{ + IDS_FONT_SEL_DLG_NAME "Pritaikomos Å¡rifto nuostatos" + IDS_FONT_SEL_ERROR "Klaida parenkant naujÄ… Å¡riftÄ…." +} + +STRINGTABLE +{ + IDS_WINEFILE "Wine failų tvarkytuvÄ—" + IDS_ERROR "Klaida" + IDS_ROOT_FS "Å¡akninÄ— fs" + IDS_UNIXFS "unix fs" + IDS_DESKTOP "Darbalaukis" + IDS_SHELL "Apvalkalas" + IDS_TITLEFMT "%s - %s" + IDS_NO_IMPL "Dar nerealizuota" + IDS_WINE_FILE "Wine failas" +} + +STRINGTABLE +{ + IDS_COL_NAME "Vardas" + IDS_COL_SIZE "Dydis" + IDS_COL_CDATE "KData" + IDS_COL_ADATE "PData" + IDS_COL_MDATE "MData" + IDS_COL_IDX "Indeksas/Inode" + IDS_COL_LINKS "Saitai" + IDS_COL_ATTR "Požymiai" + IDS_COL_SEC "Saugumas" + + IDS_FREE_SPACE_FMT "%s iÅ¡ %s laisva" +} diff --git a/rosapps/applications/winfile/lang/cs-CZ.rc b/rosapps/applications/winfile/lang/cs-CZ.rc index 6d2294a87b5..ad718638e69 100644 --- a/rosapps/applications/winfile/lang/cs-CZ.rc +++ b/rosapps/applications/winfile/lang/cs-CZ.rc @@ -23,6 +23,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_CZECH, SUBLANG_DEFAULT /* Czech strings in CP1250 */ diff --git a/rosapps/applications/winfile/lang/da-DK.rc b/rosapps/applications/winfile/lang/da-DK.rc index babc0dab32d..ffc74156574 100644 --- a/rosapps/applications/winfile/lang/da-DK.rc +++ b/rosapps/applications/winfile/lang/da-DK.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_DANISH, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/de-DE.rc b/rosapps/applications/winfile/lang/de-DE.rc index ae1a80fc3bf..e30c5c18116 100644 --- a/rosapps/applications/winfile/lang/de-DE.rc +++ b/rosapps/applications/winfile/lang/de-DE.rc @@ -21,6 +21,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + +#pragma code_page(65001) + LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL /* Menu */ @@ -28,33 +32,33 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDM_WINEFILE MENU FIXED IMPURE { POPUP "&Datei" { - MENUITEM "Ö&ffnen\tEingabetaste", ID_ACTIVATE + MENUITEM "Ö&ffnen\tEingabetaste", ID_ACTIVATE MENUITEM "&Verschieben...\tF7", ID_FILE_MOVE MENUITEM "&Kopieren...\tF8", ID_FILE_COPY MENUITEM "&In Zwischenablage...\tF9", 118 - MENUITEM "&Löschen\tEntf", ID_FILE_DELETE + MENUITEM "&Löschen\tEntf", ID_FILE_DELETE MENUITEM "&Umbenennen...", 109 MENUITEM "&Eigenschaften...\tAlt+Eingabetaste", ID_EDIT_PROPERTIES MENUITEM SEPARATOR MENUITEM "K&omprimieren...", 119 MENUITEM "Deko&mprimieren...", 120 MENUITEM SEPARATOR - MENUITEM "&Ausführen...", ID_EXECUTE + MENUITEM "&Ausführen...", ID_EXECUTE MENUITEM "&Drucken...", 102 MENUITEM "Zuord&nen...", 103 MENUITEM SEPARATOR MENUITEM "Ver&zeichnis erstellen...", 111 MENUITEM "&Suchen...", 104 - MENUITEM "Dateien aus&wählen...", 116 + MENUITEM "Dateien aus&wählen...", 116 MENUITEM SEPARATOR MENUITEM "&Beenden\tAlt+X", ID_FILE_EXIT } - POPUP "Da&tenträger" { - MENUITEM "Datenträger &kopieren...", 201 - MENUITEM "Datenträger &benennen...", 202 + POPUP "Da&tenträger" { + MENUITEM "Datenträger &kopieren...", 201 + MENUITEM "Datenträger &benennen...", 202 MENUITEM SEPARATOR - MENUITEM "Datenträger &formatieren...", ID_FORMAT_DISK + MENUITEM "Datenträger &formatieren...", ID_FORMAT_DISK #ifdef _WIN95 MENUITEM "...", -1 /*TODO*/ #endif @@ -65,12 +69,12 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "F&reigeben als...", 254 MENUITEM "Freigabe been&den...", 255 MENUITEM SEPARATOR - MENUITEM "Laufwerk aus&wählen...", 251 + MENUITEM "Laufwerk aus&wählen...", 251 } POPUP "&Verzeichnisse" { - MENUITEM "&Nächste Ebene einblenden\t+",301 + MENUITEM "&Nächste Ebene einblenden\t+",301 MENUITEM "&Zweig einblenden\t*", 302 MENUITEM "Alle &Ebenen einblenden\tStrg+*",303 MENUITEM "Zweig &ausblenden\t-", 304 @@ -91,14 +95,14 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM SEPARATOR MENUITEM "Nach N&ame", ID_VIEW_SORT_NAME MENUITEM "Nach T&yp", ID_VIEW_SORT_TYPE - MENUITEM "Nach &Größe", ID_VIEW_SORT_SIZE + MENUITEM "Nach &Größe", ID_VIEW_SORT_SIZE MENUITEM "Nach &Datum", ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Angaben ausw&ählen...", ID_VIEW_FILTER + MENUITEM "Angaben ausw&ählen...", ID_VIEW_FILTER } POPUP "&Optionen" { - MENUITEM "&Bestätigen...", 501 + MENUITEM "&Bestätigen...", 501 MENUITEM "Schrift&art...", ID_SELECT_FONT MENUITEM "Symbolleiste &definieren...", 512 MENUITEM SEPARATOR @@ -115,13 +119,13 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Sicherheit" { MENUITEM "&Berechtigungen...", 605 - MENUITEM "Über&wachen...", 606 + MENUITEM "Über&wachen...", 606 MENUITEM "Besi&tzer...", 607 } POPUP "&Fenster" { MENUITEM "Neues &Fenster", ID_WINDOW_NEW - MENUITEM "Über&lappend\tUmschalt+F5", ID_WINDOW_CASCADE + MENUITEM "Über&lappend\tUmschalt+F5", ID_WINDOW_CASCADE MENUITEM "&Untereinander", ID_WINDOW_TILE_HORZ MENUITEM "&Nebeneinander\tUmschalt+F4", ID_WINDOW_TILE_VERT #ifndef _NO_EXTENSIONS @@ -136,14 +140,14 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Suchen...\tF1", ID_HELP MENUITEM "Hilfe &verwenden\tF1", ID_HELP_USING MENUITEM SEPARATOR - MENUITEM "&Info über Winefile...", ID_ABOUT + MENUITEM "&Info über Winefile...", ID_ABOUT } } IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ausführen" +CAPTION "Ausführen" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 @@ -157,7 +161,7 @@ FONT 8, "MS Shell Dlg" IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ziel auswählen" +CAPTION "Ziel auswählen" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 @@ -170,7 +174,7 @@ FONT 8, "MS Shell Dlg" IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Angaben auswählen" +CAPTION "Angaben auswählen" FONT 8, "MS Sans Serif" BEGIN LTEXT "&Name:",-1,7,8,22,10 @@ -192,7 +196,7 @@ END IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Eigenschaften für %s" +CAPTION "Eigenschaften für %s" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,191,7,50,14 @@ -201,16 +205,16 @@ BEGIN EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP LTEXT "&Pfad:",-1,7,18,59,9 EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Letzte &Änderung:",-1,7,29,59,9 + LTEXT "Letzte &Änderung:",-1,7,29,59,9 EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP LTEXT "&Version:",-1,7,40,59,9 EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP LTEXT "&Copyright:",-1,7,51,59,9 EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "&Größe:",-1,7,62,59,9 + LTEXT "&Größe:",-1,7,62,59,9 EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP GROUPBOX "Attribute",-1,7,79,158,46 - CONTROL "&Schreibgeschützt",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 + CONTROL "&Schreibgeschützt",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 CONTROL "&Versteckt",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 CONTROL "&Archiv",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 CONTROL "Sys&tem",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 @@ -224,7 +228,7 @@ END STRINGTABLE { IDS_FONT_SEL_DLG_NAME "Anwenden der Schriftarteinstellung" - IDS_FONT_SEL_ERROR "Fehler während der Schriftart-Auswahl." + IDS_FONT_SEL_ERROR "Fehler während der Schriftart-Auswahl." } STRINGTABLE @@ -243,10 +247,10 @@ STRINGTABLE STRINGTABLE { IDS_COL_NAME "Name" - IDS_COL_SIZE "Größe" + IDS_COL_SIZE "Größe" IDS_COL_CDATE "CDatum" IDS_COL_ADATE "ZDatum" - IDS_COL_MDATE "ÄDatum" + IDS_COL_MDATE "ÄDatum" IDS_COL_IDX "Index/Inode" IDS_COL_LINKS "Links" IDS_COL_ATTR "Attribute" diff --git a/rosapps/applications/winfile/lang/en-US.rc b/rosapps/applications/winfile/lang/en-US.rc index dc0ef28f2a8..644cf2ff262 100644 --- a/rosapps/applications/winfile/lang/en-US.rc +++ b/rosapps/applications/winfile/lang/en-US.rc @@ -21,6 +21,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/es-ES.rc b/rosapps/applications/winfile/lang/es-ES.rc index fa82f4fd563..7e445ee309f 100644 --- a/rosapps/applications/winfile/lang/es-ES.rc +++ b/rosapps/applications/winfile/lang/es-ES.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/fr-FR.rc b/rosapps/applications/winfile/lang/fr-FR.rc index 73d7c8e8f12..1b39edcefd5 100644 --- a/rosapps/applications/winfile/lang/fr-FR.rc +++ b/rosapps/applications/winfile/lang/fr-FR.rc @@ -23,6 +23,11 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL /* Menu */ @@ -30,24 +35,24 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL IDM_WINEFILE MENU FIXED IMPURE { POPUP "&Fichier" { - MENUITEM "&Ouvrir\tEntrée", ID_ACTIVATE - MENUITEM "&Déplacer...\tF7", ID_FILE_MOVE + MENUITEM "&Ouvrir\tEntrée", ID_ACTIVATE + MENUITEM "&Déplacer...\tF7", ID_FILE_MOVE MENUITEM "&Copier...\tF8", ID_FILE_COPY MENUITEM "P&resse-papiers...\tF9", 118 MENUITEM "&Effacer\tSuppr", ID_FILE_DELETE MENUITEM "Re&nommer...", 109 - MENUITEM "&Propriétés...\tAlt+Entree", ID_EDIT_PROPERTIES + MENUITEM "&Propriétés...\tAlt+Entrée", ID_EDIT_PROPERTIES MENUITEM SEPARATOR MENUITEM "Co&mpresser...", 119 - MENUITEM "Décompre&sser...", 120 + MENUITEM "Décompre&sser...", 120 MENUITEM SEPARATOR - MENUITEM "E&xécuter...", ID_EXECUTE + MENUITEM "E&xécuter...", ID_EXECUTE MENUITEM "&Imprimer...", 102 MENUITEM "&Associer...", 103 MENUITEM SEPARATOR - MENUITEM "Créer Réper&toire...", 111 + MENUITEM "Créer réper&toire...", 111 MENUITEM "Rec&hercher...", 104 - MENUITEM "Sélectionner &Fichiers...", 116 + MENUITEM "Sélectionner &fichiers...", 116 MENUITEM SEPARATOR #ifndef _NO_EXTENSIONS MENUITEM "&Quitter\tAlt+X", ID_FILE_EXIT @@ -57,16 +62,16 @@ IDM_WINEFILE MENU FIXED IMPURE } POPUP "&Disque" { - MENUITEM "&Copier Disque...", 201 - MENUITEM "&Nommer Disque...", 202 + MENUITEM "&Copier disque...", 201 + MENUITEM "&Nommer disque...", 202 MENUITEM SEPARATOR - MENUITEM "&Formater Disque...", ID_FORMAT_DISK + MENUITEM "&Formater disque...", ID_FORMAT_DISK #ifdef _WIN95 - MENUITEM "Créer un disque &système...", -1 /*TODO*/ + MENUITEM "Créer un disque &système...", -1 /*TODO*/ #endif MENUITEM SEPARATOR - MENUITEM "Connecter un lecteur &réseau",ID_CONNECT_NETWORK_DRIVE - MENUITEM "&Déconnecter un lecteur réseau",ID_DISCONNECT_NETWORK_DRIVE + MENUITEM "Connecter un lecteur &réseau",ID_CONNECT_NETWORK_DRIVE + MENUITEM "&Déconnecter un lecteur réseau",ID_DISCONNECT_NETWORK_DRIVE MENUITEM SEPARATOR MENUITEM "&Partager...", 254 MENUITEM "Cesser de parta&ger", 255 @@ -74,66 +79,66 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Choisir le &lecteur", 251 } - POPUP "&Répertoires" { - MENUITEM "&Développer un niveau\t+", 301 - MENUITEM "Développer une &branche\t*", 302 - MENUITEM "&Tout développer\tCtrl+*", 303 - MENUITEM "&Réduire une branche\t-", 304 + POPUP "&Répertoires" { + MENUITEM "&Développer un niveau\t+", 301 + MENUITEM "Développer une &branche\t*", 302 + MENUITEM "&Tout développer\tCtrl+*", 303 + MENUITEM "&Réduire une branche\t-", 304 MENUITEM SEPARATOR - MENUITEM "&Indiquer l'arborescence", 505 + MENUITEM "&Marquer l'arborescence", 505 } - POPUP "&Vue" { - MENUITEM "Arbre et ré&pertoire", 413 + POPUP "&Affichage" { + MENUITEM "Ar&bre et répertoire", 413 MENUITEM "&Arbre seulement", 411 - MENUITEM "&Répertoire seulement", 412 + MENUITEM "&Répertoire seulement", 412 MENUITEM SEPARATOR - MENUITEM "&Séparer", ID_VIEW_SPLIT + MENUITEM "&Séparer", ID_VIEW_SPLIT MENUITEM SEPARATOR MENUITEM "&Nom", ID_VIEW_NAME - MENUITEM "Tous &les Détails", ID_VIEW_ALL_ATTRIBUTES, CHECKED - MENUITEM "&Détails...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM "Tous &les détails", ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "&Détails...", ID_VIEW_SELECTED_ATTRIBUTES MENUITEM SEPARATOR - MENUITEM "Trier par N&om", ID_VIEW_SORT_NAME - MENUITEM "Trier par &Type", ID_VIEW_SORT_TYPE - MENUITEM "Trier par Ta&ille", ID_VIEW_SORT_SIZE - MENUITEM "Trier par Dat&e", ID_VIEW_SORT_DATE + MENUITEM "Trier par n&om", ID_VIEW_SORT_NAME + MENUITEM "Trier par &type", ID_VIEW_SORT_TYPE + MENUITEM "Trier par ta&ille", ID_VIEW_SORT_SIZE + MENUITEM "Trier par dat&e", ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Trier par &...", ID_VIEW_FILTER + MENUITEM "Trier &par...", ID_VIEW_FILTER } POPUP "&Options" { MENUITEM "&Confirmation...", 501 MENUITEM "&Police...", ID_SELECT_FONT - MENUITEM "Personnaliser la &barre d'Outils...", 512 + MENUITEM "Personnaliser la &barre d'outils...", 512 MENUITEM SEPARATOR - MENUITEM "Barre d'&Outils", ID_VIEW_TOOL_BAR, CHECKED - MENUITEM "Barre de &Lecteur", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "Barre d'&État", ID_VIEW_STATUSBAR, CHECKED + MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "Barre de &lecteur", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Barre d'&état", ID_VIEW_STATUSBAR, CHECKED #ifndef _NO_EXTENSIONS - MENUITEM "P&lein Écran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "P&lein écran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN #endif MENUITEM SEPARATOR - MENUITEM "&Réduire a l'utilisation", 504 + MENUITEM "&Réduire à l'utilisation", 504 MENUITEM "&Enregistrer la configuration en quittant",511 } - POPUP "&Sécurité" { - MENUITEM "&Accès...", 605 - MENUITEM "&Surveillance...", 606 - MENUITEM "&Propriétaire...", 607 + POPUP "&Sécurité" { + MENUITEM "&Accès...", 605 + MENUITEM "&Journalisation...", 606 + MENUITEM "&Propriétaire...", 607 } - POPUP "&Fenêtre" { - MENUITEM "Nouvelle &fenêtre", ID_WINDOW_NEW + POPUP "Fe&nêtre" { + MENUITEM "Nouvelle &fenêtre", ID_WINDOW_NEW MENUITEM "&En cascade\tCtrl+F5", ID_WINDOW_CASCADE - MENUITEM "Mosaïque &horizontale", ID_WINDOW_TILE_HORZ - MENUITEM "Mosaïque &verticale\tCtrl+F4",ID_WINDOW_TILE_VERT + MENUITEM "Mosaïque &horizontale", ID_WINDOW_TILE_HORZ + MENUITEM "Mosaïque &verticale\tCtrl+F4",ID_WINDOW_TILE_VERT #ifndef _NO_EXTENSIONS - MENUITEM "Réorganisation &Automatique", ID_WINDOW_AUTOSORT + MENUITEM "Réorganisation aut&omatique", ID_WINDOW_AUTOSORT #endif - MENUITEM "Réorganiser les &icônes", ID_WINDOW_ARRANGE + MENUITEM "Réorganiser les &icônes", ID_WINDOW_ARRANGE MENUITEM "&Actualiser\tF5", ID_REFRESH } @@ -142,20 +147,20 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Rechercher dans l'aide\tF1", ID_HELP MENUITEM "&Utiliser l'aide\tF1", ID_HELP_USING MENUITEM SEPARATOR - MENUITEM "À &propos de Winefile", ID_ABOUT + MENUITEM "À &propos de Winefile", ID_ABOUT } } IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Exécuter" +CAPTION "Exécuter" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Commande :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + CONTROL "&Commande :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Sous forme d'icône", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 + CONTROL "Sous forme d'icône", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 75, 12 DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 PUSHBUTTON "Annuler", 2, 158, 23, 47, 14 PUSHBUTTON "Aid&e", 254, 158, 43, 47, 14 @@ -163,65 +168,65 @@ FONT 8, "MS Shell Dlg" IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Sélectionner la destination" +CAPTION "Sélectionner la destination" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Chemin :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + CONTROL "&Chemin :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 PUSHBUTTON "Annuler", 2, 158, 23, 47, 14 PUSHBUTTON "&Parcourir...", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 100 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Par type de fichier" FONT 8, "MS Sans Serif" BEGIN - LTEXT "&Nom :",-1,7,8,22,10 + LTEXT "&Nom :",-1,7,8,22,10 EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL - GROUPBOX "Type de fichier",-1,7,23,87,56 - CONTROL "&Répertoires",IDC_VIEW_TYPE_DIRECTORIES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 + GROUPBOX "Type de fichier ",-1,7,23,87,59 + CONTROL "&Répertoires",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,34,70,10 CONTROL "&Programmes",IDC_VIEW_TYPE_PROGRAMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,45,70,10 CONTROL "Docu&ments",IDC_VIEW_TYPE_DOCUMENTS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,56,70,10 CONTROL "&Autres fichiers",IDC_VIEW_TYPE_OTHERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 - CONTROL "Montrer les fichiers cachés/&système",IDC_VIEW_TYPE_HIDDEN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 + BS_AUTOCHECKBOX | WS_TABSTOP,13,67,70,10 + CONTROL "Montrer les fichiers cachés/&système",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,86,130,9 DEFPUSHBUTTON "OK",IDOK,104,7,50,14 PUSHBUTTON "Annuler",IDCANCEL,104,24,50,14 END IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Propriétés de %s" +CAPTION "Propriétés de %s" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,191,7,50,14 - PUSHBUTTON "Annuler",IDCANCEL,191,29,50,14 - LTEXT "Nom du &fichier :",-1,7,7,59,9 + PUSHBUTTON "Annuler",IDCANCEL,191,25,50,14 + LTEXT "Nom du &fichier :",-1,7,7,59,9 EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Chemin com&plet :",-1,7,18,59,9 + LTEXT "Chemin com&plet :",-1,7,18,59,9 EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Modification :",-1,7,29,59,9 + LTEXT "Modification :",-1,7,29,59,9 EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Version :",-1,7,40,59,9 + LTEXT "Version :",-1,7,40,59,9 EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Cop&yright :",-1,7,51,59,9 + LTEXT "Cop&yright :",-1,7,51,59,9 EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Taille :",-1,7,62,59,9 + LTEXT "Taille :",-1,7,62,59,9 EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP GROUPBOX "Attributs",-1,7,79,158,46 CONTROL "Lectu&re seule",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 - CONTROL "Cac&hé",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 + CONTROL "Cac&hé",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 CONTROL "&Archive",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 - CONTROL "&Système",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 - CONTROL "&Compressé",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 - GROUPBOX "&Version Information",-1,7,129,234,79 + CONTROL "&Système",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 + CONTROL "&Compressé",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 + GROUPBOX "&Informations de version",-1,7,129,234,79 LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL END @@ -229,8 +234,8 @@ END STRINGTABLE { - IDS_FONT_SEL_DLG_NAME "Appliquer les réglages des fontes" - IDS_FONT_SEL_ERROR "Erreur dans la sélection de la nouvelle fonte." + IDS_FONT_SEL_DLG_NAME "Application des réglages des polices" + IDS_FONT_SEL_ERROR "Erreur lors de la sélection de la nouvelle police." } STRINGTABLE @@ -242,7 +247,7 @@ STRINGTABLE IDS_DESKTOP "Bureau" IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" - IDS_NO_IMPL "Pas encore implémenté" + IDS_NO_IMPL "Pas encore implémenté" IDS_WINE_FILE "Wine File" } @@ -250,13 +255,13 @@ STRINGTABLE { IDS_COL_NAME "Nom" IDS_COL_SIZE "Taille" - IDS_COL_CDATE "CDate" - IDS_COL_ADATE "ADate" - IDS_COL_MDATE "MDate" + IDS_COL_CDATE "Dernier changement de statut (ctime)" + IDS_COL_ADATE "Dernier accès" + IDS_COL_MDATE "Dernière modification" IDS_COL_IDX "Index/Inode" IDS_COL_LINKS "Liens" IDS_COL_ATTR "Attributs" - IDS_COL_SEC "Sécurité" + IDS_COL_SEC "Sécurité" IDS_FREE_SPACE_FMT "%s sur %s libre" } diff --git a/rosapps/applications/winfile/lang/hu-HU.rc b/rosapps/applications/winfile/lang/hu-HU.rc index f73f376d875..f7ca49a2bbe 100644 --- a/rosapps/applications/winfile/lang/hu-HU.rc +++ b/rosapps/applications/winfile/lang/hu-HU.rc @@ -22,6 +22,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/it-IT.rc b/rosapps/applications/winfile/lang/it-IT.rc index 832d422742b..bfbf6f12f57 100644 --- a/rosapps/applications/winfile/lang/it-IT.rc +++ b/rosapps/applications/winfile/lang/it-IT.rc @@ -22,6 +22,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/ja-JP.rc b/rosapps/applications/winfile/lang/ja-JP.rc index cd68b65a034..b73486a5dd0 100644 --- a/rosapps/applications/winfile/lang/ja-JP.rc +++ b/rosapps/applications/winfile/lang/ja-JP.rc @@ -21,6 +21,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + /* UTF-8 */ #pragma code_page(65001) @@ -261,5 +263,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s of %s free" } - -#pragma code_page(default) diff --git a/rosapps/applications/winfile/lang/ko-KR.rc b/rosapps/applications/winfile/lang/ko-KR.rc index 02821d068da..0a6207a52ca 100644 --- a/rosapps/applications/winfile/lang/ko-KR.rc +++ b/rosapps/applications/winfile/lang/ko-KR.rc @@ -22,6 +22,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/nl-NL.rc b/rosapps/applications/winfile/lang/nl-NL.rc index 06eef8e347b..8f6f7f16825 100644 --- a/rosapps/applications/winfile/lang/nl-NL.rc +++ b/rosapps/applications/winfile/lang/nl-NL.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/no-NO.rc b/rosapps/applications/winfile/lang/no-NO.rc index 04f8509ad84..eec8b82c8f5 100644 --- a/rosapps/applications/winfile/lang/no-NO.rc +++ b/rosapps/applications/winfile/lang/no-NO.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/pl-PL.rc b/rosapps/applications/winfile/lang/pl-PL.rc index 31316172f55..50247e3181a 100644 --- a/rosapps/applications/winfile/lang/pl-PL.rc +++ b/rosapps/applications/winfile/lang/pl-PL.rc @@ -22,6 +22,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_POLISH, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/pt-BR.rc b/rosapps/applications/winfile/lang/pt-BR.rc index d23038dabeb..5bf0c6b668d 100644 --- a/rosapps/applications/winfile/lang/pt-BR.rc +++ b/rosapps/applications/winfile/lang/pt-BR.rc @@ -3,7 +3,7 @@ * Portuguese Language Support * * Copyright 2003 Marcelo Duarte - * Copyright 2004,2007 Américo José Melo + * Copyright 2004,2007 Américo José Melo * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,6 +20,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + +#pragma code_page(65001) /* Menu */ @@ -72,18 +75,18 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Selecionar &unidade...", 251 } - POPUP "Á&rvore" { - MENUITEM "&Próximo nível\t+", 301 + POPUP "Ã&rvore" { + MENUITEM "&Próximo nível\t+", 301 MENUITEM "Expandi&r pasta\t*", 302 MENUITEM "Expandir &tudo\tStrg+*", 303 MENUITEM "Recolher p&asta\t-", 304 MENUITEM SEPARATOR - MENUITEM "&Indicar subníveis", 505 + MENUITEM "&Indicar subníveis", 505 } POPUP "&Exibir" { - MENUITEM "Á&rvore e pasta", 413 - MENUITEM "S&omente árvore", 411 + MENUITEM "Ã&rvore e pasta", 413 + MENUITEM "S&omente árvore", 411 MENUITEM "So&mente pasta", 412 MENUITEM SEPARATOR MENUITEM "&Dividir", ID_VIEW_SPLIT @@ -100,8 +103,8 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Classificar &por...", ID_VIEW_FILTER } - POPUP "&Opções" { - MENUITEM "&Confirmação...", 501 + POPUP "&Opções" { + MENUITEM "&Confirmação...", 501 MENUITEM "&Fonte...", ID_SELECT_FONT MENUITEM "&Personalizar barra de ferramentas...", 512 MENUITEM SEPARATOR @@ -113,11 +116,11 @@ IDM_WINEFILE MENU FIXED IMPURE #endif MENUITEM SEPARATOR MENUITEM "&Minimizar durante o uso", 504 - MENUITEM "&Salvar configurações ao sair",511 + MENUITEM "&Salvar configurações ao sair",511 } - POPUP "&Segurança" { + POPUP "&Segurança" { MENUITEM "&Acesso...", 605 MENUITEM "&Logging...", 606 MENUITEM "&Owner...", 607 @@ -131,12 +134,12 @@ IDM_WINEFILE MENU FIXED IMPURE #ifndef _NO_EXTENSIONS MENUITEM "Organizar automaticamente", ID_WINDOW_AUTOSORT #endif - MENUITEM "&Organizar ícones", ID_WINDOW_ARRANGE + MENUITEM "&Organizar ícones", ID_WINDOW_ARRANGE MENUITEM "&Atualizar\tF5", ID_REFRESH } POPUP "Aj&uda" { - MENUITEM "&Tópicos da ajuda\tF1", ID_HELP + MENUITEM "&Tópicos da ajuda\tF1", ID_HELP MENUITEM "Pesquisar...", ID_HELP MENUITEM "&Usando a ajuda", ID_HELP_USING MENUITEM SEPARATOR @@ -152,7 +155,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "A&brir\tEnter", ID_ACTIVATE MENUITEM "&Mover...\tF7", ID_FILE_MOVE MENUITEM "&Copiar...\tF8", ID_FILE_COPY - MENUITEM "&Na Area de Transferência...\tF9", 118 + MENUITEM "&Na Area de Transferência...\tF9", 118 MENUITEM "E&xcluir\tDel", ID_FILE_DELETE MENUITEM "Re&nomear...", 109 MENUITEM "&Propriedades...\tAlt+Enter", ID_EDIT_PROPERTIES @@ -193,18 +196,18 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Seleccionar &unidade...", 251 } - POPUP "Á&rvore" { - MENUITEM "&Próximo nível\t+", 301 + POPUP "Ã&rvore" { + MENUITEM "&Próximo nível\t+", 301 MENUITEM "Expandi&r pasta\t*", 302 MENUITEM "Expandir &tudo\tStrg+*", 303 MENUITEM "Recolher p&asta\t-", 304 MENUITEM SEPARATOR - MENUITEM "&Indicar subníveis", 505 + MENUITEM "&Indicar subníveis", 505 } POPUP "&Exibir" { - MENUITEM "Á&rvore e pasta", 413 - MENUITEM "A&penas árvore", 411 + MENUITEM "Ã&rvore e pasta", 413 + MENUITEM "A&penas árvore", 411 MENUITEM "Ap&enas pasta", 412 MENUITEM SEPARATOR MENUITEM "&Dividir", ID_VIEW_SPLIT @@ -221,8 +224,8 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Classificar &por...", ID_VIEW_FILTER } - POPUP "&Opções" { - MENUITEM "&Confirmação...", 501 + POPUP "&Opções" { + MENUITEM "&Confirmação...", 501 MENUITEM "&Tipo de Letra...", ID_SELECT_FONT MENUITEM "&Personalizar barra de ferramentas...", 512 MENUITEM SEPARATOR @@ -230,17 +233,17 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Barra de unidades", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "B&arra de e&stado", ID_VIEW_STATUSBAR, CHECKED #ifndef _NO_EXTENSIONS - MENUITEM "Ecrã Completo\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "Ecrã Completo\tCtrl+Shift+S", ID_VIEW_FULLSCREEN #endif MENUITEM SEPARATOR MENUITEM "&Minimizar durante o uso", 504 - MENUITEM "&Gravar configurações ao sair",511 + MENUITEM "&Gravar configurações ao sair",511 } - POPUP "&Segurança" { + POPUP "&Segurança" { MENUITEM "&Acesso...", 605 - MENUITEM "&Autenticação...", 606 + MENUITEM "&Autenticação...", 606 MENUITEM "&Dono...", 607 } @@ -252,12 +255,12 @@ IDM_WINEFILE MENU FIXED IMPURE #ifndef _NO_EXTENSIONS MENUITEM "Organizar automaticamente", ID_WINDOW_AUTOSORT #endif - MENUITEM "&Organizar ícones", ID_WINDOW_ARRANGE + MENUITEM "&Organizar ícones", ID_WINDOW_ARRANGE MENUITEM "&Actualizar\tF5", ID_REFRESH } POPUP "Aj&uda" { - MENUITEM "&Tópicos da ajuda\tF1", ID_HELP + MENUITEM "&Tópicos da ajuda\tF1", ID_HELP MENUITEM "Pesquisar...", ID_HELP MENUITEM "&Usar a ajuda", ID_HELP_USING MENUITEM SEPARATOR @@ -302,23 +305,74 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Selecionar destino" +CAPTION "Seleccionar destino" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Localização:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + CONTROL "&Localização:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 PUSHBUTTON "Cancelar", 2, 158, 23, 47, 14 PUSHBUTTON "&Procurar", 254, 158, 43, 47, 14 } +IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Por tipo de ficheiro" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Nome:",-1,7,8,22,10 + EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL + GROUPBOX "Tipo de ficheiro",-1,7,23,87,56 + CONTROL "&Directórios",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 + CONTROL "&Programas",IDC_VIEW_TYPE_PROGRAMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 + CONTROL "Docu&mentos",IDC_VIEW_TYPE_DOCUMENTS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 + CONTROL "&Outros ficheiros",IDC_VIEW_TYPE_OTHERS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 + CONTROL "&Mostrar ficheiros ocultos/sistema",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 + DEFPUSHBUTTON "OK",IDOK,104,7,50,14 + PUSHBUTTON "Cancelar",IDCANCEL,104,24,50,14 +END + +IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Propriedades de %s" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,191,7,50,14 + PUSHBUTTON "Cancelar",IDCANCEL,191,29,50,14 + LTEXT "&Nome do ficheiro:",-1,7,7,59,9 + EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "&Localização Completa:",-1,7,18,59,9 + EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Última alteração:",-1,7,29,59,9 + EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Versão:",-1,7,40,59,9 + EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Direitos de autor:",-1,7,51,59,9 + EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + LTEXT "Tamanho:",-1,7,62,59,9 + EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP + GROUPBOX "Atributos",-1,7,79,158,46 + CONTROL "&Apenas de leitura",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 + CONTROL "&Ocultos",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 + CONTROL "&Arquivos",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 + CONTROL "&Sistema",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 + CONTROL "&Comprimidos",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 + GROUPBOX "&Informação de versão",-1,7,129,234,79 + LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL +END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN STRINGTABLE { - IDS_FONT_SEL_DLG_NAME "Aplicando configurações de fonte" + IDS_FONT_SEL_DLG_NAME "Aplicando configurações de fonte" IDS_FONT_SEL_ERROR "Erro enquanto seleciona nova fonte." } @@ -326,7 +380,7 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE STRINGTABLE { - IDS_FONT_SEL_DLG_NAME "A aplicar configurações do tipo de letra" + IDS_FONT_SEL_DLG_NAME "A aplicar configurações do tipo de letra" IDS_FONT_SEL_ERROR "Erro ao seleccionar novo tipo de letra." } @@ -339,17 +393,11 @@ STRINGTABLE IDS_ERROR "Erro" IDS_ROOT_FS "root fs" IDS_UNIXFS "unixfs" - IDS_DESKTOP "Área de trabalho" + IDS_DESKTOP "Ãrea de trabalho" IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" - IDS_NO_IMPL "Ainda não implementado" + IDS_NO_IMPL "Ainda não implementado" IDS_WINE_FILE "Wine File" - IDS_COL_NAME "Nome" - IDS_COL_SIZE "Tamanho" - IDS_COL_CDATE "CData" - IDS_COL_ADATE "AData" - IDS_COL_MDATE "MData" - IDS_COL_IDX "Índice/Inode" } LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE @@ -360,26 +408,26 @@ STRINGTABLE IDS_ERROR "Erro" IDS_ROOT_FS "root fs" IDS_UNIXFS "unixfs" - IDS_DESKTOP "Ecrã" + IDS_DESKTOP "Ecrã" IDS_SHELL "Linha de Comandos" IDS_TITLEFMT "%s - %s" - IDS_NO_IMPL "Ainda não implementado" + IDS_NO_IMPL "Ainda não implementado" IDS_WINE_FILE "Ficheiro Wine" - IDS_COL_NAME "Nome" - IDS_COL_SIZE "Tamanho" - IDS_COL_CDATE "CData" - IDS_COL_ADATE "AData" - IDS_COL_MDATE "MData" - IDS_COL_IDX "Índice/Inode" } LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL STRINGTABLE { - IDS_COL_LINKS "Ligações" + IDS_COL_NAME "Nome" + IDS_COL_SIZE "Tamanho" + IDS_COL_CDATE "CData" + IDS_COL_ADATE "AData" + IDS_COL_MDATE "MData" + IDS_COL_IDX "Ãndice/Inode" + IDS_COL_LINKS "Ligações" IDS_COL_ATTR "Atributos" - IDS_COL_SEC "Segurança" + IDS_COL_SEC "Segurança" - IDS_FREE_SPACE_FMT "%s of %s free" + IDS_FREE_SPACE_FMT "%s de %s livre" } diff --git a/rosapps/applications/winfile/lang/ru-RU.rc b/rosapps/applications/winfile/lang/ru-RU.rc index dd07152b491..ef8c657f63b 100644 --- a/rosapps/applications/winfile/lang/ru-RU.rc +++ b/rosapps/applications/winfile/lang/ru-RU.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/sl-SI.rc b/rosapps/applications/winfile/lang/sl-SI.rc index 5aa006d9f40..2010f5912aa 100644 --- a/rosapps/applications/winfile/lang/sl-SI.rc +++ b/rosapps/applications/winfile/lang/sl-SI.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + #pragma code_page(65001) LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT @@ -258,5 +260,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "Prosto: %s od %s" } - -#pragma code_page(default) diff --git a/rosapps/applications/winfile/lang/sv-SE.rc b/rosapps/applications/winfile/lang/sv-SE.rc index 6905c5e0713..4deddd953a0 100644 --- a/rosapps/applications/winfile/lang/sv-SE.rc +++ b/rosapps/applications/winfile/lang/sv-SE.rc @@ -21,6 +21,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/tr-TR.rc b/rosapps/applications/winfile/lang/tr-TR.rc index 3a75a7e001f..8735264ceb8 100644 --- a/rosapps/applications/winfile/lang/tr-TR.rc +++ b/rosapps/applications/winfile/lang/tr-TR.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/zh-CN.rc b/rosapps/applications/winfile/lang/zh-CN.rc index aba7221c19d..8eb3300cc3f 100644 --- a/rosapps/applications/winfile/lang/zh-CN.rc +++ b/rosapps/applications/winfile/lang/zh-CN.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "resource.h" + /* Chinese text is encoded in UTF-8 */ #pragma code_page(65001) @@ -298,5 +300,3 @@ FONT 9, "MS Shell Dlg" PUSHBUTTON "å–æ¶ˆ", 2, 158, 23, 47, 14 PUSHBUTTON "幫助(&H)", 254, 158, 43, 47, 14 } - -#pragma code_page(default) diff --git a/rosapps/applications/winfile/resource.h b/rosapps/applications/winfile/resource.h index 1e843e52b39..7c14871d31c 100644 --- a/rosapps/applications/winfile/resource.h +++ b/rosapps/applications/winfile/resource.h @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include +#include /* images */ From 5b403acdfc0356c1b70871f15969b07ff60dc57c Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Fri, 10 Jul 2009 16:57:06 +0000 Subject: [PATCH 297/577] Update Wordpad, winhlp32, xcopy to Wine HEAD. svn path=/trunk/; revision=41846 --- .../base/applications/cmdutils/xcopy/Da.rc | 1 + .../base/applications/cmdutils/xcopy/De.rc | 27 +- .../base/applications/cmdutils/xcopy/En.rc | 1 + .../base/applications/cmdutils/xcopy/Fr.rc | 31 +-- .../base/applications/cmdutils/xcopy/Ko.rc | 1 + .../base/applications/cmdutils/xcopy/Nl.rc | 1 + .../base/applications/cmdutils/xcopy/No.rc | 1 + .../base/applications/cmdutils/xcopy/Pl.rc | 1 + .../base/applications/cmdutils/xcopy/Pt.rc | 1 + .../base/applications/cmdutils/xcopy/Ru.rc | 1 + .../base/applications/cmdutils/xcopy/Si.rc | 4 +- .../base/applications/cmdutils/xcopy/xcopy.h | 2 + reactos/base/applications/winhlp32/lang/Lt.rc | 131 +++++++++ .../base/applications/winhlp32/lang/bg-BG.rc | 2 + .../base/applications/winhlp32/lang/cs-CZ.rc | 2 + .../base/applications/winhlp32/lang/da-DK.rc | 2 + .../base/applications/winhlp32/lang/de-DE.rc | 14 +- .../base/applications/winhlp32/lang/en-US.rc | 70 +++++ .../base/applications/winhlp32/lang/es-ES.rc | 2 + .../base/applications/winhlp32/lang/fi-FI.rc | 2 + .../base/applications/winhlp32/lang/fr-FR.rc | 37 +-- .../base/applications/winhlp32/lang/hu-HU.rc | 2 + .../base/applications/winhlp32/lang/it-IT.rc | 2 + .../base/applications/winhlp32/lang/ja-JP.rc | 4 +- .../base/applications/winhlp32/lang/ko-KR.rc | 2 + .../base/applications/winhlp32/lang/nl-NL.rc | 48 ++-- .../base/applications/winhlp32/lang/no-NO.rc | 2 + .../base/applications/winhlp32/lang/pl-PL.rc | 2 + .../base/applications/winhlp32/lang/pt-BR.rc | 2 + .../base/applications/winhlp32/lang/rm-CH.rc | 2 + .../base/applications/winhlp32/lang/ru-RU.rc | 2 + .../base/applications/winhlp32/lang/sk-SK.rc | 2 + .../base/applications/winhlp32/lang/sl-SI.rc | 4 +- .../base/applications/winhlp32/lang/sv-SE.rc | 2 + .../base/applications/winhlp32/lang/tr-TR.rc | 2 + .../base/applications/winhlp32/lang/zh-CN.rc | 4 +- reactos/base/applications/winhlp32/lex.yy.c | 40 +-- reactos/base/applications/winhlp32/winhelp.c | 2 +- .../base/applications/winhlp32/winhelp_res.h | 3 + reactos/base/applications/wordpad/Da.rc | 2 + reactos/base/applications/wordpad/De.rc | 4 +- reactos/base/applications/wordpad/En.rc | 11 + reactos/base/applications/wordpad/Fr.rc | 103 ++++---- reactos/base/applications/wordpad/Hu.rc | 2 + reactos/base/applications/wordpad/Ja.rc | 6 +- reactos/base/applications/wordpad/Ko.rc | 1 + reactos/base/applications/wordpad/Lt.rc | 249 ++++++++++++++++++ reactos/base/applications/wordpad/Nl.rc | 2 + reactos/base/applications/wordpad/No.rc | 48 ++-- reactos/base/applications/wordpad/Pl.rc | 2 + reactos/base/applications/wordpad/Pt.rc | 2 + reactos/base/applications/wordpad/Ru.rc | 2 + reactos/base/applications/wordpad/Si.rc | 4 +- reactos/base/applications/wordpad/Sv.rc | 4 +- reactos/base/applications/wordpad/Tr.rc | 2 + reactos/base/applications/wordpad/Zh.rc | 4 +- reactos/base/applications/wordpad/rsrc.rc | 20 -- reactos/base/applications/wordpad/wordpad.h | 3 + 58 files changed, 733 insertions(+), 199 deletions(-) create mode 100644 reactos/base/applications/winhlp32/lang/Lt.rc create mode 100644 reactos/base/applications/wordpad/Lt.rc diff --git a/reactos/base/applications/cmdutils/xcopy/Da.rc b/reactos/base/applications/cmdutils/xcopy/Da.rc index 239b3a71d63..6a15a4440b2 100644 --- a/reactos/base/applications/cmdutils/xcopy/Da.rc +++ b/reactos/base/applications/cmdutils/xcopy/Da.rc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" LANGUAGE LANG_DANISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/De.rc b/reactos/base/applications/cmdutils/xcopy/De.rc index 1af64183b49..c13addfdaaa 100644 --- a/reactos/base/applications/cmdutils/xcopy/De.rc +++ b/reactos/base/applications/cmdutils/xcopy/De.rc @@ -20,6 +20,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" + +#pragma code_page(65001) LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL @@ -27,16 +30,16 @@ STRINGTABLE { STRING_INVPARMS, "Falsche Parameteranzahl - xcopy /? zeigt Hilfe an\n" STRING_INVPARM, "Unbekannter Parameter '%s' - xcopy /? zeigt Hilfe an\n" - STRING_PAUSE, "Eingabetaste betätigen, um mit dem Kopieren zu beginnen\n" - STRING_SIMCOPY, "%d Datei(en) würden kopiert\n" + STRING_PAUSE, "Eingabetaste betätigen, um mit dem Kopieren zu beginnen\n" + STRING_SIMCOPY, "%d Datei(en) würden kopiert\n" STRING_COPY, "%d Datei(en) kopiert\n" STRING_QISDIR, "Ist '%s' eine Datei oder ein Verzeichnis\n" \ "am Zielsort?\n" \ "(D - Datei, V - Verzeichnis)\n" STRING_SRCPROMPT,"%s? (Ja|Nein)\n" - STRING_OVERWRITE,"%s überschreiben? (Ja|Nein|Alle)\n" + STRING_OVERWRITE,"%s überschreiben? (Ja|Nein|Alle)\n" STRING_COPYFAIL, "Kopieren von '%s' nach '%s' fehlgeschlagen. Fehlernummer: %d\n" - STRING_OPENFAIL, "Fehler beim Öffnen von '%s'\n" + STRING_OPENFAIL, "Fehler beim Öffnen von '%s'\n" STRING_READFAIL, "Fehler beim Lesen von '%s'\n" STRING_YES_CHAR, "J" STRING_NO_CHAR, "N" @@ -58,20 +61,20 @@ Mit:\n\ [/S] Kopiere Verzeichnisse und Unterverzeichnisse\n\ [/E] Kopiere Verzeichnisse und Unterverzeichnisse, auch leere\n\ [/Q] Zeige die Dateinamen beim Kopieren nicht an\n\ -[/F] Zeige vollständige Dateinamen von Quelle und Ziel an\n\ -[/L] Simulation: Zeige die Namen der Datein, die kopiert würden\n\ -[/W] Wartet vor Beginn des Kopierens auf Bestätigung\n\ +[/F] Zeige vollständige Dateinamen von Quelle und Ziel an\n\ +[/L] Simulation: Zeige die Namen der Datein, die kopiert würden\n\ +[/W] Wartet vor Beginn des Kopierens auf Bestätigung\n\ [/T] Erzeuge eine leere Verzeichnisstruktur, ohne Dateien zu kopieren\n\ -[/Y] Keine Nachfrage vor dem Überschreiben von Dateien\n\ -[/-Y] Nachrage vor dem Überschreiben von Dateien\n\ -[/P] Fragt für jede Quelldatei, ob sie kopiert werden soll\n\ +[/Y] Keine Nachfrage vor dem Überschreiben von Dateien\n\ +[/-Y] Nachrage vor dem Überschreiben von Dateien\n\ +[/P] Fragt für jede Quelldatei, ob sie kopiert werden soll\n\ [/N] Kopiert die Dateien unter ihrem Kurznamen\n\ [/U] Kopiert nur Dateien, die am Ziel bereits existieren\n\ -[/R] Überschreibt schreibgeschützte Dateien\n\ +[/R] Überschreibt schreibgeschützte Dateien\n\ [/H] Kopiere auch versteckte und Systemdateien\n\ [/C] Nach Fehlern den Kopiervorgang fortsetzen\n\ [/A] Nur Dateien mit Archivbit kopieren\n\ -[/M] Nur Dateien mit Archivbit kopieren, danach Archivbit löschen\n\ +[/M] Nur Dateien mit Archivbit kopieren, danach Archivbit löschen\n\ [/D | /D:m-d-y] Kopiere neue Dateien und Dateien, die neuer als das\n\ \t\tangegebene Datum sind. Wird kein Datum angegegebn, werden nur\n\ \t\tQuelldateien kopiert, die neuer sind als die Zieldatei\n\n" diff --git a/reactos/base/applications/cmdutils/xcopy/En.rc b/reactos/base/applications/cmdutils/xcopy/En.rc index 33324ac9f4e..83ef291c9df 100644 --- a/reactos/base/applications/cmdutils/xcopy/En.rc +++ b/reactos/base/applications/cmdutils/xcopy/En.rc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/Fr.rc b/reactos/base/applications/cmdutils/xcopy/Fr.rc index 7fe8f691cb4..047b4b3f739 100644 --- a/reactos/base/applications/cmdutils/xcopy/Fr.rc +++ b/reactos/base/applications/cmdutils/xcopy/Fr.rc @@ -18,6 +18,9 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + +#include "xcopy.h" + #pragma code_page(65001) @@ -30,12 +33,12 @@ STRINGTABLE STRING_PAUSE, "Appuyez sur ENTRÉE pour démarrer la copie\n" STRING_SIMCOPY, "%d fichier(s) seront copiés\n" STRING_COPY, "%d fichier(s) copiés\n" - STRING_QISDIR, "Est-ce que « %s » est un fichier ou un répertoire\n" \ + STRING_QISDIR, "« %s » est-il un fichier ou un répertoire\n" \ "dans la destination ?\n" \ "(F - Fichier, R - Répertoire)\n" STRING_SRCPROMPT,"%s ? (Oui|Non)\n" STRING_OVERWRITE,"Écraser %s ? (Oui|Non|Tous)\n" - STRING_COPYFAIL, "La copie de « %s » vers « %s » a échoué avec le c/r %d\n" + STRING_COPYFAIL, "La copie de « %s » vers « %s » a échoué avec le code de retour %d\n" STRING_OPENFAIL, "Impossible d'ouvrir « %s »\n" STRING_READFAIL, "Impossible de lire « %s »\n" STRING_YES_CHAR, "O" @@ -45,38 +48,36 @@ STRINGTABLE STRING_DIR_CHAR, "R" STRING_HELP, -"XCOPY - Copie les fichiers ou répertoires source vers une destination\n\ +"XCOPY - Copie les fichiers ou répertoires sources vers une destination\n\ \n\ Syntaxe :\n\ -XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +XCOPY source [destination] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ \t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ \n\ -Où :\n\ +où :\n\ \n\ [/I] Suppose que la destination est un répertoire si elle n'existe pas et que l'on copie plus\n\ \td'un fichier\n\ [/S] Copie les répertoires et sous-répertoires\n\ [/E] Copie les répertoires et sous-répertoires, y compris ceux qui sont vides\n\ [/Q] Ne pas afficher la liste des fichiers copiés (mode silencieux)\n\ -[/F] Afficher la source et la destination complète lors de la copie\n\ -[/L] Simuler l'opération, en montrant le nom des fichiers qui auraient été copiés\n\ +[/F] Afficher les source et destination complètes lors de la copie\n\ +[/L] Simuler la copie, en montrant le nom des fichiers qui seraient copiés\n\ [/W] Demande avant de démarrer la copie\n\ -[/T] Créer une structure de répertoires vides, mais ne copie pas les fichiers\n\ +[/T] Créer une structure de répertoires vides, mais ne pas copier les fichiers\n\ [/Y] Ne demande pas de confirmation lors de l'écrasement des fichiers\n\ [/-Y] Demande une confirmation lors de l'écrasement des fichiers\n\ -[/P] Demande avant de copier chaque fichier source\n\ -[/N] Copie en utilisant des noms courts\n\ +[/P] Interroge l'utilisateur avant de copier chaque fichier source\n\ +[/N] Copie en utilisant les noms courts\n\ [/U] Copie uniquement les fichiers qui existent déjà dans la destination\n\ [/R] Écrase même les fichiers en lecture seule\n\ [/H] Inclure les fichiers cachés et système dans la copie\n\ [/C] Continue même si une erreur survient pendant la copie\n\ [/A] Copie uniquement les fichiers qui ont l'attribut archive défini\n\ -[/M] Copie uniquement les fichiers qui ont l'attribut archive défini, supprime\n\ +[/M] Copie uniquement les fichiers qui ont l'attribut archive défini ; supprime\n\ \tensuite l'attribut\n\ -[/D | /D:m-d-y] Copie uniquement les fichiers nouveaux ou ceux modifiés après la date spécifiée.\n\ -\t\tSi aucune date n'est spécifiée, copie uniquement lorsque le fichier de destination est plus vieux\n\ +[/D | /D:m-d-y] Copie uniquement les nouveaux fichiers, ou ceux modifiés après la date spécifiée.\n\ +\t\tSi aucune date n'est spécifiée, copie uniquement lorsque le fichier de destination est plus ancien\n\ \t\tque le fichier source\n\n" } - -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Ko.rc b/reactos/base/applications/cmdutils/xcopy/Ko.rc index a3a89f99e24..6a5071cae86 100644 --- a/reactos/base/applications/cmdutils/xcopy/Ko.rc +++ b/reactos/base/applications/cmdutils/xcopy/Ko.rc @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/Nl.rc b/reactos/base/applications/cmdutils/xcopy/Nl.rc index f994cdd8f7e..b9db305843f 100644 --- a/reactos/base/applications/cmdutils/xcopy/Nl.rc +++ b/reactos/base/applications/cmdutils/xcopy/Nl.rc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/cmdutils/xcopy/No.rc b/reactos/base/applications/cmdutils/xcopy/No.rc index ddcccf78fef..a3c223fc1e2 100644 --- a/reactos/base/applications/cmdutils/xcopy/No.rc +++ b/reactos/base/applications/cmdutils/xcopy/No.rc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL diff --git a/reactos/base/applications/cmdutils/xcopy/Pl.rc b/reactos/base/applications/cmdutils/xcopy/Pl.rc index 3d094a933ed..8b224eccfd6 100644 --- a/reactos/base/applications/cmdutils/xcopy/Pl.rc +++ b/reactos/base/applications/cmdutils/xcopy/Pl.rc @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" LANGUAGE LANG_POLISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/Pt.rc b/reactos/base/applications/cmdutils/xcopy/Pt.rc index 47e9609bd7f..d8254d5e1fb 100644 --- a/reactos/base/applications/cmdutils/xcopy/Pt.rc +++ b/reactos/base/applications/cmdutils/xcopy/Pt.rc @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/cmdutils/xcopy/Ru.rc b/reactos/base/applications/cmdutils/xcopy/Ru.rc index 1d86ff46f8c..398345713f7 100644 --- a/reactos/base/applications/cmdutils/xcopy/Ru.rc +++ b/reactos/base/applications/cmdutils/xcopy/Ru.rc @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/Si.rc b/reactos/base/applications/cmdutils/xcopy/Si.rc index 092282c1636..1013837f402 100644 --- a/reactos/base/applications/cmdutils/xcopy/Si.rc +++ b/reactos/base/applications/cmdutils/xcopy/Si.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "xcopy.h" + #pragma code_page(65001) LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT @@ -78,5 +80,3 @@ Where:\n\ \t\tod izvora\n\n" } - -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.h b/reactos/base/applications/cmdutils/xcopy/xcopy.h index ee4bd910cde..1c933951284 100644 --- a/reactos/base/applications/cmdutils/xcopy/xcopy.h +++ b/reactos/base/applications/cmdutils/xcopy/xcopy.h @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include + /* Local #defines */ #define RC_OK 0 #define RC_NOFILES 1 diff --git a/reactos/base/applications/winhlp32/lang/Lt.rc b/reactos/base/applications/winhlp32/lang/Lt.rc new file mode 100644 index 00000000000..f8e78681aae --- /dev/null +++ b/reactos/base/applications/winhlp32/lang/Lt.rc @@ -0,0 +1,131 @@ +/* + * Help Viewer + * + * Copyright 2009 Aurimas FiÅ¡eras + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "winhelp_res.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +/* Menu */ + +MAIN_MENU MENU +{ + POPUP "&Failas" { + MENUITEM "&Atverti", MNID_FILE_OPEN + MENUITEM SEPARATOR + MENUITEM "&Spausdinti", MNID_FILE_PRINT + MENUITEM "Spaus&dintuvo nuostatos...", MNID_FILE_SETUP + MENUITEM SEPARATOR + MENUITEM "IÅ¡&eiti", MNID_FILE_EXIT + } + POPUP "&Taisa" { + MENUITEM "&Kopijuoti...", MNID_EDIT_COPYDLG + MENUITEM SEPARATOR + MENUITEM "Ko&mentuoti...", MNID_EDIT_ANNOTATE + } + POPUP "&Adresynas" { + MENUITEM "&Apibrėžti...", MNID_BKMK_DEFINE + } + POPUP "&Parinktys" { + POPUP "Žinynas visuomet matomas" + BEGIN + MENUITEM "Numatyta", MNID_OPTS_HELP_DEFAULT + MENUITEM "Matomas", MNID_OPTS_HELP_VISIBLE + MENUITEM "Nematomas", MNID_OPTS_HELP_NONVISIBLE + END + MENUITEM "Istorija", MNID_OPTS_HISTORY + POPUP "Å riftas" + BEGIN + MENUITEM "&Mažas", MNID_OPTS_FONTS_SMALL + MENUITEM "&Normalus", MNID_OPTS_FONTS_NORMAL + MENUITEM "&Didelis", MNID_OPTS_FONTS_LARGE + END + MENUITEM "Naudoti &sistemos spalvas", MNID_OPTS_SYSTEM_COLORS + } + POPUP "&Žinynas" { + MENUITEM "Pa&galba apie žinynÄ…", MNID_HELP_HELPON + MENUITEM "&Visada virÅ¡uje", MNID_HELP_HELPTOP + MENUITEM SEPARATOR + MENUITEM "&Informacija...", MNID_HELP_ABOUT +#ifdef WINELIB + MENUITEM "&Apie Wine", MNID_HELP_WINE +#endif + } +} + +IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Indeksas" +{ + LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER +} + +IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "PaieÅ¡ka" +{ + LTEXT "Dar nerealizuota", -1, 10, 10, 180, 150 +} + +/* Strings */ +STRINGTABLE DISCARDABLE +{ +STID_WINE_HELP, "Wine žinynas" +STID_WHERROR, "KLAIDA" +STID_WARNING, "Ä®SPÄ–JIMAS" +STID_INFO, "Informacija" +STID_NOT_IMPLEMENTED, "Nerealizuota" +STID_HLPFILE_ERROR_s, "Klaida skaitant žinyno failÄ… „%s“" +STID_INDEX, "&RodyklÄ—" +STID_CONTENTS, "Santrauka" +STID_BACK, "&Atgal" +STID_ALL_FILES, "Visi failai (*.*)" +STID_HELP_FILES_HLP, "Žinyno failai (*.hlp)" +STID_FILE_NOT_FOUND_s "Nepavyko rasti „%s“. Ar norite rasti šį failÄ… patys?" +STID_NO_RICHEDIT "Nepavyko rasti RichEdit realizacijos... Nutraukiama" +STID_PSH_INDEX, "Žinyno temos: " +} + +CONTEXT_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "Komentuoti...", MNID_CTXT_ANNOTATE + MENUITEM "Kopijuoti", MNID_CTXT_COPY + MENUITEM "Spausdinti...", MNID_CTXT_PRINT + POPUP "Å riftas" + BEGIN + MENUITEM "Mažas", MNID_CTXT_FONTS_SMALL + MENUITEM "Normalus", MNID_CTXT_FONTS_NORMAL + MENUITEM "Didelis", MNID_CTXT_FONTS_LARGE + END + POPUP "Žinynas visuomet matomas" + BEGIN + MENUITEM "Numatyta", MNID_CTXT_HELP_DEFAULT + MENUITEM "Matomas", MNID_CTXT_HELP_VISIBLE + MENUITEM "Nematomas", MNID_CTXT_HELP_NONVISIBLE + END + MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS + END +END diff --git a/reactos/base/applications/winhlp32/lang/bg-BG.rc b/reactos/base/applications/winhlp32/lang/bg-BG.rc index c59d4e24625..e6d3143db24 100644 --- a/reactos/base/applications/winhlp32/lang/bg-BG.rc +++ b/reactos/base/applications/winhlp32/lang/bg-BG.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/cs-CZ.rc b/reactos/base/applications/winhlp32/lang/cs-CZ.rc index 15cbf02693d..a8f8db31a26 100644 --- a/reactos/base/applications/winhlp32/lang/cs-CZ.rc +++ b/reactos/base/applications/winhlp32/lang/cs-CZ.rc @@ -21,6 +21,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Czech strings in CP1250 */ /* Menu */ diff --git a/reactos/base/applications/winhlp32/lang/da-DK.rc b/reactos/base/applications/winhlp32/lang/da-DK.rc index 927fc32079f..fc15eeba7d5 100644 --- a/reactos/base/applications/winhlp32/lang/da-DK.rc +++ b/reactos/base/applications/winhlp32/lang/da-DK.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_DANISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/de-DE.rc b/reactos/base/applications/winhlp32/lang/de-DE.rc index c8ee650ccca..fa59b42ce96 100644 --- a/reactos/base/applications/winhlp32/lang/de-DE.rc +++ b/reactos/base/applications/winhlp32/lang/de-DE.rc @@ -19,12 +19,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + +#pragma code_page(65001) + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL { POPUP "&Datei" { - MENUITEM "Ö&ffnen...", MNID_FILE_OPEN + MENUITEM "Ö&ffnen...", MNID_FILE_OPEN MENUITEM SEPARATOR MENUITEM "Thema &drucken", MNID_FILE_PRINT MENUITEM "Drucker&einrichtung...", MNID_FILE_SETUP @@ -61,7 +65,7 @@ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "&Über WINE", MNID_HELP_WINE + MENUITEM "&Über WINE", MNID_HELP_WINE #endif } } @@ -94,7 +98,7 @@ STID_NOT_IMPLEMENTED, "Nicht implementiert" STID_HLPFILE_ERROR_s, "Fehler beim Lesen der Hilfe-Datei `%s'" STID_INDEX, "&Inhalt" STID_CONTENTS, "Summary" -STID_BACK, "&Zurück" +STID_BACK, "&Zurück" STID_ALL_FILES, "Alle Dateien (*.*)" STID_HELP_FILES_HLP, "Hilfe-Dateien (*.hlp)" STID_FILE_NOT_FOUND_s "'%s' konnte nicht gefunden werden. Wollen Sie selber nach dieser Datei suchen?" @@ -109,11 +113,11 @@ BEGIN MENUITEM "Anmerken...", MNID_CTXT_ANNOTATE MENUITEM "Kopieren", MNID_CTXT_COPY MENUITEM "Drucken...", MNID_CTXT_PRINT -POPUP "Schriftgröße" +POPUP "Schriftgröße" BEGIN MENUITEM "Klein", MNID_CTXT_FONTS_SMALL MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL -MENUITEM "Groß", MNID_CTXT_FONTS_LARGE +MENUITEM "Groß", MNID_CTXT_FONTS_LARGE END POPUP "Hilfe immer sichtbar" BEGIN diff --git a/reactos/base/applications/winhlp32/lang/en-US.rc b/reactos/base/applications/winhlp32/lang/en-US.rc index 2a11e1a33c2..a4e9d8add4e 100644 --- a/reactos/base/applications/winhlp32/lang/en-US.rc +++ b/reactos/base/applications/winhlp32/lang/en-US.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT @@ -66,6 +68,51 @@ MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT } } +MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL +{ + POPUP "&File" { + MENUITEM "&Open", MNID_FILE_OPEN + MENUITEM SEPARATOR + MENUITEM "&Print", MNID_FILE_PRINT + MENUITEM "Printer &setup...", MNID_FILE_SETUP + MENUITEM SEPARATOR + MENUITEM "E&xit", MNID_FILE_EXIT + } + POPUP "&Edit" { + MENUITEM "&Copy...", MNID_EDIT_COPYDLG + MENUITEM SEPARATOR + MENUITEM "&Annotate...", MNID_EDIT_ANNOTATE + } + POPUP "&Bookmark" { + MENUITEM "&Define...", MNID_BKMK_DEFINE + } + POPUP "&Options" { + POPUP "Help always visible" + BEGIN + MENUITEM "Default", MNID_OPTS_HELP_DEFAULT + MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE + MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE + END + MENUITEM "History", MNID_OPTS_HISTORY + POPUP "Fonts" + BEGIN + MENUITEM "Small", MNID_OPTS_FONTS_SMALL + MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL + MENUITEM "Large", MNID_OPTS_FONTS_LARGE + END + MENUITEM "Use system colours", MNID_OPTS_SYSTEM_COLORS + } + POPUP "&Help" { + MENUITEM "Help &on help", MNID_HELP_HELPON + MENUITEM "Always on &top", MNID_HELP_HELPTOP + MENUITEM SEPARATOR + MENUITEM "&Info...", MNID_HELP_ABOUT +#ifdef WINELIB + MENUITEM "&About Wine", MNID_HELP_WINE +#endif + } +} + IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" @@ -123,3 +170,26 @@ BEGIN MENUITEM "Use system colors", MNID_CTXT_SYSTEM_COLORS END END + +CONTEXT_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL +BEGIN + POPUP "" + BEGIN + MENUITEM "Annotation...", MNID_CTXT_ANNOTATE + MENUITEM "Copy", MNID_CTXT_COPY + MENUITEM "Print...", MNID_CTXT_PRINT + POPUP "Fonts" + BEGIN + MENUITEM "Small", MNID_CTXT_FONTS_SMALL + MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL + MENUITEM "Large", MNID_CTXT_FONTS_LARGE + END + POPUP "Help always visible" + BEGIN + MENUITEM "Default", MNID_CTXT_HELP_DEFAULT + MENUITEM "Visible", MNID_CTXT_HELP_VISIBLE + MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE + END + MENUITEM "Use system colours", MNID_CTXT_SYSTEM_COLORS + END +END diff --git a/reactos/base/applications/winhlp32/lang/es-ES.rc b/reactos/base/applications/winhlp32/lang/es-ES.rc index eee0e17e26a..e752950bcd9 100644 --- a/reactos/base/applications/winhlp32/lang/es-ES.rc +++ b/reactos/base/applications/winhlp32/lang/es-ES.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/winhlp32/lang/fi-FI.rc b/reactos/base/applications/winhlp32/lang/fi-FI.rc index a1564e68adf..5585619e4ed 100644 --- a/reactos/base/applications/winhlp32/lang/fi-FI.rc +++ b/reactos/base/applications/winhlp32/lang/fi-FI.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/fr-FR.rc b/reactos/base/applications/winhlp32/lang/fr-FR.rc index 0c5eea63f12..cedb0f694b7 100644 --- a/reactos/base/applications/winhlp32/lang/fr-FR.rc +++ b/reactos/base/applications/winhlp32/lang/fr-FR.rc @@ -20,6 +20,11 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + +/* UTF-8 */ +#pragma code_page(65001) + /* Menu */ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL @@ -34,18 +39,18 @@ MAIN_MENU MENU MENUITEM SEPARATOR MENUITEM "&Quitter", MNID_FILE_EXIT } - POPUP "É&dition" { + POPUP "É&dition" { MENUITEM "&Copier...", MNID_EDIT_COPYDLG MENUITEM SEPARATOR - MENUITEM "&Annotation...", MNID_EDIT_ANNOTATE + MENUITEM "&Annoter...", MNID_EDIT_ANNOTATE } - POPUP "&Signet" { - MENUITEM "&Définir...", MNID_BKMK_DEFINE + POPUP "&Signets" { + MENUITEM "&Définir...", MNID_BKMK_DEFINE } POPUP "&Options" { POPUP "Aide toujours visible" BEGIN - MENUITEM "Par défaut", MNID_OPTS_HELP_DEFAULT + MENUITEM "Par défaut", MNID_OPTS_HELP_DEFAULT MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE END @@ -56,7 +61,7 @@ MAIN_MENU MENU MENUITEM "Normale", MNID_OPTS_FONTS_NORMAL MENUITEM "Grande", MNID_OPTS_FONTS_LARGE END - MENUITEM "Utiliser les couleurs système", MNID_OPTS_SYSTEM_COLORS + MENUITEM "Utiliser les couleurs système", MNID_OPTS_SYSTEM_COLORS } POPUP "Aid&e" { MENUITEM "&Utiliser l'aide", MNID_HELP_HELPON @@ -64,7 +69,7 @@ MAIN_MENU MENU MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "À &propos de Wine", MNID_HELP_WINE + MENUITEM "À &propos de Wine", MNID_HELP_WINE #endif } } @@ -82,7 +87,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Recherche" { - LTEXT "Pas encore implémenté", -1, 10, 10, 180, 150 + LTEXT "Pas encore implémenté", -1, 10, 10, 180, 150 } /* Strings */ @@ -92,15 +97,15 @@ STID_WINE_HELP, "Aide de Wine" STID_WHERROR, "ERREUR" STID_WARNING, "ATTENTION" STID_INFO, "Information" -STID_NOT_IMPLEMENTED, "Non implémenté" -STID_HLPFILE_ERROR_s, "Une erreur est survenue en lisant le fichier d'aide « %s »" +STID_NOT_IMPLEMENTED, "Non implémenté" +STID_HLPFILE_ERROR_s, "Une erreur est survenue en lisant le fichier d'aide « %s »" STID_INDEX, "&Index" STID_CONTENTS, "Sommaire" -STID_BACK, "&Précédent" -STID_ALL_FILES, "Tous fichiers (*.*)" +STID_BACK, "&Précédent" +STID_ALL_FILES, "Tous les fichiers (*.*)" STID_HELP_FILES_HLP, "Fichiers d'aide (*.hlp)" -STID_FILE_NOT_FOUND_s "Impossible de trouver « %s ». Souhaitez-vous rechercher ce fichier vous-même ?" -STID_NO_RICHEDIT "La bibliothèque RichEdit n'a pu être localisée... Abandon" +STID_FILE_NOT_FOUND_s "Impossible de trouver « %s ». Souhaitez-vous rechercher ce fichier vous-même ?" +STID_NO_RICHEDIT "La bibliothèque RichEdit n'a pu être localisée... Abandon" STID_PSH_INDEX, "Rubriques d'aide : " } @@ -119,10 +124,10 @@ BEGIN END POPUP "Aide toujours visible" BEGIN - MENUITEM "Par défaut", MNID_CTXT_HELP_DEFAULT + MENUITEM "Par défaut", MNID_CTXT_HELP_DEFAULT MENUITEM "Visible", MNID_CTXT_HELP_VISIBLE MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE END - MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS + MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS END END diff --git a/reactos/base/applications/winhlp32/lang/hu-HU.rc b/reactos/base/applications/winhlp32/lang/hu-HU.rc index 39beb19c641..ef3a1ee2bc3 100644 --- a/reactos/base/applications/winhlp32/lang/hu-HU.rc +++ b/reactos/base/applications/winhlp32/lang/hu-HU.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/it-IT.rc b/reactos/base/applications/winhlp32/lang/it-IT.rc index 70c158780e9..5d1abb8c92c 100644 --- a/reactos/base/applications/winhlp32/lang/it-IT.rc +++ b/reactos/base/applications/winhlp32/lang/it-IT.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/winhlp32/lang/ja-JP.rc b/reactos/base/applications/winhlp32/lang/ja-JP.rc index bd88b5d6fad..b73d18dd192 100644 --- a/reactos/base/applications/winhlp32/lang/ja-JP.rc +++ b/reactos/base/applications/winhlp32/lang/ja-JP.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* UTF-8 */ #pragma code_page(65001) @@ -126,5 +128,3 @@ BEGIN MENUITEM "システム カラーを使ã†", MNID_CTXT_SYSTEM_COLORS END END - -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/lang/ko-KR.rc b/reactos/base/applications/winhlp32/lang/ko-KR.rc index 68931789c60..8b4c785ed0c 100644 --- a/reactos/base/applications/winhlp32/lang/ko-KR.rc +++ b/reactos/base/applications/winhlp32/lang/ko-KR.rc @@ -19,6 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/nl-NL.rc b/reactos/base/applications/winhlp32/lang/nl-NL.rc index 6a8747a859e..029d58265b9 100644 --- a/reactos/base/applications/winhlp32/lang/nl-NL.rc +++ b/reactos/base/applications/winhlp32/lang/nl-NL.rc @@ -19,6 +19,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + +#pragma code_page(65001) + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL @@ -32,28 +36,28 @@ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL MENUITEM "&Afsluiten", MNID_FILE_EXIT } POPUP "&Bewerken" { - MENUITEM "&Kopiëren...", MNID_EDIT_COPYDLG + MENUITEM "&Kopiëren...", MNID_EDIT_COPYDLG MENUITEM SEPARATOR MENUITEM "&Annoteren...", MNID_EDIT_ANNOTATE } POPUP "&Favorieten" { MENUITEM "&Aanmaken...", MNID_BKMK_DEFINE } - POPUP "&Options" { - POPUP "Help always visible" + POPUP "&Opties" { + POPUP "Help altijd zichtbaar" BEGIN - MENUITEM "Default", MNID_OPTS_HELP_DEFAULT - MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE - MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE + MENUITEM "Standaard", MNID_OPTS_HELP_DEFAULT + MENUITEM "Zichtbaar", MNID_OPTS_HELP_VISIBLE + MENUITEM "Niet zichtbaar", MNID_OPTS_HELP_NONVISIBLE END - MENUITEM "History", MNID_OPTS_HISTORY - POPUP "Fonts" + MENUITEM "Historie", MNID_OPTS_HISTORY + POPUP "Lettertype" BEGIN - MENUITEM "Small", MNID_OPTS_FONTS_SMALL - MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL - MENUITEM "Large", MNID_OPTS_FONTS_LARGE + MENUITEM "Klein", MNID_OPTS_FONTS_SMALL + MENUITEM "Standaard", MNID_OPTS_FONTS_NORMAL + MENUITEM "Groot", MNID_OPTS_FONTS_LARGE END - MENUITEM "Use system colors", MNID_OPTS_SYSTEM_COLORS + MENUITEM "Gebruik systeemkleuren", MNID_OPTS_SYSTEM_COLORS } POPUP "&Help" { MENUITEM "Hulp &bij help", MNID_HELP_HELPON @@ -61,7 +65,7 @@ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "&Over WINE", MNID_HELP_WINE + MENUITEM "&Over Wine", MNID_HELP_WINE #endif } } @@ -79,26 +83,26 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Zoeken" { - LTEXT "Nog niet geimplementeerd", -1, 10, 10, 180, 150 + LTEXT "Nog niet geïmplementeerd", -1, 10, 10, 180, 150 } /* Strings */ STRINGTABLE DISCARDABLE LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL { -STID_WINE_HELP, "WINE Help" +STID_WINE_HELP, "Wine Help" STID_WHERROR, "FOUT" STID_WARNING, "WAARSCHUWING" STID_INFO, "Informatie" -STID_NOT_IMPLEMENTED, "Niet geïmplementeerd" -STID_HLPFILE_ERROR_s, "Fout bij het lezen van het helpbestand `%s'" -STID_INDEX, "&Inhoud" -STID_CONTENTS, "Summary" +STID_NOT_IMPLEMENTED, "Niet geïmplementeerd" +STID_HLPFILE_ERROR_s, "Fout bij het lezen van het helpbestand '%s'" +STID_INDEX, "Inde&x" +STID_CONTENTS, "&Inhoudsopgave" STID_BACK, "&Terug" STID_ALL_FILES, "Alle bestanden (*.*)" STID_HELP_FILES_HLP, "Helpbestanden (*.hlp)" STID_FILE_NOT_FOUND_s "Kan '%s' niet openen. Wilt u zelf dit bestand zoeken?" -STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " +STID_NO_RICHEDIT "Kan geen richedit implementatie vinden... Actie afgebroken" +STID_PSH_INDEX, "Help onderwerpen: " } CONTEXT_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL @@ -106,7 +110,7 @@ BEGIN POPUP "" BEGIN MENUITEM "Annotering...", MNID_CTXT_ANNOTATE - MENUITEM "Kopiëren", MNID_CTXT_COPY + MENUITEM "Kopiëren", MNID_CTXT_COPY MENUITEM "Print...", MNID_CTXT_PRINT POPUP "Lettertypes" BEGIN diff --git a/reactos/base/applications/winhlp32/lang/no-NO.rc b/reactos/base/applications/winhlp32/lang/no-NO.rc index 5f3e3101c46..2cf2a782372 100644 --- a/reactos/base/applications/winhlp32/lang/no-NO.rc +++ b/reactos/base/applications/winhlp32/lang/no-NO.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL diff --git a/reactos/base/applications/winhlp32/lang/pl-PL.rc b/reactos/base/applications/winhlp32/lang/pl-PL.rc index 17d5d22e346..75047892180 100644 --- a/reactos/base/applications/winhlp32/lang/pl-PL.rc +++ b/reactos/base/applications/winhlp32/lang/pl-PL.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_POLISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/pt-BR.rc b/reactos/base/applications/winhlp32/lang/pt-BR.rc index fd27a65b55f..9a12e58f096 100644 --- a/reactos/base/applications/winhlp32/lang/pt-BR.rc +++ b/reactos/base/applications/winhlp32/lang/pt-BR.rc @@ -23,6 +23,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN diff --git a/reactos/base/applications/winhlp32/lang/rm-CH.rc b/reactos/base/applications/winhlp32/lang/rm-CH.rc index 1339b39e189..ece7bb17c4d 100644 --- a/reactos/base/applications/winhlp32/lang/rm-CH.rc +++ b/reactos/base/applications/winhlp32/lang/rm-CH.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* FIXME: This file is in the Vallader Romansh dialect and not in the official Rumantsch Grischun. */ diff --git a/reactos/base/applications/winhlp32/lang/ru-RU.rc b/reactos/base/applications/winhlp32/lang/ru-RU.rc index af0097b7eea..e2e6ef2f5c5 100644 --- a/reactos/base/applications/winhlp32/lang/ru-RU.rc +++ b/reactos/base/applications/winhlp32/lang/ru-RU.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/sk-SK.rc b/reactos/base/applications/winhlp32/lang/sk-SK.rc index f8338323dee..1b45e1fe89e 100644 --- a/reactos/base/applications/winhlp32/lang/sk-SK.rc +++ b/reactos/base/applications/winhlp32/lang/sk-SK.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + MAIN_MENU MENU LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT { POPUP "&Súbor" { diff --git a/reactos/base/applications/winhlp32/lang/sl-SI.rc b/reactos/base/applications/winhlp32/lang/sl-SI.rc index a742cafe05b..527b45431ee 100644 --- a/reactos/base/applications/winhlp32/lang/sl-SI.rc +++ b/reactos/base/applications/winhlp32/lang/sl-SI.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + #pragma code_page(65001) /* Menu */ @@ -124,5 +126,3 @@ BEGIN MENUITEM "Uporabi sistemske barve", MNID_CTXT_SYSTEM_COLORS END END - -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/lang/sv-SE.rc b/reactos/base/applications/winhlp32/lang/sv-SE.rc index d3893284cae..935b618909b 100644 --- a/reactos/base/applications/winhlp32/lang/sv-SE.rc +++ b/reactos/base/applications/winhlp32/lang/sv-SE.rc @@ -22,6 +22,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/winhlp32/lang/tr-TR.rc b/reactos/base/applications/winhlp32/lang/tr-TR.rc index bbff7236580..876f33caa2f 100644 --- a/reactos/base/applications/winhlp32/lang/tr-TR.rc +++ b/reactos/base/applications/winhlp32/lang/tr-TR.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Menu */ MAIN_MENU MENU LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/zh-CN.rc b/reactos/base/applications/winhlp32/lang/zh-CN.rc index c0ed0176d77..ed20356cf47 100644 --- a/reactos/base/applications/winhlp32/lang/zh-CN.rc +++ b/reactos/base/applications/winhlp32/lang/zh-CN.rc @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "winhelp_res.h" + /* Chinese text is encoded in UTF-8 */ #pragma code_page(65001) @@ -158,5 +160,3 @@ STID_FILE_NOT_FOUND_s "ä¸èƒ½é–‹å•Ÿæª”案 '%s'. 你想è¦è‡ªå·±æ‰¾é€™å€‹æª”案 STID_NO_RICHEDIT "找ä¸åˆ° richedit... 終止" STID_PSH_INDEX, "幫助內容: " } - -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/lex.yy.c b/reactos/base/applications/winhlp32/lex.yy.c index bf0be672d32..aa6f83c8b78 100644 --- a/reactos/base/applications/winhlp32/lex.yy.c +++ b/reactos/base/applications/winhlp32/lex.yy.c @@ -380,9 +380,9 @@ static char *yy_last_accepting_cpos; #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 ".\\macro.lex.l" +#line 1 "macro.lex.l" #define INITIAL 0 -#line 2 ".\\macro.lex.l" +#line 2 "macro.lex.l" /* * Help Viewer * @@ -407,7 +407,7 @@ char *yytext; #define YY_NO_UNPUT 1 #define quote 1 -#line 26 ".\\macro.lex.l" +#line 26 "macro.lex.l" #include "config.h" #include #include @@ -593,7 +593,7 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 61 ".\\macro.lex.l" +#line 61 "macro.lex.l" #line 600 "lex.yy.c" @@ -681,32 +681,32 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 63 ".\\macro.lex.l" +#line 63 "macro.lex.l" yylval.integer = strtol(yytext, NULL, 10); return INTEGER; YY_BREAK case 2: YY_RULE_SETUP -#line 64 ".\\macro.lex.l" +#line 64 "macro.lex.l" yylval.integer = strtol(yytext, NULL, 16); return INTEGER; YY_BREAK case 3: YY_RULE_SETUP -#line 66 ".\\macro.lex.l" +#line 66 "macro.lex.l" return MACRO_Lookup(yytext, &yylval); YY_BREAK case 4: -#line 69 ".\\macro.lex.l" +#line 69 "macro.lex.l" case 5: -#line 70 ".\\macro.lex.l" +#line 70 "macro.lex.l" case 6: -#line 71 ".\\macro.lex.l" +#line 71 "macro.lex.l" case 7: -#line 72 ".\\macro.lex.l" +#line 72 "macro.lex.l" case 8: -#line 73 ".\\macro.lex.l" +#line 73 "macro.lex.l" case 9: YY_RULE_SETUP -#line 73 ".\\macro.lex.l" +#line 73 "macro.lex.l" { if (lex_data->quote_stk_idx == 0 || (yytext[0] == '\"' && lex_data->quote_stack[lex_data->quote_stk_idx - 1] != '\"') || @@ -741,31 +741,31 @@ YY_RULE_SETUP YY_BREAK case 10: YY_RULE_SETUP -#line 105 ".\\macro.lex.l" +#line 105 "macro.lex.l" *lex_data->strptr++ = yytext[0]; YY_BREAK case 11: YY_RULE_SETUP -#line 106 ".\\macro.lex.l" +#line 106 "macro.lex.l" *lex_data->strptr++ = yytext[1]; YY_BREAK case YY_STATE_EOF(quote): -#line 107 ".\\macro.lex.l" +#line 107 "macro.lex.l" return 0; YY_BREAK case 12: YY_RULE_SETUP -#line 109 ".\\macro.lex.l" +#line 109 "macro.lex.l" YY_BREAK case 13: YY_RULE_SETUP -#line 110 ".\\macro.lex.l" +#line 110 "macro.lex.l" return yytext[0]; YY_BREAK case 14: YY_RULE_SETUP -#line 111 ".\\macro.lex.l" +#line 111 "macro.lex.l" ECHO; YY_BREAK #line 772 "lex.yy.c" @@ -1654,7 +1654,7 @@ int main() return 0; } #endif -#line 111 ".\\macro.lex.l" +#line 111 "macro.lex.l" #if 0 diff --git a/reactos/base/applications/winhlp32/winhelp.c b/reactos/base/applications/winhlp32/winhelp.c index 08d3875aba1..56244d35aec 100644 --- a/reactos/base/applications/winhlp32/winhelp.c +++ b/reactos/base/applications/winhlp32/winhelp.c @@ -1736,7 +1736,7 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) WINHELP_GetWindowInfo(hlpfile, wndname), show); /* Message loop */ - while (GetMessage(&msg, 0, 0, 0)) + while ((Globals.win_list || Globals.active_popup) && GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); diff --git a/reactos/base/applications/winhlp32/winhelp_res.h b/reactos/base/applications/winhlp32/winhelp_res.h index e1c72ff54e0..ba2f9799d25 100644 --- a/reactos/base/applications/winhlp32/winhelp_res.h +++ b/reactos/base/applications/winhlp32/winhelp_res.h @@ -1,3 +1,6 @@ +#include +#include + #define MNID_FILE_OPEN 0x101 #define MNID_FILE_PRINT 0x104 #define MNID_FILE_SETUP 0x106 diff --git a/reactos/base/applications/wordpad/Da.rc b/reactos/base/applications/wordpad/Da.rc index d09e90f9b72..34789469e5e 100644 --- a/reactos/base/applications/wordpad/Da.rc +++ b/reactos/base/applications/wordpad/Da.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_DANISH, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/De.rc b/reactos/base/applications/wordpad/De.rc index a2fcceb61c4..18181b2efba 100644 --- a/reactos/base/applications/wordpad/De.rc +++ b/reactos/base/applications/wordpad/De.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL #pragma code_page(65001) @@ -244,5 +246,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Drucken ist nicht implementiert" STRING_MAX_TAB_STOPS, "Es können nur maximal 32 Tabstopps definiert werden." END - -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc index dd099e13349..fe92de7c2dc 100644 --- a/reactos/base/applications/wordpad/En.rc +++ b/reactos/base/applications/wordpad/En.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE @@ -242,3 +244,12 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Printing not implemented" STRING_MAX_TAB_STOPS, "Cannot add more than 32 tab stops." END + +LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "Left" + STRING_ALIGN_RIGHT, "Right" + STRING_ALIGN_CENTER, "Centre" +END diff --git a/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc index 72f7c70e845..9691c0b0cc3 100644 --- a/reactos/base/applications/wordpad/Fr.rc +++ b/reactos/base/applications/wordpad/Fr.rc @@ -16,6 +16,11 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + +/* UTF-8 */ +#pragma code_page(65001) + LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL IDM_MAINMENU MENU DISCARDABLE @@ -28,44 +33,44 @@ BEGIN MENUITEM "Enregistrer &sous...", ID_FILE_SAVEAS MENUITEM SEPARATOR MENUITEM "&Imprimer...\tCtrl+P", ID_PRINT - MENUITEM "A&perçu avant impression...", ID_PREVIEW + MENUITEM "A&perçu avant impression...", ID_PREVIEW MENUITEM "&Mise en page...", ID_PRINTSETUP MENUITEM SEPARATOR MENUITEM "&Quitter", ID_FILE_EXIT END - POPUP "É&dition" + POPUP "É&dition" BEGIN MENUITEM "&Annuler\tCtrl+Z", ID_EDIT_UNDO - MENUITEM "&Rétablir\tCtrl+Y", ID_EDIT_REDO + MENUITEM "&Rétablir\tCtrl+Y", ID_EDIT_REDO MENUITEM SEPARATOR MENUITEM "&Couper\tCtrl+X", ID_EDIT_CUT MENUITEM "Co&pier\tCtrl+C", ID_EDIT_COPY MENUITEM "C&oller\tCtrl+V", ID_EDIT_PASTE MENUITEM "&Effacer\tDel", ID_EDIT_CLEAR - MENUITEM "&Sélectionner tout\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM "&Sélectionner tout\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR MENUITEM "&Rechercher...\tCrtl+F", ID_FIND MENUITEM "Rechercher le &suivant\tF3", ID_FIND_NEXT MENUITEM "&Remplacer...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR - MENUITEM "Lecture-&seule", ID_EDIT_READONLY - MENUITEM "&Modifié", ID_EDIT_MODIFIED + MENUITEM "Lecture &seule", ID_EDIT_READONLY + MENUITEM "&Modifié", ID_EDIT_MODIFIED MENUITEM SEPARATOR - POPUP "&Avancés" + POPUP "&Avancé" BEGIN - MENUITEM "&Information sélection", ID_EDIT_SELECTIONINFO - MENUITEM "&Format caractères", ID_EDIT_CHARFORMAT - MENUITEM "&Déf. format car.", ID_EDIT_DEFCHARFORMAT + MENUITEM "&Information sélection", ID_EDIT_SELECTIONINFO + MENUITEM "&Format caractères", ID_EDIT_CHARFORMAT + MENUITEM "&Déf. format car.", ID_EDIT_DEFCHARFORMAT MENUITEM "Format paragrap&he", ID_EDIT_PARAFORMAT - MENUITEM "&Recevoir texte", ID_EDIT_GETTEXT + MENUITEM "Texte &complet", ID_EDIT_GETTEXT END END POPUP "&Affichage" BEGIN MENUITEM "&Barre d'outils", ID_TOGGLE_TOOLBAR MENUITEM "&Barre de format", ID_TOGGLE_FORMATBAR - MENUITEM "&Règle", ID_TOGGLE_RULER - MENUITEM "&Barre d'état", ID_TOGGLE_STATUSBAR + MENUITEM "&Règle", ID_TOGGLE_RULER + MENUITEM "&Barre d'état", ID_TOGGLE_STATUSBAR MENUITEM SEPARATOR MENUITEM "&Options...", ID_VIEWPROPERTIES END @@ -76,18 +81,18 @@ BEGIN POPUP "Forma&t" BEGIN MENUITEM "&Police...", ID_FONTSETTINGS - MENUITEM "&Puces" ID_BULLET - MENUITEM "&Paragraphe..." ID_PARAFORMAT + MENUITEM "Pu&ces" ID_BULLET + MENUITEM "Para&graphe..." ID_PARAFORMAT MENUITEM "&Tabulations..." ID_TABSTOPS - POPUP "&Fond" + POPUP "&Arrière-plan" BEGIN - MENUITEM "&Système\tCtrl+1", ID_BACK_1 - MENUITEM "&Jaunasse\tCtrl+2", ID_BACK_2 + MENUITEM "&Système\tCtrl+1", ID_BACK_1 + MENUITEM "&Jaune pâle\tCtrl+2", ID_BACK_2 END END POPUP "Aid&e" BEGIN - MENUITEM "À &propos du Wordpad de Wine" ID_ABOUT + MENUITEM "À &propos du Wordpad de Wine" ID_ABOUT END END @@ -99,8 +104,8 @@ BEGIN MENUITEM "Co&pier", ID_EDIT_COPY MENUITEM "C&oller", ID_EDIT_PASTE MENUITEM SEPARATOR - MENUITEM "&Puces" ID_BULLET - MENUITEM "&Paragraphe" ID_PARAFORMAT + MENUITEM "P&uces" ID_BULLET + MENUITEM "Para&graphe" ID_PARAFORMAT END END @@ -136,7 +141,7 @@ BEGIN EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 LTEXT "Droite", -1, 15, 40, 40, 13 EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 - LTEXT "Première ligne", -1, 15, 58, 40, 18 + LTEXT "Première ligne", -1, 15, 58, 40, 18 EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 LTEXT "Alignement", -1, 15, 87, 40, 13 COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST @@ -149,13 +154,13 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulations" FONT 8, "MS SHell DLg" BEGIN - GROUPBOX "Arrêts de tabulation", -1, 10, 10, 120, 90 + GROUPBOX "Taquets de tabulation", -1, 10, 10, 120, 90 COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE - DEFPUSHBUTTON "&Ajouter", ID_TAB_ADD, 20, 80, 45, 15 + DEFPUSHBUTTON "A&jouter", ID_TAB_ADD, 20, 80, 45, 15 PUSHBUTTON "&Supprimer", ID_TAB_DEL, 72, 80, 45, 15 - PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 - PUSHBUTTON "&Annuler", IDCANCEL, 137, 33, 50, 15 - PUSHBUTTON "Supprimer &tous", ID_TAB_EMPTY, 137, 51, 50, 15 + PUSHBUTTON "&OK", IDOK, 137, 15, 56, 15 + PUSHBUTTON "&Annuler", IDCANCEL, 137, 33, 56, 15 + PUSHBUTTON "Supprimer &tous", ID_TAB_EMPTY, 137, 51, 56, 15 END IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 @@ -163,23 +168,23 @@ STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Enveloppement de ligne", -1, 10, 10, 170, 85 - RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 145, 15 - RADIOBUTTON "Enveloppe le texte à partir de la bordure de fenêtre", IDC_PAGEFMT_WW, 18, 45, 145, 15 - RADIOBUTTON "Enveloppe le texte à partir de la &marge", IDC_PAGEFMT_WM, 18, 65, 145, 15 - GROUPBOX "Barres d'outils", -1, 170, 10, 120, 85 - CHECKBOX "&Barre d'outils", IDC_PAGEFMT_TB, 180, 20, 80, 15 - CHECKBOX "Barre de &format", IDC_PAGEFMT_FB, 180, 38, 80, 15 - CHECKBOX "&Règle", IDC_PAGEFMT_RU, 180, 56, 80, 15 - CHECKBOX "Barre de &statut", IDC_PAGEFMT_SB, 180, 74, 80, 15 + GROUPBOX "Passage à la ligne automatique", -1, 10, 10, 140, 85 + RADIOBUTTON "&Aucun", IDC_PAGEFMT_WN, 18, 25, 127, 15 + RADIOBUTTON "Au niveau de la bordure de fe&nêtre", IDC_PAGEFMT_WW, 18, 45, 127, 15 + RADIOBUTTON "Au niveau de la &marge", IDC_PAGEFMT_WM, 18, 65, 127, 15 + GROUPBOX "Barres d'outils", -1, 156, 10, 115, 85 + CHECKBOX "&Barre d'outils", IDC_PAGEFMT_TB, 166, 20, 80, 15 + CHECKBOX "Barre de &format", IDC_PAGEFMT_FB, 166, 38, 80, 15 + CHECKBOX "&Règle", IDC_PAGEFMT_RU, 166, 56, 80, 15 + CHECKBOX "Barre de &statut", IDC_PAGEFMT_SB, 166, 74, 80, 15 LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END STRINGTABLE DISCARDABLE BEGIN - STRING_RICHTEXT_FILES_RTF, "Documents texte riche (*.rtf)" + STRING_RICHTEXT_FILES_RTF, "Format de texte enrichi (*.rtf)" STRING_TEXT_FILES_TXT, "Documents texte (*.txt)" - STRING_TEXT_FILES_UNICODE_TXT, "Documents texte unicode (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Documents texte Unicode (*.txt)" STRING_ALL_FILES, "Tous les documents (*.*)" END @@ -192,9 +197,9 @@ END STRINGTABLE DISCARDABLE BEGIN - STRING_NEWFILE_RICHTEXT, "Document texte riche" + STRING_NEWFILE_RICHTEXT, "Format de texte enrichi (RTF)" STRING_NEWFILE_TXT, "Document texte" - STRING_NEWFILE_TXT_UNICODE, "Document texte unicode" + STRING_NEWFILE_TXT_UNICODE, "Document texte Unicode" END STRINGTABLE DISCARDABLE @@ -213,7 +218,7 @@ STRINGTABLE DISCARDABLE BEGIN STRING_PREVIEW_PRINT, "Imprimer" STRING_PREVIEW_NEXTPAGE, "Page suivante" - STRING_PREVIEW_PREVPAGE, "Page précédente" + STRING_PREVIEW_PREVPAGE, "Page précédente" STRING_PREVIEW_TWOPAGES, "Deux pages" STRING_PREVIEW_ONEPAGE, "Une page" STRING_PREVIEW_CLOSE, "Fermer" @@ -227,18 +232,18 @@ END STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" - STRING_PROMPT_SAVE_CHANGES, "Enregistrer les modifications de « %s » ?" - STRING_SEARCH_FINISHED, "Recherche terminée dans le document." - STRING_LOAD_RICHED_FAILED, "Impossible de charger la bibliothèque RichEdit." + STRING_PROMPT_SAVE_CHANGES, "Enregistrer les modifications de « %s » ?" + STRING_SEARCH_FINISHED, "Recherche terminée dans le document." + STRING_LOAD_RICHED_FAILED, "Impossible de charger la bibliothèque RichEdit." STRING_SAVE_LOSEFORMATTING, "Vous avez choisi d'enregistrer en texte simple, " \ "ce qui causera la perte de tout formattage. " \ - "Voulez-vous vraiment continuer ?" + "Voulez-vous vraiment continuer ?" STRING_INVALID_NUMBER, "Format de nombre invalide" - STRING_OLE_STORAGE_NOT_SUPPORTED, "Les documents conteneur OLE ne sont pas supportés" + STRING_OLE_STORAGE_NOT_SUPPORTED, "Les documents conteneur OLE ne sont pas supportés" STRING_WRITE_FAILED, "Impossible d'enregistrer le fichier." - STRING_WRITE_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'enregistrement du fichier." + STRING_WRITE_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'enregistrement du fichier." STRING_OPEN_FAILED, "Impossible d'ouvrir le fichier." - STRING_OPEN_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'ouverture du fichier." - STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée" + STRING_OPEN_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'ouverture du fichier." + STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée" STRING_MAX_TAB_STOPS, "Impossible d'ajouter plus de 32 taquets de tabulation." END diff --git a/reactos/base/applications/wordpad/Hu.rc b/reactos/base/applications/wordpad/Hu.rc index 94ceda5a789..74926e1e597 100644 --- a/reactos/base/applications/wordpad/Hu.rc +++ b/reactos/base/applications/wordpad/Hu.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Ja.rc b/reactos/base/applications/wordpad/Ja.rc index 09e48aafdf5..fc21c5a4e74 100644 --- a/reactos/base/applications/wordpad/Ja.rc +++ b/reactos/base/applications/wordpad/Ja.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + /* UTF-8 */ #pragma code_page(65001) @@ -242,6 +244,6 @@ BEGIN STRING_WRITE_ACCESS_DENIED, "ファイルã«ä¿å­˜ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。" STRING_OPEN_FAILED, "ファイルを開ã‘ã¾ã›ã‚“。" STRING_OPEN_ACCESS_DENIED, "ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãæ¨©é™ãŒã‚りã¾ã›ã‚“。" + STRING_PRINTING_NOT_IMPLEMENTED, "プリントãŒå®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“。" + STRING_MAX_TAB_STOPS, "32以上ãªã‚¿ãƒ–を追加ã§ãã¾ã›ã‚“。" END - -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Ko.rc b/reactos/base/applications/wordpad/Ko.rc index 7bfaf00e767..58235857018 100644 --- a/reactos/base/applications/wordpad/Ko.rc +++ b/reactos/base/applications/wordpad/Ko.rc @@ -17,6 +17,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/wordpad/Lt.rc b/reactos/base/applications/wordpad/Lt.rc new file mode 100644 index 00000000000..91fbfcaba91 --- /dev/null +++ b/reactos/base/applications/wordpad/Lt.rc @@ -0,0 +1,249 @@ +/* + * Copyright 2009 Aurimas FiÅ¡eras + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wordpad.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "&Failas" + BEGIN + MENUITEM "&Naujas...\tCtrl+N", ID_FILE_NEW + MENUITEM "&Atverti...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&IÅ¡saugoti\tCtrl+S", ID_FILE_SAVE + MENUITEM "IÅ¡saugoti &kaip...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "S&pausdinti...\tCtrl+P", ID_PRINT + MENUITEM "Spaudinio pe&ržiÅ«ra...", ID_PREVIEW + MENUITEM "Puslapio n&uostatos...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "IÅ¡&eiti", ID_FILE_EXIT + END + POPUP "&Taisa" + BEGIN + MENUITEM "&AtÅ¡aukti\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "&Grąžinti\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "&IÅ¡kirpti\tCtrl+X", ID_EDIT_CUT + MENUITEM "&Kopijuoti\tCtrl+C", ID_EDIT_COPY + MENUITEM "Ä®&dÄ—ti\tCtrl+V", ID_EDIT_PASTE + MENUITEM "&Å alinti\tDEL", ID_EDIT_CLEAR + MENUITEM "&PažymÄ—ti viskÄ…\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "I&eÅ¡koti...\tCrtl+F", ID_FIND + MENUITEM "IeÅ¡k&oti kito\tF3", ID_FIND_NEXT + MENUITEM "Pa&keisti...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "Tik skait&ymui", ID_EDIT_READONLY + MENUITEM "&Modifikuotas", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "Papi&ldomi" + BEGIN + MENUITEM "ŽymÄ—jimo &informacija", ID_EDIT_SELECTIONINFO + MENUITEM "RaÅ¡menų &formatas", ID_EDIT_CHARFORMAT + MENUITEM "&Numatytas raÅ¡menų formatas", ID_EDIT_DEFCHARFORMAT + MENUITEM "&Pastraipos formatas", ID_EDIT_PARAFORMAT + MENUITEM "&Gauti tekstÄ…", ID_EDIT_GETTEXT + END + END + POPUP "&Rodymas" + BEGIN + MENUITEM "&Ä®rankių juosta", ID_TOGGLE_TOOLBAR + MENUITEM "&Formatų juosta", ID_TOGGLE_FORMATBAR + MENUITEM "&LiniuotÄ—", ID_TOGGLE_RULER + MENUITEM "&BÅ«senos juosta", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Parinktys...", ID_VIEWPROPERTIES + END + POPUP "Ä®ter&pimas" + BEGIN + MENUITEM "&Data ir laikas...", ID_DATETIME + END + POPUP "F&ormatas" + BEGIN + MENUITEM "&Å riftas...", ID_FONTSETTINGS + MENUITEM "&Ženkleliai" ID_BULLET + MENUITEM "&Pastraipa..." ID_PARAFORMAT + MENUITEM "&Tabuliavimo žymÄ—s..." ID_TABSTOPS + POPUP "&Fonas" + BEGIN + MENUITEM "&Sistemos\tCtrl+1", ID_BACK_1 + MENUITEM "&Gelsvas\tCtrl+2", ID_BACK_2 + END + END + POPUP "&Žinynas" + BEGIN + MENUITEM "&Apie Wine Wordpad" ID_ABOUT + END +END + +IDM_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&IÅ¡kirpti", ID_EDIT_CUT + MENUITEM "&Kopijuoti", ID_EDIT_COPY + MENUITEM "Ä®&dÄ—ti", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "&Ženkleliai" ID_BULLET + MENUITEM "&Pastraipa..." ID_PARAFORMAT + END +END + +IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Data ir laikas" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Galimi formatai",-1,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY + PUSHBUTTON "&Gerai",IDOK,87,12,40,12 + PUSHBUTTON "&Atsisakyti",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Naujas" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Naujo dokumento tipas",-1,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&Gerai",IDOK,97,12,40,12 + PUSHBUTTON "&Atsisakyti",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Pastraipos formatas" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Ä®trauka", -1, 10, 10, 120, 68 + LTEXT "IÅ¡ kairÄ—s", -1, 15, 22, 45, 13 + EDITTEXT IDC_PARA_LEFT, 60, 20, 55, 13 + LTEXT "IÅ¡ deÅ¡inÄ—s", -1, 15, 40, 45, 13 + EDITTEXT IDC_PARA_RIGHT, 60, 38, 55, 13 + LTEXT "Pirmoji eilutÄ—", -1, 15, 58, 45, 13 + EDITTEXT IDC_PARA_FIRST, 60, 56, 55, 13 + LTEXT "LygiuotÄ—", -1, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&Gerai", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Atsisakyti", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Tabuliavimo žymÄ—s" +FONT 8, "MS SHell DLg" +BEGIN + GROUPBOX "Tabuliavimo pozicija", -1, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE + DEFPUSHBUTTON "&PridÄ—ti", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "Pa&Å¡alinti", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&Gerai", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Atsisakyti", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "PaÅ¡alinti &visas", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +STYLE DS_SYSMODAL +Caption "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "EilutÄ—s skaidymas", -1, 10, 10, 130, 85 + RADIOBUTTON "&EilutÄ—s neskaidomos", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "Skaidyti tekstÄ… prie lango &rÄ—melio", IDC_PAGEFMT_WW, 18, 45, 117, 15 + RADIOBUTTON "Skaidyti tekstÄ… prie ¶Å¡tÄ—s", IDC_PAGEFMT_WM, 18, 65, 117, 15 + GROUPBOX "Ä®rankių juostos", -1, 150, 10, 120, 85 + CHECKBOX "Ä®ran&kių juosta", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "&Formatų juosta", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "&LiniuotÄ—", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "&BÅ«senos juosta", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_RICHTEXT_FILES_RTF, "RaiÅ¡kiojo teksto dokumentai (*.rtf)" + STRING_TEXT_FILES_TXT, "Tekstiniai dokumentai (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Teksto unikodu dokumentai (*.txt)" + STRING_ALL_FILES, "Visi dokumentai (*.*)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "KairinÄ—" + STRING_ALIGN_RIGHT, "DeÅ¡ininÄ—" + STRING_ALIGN_CENTER, "CentrinÄ—" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_NEWFILE_RICHTEXT, "RaiÅ¡kiojo teksto dokumentas" + STRING_NEWFILE_TXT, "Tekstinis dokumentas" + STRING_NEWFILE_TXT_UNICODE, "Teksto unikodu dokumentas" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PRINTER_FILES_PRN, "Spausdintuvo failai (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_VIEWPROPS_TITLE, "Parinktys" + STRING_VIEWPROPS_TEXT, "Tekstas" + STRING_VIEWPROPS_RICHTEXT, "RaiÅ¡kusis tekstas" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PREVIEW_PRINT, "Spausdinti" + STRING_PREVIEW_NEXTPAGE, "Tolesnis puslapis" + STRING_PREVIEW_PREVPAGE, "Ankstesnis puslapis" + STRING_PREVIEW_TWOPAGES, "Du puslapiai" + STRING_PREVIEW_ONEPAGE, "Vienas puslapis" + STRING_PREVIEW_CLOSE, "Užverti" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_DEFAULT_FILENAME, "Dokumentas" + STRING_PROMPT_SAVE_CHANGES, "IÅ¡saugoti „%s“ pakeitimus?" + STRING_SEARCH_FINISHED, "PaieÅ¡ka dokumente baigta." + STRING_LOAD_RICHED_FAILED, "Nepavyko įkelti RichEdit bibliotekos." + STRING_SAVE_LOSEFORMATTING, "JÅ«s pasirinkote iÅ¡saugoti paprasto teksto formatu, " \ + "todÄ—l bus prarastas visas formatavimas. " \ + "Ar tikrai norite tai padaryti?" + STRING_INVALID_NUMBER, "Neteisingas skaiÄiaus formatas" + STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE saugyklos dokumentai yra nepalaikomi" + STRING_WRITE_FAILED, "Nepavyko iÅ¡saugoti failo." + STRING_WRITE_ACCESS_DENIED, "JÅ«s neturite prieigos failui iÅ¡saugoti." + STRING_OPEN_FAILED, "Nepavyko atverti failo." + STRING_OPEN_ACCESS_DENIED, "JÅ«s neturite prieigos failui atverti." + STRING_PRINTING_NOT_IMPLEMENTED, "Spausdinimas nerealizuotas" + STRING_MAX_TAB_STOPS, "Negalima pridÄ—ti daugiau negu 32-jų tabuliavimo pozicijų." +END diff --git a/reactos/base/applications/wordpad/Nl.rc b/reactos/base/applications/wordpad/Nl.rc index c91e028c3e4..c9ce64a4b29 100644 --- a/reactos/base/applications/wordpad/Nl.rc +++ b/reactos/base/applications/wordpad/Nl.rc @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/No.rc b/reactos/base/applications/wordpad/No.rc index 6261c6fb81d..5a4fdbf8c30 100644 --- a/reactos/base/applications/wordpad/No.rc +++ b/reactos/base/applications/wordpad/No.rc @@ -1,5 +1,5 @@ /* - * Copyright 2006-2008 by Alexander N. Sørnes + * Copyright 2006-2009 by Alexander N. Sørnes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,6 +16,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + +#pragma code_page(65001) + LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL IDM_MAINMENU MENU DISCARDABLE @@ -23,12 +27,12 @@ BEGIN POPUP "&Fil" BEGIN MENUITEM "&Ny...\tCtrl+N", ID_FILE_NEW - MENUITEM "&Åpne...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Ã…pne...\tCtrl+O", ID_FILE_OPEN MENUITEM "&Lagre\tCtrl+S", ID_FILE_SAVE MENUITEM "Lagre &som...", ID_FILE_SAVEAS MENUITEM SEPARATOR MENUITEM "&Skriv ut...\tCtrl+P", ID_PRINT - MENUITEM "&Forhåndsvisning...", ID_PREVIEW + MENUITEM "&ForhÃ¥ndsvisning...", ID_PREVIEW MENUITEM "&Utskriftformat...", ID_PRINTSETUP MENUITEM SEPARATOR MENUITEM "&Avslutt", ID_FILE_EXIT @@ -44,8 +48,8 @@ BEGIN MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR MENUITEM "&Merk alt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Søk etter...\tCrtl+F", ID_FIND - MENUITEM "Søk etter &neste\tF3", ID_FIND_NEXT + MENUITEM "&Søk etter...\tCrtl+F", ID_FIND + MENUITEM "Søk etter &neste\tF3", ID_FIND_NEXT MENUITEM "E&rstatt...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR MENUITEM "S&krivebeskyttet", ID_EDIT_READONLY @@ -53,7 +57,7 @@ BEGIN MENUITEM SEPARATOR POPUP "&Ekstra" BEGIN - MENUITEM "&Info om merket område", ID_EDIT_SELECTIONINFO + MENUITEM "&Info om merket omrÃ¥de", ID_EDIT_SELECTIONINFO MENUITEM "Tegn&format", ID_EDIT_CHARFORMAT MENUITEM "Stan&dard tegnformat", ID_EDIT_DEFCHARFORMAT MENUITEM "&Avsnittformat", ID_EDIT_PARAFORMAT @@ -62,7 +66,7 @@ BEGIN END POPUP "&Vis" BEGIN - MENUITEM "Verk&tøylinje", ID_TOGGLE_TOOLBAR + MENUITEM "Verk&tøylinje", ID_TOGGLE_TOOLBAR MENUITEM "&Formatlinje", ID_TOGGLE_FORMATBAR MENUITEM "&Linjal", ID_TOGGLE_RULER MENUITEM "&Statuslinje", ID_TOGGLE_STATUSBAR @@ -134,9 +138,9 @@ BEGIN GROUPBOX "Innrykk", -1, 10, 10, 120, 68 LTEXT "Venstre", -1, 15, 22, 40, 13 EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 - LTEXT "Høyre", -1, 15, 40, 40, 13 + LTEXT "Høyre", -1, 15, 40, 40, 13 EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 - LTEXT "Første linje", -1, 15, 58, 40, 13 + LTEXT "Første linje", -1, 15, 58, 40, 13 EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 LTEXT "Justering", -1, 15, 87, 40, 13 COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST @@ -167,8 +171,8 @@ BEGIN RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15 RADIOBUTTON "Bryt tekst etter v&indusbredden", IDC_PAGEFMT_WW, 18, 45, 117, 15 RADIOBUTTON "Bryt tekst etter &margen", IDC_PAGEFMT_WM, 18, 65, 117, 15 - GROUPBOX "Verktøylinjer", -1, 150, 10, 120, 85 - CHECKBOX "&Verktøylinje", IDC_PAGEFMT_TB, 160, 20, 80, 15 + GROUPBOX "Verktøylinjer", -1, 150, 10, 120, 85 + CHECKBOX "&Verktøylinje", IDC_PAGEFMT_TB, 160, 20, 80, 15 CHECKBOX "&Formatlinje", IDC_PAGEFMT_FB, 160, 38, 80, 15 CHECKBOX "&Linjal", IDC_PAGEFMT_RU, 160, 56, 80, 15 CHECKBOX "&Statuslinje", IDC_PAGEFMT_SB, 160, 74, 80, 15 @@ -193,7 +197,7 @@ END STRINGTABLE DISCARDABLE BEGIN STRING_ALIGN_LEFT, "Venstrestilt" - STRING_ALIGN_RIGHT, "Høyrestilt" + STRING_ALIGN_RIGHT, "Høyrestilt" STRING_ALIGN_CENTER, "Midtstilt" END @@ -215,7 +219,7 @@ BEGIN STRING_PREVIEW_NEXTPAGE, "Neste side" STRING_PREVIEW_PREVPAGE, "Forrige side" STRING_PREVIEW_TWOPAGES, "To sider" - STRING_PREVIEW_ONEPAGE, "Én side" + STRING_PREVIEW_ONEPAGE, "Én side" STRING_PREVIEW_CLOSE, "Lukk" END @@ -227,16 +231,18 @@ END STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" - STRING_PROMPT_SAVE_CHANGES, "Lagre endringer i «%s»?" - STRING_SEARCH_FINISHED, "Ferdig med å søke i dokumentet." + STRING_PROMPT_SAVE_CHANGES, "Lagre endringer i «%s»?" + STRING_SEARCH_FINISHED, "Ferdig med Ã¥ søke i dokumentet." STRING_LOAD_RICHED_FAILED, "Klarte ikke laste RichEdit-biblioteket." - STRING_SAVE_LOSEFORMATTING, "Du har valgt å lagre i rent tekstformat, noe som " \ - "vil føre til at all formatering går tapt. Er du " \ - "sikker på at du vil fortsette?" + STRING_SAVE_LOSEFORMATTING, "Du har valgt Ã¥ lagre i rent tekstformat, noe som " \ + "vil føre til at all formatering gÃ¥r tapt. Er du " \ + "sikker pÃ¥ at du vil fortsette?" STRING_INVALID_NUMBER, "Ugyldig tallformat" STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage documents are not supported" STRING_WRITE_FAILED, "Klarte ikke lagre filen." - STRING_WRITE_ACCESS_DENIED, "Du har ikke tilgang til å lagre filen." - STRING_OPEN_FAILED, "Klarte ikke åpne filen." - STRING_OPEN_ACCESS_DENIED, "Du har ikke tilgang til å åpne filen." + STRING_WRITE_ACCESS_DENIED, "Du har ikke tilgang til Ã¥ lagre filen." + STRING_OPEN_FAILED, "Klarte ikke Ã¥pne filen." + STRING_OPEN_ACCESS_DENIED, "Du har ikke tilgang til Ã¥ Ã¥pne filen." + STRING_PRINTING_NOT_IMPLEMENTED, "Utskriftfunksjonen er ikke laget ennÃ¥." + STRING_MAX_TAB_STOPS, "Kan ikke legge til mer enn 32 tabulatorstopp." END diff --git a/reactos/base/applications/wordpad/Pl.rc b/reactos/base/applications/wordpad/Pl.rc index 47ff1bd0e3f..ab72104e5d0 100644 --- a/reactos/base/applications/wordpad/Pl.rc +++ b/reactos/base/applications/wordpad/Pl.rc @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_POLISH, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Pt.rc b/reactos/base/applications/wordpad/Pt.rc index b246c700bcd..f8d7df2f889 100644 --- a/reactos/base/applications/wordpad/Pt.rc +++ b/reactos/base/applications/wordpad/Pt.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Ru.rc b/reactos/base/applications/wordpad/Ru.rc index e4371993991..6428f7b1a0d 100644 --- a/reactos/base/applications/wordpad/Ru.rc +++ b/reactos/base/applications/wordpad/Ru.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc index 5e349580a24..1b6d37fd41c 100644 --- a/reactos/base/applications/wordpad/Si.rc +++ b/reactos/base/applications/wordpad/Si.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + #pragma code_page(65001) LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT @@ -245,5 +247,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Tiskanje (Å¡e) ni na voljo" STRING_MAX_TAB_STOPS, "Ne morem vstaviti veÄ kot 32 položajev tabulatorja." END - -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Sv.rc b/reactos/base/applications/wordpad/Sv.rc index 4bb2ae24557..d94e6e3d190 100644 --- a/reactos/base/applications/wordpad/Sv.rc +++ b/reactos/base/applications/wordpad/Sv.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL #pragma code_page(65001) @@ -244,5 +246,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Utskrift ej implementerat." STRING_MAX_TAB_STOPS, "Kan ej lägga till mer än 32 tabbstopp." END - -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Tr.rc b/reactos/base/applications/wordpad/Tr.rc index 7df9a36fb7a..92290371d37 100644 --- a/reactos/base/applications/wordpad/Tr.rc +++ b/reactos/base/applications/wordpad/Tr.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Zh.rc b/reactos/base/applications/wordpad/Zh.rc index 5c11ab79963..d8ceec43a1a 100644 --- a/reactos/base/applications/wordpad/Zh.rc +++ b/reactos/base/applications/wordpad/Zh.rc @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wordpad.h" + /* Chinese text is encoded in UTF-8 */ #pragma code_page(65001) @@ -469,5 +471,3 @@ BEGIN STRING_OPEN_FAILED, "ä¸èƒ½é–‹å•Ÿæª”案." STRING_OPEN_ACCESS_DENIED, "你沒有開啟檔案的權力." END - -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc index 1a77fe27be1..ac159da8916 100644 --- a/reactos/base/applications/wordpad/rsrc.rc +++ b/reactos/base/applications/wordpad/rsrc.rc @@ -17,9 +17,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include - #include "wordpad.h" MAINACCELTABLE ACCELERATORS @@ -63,20 +60,3 @@ IDI_WRI ICON "wri.ico" /* @makedep: txt.ico */ IDI_TXT ICON "txt.ico" - -#include "Da.rc" -#include "De.rc" -#include "En.rc" -#include "Fr.rc" -#include "Hu.rc" -#include "Ja.rc" -#include "Ko.rc" -#include "Nl.rc" -#include "No.rc" -#include "Pl.rc" -#include "Pt.rc" -#include "Ru.rc" -#include "Si.rc" -#include "Sv.rc" -#include "Tr.rc" -#include "Zh.rc" diff --git a/reactos/base/applications/wordpad/wordpad.h b/reactos/base/applications/wordpad/wordpad.h index ece183fc1c2..6d3e64ab4c7 100644 --- a/reactos/base/applications/wordpad/wordpad.h +++ b/reactos/base/applications/wordpad/wordpad.h @@ -17,6 +17,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include +#include + #define MAX_STRING_LEN 255 #define TWIPS_PER_INCH 1440 From 8333c72806326a7981f9320e09e34065e61105c1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 10 Jul 2009 17:01:12 +0000 Subject: [PATCH 298/577] - Move XLATEOBJ_hGetColorTransform to xlate.c - Implement InitXlateImpl(), that currently does ... nothing :) - Don't pass a palette type to IntEngCreateXlate, when already passing a valid palette. svn path=/trunk/; revision=41847 --- reactos/subsystems/win32/win32k/eng/mouse.c | 4 +-- reactos/subsystems/win32/win32k/eng/xlate.c | 16 +++++++++ .../subsystems/win32/win32k/include/inteng.h | 2 ++ .../subsystems/win32/win32k/main/dllmain.c | 2 ++ .../subsystems/win32/win32k/objects/dibobj.c | 2 +- .../win32/win32k/objects/fillshap.c | 2 +- reactos/subsystems/win32/win32k/stubs/stubs.c | 34 ++++++------------- 7 files changed, 35 insertions(+), 27 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/mouse.c b/reactos/subsystems/win32/win32k/eng/mouse.c index 399a47cd627..24d866ba434 100644 --- a/reactos/subsystems/win32/win32k/eng/mouse.c +++ b/reactos/subsystems/win32/win32k/eng/mouse.c @@ -1,4 +1,4 @@ -/* +/* * PROJECT: ReactOS win32 subsystem * PURPOSE: Mouse pointer functions * FILE: subsystems/win32k/eng/mouse.c @@ -420,7 +420,7 @@ EngSetPointerShape( BWColors, 0, 0, 0); DestPalette = ppdev->DevInfo.hpalDefault; - pgp->XlateObject = IntEngCreateXlate(0, PAL_INDEXED, + pgp->XlateObject = IntEngCreateXlate(0, 0, DestPalette, BWPalette); EngDeletePalette(BWPalette); } diff --git a/reactos/subsystems/win32/win32k/eng/xlate.c b/reactos/subsystems/win32/win32k/eng/xlate.c index 7dd66d74ed8..c5db258d1c8 100644 --- a/reactos/subsystems/win32/win32k/eng/xlate.c +++ b/reactos/subsystems/win32/win32k/eng/xlate.c @@ -32,6 +32,11 @@ #define NDEBUG #include +VOID +InitXlateImpl(VOID) +{ +} + static __inline ULONG ShiftAndMask(XLATEGDI *XlateGDI, ULONG Color) { @@ -671,6 +676,17 @@ XLATEOBJ_cGetPalette(XLATEOBJ *XlateObj, ULONG PalOutType, ULONG cPal, return 0; } +/* + * @unimplemented + */ +HANDLE APIENTRY +XLATEOBJ_hGetColorTransform( + IN XLATEOBJ *XlateObj) +{ + UNIMPLEMENTED; + return NULL; +} + // HACK! XLATEOBJ* IntCreateBrushXlate(PDC pdc, BRUSH *pbrush) diff --git a/reactos/subsystems/win32/win32k/include/inteng.h b/reactos/subsystems/win32/win32k/include/inteng.h index f31f94e9f45..ac9d1da5b1f 100644 --- a/reactos/subsystems/win32/win32k/include/inteng.h +++ b/reactos/subsystems/win32/win32k/include/inteng.h @@ -90,6 +90,8 @@ IntEngGradientFill(SURFOBJ *psoDest, POINTL *pptlDitherOrg, ULONG ulMode); +VOID InitXlateImpl(VOID); + XLATEOBJ* FASTCALL IntEngCreateXlate(USHORT DestPalType, USHORT SourcePalType, diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 7062a102bf5..53b133e28d1 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -528,6 +528,8 @@ DriverEntry ( return STATUS_UNSUCCESSFUL; } + InitXlateImpl(); + /* Create stock objects, ie. precreated objects commonly used by win32 applications */ CreateStockObjects(); diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index a5a92c27a6a..9bc9ea20cb2 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -314,7 +314,7 @@ IntSetDIBits( } // Determine XLATEOBJ for color translation - XlateObj = IntEngCreateXlate(DDB_Palette_Type, DIB_Palette_Type, DDB_Palette, DIB_Palette); + XlateObj = IntEngCreateXlate(0, 0, DDB_Palette, DIB_Palette); if (NULL == XlateObj) { PALETTE_FreePaletteByHandle(DIB_Palette); diff --git a/reactos/subsystems/win32/win32k/objects/fillshap.c b/reactos/subsystems/win32/win32k/objects/fillshap.c index a77eba5ac60..19174495690 100644 --- a/reactos/subsystems/win32/win32k/objects/fillshap.c +++ b/reactos/subsystems/win32/win32k/objects/fillshap.c @@ -923,7 +923,7 @@ IntGdiGradientFill( PalDestGDI = PALETTE_LockPalette(hDestPalette); if (PalDestGDI) { - Mode = PalDestGDI->Mode; + Mode = 0; PALETTE_UnlockPalette(PalDestGDI); } else diff --git a/reactos/subsystems/win32/win32k/stubs/stubs.c b/reactos/subsystems/win32/win32k/stubs/stubs.c index 367b6310a23..42f09f6d0b7 100644 --- a/reactos/subsystems/win32/win32k/stubs/stubs.c +++ b/reactos/subsystems/win32/win32k/stubs/stubs.c @@ -988,18 +988,6 @@ HT_Get8BPPMaskPalette( return 0; } -/* - * @unimplemented - */ -HANDLE APIENTRY -XLATEOBJ_hGetColorTransform( - IN XLATEOBJ *XlateObj) -{ - UNIMPLEMENTED; - return NULL; -} - - /* * @unimplemented */ @@ -2747,7 +2735,7 @@ EngFntCacheAlloc(IN ULONG FastCheckSum, UNIMPLEMENTED; return NULL; } - + VOID APIENTRY EngFntCacheFault(IN ULONG ulFastCheckSum, @@ -2755,7 +2743,7 @@ EngFntCacheFault(IN ULONG ulFastCheckSum, { UNIMPLEMENTED; } - + PVOID APIENTRY EngFntCacheLookUp(IN ULONG FastCheckSum, @@ -2772,7 +2760,7 @@ FLOATOBJ_AddFloatObj(PFLOATOBJ pFloatObj1, { UNIMPLEMENTED; } - + VOID APIENTRY FLOATOBJ_DivFloatObj(PFLOATOBJ pFloatObj1, @@ -2780,7 +2768,7 @@ FLOATOBJ_DivFloatObj(PFLOATOBJ pFloatObj1, { UNIMPLEMENTED; } - + VOID APIENTRY FLOATOBJ_MulFloatObj(PFLOATOBJ pFloatObj1, @@ -2788,7 +2776,7 @@ FLOATOBJ_MulFloatObj(PFLOATOBJ pFloatObj1, { UNIMPLEMENTED; } - + VOID APIENTRY FLOATOBJ_SubFloatObj(PFLOATOBJ pFloatObj1, @@ -2796,7 +2784,7 @@ FLOATOBJ_SubFloatObj(PFLOATOBJ pFloatObj1, { UNIMPLEMENTED; } - + PVOID APIENTRY EngAllocSectionMem(IN PVOID SectionObject, @@ -2807,7 +2795,7 @@ EngAllocSectionMem(IN PVOID SectionObject, UNIMPLEMENTED; return NULL; } - + NTSTATUS APIENTRY EngFileIoControl(IN PFILE_OBJECT FileObject, @@ -2821,7 +2809,7 @@ EngFileIoControl(IN PFILE_OBJECT FileObject, UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; } - + VOID APIENTRY EngFileWrite(IN PFILE_OBJECT FileObject, @@ -2831,7 +2819,7 @@ EngFileWrite(IN PFILE_OBJECT FileObject, { UNIMPLEMENTED; } - + BOOLEAN APIENTRY EngFreeSectionMem(IN PVOID SectionObject OPTIONAL, @@ -2856,7 +2844,7 @@ EngGetTickCount(VOID) return (Int64ShrlMod32(UInt32x32To64(Multiplier, TickCount.LowPart), 24) + (Multiplier * (TickCount.HighPart << 8))); } - + BOOLEAN APIENTRY EngMapSection(IN PVOID Section, @@ -2867,7 +2855,7 @@ EngMapSection(IN PVOID Section, UNIMPLEMENTED; return FALSE; } - + BOOLEAN APIENTRY EngNineGrid(IN SURFOBJ* pDestSurfaceObj, From c58c9ebb3221fdd499dffca65c6e803fce50ecf6 Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Fri, 10 Jul 2009 17:10:20 +0000 Subject: [PATCH 299/577] - Add the task manager to the tray context menu - Add a bit of code for the tray properties dialog svn path=/trunk/; revision=41848 --- reactos/base/shell/explorer-new/lang/en-US.rc | 9 + reactos/base/shell/explorer-new/resource.h | 9 + reactos/base/shell/explorer-new/trayprop.c | 183 +++++++++++++++++- reactos/base/shell/explorer-new/traywnd.c | 16 ++ 4 files changed, 216 insertions(+), 1 deletion(-) diff --git a/reactos/base/shell/explorer-new/lang/en-US.rc b/reactos/base/shell/explorer-new/lang/en-US.rc index 925640b9fd3..550777fdd23 100644 --- a/reactos/base/shell/explorer-new/lang/en-US.rc +++ b/reactos/base/shell/explorer-new/lang/en-US.rc @@ -4,6 +4,10 @@ IDM_TRAYWND MENU DISCARDABLE BEGIN POPUP "" BEGIN + + MENUITEM SEPARATOR + MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR + MENUITEM SEPARATOR MENUITEM "&Lock the Taskbar", ID_LOCKTASKBAR MENUITEM "P&roperties", ID_SHELL_CMD_PROPERTIES END @@ -57,3 +61,8 @@ BEGIN IDS_OPEN_ALL_USERS "O&pen All Users" IDS_EXPLORE_ALL_USERS "E&xplore All Users" END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties" +END diff --git a/reactos/base/shell/explorer-new/resource.h b/reactos/base/shell/explorer-new/resource.h index 51702212ba6..c2af9abbcc2 100644 --- a/reactos/base/shell/explorer-new/resource.h +++ b/reactos/base/shell/explorer-new/resource.h @@ -21,6 +21,7 @@ #define ID_SHELL_CMD_OPEN_ALL_USERS (ID_SHELL_CMD_LAST + 2) #define ID_SHELL_CMD_EXPLORE_ALL_USERS (ID_SHELL_CMD_LAST + 3) #define ID_LOCKTASKBAR (ID_SHELL_CMD_LAST + 4) +#define ID_SHELL_CMD_OPEN_TASKMGR (ID_SHELL_CMD_LAST + 5) /* NOTE: The following constants may *NOT* be changed because they're hardcoded and need to be the exact values @@ -44,4 +45,12 @@ #define IDM_SHUTDOWN 506 #define IDM_LASTSTARTMENU_SEPARATOR 450 +/* Taskbar resources */ +#define IDD_TASKBARPAGE 2000 +#define IDD_STARTMENUPAGE 2001 +#define IDD_NOTIFICATIONPAGE 2002 +#define IDD_TOOLBARSPAGE 2003 + +#define IDS_TASKBAR_STARTMENU_PROP_CAPTION 2200 + #endif /* __RESOURCE_H */ diff --git a/reactos/base/shell/explorer-new/trayprop.c b/reactos/base/shell/explorer-new/trayprop.c index d412bef8dc5..0783ab648ab 100644 --- a/reactos/base/shell/explorer-new/trayprop.c +++ b/reactos/base/shell/explorer-new/trayprop.c @@ -20,10 +20,191 @@ #include +INT_PTR CALLBACK +TaskbarPageProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + break; + + case WM_DESTROY: + break; + + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + + switch(pnmh->code) + { + case PSN_SETACTIVE: + break; + + case PSN_APPLY: + break; + } + + break; + } + } + + return FALSE; +} + + +INT_PTR CALLBACK +StartMenuPageProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + break; + + case WM_DESTROY: + break; + + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + + switch(pnmh->code) + { + case PSN_SETACTIVE: + break; + + case PSN_APPLY: + break; + } + + break; + } + } + + return FALSE; +} + + +INT_PTR CALLBACK +NotificationPageProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + break; + + case WM_DESTROY: + break; + + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + + switch(pnmh->code) + { + case PSN_SETACTIVE: + break; + + case PSN_APPLY: + break; + } + + break; + } + } + + return FALSE; +} + + +INT_PTR CALLBACK +ToolbarsPageProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + break; + + case WM_DESTROY: + break; + + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + + switch(pnmh->code) + { + case PSN_SETACTIVE: + break; + + case PSN_APPLY: + break; + } + + break; + } + } + + return FALSE; +} + + +static VOID +InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc) +{ + ZeroMemory(psp, sizeof(PROPSHEETPAGE)); + psp->dwSize = sizeof(PROPSHEETPAGE); + psp->dwFlags = PSP_DEFAULT; + psp->hInstance = hExplorerInstance; + psp->pszTemplate = MAKEINTRESOURCE(idDlg); + psp->pfnDlgProc = DlgProc; +} + + HWND DisplayTrayProperties(ITrayWindow *Tray) { - DbgPrint("DisplayTrayProperties() not implemented!\n"); + PROPSHEETHEADER psh; + PROPSHEETPAGE psp[4]; + TCHAR szCaption[256]; +#if 1 MessageBox(NULL, _T("Not implemented"), NULL, 0); return NULL; +#endif + if (!LoadString(hExplorerInstance, + IDS_TASKBAR_STARTMENU_PROP_CAPTION, + szCaption, + sizeof(szCaption) / sizeof(szCaption[0]))) + { + return NULL; + } + + ZeroMemory(&psh, sizeof(PROPSHEETHEADER)); + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE; + psh.hwndParent = NULL; + psh.hInstance = hExplorerInstance; + psh.hIcon = NULL; + psh.pszCaption = szCaption; + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); + psh.nStartPage = 0; + psh.ppsp = psp; + + InitPropSheetPage(&psp[0], IDD_TASKBARPAGE, (DLGPROC)TaskbarPageProc); + InitPropSheetPage(&psp[1], IDD_STARTMENUPAGE, (DLGPROC)StartMenuPageProc); + InitPropSheetPage(&psp[2], IDD_NOTIFICATIONPAGE, (DLGPROC)NotificationPageProc); + InitPropSheetPage(&psp[3], IDD_TOOLBARSPAGE, (DLGPROC)ToolbarsPageProc); + + return (HWND)PropertySheet(&psh); } diff --git a/reactos/base/shell/explorer-new/traywnd.c b/reactos/base/shell/explorer-new/traywnd.c index 4e8438fa941..7af0c06d2aa 100644 --- a/reactos/base/shell/explorer-new/traywnd.c +++ b/reactos/base/shell/explorer-new/traywnd.c @@ -1697,6 +1697,17 @@ OpenCommonStartMenuDirectory(IN HWND hWndOwner, } } +static VOID +OpenTaskManager(IN HWND hWndOwner) +{ + ShellExecute(hWndOwner, + TEXT("open"), + TEXT("taskmgr.exe"), + NULL, + NULL, + SW_SHOWNORMAL); +} + static BOOL STDMETHODCALLTYPE ITrayWindowImpl_ExecContextMenuCmd(IN OUT ITrayWindow *iface, IN UINT uiCmd) @@ -1728,6 +1739,11 @@ ITrayWindowImpl_ExecContextMenuCmd(IN OUT ITrayWindow *iface, } break; + case ID_SHELL_CMD_OPEN_TASKMGR: + OpenTaskManager(This->hWnd); + break; + + default: DbgPrint("ITrayWindow::ExecContextMenuCmd(%u): Unhandled Command ID!\n", uiCmd); bHandled = FALSE; From 91d9b85d53f4a3e5e496959a82ce371ba5b6c667 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Fri, 10 Jul 2009 17:17:43 +0000 Subject: [PATCH 300/577] Revert the sync, it breaks build. further investigation will be made next week. 1/2 svn path=/trunk/; revision=41849 --- rosapps/applications/winfile/lang/Lt.rc | 263 --------------------- rosapps/applications/winfile/lang/cs-CZ.rc | 2 - rosapps/applications/winfile/lang/da-DK.rc | 2 - rosapps/applications/winfile/lang/de-DE.rc | 56 ++--- rosapps/applications/winfile/lang/en-US.rc | 2 - rosapps/applications/winfile/lang/es-ES.rc | 2 - rosapps/applications/winfile/lang/fr-FR.rc | 167 +++++++------ rosapps/applications/winfile/lang/hu-HU.rc | 2 - rosapps/applications/winfile/lang/it-IT.rc | 2 - rosapps/applications/winfile/lang/ja-JP.rc | 4 +- rosapps/applications/winfile/lang/ko-KR.rc | 2 - rosapps/applications/winfile/lang/nl-NL.rc | 2 - rosapps/applications/winfile/lang/no-NO.rc | 2 - rosapps/applications/winfile/lang/pl-PL.rc | 2 - rosapps/applications/winfile/lang/pt-BR.rc | 146 ++++-------- rosapps/applications/winfile/lang/ru-RU.rc | 2 - rosapps/applications/winfile/lang/sl-SI.rc | 4 +- rosapps/applications/winfile/lang/sv-SE.rc | 2 - rosapps/applications/winfile/lang/tr-TR.rc | 2 - rosapps/applications/winfile/lang/zh-CN.rc | 4 +- rosapps/applications/winfile/resource.h | 2 - 21 files changed, 162 insertions(+), 510 deletions(-) delete mode 100644 rosapps/applications/winfile/lang/Lt.rc diff --git a/rosapps/applications/winfile/lang/Lt.rc b/rosapps/applications/winfile/lang/Lt.rc deleted file mode 100644 index 32cec0efea7..00000000000 --- a/rosapps/applications/winfile/lang/Lt.rc +++ /dev/null @@ -1,263 +0,0 @@ -/* - * WineFile - * Lithuanian Language Support - * - * Copyright 2009 Aurimas FiÅ¡eras - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "resource.h" - -/* UTF-8 */ -#pragma code_page(65001) - -LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL - -/* Menu */ - -IDM_WINEFILE MENU FIXED IMPURE -{ - POPUP "&Failas" { - MENUITEM "&Atverti\tEnter", ID_ACTIVATE - MENUITEM "Pe&rkelti...\tF7", ID_FILE_MOVE - MENUITEM "&Kopijuoti...\tF8", ID_FILE_COPY - MENUITEM "IÅ¡karpin&Ä—je...\tF9", 118 - MENUITEM "&Å alinti\tDel", ID_FILE_DELETE - MENUITEM "Per&vadinti...", 109 - MENUITEM "Savy&bÄ—s...\tAlt+Enter", ID_EDIT_PROPERTIES - MENUITEM SEPARATOR - MENUITEM "&Glaudinti...", 119 - MENUITEM "IÅ¡sk&leisti...", 120 - MENUITEM SEPARATOR - MENUITEM "&Vykdyti...", ID_EXECUTE - MENUITEM "&Spausdinti...", 102 - MENUITEM "Susieti...", 103 - MENUITEM SEPARATOR - MENUITEM "Suk&urti katalogÄ…...", 111 - MENUITEM "&IeÅ¡koti...", 104 - MENUITEM "&PažymÄ—ti failus...", 116 - MENUITEM SEPARATOR -#ifndef _NO_EXTENSIONS - MENUITEM "IÅ¡&eiti\tAlt+X", ID_FILE_EXIT -#else - MENUITEM "IÅ¡&eiti", ID_FILE_EXIT -#endif - } - - POPUP "&Diskas" { - MENUITEM "&Kopijuoti diskÄ…...", 201 - MENUITEM "&Pavadinti diskÄ…...", 202 - MENUITEM SEPARATOR - MENUITEM "&Ženklinti diskÄ…...", ID_FORMAT_DISK -#ifdef _WIN95 - MENUITEM "&Sukurti sisteminį diskÄ…...", -1 /*TODO*/ -#endif - MENUITEM SEPARATOR - MENUITEM "Pri&jungti tinklo diskÄ…", ID_CONNECT_NETWORK_DRIVE - MENUITEM "&Atjungti tinklo diskÄ…", ID_DISCONNECT_NETWORK_DRIVE - MENUITEM SEPARATOR - MENUITEM "&Bendrinti kaip...", 254 - MENUITEM "&Panaikinti bendrumÄ…...", 255 - MENUITEM SEPARATOR - MENUITEM "&IÅ¡rinkti diskÄ…...", 251 - } - - POPUP "&Katalogai" { - MENUITEM "&Kitas lygis\t+", 301 - MENUITEM "IÅ¡skleisti &medį\t*", 302 - MENUITEM "IÅ¡skleisti &viskÄ…\tStrg+*", 303 - MENUITEM "Suskleisti m&edį\t-", 304 - MENUITEM SEPARATOR - MENUITEM "&PažymÄ—ti vaikus", 505 - } - - POPUP "&Rodymas" { - MENUITEM "&Medis ir katalogai", 413 - MENUITEM "&Tik medis", 411 - MENUITEM "Tik &katalogai", 412 - MENUITEM SEPARATOR - MENUITEM "&Skaidyti", ID_VIEW_SPLIT - MENUITEM SEPARATOR - MENUITEM "&Vardas", ID_VIEW_NAME - MENUITEM "Visa failo &informacija", ID_VIEW_ALL_ATTRIBUTES, CHECKED - MENUITEM "&DalinÄ— informacija...", ID_VIEW_SELECTED_ATTRIBUTES - MENUITEM SEPARATOR - MENUITEM "&Rikiuoti pagal vardÄ…", ID_VIEW_SORT_NAME - MENUITEM "Rikiuoti &pagal tipÄ…", ID_VIEW_SORT_TYPE - MENUITEM "Rikiuoti pagal d&ydį", ID_VIEW_SORT_SIZE - MENUITEM "Rikiuoti pagal d&atÄ…", ID_VIEW_SORT_DATE - MENUITEM SEPARATOR - MENUITEM "&Filtruoti pagal...", ID_VIEW_FILTER - } - - POPUP "&Parinktys" { - MENUITEM "&Patvirtinimas...", 501 - MENUITEM "&Å riftas...", ID_SELECT_FONT - MENUITEM "Adaptuoti įrankių &juostÄ…...", 512 - MENUITEM SEPARATOR - MENUITEM "&Ä®rankių juosta", ID_VIEW_TOOL_BAR, CHECKED - MENUITEM "&Diskų juosta", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "&BÅ«senos juosta", ID_VIEW_STATUSBAR, CHECKED -#ifndef _NO_EXTENSIONS - MENUITEM "&Visas ekranas\tCtrl+Shift+S", ID_VIEW_FULLSCREEN -#endif - MENUITEM SEPARATOR - MENUITEM "&Suskleisti vykdant", 504 - MENUITEM "&IÅ¡einant iÅ¡saugoti nuostatas", ID_VIEW_SAVESETTINGS - } - - - POPUP "&Saugumas" { - MENUITEM "&Prieiga...", 605 - MENUITEM "&Registravimas...", 606 - MENUITEM "&Savininkas...", 607 - } - - POPUP "&Langas" { - MENUITEM "Naujas &langas", ID_WINDOW_NEW - MENUITEM "IÅ¡dÄ—styti pa&kopomis\tCtrl+F5", ID_WINDOW_CASCADE - MENUITEM "IÅ¡kloti &gulsÄiai", ID_WINDOW_TILE_HORZ - MENUITEM "IÅ¡kloti &staÄiai\tCtrl+F4", ID_WINDOW_TILE_VERT -#ifndef _NO_EXTENSIONS - MENUITEM "IÅ¡dÄ—styti &automatiÅ¡kai", ID_WINDOW_AUTOSORT -#endif - MENUITEM "IÅ¡dÄ—styti si&mbolius", ID_WINDOW_ARRANGE - MENUITEM "At&naujinti\tF5", ID_REFRESH - } - - POPUP "&Žinynas" { - MENUITEM "Žinyno &temos\tF1", ID_HELP - MENUITEM "&PaieÅ¡ka žinyne...\tF1", ID_HELP - MENUITEM "Žinyno &naudojimas\tF1", ID_HELP_USING - MENUITEM SEPARATOR - MENUITEM "&Apie Winefile...", ID_ABOUT - } -} - - -IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Vykdyti" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Komanda:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Kaip &simbolį", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 - DEFPUSHBUTTON "Gerai", 1, 158, 6, 47, 14 - PUSHBUTTON "Atsisakyti", 2, 158, 23, 47, 14 - PUSHBUTTON "&Žinynas", 254, 158, 43, 47, 14 -} - -IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "IÅ¡rinkite paskirtį" -FONT 8, "MS Shell Dlg" -{ - CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Kelias:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 - EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - DEFPUSHBUTTON "Gerai", 1, 158, 6, 47, 14 - PUSHBUTTON "Atsisakyti", 2, 158, 23, 47, 14 - PUSHBUTTON "&Parinkti", 254, 158, 43, 47, 14 -} - -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Pagal failo tipÄ…" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "&Vardas:",-1,7,8,26,10 - EDITTEXT IDC_VIEW_PATTERN,35,7,59,12,ES_AUTOHSCROLL - GROUPBOX "Failų tipai",-1,7,23,87,56 - CONTROL "&Katalogai",IDC_VIEW_TYPE_DIRECTORIES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 - CONTROL "&Programos",IDC_VIEW_TYPE_PROGRAMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 - CONTROL "&Dokumentai",IDC_VIEW_TYPE_DOCUMENTS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 - CONTROL "Kiti &failai",IDC_VIEW_TYPE_OTHERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 - CONTROL "Rodyti paslÄ—ptus/&sisteminius failus",IDC_VIEW_TYPE_HIDDEN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,122,9 - DEFPUSHBUTTON "Gerai",IDOK,104,7,50,14 - PUSHBUTTON "Atsisakyti",IDCANCEL,104,24,50,14 -END - -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "%s savybÄ—s" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "Gerai",IDOK,191,7,50,14 - PUSHBUTTON "Atsisakyti",IDCANCEL,191,29,50,14 - LTEXT "&Failo vardas:",-1,7,7,59,9 - EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Visas &kelias:",-1,7,18,59,9 - EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Pask. keitimas:",-1,7,29,59,9 - EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Versija:",-1,7,40,59,9 - EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "&Autoriaus teisÄ—s:",-1,7,51,59,9 - EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Dydis:",-1,7,62,59,9 - EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - GROUPBOX "Požymiai",-1,7,79,158,46 - CONTROL "&Tik skaitymui",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 - CONTROL "&PaslÄ—ptas",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 - CONTROL "&Archyvuotinas",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 - CONTROL "&Sisteminis",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 - CONTROL "Su&glaudintas",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 - GROUPBOX "&Versijos informacija",-1,7,129,234,79 - LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL -END - - -STRINGTABLE -{ - IDS_FONT_SEL_DLG_NAME "Pritaikomos Å¡rifto nuostatos" - IDS_FONT_SEL_ERROR "Klaida parenkant naujÄ… Å¡riftÄ…." -} - -STRINGTABLE -{ - IDS_WINEFILE "Wine failų tvarkytuvÄ—" - IDS_ERROR "Klaida" - IDS_ROOT_FS "Å¡akninÄ— fs" - IDS_UNIXFS "unix fs" - IDS_DESKTOP "Darbalaukis" - IDS_SHELL "Apvalkalas" - IDS_TITLEFMT "%s - %s" - IDS_NO_IMPL "Dar nerealizuota" - IDS_WINE_FILE "Wine failas" -} - -STRINGTABLE -{ - IDS_COL_NAME "Vardas" - IDS_COL_SIZE "Dydis" - IDS_COL_CDATE "KData" - IDS_COL_ADATE "PData" - IDS_COL_MDATE "MData" - IDS_COL_IDX "Indeksas/Inode" - IDS_COL_LINKS "Saitai" - IDS_COL_ATTR "Požymiai" - IDS_COL_SEC "Saugumas" - - IDS_FREE_SPACE_FMT "%s iÅ¡ %s laisva" -} diff --git a/rosapps/applications/winfile/lang/cs-CZ.rc b/rosapps/applications/winfile/lang/cs-CZ.rc index ad718638e69..6d2294a87b5 100644 --- a/rosapps/applications/winfile/lang/cs-CZ.rc +++ b/rosapps/applications/winfile/lang/cs-CZ.rc @@ -23,8 +23,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_CZECH, SUBLANG_DEFAULT /* Czech strings in CP1250 */ diff --git a/rosapps/applications/winfile/lang/da-DK.rc b/rosapps/applications/winfile/lang/da-DK.rc index ffc74156574..babc0dab32d 100644 --- a/rosapps/applications/winfile/lang/da-DK.rc +++ b/rosapps/applications/winfile/lang/da-DK.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_DANISH, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/de-DE.rc b/rosapps/applications/winfile/lang/de-DE.rc index e30c5c18116..ae1a80fc3bf 100644 --- a/rosapps/applications/winfile/lang/de-DE.rc +++ b/rosapps/applications/winfile/lang/de-DE.rc @@ -21,10 +21,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - -#pragma code_page(65001) - LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL /* Menu */ @@ -32,33 +28,33 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDM_WINEFILE MENU FIXED IMPURE { POPUP "&Datei" { - MENUITEM "Ö&ffnen\tEingabetaste", ID_ACTIVATE + MENUITEM "Ö&ffnen\tEingabetaste", ID_ACTIVATE MENUITEM "&Verschieben...\tF7", ID_FILE_MOVE MENUITEM "&Kopieren...\tF8", ID_FILE_COPY MENUITEM "&In Zwischenablage...\tF9", 118 - MENUITEM "&Löschen\tEntf", ID_FILE_DELETE + MENUITEM "&Löschen\tEntf", ID_FILE_DELETE MENUITEM "&Umbenennen...", 109 MENUITEM "&Eigenschaften...\tAlt+Eingabetaste", ID_EDIT_PROPERTIES MENUITEM SEPARATOR MENUITEM "K&omprimieren...", 119 MENUITEM "Deko&mprimieren...", 120 MENUITEM SEPARATOR - MENUITEM "&Ausführen...", ID_EXECUTE + MENUITEM "&Ausführen...", ID_EXECUTE MENUITEM "&Drucken...", 102 MENUITEM "Zuord&nen...", 103 MENUITEM SEPARATOR MENUITEM "Ver&zeichnis erstellen...", 111 MENUITEM "&Suchen...", 104 - MENUITEM "Dateien aus&wählen...", 116 + MENUITEM "Dateien aus&wählen...", 116 MENUITEM SEPARATOR MENUITEM "&Beenden\tAlt+X", ID_FILE_EXIT } - POPUP "Da&tenträger" { - MENUITEM "Datenträger &kopieren...", 201 - MENUITEM "Datenträger &benennen...", 202 + POPUP "Da&tenträger" { + MENUITEM "Datenträger &kopieren...", 201 + MENUITEM "Datenträger &benennen...", 202 MENUITEM SEPARATOR - MENUITEM "Datenträger &formatieren...", ID_FORMAT_DISK + MENUITEM "Datenträger &formatieren...", ID_FORMAT_DISK #ifdef _WIN95 MENUITEM "...", -1 /*TODO*/ #endif @@ -69,12 +65,12 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "F&reigeben als...", 254 MENUITEM "Freigabe been&den...", 255 MENUITEM SEPARATOR - MENUITEM "Laufwerk aus&wählen...", 251 + MENUITEM "Laufwerk aus&wählen...", 251 } POPUP "&Verzeichnisse" { - MENUITEM "&Nächste Ebene einblenden\t+",301 + MENUITEM "&Nächste Ebene einblenden\t+",301 MENUITEM "&Zweig einblenden\t*", 302 MENUITEM "Alle &Ebenen einblenden\tStrg+*",303 MENUITEM "Zweig &ausblenden\t-", 304 @@ -95,14 +91,14 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM SEPARATOR MENUITEM "Nach N&ame", ID_VIEW_SORT_NAME MENUITEM "Nach T&yp", ID_VIEW_SORT_TYPE - MENUITEM "Nach &Größe", ID_VIEW_SORT_SIZE + MENUITEM "Nach &Größe", ID_VIEW_SORT_SIZE MENUITEM "Nach &Datum", ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Angaben ausw&ählen...", ID_VIEW_FILTER + MENUITEM "Angaben ausw&ählen...", ID_VIEW_FILTER } POPUP "&Optionen" { - MENUITEM "&Bestätigen...", 501 + MENUITEM "&Bestätigen...", 501 MENUITEM "Schrift&art...", ID_SELECT_FONT MENUITEM "Symbolleiste &definieren...", 512 MENUITEM SEPARATOR @@ -119,13 +115,13 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Sicherheit" { MENUITEM "&Berechtigungen...", 605 - MENUITEM "Über&wachen...", 606 + MENUITEM "Über&wachen...", 606 MENUITEM "Besi&tzer...", 607 } POPUP "&Fenster" { MENUITEM "Neues &Fenster", ID_WINDOW_NEW - MENUITEM "Über&lappend\tUmschalt+F5", ID_WINDOW_CASCADE + MENUITEM "Über&lappend\tUmschalt+F5", ID_WINDOW_CASCADE MENUITEM "&Untereinander", ID_WINDOW_TILE_HORZ MENUITEM "&Nebeneinander\tUmschalt+F4", ID_WINDOW_TILE_VERT #ifndef _NO_EXTENSIONS @@ -140,14 +136,14 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Suchen...\tF1", ID_HELP MENUITEM "Hilfe &verwenden\tF1", ID_HELP_USING MENUITEM SEPARATOR - MENUITEM "&Info über Winefile...", ID_ABOUT + MENUITEM "&Info über Winefile...", ID_ABOUT } } IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ausführen" +CAPTION "Ausführen" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 @@ -161,7 +157,7 @@ FONT 8, "MS Shell Dlg" IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ziel auswählen" +CAPTION "Ziel auswählen" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 @@ -174,7 +170,7 @@ FONT 8, "MS Shell Dlg" IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Angaben auswählen" +CAPTION "Angaben auswählen" FONT 8, "MS Sans Serif" BEGIN LTEXT "&Name:",-1,7,8,22,10 @@ -196,7 +192,7 @@ END IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Eigenschaften für %s" +CAPTION "Eigenschaften für %s" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,191,7,50,14 @@ -205,16 +201,16 @@ BEGIN EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP LTEXT "&Pfad:",-1,7,18,59,9 EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Letzte &Änderung:",-1,7,29,59,9 + LTEXT "Letzte &Änderung:",-1,7,29,59,9 EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP LTEXT "&Version:",-1,7,40,59,9 EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP LTEXT "&Copyright:",-1,7,51,59,9 EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "&Größe:",-1,7,62,59,9 + LTEXT "&Größe:",-1,7,62,59,9 EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP GROUPBOX "Attribute",-1,7,79,158,46 - CONTROL "&Schreibgeschützt",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 + CONTROL "&Schreibgeschützt",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 CONTROL "&Versteckt",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 CONTROL "&Archiv",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 CONTROL "Sys&tem",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 @@ -228,7 +224,7 @@ END STRINGTABLE { IDS_FONT_SEL_DLG_NAME "Anwenden der Schriftarteinstellung" - IDS_FONT_SEL_ERROR "Fehler während der Schriftart-Auswahl." + IDS_FONT_SEL_ERROR "Fehler während der Schriftart-Auswahl." } STRINGTABLE @@ -247,10 +243,10 @@ STRINGTABLE STRINGTABLE { IDS_COL_NAME "Name" - IDS_COL_SIZE "Größe" + IDS_COL_SIZE "Größe" IDS_COL_CDATE "CDatum" IDS_COL_ADATE "ZDatum" - IDS_COL_MDATE "ÄDatum" + IDS_COL_MDATE "ÄDatum" IDS_COL_IDX "Index/Inode" IDS_COL_LINKS "Links" IDS_COL_ATTR "Attribute" diff --git a/rosapps/applications/winfile/lang/en-US.rc b/rosapps/applications/winfile/lang/en-US.rc index 644cf2ff262..dc0ef28f2a8 100644 --- a/rosapps/applications/winfile/lang/en-US.rc +++ b/rosapps/applications/winfile/lang/en-US.rc @@ -21,8 +21,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/es-ES.rc b/rosapps/applications/winfile/lang/es-ES.rc index 7e445ee309f..fa82f4fd563 100644 --- a/rosapps/applications/winfile/lang/es-ES.rc +++ b/rosapps/applications/winfile/lang/es-ES.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/fr-FR.rc b/rosapps/applications/winfile/lang/fr-FR.rc index 1b39edcefd5..73d7c8e8f12 100644 --- a/rosapps/applications/winfile/lang/fr-FR.rc +++ b/rosapps/applications/winfile/lang/fr-FR.rc @@ -23,11 +23,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - -/* UTF-8 */ -#pragma code_page(65001) - LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL /* Menu */ @@ -35,24 +30,24 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL IDM_WINEFILE MENU FIXED IMPURE { POPUP "&Fichier" { - MENUITEM "&Ouvrir\tEntrée", ID_ACTIVATE - MENUITEM "&Déplacer...\tF7", ID_FILE_MOVE + MENUITEM "&Ouvrir\tEntrée", ID_ACTIVATE + MENUITEM "&Déplacer...\tF7", ID_FILE_MOVE MENUITEM "&Copier...\tF8", ID_FILE_COPY MENUITEM "P&resse-papiers...\tF9", 118 MENUITEM "&Effacer\tSuppr", ID_FILE_DELETE MENUITEM "Re&nommer...", 109 - MENUITEM "&Propriétés...\tAlt+Entrée", ID_EDIT_PROPERTIES + MENUITEM "&Propriétés...\tAlt+Entree", ID_EDIT_PROPERTIES MENUITEM SEPARATOR MENUITEM "Co&mpresser...", 119 - MENUITEM "Décompre&sser...", 120 + MENUITEM "Décompre&sser...", 120 MENUITEM SEPARATOR - MENUITEM "E&xécuter...", ID_EXECUTE + MENUITEM "E&xécuter...", ID_EXECUTE MENUITEM "&Imprimer...", 102 MENUITEM "&Associer...", 103 MENUITEM SEPARATOR - MENUITEM "Créer réper&toire...", 111 + MENUITEM "Créer Réper&toire...", 111 MENUITEM "Rec&hercher...", 104 - MENUITEM "Sélectionner &fichiers...", 116 + MENUITEM "Sélectionner &Fichiers...", 116 MENUITEM SEPARATOR #ifndef _NO_EXTENSIONS MENUITEM "&Quitter\tAlt+X", ID_FILE_EXIT @@ -62,16 +57,16 @@ IDM_WINEFILE MENU FIXED IMPURE } POPUP "&Disque" { - MENUITEM "&Copier disque...", 201 - MENUITEM "&Nommer disque...", 202 + MENUITEM "&Copier Disque...", 201 + MENUITEM "&Nommer Disque...", 202 MENUITEM SEPARATOR - MENUITEM "&Formater disque...", ID_FORMAT_DISK + MENUITEM "&Formater Disque...", ID_FORMAT_DISK #ifdef _WIN95 - MENUITEM "Créer un disque &système...", -1 /*TODO*/ + MENUITEM "Créer un disque &système...", -1 /*TODO*/ #endif MENUITEM SEPARATOR - MENUITEM "Connecter un lecteur &réseau",ID_CONNECT_NETWORK_DRIVE - MENUITEM "&Déconnecter un lecteur réseau",ID_DISCONNECT_NETWORK_DRIVE + MENUITEM "Connecter un lecteur &réseau",ID_CONNECT_NETWORK_DRIVE + MENUITEM "&Déconnecter un lecteur réseau",ID_DISCONNECT_NETWORK_DRIVE MENUITEM SEPARATOR MENUITEM "&Partager...", 254 MENUITEM "Cesser de parta&ger", 255 @@ -79,66 +74,66 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Choisir le &lecteur", 251 } - POPUP "&Répertoires" { - MENUITEM "&Développer un niveau\t+", 301 - MENUITEM "Développer une &branche\t*", 302 - MENUITEM "&Tout développer\tCtrl+*", 303 - MENUITEM "&Réduire une branche\t-", 304 + POPUP "&Répertoires" { + MENUITEM "&Développer un niveau\t+", 301 + MENUITEM "Développer une &branche\t*", 302 + MENUITEM "&Tout développer\tCtrl+*", 303 + MENUITEM "&Réduire une branche\t-", 304 MENUITEM SEPARATOR - MENUITEM "&Marquer l'arborescence", 505 + MENUITEM "&Indiquer l'arborescence", 505 } - POPUP "&Affichage" { - MENUITEM "Ar&bre et répertoire", 413 + POPUP "&Vue" { + MENUITEM "Arbre et ré&pertoire", 413 MENUITEM "&Arbre seulement", 411 - MENUITEM "&Répertoire seulement", 412 + MENUITEM "&Répertoire seulement", 412 MENUITEM SEPARATOR - MENUITEM "&Séparer", ID_VIEW_SPLIT + MENUITEM "&Séparer", ID_VIEW_SPLIT MENUITEM SEPARATOR MENUITEM "&Nom", ID_VIEW_NAME - MENUITEM "Tous &les détails", ID_VIEW_ALL_ATTRIBUTES, CHECKED - MENUITEM "&Détails...", ID_VIEW_SELECTED_ATTRIBUTES + MENUITEM "Tous &les Détails", ID_VIEW_ALL_ATTRIBUTES, CHECKED + MENUITEM "&Détails...", ID_VIEW_SELECTED_ATTRIBUTES MENUITEM SEPARATOR - MENUITEM "Trier par n&om", ID_VIEW_SORT_NAME - MENUITEM "Trier par &type", ID_VIEW_SORT_TYPE - MENUITEM "Trier par ta&ille", ID_VIEW_SORT_SIZE - MENUITEM "Trier par dat&e", ID_VIEW_SORT_DATE + MENUITEM "Trier par N&om", ID_VIEW_SORT_NAME + MENUITEM "Trier par &Type", ID_VIEW_SORT_TYPE + MENUITEM "Trier par Ta&ille", ID_VIEW_SORT_SIZE + MENUITEM "Trier par Dat&e", ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Trier &par...", ID_VIEW_FILTER + MENUITEM "Trier par &...", ID_VIEW_FILTER } POPUP "&Options" { MENUITEM "&Confirmation...", 501 MENUITEM "&Police...", ID_SELECT_FONT - MENUITEM "Personnaliser la &barre d'outils...", 512 + MENUITEM "Personnaliser la &barre d'Outils...", 512 MENUITEM SEPARATOR - MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR, CHECKED - MENUITEM "Barre de &lecteur", ID_VIEW_DRIVE_BAR, CHECKED - MENUITEM "Barre d'&état", ID_VIEW_STATUSBAR, CHECKED + MENUITEM "Barre d'&Outils", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "Barre de &Lecteur", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Barre d'&État", ID_VIEW_STATUSBAR, CHECKED #ifndef _NO_EXTENSIONS - MENUITEM "P&lein écran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "P&lein Écran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN #endif MENUITEM SEPARATOR - MENUITEM "&Réduire à l'utilisation", 504 + MENUITEM "&Réduire a l'utilisation", 504 MENUITEM "&Enregistrer la configuration en quittant",511 } - POPUP "&Sécurité" { - MENUITEM "&Accès...", 605 - MENUITEM "&Journalisation...", 606 - MENUITEM "&Propriétaire...", 607 + POPUP "&Sécurité" { + MENUITEM "&Accès...", 605 + MENUITEM "&Surveillance...", 606 + MENUITEM "&Propriétaire...", 607 } - POPUP "Fe&nêtre" { - MENUITEM "Nouvelle &fenêtre", ID_WINDOW_NEW + POPUP "&Fenêtre" { + MENUITEM "Nouvelle &fenêtre", ID_WINDOW_NEW MENUITEM "&En cascade\tCtrl+F5", ID_WINDOW_CASCADE - MENUITEM "Mosaïque &horizontale", ID_WINDOW_TILE_HORZ - MENUITEM "Mosaïque &verticale\tCtrl+F4",ID_WINDOW_TILE_VERT + MENUITEM "Mosaïque &horizontale", ID_WINDOW_TILE_HORZ + MENUITEM "Mosaïque &verticale\tCtrl+F4",ID_WINDOW_TILE_VERT #ifndef _NO_EXTENSIONS - MENUITEM "Réorganisation aut&omatique", ID_WINDOW_AUTOSORT + MENUITEM "Réorganisation &Automatique", ID_WINDOW_AUTOSORT #endif - MENUITEM "Réorganiser les &icônes", ID_WINDOW_ARRANGE + MENUITEM "Réorganiser les &icônes", ID_WINDOW_ARRANGE MENUITEM "&Actualiser\tF5", ID_REFRESH } @@ -147,20 +142,20 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Rechercher dans l'aide\tF1", ID_HELP MENUITEM "&Utiliser l'aide\tF1", ID_HELP_USING MENUITEM SEPARATOR - MENUITEM "À &propos de Winefile", ID_ABOUT + MENUITEM "À &propos de Winefile", ID_ABOUT } } IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Exécuter" +CAPTION "Exécuter" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Commande :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + CONTROL "&Commande :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL - CONTROL "Sous forme d'icône", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 75, 12 + CONTROL "Sous forme d'icône", 214, "Button", BS_AUTOCHECKBOX|WS_TABSTOP,3, 45, 71, 12 DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 PUSHBUTTON "Annuler", 2, 158, 23, 47, 14 PUSHBUTTON "Aid&e", 254, 158, 43, 47, 14 @@ -168,65 +163,65 @@ FONT 8, "MS Shell Dlg" IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Sélectionner la destination" +CAPTION "Sélectionner la destination" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Chemin :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + CONTROL "&Chemin :", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 PUSHBUTTON "Annuler", 2, 158, 23, 47, 14 PUSHBUTTON "&Parcourir...", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 100 +IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Par type de fichier" FONT 8, "MS Sans Serif" BEGIN - LTEXT "&Nom :",-1,7,8,22,10 + LTEXT "&Nom :",-1,7,8,22,10 EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL - GROUPBOX "Type de fichier ",-1,7,23,87,59 - CONTROL "&Répertoires",IDC_VIEW_TYPE_DIRECTORIES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,34,70,10 + GROUPBOX "Type de fichier",-1,7,23,87,56 + CONTROL "&Répertoires",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 CONTROL "&Programmes",IDC_VIEW_TYPE_PROGRAMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,45,70,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 CONTROL "Docu&ments",IDC_VIEW_TYPE_DOCUMENTS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,56,70,10 + BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 CONTROL "&Autres fichiers",IDC_VIEW_TYPE_OTHERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,67,70,10 - CONTROL "Montrer les fichiers cachés/&système",IDC_VIEW_TYPE_HIDDEN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,86,130,9 + BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 + CONTROL "Montrer les fichiers cachés/&système",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 DEFPUSHBUTTON "OK",IDOK,104,7,50,14 PUSHBUTTON "Annuler",IDCANCEL,104,24,50,14 END IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Propriétés de %s" +CAPTION "Propriétés de %s" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,191,7,50,14 - PUSHBUTTON "Annuler",IDCANCEL,191,25,50,14 - LTEXT "Nom du &fichier :",-1,7,7,59,9 + PUSHBUTTON "Annuler",IDCANCEL,191,29,50,14 + LTEXT "Nom du &fichier :",-1,7,7,59,9 EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Chemin com&plet :",-1,7,18,59,9 + LTEXT "Chemin com&plet :",-1,7,18,59,9 EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Modification :",-1,7,29,59,9 + LTEXT "Modification :",-1,7,29,59,9 EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Version :",-1,7,40,59,9 + LTEXT "Version :",-1,7,40,59,9 EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Cop&yright :",-1,7,51,59,9 + LTEXT "Cop&yright :",-1,7,51,59,9 EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Taille :",-1,7,62,59,9 + LTEXT "Taille :",-1,7,62,59,9 EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP GROUPBOX "Attributs",-1,7,79,158,46 CONTROL "Lectu&re seule",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 - CONTROL "Cac&hé",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 + CONTROL "Cac&hé",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 CONTROL "&Archive",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 - CONTROL "&Système",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 - CONTROL "&Compressé",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 - GROUPBOX "&Informations de version",-1,7,129,234,79 + CONTROL "&Système",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 + CONTROL "&Compressé",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 + GROUPBOX "&Version Information",-1,7,129,234,79 LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL END @@ -234,8 +229,8 @@ END STRINGTABLE { - IDS_FONT_SEL_DLG_NAME "Application des réglages des polices" - IDS_FONT_SEL_ERROR "Erreur lors de la sélection de la nouvelle police." + IDS_FONT_SEL_DLG_NAME "Appliquer les réglages des fontes" + IDS_FONT_SEL_ERROR "Erreur dans la sélection de la nouvelle fonte." } STRINGTABLE @@ -247,7 +242,7 @@ STRINGTABLE IDS_DESKTOP "Bureau" IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" - IDS_NO_IMPL "Pas encore implémenté" + IDS_NO_IMPL "Pas encore implémenté" IDS_WINE_FILE "Wine File" } @@ -255,13 +250,13 @@ STRINGTABLE { IDS_COL_NAME "Nom" IDS_COL_SIZE "Taille" - IDS_COL_CDATE "Dernier changement de statut (ctime)" - IDS_COL_ADATE "Dernier accès" - IDS_COL_MDATE "Dernière modification" + IDS_COL_CDATE "CDate" + IDS_COL_ADATE "ADate" + IDS_COL_MDATE "MDate" IDS_COL_IDX "Index/Inode" IDS_COL_LINKS "Liens" IDS_COL_ATTR "Attributs" - IDS_COL_SEC "Sécurité" + IDS_COL_SEC "Sécurité" IDS_FREE_SPACE_FMT "%s sur %s libre" } diff --git a/rosapps/applications/winfile/lang/hu-HU.rc b/rosapps/applications/winfile/lang/hu-HU.rc index f7ca49a2bbe..f73f376d875 100644 --- a/rosapps/applications/winfile/lang/hu-HU.rc +++ b/rosapps/applications/winfile/lang/hu-HU.rc @@ -22,8 +22,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/it-IT.rc b/rosapps/applications/winfile/lang/it-IT.rc index bfbf6f12f57..832d422742b 100644 --- a/rosapps/applications/winfile/lang/it-IT.rc +++ b/rosapps/applications/winfile/lang/it-IT.rc @@ -22,8 +22,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/ja-JP.rc b/rosapps/applications/winfile/lang/ja-JP.rc index b73486a5dd0..cd68b65a034 100644 --- a/rosapps/applications/winfile/lang/ja-JP.rc +++ b/rosapps/applications/winfile/lang/ja-JP.rc @@ -21,8 +21,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - /* UTF-8 */ #pragma code_page(65001) @@ -263,3 +261,5 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s of %s free" } + +#pragma code_page(default) diff --git a/rosapps/applications/winfile/lang/ko-KR.rc b/rosapps/applications/winfile/lang/ko-KR.rc index 0a6207a52ca..02821d068da 100644 --- a/rosapps/applications/winfile/lang/ko-KR.rc +++ b/rosapps/applications/winfile/lang/ko-KR.rc @@ -22,8 +22,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/nl-NL.rc b/rosapps/applications/winfile/lang/nl-NL.rc index 8f6f7f16825..06eef8e347b 100644 --- a/rosapps/applications/winfile/lang/nl-NL.rc +++ b/rosapps/applications/winfile/lang/nl-NL.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/no-NO.rc b/rosapps/applications/winfile/lang/no-NO.rc index eec8b82c8f5..04f8509ad84 100644 --- a/rosapps/applications/winfile/lang/no-NO.rc +++ b/rosapps/applications/winfile/lang/no-NO.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/pl-PL.rc b/rosapps/applications/winfile/lang/pl-PL.rc index 50247e3181a..31316172f55 100644 --- a/rosapps/applications/winfile/lang/pl-PL.rc +++ b/rosapps/applications/winfile/lang/pl-PL.rc @@ -22,8 +22,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_POLISH, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/pt-BR.rc b/rosapps/applications/winfile/lang/pt-BR.rc index 5bf0c6b668d..d23038dabeb 100644 --- a/rosapps/applications/winfile/lang/pt-BR.rc +++ b/rosapps/applications/winfile/lang/pt-BR.rc @@ -3,7 +3,7 @@ * Portuguese Language Support * * Copyright 2003 Marcelo Duarte - * Copyright 2004,2007 Américo José Melo + * Copyright 2004,2007 Américo José Melo * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,9 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - -#pragma code_page(65001) /* Menu */ @@ -75,18 +72,18 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Selecionar &unidade...", 251 } - POPUP "Ã&rvore" { - MENUITEM "&Próximo nível\t+", 301 + POPUP "Á&rvore" { + MENUITEM "&Próximo nível\t+", 301 MENUITEM "Expandi&r pasta\t*", 302 MENUITEM "Expandir &tudo\tStrg+*", 303 MENUITEM "Recolher p&asta\t-", 304 MENUITEM SEPARATOR - MENUITEM "&Indicar subníveis", 505 + MENUITEM "&Indicar subníveis", 505 } POPUP "&Exibir" { - MENUITEM "Ã&rvore e pasta", 413 - MENUITEM "S&omente árvore", 411 + MENUITEM "Á&rvore e pasta", 413 + MENUITEM "S&omente árvore", 411 MENUITEM "So&mente pasta", 412 MENUITEM SEPARATOR MENUITEM "&Dividir", ID_VIEW_SPLIT @@ -103,8 +100,8 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Classificar &por...", ID_VIEW_FILTER } - POPUP "&Opções" { - MENUITEM "&Confirmação...", 501 + POPUP "&Opções" { + MENUITEM "&Confirmação...", 501 MENUITEM "&Fonte...", ID_SELECT_FONT MENUITEM "&Personalizar barra de ferramentas...", 512 MENUITEM SEPARATOR @@ -116,11 +113,11 @@ IDM_WINEFILE MENU FIXED IMPURE #endif MENUITEM SEPARATOR MENUITEM "&Minimizar durante o uso", 504 - MENUITEM "&Salvar configurações ao sair",511 + MENUITEM "&Salvar configurações ao sair",511 } - POPUP "&Segurança" { + POPUP "&Segurança" { MENUITEM "&Acesso...", 605 MENUITEM "&Logging...", 606 MENUITEM "&Owner...", 607 @@ -134,12 +131,12 @@ IDM_WINEFILE MENU FIXED IMPURE #ifndef _NO_EXTENSIONS MENUITEM "Organizar automaticamente", ID_WINDOW_AUTOSORT #endif - MENUITEM "&Organizar ícones", ID_WINDOW_ARRANGE + MENUITEM "&Organizar ícones", ID_WINDOW_ARRANGE MENUITEM "&Atualizar\tF5", ID_REFRESH } POPUP "Aj&uda" { - MENUITEM "&Tópicos da ajuda\tF1", ID_HELP + MENUITEM "&Tópicos da ajuda\tF1", ID_HELP MENUITEM "Pesquisar...", ID_HELP MENUITEM "&Usando a ajuda", ID_HELP_USING MENUITEM SEPARATOR @@ -155,7 +152,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "A&brir\tEnter", ID_ACTIVATE MENUITEM "&Mover...\tF7", ID_FILE_MOVE MENUITEM "&Copiar...\tF8", ID_FILE_COPY - MENUITEM "&Na Area de Transferência...\tF9", 118 + MENUITEM "&Na Area de Transferência...\tF9", 118 MENUITEM "E&xcluir\tDel", ID_FILE_DELETE MENUITEM "Re&nomear...", 109 MENUITEM "&Propriedades...\tAlt+Enter", ID_EDIT_PROPERTIES @@ -196,18 +193,18 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Seleccionar &unidade...", 251 } - POPUP "Ã&rvore" { - MENUITEM "&Próximo nível\t+", 301 + POPUP "Á&rvore" { + MENUITEM "&Próximo nível\t+", 301 MENUITEM "Expandi&r pasta\t*", 302 MENUITEM "Expandir &tudo\tStrg+*", 303 MENUITEM "Recolher p&asta\t-", 304 MENUITEM SEPARATOR - MENUITEM "&Indicar subníveis", 505 + MENUITEM "&Indicar subníveis", 505 } POPUP "&Exibir" { - MENUITEM "Ã&rvore e pasta", 413 - MENUITEM "A&penas árvore", 411 + MENUITEM "Á&rvore e pasta", 413 + MENUITEM "A&penas árvore", 411 MENUITEM "Ap&enas pasta", 412 MENUITEM SEPARATOR MENUITEM "&Dividir", ID_VIEW_SPLIT @@ -224,8 +221,8 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Classificar &por...", ID_VIEW_FILTER } - POPUP "&Opções" { - MENUITEM "&Confirmação...", 501 + POPUP "&Opções" { + MENUITEM "&Confirmação...", 501 MENUITEM "&Tipo de Letra...", ID_SELECT_FONT MENUITEM "&Personalizar barra de ferramentas...", 512 MENUITEM SEPARATOR @@ -233,17 +230,17 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Barra de unidades", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "B&arra de e&stado", ID_VIEW_STATUSBAR, CHECKED #ifndef _NO_EXTENSIONS - MENUITEM "Ecrã Completo\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "Ecrã Completo\tCtrl+Shift+S", ID_VIEW_FULLSCREEN #endif MENUITEM SEPARATOR MENUITEM "&Minimizar durante o uso", 504 - MENUITEM "&Gravar configurações ao sair",511 + MENUITEM "&Gravar configurações ao sair",511 } - POPUP "&Segurança" { + POPUP "&Segurança" { MENUITEM "&Acesso...", 605 - MENUITEM "&Autenticação...", 606 + MENUITEM "&Autenticação...", 606 MENUITEM "&Dono...", 607 } @@ -255,12 +252,12 @@ IDM_WINEFILE MENU FIXED IMPURE #ifndef _NO_EXTENSIONS MENUITEM "Organizar automaticamente", ID_WINDOW_AUTOSORT #endif - MENUITEM "&Organizar ícones", ID_WINDOW_ARRANGE + MENUITEM "&Organizar ícones", ID_WINDOW_ARRANGE MENUITEM "&Actualizar\tF5", ID_REFRESH } POPUP "Aj&uda" { - MENUITEM "&Tópicos da ajuda\tF1", ID_HELP + MENUITEM "&Tópicos da ajuda\tF1", ID_HELP MENUITEM "Pesquisar...", ID_HELP MENUITEM "&Usar a ajuda", ID_HELP_USING MENUITEM SEPARATOR @@ -305,74 +302,23 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE IDD_SELECT_DESTINATION DIALOG FIXED IMPURE 15, 13, 210, 63 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Seleccionar destino" +CAPTION "Selecionar destino" FONT 8, "MS Shell Dlg" { CONTROL "", 101, "Static", SS_SIMPLE|SS_NOPREFIX, 3, 6, 162, 10 - CONTROL "&Localização:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 + CONTROL "&Localização:", -1, "Static", SS_LEFTNOWORDWRAP|WS_GROUP, 3, 18, 60, 10 EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL DEFPUSHBUTTON "OK", 1, 158, 6, 47, 14 PUSHBUTTON "Cancelar", 2, 158, 23, 47, 14 PUSHBUTTON "&Procurar", 254, 158, 43, 47, 14 } -IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Por tipo de ficheiro" -FONT 8, "MS Sans Serif" -BEGIN - LTEXT "&Nome:",-1,7,8,22,10 - EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL - GROUPBOX "Tipo de ficheiro",-1,7,23,87,56 - CONTROL "&Directórios",IDC_VIEW_TYPE_DIRECTORIES,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 - CONTROL "&Programas",IDC_VIEW_TYPE_PROGRAMS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 - CONTROL "Docu&mentos",IDC_VIEW_TYPE_DOCUMENTS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 - CONTROL "&Outros ficheiros",IDC_VIEW_TYPE_OTHERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 - CONTROL "&Mostrar ficheiros ocultos/sistema",IDC_VIEW_TYPE_HIDDEN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 - DEFPUSHBUTTON "OK",IDOK,104,7,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,104,24,50,14 -END - -IDD_DIALOG_PROPERTIES DIALOG DISCARDABLE 0, 0, 248, 215 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Propriedades de %s" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,191,7,50,14 - PUSHBUTTON "Cancelar",IDCANCEL,191,29,50,14 - LTEXT "&Nome do ficheiro:",-1,7,7,59,9 - EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "&Localização Completa:",-1,7,18,59,9 - EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Última alteração:",-1,7,29,59,9 - EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Versão:",-1,7,40,59,9 - EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Direitos de autor:",-1,7,51,59,9 - EDITTEXT IDC_STATIC_PROP_COPYRIGHT,71,51,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Tamanho:",-1,7,62,59,9 - EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - GROUPBOX "Atributos",-1,7,79,158,46 - CONTROL "&Apenas de leitura",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 - CONTROL "&Ocultos",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 - CONTROL "&Arquivos",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 - CONTROL "&Sistema",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 - CONTROL "&Comprimidos",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 - GROUPBOX "&Informação de versão",-1,7,129,234,79 - LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL -END LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN STRINGTABLE { - IDS_FONT_SEL_DLG_NAME "Aplicando configurações de fonte" + IDS_FONT_SEL_DLG_NAME "Aplicando configurações de fonte" IDS_FONT_SEL_ERROR "Erro enquanto seleciona nova fonte." } @@ -380,7 +326,7 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE STRINGTABLE { - IDS_FONT_SEL_DLG_NAME "A aplicar configurações do tipo de letra" + IDS_FONT_SEL_DLG_NAME "A aplicar configurações do tipo de letra" IDS_FONT_SEL_ERROR "Erro ao seleccionar novo tipo de letra." } @@ -393,11 +339,17 @@ STRINGTABLE IDS_ERROR "Erro" IDS_ROOT_FS "root fs" IDS_UNIXFS "unixfs" - IDS_DESKTOP "Ãrea de trabalho" + IDS_DESKTOP "Área de trabalho" IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" - IDS_NO_IMPL "Ainda não implementado" + IDS_NO_IMPL "Ainda não implementado" IDS_WINE_FILE "Wine File" + IDS_COL_NAME "Nome" + IDS_COL_SIZE "Tamanho" + IDS_COL_CDATE "CData" + IDS_COL_ADATE "AData" + IDS_COL_MDATE "MData" + IDS_COL_IDX "Índice/Inode" } LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE @@ -408,26 +360,26 @@ STRINGTABLE IDS_ERROR "Erro" IDS_ROOT_FS "root fs" IDS_UNIXFS "unixfs" - IDS_DESKTOP "Ecrã" + IDS_DESKTOP "Ecrã" IDS_SHELL "Linha de Comandos" IDS_TITLEFMT "%s - %s" - IDS_NO_IMPL "Ainda não implementado" + IDS_NO_IMPL "Ainda não implementado" IDS_WINE_FILE "Ficheiro Wine" + IDS_COL_NAME "Nome" + IDS_COL_SIZE "Tamanho" + IDS_COL_CDATE "CData" + IDS_COL_ADATE "AData" + IDS_COL_MDATE "MData" + IDS_COL_IDX "Índice/Inode" } LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL STRINGTABLE { - IDS_COL_NAME "Nome" - IDS_COL_SIZE "Tamanho" - IDS_COL_CDATE "CData" - IDS_COL_ADATE "AData" - IDS_COL_MDATE "MData" - IDS_COL_IDX "Ãndice/Inode" - IDS_COL_LINKS "Ligações" + IDS_COL_LINKS "Ligações" IDS_COL_ATTR "Atributos" - IDS_COL_SEC "Segurança" + IDS_COL_SEC "Segurança" - IDS_FREE_SPACE_FMT "%s de %s livre" + IDS_FREE_SPACE_FMT "%s of %s free" } diff --git a/rosapps/applications/winfile/lang/ru-RU.rc b/rosapps/applications/winfile/lang/ru-RU.rc index ef8c657f63b..dd07152b491 100644 --- a/rosapps/applications/winfile/lang/ru-RU.rc +++ b/rosapps/applications/winfile/lang/ru-RU.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/sl-SI.rc b/rosapps/applications/winfile/lang/sl-SI.rc index 2010f5912aa..5aa006d9f40 100644 --- a/rosapps/applications/winfile/lang/sl-SI.rc +++ b/rosapps/applications/winfile/lang/sl-SI.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - #pragma code_page(65001) LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT @@ -260,3 +258,5 @@ STRINGTABLE IDS_FREE_SPACE_FMT "Prosto: %s od %s" } + +#pragma code_page(default) diff --git a/rosapps/applications/winfile/lang/sv-SE.rc b/rosapps/applications/winfile/lang/sv-SE.rc index 4deddd953a0..6905c5e0713 100644 --- a/rosapps/applications/winfile/lang/sv-SE.rc +++ b/rosapps/applications/winfile/lang/sv-SE.rc @@ -21,8 +21,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL /* Menu */ diff --git a/rosapps/applications/winfile/lang/tr-TR.rc b/rosapps/applications/winfile/lang/tr-TR.rc index 8735264ceb8..3a75a7e001f 100644 --- a/rosapps/applications/winfile/lang/tr-TR.rc +++ b/rosapps/applications/winfile/lang/tr-TR.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT /* Menu */ diff --git a/rosapps/applications/winfile/lang/zh-CN.rc b/rosapps/applications/winfile/lang/zh-CN.rc index 8eb3300cc3f..aba7221c19d 100644 --- a/rosapps/applications/winfile/lang/zh-CN.rc +++ b/rosapps/applications/winfile/lang/zh-CN.rc @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "resource.h" - /* Chinese text is encoded in UTF-8 */ #pragma code_page(65001) @@ -300,3 +298,5 @@ FONT 9, "MS Shell Dlg" PUSHBUTTON "å–æ¶ˆ", 2, 158, 23, 47, 14 PUSHBUTTON "幫助(&H)", 254, 158, 43, 47, 14 } + +#pragma code_page(default) diff --git a/rosapps/applications/winfile/resource.h b/rosapps/applications/winfile/resource.h index 7c14871d31c..1e843e52b39 100644 --- a/rosapps/applications/winfile/resource.h +++ b/rosapps/applications/winfile/resource.h @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include /* images */ From 6488e69c4a093b7f5c5f5925b5d9b3c681490afd Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Fri, 10 Jul 2009 17:25:11 +0000 Subject: [PATCH 301/577] Revert the sync, it breaks build. further investigation will be made next week. 2/2 Sry for the 4 stolen rev numbers ;-) svn path=/trunk/; revision=41850 --- .../base/applications/cmdutils/xcopy/Da.rc | 1 - .../base/applications/cmdutils/xcopy/De.rc | 27 +- .../base/applications/cmdutils/xcopy/En.rc | 1 - .../base/applications/cmdutils/xcopy/Fr.rc | 31 ++- .../base/applications/cmdutils/xcopy/Ko.rc | 1 - .../base/applications/cmdutils/xcopy/Nl.rc | 1 - .../base/applications/cmdutils/xcopy/No.rc | 1 - .../base/applications/cmdutils/xcopy/Pl.rc | 1 - .../base/applications/cmdutils/xcopy/Pt.rc | 1 - .../base/applications/cmdutils/xcopy/Ru.rc | 1 - .../base/applications/cmdutils/xcopy/Si.rc | 4 +- .../base/applications/cmdutils/xcopy/xcopy.h | 2 - reactos/base/applications/winhlp32/lang/Lt.rc | 131 --------- .../base/applications/winhlp32/lang/bg-BG.rc | 2 - .../base/applications/winhlp32/lang/cs-CZ.rc | 2 - .../base/applications/winhlp32/lang/da-DK.rc | 2 - .../base/applications/winhlp32/lang/de-DE.rc | 14 +- .../base/applications/winhlp32/lang/en-US.rc | 70 ----- .../base/applications/winhlp32/lang/es-ES.rc | 2 - .../base/applications/winhlp32/lang/fi-FI.rc | 2 - .../base/applications/winhlp32/lang/fr-FR.rc | 37 ++- .../base/applications/winhlp32/lang/hu-HU.rc | 2 - .../base/applications/winhlp32/lang/it-IT.rc | 2 - .../base/applications/winhlp32/lang/ja-JP.rc | 4 +- .../base/applications/winhlp32/lang/ko-KR.rc | 2 - .../base/applications/winhlp32/lang/nl-NL.rc | 48 ++-- .../base/applications/winhlp32/lang/no-NO.rc | 2 - .../base/applications/winhlp32/lang/pl-PL.rc | 2 - .../base/applications/winhlp32/lang/pt-BR.rc | 2 - .../base/applications/winhlp32/lang/rm-CH.rc | 2 - .../base/applications/winhlp32/lang/ru-RU.rc | 2 - .../base/applications/winhlp32/lang/sk-SK.rc | 2 - .../base/applications/winhlp32/lang/sl-SI.rc | 4 +- .../base/applications/winhlp32/lang/sv-SE.rc | 2 - .../base/applications/winhlp32/lang/tr-TR.rc | 2 - .../base/applications/winhlp32/lang/zh-CN.rc | 4 +- reactos/base/applications/winhlp32/lex.yy.c | 40 +-- reactos/base/applications/winhlp32/winhelp.c | 2 +- .../base/applications/winhlp32/winhelp_res.h | 3 - reactos/base/applications/wordpad/Da.rc | 2 - reactos/base/applications/wordpad/De.rc | 4 +- reactos/base/applications/wordpad/En.rc | 11 - reactos/base/applications/wordpad/Fr.rc | 103 ++++---- reactos/base/applications/wordpad/Hu.rc | 2 - reactos/base/applications/wordpad/Ja.rc | 6 +- reactos/base/applications/wordpad/Ko.rc | 1 - reactos/base/applications/wordpad/Lt.rc | 249 ------------------ reactos/base/applications/wordpad/Nl.rc | 2 - reactos/base/applications/wordpad/No.rc | 48 ++-- reactos/base/applications/wordpad/Pl.rc | 2 - reactos/base/applications/wordpad/Pt.rc | 2 - reactos/base/applications/wordpad/Ru.rc | 2 - reactos/base/applications/wordpad/Si.rc | 4 +- reactos/base/applications/wordpad/Sv.rc | 4 +- reactos/base/applications/wordpad/Tr.rc | 2 - reactos/base/applications/wordpad/Zh.rc | 4 +- reactos/base/applications/wordpad/rsrc.rc | 20 ++ reactos/base/applications/wordpad/wordpad.h | 3 - 58 files changed, 199 insertions(+), 733 deletions(-) delete mode 100644 reactos/base/applications/winhlp32/lang/Lt.rc delete mode 100644 reactos/base/applications/wordpad/Lt.rc diff --git a/reactos/base/applications/cmdutils/xcopy/Da.rc b/reactos/base/applications/cmdutils/xcopy/Da.rc index 6a15a4440b2..239b3a71d63 100644 --- a/reactos/base/applications/cmdutils/xcopy/Da.rc +++ b/reactos/base/applications/cmdutils/xcopy/Da.rc @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" LANGUAGE LANG_DANISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/De.rc b/reactos/base/applications/cmdutils/xcopy/De.rc index c13addfdaaa..1af64183b49 100644 --- a/reactos/base/applications/cmdutils/xcopy/De.rc +++ b/reactos/base/applications/cmdutils/xcopy/De.rc @@ -20,9 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" - -#pragma code_page(65001) LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL @@ -30,16 +27,16 @@ STRINGTABLE { STRING_INVPARMS, "Falsche Parameteranzahl - xcopy /? zeigt Hilfe an\n" STRING_INVPARM, "Unbekannter Parameter '%s' - xcopy /? zeigt Hilfe an\n" - STRING_PAUSE, "Eingabetaste betätigen, um mit dem Kopieren zu beginnen\n" - STRING_SIMCOPY, "%d Datei(en) würden kopiert\n" + STRING_PAUSE, "Eingabetaste betätigen, um mit dem Kopieren zu beginnen\n" + STRING_SIMCOPY, "%d Datei(en) würden kopiert\n" STRING_COPY, "%d Datei(en) kopiert\n" STRING_QISDIR, "Ist '%s' eine Datei oder ein Verzeichnis\n" \ "am Zielsort?\n" \ "(D - Datei, V - Verzeichnis)\n" STRING_SRCPROMPT,"%s? (Ja|Nein)\n" - STRING_OVERWRITE,"%s überschreiben? (Ja|Nein|Alle)\n" + STRING_OVERWRITE,"%s überschreiben? (Ja|Nein|Alle)\n" STRING_COPYFAIL, "Kopieren von '%s' nach '%s' fehlgeschlagen. Fehlernummer: %d\n" - STRING_OPENFAIL, "Fehler beim Öffnen von '%s'\n" + STRING_OPENFAIL, "Fehler beim Öffnen von '%s'\n" STRING_READFAIL, "Fehler beim Lesen von '%s'\n" STRING_YES_CHAR, "J" STRING_NO_CHAR, "N" @@ -61,20 +58,20 @@ Mit:\n\ [/S] Kopiere Verzeichnisse und Unterverzeichnisse\n\ [/E] Kopiere Verzeichnisse und Unterverzeichnisse, auch leere\n\ [/Q] Zeige die Dateinamen beim Kopieren nicht an\n\ -[/F] Zeige vollständige Dateinamen von Quelle und Ziel an\n\ -[/L] Simulation: Zeige die Namen der Datein, die kopiert würden\n\ -[/W] Wartet vor Beginn des Kopierens auf Bestätigung\n\ +[/F] Zeige vollständige Dateinamen von Quelle und Ziel an\n\ +[/L] Simulation: Zeige die Namen der Datein, die kopiert würden\n\ +[/W] Wartet vor Beginn des Kopierens auf Bestätigung\n\ [/T] Erzeuge eine leere Verzeichnisstruktur, ohne Dateien zu kopieren\n\ -[/Y] Keine Nachfrage vor dem Überschreiben von Dateien\n\ -[/-Y] Nachrage vor dem Überschreiben von Dateien\n\ -[/P] Fragt für jede Quelldatei, ob sie kopiert werden soll\n\ +[/Y] Keine Nachfrage vor dem Überschreiben von Dateien\n\ +[/-Y] Nachrage vor dem Überschreiben von Dateien\n\ +[/P] Fragt für jede Quelldatei, ob sie kopiert werden soll\n\ [/N] Kopiert die Dateien unter ihrem Kurznamen\n\ [/U] Kopiert nur Dateien, die am Ziel bereits existieren\n\ -[/R] Überschreibt schreibgeschützte Dateien\n\ +[/R] Überschreibt schreibgeschützte Dateien\n\ [/H] Kopiere auch versteckte und Systemdateien\n\ [/C] Nach Fehlern den Kopiervorgang fortsetzen\n\ [/A] Nur Dateien mit Archivbit kopieren\n\ -[/M] Nur Dateien mit Archivbit kopieren, danach Archivbit löschen\n\ +[/M] Nur Dateien mit Archivbit kopieren, danach Archivbit löschen\n\ [/D | /D:m-d-y] Kopiere neue Dateien und Dateien, die neuer als das\n\ \t\tangegebene Datum sind. Wird kein Datum angegegebn, werden nur\n\ \t\tQuelldateien kopiert, die neuer sind als die Zieldatei\n\n" diff --git a/reactos/base/applications/cmdutils/xcopy/En.rc b/reactos/base/applications/cmdutils/xcopy/En.rc index 83ef291c9df..33324ac9f4e 100644 --- a/reactos/base/applications/cmdutils/xcopy/En.rc +++ b/reactos/base/applications/cmdutils/xcopy/En.rc @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/Fr.rc b/reactos/base/applications/cmdutils/xcopy/Fr.rc index 047b4b3f739..7fe8f691cb4 100644 --- a/reactos/base/applications/cmdutils/xcopy/Fr.rc +++ b/reactos/base/applications/cmdutils/xcopy/Fr.rc @@ -18,9 +18,6 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ - -#include "xcopy.h" - #pragma code_page(65001) @@ -33,12 +30,12 @@ STRINGTABLE STRING_PAUSE, "Appuyez sur ENTRÉE pour démarrer la copie\n" STRING_SIMCOPY, "%d fichier(s) seront copiés\n" STRING_COPY, "%d fichier(s) copiés\n" - STRING_QISDIR, "« %s » est-il un fichier ou un répertoire\n" \ + STRING_QISDIR, "Est-ce que « %s » est un fichier ou un répertoire\n" \ "dans la destination ?\n" \ "(F - Fichier, R - Répertoire)\n" STRING_SRCPROMPT,"%s ? (Oui|Non)\n" STRING_OVERWRITE,"Écraser %s ? (Oui|Non|Tous)\n" - STRING_COPYFAIL, "La copie de « %s » vers « %s » a échoué avec le code de retour %d\n" + STRING_COPYFAIL, "La copie de « %s » vers « %s » a échoué avec le c/r %d\n" STRING_OPENFAIL, "Impossible d'ouvrir « %s »\n" STRING_READFAIL, "Impossible de lire « %s »\n" STRING_YES_CHAR, "O" @@ -48,36 +45,38 @@ STRINGTABLE STRING_DIR_CHAR, "R" STRING_HELP, -"XCOPY - Copie les fichiers ou répertoires sources vers une destination\n\ +"XCOPY - Copie les fichiers ou répertoires source vers une destination\n\ \n\ Syntaxe :\n\ -XCOPY source [destination] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ \t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ \n\ -où :\n\ +Où :\n\ \n\ [/I] Suppose que la destination est un répertoire si elle n'existe pas et que l'on copie plus\n\ \td'un fichier\n\ [/S] Copie les répertoires et sous-répertoires\n\ [/E] Copie les répertoires et sous-répertoires, y compris ceux qui sont vides\n\ [/Q] Ne pas afficher la liste des fichiers copiés (mode silencieux)\n\ -[/F] Afficher les source et destination complètes lors de la copie\n\ -[/L] Simuler la copie, en montrant le nom des fichiers qui seraient copiés\n\ +[/F] Afficher la source et la destination complète lors de la copie\n\ +[/L] Simuler l'opération, en montrant le nom des fichiers qui auraient été copiés\n\ [/W] Demande avant de démarrer la copie\n\ -[/T] Créer une structure de répertoires vides, mais ne pas copier les fichiers\n\ +[/T] Créer une structure de répertoires vides, mais ne copie pas les fichiers\n\ [/Y] Ne demande pas de confirmation lors de l'écrasement des fichiers\n\ [/-Y] Demande une confirmation lors de l'écrasement des fichiers\n\ -[/P] Interroge l'utilisateur avant de copier chaque fichier source\n\ -[/N] Copie en utilisant les noms courts\n\ +[/P] Demande avant de copier chaque fichier source\n\ +[/N] Copie en utilisant des noms courts\n\ [/U] Copie uniquement les fichiers qui existent déjà dans la destination\n\ [/R] Écrase même les fichiers en lecture seule\n\ [/H] Inclure les fichiers cachés et système dans la copie\n\ [/C] Continue même si une erreur survient pendant la copie\n\ [/A] Copie uniquement les fichiers qui ont l'attribut archive défini\n\ -[/M] Copie uniquement les fichiers qui ont l'attribut archive défini ; supprime\n\ +[/M] Copie uniquement les fichiers qui ont l'attribut archive défini, supprime\n\ \tensuite l'attribut\n\ -[/D | /D:m-d-y] Copie uniquement les nouveaux fichiers, ou ceux modifiés après la date spécifiée.\n\ -\t\tSi aucune date n'est spécifiée, copie uniquement lorsque le fichier de destination est plus ancien\n\ +[/D | /D:m-d-y] Copie uniquement les fichiers nouveaux ou ceux modifiés après la date spécifiée.\n\ +\t\tSi aucune date n'est spécifiée, copie uniquement lorsque le fichier de destination est plus vieux\n\ \t\tque le fichier source\n\n" } + +#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Ko.rc b/reactos/base/applications/cmdutils/xcopy/Ko.rc index 6a5071cae86..a3a89f99e24 100644 --- a/reactos/base/applications/cmdutils/xcopy/Ko.rc +++ b/reactos/base/applications/cmdutils/xcopy/Ko.rc @@ -20,7 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/Nl.rc b/reactos/base/applications/cmdutils/xcopy/Nl.rc index b9db305843f..f994cdd8f7e 100644 --- a/reactos/base/applications/cmdutils/xcopy/Nl.rc +++ b/reactos/base/applications/cmdutils/xcopy/Nl.rc @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/cmdutils/xcopy/No.rc b/reactos/base/applications/cmdutils/xcopy/No.rc index a3c223fc1e2..ddcccf78fef 100644 --- a/reactos/base/applications/cmdutils/xcopy/No.rc +++ b/reactos/base/applications/cmdutils/xcopy/No.rc @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL diff --git a/reactos/base/applications/cmdutils/xcopy/Pl.rc b/reactos/base/applications/cmdutils/xcopy/Pl.rc index 8b224eccfd6..3d094a933ed 100644 --- a/reactos/base/applications/cmdutils/xcopy/Pl.rc +++ b/reactos/base/applications/cmdutils/xcopy/Pl.rc @@ -20,7 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" LANGUAGE LANG_POLISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/Pt.rc b/reactos/base/applications/cmdutils/xcopy/Pt.rc index d8254d5e1fb..47e9609bd7f 100644 --- a/reactos/base/applications/cmdutils/xcopy/Pt.rc +++ b/reactos/base/applications/cmdutils/xcopy/Pt.rc @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/cmdutils/xcopy/Ru.rc b/reactos/base/applications/cmdutils/xcopy/Ru.rc index 398345713f7..1d86ff46f8c 100644 --- a/reactos/base/applications/cmdutils/xcopy/Ru.rc +++ b/reactos/base/applications/cmdutils/xcopy/Ru.rc @@ -20,7 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/cmdutils/xcopy/Si.rc b/reactos/base/applications/cmdutils/xcopy/Si.rc index 1013837f402..092282c1636 100644 --- a/reactos/base/applications/cmdutils/xcopy/Si.rc +++ b/reactos/base/applications/cmdutils/xcopy/Si.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "xcopy.h" - #pragma code_page(65001) LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT @@ -80,3 +78,5 @@ Where:\n\ \t\tod izvora\n\n" } + +#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.h b/reactos/base/applications/cmdutils/xcopy/xcopy.h index 1c933951284..ee4bd910cde 100644 --- a/reactos/base/applications/cmdutils/xcopy/xcopy.h +++ b/reactos/base/applications/cmdutils/xcopy/xcopy.h @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include - /* Local #defines */ #define RC_OK 0 #define RC_NOFILES 1 diff --git a/reactos/base/applications/winhlp32/lang/Lt.rc b/reactos/base/applications/winhlp32/lang/Lt.rc deleted file mode 100644 index f8e78681aae..00000000000 --- a/reactos/base/applications/winhlp32/lang/Lt.rc +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Help Viewer - * - * Copyright 2009 Aurimas FiÅ¡eras - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "winhelp_res.h" - -/* UTF-8 */ -#pragma code_page(65001) - -LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL - -/* Menu */ - -MAIN_MENU MENU -{ - POPUP "&Failas" { - MENUITEM "&Atverti", MNID_FILE_OPEN - MENUITEM SEPARATOR - MENUITEM "&Spausdinti", MNID_FILE_PRINT - MENUITEM "Spaus&dintuvo nuostatos...", MNID_FILE_SETUP - MENUITEM SEPARATOR - MENUITEM "IÅ¡&eiti", MNID_FILE_EXIT - } - POPUP "&Taisa" { - MENUITEM "&Kopijuoti...", MNID_EDIT_COPYDLG - MENUITEM SEPARATOR - MENUITEM "Ko&mentuoti...", MNID_EDIT_ANNOTATE - } - POPUP "&Adresynas" { - MENUITEM "&Apibrėžti...", MNID_BKMK_DEFINE - } - POPUP "&Parinktys" { - POPUP "Žinynas visuomet matomas" - BEGIN - MENUITEM "Numatyta", MNID_OPTS_HELP_DEFAULT - MENUITEM "Matomas", MNID_OPTS_HELP_VISIBLE - MENUITEM "Nematomas", MNID_OPTS_HELP_NONVISIBLE - END - MENUITEM "Istorija", MNID_OPTS_HISTORY - POPUP "Å riftas" - BEGIN - MENUITEM "&Mažas", MNID_OPTS_FONTS_SMALL - MENUITEM "&Normalus", MNID_OPTS_FONTS_NORMAL - MENUITEM "&Didelis", MNID_OPTS_FONTS_LARGE - END - MENUITEM "Naudoti &sistemos spalvas", MNID_OPTS_SYSTEM_COLORS - } - POPUP "&Žinynas" { - MENUITEM "Pa&galba apie žinynÄ…", MNID_HELP_HELPON - MENUITEM "&Visada virÅ¡uje", MNID_HELP_HELPTOP - MENUITEM SEPARATOR - MENUITEM "&Informacija...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Apie Wine", MNID_HELP_WINE -#endif - } -} - -IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "MS Shell Dlg" -CAPTION "Indeksas" -{ - LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER -} - -IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 8, "MS Shell Dlg" -CAPTION "PaieÅ¡ka" -{ - LTEXT "Dar nerealizuota", -1, 10, 10, 180, 150 -} - -/* Strings */ -STRINGTABLE DISCARDABLE -{ -STID_WINE_HELP, "Wine žinynas" -STID_WHERROR, "KLAIDA" -STID_WARNING, "Ä®SPÄ–JIMAS" -STID_INFO, "Informacija" -STID_NOT_IMPLEMENTED, "Nerealizuota" -STID_HLPFILE_ERROR_s, "Klaida skaitant žinyno failÄ… „%s“" -STID_INDEX, "&RodyklÄ—" -STID_CONTENTS, "Santrauka" -STID_BACK, "&Atgal" -STID_ALL_FILES, "Visi failai (*.*)" -STID_HELP_FILES_HLP, "Žinyno failai (*.hlp)" -STID_FILE_NOT_FOUND_s "Nepavyko rasti „%s“. Ar norite rasti šį failÄ… patys?" -STID_NO_RICHEDIT "Nepavyko rasti RichEdit realizacijos... Nutraukiama" -STID_PSH_INDEX, "Žinyno temos: " -} - -CONTEXT_MENU MENU -BEGIN - POPUP "" - BEGIN - MENUITEM "Komentuoti...", MNID_CTXT_ANNOTATE - MENUITEM "Kopijuoti", MNID_CTXT_COPY - MENUITEM "Spausdinti...", MNID_CTXT_PRINT - POPUP "Å riftas" - BEGIN - MENUITEM "Mažas", MNID_CTXT_FONTS_SMALL - MENUITEM "Normalus", MNID_CTXT_FONTS_NORMAL - MENUITEM "Didelis", MNID_CTXT_FONTS_LARGE - END - POPUP "Žinynas visuomet matomas" - BEGIN - MENUITEM "Numatyta", MNID_CTXT_HELP_DEFAULT - MENUITEM "Matomas", MNID_CTXT_HELP_VISIBLE - MENUITEM "Nematomas", MNID_CTXT_HELP_NONVISIBLE - END - MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS - END -END diff --git a/reactos/base/applications/winhlp32/lang/bg-BG.rc b/reactos/base/applications/winhlp32/lang/bg-BG.rc index e6d3143db24..c59d4e24625 100644 --- a/reactos/base/applications/winhlp32/lang/bg-BG.rc +++ b/reactos/base/applications/winhlp32/lang/bg-BG.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/cs-CZ.rc b/reactos/base/applications/winhlp32/lang/cs-CZ.rc index a8f8db31a26..15cbf02693d 100644 --- a/reactos/base/applications/winhlp32/lang/cs-CZ.rc +++ b/reactos/base/applications/winhlp32/lang/cs-CZ.rc @@ -21,8 +21,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Czech strings in CP1250 */ /* Menu */ diff --git a/reactos/base/applications/winhlp32/lang/da-DK.rc b/reactos/base/applications/winhlp32/lang/da-DK.rc index fc15eeba7d5..927fc32079f 100644 --- a/reactos/base/applications/winhlp32/lang/da-DK.rc +++ b/reactos/base/applications/winhlp32/lang/da-DK.rc @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_DANISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/de-DE.rc b/reactos/base/applications/winhlp32/lang/de-DE.rc index fa59b42ce96..c8ee650ccca 100644 --- a/reactos/base/applications/winhlp32/lang/de-DE.rc +++ b/reactos/base/applications/winhlp32/lang/de-DE.rc @@ -19,16 +19,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - -#pragma code_page(65001) - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL { POPUP "&Datei" { - MENUITEM "Ö&ffnen...", MNID_FILE_OPEN + MENUITEM "Ö&ffnen...", MNID_FILE_OPEN MENUITEM SEPARATOR MENUITEM "Thema &drucken", MNID_FILE_PRINT MENUITEM "Drucker&einrichtung...", MNID_FILE_SETUP @@ -65,7 +61,7 @@ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "&Über WINE", MNID_HELP_WINE + MENUITEM "&Über WINE", MNID_HELP_WINE #endif } } @@ -98,7 +94,7 @@ STID_NOT_IMPLEMENTED, "Nicht implementiert" STID_HLPFILE_ERROR_s, "Fehler beim Lesen der Hilfe-Datei `%s'" STID_INDEX, "&Inhalt" STID_CONTENTS, "Summary" -STID_BACK, "&Zurück" +STID_BACK, "&Zurück" STID_ALL_FILES, "Alle Dateien (*.*)" STID_HELP_FILES_HLP, "Hilfe-Dateien (*.hlp)" STID_FILE_NOT_FOUND_s "'%s' konnte nicht gefunden werden. Wollen Sie selber nach dieser Datei suchen?" @@ -113,11 +109,11 @@ BEGIN MENUITEM "Anmerken...", MNID_CTXT_ANNOTATE MENUITEM "Kopieren", MNID_CTXT_COPY MENUITEM "Drucken...", MNID_CTXT_PRINT -POPUP "Schriftgröße" +POPUP "Schriftgröße" BEGIN MENUITEM "Klein", MNID_CTXT_FONTS_SMALL MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL -MENUITEM "Groß", MNID_CTXT_FONTS_LARGE +MENUITEM "Groß", MNID_CTXT_FONTS_LARGE END POPUP "Hilfe immer sichtbar" BEGIN diff --git a/reactos/base/applications/winhlp32/lang/en-US.rc b/reactos/base/applications/winhlp32/lang/en-US.rc index a4e9d8add4e..2a11e1a33c2 100644 --- a/reactos/base/applications/winhlp32/lang/en-US.rc +++ b/reactos/base/applications/winhlp32/lang/en-US.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT @@ -68,51 +66,6 @@ MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT } } -MAIN_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL -{ - POPUP "&File" { - MENUITEM "&Open", MNID_FILE_OPEN - MENUITEM SEPARATOR - MENUITEM "&Print", MNID_FILE_PRINT - MENUITEM "Printer &setup...", MNID_FILE_SETUP - MENUITEM SEPARATOR - MENUITEM "E&xit", MNID_FILE_EXIT - } - POPUP "&Edit" { - MENUITEM "&Copy...", MNID_EDIT_COPYDLG - MENUITEM SEPARATOR - MENUITEM "&Annotate...", MNID_EDIT_ANNOTATE - } - POPUP "&Bookmark" { - MENUITEM "&Define...", MNID_BKMK_DEFINE - } - POPUP "&Options" { - POPUP "Help always visible" - BEGIN - MENUITEM "Default", MNID_OPTS_HELP_DEFAULT - MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE - MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE - END - MENUITEM "History", MNID_OPTS_HISTORY - POPUP "Fonts" - BEGIN - MENUITEM "Small", MNID_OPTS_FONTS_SMALL - MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL - MENUITEM "Large", MNID_OPTS_FONTS_LARGE - END - MENUITEM "Use system colours", MNID_OPTS_SYSTEM_COLORS - } - POPUP "&Help" { - MENUITEM "Help &on help", MNID_HELP_HELPON - MENUITEM "Always on &top", MNID_HELP_HELPTOP - MENUITEM SEPARATOR - MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&About Wine", MNID_HELP_WINE -#endif - } -} - IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" @@ -170,26 +123,3 @@ BEGIN MENUITEM "Use system colors", MNID_CTXT_SYSTEM_COLORS END END - -CONTEXT_MENU MENU LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL -BEGIN - POPUP "" - BEGIN - MENUITEM "Annotation...", MNID_CTXT_ANNOTATE - MENUITEM "Copy", MNID_CTXT_COPY - MENUITEM "Print...", MNID_CTXT_PRINT - POPUP "Fonts" - BEGIN - MENUITEM "Small", MNID_CTXT_FONTS_SMALL - MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL - MENUITEM "Large", MNID_CTXT_FONTS_LARGE - END - POPUP "Help always visible" - BEGIN - MENUITEM "Default", MNID_CTXT_HELP_DEFAULT - MENUITEM "Visible", MNID_CTXT_HELP_VISIBLE - MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE - END - MENUITEM "Use system colours", MNID_CTXT_SYSTEM_COLORS - END -END diff --git a/reactos/base/applications/winhlp32/lang/es-ES.rc b/reactos/base/applications/winhlp32/lang/es-ES.rc index e752950bcd9..eee0e17e26a 100644 --- a/reactos/base/applications/winhlp32/lang/es-ES.rc +++ b/reactos/base/applications/winhlp32/lang/es-ES.rc @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/winhlp32/lang/fi-FI.rc b/reactos/base/applications/winhlp32/lang/fi-FI.rc index 5585619e4ed..a1564e68adf 100644 --- a/reactos/base/applications/winhlp32/lang/fi-FI.rc +++ b/reactos/base/applications/winhlp32/lang/fi-FI.rc @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/fr-FR.rc b/reactos/base/applications/winhlp32/lang/fr-FR.rc index cedb0f694b7..0c5eea63f12 100644 --- a/reactos/base/applications/winhlp32/lang/fr-FR.rc +++ b/reactos/base/applications/winhlp32/lang/fr-FR.rc @@ -20,11 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - -/* UTF-8 */ -#pragma code_page(65001) - /* Menu */ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL @@ -39,18 +34,18 @@ MAIN_MENU MENU MENUITEM SEPARATOR MENUITEM "&Quitter", MNID_FILE_EXIT } - POPUP "É&dition" { + POPUP "É&dition" { MENUITEM "&Copier...", MNID_EDIT_COPYDLG MENUITEM SEPARATOR - MENUITEM "&Annoter...", MNID_EDIT_ANNOTATE + MENUITEM "&Annotation...", MNID_EDIT_ANNOTATE } - POPUP "&Signets" { - MENUITEM "&Définir...", MNID_BKMK_DEFINE + POPUP "&Signet" { + MENUITEM "&Définir...", MNID_BKMK_DEFINE } POPUP "&Options" { POPUP "Aide toujours visible" BEGIN - MENUITEM "Par défaut", MNID_OPTS_HELP_DEFAULT + MENUITEM "Par défaut", MNID_OPTS_HELP_DEFAULT MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE END @@ -61,7 +56,7 @@ MAIN_MENU MENU MENUITEM "Normale", MNID_OPTS_FONTS_NORMAL MENUITEM "Grande", MNID_OPTS_FONTS_LARGE END - MENUITEM "Utiliser les couleurs système", MNID_OPTS_SYSTEM_COLORS + MENUITEM "Utiliser les couleurs système", MNID_OPTS_SYSTEM_COLORS } POPUP "Aid&e" { MENUITEM "&Utiliser l'aide", MNID_HELP_HELPON @@ -69,7 +64,7 @@ MAIN_MENU MENU MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "À &propos de Wine", MNID_HELP_WINE + MENUITEM "À &propos de Wine", MNID_HELP_WINE #endif } } @@ -87,7 +82,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Recherche" { - LTEXT "Pas encore implémenté", -1, 10, 10, 180, 150 + LTEXT "Pas encore implémenté", -1, 10, 10, 180, 150 } /* Strings */ @@ -97,15 +92,15 @@ STID_WINE_HELP, "Aide de Wine" STID_WHERROR, "ERREUR" STID_WARNING, "ATTENTION" STID_INFO, "Information" -STID_NOT_IMPLEMENTED, "Non implémenté" -STID_HLPFILE_ERROR_s, "Une erreur est survenue en lisant le fichier d'aide « %s »" +STID_NOT_IMPLEMENTED, "Non implémenté" +STID_HLPFILE_ERROR_s, "Une erreur est survenue en lisant le fichier d'aide « %s »" STID_INDEX, "&Index" STID_CONTENTS, "Sommaire" -STID_BACK, "&Précédent" -STID_ALL_FILES, "Tous les fichiers (*.*)" +STID_BACK, "&Précédent" +STID_ALL_FILES, "Tous fichiers (*.*)" STID_HELP_FILES_HLP, "Fichiers d'aide (*.hlp)" -STID_FILE_NOT_FOUND_s "Impossible de trouver « %s ». Souhaitez-vous rechercher ce fichier vous-même ?" -STID_NO_RICHEDIT "La bibliothèque RichEdit n'a pu être localisée... Abandon" +STID_FILE_NOT_FOUND_s "Impossible de trouver « %s ». Souhaitez-vous rechercher ce fichier vous-même ?" +STID_NO_RICHEDIT "La bibliothèque RichEdit n'a pu être localisée... Abandon" STID_PSH_INDEX, "Rubriques d'aide : " } @@ -124,10 +119,10 @@ BEGIN END POPUP "Aide toujours visible" BEGIN - MENUITEM "Par défaut", MNID_CTXT_HELP_DEFAULT + MENUITEM "Par défaut", MNID_CTXT_HELP_DEFAULT MENUITEM "Visible", MNID_CTXT_HELP_VISIBLE MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE END - MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS + MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS END END diff --git a/reactos/base/applications/winhlp32/lang/hu-HU.rc b/reactos/base/applications/winhlp32/lang/hu-HU.rc index ef3a1ee2bc3..39beb19c641 100644 --- a/reactos/base/applications/winhlp32/lang/hu-HU.rc +++ b/reactos/base/applications/winhlp32/lang/hu-HU.rc @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/it-IT.rc b/reactos/base/applications/winhlp32/lang/it-IT.rc index 5d1abb8c92c..70c158780e9 100644 --- a/reactos/base/applications/winhlp32/lang/it-IT.rc +++ b/reactos/base/applications/winhlp32/lang/it-IT.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/winhlp32/lang/ja-JP.rc b/reactos/base/applications/winhlp32/lang/ja-JP.rc index b73d18dd192..bd88b5d6fad 100644 --- a/reactos/base/applications/winhlp32/lang/ja-JP.rc +++ b/reactos/base/applications/winhlp32/lang/ja-JP.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* UTF-8 */ #pragma code_page(65001) @@ -128,3 +126,5 @@ BEGIN MENUITEM "システム カラーを使ã†", MNID_CTXT_SYSTEM_COLORS END END + +#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/lang/ko-KR.rc b/reactos/base/applications/winhlp32/lang/ko-KR.rc index 8b4c785ed0c..68931789c60 100644 --- a/reactos/base/applications/winhlp32/lang/ko-KR.rc +++ b/reactos/base/applications/winhlp32/lang/ko-KR.rc @@ -19,8 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/nl-NL.rc b/reactos/base/applications/winhlp32/lang/nl-NL.rc index 029d58265b9..6a8747a859e 100644 --- a/reactos/base/applications/winhlp32/lang/nl-NL.rc +++ b/reactos/base/applications/winhlp32/lang/nl-NL.rc @@ -19,10 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - -#pragma code_page(65001) - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL @@ -36,28 +32,28 @@ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL MENUITEM "&Afsluiten", MNID_FILE_EXIT } POPUP "&Bewerken" { - MENUITEM "&Kopiëren...", MNID_EDIT_COPYDLG + MENUITEM "&Kopiëren...", MNID_EDIT_COPYDLG MENUITEM SEPARATOR MENUITEM "&Annoteren...", MNID_EDIT_ANNOTATE } POPUP "&Favorieten" { MENUITEM "&Aanmaken...", MNID_BKMK_DEFINE } - POPUP "&Opties" { - POPUP "Help altijd zichtbaar" + POPUP "&Options" { + POPUP "Help always visible" BEGIN - MENUITEM "Standaard", MNID_OPTS_HELP_DEFAULT - MENUITEM "Zichtbaar", MNID_OPTS_HELP_VISIBLE - MENUITEM "Niet zichtbaar", MNID_OPTS_HELP_NONVISIBLE + MENUITEM "Default", MNID_OPTS_HELP_DEFAULT + MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE + MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE END - MENUITEM "Historie", MNID_OPTS_HISTORY - POPUP "Lettertype" + MENUITEM "History", MNID_OPTS_HISTORY + POPUP "Fonts" BEGIN - MENUITEM "Klein", MNID_OPTS_FONTS_SMALL - MENUITEM "Standaard", MNID_OPTS_FONTS_NORMAL - MENUITEM "Groot", MNID_OPTS_FONTS_LARGE + MENUITEM "Small", MNID_OPTS_FONTS_SMALL + MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL + MENUITEM "Large", MNID_OPTS_FONTS_LARGE END - MENUITEM "Gebruik systeemkleuren", MNID_OPTS_SYSTEM_COLORS + MENUITEM "Use system colors", MNID_OPTS_SYSTEM_COLORS } POPUP "&Help" { MENUITEM "Hulp &bij help", MNID_HELP_HELPON @@ -65,7 +61,7 @@ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "&Over Wine", MNID_HELP_WINE + MENUITEM "&Over WINE", MNID_HELP_WINE #endif } } @@ -83,26 +79,26 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Zoeken" { - LTEXT "Nog niet geïmplementeerd", -1, 10, 10, 180, 150 + LTEXT "Nog niet geimplementeerd", -1, 10, 10, 180, 150 } /* Strings */ STRINGTABLE DISCARDABLE LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL { -STID_WINE_HELP, "Wine Help" +STID_WINE_HELP, "WINE Help" STID_WHERROR, "FOUT" STID_WARNING, "WAARSCHUWING" STID_INFO, "Informatie" -STID_NOT_IMPLEMENTED, "Niet geïmplementeerd" -STID_HLPFILE_ERROR_s, "Fout bij het lezen van het helpbestand '%s'" -STID_INDEX, "Inde&x" -STID_CONTENTS, "&Inhoudsopgave" +STID_NOT_IMPLEMENTED, "Niet geïmplementeerd" +STID_HLPFILE_ERROR_s, "Fout bij het lezen van het helpbestand `%s'" +STID_INDEX, "&Inhoud" +STID_CONTENTS, "Summary" STID_BACK, "&Terug" STID_ALL_FILES, "Alle bestanden (*.*)" STID_HELP_FILES_HLP, "Helpbestanden (*.hlp)" STID_FILE_NOT_FOUND_s "Kan '%s' niet openen. Wilt u zelf dit bestand zoeken?" -STID_NO_RICHEDIT "Kan geen richedit implementatie vinden... Actie afgebroken" -STID_PSH_INDEX, "Help onderwerpen: " +STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" +STID_PSH_INDEX, "Help topics: " } CONTEXT_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL @@ -110,7 +106,7 @@ BEGIN POPUP "" BEGIN MENUITEM "Annotering...", MNID_CTXT_ANNOTATE - MENUITEM "Kopiëren", MNID_CTXT_COPY + MENUITEM "Kopiëren", MNID_CTXT_COPY MENUITEM "Print...", MNID_CTXT_PRINT POPUP "Lettertypes" BEGIN diff --git a/reactos/base/applications/winhlp32/lang/no-NO.rc b/reactos/base/applications/winhlp32/lang/no-NO.rc index 2cf2a782372..5f3e3101c46 100644 --- a/reactos/base/applications/winhlp32/lang/no-NO.rc +++ b/reactos/base/applications/winhlp32/lang/no-NO.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL diff --git a/reactos/base/applications/winhlp32/lang/pl-PL.rc b/reactos/base/applications/winhlp32/lang/pl-PL.rc index 75047892180..17d5d22e346 100644 --- a/reactos/base/applications/winhlp32/lang/pl-PL.rc +++ b/reactos/base/applications/winhlp32/lang/pl-PL.rc @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_POLISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/pt-BR.rc b/reactos/base/applications/winhlp32/lang/pt-BR.rc index 9a12e58f096..fd27a65b55f 100644 --- a/reactos/base/applications/winhlp32/lang/pt-BR.rc +++ b/reactos/base/applications/winhlp32/lang/pt-BR.rc @@ -23,8 +23,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN diff --git a/reactos/base/applications/winhlp32/lang/rm-CH.rc b/reactos/base/applications/winhlp32/lang/rm-CH.rc index ece7bb17c4d..1339b39e189 100644 --- a/reactos/base/applications/winhlp32/lang/rm-CH.rc +++ b/reactos/base/applications/winhlp32/lang/rm-CH.rc @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* FIXME: This file is in the Vallader Romansh dialect and not in the official Rumantsch Grischun. */ diff --git a/reactos/base/applications/winhlp32/lang/ru-RU.rc b/reactos/base/applications/winhlp32/lang/ru-RU.rc index e2e6ef2f5c5..af0097b7eea 100644 --- a/reactos/base/applications/winhlp32/lang/ru-RU.rc +++ b/reactos/base/applications/winhlp32/lang/ru-RU.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/sk-SK.rc b/reactos/base/applications/winhlp32/lang/sk-SK.rc index 1b45e1fe89e..f8338323dee 100644 --- a/reactos/base/applications/winhlp32/lang/sk-SK.rc +++ b/reactos/base/applications/winhlp32/lang/sk-SK.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - MAIN_MENU MENU LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT { POPUP "&Súbor" { diff --git a/reactos/base/applications/winhlp32/lang/sl-SI.rc b/reactos/base/applications/winhlp32/lang/sl-SI.rc index 527b45431ee..a742cafe05b 100644 --- a/reactos/base/applications/winhlp32/lang/sl-SI.rc +++ b/reactos/base/applications/winhlp32/lang/sl-SI.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - #pragma code_page(65001) /* Menu */ @@ -126,3 +124,5 @@ BEGIN MENUITEM "Uporabi sistemske barve", MNID_CTXT_SYSTEM_COLORS END END + +#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/lang/sv-SE.rc b/reactos/base/applications/winhlp32/lang/sv-SE.rc index 935b618909b..d3893284cae 100644 --- a/reactos/base/applications/winhlp32/lang/sv-SE.rc +++ b/reactos/base/applications/winhlp32/lang/sv-SE.rc @@ -22,8 +22,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL diff --git a/reactos/base/applications/winhlp32/lang/tr-TR.rc b/reactos/base/applications/winhlp32/lang/tr-TR.rc index 876f33caa2f..bbff7236580 100644 --- a/reactos/base/applications/winhlp32/lang/tr-TR.rc +++ b/reactos/base/applications/winhlp32/lang/tr-TR.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Menu */ MAIN_MENU MENU LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT diff --git a/reactos/base/applications/winhlp32/lang/zh-CN.rc b/reactos/base/applications/winhlp32/lang/zh-CN.rc index ed20356cf47..c0ed0176d77 100644 --- a/reactos/base/applications/winhlp32/lang/zh-CN.rc +++ b/reactos/base/applications/winhlp32/lang/zh-CN.rc @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "winhelp_res.h" - /* Chinese text is encoded in UTF-8 */ #pragma code_page(65001) @@ -160,3 +158,5 @@ STID_FILE_NOT_FOUND_s "ä¸èƒ½é–‹å•Ÿæª”案 '%s'. 你想è¦è‡ªå·±æ‰¾é€™å€‹æª”案 STID_NO_RICHEDIT "找ä¸åˆ° richedit... 終止" STID_PSH_INDEX, "幫助內容: " } + +#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/lex.yy.c b/reactos/base/applications/winhlp32/lex.yy.c index aa6f83c8b78..bf0be672d32 100644 --- a/reactos/base/applications/winhlp32/lex.yy.c +++ b/reactos/base/applications/winhlp32/lex.yy.c @@ -380,9 +380,9 @@ static char *yy_last_accepting_cpos; #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "macro.lex.l" +#line 1 ".\\macro.lex.l" #define INITIAL 0 -#line 2 "macro.lex.l" +#line 2 ".\\macro.lex.l" /* * Help Viewer * @@ -407,7 +407,7 @@ char *yytext; #define YY_NO_UNPUT 1 #define quote 1 -#line 26 "macro.lex.l" +#line 26 ".\\macro.lex.l" #include "config.h" #include #include @@ -593,7 +593,7 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 61 "macro.lex.l" +#line 61 ".\\macro.lex.l" #line 600 "lex.yy.c" @@ -681,32 +681,32 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 63 "macro.lex.l" +#line 63 ".\\macro.lex.l" yylval.integer = strtol(yytext, NULL, 10); return INTEGER; YY_BREAK case 2: YY_RULE_SETUP -#line 64 "macro.lex.l" +#line 64 ".\\macro.lex.l" yylval.integer = strtol(yytext, NULL, 16); return INTEGER; YY_BREAK case 3: YY_RULE_SETUP -#line 66 "macro.lex.l" +#line 66 ".\\macro.lex.l" return MACRO_Lookup(yytext, &yylval); YY_BREAK case 4: -#line 69 "macro.lex.l" +#line 69 ".\\macro.lex.l" case 5: -#line 70 "macro.lex.l" +#line 70 ".\\macro.lex.l" case 6: -#line 71 "macro.lex.l" +#line 71 ".\\macro.lex.l" case 7: -#line 72 "macro.lex.l" +#line 72 ".\\macro.lex.l" case 8: -#line 73 "macro.lex.l" +#line 73 ".\\macro.lex.l" case 9: YY_RULE_SETUP -#line 73 "macro.lex.l" +#line 73 ".\\macro.lex.l" { if (lex_data->quote_stk_idx == 0 || (yytext[0] == '\"' && lex_data->quote_stack[lex_data->quote_stk_idx - 1] != '\"') || @@ -741,31 +741,31 @@ YY_RULE_SETUP YY_BREAK case 10: YY_RULE_SETUP -#line 105 "macro.lex.l" +#line 105 ".\\macro.lex.l" *lex_data->strptr++ = yytext[0]; YY_BREAK case 11: YY_RULE_SETUP -#line 106 "macro.lex.l" +#line 106 ".\\macro.lex.l" *lex_data->strptr++ = yytext[1]; YY_BREAK case YY_STATE_EOF(quote): -#line 107 "macro.lex.l" +#line 107 ".\\macro.lex.l" return 0; YY_BREAK case 12: YY_RULE_SETUP -#line 109 "macro.lex.l" +#line 109 ".\\macro.lex.l" YY_BREAK case 13: YY_RULE_SETUP -#line 110 "macro.lex.l" +#line 110 ".\\macro.lex.l" return yytext[0]; YY_BREAK case 14: YY_RULE_SETUP -#line 111 "macro.lex.l" +#line 111 ".\\macro.lex.l" ECHO; YY_BREAK #line 772 "lex.yy.c" @@ -1654,7 +1654,7 @@ int main() return 0; } #endif -#line 111 "macro.lex.l" +#line 111 ".\\macro.lex.l" #if 0 diff --git a/reactos/base/applications/winhlp32/winhelp.c b/reactos/base/applications/winhlp32/winhelp.c index 56244d35aec..08d3875aba1 100644 --- a/reactos/base/applications/winhlp32/winhelp.c +++ b/reactos/base/applications/winhlp32/winhelp.c @@ -1736,7 +1736,7 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) WINHELP_GetWindowInfo(hlpfile, wndname), show); /* Message loop */ - while ((Globals.win_list || Globals.active_popup) && GetMessage(&msg, 0, 0, 0)) + while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); diff --git a/reactos/base/applications/winhlp32/winhelp_res.h b/reactos/base/applications/winhlp32/winhelp_res.h index ba2f9799d25..e1c72ff54e0 100644 --- a/reactos/base/applications/winhlp32/winhelp_res.h +++ b/reactos/base/applications/winhlp32/winhelp_res.h @@ -1,6 +1,3 @@ -#include -#include - #define MNID_FILE_OPEN 0x101 #define MNID_FILE_PRINT 0x104 #define MNID_FILE_SETUP 0x106 diff --git a/reactos/base/applications/wordpad/Da.rc b/reactos/base/applications/wordpad/Da.rc index 34789469e5e..d09e90f9b72 100644 --- a/reactos/base/applications/wordpad/Da.rc +++ b/reactos/base/applications/wordpad/Da.rc @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_DANISH, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/De.rc b/reactos/base/applications/wordpad/De.rc index 18181b2efba..a2fcceb61c4 100644 --- a/reactos/base/applications/wordpad/De.rc +++ b/reactos/base/applications/wordpad/De.rc @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL #pragma code_page(65001) @@ -246,3 +244,5 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Drucken ist nicht implementiert" STRING_MAX_TAB_STOPS, "Es können nur maximal 32 Tabstopps definiert werden." END + +#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc index fe92de7c2dc..dd099e13349 100644 --- a/reactos/base/applications/wordpad/En.rc +++ b/reactos/base/applications/wordpad/En.rc @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE @@ -244,12 +242,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Printing not implemented" STRING_MAX_TAB_STOPS, "Cannot add more than 32 tab stops." END - -LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL - -STRINGTABLE DISCARDABLE -BEGIN - STRING_ALIGN_LEFT, "Left" - STRING_ALIGN_RIGHT, "Right" - STRING_ALIGN_CENTER, "Centre" -END diff --git a/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc index 9691c0b0cc3..72f7c70e845 100644 --- a/reactos/base/applications/wordpad/Fr.rc +++ b/reactos/base/applications/wordpad/Fr.rc @@ -16,11 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - -/* UTF-8 */ -#pragma code_page(65001) - LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL IDM_MAINMENU MENU DISCARDABLE @@ -33,44 +28,44 @@ BEGIN MENUITEM "Enregistrer &sous...", ID_FILE_SAVEAS MENUITEM SEPARATOR MENUITEM "&Imprimer...\tCtrl+P", ID_PRINT - MENUITEM "A&perçu avant impression...", ID_PREVIEW + MENUITEM "A&perçu avant impression...", ID_PREVIEW MENUITEM "&Mise en page...", ID_PRINTSETUP MENUITEM SEPARATOR MENUITEM "&Quitter", ID_FILE_EXIT END - POPUP "É&dition" + POPUP "É&dition" BEGIN MENUITEM "&Annuler\tCtrl+Z", ID_EDIT_UNDO - MENUITEM "&Rétablir\tCtrl+Y", ID_EDIT_REDO + MENUITEM "&Rétablir\tCtrl+Y", ID_EDIT_REDO MENUITEM SEPARATOR MENUITEM "&Couper\tCtrl+X", ID_EDIT_CUT MENUITEM "Co&pier\tCtrl+C", ID_EDIT_COPY MENUITEM "C&oller\tCtrl+V", ID_EDIT_PASTE MENUITEM "&Effacer\tDel", ID_EDIT_CLEAR - MENUITEM "&Sélectionner tout\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM "&Sélectionner tout\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR MENUITEM "&Rechercher...\tCrtl+F", ID_FIND MENUITEM "Rechercher le &suivant\tF3", ID_FIND_NEXT MENUITEM "&Remplacer...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR - MENUITEM "Lecture &seule", ID_EDIT_READONLY - MENUITEM "&Modifié", ID_EDIT_MODIFIED + MENUITEM "Lecture-&seule", ID_EDIT_READONLY + MENUITEM "&Modifié", ID_EDIT_MODIFIED MENUITEM SEPARATOR - POPUP "&Avancé" + POPUP "&Avancés" BEGIN - MENUITEM "&Information sélection", ID_EDIT_SELECTIONINFO - MENUITEM "&Format caractères", ID_EDIT_CHARFORMAT - MENUITEM "&Déf. format car.", ID_EDIT_DEFCHARFORMAT + MENUITEM "&Information sélection", ID_EDIT_SELECTIONINFO + MENUITEM "&Format caractères", ID_EDIT_CHARFORMAT + MENUITEM "&Déf. format car.", ID_EDIT_DEFCHARFORMAT MENUITEM "Format paragrap&he", ID_EDIT_PARAFORMAT - MENUITEM "Texte &complet", ID_EDIT_GETTEXT + MENUITEM "&Recevoir texte", ID_EDIT_GETTEXT END END POPUP "&Affichage" BEGIN MENUITEM "&Barre d'outils", ID_TOGGLE_TOOLBAR MENUITEM "&Barre de format", ID_TOGGLE_FORMATBAR - MENUITEM "&Règle", ID_TOGGLE_RULER - MENUITEM "&Barre d'état", ID_TOGGLE_STATUSBAR + MENUITEM "&Règle", ID_TOGGLE_RULER + MENUITEM "&Barre d'état", ID_TOGGLE_STATUSBAR MENUITEM SEPARATOR MENUITEM "&Options...", ID_VIEWPROPERTIES END @@ -81,18 +76,18 @@ BEGIN POPUP "Forma&t" BEGIN MENUITEM "&Police...", ID_FONTSETTINGS - MENUITEM "Pu&ces" ID_BULLET - MENUITEM "Para&graphe..." ID_PARAFORMAT + MENUITEM "&Puces" ID_BULLET + MENUITEM "&Paragraphe..." ID_PARAFORMAT MENUITEM "&Tabulations..." ID_TABSTOPS - POPUP "&Arrière-plan" + POPUP "&Fond" BEGIN - MENUITEM "&Système\tCtrl+1", ID_BACK_1 - MENUITEM "&Jaune pâle\tCtrl+2", ID_BACK_2 + MENUITEM "&Système\tCtrl+1", ID_BACK_1 + MENUITEM "&Jaunasse\tCtrl+2", ID_BACK_2 END END POPUP "Aid&e" BEGIN - MENUITEM "À &propos du Wordpad de Wine" ID_ABOUT + MENUITEM "À &propos du Wordpad de Wine" ID_ABOUT END END @@ -104,8 +99,8 @@ BEGIN MENUITEM "Co&pier", ID_EDIT_COPY MENUITEM "C&oller", ID_EDIT_PASTE MENUITEM SEPARATOR - MENUITEM "P&uces" ID_BULLET - MENUITEM "Para&graphe" ID_PARAFORMAT + MENUITEM "&Puces" ID_BULLET + MENUITEM "&Paragraphe" ID_PARAFORMAT END END @@ -141,7 +136,7 @@ BEGIN EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 LTEXT "Droite", -1, 15, 40, 40, 13 EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 - LTEXT "Première ligne", -1, 15, 58, 40, 18 + LTEXT "Première ligne", -1, 15, 58, 40, 18 EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 LTEXT "Alignement", -1, 15, 87, 40, 13 COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST @@ -154,13 +149,13 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Tabulations" FONT 8, "MS SHell DLg" BEGIN - GROUPBOX "Taquets de tabulation", -1, 10, 10, 120, 90 + GROUPBOX "Arrêts de tabulation", -1, 10, 10, 120, 90 COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE - DEFPUSHBUTTON "A&jouter", ID_TAB_ADD, 20, 80, 45, 15 + DEFPUSHBUTTON "&Ajouter", ID_TAB_ADD, 20, 80, 45, 15 PUSHBUTTON "&Supprimer", ID_TAB_DEL, 72, 80, 45, 15 - PUSHBUTTON "&OK", IDOK, 137, 15, 56, 15 - PUSHBUTTON "&Annuler", IDCANCEL, 137, 33, 56, 15 - PUSHBUTTON "Supprimer &tous", ID_TAB_EMPTY, 137, 51, 56, 15 + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Annuler", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "Supprimer &tous", ID_TAB_EMPTY, 137, 51, 50, 15 END IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 @@ -168,23 +163,23 @@ STYLE DS_SYSMODAL Caption "" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Passage à la ligne automatique", -1, 10, 10, 140, 85 - RADIOBUTTON "&Aucun", IDC_PAGEFMT_WN, 18, 25, 127, 15 - RADIOBUTTON "Au niveau de la bordure de fe&nêtre", IDC_PAGEFMT_WW, 18, 45, 127, 15 - RADIOBUTTON "Au niveau de la &marge", IDC_PAGEFMT_WM, 18, 65, 127, 15 - GROUPBOX "Barres d'outils", -1, 156, 10, 115, 85 - CHECKBOX "&Barre d'outils", IDC_PAGEFMT_TB, 166, 20, 80, 15 - CHECKBOX "Barre de &format", IDC_PAGEFMT_FB, 166, 38, 80, 15 - CHECKBOX "&Règle", IDC_PAGEFMT_RU, 166, 56, 80, 15 - CHECKBOX "Barre de &statut", IDC_PAGEFMT_SB, 166, 74, 80, 15 + GROUPBOX "Enveloppement de ligne", -1, 10, 10, 170, 85 + RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 145, 15 + RADIOBUTTON "Enveloppe le texte à partir de la bordure de fenêtre", IDC_PAGEFMT_WW, 18, 45, 145, 15 + RADIOBUTTON "Enveloppe le texte à partir de la &marge", IDC_PAGEFMT_WM, 18, 65, 145, 15 + GROUPBOX "Barres d'outils", -1, 170, 10, 120, 85 + CHECKBOX "&Barre d'outils", IDC_PAGEFMT_TB, 180, 20, 80, 15 + CHECKBOX "Barre de &format", IDC_PAGEFMT_FB, 180, 38, 80, 15 + CHECKBOX "&Règle", IDC_PAGEFMT_RU, 180, 56, 80, 15 + CHECKBOX "Barre de &statut", IDC_PAGEFMT_SB, 180, 74, 80, 15 LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END STRINGTABLE DISCARDABLE BEGIN - STRING_RICHTEXT_FILES_RTF, "Format de texte enrichi (*.rtf)" + STRING_RICHTEXT_FILES_RTF, "Documents texte riche (*.rtf)" STRING_TEXT_FILES_TXT, "Documents texte (*.txt)" - STRING_TEXT_FILES_UNICODE_TXT, "Documents texte Unicode (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Documents texte unicode (*.txt)" STRING_ALL_FILES, "Tous les documents (*.*)" END @@ -197,9 +192,9 @@ END STRINGTABLE DISCARDABLE BEGIN - STRING_NEWFILE_RICHTEXT, "Format de texte enrichi (RTF)" + STRING_NEWFILE_RICHTEXT, "Document texte riche" STRING_NEWFILE_TXT, "Document texte" - STRING_NEWFILE_TXT_UNICODE, "Document texte Unicode" + STRING_NEWFILE_TXT_UNICODE, "Document texte unicode" END STRINGTABLE DISCARDABLE @@ -218,7 +213,7 @@ STRINGTABLE DISCARDABLE BEGIN STRING_PREVIEW_PRINT, "Imprimer" STRING_PREVIEW_NEXTPAGE, "Page suivante" - STRING_PREVIEW_PREVPAGE, "Page précédente" + STRING_PREVIEW_PREVPAGE, "Page précédente" STRING_PREVIEW_TWOPAGES, "Deux pages" STRING_PREVIEW_ONEPAGE, "Une page" STRING_PREVIEW_CLOSE, "Fermer" @@ -232,18 +227,18 @@ END STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Document" - STRING_PROMPT_SAVE_CHANGES, "Enregistrer les modifications de « %s » ?" - STRING_SEARCH_FINISHED, "Recherche terminée dans le document." - STRING_LOAD_RICHED_FAILED, "Impossible de charger la bibliothèque RichEdit." + STRING_PROMPT_SAVE_CHANGES, "Enregistrer les modifications de « %s » ?" + STRING_SEARCH_FINISHED, "Recherche terminée dans le document." + STRING_LOAD_RICHED_FAILED, "Impossible de charger la bibliothèque RichEdit." STRING_SAVE_LOSEFORMATTING, "Vous avez choisi d'enregistrer en texte simple, " \ "ce qui causera la perte de tout formattage. " \ - "Voulez-vous vraiment continuer ?" + "Voulez-vous vraiment continuer ?" STRING_INVALID_NUMBER, "Format de nombre invalide" - STRING_OLE_STORAGE_NOT_SUPPORTED, "Les documents conteneur OLE ne sont pas supportés" + STRING_OLE_STORAGE_NOT_SUPPORTED, "Les documents conteneur OLE ne sont pas supportés" STRING_WRITE_FAILED, "Impossible d'enregistrer le fichier." - STRING_WRITE_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'enregistrement du fichier." + STRING_WRITE_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'enregistrement du fichier." STRING_OPEN_FAILED, "Impossible d'ouvrir le fichier." - STRING_OPEN_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'ouverture du fichier." - STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée" + STRING_OPEN_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'ouverture du fichier." + STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée" STRING_MAX_TAB_STOPS, "Impossible d'ajouter plus de 32 taquets de tabulation." END diff --git a/reactos/base/applications/wordpad/Hu.rc b/reactos/base/applications/wordpad/Hu.rc index 74926e1e597..94ceda5a789 100644 --- a/reactos/base/applications/wordpad/Hu.rc +++ b/reactos/base/applications/wordpad/Hu.rc @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Ja.rc b/reactos/base/applications/wordpad/Ja.rc index fc21c5a4e74..09e48aafdf5 100644 --- a/reactos/base/applications/wordpad/Ja.rc +++ b/reactos/base/applications/wordpad/Ja.rc @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - /* UTF-8 */ #pragma code_page(65001) @@ -244,6 +242,6 @@ BEGIN STRING_WRITE_ACCESS_DENIED, "ファイルã«ä¿å­˜ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。" STRING_OPEN_FAILED, "ファイルを開ã‘ã¾ã›ã‚“。" STRING_OPEN_ACCESS_DENIED, "ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãæ¨©é™ãŒã‚りã¾ã›ã‚“。" - STRING_PRINTING_NOT_IMPLEMENTED, "プリントãŒå®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“。" - STRING_MAX_TAB_STOPS, "32以上ãªã‚¿ãƒ–を追加ã§ãã¾ã›ã‚“。" END + +#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Ko.rc b/reactos/base/applications/wordpad/Ko.rc index 58235857018..7bfaf00e767 100644 --- a/reactos/base/applications/wordpad/Ko.rc +++ b/reactos/base/applications/wordpad/Ko.rc @@ -17,7 +17,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT diff --git a/reactos/base/applications/wordpad/Lt.rc b/reactos/base/applications/wordpad/Lt.rc deleted file mode 100644 index 91fbfcaba91..00000000000 --- a/reactos/base/applications/wordpad/Lt.rc +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2009 Aurimas FiÅ¡eras - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "wordpad.h" - -/* UTF-8 */ -#pragma code_page(65001) - -LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL - -IDM_MAINMENU MENU DISCARDABLE -BEGIN - POPUP "&Failas" - BEGIN - MENUITEM "&Naujas...\tCtrl+N", ID_FILE_NEW - MENUITEM "&Atverti...\tCtrl+O", ID_FILE_OPEN - MENUITEM "&IÅ¡saugoti\tCtrl+S", ID_FILE_SAVE - MENUITEM "IÅ¡saugoti &kaip...", ID_FILE_SAVEAS - MENUITEM SEPARATOR - MENUITEM "S&pausdinti...\tCtrl+P", ID_PRINT - MENUITEM "Spaudinio pe&ržiÅ«ra...", ID_PREVIEW - MENUITEM "Puslapio n&uostatos...", ID_PRINTSETUP - MENUITEM SEPARATOR - MENUITEM "IÅ¡&eiti", ID_FILE_EXIT - END - POPUP "&Taisa" - BEGIN - MENUITEM "&AtÅ¡aukti\tCtrl+Z", ID_EDIT_UNDO - MENUITEM "&Grąžinti\tCtrl+Y", ID_EDIT_REDO - MENUITEM SEPARATOR - MENUITEM "&IÅ¡kirpti\tCtrl+X", ID_EDIT_CUT - MENUITEM "&Kopijuoti\tCtrl+C", ID_EDIT_COPY - MENUITEM "Ä®&dÄ—ti\tCtrl+V", ID_EDIT_PASTE - MENUITEM "&Å alinti\tDEL", ID_EDIT_CLEAR - MENUITEM "&PažymÄ—ti viskÄ…\tCtrl+A", ID_EDIT_SELECTALL - MENUITEM SEPARATOR - MENUITEM "I&eÅ¡koti...\tCrtl+F", ID_FIND - MENUITEM "IeÅ¡k&oti kito\tF3", ID_FIND_NEXT - MENUITEM "Pa&keisti...\tCtrl+H", ID_REPLACE - MENUITEM SEPARATOR - MENUITEM "Tik skait&ymui", ID_EDIT_READONLY - MENUITEM "&Modifikuotas", ID_EDIT_MODIFIED - MENUITEM SEPARATOR - POPUP "Papi&ldomi" - BEGIN - MENUITEM "ŽymÄ—jimo &informacija", ID_EDIT_SELECTIONINFO - MENUITEM "RaÅ¡menų &formatas", ID_EDIT_CHARFORMAT - MENUITEM "&Numatytas raÅ¡menų formatas", ID_EDIT_DEFCHARFORMAT - MENUITEM "&Pastraipos formatas", ID_EDIT_PARAFORMAT - MENUITEM "&Gauti tekstÄ…", ID_EDIT_GETTEXT - END - END - POPUP "&Rodymas" - BEGIN - MENUITEM "&Ä®rankių juosta", ID_TOGGLE_TOOLBAR - MENUITEM "&Formatų juosta", ID_TOGGLE_FORMATBAR - MENUITEM "&LiniuotÄ—", ID_TOGGLE_RULER - MENUITEM "&BÅ«senos juosta", ID_TOGGLE_STATUSBAR - MENUITEM SEPARATOR - MENUITEM "&Parinktys...", ID_VIEWPROPERTIES - END - POPUP "Ä®ter&pimas" - BEGIN - MENUITEM "&Data ir laikas...", ID_DATETIME - END - POPUP "F&ormatas" - BEGIN - MENUITEM "&Å riftas...", ID_FONTSETTINGS - MENUITEM "&Ženkleliai" ID_BULLET - MENUITEM "&Pastraipa..." ID_PARAFORMAT - MENUITEM "&Tabuliavimo žymÄ—s..." ID_TABSTOPS - POPUP "&Fonas" - BEGIN - MENUITEM "&Sistemos\tCtrl+1", ID_BACK_1 - MENUITEM "&Gelsvas\tCtrl+2", ID_BACK_2 - END - END - POPUP "&Žinynas" - BEGIN - MENUITEM "&Apie Wine Wordpad" ID_ABOUT - END -END - -IDM_POPUP MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&IÅ¡kirpti", ID_EDIT_CUT - MENUITEM "&Kopijuoti", ID_EDIT_COPY - MENUITEM "Ä®&dÄ—ti", ID_EDIT_PASTE - MENUITEM SEPARATOR - MENUITEM "&Ženkleliai" ID_BULLET - MENUITEM "&Pastraipa..." ID_PARAFORMAT - END -END - -IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "Data ir laikas" -FONT 10, "MS Sans Serif" -BEGIN - LTEXT "Galimi formatai",-1,3,2,100,15 - LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY - PUSHBUTTON "&Gerai",IDOK,87,12,40,12 - PUSHBUTTON "&Atsisakyti",IDCANCEL,87,26,40,12 -END - -IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "Naujas" -FONT 10, "MS Sans Serif" -BEGIN - LTEXT "Naujo dokumento tipas",-1,3,2,100,15 - LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT - PUSHBUTTON "&Gerai",IDOK,97,12,40,12 - PUSHBUTTON "&Atsisakyti",IDCANCEL,97,26,40,12 -END - -IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -Caption "Pastraipos formatas" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Ä®trauka", -1, 10, 10, 120, 68 - LTEXT "IÅ¡ kairÄ—s", -1, 15, 22, 45, 13 - EDITTEXT IDC_PARA_LEFT, 60, 20, 55, 13 - LTEXT "IÅ¡ deÅ¡inÄ—s", -1, 15, 40, 45, 13 - EDITTEXT IDC_PARA_RIGHT, 60, 38, 55, 13 - LTEXT "Pirmoji eilutÄ—", -1, 15, 58, 45, 13 - EDITTEXT IDC_PARA_FIRST, 60, 56, 55, 13 - LTEXT "LygiuotÄ—", -1, 15, 87, 40, 13 - COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST - PUSHBUTTON "&Gerai", IDOK, 137, 15, 50, 15 - PUSHBUTTON "&Atsisakyti", IDCANCEL, 137, 33, 50, 15 -END - -IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -Caption "Tabuliavimo žymÄ—s" -FONT 8, "MS SHell DLg" -BEGIN - GROUPBOX "Tabuliavimo pozicija", -1, 10, 10, 120, 90 - COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE - DEFPUSHBUTTON "&PridÄ—ti", ID_TAB_ADD, 20, 80, 45, 15 - PUSHBUTTON "Pa&Å¡alinti", ID_TAB_DEL, 72, 80, 45, 15 - PUSHBUTTON "&Gerai", IDOK, 137, 15, 50, 15 - PUSHBUTTON "&Atsisakyti", IDCANCEL, 137, 33, 50, 15 - PUSHBUTTON "PaÅ¡alinti &visas", ID_TAB_EMPTY, 137, 51, 50, 15 -END - -IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 -STYLE DS_SYSMODAL -Caption "" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "EilutÄ—s skaidymas", -1, 10, 10, 130, 85 - RADIOBUTTON "&EilutÄ—s neskaidomos", IDC_PAGEFMT_WN, 18, 25, 117, 15 - RADIOBUTTON "Skaidyti tekstÄ… prie lango &rÄ—melio", IDC_PAGEFMT_WW, 18, 45, 117, 15 - RADIOBUTTON "Skaidyti tekstÄ… prie ¶Å¡tÄ—s", IDC_PAGEFMT_WM, 18, 65, 117, 15 - GROUPBOX "Ä®rankių juostos", -1, 150, 10, 120, 85 - CHECKBOX "Ä®ran&kių juosta", IDC_PAGEFMT_TB, 160, 20, 80, 15 - CHECKBOX "&Formatų juosta", IDC_PAGEFMT_FB, 160, 38, 80, 15 - CHECKBOX "&LiniuotÄ—", IDC_PAGEFMT_RU, 160, 56, 80, 15 - CHECKBOX "&BÅ«senos juosta", IDC_PAGEFMT_SB, 160, 74, 80, 15 - LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 -END - -STRINGTABLE DISCARDABLE -BEGIN - STRING_RICHTEXT_FILES_RTF, "RaiÅ¡kiojo teksto dokumentai (*.rtf)" - STRING_TEXT_FILES_TXT, "Tekstiniai dokumentai (*.txt)" - STRING_TEXT_FILES_UNICODE_TXT, "Teksto unikodu dokumentai (*.txt)" - STRING_ALL_FILES, "Visi dokumentai (*.*)" -END - -STRINGTABLE DISCARDABLE -BEGIN - STRING_ALIGN_LEFT, "KairinÄ—" - STRING_ALIGN_RIGHT, "DeÅ¡ininÄ—" - STRING_ALIGN_CENTER, "CentrinÄ—" -END - -STRINGTABLE DISCARDABLE -BEGIN - STRING_NEWFILE_RICHTEXT, "RaiÅ¡kiojo teksto dokumentas" - STRING_NEWFILE_TXT, "Tekstinis dokumentas" - STRING_NEWFILE_TXT_UNICODE, "Teksto unikodu dokumentas" -END - -STRINGTABLE DISCARDABLE -BEGIN - STRING_PRINTER_FILES_PRN, "Spausdintuvo failai (*.PRN)" -END - -STRINGTABLE DISCARDABLE -BEGIN - STRING_VIEWPROPS_TITLE, "Parinktys" - STRING_VIEWPROPS_TEXT, "Tekstas" - STRING_VIEWPROPS_RICHTEXT, "RaiÅ¡kusis tekstas" -END - -STRINGTABLE DISCARDABLE -BEGIN - STRING_PREVIEW_PRINT, "Spausdinti" - STRING_PREVIEW_NEXTPAGE, "Tolesnis puslapis" - STRING_PREVIEW_PREVPAGE, "Ankstesnis puslapis" - STRING_PREVIEW_TWOPAGES, "Du puslapiai" - STRING_PREVIEW_ONEPAGE, "Vienas puslapis" - STRING_PREVIEW_CLOSE, "Užverti" -END - -STRINGTABLE DISCARDABLE -BEGIN - STRING_UNITS_CM, "cm" -END - -STRINGTABLE DISCARDABLE -BEGIN - STRING_DEFAULT_FILENAME, "Dokumentas" - STRING_PROMPT_SAVE_CHANGES, "IÅ¡saugoti „%s“ pakeitimus?" - STRING_SEARCH_FINISHED, "PaieÅ¡ka dokumente baigta." - STRING_LOAD_RICHED_FAILED, "Nepavyko įkelti RichEdit bibliotekos." - STRING_SAVE_LOSEFORMATTING, "JÅ«s pasirinkote iÅ¡saugoti paprasto teksto formatu, " \ - "todÄ—l bus prarastas visas formatavimas. " \ - "Ar tikrai norite tai padaryti?" - STRING_INVALID_NUMBER, "Neteisingas skaiÄiaus formatas" - STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE saugyklos dokumentai yra nepalaikomi" - STRING_WRITE_FAILED, "Nepavyko iÅ¡saugoti failo." - STRING_WRITE_ACCESS_DENIED, "JÅ«s neturite prieigos failui iÅ¡saugoti." - STRING_OPEN_FAILED, "Nepavyko atverti failo." - STRING_OPEN_ACCESS_DENIED, "JÅ«s neturite prieigos failui atverti." - STRING_PRINTING_NOT_IMPLEMENTED, "Spausdinimas nerealizuotas" - STRING_MAX_TAB_STOPS, "Negalima pridÄ—ti daugiau negu 32-jų tabuliavimo pozicijų." -END diff --git a/reactos/base/applications/wordpad/Nl.rc b/reactos/base/applications/wordpad/Nl.rc index c9ce64a4b29..c91e028c3e4 100644 --- a/reactos/base/applications/wordpad/Nl.rc +++ b/reactos/base/applications/wordpad/Nl.rc @@ -17,8 +17,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/No.rc b/reactos/base/applications/wordpad/No.rc index 5a4fdbf8c30..6261c6fb81d 100644 --- a/reactos/base/applications/wordpad/No.rc +++ b/reactos/base/applications/wordpad/No.rc @@ -1,5 +1,5 @@ /* - * Copyright 2006-2009 by Alexander N. Sørnes + * Copyright 2006-2008 by Alexander N. Sørnes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,10 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - -#pragma code_page(65001) - LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL IDM_MAINMENU MENU DISCARDABLE @@ -27,12 +23,12 @@ BEGIN POPUP "&Fil" BEGIN MENUITEM "&Ny...\tCtrl+N", ID_FILE_NEW - MENUITEM "&Ã…pne...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Åpne...\tCtrl+O", ID_FILE_OPEN MENUITEM "&Lagre\tCtrl+S", ID_FILE_SAVE MENUITEM "Lagre &som...", ID_FILE_SAVEAS MENUITEM SEPARATOR MENUITEM "&Skriv ut...\tCtrl+P", ID_PRINT - MENUITEM "&ForhÃ¥ndsvisning...", ID_PREVIEW + MENUITEM "&Forhåndsvisning...", ID_PREVIEW MENUITEM "&Utskriftformat...", ID_PRINTSETUP MENUITEM SEPARATOR MENUITEM "&Avslutt", ID_FILE_EXIT @@ -48,8 +44,8 @@ BEGIN MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR MENUITEM "&Merk alt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Søk etter...\tCrtl+F", ID_FIND - MENUITEM "Søk etter &neste\tF3", ID_FIND_NEXT + MENUITEM "&Søk etter...\tCrtl+F", ID_FIND + MENUITEM "Søk etter &neste\tF3", ID_FIND_NEXT MENUITEM "E&rstatt...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR MENUITEM "S&krivebeskyttet", ID_EDIT_READONLY @@ -57,7 +53,7 @@ BEGIN MENUITEM SEPARATOR POPUP "&Ekstra" BEGIN - MENUITEM "&Info om merket omrÃ¥de", ID_EDIT_SELECTIONINFO + MENUITEM "&Info om merket område", ID_EDIT_SELECTIONINFO MENUITEM "Tegn&format", ID_EDIT_CHARFORMAT MENUITEM "Stan&dard tegnformat", ID_EDIT_DEFCHARFORMAT MENUITEM "&Avsnittformat", ID_EDIT_PARAFORMAT @@ -66,7 +62,7 @@ BEGIN END POPUP "&Vis" BEGIN - MENUITEM "Verk&tøylinje", ID_TOGGLE_TOOLBAR + MENUITEM "Verk&tøylinje", ID_TOGGLE_TOOLBAR MENUITEM "&Formatlinje", ID_TOGGLE_FORMATBAR MENUITEM "&Linjal", ID_TOGGLE_RULER MENUITEM "&Statuslinje", ID_TOGGLE_STATUSBAR @@ -138,9 +134,9 @@ BEGIN GROUPBOX "Innrykk", -1, 10, 10, 120, 68 LTEXT "Venstre", -1, 15, 22, 40, 13 EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 - LTEXT "Høyre", -1, 15, 40, 40, 13 + LTEXT "Høyre", -1, 15, 40, 40, 13 EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 - LTEXT "Første linje", -1, 15, 58, 40, 13 + LTEXT "Første linje", -1, 15, 58, 40, 13 EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 LTEXT "Justering", -1, 15, 87, 40, 13 COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST @@ -171,8 +167,8 @@ BEGIN RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15 RADIOBUTTON "Bryt tekst etter v&indusbredden", IDC_PAGEFMT_WW, 18, 45, 117, 15 RADIOBUTTON "Bryt tekst etter &margen", IDC_PAGEFMT_WM, 18, 65, 117, 15 - GROUPBOX "Verktøylinjer", -1, 150, 10, 120, 85 - CHECKBOX "&Verktøylinje", IDC_PAGEFMT_TB, 160, 20, 80, 15 + GROUPBOX "Verktøylinjer", -1, 150, 10, 120, 85 + CHECKBOX "&Verktøylinje", IDC_PAGEFMT_TB, 160, 20, 80, 15 CHECKBOX "&Formatlinje", IDC_PAGEFMT_FB, 160, 38, 80, 15 CHECKBOX "&Linjal", IDC_PAGEFMT_RU, 160, 56, 80, 15 CHECKBOX "&Statuslinje", IDC_PAGEFMT_SB, 160, 74, 80, 15 @@ -197,7 +193,7 @@ END STRINGTABLE DISCARDABLE BEGIN STRING_ALIGN_LEFT, "Venstrestilt" - STRING_ALIGN_RIGHT, "Høyrestilt" + STRING_ALIGN_RIGHT, "Høyrestilt" STRING_ALIGN_CENTER, "Midtstilt" END @@ -219,7 +215,7 @@ BEGIN STRING_PREVIEW_NEXTPAGE, "Neste side" STRING_PREVIEW_PREVPAGE, "Forrige side" STRING_PREVIEW_TWOPAGES, "To sider" - STRING_PREVIEW_ONEPAGE, "Én side" + STRING_PREVIEW_ONEPAGE, "Én side" STRING_PREVIEW_CLOSE, "Lukk" END @@ -231,18 +227,16 @@ END STRINGTABLE DISCARDABLE BEGIN STRING_DEFAULT_FILENAME, "Dokument" - STRING_PROMPT_SAVE_CHANGES, "Lagre endringer i «%s»?" - STRING_SEARCH_FINISHED, "Ferdig med Ã¥ søke i dokumentet." + STRING_PROMPT_SAVE_CHANGES, "Lagre endringer i «%s»?" + STRING_SEARCH_FINISHED, "Ferdig med å søke i dokumentet." STRING_LOAD_RICHED_FAILED, "Klarte ikke laste RichEdit-biblioteket." - STRING_SAVE_LOSEFORMATTING, "Du har valgt Ã¥ lagre i rent tekstformat, noe som " \ - "vil føre til at all formatering gÃ¥r tapt. Er du " \ - "sikker pÃ¥ at du vil fortsette?" + STRING_SAVE_LOSEFORMATTING, "Du har valgt å lagre i rent tekstformat, noe som " \ + "vil føre til at all formatering går tapt. Er du " \ + "sikker på at du vil fortsette?" STRING_INVALID_NUMBER, "Ugyldig tallformat" STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage documents are not supported" STRING_WRITE_FAILED, "Klarte ikke lagre filen." - STRING_WRITE_ACCESS_DENIED, "Du har ikke tilgang til Ã¥ lagre filen." - STRING_OPEN_FAILED, "Klarte ikke Ã¥pne filen." - STRING_OPEN_ACCESS_DENIED, "Du har ikke tilgang til Ã¥ Ã¥pne filen." - STRING_PRINTING_NOT_IMPLEMENTED, "Utskriftfunksjonen er ikke laget ennÃ¥." - STRING_MAX_TAB_STOPS, "Kan ikke legge til mer enn 32 tabulatorstopp." + STRING_WRITE_ACCESS_DENIED, "Du har ikke tilgang til å lagre filen." + STRING_OPEN_FAILED, "Klarte ikke åpne filen." + STRING_OPEN_ACCESS_DENIED, "Du har ikke tilgang til å åpne filen." END diff --git a/reactos/base/applications/wordpad/Pl.rc b/reactos/base/applications/wordpad/Pl.rc index ab72104e5d0..47ff1bd0e3f 100644 --- a/reactos/base/applications/wordpad/Pl.rc +++ b/reactos/base/applications/wordpad/Pl.rc @@ -17,8 +17,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_POLISH, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Pt.rc b/reactos/base/applications/wordpad/Pt.rc index f8d7df2f889..b246c700bcd 100644 --- a/reactos/base/applications/wordpad/Pt.rc +++ b/reactos/base/applications/wordpad/Pt.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Ru.rc b/reactos/base/applications/wordpad/Ru.rc index 6428f7b1a0d..e4371993991 100644 --- a/reactos/base/applications/wordpad/Ru.rc +++ b/reactos/base/applications/wordpad/Ru.rc @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc index 1b6d37fd41c..5e349580a24 100644 --- a/reactos/base/applications/wordpad/Si.rc +++ b/reactos/base/applications/wordpad/Si.rc @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - #pragma code_page(65001) LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT @@ -247,3 +245,5 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Tiskanje (Å¡e) ni na voljo" STRING_MAX_TAB_STOPS, "Ne morem vstaviti veÄ kot 32 položajev tabulatorja." END + +#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Sv.rc b/reactos/base/applications/wordpad/Sv.rc index d94e6e3d190..4bb2ae24557 100644 --- a/reactos/base/applications/wordpad/Sv.rc +++ b/reactos/base/applications/wordpad/Sv.rc @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL #pragma code_page(65001) @@ -246,3 +244,5 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Utskrift ej implementerat." STRING_MAX_TAB_STOPS, "Kan ej lägga till mer än 32 tabbstopp." END + +#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Tr.rc b/reactos/base/applications/wordpad/Tr.rc index 92290371d37..7df9a36fb7a 100644 --- a/reactos/base/applications/wordpad/Tr.rc +++ b/reactos/base/applications/wordpad/Tr.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE diff --git a/reactos/base/applications/wordpad/Zh.rc b/reactos/base/applications/wordpad/Zh.rc index d8ceec43a1a..5c11ab79963 100644 --- a/reactos/base/applications/wordpad/Zh.rc +++ b/reactos/base/applications/wordpad/Zh.rc @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "wordpad.h" - /* Chinese text is encoded in UTF-8 */ #pragma code_page(65001) @@ -471,3 +469,5 @@ BEGIN STRING_OPEN_FAILED, "ä¸èƒ½é–‹å•Ÿæª”案." STRING_OPEN_ACCESS_DENIED, "你沒有開啟檔案的權力." END + +#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc index ac159da8916..1a77fe27be1 100644 --- a/reactos/base/applications/wordpad/rsrc.rc +++ b/reactos/base/applications/wordpad/rsrc.rc @@ -17,6 +17,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include +#include + #include "wordpad.h" MAINACCELTABLE ACCELERATORS @@ -60,3 +63,20 @@ IDI_WRI ICON "wri.ico" /* @makedep: txt.ico */ IDI_TXT ICON "txt.ico" + +#include "Da.rc" +#include "De.rc" +#include "En.rc" +#include "Fr.rc" +#include "Hu.rc" +#include "Ja.rc" +#include "Ko.rc" +#include "Nl.rc" +#include "No.rc" +#include "Pl.rc" +#include "Pt.rc" +#include "Ru.rc" +#include "Si.rc" +#include "Sv.rc" +#include "Tr.rc" +#include "Zh.rc" diff --git a/reactos/base/applications/wordpad/wordpad.h b/reactos/base/applications/wordpad/wordpad.h index 6d3e64ab4c7..ece183fc1c2 100644 --- a/reactos/base/applications/wordpad/wordpad.h +++ b/reactos/base/applications/wordpad/wordpad.h @@ -17,9 +17,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include - #define MAX_STRING_LEN 255 #define TWIPS_PER_INCH 1440 From 2b1fbadac000dd057bb5fab42bd158a2cb67fa59 Mon Sep 17 00:00:00 2001 From: Benedikt Freisen Date: Fri, 10 Jul 2009 18:21:27 +0000 Subject: [PATCH 302/577] - During resizing the future size is shown in the status bar - Rubber works as color replacer when used with right mouse button (mouse handling code reorganized) - Bug occuring when painting to neg. coordinates finally fixed - Polygon-tool added - Bezier-tool added svn path=/trunk/; revision=41851 --- reactos/base/applications/paint/drawing.c | 56 +++- reactos/base/applications/paint/drawing.h | 12 +- reactos/base/applications/paint/globalvar.h | 5 + reactos/base/applications/paint/mouse.c | 315 ++++++++++++++---- reactos/base/applications/paint/mouse.h | 12 +- reactos/base/applications/paint/sizebox.c | 31 +- .../base/applications/paint/toolsettings.c | 10 +- reactos/base/applications/paint/winproc.c | 19 +- 8 files changed, 356 insertions(+), 104 deletions(-) diff --git a/reactos/base/applications/paint/drawing.c b/reactos/base/applications/paint/drawing.c index b7a787cd291..2bae28bce53 100644 --- a/reactos/base/applications/paint/drawing.c +++ b/reactos/base/applications/paint/drawing.c @@ -20,13 +20,13 @@ void Line(HDC hdc, short x1, short y1, short x2, short y2, int color, int thickn DeleteObject(SelectObject(hdc, oldPen)); } -void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled) +void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style) { HBRUSH oldBrush; LOGBRUSH logbrush; HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, fg)); - if (filled) logbrush.lbStyle = BS_SOLID; else logbrush.lbStyle = BS_HOLLOW; - logbrush.lbColor = bg; + if (style==0) logbrush.lbStyle = BS_HOLLOW; else logbrush.lbStyle = BS_SOLID; + if (style==2) logbrush.lbColor = fg; else logbrush.lbColor = bg; logbrush.lbHatch = 0; oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush)); Rectangle(hdc, x1, y1, x2, y2); @@ -34,13 +34,13 @@ void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int t DeleteObject(SelectObject(hdc, oldPen)); } -void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled) +void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style) { HBRUSH oldBrush; LOGBRUSH logbrush; HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, fg)); - if (filled) logbrush.lbStyle = BS_SOLID; else logbrush.lbStyle = BS_HOLLOW; - logbrush.lbColor = bg; + if (style==0) logbrush.lbStyle = BS_HOLLOW; else logbrush.lbStyle = BS_SOLID; + if (style==2) logbrush.lbColor = fg; else logbrush.lbColor = bg; logbrush.lbHatch = 0; oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush)); Ellipse(hdc, x1, y1, x2, y2); @@ -48,13 +48,13 @@ void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int t DeleteObject(SelectObject(hdc, oldPen)); } -void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled) +void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style) { LOGBRUSH logbrush; HBRUSH oldBrush; HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, fg)); - if (filled) logbrush.lbStyle = BS_SOLID; else logbrush.lbStyle = BS_HOLLOW; - logbrush.lbColor = bg; + if (style==0) logbrush.lbStyle = BS_HOLLOW; else logbrush.lbStyle = BS_SOLID; + if (style==2) logbrush.lbColor = fg; else logbrush.lbColor = bg; logbrush.lbHatch = 0; oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush)); RoundRect(hdc, x1, y1, x2, y2, 16, 16); @@ -62,6 +62,35 @@ void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int DeleteObject(SelectObject(hdc, oldPen)); } +void Poly(HDC hdc, POINT *lpPoints, int nCount, int fg, int bg, int thickness, int style, BOOL closed) +{ + LOGBRUSH logbrush; + HBRUSH oldBrush; + HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, fg)); + if (style==0) logbrush.lbStyle = BS_HOLLOW; else logbrush.lbStyle = BS_SOLID; + if (style==2) logbrush.lbColor = fg; else logbrush.lbColor = bg; + logbrush.lbHatch = 0; + oldBrush = SelectObject(hdc, CreateBrushIndirect(&logbrush)); + if (closed) + Polygon(hdc, lpPoints, nCount); + else + Polyline(hdc, lpPoints, nCount); + DeleteObject(SelectObject(hdc, oldBrush)); + DeleteObject(SelectObject(hdc, oldPen)); +} + +void Bezier(HDC hdc, POINT p1, POINT p2, POINT p3, POINT p4, int color, int thickness) +{ + POINT fourPoints[4]; + fourPoints[0] = p1; + fourPoints[1] = p2; + fourPoints[2] = p3; + fourPoints[3] = p4; + HPEN oldPen = SelectObject(hdc, CreatePen(PS_SOLID, thickness, color)); + PolyBezier(hdc, fourPoints, 4); + DeleteObject(SelectObject(hdc, oldPen)); +} + void Fill(HDC hdc, int x, int y, int color) { HBRUSH oldBrush = SelectObject(hdc, CreateSolidBrush(color)); @@ -81,6 +110,15 @@ void Erase(HDC hdc, short x1, short y1, short x2, short y2, int color, int radiu DeleteObject(SelectObject(hdc, oldPen)); } +void Replace(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int radius) +{ + short a, x, y; + for (a=0; a<=100; a++) + for (y=(y1*(100-a)+y2*a)/100-radius+1; y<(y1*(100-a)+y2*a)/100+radius+1; y++) + for (x=(x1*(100-a)+x2*a)/100-radius+1; x<(x1*(100-a)+x2*a)/100+radius+1; x++) + if (GetPixel(hdc, x, y)==fg) SetPixel(hdc, x, y, bg); +} + void Airbrush(HDC hdc, short x, short y, int color, int r) { short a; diff --git a/reactos/base/applications/paint/drawing.h b/reactos/base/applications/paint/drawing.h index 5b3390e6eba..71671d93384 100644 --- a/reactos/base/applications/paint/drawing.h +++ b/reactos/base/applications/paint/drawing.h @@ -8,16 +8,22 @@ void Line(HDC hdc, short x1, short y1, short x2, short y2, int color, int thickness); -void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled); +void Rect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style); -void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled); +void Ellp(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style); -void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, BOOL filled); +void RRect(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int thickness, int style); + +void Poly(HDC hdc, POINT *lpPoints, int nCount, int fg, int bg, int thickness, int style, BOOL closed); + +void Bezier(HDC hdc, POINT p1, POINT p2, POINT p3, POINT p4, int color, int thickness); void Fill(HDC hdc, int x, int y, int color); void Erase(HDC hdc, short x1, short y1, short x2, short y2, int color, int radius); +void Replace(HDC hdc, short x1, short y1, short x2, short y2, int fg, int bg, int radius); + void Airbrush(HDC hdc, short x, short y, int color, int r); void Brush(HDC hdc, short x1, short y1, short x2, short y2, int color, int style); diff --git a/reactos/base/applications/paint/globalvar.h b/reactos/base/applications/paint/globalvar.h index a0df72fa065..b864586a169 100644 --- a/reactos/base/applications/paint/globalvar.h +++ b/reactos/base/applications/paint/globalvar.h @@ -85,3 +85,8 @@ extern HWND hSizeboxRightCenter; extern HWND hSizeboxLeftBottom; extern HWND hSizeboxCenterBottom; extern HWND hSizeboxRightBottom; + +/* VARIABLES declared in mouse.c *************************************/ + +extern POINT pointStack[256]; +extern short pointSP; diff --git a/reactos/base/applications/paint/mouse.c b/reactos/base/applications/paint/mouse.c index 61aef297fb6..5328c796525 100644 --- a/reactos/base/applications/paint/mouse.c +++ b/reactos/base/applications/paint/mouse.c @@ -23,37 +23,70 @@ void placeSelWin() //SendMessage(hSelection, WM_PAINT, 0, 0); } -void startPainting(HDC hdc, short x, short y, int fg, int bg) +POINT pointStack[256]; +short pointSP; + +void startPaintingL(HDC hdc, short x, short y, int fg, int bg) { startX = x; startY = y; lastX = x; lastY = y; - if ((activeTool!=5)&&(activeTool!=6)) newReversible(); switch (activeTool) { + case 1: + case 10: + case 11: + case 15: + case 16: + newReversible(); case 2: + newReversible(); ShowWindow(hSelection, SW_HIDE); break; case 3: + newReversible(); Erase(hdc, x, y, x, y, bg, rubberRadius); break; case 4: + newReversible(); Fill(hdc, x, y, fg); break; case 7: + newReversible(); SetPixel(hdc, x, y, fg); break; case 8: + newReversible(); Brush(hdc, x, y, x, y, fg, brushStyle); break; case 9: + newReversible(); Airbrush(hdc, x, y, fg, airBrushWidth); break; + case 12: + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + if (pointSP==0) + { + newReversible(); + pointSP++; + } + break; + case 14: + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + if (pointSP+1>=2) Poly(hdc, pointStack, pointSP+1, fg, bg, lineWidth, shapeStyle, FALSE); + if (pointSP==0) + { + newReversible(); + pointSP++; + } + break; } } -void whilePainting(HDC hdc, short x, short y, int fg, int bg) +void whilePaintingL(HDC hdc, short x, short y, int fg, int bg) { switch (activeTool) { @@ -87,50 +120,34 @@ void whilePainting(HDC hdc, short x, short y, int fg, int bg) resetToU1(); Line(hdc, startX, startY, x, y, fg, lineWidth); break; + case 12: + resetToU1(); + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + switch (pointSP) + { + case 1: Line(hdc, pointStack[0].x, pointStack[0].y, pointStack[1].x, pointStack[1].y, fg, lineWidth); break; + case 2: Bezier(hdc, pointStack[0], pointStack[2], pointStack[2], pointStack[1], fg, lineWidth); break; + case 3: Bezier(hdc, pointStack[0], pointStack[2], pointStack[3], pointStack[1], fg, lineWidth); break; + } + break; case 13: resetToU1(); - switch (shapeStyle) - { - case 0: - Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE); - break; - case 1: - Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE); - break; - case 2: - Rect(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE); - break; - } + Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); + break; + case 14: + resetToU1(); + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + if (pointSP+1>=2) Poly(hdc, pointStack, pointSP+1, fg, bg, lineWidth, shapeStyle, FALSE); break; case 15: resetToU1(); - switch (shapeStyle) - { - case 0: - Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE); - break; - case 1: - Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE); - break; - case 2: - Ellp(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE); - break; - } + Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 16: resetToU1(); - switch (shapeStyle) - { - case 0: - RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE); - break; - case 1: - RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE); - break; - case 2: - RRect(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE); - break; - } + RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; } @@ -138,7 +155,7 @@ void whilePainting(HDC hdc, short x, short y, int fg, int bg) lastY = y; } -void endPainting(HDC hdc, short x, short y, int fg, int bg) +void endPaintingL(HDC hdc, short x, short y, int fg, int bg) { switch (activeTool) { @@ -163,50 +180,204 @@ void endPainting(HDC hdc, short x, short y, int fg, int bg) resetToU1(); Line(hdc, startX, startY, x, y, fg, lineWidth); break; + case 12: + pointSP++; + if (pointSP==4) pointSP = 0; + break; case 13: resetToU1(); - switch (shapeStyle) + Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); + break; + case 14: + resetToU1(); + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + pointSP++; + if (pointSP>=2) { - case 0: - Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE); - break; - case 1: - Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE); - break; - case 2: - Rect(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE); - break; + if ( (pointStack[0].x-x)*(pointStack[0].x-x) + (pointStack[0].y-y)*(pointStack[0].y-y) <= lineWidth*lineWidth+1) + { + Poly(hdc, pointStack, pointSP, fg, bg, lineWidth, shapeStyle, TRUE); + pointSP = 0; + } + else + { + Poly(hdc, pointStack, pointSP, fg, bg, lineWidth, shapeStyle, FALSE); + } } + if (pointSP==255) pointSP--; break; case 15: resetToU1(); - switch (shapeStyle) - { - case 0: - Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE); - break; - case 1: - Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE); - break; - case 2: - Ellp(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE); - break; - } + Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 16: resetToU1(); - switch (shapeStyle) + RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); + break; + } +} + +void startPaintingR(HDC hdc, short x, short y, int fg, int bg) +{ + startX = x; + startY = y; + lastX = x; + lastY = y; + switch (activeTool) + { + case 1: + case 10: + case 11: + case 15: + case 16: + newReversible(); + case 3: + newReversible(); + Replace(hdc, x, y, x, y, fg, bg, rubberRadius); + break; + case 4: + newReversible(); + Fill(hdc, x, y, bg); + break; + case 7: + newReversible(); + SetPixel(hdc, x, y, bg); + break; + case 8: + newReversible(); + Brush(hdc, x, y, x, y, bg, brushStyle); + break; + case 9: + newReversible(); + Airbrush(hdc, x, y, bg, airBrushWidth); + break; + case 12: + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + if (pointSP==0) { - case 0: - RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, FALSE); - break; - case 1: - RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, TRUE); - break; - case 2: - RRect(hdc, startX, startY, x, y, fg, fg, lineWidth, TRUE); - break; + newReversible(); + pointSP++; + } + break; + case 14: + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + if (pointSP+1>=2) Poly(hdc, pointStack, pointSP+1, bg, fg, lineWidth, shapeStyle, FALSE); + if (pointSP==0) + { + newReversible(); + pointSP++; } break; } } + +void whilePaintingR(HDC hdc, short x, short y, int fg, int bg) +{ + switch (activeTool) + { + case 3: + Replace(hdc, lastX, lastY, x, y, fg, bg, rubberRadius); + break; + case 7: + Line(hdc, lastX, lastY, x, y, bg, 1); + break; + case 8: + Brush(hdc, lastX, lastY, x, y, bg, brushStyle); + break; + case 9: + Airbrush(hdc, x, y, bg, airBrushWidth); + break; + case 11: + resetToU1(); + Line(hdc, startX, startY, x, y, bg, lineWidth); + break; + case 12: + resetToU1(); + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + switch (pointSP) + { + case 1: Line(hdc, pointStack[0].x, pointStack[0].y, pointStack[1].x, pointStack[1].y, bg, lineWidth); break; + case 2: Bezier(hdc, pointStack[0], pointStack[2], pointStack[2], pointStack[1], bg, lineWidth); break; + case 3: Bezier(hdc, pointStack[0], pointStack[2], pointStack[3], pointStack[1], bg, lineWidth); break; + } + break; + case 13: + resetToU1(); + Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); + break; + case 14: + resetToU1(); + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + if (pointSP+1>=2) Poly(hdc, pointStack, pointSP+1, bg, fg, lineWidth, shapeStyle, FALSE); + break; + case 15: + resetToU1(); + Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); + break; + case 16: + resetToU1(); + RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); + break; + } + + lastX = x; + lastY = y; +} + +void endPaintingR(HDC hdc, short x, short y, int fg, int bg) +{ + switch (activeTool) + { + case 3: + Replace(hdc, lastX, lastY, x, y, fg, bg, rubberRadius); + break; + case 7: + Line(hdc, lastX, lastY, x, y, bg, 1); + SetPixel(hdc, x, y, bg); + break; + case 11: + resetToU1(); + Line(hdc, startX, startY, x, y, bg, lineWidth); + break; + case 12: + pointSP++; + if (pointSP==4) pointSP = 0; + break; + case 13: + resetToU1(); + Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); + break; + case 14: + resetToU1(); + pointStack[pointSP].x = x; + pointStack[pointSP].y = y; + pointSP++; + if (pointSP>=2) + { + if ( (pointStack[0].x-x)*(pointStack[0].x-x) + (pointStack[0].y-y)*(pointStack[0].y-y) <= lineWidth*lineWidth+1) + { + Poly(hdc, pointStack, pointSP, bg, fg, lineWidth, shapeStyle, TRUE); + pointSP = 0; + } + else + { + Poly(hdc, pointStack, pointSP, bg, fg, lineWidth, shapeStyle, FALSE); + } + } + if (pointSP==255) pointSP--; + break; + case 15: + resetToU1(); + Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); + break; + case 16: + resetToU1(); + RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); + break; + } +} diff --git a/reactos/base/applications/paint/mouse.h b/reactos/base/applications/paint/mouse.h index c7223e2228a..878715efa21 100644 --- a/reactos/base/applications/paint/mouse.h +++ b/reactos/base/applications/paint/mouse.h @@ -8,8 +8,14 @@ void placeSelWin(); -void startPainting(HDC hdc, short x, short y, int fg, int bg); +void startPaintingL(HDC hdc, short x, short y, int fg, int bg); -void whilePainting(HDC hdc, short x, short y, int fg, int bg); +void whilePaintingL(HDC hdc, short x, short y, int fg, int bg); -void endPainting(HDC hdc, short x, short y, int fg, int bg); +void endPaintingL(HDC hdc, short x, short y, int fg, int bg); + +void startPaintingR(HDC hdc, short x, short y, int fg, int bg); + +void whilePaintingR(HDC hdc, short x, short y, int fg, int bg); + +void endPaintingR(HDC hdc, short x, short y, int fg, int bg); diff --git a/reactos/base/applications/paint/sizebox.c b/reactos/base/applications/paint/sizebox.c index 8324123e8fd..60d0a033189 100644 --- a/reactos/base/applications/paint/sizebox.c +++ b/reactos/base/applications/paint/sizebox.c @@ -9,10 +9,10 @@ /* INCLUDES *********************************************************/ #include +#include +#include #include "globalvar.h" -#include "drawing.h" #include "history.h" -#include "mouse.h" /* FUNCTIONS ********************************************************/ @@ -43,7 +43,31 @@ LRESULT CALLBACK SizeboxWinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM SetCapture(hwnd); break; case WM_MOUSEMOVE: - // TODO: print things in the status bar + if (resizing) + { + TCHAR sizeStr[100]; + short xRel; + short yRel; + xRel = ((short)LOWORD(lParam)-xOrig)*1000/zoom; + yRel = ((short)HIWORD(lParam)-yOrig)*1000/zoom; + if (hwnd==hSizeboxLeftTop) + _stprintf(sizeStr, _T("%d x %d"), imgXRes-xRel, imgYRes-yRel); + if (hwnd==hSizeboxCenterTop) + _stprintf(sizeStr, _T("%d x %d"), imgXRes, imgYRes-yRel); + if (hwnd==hSizeboxRightTop) + _stprintf(sizeStr, _T("%d x %d"), imgXRes+xRel, imgYRes-yRel); + if (hwnd==hSizeboxLeftCenter) + _stprintf(sizeStr, _T("%d x %d"), imgXRes-xRel, imgYRes); + if (hwnd==hSizeboxRightCenter) + _stprintf(sizeStr, _T("%d x %d"), imgXRes+xRel, imgYRes); + if (hwnd==hSizeboxLeftBottom) + _stprintf(sizeStr, _T("%d x %d"), imgXRes-xRel, imgYRes+yRel); + if (hwnd==hSizeboxCenterBottom) + _stprintf(sizeStr, _T("%d x %d"), imgXRes, imgYRes+yRel); + if (hwnd==hSizeboxRightBottom) + _stprintf(sizeStr, _T("%d x %d"), imgXRes+xRel, imgYRes+yRel); + SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM)sizeStr); + } break; case WM_LBUTTONUP: if (resizing) @@ -70,6 +94,7 @@ LRESULT CALLBACK SizeboxWinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM cropReversible(imgXRes, imgYRes+yRel, 0, 0); if (hwnd==hSizeboxRightBottom) cropReversible(imgXRes+xRel, imgYRes+yRel, 0, 0); + SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM)_T("")); } break; diff --git a/reactos/base/applications/paint/toolsettings.c b/reactos/base/applications/paint/toolsettings.c index b5141eb7c64..8f7de9eb1d3 100644 --- a/reactos/base/applications/paint/toolsettings.c +++ b/reactos/base/applications/paint/toolsettings.c @@ -148,14 +148,14 @@ LRESULT CALLBACK SettingsWinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM } } if (shapeStyle==0) - Rect(hdc, 5, 6, 37, 16, GetSysColor(COLOR_HIGHLIGHTTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, FALSE); + Rect(hdc, 5, 6, 37, 16, GetSysColor(COLOR_HIGHLIGHTTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 0); else - Rect(hdc, 5, 6, 37, 16, GetSysColor(COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, FALSE); + Rect(hdc, 5, 6, 37, 16, GetSysColor(COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 0); if (shapeStyle==1) - Rect(hdc, 5, 26, 37, 36, GetSysColor(COLOR_HIGHLIGHTTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, TRUE); + Rect(hdc, 5, 26, 37, 36, GetSysColor(COLOR_HIGHLIGHTTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 1); else - Rect(hdc, 5, 26, 37, 36, GetSysColor(COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, TRUE); - Rect(hdc, 5, 46, 37, 56, GetSysColor(COLOR_APPWORKSPACE), GetSysColor(COLOR_APPWORKSPACE), 1, TRUE); + Rect(hdc, 5, 26, 37, 36, GetSysColor(COLOR_WINDOWTEXT), GetSysColor(COLOR_APPWORKSPACE), 1, 1); + Rect(hdc, 5, 46, 37, 56, GetSysColor(COLOR_APPWORKSPACE), GetSysColor(COLOR_APPWORKSPACE), 1, 1); for (i=0; i<5; i++) { if (lineWidth==i+1) diff --git a/reactos/base/applications/paint/winproc.c b/reactos/base/applications/paint/winproc.c index 0160bf690e4..4e72294a99b 100644 --- a/reactos/base/applications/paint/winproc.c +++ b/reactos/base/applications/paint/winproc.c @@ -29,6 +29,7 @@ void selectTool(int tool) { ShowWindow(hSelection, SW_HIDE); activeTool = tool; + pointSP = 0; // resets the point-buffer of the polygon and bezier functions SendMessage(hToolSettings, WM_PAINT, 0, 0); } @@ -354,7 +355,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM { SetCapture(hImageArea); drawing = TRUE; - startPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor); + startPaintingL(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor); }else { SendMessage(hwnd, WM_LBUTTONUP, wParam, lParam); @@ -371,7 +372,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM { SetCapture(hImageArea); drawing = TRUE; - startPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor); + startPaintingR(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor); }else { SendMessage(hwnd, WM_RBUTTONUP, wParam, lParam); @@ -386,7 +387,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM { ReleaseCapture(); drawing = FALSE; - endPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor); + endPaintingL(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor); SendMessage(hImageArea, WM_PAINT, 0, 0); if (activeTool==5) { @@ -402,7 +403,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM { ReleaseCapture(); drawing = FALSE; - endPainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor); + endPaintingR(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor); SendMessage(hImageArea, WM_PAINT, 0, 0); if (activeTool==5) { @@ -426,7 +427,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM { if ((wParam&MK_LBUTTON)!=0) { - whilePainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, fgColor, bgColor); + whilePaintingL(hDrawingDC, (short)LOWORD(lParam)*1000/zoom, (short)HIWORD(lParam)*1000/zoom, fgColor, bgColor); SendMessage(hImageArea, WM_PAINT, 0, 0); if ((activeTool>=10)||(activeTool==2)) { @@ -437,7 +438,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM } if ((wParam&MK_RBUTTON)!=0) { - whilePainting(hDrawingDC, LOWORD(lParam)*1000/zoom, HIWORD(lParam)*1000/zoom, bgColor, fgColor); + whilePaintingR(hDrawingDC, (short)LOWORD(lParam)*1000/zoom, (short)HIWORD(lParam)*1000/zoom, fgColor, bgColor); SendMessage(hImageArea, WM_PAINT, 0, 0); if (activeTool>=10) { @@ -564,9 +565,9 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM case IDM_EDITSELECTALL: if (activeTool==2) { - startPainting(hDrawingDC, 0, 0, fgColor, bgColor); - whilePainting(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); - endPainting(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); + startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); + endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); } break; case IDM_EDITCOPYTO: From 8cda4903ab82ef869f138ba656330df8db5dcbc2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 10 Jul 2009 21:32:02 +0000 Subject: [PATCH 303/577] - Fix more global variable abuse - Fix some inaccurate cur_time values svn path=/trunk/; revision=41852 --- reactos/base/services/dhcp/dhclient.c | 51 ++++++++++++-------- reactos/base/services/dhcp/dispatch.c | 8 ++- reactos/base/services/dhcp/include/rosdhcp.h | 2 + 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/reactos/base/services/dhcp/dhclient.c b/reactos/base/services/dhcp/dhclient.c index c92900d273a..ac559a2565d 100644 --- a/reactos/base/services/dhcp/dhclient.c +++ b/reactos/base/services/dhcp/dhclient.c @@ -72,8 +72,6 @@ #define domainchar(c) ((c) > 0x20 && (c) < 0x7f) unsigned long debug_trace_level = 0; /* DEBUG_ULTRA */ -time_t cur_time; -time_t default_lease_time = 43200; /* 12 hours... */ char *path_dhclient_conf = _PATH_DHCLIENT_CONF; char *path_dhclient_db = NULL; @@ -85,7 +83,6 @@ int privfd; struct iaddr iaddr_broadcast = { 4, { 255, 255, 255, 255 } }; struct in_addr inaddr_any; struct sockaddr_in sockaddr_broadcast; -unsigned long old_default_route = 0; /* * ASSERT_STATE() does nothing now; it used to be @@ -139,7 +136,6 @@ main(int argc, char *argv[]) PipeInit(); tzset(); - time(&cur_time); memset(&sockaddr_broadcast, 0, sizeof(sockaddr_broadcast)); sockaddr_broadcast.sin_family = AF_INET; @@ -249,7 +245,7 @@ state_reboot(void *ipp) flags. */ make_request(ip, ip->client->active); ip->client->destination = iaddr_broadcast; - ip->client->first_sending = cur_time; + time(&ip->client->first_sending); ip->client->interval = ip->client->config->initial_interval; /* Zap the medium list... */ @@ -276,7 +272,7 @@ state_init(void *ipp) ip->client->xid = ip->client->packet.xid; ip->client->destination = iaddr_broadcast; ip->client->state = S_SELECTING; - ip->client->first_sending = cur_time; + time(&ip->client->first_sending); ip->client->interval = ip->client->config->initial_interval; /* Add an immediate timeout to cause the first DHCPDISCOVER packet @@ -293,9 +289,12 @@ state_selecting(void *ipp) { struct interface_info *ip = ipp; struct client_lease *lp, *next, *picked; + time_t cur_time; ASSERT_STATE(state, S_SELECTING); + time(&cur_time); + /* Cancel state_selecting and send_discover timeouts, since either one could have got us here. */ cancel_timeout(state_selecting, ip); @@ -371,6 +370,9 @@ dhcpack(struct packet *packet) { struct interface_info *ip = packet->interface; struct client_lease *lease; + time_t cur_time; + + time(&cur_time); /* If we're not receptive to an offer right now, or if the offer has an unrecognizable transaction id, then just drop it. */ @@ -404,7 +406,7 @@ dhcpack(struct packet *packet) ip->client->new->expiry = getULong( ip->client->new->options[DHO_DHCP_LEASE_TIME].data); else - ip->client->new->expiry = default_lease_time; + ip->client->new->expiry = DHCP_DEFAULT_LEASE_TIME; /* A number that looks negative here is really just very large, because the lease expiry offset is unsigned. */ if (ip->client->new->expiry < 0) @@ -539,28 +541,24 @@ void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) { } if( new_lease->options[DHO_ROUTERS].len ) { - MIB_IPFORWARDROW RouterMib; NTSTATUS Status; - RouterMib.dwForwardDest = 0; /* Default route */ - RouterMib.dwForwardMask = 0; - RouterMib.dwForwardMetric1 = 1; + Adapter->RouterMib.dwForwardDest = 0; /* Default route */ + Adapter->RouterMib.dwForwardMask = 0; + Adapter->RouterMib.dwForwardMetric1 = 1; - if( old_default_route ) { + if( Adapter->RouterMib.dwForwardNextHop ) { /* If we set a default route before, delete it before continuing */ - RouterMib.dwForwardDest = old_default_route; - DeleteIpForwardEntry( &RouterMib ); + DeleteIpForwardEntry( &Adapter->RouterMib ); } - RouterMib.dwForwardNextHop = + Adapter->RouterMib.dwForwardNextHop = *((ULONG*)new_lease->options[DHO_ROUTERS].data); - Status = CreateIpForwardEntry( &RouterMib ); + Status = CreateIpForwardEntry( &Adapter->RouterMib ); if( !NT_SUCCESS(Status) ) warning("CreateIpForwardEntry: %lx\n", Status); - else - old_default_route = RouterMib.dwForwardNextHop; if (hkey) { Buffer[0] = '\0'; @@ -585,6 +583,9 @@ bind_lease(struct interface_info *ip) { PDHCP_ADAPTER Adapter; struct client_lease *new_lease = ip->client->new; + time_t cur_time; + + time(&cur_time); /* Remember the medium. */ ip->client->new->medium = ip->client->medium; @@ -638,7 +639,7 @@ state_bound(void *ipp) } else ip->client->destination = iaddr_broadcast; - ip->client->first_sending = cur_time; + time(&ip->client->first_sending); ip->client->interval = ip->client->config->initial_interval; ip->client->state = S_RENEWING; @@ -711,6 +712,9 @@ dhcpoffer(struct packet *packet) int arp_timeout_needed = 0, stop_selecting; char *name = packet->options[DHO_DHCP_MESSAGE_TYPE].len ? "DHCPOFFER" : "BOOTREPLY"; + time_t cur_time; + + time(&cur_time); /* If we're not receptive to an offer right now, or if the offer has an unrecognizable transaction id, then just drop it. */ @@ -949,9 +953,12 @@ send_discover(void *ipp) { struct interface_info *ip = ipp; int interval, increase = 1; + time_t cur_time; DH_DbgPrint(MID_TRACE,("Doing discover on interface %p\n",ip)); + time(&cur_time); + /* Figure out how long it's been since we started transmitting. */ interval = cur_time - ip->client->first_sending; @@ -1053,9 +1060,12 @@ state_panic(void *ipp) struct interface_info *ip = ipp; struct client_lease *loop = ip->client->active; struct client_lease *lp; + time_t cur_time; note("No DHCPOFFERS received."); + time(&cur_time); + /* We may not have an active lease, but we may have some predefined leases that we can try. */ if (!ip->client->active && ip->client->leases) @@ -1140,6 +1150,9 @@ send_request(void *ipp) struct sockaddr_in destination; struct in_addr from; int interval; + time_t cur_time; + + time(&cur_time); /* Figure out how long it's been since we started transmitting. */ interval = cur_time - ip->client->first_sending; diff --git a/reactos/base/services/dhcp/dispatch.c b/reactos/base/services/dhcp/dispatch.c index cc6575dca7b..967e9fbf470 100644 --- a/reactos/base/services/dhcp/dispatch.c +++ b/reactos/base/services/dhcp/dispatch.c @@ -96,7 +96,7 @@ dispatch(void) int count, i, to_msec, nfds = 0; struct protocol *l; fd_set fds; - time_t howlong; + time_t howlong, cur_time; struct timeval timeval; ApiLock(); @@ -112,6 +112,8 @@ dispatch(void) * a timeout registered, time out the select call then. */ another: + time(&cur_time); + if (timeouts) { struct timeout *t; @@ -183,7 +185,6 @@ dispatch(void) /* Not likely to be transitory... */ if (count == SOCKET_ERROR) { if (errno == EAGAIN || errno == EINTR) { - time(&cur_time); continue; } else { error("poll: %s", strerror(errno)); @@ -191,9 +192,6 @@ dispatch(void) } } - /* Get the current time... */ - time(&cur_time); - i = 0; for (l = protocols; l; l = l->next) { struct interface_info *ip; diff --git a/reactos/base/services/dhcp/include/rosdhcp.h b/reactos/base/services/dhcp/include/rosdhcp.h index 092b877888e..8a88459730e 100644 --- a/reactos/base/services/dhcp/include/rosdhcp.h +++ b/reactos/base/services/dhcp/include/rosdhcp.h @@ -25,6 +25,7 @@ #define DHCP_REBOOT_TIMEOUT 300 #define DHCP_PANIC_TIMEOUT DHCP_REBOOT_TIMEOUT * 3 #define DHCP_BACKOFF_MAX 300 +#define DHCP_DEFAULT_LEASE_TIME 43200 /* 12 hours */ #define _PATH_DHCLIENT_PID "\\systemroot\\system32\\drivers\\etc\\dhclient.pid" typedef void *VOIDPTR; @@ -54,6 +55,7 @@ typedef void (*handler_t) PROTO ((struct packet *)); typedef struct _DHCP_ADAPTER { LIST_ENTRY ListEntry; MIB_IFROW IfMib; + MIB_IPFORWARDROW RouterMib; MIB_IPADDRROW IfAddr; SOCKADDR Address; ULONG NteContext,NteInstance; From 3c8f7c0167c7612d0bcea5b8fb5106909c322f52 Mon Sep 17 00:00:00 2001 From: Jeffrey Morlan Date: Fri, 10 Jul 2009 22:33:18 +0000 Subject: [PATCH 304/577] Rearrange some code in cmd parser, avoiding excessive stack space usage (Bug 4536) svn path=/trunk/; revision=41853 --- reactos/base/shell/cmd/parser.c | 130 +++++++++++++++----------------- 1 file changed, 61 insertions(+), 69 deletions(-) diff --git a/reactos/base/shell/cmd/parser.c b/reactos/base/shell/cmd/parser.c index 1b7a8cf60a8..02cc9980447 100644 --- a/reactos/base/shell/cmd/parser.c +++ b/reactos/base/shell/cmd/parser.c @@ -528,78 +528,14 @@ static PARSED_COMMAND *ParseRem(void) return NULL; } -static PARSED_COMMAND *ParseCommandPart(void) +static DECLSPEC_NOINLINE PARSED_COMMAND *ParseCommandPart(REDIRECTION *RedirList) { TCHAR ParsedLine[CMDLINE_LENGTH]; - TCHAR *Pos; - DWORD TailOffset; PARSED_COMMAND *Cmd; PARSED_COMMAND *(*Func)(void); - REDIRECTION *RedirList = NULL; - int Type; - while (IsSeparator(CurChar)) - { - if (CurChar == _T('\n')) - return NULL; - ParseChar(); - } - - if (!CurChar) - return NULL; - - if (CurChar == _T(':')) - { - /* "Ignore" the rest of the line. - * (Line continuations will still be parsed, though.) */ - while (ParseToken(0, NULL) != TOK_END) - ; - return NULL; - } - - if (CurChar == _T('@')) - { - ParseChar(); - Cmd = cmd_alloc(sizeof(PARSED_COMMAND)); - Cmd->Type = C_QUIET; - Cmd->Next = NULL; - /* @ acts like a unary operator with low precedence, - * so call the top-level parser */ - Cmd->Subcommands = ParseCommandOp(C_OP_LOWEST); - Cmd->Redirections = NULL; - return Cmd; - } - - /* Get the head of the command */ - while (1) - { - Type = ParseToken(_T('('), STANDARD_SEPS); - if (Type == TOK_NORMAL) - { - Pos = _stpcpy(ParsedLine, CurrentToken) + 1; - break; - } - else if (Type == TOK_REDIRECTION) - { - if (!ParseRedirection(&RedirList)) - return NULL; - } - else if (Type == TOK_BEGIN_BLOCK) - { - return ParseBlock(RedirList); - } - else if (Type == TOK_END_BLOCK && !RedirList) - { - return NULL; - } - else - { - ParseError(); - FreeRedirection(RedirList); - return NULL; - } - } - TailOffset = Pos - ParsedLine; + TCHAR *Pos = _stpcpy(ParsedLine, CurrentToken) + 1; + DWORD TailOffset = Pos - ParsedLine; /* Check for special forms */ if ((Func = ParseFor, _tcsicmp(ParsedLine, _T("for")) == 0) || @@ -624,7 +560,7 @@ static PARSED_COMMAND *ParseCommandPart(void) /* Now get the tail */ while (1) { - Type = ParseToken(0, NULL); + int Type = ParseToken(0, NULL); if (Type == TOK_NORMAL) { if (Pos + _tcslen(CurrentToken) >= &ParsedLine[CMDLINE_LENGTH]) @@ -657,12 +593,68 @@ static PARSED_COMMAND *ParseCommandPart(void) return Cmd; } +static PARSED_COMMAND *ParsePrimary(void) +{ + REDIRECTION *RedirList = NULL; + int Type; + + while (IsSeparator(CurChar)) + { + if (CurChar == _T('\n')) + return NULL; + ParseChar(); + } + + if (!CurChar) + return NULL; + + if (CurChar == _T(':')) + { + /* "Ignore" the rest of the line. + * (Line continuations will still be parsed, though.) */ + while (ParseToken(0, NULL) != TOK_END) + ; + return NULL; + } + + if (CurChar == _T('@')) + { + ParseChar(); + PARSED_COMMAND *Cmd = cmd_alloc(sizeof(PARSED_COMMAND)); + Cmd->Type = C_QUIET; + Cmd->Next = NULL; + /* @ acts like a unary operator with low precedence, + * so call the top-level parser */ + Cmd->Subcommands = ParseCommandOp(C_OP_LOWEST); + Cmd->Redirections = NULL; + return Cmd; + } + + /* Process leading redirections and get the head of the command */ + while ((Type = ParseToken(_T('('), STANDARD_SEPS)) == TOK_REDIRECTION) + { + if (!ParseRedirection(&RedirList)) + return NULL; + } + + if (Type == TOK_NORMAL) + return ParseCommandPart(RedirList); + else if (Type == TOK_BEGIN_BLOCK) + return ParseBlock(RedirList); + else if (Type == TOK_END_BLOCK && !RedirList) + return NULL; + + ParseError(); + FreeRedirection(RedirList); + return NULL; +} + static PARSED_COMMAND *ParseCommandOp(int OpType) { PARSED_COMMAND *Cmd, *Left, *Right; if (OpType == C_OP_HIGHEST) - Cmd = ParseCommandPart(); + Cmd = ParsePrimary(); else Cmd = ParseCommandOp(OpType + 1); From a05e363fc98e36821b1438af2131fd021e6b7392 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Fri, 10 Jul 2009 23:13:13 +0000 Subject: [PATCH 305/577] - Don't link portcls and kmixer to the static version rtl -- those routines are exported by ntoskrnl (and all imports were resolved there anyway). svn path=/trunk/; revision=41854 --- reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild | 1 - reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild | 1 - 2 files changed, 2 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild index 0032e58ff0d..cc922a852e8 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild +++ b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild @@ -8,7 +8,6 @@ ntoskrnl ks drmk - rtl hal libcntpr adapter.c diff --git a/reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild b/reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild index ea9ae7d16c3..d5fcf8c3906 100644 --- a/reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild +++ b/reactos/drivers/wdm/audio/filters/kmixer/kmixer.rbuild @@ -5,7 +5,6 @@ . ntoskrnl ks - rtl hal libcntpr libsamplerate From aede9079c60c605fe67358479857cf574b961eab Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 10 Jul 2009 23:44:05 +0000 Subject: [PATCH 306/577] [win32k] Implement brush realization part 1 / 2 - Fix BRUSHOBJ_pvGetRbrush, it's supposed to provide a realization, when there is none. For this reason call ENRUSHOBJ_bRealizeBrush, that will call Eng/DrvRealizeBrush to create a realisation. The old implementation never did this and I wonder how 3rd party display drivers were expected to work correctly without this. - Implement EBRUSHOBJ_pvGetEngBrush working similar to BRUSHOBJ_pvGetRbrush, but providing the engbrush as GDI's realization. It's currently implemented as a handle to a translated pattern and not used anywhere yet. - Rename EBRUSHOBJ_vUnrealizeBrus to EBRUSHOBJ_vCleanup. This function now needs to be called to free the resources for a BRUSHOBJECT that GDI or a driver might have allocated. This is done in DC_Cleanup before deleting the DC and in EBRUSHOBJ_vUpdate before newly initializing it. - Get rid of the EBRUSHOBJ's XlateObject, instead for now create new XLATEOBJ's whenever needed. Don't worry these will be gone, as soon as we make use of the engbrush. - Pass a pointer to the DC to EBRUSHOBJ_vInit, as this allows us to save stuff like the back and fore color. - Fix a bitmap leak: CallDibStretchBlt returned before releasing the reference to the pattern surface. - Some FASTCALL -> NTAPI changes - tested with VBE, VMWare-Tools and VBox driver - I hope I didn't forget anything svn path=/trunk/; revision=41855 --- reactos/subsystems/win32/win32k/eng/bitblt.c | 18 ++- .../subsystems/win32/win32k/eng/engbrush.c | 125 +++++++++++++----- .../subsystems/win32/win32k/eng/stretchblt.c | 21 ++- reactos/subsystems/win32/win32k/eng/xlate.c | 11 +- .../subsystems/win32/win32k/include/brush.h | 20 +-- .../subsystems/win32/win32k/include/inteng.h | 2 +- .../subsystems/win32/win32k/objects/bitblt.c | 6 +- .../subsystems/win32/win32k/objects/dclife.c | 14 +- .../subsystems/win32/win32k/objects/dcobjs.c | 18 ++- 9 files changed, 163 insertions(+), 72 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/bitblt.c b/reactos/subsystems/win32/win32k/eng/bitblt.c index 7272e0fdf17..acd65aab9f7 100644 --- a/reactos/subsystems/win32/win32k/eng/bitblt.c +++ b/reactos/subsystems/win32/win32k/eng/bitblt.c @@ -50,6 +50,7 @@ BltMask(SURFOBJ* psoDest, PFN_DIB_GetPixel fnPattern_GetPixel = NULL; XLATEOBJ *XlateObj; ULONG Pattern = 0; + SURFACE *psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); if (psoMask == NULL) { @@ -78,7 +79,9 @@ BltMask(SURFOBJ* psoDest, fnDest_PutPixel = DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_PutPixel; if (psurfPattern) { - XlateObj = pebo->XlateObject; + XlateObj = IntCreateBrushXlate(pebo->pbrush, + psurfDest, + pebo->crCurrentBack); PatternY = (prclDest->top - pptlBrush->y) % PatternHeight; if (PatternY < 0) { @@ -113,6 +116,9 @@ BltMask(SURFOBJ* psoDest, PatternY++; PatternY %= PatternHeight; } + + if (XlateObj) + EngDeleteXlate(XlateObj); } else { @@ -177,6 +183,8 @@ CallDibBitBlt(SURFOBJ* OutputObj, PEBRUSHOBJ GdiBrush = NULL; SURFACE *psurfPattern; BOOLEAN Result; + SURFACE *psurfDest = CONTAINING_RECORD(OutputObj, SURFACE, SurfObj); + XLATEOBJ *XlatePatternToDest = NULL; BltInfo.DestSurface = OutputObj; BltInfo.SourceSurface = InputObj; @@ -205,7 +213,10 @@ CallDibBitBlt(SURFOBJ* OutputObj, { /* FIXME - What to do here? */ } - BltInfo.XlatePatternToDest = GdiBrush->XlateObject; + XlatePatternToDest = IntCreateBrushXlate(GdiBrush->pbrush, + psurfDest, + GdiBrush->crCurrentBack); + BltInfo.XlatePatternToDest = XlatePatternToDest; } else { @@ -214,6 +225,9 @@ CallDibBitBlt(SURFOBJ* OutputObj, Result = DibFunctionsForBitmapFormat[OutputObj->iBitmapFormat].DIB_BitBlt(&BltInfo); + if (XlatePatternToDest) + EngDeleteXlate(XlatePatternToDest); + /* Pattern brush */ if (psurfPattern != NULL) { diff --git a/reactos/subsystems/win32/win32k/eng/engbrush.c b/reactos/subsystems/win32/win32k/eng/engbrush.c index 21799f0e408..68ffcd1fb94 100644 --- a/reactos/subsystems/win32/win32k/eng/engbrush.c +++ b/reactos/subsystems/win32/win32k/eng/engbrush.c @@ -1,4 +1,4 @@ -/* +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: GDI Driver Brush Functions @@ -34,8 +34,6 @@ EngRealizeBrush( RECTL rclDest; ULONG lWidth; - rclDest = (RECTL){0, 0, psoPattern->sizlBitmap.cx, psoPattern->sizlBitmap.cy}; - /* Calculate width in bytes of the realized brush */ lWidth = DIB_GetDIBWidthBytes(psoPattern->sizlBitmap.cx, BitsPerFormat(psoDst->iBitmapFormat)); @@ -60,6 +58,7 @@ EngRealizeBrush( } /* Copy the bits to the new format bitmap */ + rclDest = (RECTL){0, 0, psoPattern->sizlBitmap.cx, psoPattern->sizlBitmap.cy}; EngCopyBits(psoRealize, psoPattern, NULL, pxlo, &rclDest, &ptlSrc); /* Unlock the bitmap again */ @@ -72,13 +71,27 @@ EngRealizeBrush( } VOID -FASTCALL -EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, XLATEOBJ *pxlo) +NTAPI +EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) { ULONG iSolidColor; + XLATEOBJ *pxlo; + PSURFACE psurfTrg; ASSERT(pebo); ASSERT(pbrush); + ASSERT(pdc); + + psurfTrg = pdc->dclevel.pSurface; + + pebo->psurfTrg = psurfTrg; + pebo->BrushObject.flColorType = 0; + pebo->pbrush = pbrush; + pebo->flattrs = pbrush->flAttrs; + pebo->crCurrentText = pdc->pdcattr->crForegroundClr; + pebo->crCurrentBack = pdc->pdcattr->crBackgroundClr; + pebo->BrushObject.pvRbrush = NULL; + pebo->pengbrush = NULL; if (pbrush->flAttrs & GDIBRUSH_IS_NULL) { @@ -91,22 +104,17 @@ EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, XLATEOBJ *pxlo) pebo->ulRGBColor = pbrush->BrushAttr.lbColor; /* Translate the brush color to the target format */ + pxlo = IntCreateBrushXlate(pbrush, psurfTrg, pebo->crCurrentBack); iSolidColor = XLATEOBJ_iXlate(pxlo, pbrush->BrushAttr.lbColor); pebo->BrushObject.iSolidColor = iSolidColor; + if (pxlo) + EngDeleteXlate(pxlo); } else { /* This is a pattern brush that needs realization */ pebo->BrushObject.iSolidColor = 0xFFFFFFFF; -// EBRUSHOBJ_bRealizeBrush(pebo); } - -// pebo->psurfTrg = psurfTrg; - pebo->BrushObject.pvRbrush = pbrush->ulRealization; - pebo->BrushObject.flColorType = 0; - pebo->pbrush = pbrush; - pebo->flattrs = pbrush->flAttrs; - pebo->XlateObject = pxlo; } VOID @@ -130,39 +138,53 @@ EBRUSHOBJ_vSetSolidBrushColor(EBRUSHOBJ *pebo, COLORREF crColor, XLATEOBJ *pxlo) } BOOL -FASTCALL +NTAPI EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo) { BOOL bResult; - PFN_DrvRealizeBrush pfnRealzizeBrush; + PFN_DrvRealizeBrush pfnRealzizeBrush = NULL; PSURFACE psurfTrg, psurfPattern, psurfMask; - PPDEVOBJ ppdev; + PPDEVOBJ ppdev = NULL; XLATEOBJ *pxlo; psurfTrg = pebo->psurfTrg; // FIXME: all EBRUSHOBJs need a surface - ppdev = (PPDEVOBJ)psurfTrg->SurfObj.hdev; // FIXME: all SURFACEs need a PDEV + if (!psurfTrg) + { + DPRINT1("Pattern brush has no target surface!\n"); + return FALSE; + } - pfnRealzizeBrush = NULL;//ppdev->DriverFunctions.RealizeBrush; + ppdev = (PPDEVOBJ)psurfTrg->SurfObj.hdev; // FIXME: all SURFACEs need a PDEV + if (ppdev) + pfnRealzizeBrush = ppdev->DriverFunctions.RealizeBrush; if (!pfnRealzizeBrush) { pfnRealzizeBrush = EngRealizeBrush; } psurfPattern = SURFACE_LockSurface(pebo->pbrush->hbmPattern); + if (!psurfPattern) + { + DPRINT1("No pattern, nothing to realize!\n"); + return FALSE; + } /* FIXME: implement mask */ psurfMask = NULL; - // FIXME - pxlo = NULL; + /* Create xlateobj for the brush */ + pxlo = IntCreateBrushXlate(pebo->pbrush, psurfTrg, pebo->crCurrentBack); - bResult = pfnRealzizeBrush(&pebo->BrushObject, + /* Perform the realization */ + bResult = pfnRealzizeBrush(&pebo->BrushObject, &pebo->psurfTrg->SurfObj, - psurfPattern ? &psurfPattern->SurfObj : NULL, + &psurfPattern->SurfObj, psurfMask ? &psurfMask->SurfObj : NULL, pxlo, -1); // FIXME: what about hatch brushes? + EngDeleteXlate(pxlo); + if (psurfPattern) SURFACE_UnlockSurface(psurfPattern); @@ -173,33 +195,55 @@ EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo) } VOID -FASTCALL -EBRUSHOBJ_vUnrealizeBrush(EBRUSHOBJ *pebo) +NTAPI +EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo) { - /* Check if it's a GDI realisation */ + /* Check if there's a GDI realisation */ if (pebo->pengbrush) { EngDeleteSurface(pebo->pengbrush); + pebo->pengbrush = NULL; } - else if (pebo->BrushObject.pvRbrush) + + /* Check if there's a driver's realisation */ + if (pebo->BrushObject.pvRbrush) { /* Free allocated driver memory */ EngFreeMem(pebo->BrushObject.pvRbrush); + pebo->BrushObject.pvRbrush = NULL; } } - - VOID -FASTCALL -EBRUSHOBJ_vUpdate(EBRUSHOBJ *pebo, PBRUSH pbrush, XLATEOBJ *pxlo) +NTAPI +EBRUSHOBJ_vUpdate(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) { - /* Unrealize the brush */ - EBRUSHOBJ_vUnrealizeBrush(pebo); + /* Cleanup the brush */ +// EBRUSHOBJ_vCleanup(pebo); - EBRUSHOBJ_vInit(pebo, pbrush, pxlo); + /* Reinitialize */ + EBRUSHOBJ_vInit(pebo, pbrush, pdc); } +PVOID +NTAPI +EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ *pebo) +{ + BOOL bResult; + + if (!pebo->pengbrush) + { + bResult = EBRUSHOBJ_bRealizeBrush(pebo); + if (!bResult) + { + if (pebo->pengbrush) + EngDeleteSurface(pebo->pengbrush); + pebo->pengbrush = NULL; + } + } + + return pebo->pengbrush; +} /** Exported DDI functions ****************************************************/ @@ -223,7 +267,20 @@ PVOID APIENTRY BRUSHOBJ_pvGetRbrush( IN BRUSHOBJ *pbo) { - // FIXME: this is wrong! Read msdn. + EBRUSHOBJ *pebo = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); + BOOL bResult; + + if (!pbo->pvRbrush) + { + bResult = EBRUSHOBJ_bRealizeBrush(pebo); + if (!bResult) + { + if (pbo->pvRbrush) + EngFreeMem(pbo->pvRbrush); + pbo->pvRbrush = NULL; + } + } + return pbo->pvRbrush; } diff --git a/reactos/subsystems/win32/win32k/eng/stretchblt.c b/reactos/subsystems/win32/win32k/eng/stretchblt.c index b0e60a479a5..58a32f229b6 100644 --- a/reactos/subsystems/win32/win32k/eng/stretchblt.c +++ b/reactos/subsystems/win32/win32k/eng/stretchblt.c @@ -1,4 +1,4 @@ -/* +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: GDI stretch blt functions @@ -39,6 +39,8 @@ CallDibStretchBlt(SURFOBJ* psoDest, PEBRUSHOBJ GdiBrush = NULL; SURFOBJ* PatternSurface = NULL; XLATEOBJ* XlatePatternToDest = NULL; + BOOL bResult; + SURFACE *psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); if (BrushOrigin == NULL) { @@ -62,23 +64,32 @@ CallDibStretchBlt(SURFOBJ* psoDest, { /* FIXME - What to do here? */ } - XlatePatternToDest = GdiBrush->XlateObject; + XlatePatternToDest = IntCreateBrushXlate(GdiBrush->pbrush, + psurfDest, + GdiBrush->crCurrentBack); } else { psurfPattern = NULL; } - return DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_StretchBlt( - psoDest, psoSource, Mask, PatternSurface, - OutputRect, InputRect, MaskOrigin, pbo, &RealBrushOrigin, + bResult = DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_StretchBlt( + psoDest, psoSource, Mask, PatternSurface, + OutputRect, InputRect, MaskOrigin, pbo, &RealBrushOrigin, ColorTranslation, XlatePatternToDest, Rop4); + if (XlatePatternToDest) + { + EngDeleteXlate(XlatePatternToDest); + } + /* Pattern brush */ if (psurfPattern) { SURFACE_UnlockSurface(psurfPattern); } + + return bResult; } diff --git a/reactos/subsystems/win32/win32k/eng/xlate.c b/reactos/subsystems/win32/win32k/eng/xlate.c index c5db258d1c8..11190f16f96 100644 --- a/reactos/subsystems/win32/win32k/eng/xlate.c +++ b/reactos/subsystems/win32/win32k/eng/xlate.c @@ -689,13 +689,11 @@ XLATEOBJ_hGetColorTransform( // HACK! XLATEOBJ* -IntCreateBrushXlate(PDC pdc, BRUSH *pbrush) +IntCreateBrushXlate(BRUSH *pbrush, SURFACE * psurf, COLORREF crBackgroundClr) { - SURFACE * psurf; XLATEOBJ *pxlo = NULL; HPALETTE hPalette = NULL; - psurf = pdc->dclevel.pSurface; if (psurf) { hPalette = psurf->hDIBPalette; @@ -719,10 +717,9 @@ IntCreateBrushXlate(PDC pdc, BRUSH *pbrush) /* Special case: 1bpp pattern */ if (psurfPattern->SurfObj.iBitmapFormat == BMF_1BPP) { - if (pdc->rosdc.bitsPerPixel != 1) - pxlo = IntEngCreateSrcMonoXlate(hPalette, - pdc->pdcattr->crBackgroundClr, - pbrush->BrushAttr.lbColor); + pxlo = IntEngCreateSrcMonoXlate(hPalette, + crBackgroundClr, + pbrush->BrushAttr.lbColor); } else if (pbrush->flAttrs & GDIBRUSH_IS_DIB) { diff --git a/reactos/subsystems/win32/win32k/include/brush.h b/reactos/subsystems/win32/win32k/include/brush.h index f96fd7bf691..5bbb724eb64 100644 --- a/reactos/subsystems/win32/win32k/include/brush.h +++ b/reactos/subsystems/win32/win32k/include/brush.h @@ -67,9 +67,6 @@ typedef struct _EBRUSHOBJ DWORD ulUnique; // DWORD dwUnknown54; // DWORD dwUnknown58; - - /* Ros specific */ - XLATEOBJ *XlateObject; } EBRUSHOBJ, *PEBRUSHOBJ; /* GDI Brush Attributes */ @@ -105,19 +102,26 @@ typedef struct _EBRUSHOBJ INT FASTCALL BRUSH_GetObject (PBRUSH GdiObject, INT Count, LPLOGBRUSH Buffer); BOOL INTERNAL_CALL BRUSH_Cleanup(PVOID ObjectBody); -VOID FASTCALL -EBRUSHOBJ_vInit(EBRUSHOBJ *BrushInst, PBRUSH BrushObj, XLATEOBJ *XlateObj); +struct _DC; + +VOID +NTAPI +EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, struct _DC *); VOID FASTCALL EBRUSHOBJ_vSetSolidBrushColor(EBRUSHOBJ *pebo, COLORREF crColor, XLATEOBJ *pxlo); VOID -FASTCALL -EBRUSHOBJ_vUpdate(EBRUSHOBJ *pebo, PBRUSH pbrush, XLATEOBJ *pxlo); +NTAPI +EBRUSHOBJ_vUpdate(EBRUSHOBJ *pebo, PBRUSH pbrush, struct _DC *pdc); BOOL -FASTCALL +NTAPI EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo); +VOID +NTAPI +EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo); + #endif diff --git a/reactos/subsystems/win32/win32k/include/inteng.h b/reactos/subsystems/win32/win32k/include/inteng.h index ac9d1da5b1f..515c8785b21 100644 --- a/reactos/subsystems/win32/win32k/include/inteng.h +++ b/reactos/subsystems/win32/win32k/include/inteng.h @@ -110,7 +110,7 @@ IntEngCreateSrcMonoXlate(HPALETTE PaletteDest, ULONG Color1); XLATEOBJ* -IntCreateBrushXlate(PDC pdc, BRUSH *pbrush); +IntCreateBrushXlate(BRUSH *pbrush, SURFACE * psurf, COLORREF crBackgroundClr); HPALETTE FASTCALL IntEngGetXlatePalette(XLATEOBJ *XlateObj, diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index db91e471b76..82b5c18443b 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -941,7 +941,6 @@ IntPatBlt( EBRUSHOBJ eboFill; POINTL BrushOrigin; BOOL ret; - XLATEOBJ *pxlo; ASSERT(pbrush); @@ -989,8 +988,7 @@ IntPatBlt( BrushOrigin.x = pbrush->ptOrigin.x + pdc->ptlDCOrig.x; BrushOrigin.y = pbrush->ptOrigin.y + pdc->ptlDCOrig.y; - pxlo = IntCreateBrushXlate(pdc, pbrush); - EBRUSHOBJ_vInit(&eboFill, pbrush, pxlo); + EBRUSHOBJ_vInit(&eboFill, pbrush, pdc); ret = IntEngBitBlt( &psurf->SurfObj, @@ -1005,7 +1003,7 @@ IntPatBlt( &BrushOrigin, ROP3_TO_ROP4(dwRop)); - EngDeleteXlate(pxlo); + EBRUSHOBJ_vCleanup(&eboFill); return ret; } diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index b11062107b6..72d47a7e052 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -100,21 +100,21 @@ DC_AllocDC(PUNICODE_STRING Driver) /* Create the default fill brush */ pdcattr->hbrush = NtGdiGetStockObject(WHITE_BRUSH); NewDC->dclevel.pbrFill = BRUSH_ShareLockBrush(pdcattr->hbrush); - EBRUSHOBJ_vInit(&NewDC->eboFill, NewDC->dclevel.pbrFill, NULL); + EBRUSHOBJ_vInit(&NewDC->eboFill, NewDC->dclevel.pbrFill, NewDC); /* Create the default pen / line brush */ pdcattr->hpen = NtGdiGetStockObject(BLACK_PEN); NewDC->dclevel.pbrLine = PEN_ShareLockPen(pdcattr->hpen); - EBRUSHOBJ_vInit(&NewDC->eboLine, NewDC->dclevel.pbrLine, NULL); + EBRUSHOBJ_vInit(&NewDC->eboLine, NewDC->dclevel.pbrLine, NewDC); /* Create the default text brush */ pbrush = BRUSH_ShareLockBrush(NtGdiGetStockObject(BLACK_BRUSH)); - EBRUSHOBJ_vInit(&NewDC->eboText, pbrush, NULL); + EBRUSHOBJ_vInit(&NewDC->eboText, pbrush, NewDC); pdcattr->ulDirty_ |= DIRTY_TEXT; /* Create the default background brush */ pbrush = BRUSH_ShareLockBrush(NtGdiGetStockObject(WHITE_BRUSH)); - EBRUSHOBJ_vInit(&NewDC->eboBackground, pbrush, NULL); + EBRUSHOBJ_vInit(&NewDC->eboBackground, pbrush, NewDC); pdcattr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT); TextIntRealizeFont(pdcattr->hlfntNew,NULL); @@ -162,6 +162,12 @@ DC_Cleanup(PVOID ObjectBody) BRUSH_ShareUnlockBrush(pDC->eboText.pbrush); BRUSH_ShareUnlockBrush(pDC->eboBackground.pbrush); + /* Cleanup the dc brushes */ + EBRUSHOBJ_vCleanup(&pDC->eboFill); + EBRUSHOBJ_vCleanup(&pDC->eboLine); + EBRUSHOBJ_vCleanup(&pDC->eboText); + EBRUSHOBJ_vCleanup(&pDC->eboBackground); + return TRUE; } diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index ffe7ebb19c3..db9059e08bc 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -41,7 +41,9 @@ DC_vUpdateFillBrush(PDC pdc) } /* ROS HACK, should use surf xlate */ - pxlo = IntCreateBrushXlate(pdc, pdc->dclevel.pbrFill); + pxlo = IntCreateBrushXlate(pdc->dclevel.pbrFill, + pdc->dclevel.pSurface, + pdc->pdcattr->crBackgroundClr); /* Check if the EBRUSHOBJ needs update */ if (pdcattr->ulDirty_ & DIRTY_FILL) @@ -49,7 +51,7 @@ DC_vUpdateFillBrush(PDC pdc) pbrFill = pdc->dclevel.pbrFill; /* Update eboFill, realizing it, if needed */ - EBRUSHOBJ_vUpdate(&pdc->eboFill, pbrFill, pxlo); + EBRUSHOBJ_vUpdate(&pdc->eboFill, pbrFill, pdc); } /* Check for DC brush */ @@ -95,7 +97,9 @@ DC_vUpdateLineBrush(PDC pdc) } /* ROS HACK, should use surf xlate */ - pxlo = IntCreateBrushXlate(pdc, pdc->dclevel.pbrFill); + pxlo = IntCreateBrushXlate(pdc->dclevel.pbrFill, + pdc->dclevel.pSurface, + pdc->pdcattr->crBackgroundClr); /* Check if the EBRUSHOBJ needs update */ if (pdcattr->ulDirty_ & DIRTY_LINE) @@ -103,7 +107,7 @@ DC_vUpdateLineBrush(PDC pdc) pbrLine = pdc->dclevel.pbrLine; /* Update eboLine, realizing it, if needed */ - EBRUSHOBJ_vUpdate(&pdc->eboLine, pbrLine, pxlo); + EBRUSHOBJ_vUpdate(&pdc->eboLine, pbrLine, pdc); } /* Check for DC pen */ @@ -177,8 +181,8 @@ DC_vUpdateBackgroundBrush(PDC pdc) pdcattr->ulDirty_ &= ~DIRTY_BACKGROUND; } -HPALETTE -FASTCALL +HPALETTE +FASTCALL GdiSelectPalette( HDC hDC, HPALETTE hpal, @@ -331,7 +335,7 @@ NtGdiSelectBitmap( // If Info DC this is zero and pSurface is moved to DC->pSurfInfo. psurfBmp->hDC = hDC; - // if we're working with a DIB, get the palette + // if we're working with a DIB, get the palette // [fixme: only create if the selected palette is null] if (psurfBmp->hSecure) { From 635703bc860a4dda0152664e2a793bfb448b0554 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 11 Jul 2009 01:05:05 +0000 Subject: [PATCH 307/577] Fix cleanup in EBRUSHOBJ_vUpdate, that I commented out for testing purposes. svn path=/trunk/; revision=41856 --- reactos/subsystems/win32/win32k/eng/engbrush.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/eng/engbrush.c b/reactos/subsystems/win32/win32k/eng/engbrush.c index 68ffcd1fb94..5b824fc1f44 100644 --- a/reactos/subsystems/win32/win32k/eng/engbrush.c +++ b/reactos/subsystems/win32/win32k/eng/engbrush.c @@ -219,7 +219,7 @@ NTAPI EBRUSHOBJ_vUpdate(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) { /* Cleanup the brush */ -// EBRUSHOBJ_vCleanup(pebo); + EBRUSHOBJ_vCleanup(pebo); /* Reinitialize */ EBRUSHOBJ_vInit(pebo, pbrush, pdc); From 85f298694e60a270491811fb9f18e4c35d89371c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 11 Jul 2009 01:19:39 +0000 Subject: [PATCH 308/577] Only call the drivers DrvRealizeBrush when called from BRUSHOBJ_pbGetRbrush. The driver might punt back to GDI and gdi might want to realize the brush although the surface is driver managed. Shuffle functions. svn path=/trunk/; revision=41857 --- .../subsystems/win32/win32k/eng/engbrush.c | 182 +++++++++--------- .../subsystems/win32/win32k/include/brush.h | 2 +- 2 files changed, 92 insertions(+), 92 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/engbrush.c b/reactos/subsystems/win32/win32k/eng/engbrush.c index 5b824fc1f44..ec6fe37c6a8 100644 --- a/reactos/subsystems/win32/win32k/eng/engbrush.c +++ b/reactos/subsystems/win32/win32k/eng/engbrush.c @@ -14,62 +14,6 @@ /** Internal functions ********************************************************/ -/** - * This function is not exported, because it makes no sense for - * The driver to punt back to this function */ -BOOL -APIENTRY -EngRealizeBrush( - BRUSHOBJ *pbo, - SURFOBJ *psoDst, - SURFOBJ *psoPattern, - SURFOBJ *psoMask, - XLATEOBJ *pxlo, - ULONG iHatch) -{ - EBRUSHOBJ *pebo; - HBITMAP hbmpRealize; - SURFOBJ *psoRealize; - POINTL ptlSrc = {0, 0}; - RECTL rclDest; - ULONG lWidth; - - /* Calculate width in bytes of the realized brush */ - lWidth = DIB_GetDIBWidthBytes(psoPattern->sizlBitmap.cx, - BitsPerFormat(psoDst->iBitmapFormat)); - - /* Allocate a bitmap */ - hbmpRealize = EngCreateBitmap(psoPattern->sizlBitmap, - lWidth, - psoDst->iBitmapFormat, - BMF_NOZEROINIT, - NULL); - if (!hbmpRealize) - { - return FALSE; - } - - /* Lock the bitmap */ - psoRealize = EngLockSurface(hbmpRealize); - if (!psoRealize) - { - EngDeleteSurface(hbmpRealize); - return FALSE; - } - - /* Copy the bits to the new format bitmap */ - rclDest = (RECTL){0, 0, psoPattern->sizlBitmap.cx, psoPattern->sizlBitmap.cy}; - EngCopyBits(psoRealize, psoPattern, NULL, pxlo, &rclDest, &ptlSrc); - - /* Unlock the bitmap again */ - EngUnlockSurface(psoRealize); - - pebo = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); - pebo->pengbrush = (PVOID)hbmpRealize; - - return TRUE; -} - VOID NTAPI EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) @@ -137,9 +81,96 @@ EBRUSHOBJ_vSetSolidBrushColor(EBRUSHOBJ *pebo, COLORREF crColor, XLATEOBJ *pxlo) pebo->BrushObject.iSolidColor = iSolidColor; } +VOID +NTAPI +EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo) +{ + /* Check if there's a GDI realisation */ + if (pebo->pengbrush) + { + EngDeleteSurface(pebo->pengbrush); + pebo->pengbrush = NULL; + } + + /* Check if there's a driver's realisation */ + if (pebo->BrushObject.pvRbrush) + { + /* Free allocated driver memory */ + EngFreeMem(pebo->BrushObject.pvRbrush); + pebo->BrushObject.pvRbrush = NULL; + } +} + +VOID +NTAPI +EBRUSHOBJ_vUpdate(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) +{ + /* Cleanup the brush */ + EBRUSHOBJ_vCleanup(pebo); + + /* Reinitialize */ + EBRUSHOBJ_vInit(pebo, pbrush, pdc); +} + +/** + * This function is not exported, because it makes no sense for + * The driver to punt back to this function */ +BOOL +APIENTRY +EngRealizeBrush( + BRUSHOBJ *pbo, + SURFOBJ *psoDst, + SURFOBJ *psoPattern, + SURFOBJ *psoMask, + XLATEOBJ *pxlo, + ULONG iHatch) +{ + EBRUSHOBJ *pebo; + HBITMAP hbmpRealize; + SURFOBJ *psoRealize; + POINTL ptlSrc = {0, 0}; + RECTL rclDest; + ULONG lWidth; + + /* Calculate width in bytes of the realized brush */ + lWidth = DIB_GetDIBWidthBytes(psoPattern->sizlBitmap.cx, + BitsPerFormat(psoDst->iBitmapFormat)); + + /* Allocate a bitmap */ + hbmpRealize = EngCreateBitmap(psoPattern->sizlBitmap, + lWidth, + psoDst->iBitmapFormat, + BMF_NOZEROINIT, + NULL); + if (!hbmpRealize) + { + return FALSE; + } + + /* Lock the bitmap */ + psoRealize = EngLockSurface(hbmpRealize); + if (!psoRealize) + { + EngDeleteSurface(hbmpRealize); + return FALSE; + } + + /* Copy the bits to the new format bitmap */ + rclDest = (RECTL){0, 0, psoPattern->sizlBitmap.cx, psoPattern->sizlBitmap.cy}; + EngCopyBits(psoRealize, psoPattern, NULL, pxlo, &rclDest, &ptlSrc); + + /* Unlock the bitmap again */ + EngUnlockSurface(psoRealize); + + pebo = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject); + pebo->pengbrush = (PVOID)hbmpRealize; + + return TRUE; +} + BOOL NTAPI -EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo) +EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo, BOOL bCallDriver) { BOOL bResult; PFN_DrvRealizeBrush pfnRealzizeBrush = NULL; @@ -155,7 +186,7 @@ EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo) } ppdev = (PPDEVOBJ)psurfTrg->SurfObj.hdev; // FIXME: all SURFACEs need a PDEV - if (ppdev) + if (ppdev && bCallDriver) pfnRealzizeBrush = ppdev->DriverFunctions.RealizeBrush; if (!pfnRealzizeBrush) { @@ -194,37 +225,6 @@ EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo) return bResult; } -VOID -NTAPI -EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo) -{ - /* Check if there's a GDI realisation */ - if (pebo->pengbrush) - { - EngDeleteSurface(pebo->pengbrush); - pebo->pengbrush = NULL; - } - - /* Check if there's a driver's realisation */ - if (pebo->BrushObject.pvRbrush) - { - /* Free allocated driver memory */ - EngFreeMem(pebo->BrushObject.pvRbrush); - pebo->BrushObject.pvRbrush = NULL; - } -} - -VOID -NTAPI -EBRUSHOBJ_vUpdate(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc) -{ - /* Cleanup the brush */ - EBRUSHOBJ_vCleanup(pebo); - - /* Reinitialize */ - EBRUSHOBJ_vInit(pebo, pbrush, pdc); -} - PVOID NTAPI EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ *pebo) @@ -233,7 +233,7 @@ EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ *pebo) if (!pebo->pengbrush) { - bResult = EBRUSHOBJ_bRealizeBrush(pebo); + bResult = EBRUSHOBJ_bRealizeBrush(pebo, FALSE); if (!bResult) { if (pebo->pengbrush) @@ -272,7 +272,7 @@ BRUSHOBJ_pvGetRbrush( if (!pbo->pvRbrush) { - bResult = EBRUSHOBJ_bRealizeBrush(pebo); + bResult = EBRUSHOBJ_bRealizeBrush(pebo, TRUE); if (!bResult) { if (pbo->pvRbrush) diff --git a/reactos/subsystems/win32/win32k/include/brush.h b/reactos/subsystems/win32/win32k/include/brush.h index 5bbb724eb64..8ae24fe0b41 100644 --- a/reactos/subsystems/win32/win32k/include/brush.h +++ b/reactos/subsystems/win32/win32k/include/brush.h @@ -118,7 +118,7 @@ EBRUSHOBJ_vUpdate(EBRUSHOBJ *pebo, PBRUSH pbrush, struct _DC *pdc); BOOL NTAPI -EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo); +EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo, BOOL bCallDriver); VOID NTAPI From 08df2017e3dfe0cb4ece2e3c835df14d66d9ccea Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 11 Jul 2009 04:54:44 +0000 Subject: [PATCH 309/577] - Initialize remote address to 0 if the caller didn't specify one svn path=/trunk/; revision=41858 --- reactos/lib/drivers/ip/transport/datagram/datagram.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/lib/drivers/ip/transport/datagram/datagram.c b/reactos/lib/drivers/ip/transport/datagram/datagram.c index ae6aa490cf9..620a0484944 100644 --- a/reactos/lib/drivers/ip/transport/datagram/datagram.c +++ b/reactos/lib/drivers/ip/transport/datagram/datagram.c @@ -266,7 +266,8 @@ NTSTATUS DGReceiveDatagram( } else { - ReceiveRequest->RemotePort = 0; + ReceiveRequest->RemotePort = 0; + AddrInitIPv4(&ReceiveRequest->RemoteAddress, 0); } IoMarkIrpPending(Irp); From 2aabdcc5fdd5b343498cf42c184a39d4e6ecbdee Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 06:46:39 +0000 Subject: [PATCH 310/577] - Implement a simple nonpaged pool page allocator and deallocator: - Not actually used yet! - No support for expansion nonpaged pool yet. - No major optimizations. - We simply do the sane thing of trying to combine the next free allocation with the one we're about to make, on free. - If possible, we'll also check if the previous allocation was a free block, and we'll merge ourselves (and in the best case, whoever is following us) into that block instead. - No debug checks/validation. - Write a couple lines of code to allocate and free up to 4096 pages (it will stop when it runs out). - This is to properly excercise this code on everyone's machines to make sure it works fine (it adds a little delay to booting, but only temporary). svn path=/trunk/; revision=41859 --- reactos/ntoskrnl/mm/ARM3/init.c | 20 ++ reactos/ntoskrnl/mm/ARM3/pool.c | 391 ++++++++++++++++++++++++++++++++ 2 files changed, 411 insertions(+) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index f31d0dbd935..42f1391bed8 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -714,6 +714,26 @@ MmArmInitSystem(IN ULONG Phase, // Initialize the nonpaged pool // InitializePool(NonPagedPool, 0); + + // + // Do a little test of the nonpaged pool allocator + // + if (1) + { + ULONG i = 0; + PVOID Buffers[4096]; + while (TRUE) + { + Buffers[i] = MiAllocatePoolPages(NonPagedPool, PAGE_SIZE); + if (!Buffers[i]) break; + i++; + } + + while (i--) + { + MiFreePoolPages(Buffers[i]); + } + } } else { diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c index 32f377b8b2b..10fae9800cc 100644 --- a/reactos/ntoskrnl/mm/ARM3/pool.c +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -125,4 +125,395 @@ MiInitializeArmPool(VOID) NonPagedPoolExpansion); } +PVOID +NTAPI +MiAllocatePoolPages(IN POOL_TYPE PoolType, + IN SIZE_T SizeInBytes) +{ + PFN_NUMBER SizeInPages; + ULONG i; + KIRQL OldIrql; + PLIST_ENTRY NextEntry, NextHead, LastHead; + PMMPTE PointerPte; + PMMPFN Pfn1; + PVOID BaseVa; + PMMFREE_POOL_ENTRY FreeEntry; + + // + // Figure out how big the allocation is in pages + // + SizeInPages = BYTES_TO_PAGES(SizeInBytes); + + // + // Allocations of less than 4 pages go into their individual buckets + // + i = SizeInPages - 1; + if (i >= MI_MAX_FREE_PAGE_LISTS) i = MI_MAX_FREE_PAGE_LISTS - 1; + + // + // Loop through all the free page lists based on the page index + // + NextHead = &MmNonPagedPoolFreeListHead[i]; + LastHead = &MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS]; + + // + // Acquire the nonpaged pool lock + // + OldIrql = KeAcquireQueuedSpinLock(LockQueueMmNonPagedPoolLock); + do + { + // + // Now loop through all the free page entries in this given list + // + NextEntry = NextHead->Flink; + while (NextEntry != NextHead) + { + // + // Grab the entry and see if it can handle our allocation + // + FreeEntry = CONTAINING_RECORD(NextEntry, MMFREE_POOL_ENTRY, List); + if (FreeEntry->Size >= SizeInPages) + { + // + // It does, so consume the pages from here + // + FreeEntry->Size -= SizeInPages; + + // + // The allocation will begin in this free page area + // + BaseVa = (PVOID)((ULONG_PTR)FreeEntry + + (FreeEntry->Size << PAGE_SHIFT)); + + // + // This is not a free page segment anymore + // + RemoveEntryList(&FreeEntry->List); + + // + // However, check if its' still got space left + // + if (FreeEntry->Size != 0) + { + // + // Insert it back into a different list, based on its pages + // + i = FreeEntry->Size - 1; + if (i >= MI_MAX_FREE_PAGE_LISTS) i = MI_MAX_FREE_PAGE_LISTS - 1; + InsertTailList (&MmNonPagedPoolFreeListHead[i], + &FreeEntry->List); + } + + // + // Grab the PTE for this allocation + // + PointerPte = MiAddressToPte(BaseVa); + ASSERT(PointerPte->u.Hard.Valid == 1); + + // + // Grab the PFN NextEntry and index + // + Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(PointerPte)); + + // + // Now mark it as the beginning of an allocation + // + ASSERT(Pfn1->u3.e1.StartOfAllocation == 0); + Pfn1->u3.e1.StartOfAllocation = 1; + + // + // Check if the allocation is larger than one page + // + if (SizeInPages != 1) + { + // + // Navigate to the last PFN entry and PTE + // + PointerPte += SizeInPages - 1; + ASSERT(PointerPte->u.Hard.Valid == 1); + Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber); + } + + // + // Mark this PFN as the last (might be the same as the first) + // + ASSERT(Pfn1->u3.e1.EndOfAllocation == 0); + Pfn1->u3.e1.EndOfAllocation = 1; + + // + // Release the nonpaged pool lock, and return the allocation + // + KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql); + return BaseVa; + } + + // + // Try the next free page entry + // + NextEntry = FreeEntry->List.Flink; + } + } while (++NextHead < LastHead); + + // + // If we got here, we're out of space. + // Start by releasing the lock + // + KeReleaseQueuedSpinLock (LockQueueMmNonPagedPoolLock, OldIrql); + + // + // We should now go into expansion nonpaged pool + // + DPRINT1("Out of NP Pool\n"); + return NULL; +} + +ULONG +NTAPI +MiFreePoolPages(IN PVOID StartingVa) +{ + PMMPTE PointerPte, StartPte; + PMMPFN Pfn1, StartPfn; + PFN_NUMBER FreePages, NumberOfPages; + KIRQL OldIrql; + PMMFREE_POOL_ENTRY FreeEntry, NextEntry, LastEntry; + ULONG i; + + // + // Get the first PTE and its corresponding PFN entry + // + StartPte = PointerPte = MiAddressToPte(StartingVa); + StartPfn = Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber); + + // + // Loop until we find the last PTE + // + while (Pfn1->u3.e1.EndOfAllocation == 0) + { + // + // Keep going + // + PointerPte++; + Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber); + } + + // + // Now we know how many pages we have + // + NumberOfPages = PointerPte - StartPte + 1; + + // + // Acquire the nonpaged pool lock + // + OldIrql = KeAcquireQueuedSpinLock(LockQueueMmNonPagedPoolLock); + + // + // Mark the first and last PTEs as not part of an allocation anymore + // + StartPfn->u3.e1.StartOfAllocation = 0; + Pfn1->u3.e1.EndOfAllocation = 0; + + // + // Assume we will free as many pages as the allocation was + // + FreePages = NumberOfPages; + + // + // Peek one page past the end of the allocation + // + PointerPte++; + + // + // Guard against going past initial nonpaged pool + // + if (MiGetPfnEntryIndex(Pfn1) == MiEndOfInitialPoolFrame) + { + // + // This page is on the outskirts of initial nonpaged pool, so ignore it + // + DPRINT1("End of initial frame\n"); + Pfn1 = NULL; + } + else + { + // + // Otherwise, our entire allocation must've fit within the initial non + // paged pool, or the expansion nonpaged pool, so get the PFN entry of + // the next allocation + // + ASSERT((ULONG_PTR)StartingVa + NumberOfPages <= (ULONG_PTR)MmNonPagedPoolEnd); + if (PointerPte->u.Hard.Valid == 1) + { + // + // It's either expansion or initial: get the PFN entry + // + Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber); + } + else + { + // + // This means we've reached the guard page that protects the end of + // the expansion nonpaged pool + // + Pfn1 = NULL; + } + + } + + // + // Check if this allocation actually exists + // + if ((Pfn1) && (Pfn1->u3.e1.StartOfAllocation == 0)) + { + // + // It doesn't, so we should actually locate a free entry descriptor + // + FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)StartingVa + + (NumberOfPages << PAGE_SHIFT)); + ASSERT(FreeEntry->Owner == FreeEntry); + + // + // Consume this entry's pages, and remove it from its free list + // + FreePages += FreeEntry->Size; + RemoveEntryList (&FreeEntry->List); + } + + // + // Now get the official free entry we'll create for the caller's allocation + // + FreeEntry = StartingVa; + + // + // Check if the our allocation is the very first page + // + if (MiGetPfnEntryIndex(StartPfn) == MiStartOfInitialPoolFrame) + { + // + // Then we can't do anything or we'll risk underflowing + // + DPRINT1("Start of of initial frame\n"); + Pfn1 = NULL; + } + else + { + // + // Otherwise, get the PTE for the page right before our allocation + // + PointerPte -= NumberOfPages + 1; + if (PointerPte->u.Hard.Valid == 1) + { + // + // It's either expansion or initial nonpaged pool, get the PFN entry + // + Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber); + } + else + { + // + // We must've reached the guard page, so don't risk touching it + // + Pfn1 = NULL; + } + } + + // + // Check if there is a valid PFN entry for the page before the allocation + // and then check if this page was actually the end of an allocation. + // If it wasn't, then we know for sure it's a free page + // + if ((Pfn1) && (Pfn1->u3.e1.EndOfAllocation == 0)) + { + // + // Get the free entry descriptor for that given page range + // + FreeEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)StartingVa - PAGE_SIZE); + FreeEntry = FreeEntry->Owner; + + // + // Check if the entry is small enough to be indexed on a free list + // If it is, we'll want to re-insert it, since we're about to + // collapse our pages on top of it, which will change its count + // + if (FreeEntry->Size < (MI_MAX_FREE_PAGE_LISTS - 1)) + { + // + // Remove the list from where it is now + // + RemoveEntryList(&FreeEntry->List); + + // + // Update its size + // + FreeEntry->Size += FreePages; + + // + // And now find the new appropriate list to place it in + // + i = (ULONG)(FreeEntry->Size - 1); + if (i >= MI_MAX_FREE_PAGE_LISTS) i = MI_MAX_FREE_PAGE_LISTS - 1; + + // + // Do it + // + InsertTailList(&MmNonPagedPoolFreeListHead[i], &FreeEntry->List); + } + else + { + // + // Otherwise, just combine our free pages into this entry + // + FreeEntry->Size += FreePages; + } + } + + // + // Check if we were unable to do any compaction, and we'll stick with this + // + if (FreeEntry == StartingVa) + { + // + // Well, now we are a free entry. At worse we just have our newly freed + // pages, at best we have our pages plus whatever entry came after us + // + FreeEntry->Size = FreePages; + + // + // Find the appropriate list we should be on + // + i = FreeEntry->Size - 1; + if (i >= MI_MAX_FREE_PAGE_LISTS) i = MI_MAX_FREE_PAGE_LISTS - 1; + + // + // And insert us + // + InsertTailList (&MmNonPagedPoolFreeListHead[i], &FreeEntry->List); + } + + // + // Just a sanity check + // + ASSERT(FreePages != 0); + + // + // Get all the pages between our allocation and its end. These will all now + // become free page chunks. + // + NextEntry = StartingVa; + LastEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)NextEntry + (FreePages << PAGE_SHIFT)); + do + { + // + // Link back to the parent free entry, and keep going + // + NextEntry->Owner = FreeEntry; + NextEntry = (PMMFREE_POOL_ENTRY)((ULONG_PTR)NextEntry + PAGE_SIZE); + } while (NextEntry != LastEntry); + + // + // We're done, release the lock and let the caller know how much we freed + // + KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql); + return NumberOfPages; +} + /* EOF */ From b6f27fe11d4bb201689f1bb0060cf6c6475b86f0 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 09:36:18 +0000 Subject: [PATCH 311/577] Fix a braindead bug that killed my system (512MB) since the loop goes on past 4096 pages if you have enough non paged pool... do you even test this? svn path=/trunk/; revision=41860 --- reactos/ntoskrnl/mm/ARM3/init.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/ntoskrnl/mm/ARM3/init.c b/reactos/ntoskrnl/mm/ARM3/init.c index 42f1391bed8..8a28378b7c6 100644 --- a/reactos/ntoskrnl/mm/ARM3/init.c +++ b/reactos/ntoskrnl/mm/ARM3/init.c @@ -726,6 +726,7 @@ MmArmInitSystem(IN ULONG Phase, { Buffers[i] = MiAllocatePoolPages(NonPagedPool, PAGE_SIZE); if (!Buffers[i]) break; + if (i == 4096) break; i++; } From c3ca589de0cba806015c54b9bfdbc1f39e52b33e Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 11:41:42 +0000 Subject: [PATCH 312/577] use %zd for SIZE_T, not just %d svn path=/trunk/; revision=41861 --- reactos/tools/rbuild/backend/mingw/mingw.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index 1337600588b..a53c79a740c 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -498,7 +498,7 @@ MingwBackend::GenerateGlobalVariables () const if ( ModuleHandlerInformations[i].cflags && ModuleHandlerInformations[i].cflags[0] ) { fprintf ( fMakefile, - "MODULETYPE%d_%sFLAGS:=%s\n", + "MODULETYPE%zd_%sFLAGS:=%s\n", i, "C", ModuleHandlerInformations[i].cflags ); @@ -507,7 +507,7 @@ MingwBackend::GenerateGlobalVariables () const if ( ModuleHandlerInformations[i].cflags && ModuleHandlerInformations[i].cflags[0] ) { fprintf ( fMakefile, - "MODULETYPE%d_%sFLAGS:=%s\n", + "MODULETYPE%zd_%sFLAGS:=%s\n", i, "CXX", ModuleHandlerInformations[i].cflags ); @@ -516,7 +516,7 @@ MingwBackend::GenerateGlobalVariables () const if ( ModuleHandlerInformations[i].nasmflags && ModuleHandlerInformations[i].nasmflags[0] ) { fprintf ( fMakefile, - "MODULETYPE%d_%sFLAGS:=%s\n", + "MODULETYPE%zd_%sFLAGS:=%s\n", i, "NASM", ModuleHandlerInformations[i].nasmflags ); From 9a787312ff2a717d55cef9fa1c48b3f92f488cd4 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 11:42:29 +0000 Subject: [PATCH 313/577] __gnu__inline is not supported for a long time in gcc anymore, so remove this to fix a bunch of warnings svn path=/trunk/; revision=41862 --- reactos/include/reactos/wine/list.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/reactos/wine/list.h b/reactos/include/reactos/wine/list.h index 05b2df3fd4a..0f8613ac694 100644 --- a/reactos/include/reactos/wine/list.h +++ b/reactos/include/reactos/wine/list.h @@ -25,7 +25,7 @@ #define __WINE_SERVER_LIST_INLINE inline #else #if defined(__GNUC__) -#define __WINE_SERVER_LIST_INLINE extern __inline__ __attribute__((__always_inline__,__gnu_inline__)) +#define __WINE_SERVER_LIST_INLINE extern __inline__ __attribute__((__always_inline__)) #elif defined(_MSC_VER) #define __WINE_SERVER_LIST_INLINE __inline #else From c1d5a1f6e80ae6d1e698d574ce41b888861567bb Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 11:43:49 +0000 Subject: [PATCH 314/577] stop building ntdll as a win32dll so we can fucking stop auto-importing mingw_common and kernel32 into it... it's supposed to be built as a /SUBSYSTEM:WINDOWS dll but since rbuild has now decided to fuck around with these DLLs, it's safer to build it as native so it can be left the fuck alone and not auto-import half the tree svn path=/trunk/; revision=41863 --- reactos/dll/ntdll/ntdll.rbuild | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/ntdll/ntdll.rbuild b/reactos/dll/ntdll/ntdll.rbuild index 0ed2710a86f..7ba433492ad 100644 --- a/reactos/dll/ntdll/ntdll.rbuild +++ b/reactos/dll/ntdll/ntdll.rbuild @@ -4,7 +4,7 @@ - + include From f1ab67f6ce52206adc1dfa725e6d720316521805 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 11:47:21 +0000 Subject: [PATCH 315/577] Too many things in -i386 were still "generic" and had to be duplicated accross plat-specific rbuild files, so moved a whole bunch of them into the generic rbuild. Ironically, the one thing that isn't generic -- which files get built -- was in the generic file, blocking the arm rbuild from ever being able to use it, so I split this out now. Cleaned up the i386 and arm rbuild files to use the new generic rbuild. Brought the arm rbuild file up to spec to use the new compilerset/linkerset and msvc-compliant options. svn path=/trunk/; revision=41864 --- reactos/ReactOS-arm.rbuild | 85 ++++++++---------------------- reactos/ReactOS-generic.rbuild | 96 +++++++++++++++++++--------------- reactos/ReactOS-i386.rbuild | 95 +++++++++++++++------------------ 3 files changed, 119 insertions(+), 157 deletions(-) diff --git a/reactos/ReactOS-arm.rbuild b/reactos/ReactOS-arm.rbuild index cdf19cbd7c8..7b49df8c677 100644 --- a/reactos/ReactOS-arm.rbuild +++ b/reactos/ReactOS-arm.rbuild @@ -8,76 +8,37 @@ - - + + - - -gstabs+ - -gstabs+ - - - 1 - - - - - 0 - - - - 1 - - - - . - include - include - include/psdk - include/psdk - include/dxsdk - include/dxsdk - include/crt - include/crt/mingw32 - include/ddk - include/GL - include/ndk - include/reactos - include/reactos - include/reactos/mc - include/reactos/libs - include/reactos/arm - - - + + + + + + + include/reactos/arm - - -Os - -ftracer - - - -Os - - - -O1 - - - -O2 - - - -O3 - + + + -ftracer + + -Wno-attributes + - - -Wno-attributes - -fno-strict-aliasing - --strip-debug - -static + + + + + --strip-debug + -static + @@ -196,6 +157,4 @@ - - diff --git a/reactos/ReactOS-generic.rbuild b/reactos/ReactOS-generic.rbuild index e3fd526b33f..92748ff2463 100644 --- a/reactos/ReactOS-generic.rbuild +++ b/reactos/ReactOS-generic.rbuild @@ -85,50 +85,12 @@ include include/reactos include/reactos/wine - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + -Wall -Wno-non-virtual-dtor + -gstabs+ + -gstabs+ @@ -137,4 +99,56 @@ /Zi /W1 + + + + -Os + + + -Os + + + -O1 + + + -O2 + + + -O3 + + + -fno-strict-aliasing + -Wno-strict-aliasing + -Wpointer-arith + -Wno-multichar + + + + + + /O1 + + + /O2 + + + /Ox /GS- + /Ot + + + /Ox /GS- + /Os + + + /Ox /GS- + /Os + /Ob2 + /GF + /Gy + + + /GS- + + + diff --git a/reactos/ReactOS-i386.rbuild b/reactos/ReactOS-i386.rbuild index 5e2b40d0272..942d50685ba 100644 --- a/reactos/ReactOS-i386.rbuild +++ b/reactos/ReactOS-i386.rbuild @@ -21,64 +21,53 @@ - -Os -ftracer -momit-leaf-frame-pointer - - -Os - - - -O1 - - - -O2 - - - -O3 - - - -mpreferred-stack-boundary=2 - -fno-strict-aliasing - -Wno-strict-aliasing - -Wpointer-arith - -Wno-multichar - - -gstabs+ - - - - - - /O1 - - - /O2 - - - /Ox /GS- - /Ot - - - /Ox /GS- - /Os - - - /Ox /GS- - /Os - /Ob2 - /GF - /Gy - - - /GS- - - - -gstabs+ + -mpreferred-stack-boundary=2 + -disable-stdcall-fixup - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4fa43e449457fffaeebe4571caba4115aee6a572 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sat, 11 Jul 2009 11:50:42 +0000 Subject: [PATCH 316/577] - Return ERROR_NOT_SUPPORTED error code instead ERROR_CALL_NOT_IMPLEMENTED (in BackupRead, BackupSeek, BackupWrite) - Direct call for Set(Get)LastError - Add RemoveVectoredContinueHandler, InterlockedCompareExchange64, GetCurrentProcessorNumber, BaseCheckRunApp, AddVectoredContinueHandler to export list svn path=/trunk/; revision=41865 --- reactos/dll/win32/kernel32/file/backup.c | 6 +++--- reactos/dll/win32/kernel32/kernel32.pspec | 13 +++++++++---- reactos/dll/win32/kernel32/misc/error.c | 22 ---------------------- 3 files changed, 12 insertions(+), 29 deletions(-) diff --git a/reactos/dll/win32/kernel32/file/backup.c b/reactos/dll/win32/kernel32/file/backup.c index d7b1a5ba5af..0928e74a062 100644 --- a/reactos/dll/win32/kernel32/file/backup.c +++ b/reactos/dll/win32/kernel32/file/backup.c @@ -33,7 +33,7 @@ BackupRead ( ) { UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + SetLastError(ERROR_NOT_SUPPORTED); return FALSE; } @@ -53,7 +53,7 @@ BackupSeek ( ) { UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + SetLastError(ERROR_NOT_SUPPORTED); return FALSE; } @@ -74,7 +74,7 @@ BackupWrite ( ) { UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + SetLastError(ERROR_NOT_SUPPORTED); return FALSE; } diff --git a/reactos/dll/win32/kernel32/kernel32.pspec b/reactos/dll/win32/kernel32/kernel32.pspec index 3a6779fe471..7918234248a 100644 --- a/reactos/dll/win32/kernel32/kernel32.pspec +++ b/reactos/dll/win32/kernel32/kernel32.pspec @@ -8,9 +8,10 @@ @ stdcall AddLocalAlternateComputerNameA(str ptr) @ stdcall AddLocalAlternateComputerNameW(wstr ptr) ;@ stdcall AddRefActCtx(ptr) +@ stdcall AddVectoredContinueHandler(long ptr) ntdll.RtlAddVectoredContinueHandler @ stdcall AddVectoredExceptionHandler(long ptr) ntdll.RtlAddVectoredExceptionHandler @ stdcall AllocConsole() -@ stub AllocLSCallback ; missing in XP SP3 +@ stub AllocLSCallback ; missing in XP SP3 and 2003 R2 @ stdcall AllocateUserPhysicalPages(long ptr ptr) @ stdcall AreFileApisANSI() @ stdcall AssignProcessToJobObject(ptr ptr) @@ -19,6 +20,7 @@ @ stdcall BackupSeek(ptr long long ptr ptr ptr) @ stdcall BackupWrite(ptr ptr long ptr long long ptr) @ stdcall BaseCheckAppcompatCache(long long long ptr) ;check +@ stub BaseCheckRunApp @ stdcall BaseCleanupAppcompatCache() @ stdcall BaseCleanupAppcompatCacheSupport(ptr) @ stdcall BaseDumpAppcompatCache() @@ -336,6 +338,7 @@ @ stdcall GetCurrentDirectoryW(long ptr) @ stdcall GetCurrentProcess() @ stdcall GetCurrentProcessId() +@ stdcall GetCurrentProcessorNumber() ntdll.RtlGetCurrentProcessorNumber @ stdcall GetCurrentThread() @ stdcall GetCurrentThreadId() @ stdcall GetDateFormatA(long long ptr str ptr long) @@ -388,7 +391,7 @@ @ stub GetSCallbackTemplate ; missing in XP SP3 @ stdcall GetLargePageMinimum() @ stdcall GetLargestConsoleWindowSize(long) -@ stdcall GetLastError() +@ stdcall GetLastError() ntdll.RtlGetLastWin32Error @ stdcall GetLinguistLangSize(ptr) @ stdcall GetLocalTime(ptr) @ stdcall GetLocaleInfoA(long long ptr long) @@ -573,7 +576,8 @@ ;@ stdcall InitializeCriticalSectionEx(ptr long long) ; missing in XP SP3 @ stdcall InitializeSListHead(ptr) ntdll.RtlInitializeSListHead @ stdcall InitializeSRWLock(ptr) ntdll.RtlInitializeSRWLock -@ stdcall InterlockedCompareExchange (ptr long long) +@ stdcall InterlockedCompareExchange(ptr long long) +@ stdcall InterlockedCompareExchange64(ptr double double) ntdll.RtlInterlockedCompareExchange64 @ stdcall InterlockedDecrement(ptr) @ stdcall InterlockedExchange(ptr long) @ stdcall InterlockedExchangeAdd (ptr long ) @@ -742,6 +746,7 @@ @ stdcall RemoveDirectoryW(wstr) @ stdcall RemoveLocalAlternateComputerNameA(str long) @ stdcall RemoveLocalAlternateComputerNameW(wstr long) +@ stdcall RemoveVectoredContinueHandler(ptr) ntdll.RtlRemoveVectoredContinueHandler @ stdcall RemoveVectoredExceptionHandler(ptr) ntdll.RtlRemoveVectoredExceptionHandler @ stdcall ReplaceFile(wstr wstr wstr long ptr ptr) ReplaceFileW @ stdcall ReplaceFileA(str str str long ptr ptr) @@ -838,7 +843,7 @@ @ stdcall SetHandleInformation(long long long) @ stdcall SetInformationJobObject(long long ptr long) @ stub SetLastConsoleEventActive ; missing in XP SP3 -@ stdcall SetLastError(long) +@ stdcall SetLastError(long) ntdll.RtlSetLastWin32Error @ stub SetLocalPrimaryComputerNameA ; missing in XP SP3 @ stub SetLocalPrimaryComputerNameW ; missing in XP SP3 @ stdcall SetLocalTime(ptr) diff --git a/reactos/dll/win32/kernel32/misc/error.c b/reactos/dll/win32/kernel32/misc/error.c index 813a6281b6b..ce8eca6b592 100644 --- a/reactos/dll/win32/kernel32/misc/error.c +++ b/reactos/dll/win32/kernel32/misc/error.c @@ -17,28 +17,6 @@ #include -/* - * @implemented - */ -VOID -WINAPI -SetLastError (DWORD dwErrorCode) -{ - NtCurrentTeb ()->LastErrorValue = (ULONG) dwErrorCode; -} - - -/* - * @implemented - */ -DWORD -WINAPI -GetLastError (VOID) -{ - return (DWORD) (NtCurrentTeb ()->LastErrorValue); -} - - /* * @implemented */ From a3d7cdabd2cae6a363d7d723cd68215d4ff8f554 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 11:52:22 +0000 Subject: [PATCH 317/577] Import the generic template and comment out _M_ARM since the toolchain already defines it. THE ARM BUILD STARTS UP AGAIN (all host tools and makefiles are generated correctly). NEW TARGET TOOLCHAIN IS NOW CEGCC 0.55 (GCC-4.4.0). svn path=/trunk/; revision=41866 --- reactos/ReactOS-arm.rbuild | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ReactOS-arm.rbuild b/reactos/ReactOS-arm.rbuild index 7b49df8c677..de897e8629c 100644 --- a/reactos/ReactOS-arm.rbuild +++ b/reactos/ReactOS-arm.rbuild @@ -7,9 +7,9 @@ - + - + From 9964f5e49f0ddaf7feb7932558ea670ebe197eaa Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:02:05 +0000 Subject: [PATCH 318/577] KeGetDCacheFillSize is arch-specific, so define it in the x86 region only svn path=/trunk/; revision=41867 --- reactos/include/ddk/winddk.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index da0e82cb005..9a62e248141 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -5676,6 +5676,8 @@ KefReleaseSpinLockFromDpcLevel( #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) +#define KeGetDcacheFillSize() 1L + #else // !defined (_X86_) FORCEINLINE @@ -5710,13 +5712,9 @@ KeAcquireSpinLockRaiseToDpc( #define KeAcquireSpinLock(SpinLock, OldIrql) \ *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock) - + #endif // !defined (_X86_) -#define KeGetDcacheFillSize() 1L - - - /* ** Utillity functions */ From fffb5af849bb905b27a281aada5079cf31770ecf Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:02:47 +0000 Subject: [PATCH 319/577] Fix lack of casts in certain intrinsic functions, and add others that were being called but not yet implemented... hopefully 4.4 handles built-in intrinsics for ARM now (remains to be seen) svn path=/trunk/; revision=41868 --- reactos/include/crt/mingw32/intrin_arm.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/reactos/include/crt/mingw32/intrin_arm.h b/reactos/include/crt/mingw32/intrin_arm.h index d3f854bd840..85f8ca64431 100644 --- a/reactos/include/crt/mingw32/intrin_arm.h +++ b/reactos/include/crt/mingw32/intrin_arm.h @@ -34,6 +34,21 @@ #define _ReadWriteBarrier() __sync_synchronize() +__INTRIN_INLINE char _InterlockedCompareExchange8(volatile char * const Destination, const char Exchange, const char Comperand) +{ + return __sync_val_compare_and_swap(Destination, Comperand, Exchange); +} + +__INTRIN_INLINE short _InterlockedCompareExchange16(volatile short * const Destination, const short Exchange, const short Comperand) +{ + return __sync_val_compare_and_swap(Destination, Comperand, Exchange); +} + +__INTRIN_INLINE long _InterlockedExchangeAdd16(volatile short * const Addend, const short Value) +{ + return __sync_fetch_and_add(Addend, Value); +} + __INTRIN_INLINE long _InterlockedCompareExchange(volatile long * const dest, const long exch, const long comp) { long a, b; @@ -103,7 +118,7 @@ __INTRIN_INLINE long _InterlockedExchange(volatile long * const dest, const long __INTRIN_INLINE void * _InterlockedExchangePointer(void * volatile * const Target, void * const Value) { - return _InterlockedExchange(Target, Value); + return (void *)_InterlockedExchange((volatile long * const)Target, (const long)Value); } __INTRIN_INLINE char _InterlockedAnd8(volatile char * const value, const char mask) From b7705f8eeb0c20b5b6c89fd0a0e2f2e40077a867 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:03:28 +0000 Subject: [PATCH 320/577] Fix incorrect use of PVOID for pointer math, hidden by bad typecasts... svn path=/trunk/; revision=41869 --- reactos/boot/freeldr/freeldr/fs/ext2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/fs/ext2.c b/reactos/boot/freeldr/freeldr/fs/ext2.c index 97841ebdcfb..319adb1456e 100644 --- a/reactos/boot/freeldr/freeldr/fs/ext2.c +++ b/reactos/boot/freeldr/freeldr/fs/ext2.c @@ -606,7 +606,7 @@ BOOLEAN Ext2ReadSuperBlock(VOID) { return FALSE; } - RtlCopyMemory(Ext2SuperBlock, (PVOID)(DISKREADBUFFER + 1024), 1024); + RtlCopyMemory(Ext2SuperBlock, (PVOID)((ULONG_PTR)DISKREADBUFFER + 1024), 1024); DPRINTM(DPRINT_FILESYSTEM, "Dumping super block:\n"); @@ -951,7 +951,7 @@ BOOLEAN Ext2ReadInode(ULONG Inode, PEXT2_INODE InodeBuffer) } // Copy the data to their buffer - RtlCopyMemory(InodeBuffer, (PVOID)(ULONG_PTR)(FILESYSBUFFER + (InodeOffsetInBlock * EXT3_INODE_SIZE(Ext2SuperBlock))), sizeof(EXT2_INODE)); + RtlCopyMemory(InodeBuffer, (PVOID)((ULONG_PTR)FILESYSBUFFER + (InodeOffsetInBlock * EXT3_INODE_SIZE(Ext2SuperBlock))), sizeof(EXT2_INODE)); DPRINTM(DPRINT_FILESYSTEM, "Dumping inode information:\n"); DPRINTM(DPRINT_FILESYSTEM, "i_mode = 0x%x\n", InodeBuffer->i_mode); From cc54067fddfeb0bda1224a0aadab08d73f28f200 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:04:26 +0000 Subject: [PATCH 321/577] Just cause it ain't AMD64 ain't meaning it's just x86... so make the macro x86-inclusive instead of x64-exclusive (since we don't want those definitions on ARM either) svn path=/trunk/; revision=41870 --- reactos/boot/freeldr/freeldr/include/reactos.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/boot/freeldr/freeldr/include/reactos.h b/reactos/boot/freeldr/freeldr/include/reactos.h index 0caf409bcc4..0b627bd5268 100644 --- a/reactos/boot/freeldr/freeldr/include/reactos.h +++ b/reactos/boot/freeldr/freeldr/include/reactos.h @@ -23,7 +23,7 @@ /* Base Addres of Kernel in Physical Memory */ #define KERNEL_BASE_PHYS 0x800000 -#if !defined(_M_AMD64) +#if defined(_M_IX86) /* Bits to shift to convert a Virtual Address into an Offset in the Page Table */ #define PFN_SHIFT 12 From 9041b47435aa2044a9226bae860880a44487c5c2 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:32:09 +0000 Subject: [PATCH 322/577] Define ALLOCA_S_MARKER_SIZE for arm svn path=/trunk/; revision=41871 --- reactos/include/crt/malloc.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/include/crt/malloc.h b/reactos/include/crt/malloc.h index 9ea62af81db..18ffa80cdb7 100644 --- a/reactos/include/crt/malloc.h +++ b/reactos/include/crt/malloc.h @@ -104,6 +104,8 @@ extern "C" { #define _ALLOCA_S_MARKER_SIZE 8 #elif defined(__ia64__) || defined(__x86_64) #define _ALLOCA_S_MARKER_SIZE 16 +#elif defined(__arm__) +#define _ALLOCA_S_MARKER_SIZE 8 #endif #if !defined(RC_INVOKED) From 69b01954bdd9194a64f325021217a3cc0bfe7581 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:32:38 +0000 Subject: [PATCH 323/577] Neuter PSEH2 on ARM svn path=/trunk/; revision=41872 --- reactos/include/reactos/libs/pseh/pseh2.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/reactos/include/reactos/libs/pseh/pseh2.h b/reactos/include/reactos/libs/pseh/pseh2.h index d2035358a38..3f5a6b78c1a 100644 --- a/reactos/include/reactos/libs/pseh/pseh2.h +++ b/reactos/include/reactos/libs/pseh/pseh2.h @@ -23,6 +23,8 @@ #ifndef KJK_PSEH2_H_ #define KJK_PSEH2_H_ +#if !defined (__arm__) + #if defined(__GNUC__) struct _EXCEPTION_RECORD; struct _EXCEPTION_POINTERS; @@ -421,4 +423,20 @@ __SEH_END_SCOPE_CHAIN; #endif +#else + +#define _SEH2_TRY { +#define _SEH2_FINALLY } { +#define _SEH2_EXCEPT(...) } if (0 && __VA_ARGS__) { +#define _SEH2_END } + +#define _SEH2_GetExceptionInformation() +#define _SEH2_GetExceptionCode() STATUS_SUCCESS +#define _SEH2_AbnormalTermination() + +#define _SEH2_YIELD(STMT_) STMT_ +#define _SEH2_LEAVE + +#endif + /* EOF */ From 6f78cdb634fbbbdb1a5233477acf85c0059ed77f Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:33:10 +0000 Subject: [PATCH 324/577] Make rotl what the headers expect svn path=/trunk/; revision=41873 --- reactos/include/crt/mingw32/intrin_arm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/crt/mingw32/intrin_arm.h b/reactos/include/crt/mingw32/intrin_arm.h index 85f8ca64431..5ed79369e0a 100644 --- a/reactos/include/crt/mingw32/intrin_arm.h +++ b/reactos/include/crt/mingw32/intrin_arm.h @@ -315,7 +315,7 @@ __INTRIN_INLINE void _enable(void) } #ifndef __MSVCRT__ -__INTRIN_INLINE unsigned long _rotl(const unsigned long value, const unsigned char shift) +__INTRIN_INLINE unsigned int _rotl(const unsigned int value, int shift) { return (((value) << ((int)(shift))) | ((value) >> (32 - (int)(shift)))); } From de1eda4f79153115d0095071f82e6e1eccf9321b Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:34:25 +0000 Subject: [PATCH 325/577] How was this code even supposed to compile??? svn path=/trunk/; revision=41874 --- reactos/lib/sdk/crt/mem/memcpy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/sdk/crt/mem/memcpy.c b/reactos/lib/sdk/crt/mem/memcpy.c index ae5eeb5739e..65876118b57 100644 --- a/reactos/lib/sdk/crt/mem/memcpy.c +++ b/reactos/lib/sdk/crt/mem/memcpy.c @@ -1,7 +1,7 @@ #include /* NOTE: This code is a duplicate of memmove implementation! */ -void* memcpy(void* to, const void* from, size_t count) +void* memcpy(void* dest, const void* src, size_t count) { char *char_dest = (char *)dest; char *char_src = (char *)src; From 8473ade2b8c9a4b2a08f65ea9a14601e4e32e4e6 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:35:29 +0000 Subject: [PATCH 326/577] Define PAGE_SIZE in winnt.h for now, for modules that don't include the NDK, and then make the NDK and WINNT.H safe to use combined svn path=/trunk/; revision=41875 --- reactos/include/ndk/arm/mmtypes.h | 2 ++ reactos/include/psdk/winnt.h | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/reactos/include/ndk/arm/mmtypes.h b/reactos/include/ndk/arm/mmtypes.h index 255d89921f1..5c99bc24e4a 100644 --- a/reactos/include/ndk/arm/mmtypes.h +++ b/reactos/include/ndk/arm/mmtypes.h @@ -26,7 +26,9 @@ Author: // // Page-related Macros // +#ifndef PAGE_SIZE #define PAGE_SIZE 0x1000 +#endif #define PAGE_SHIFT 12L #define MM_ALLOCATION_GRANULARITY 0x10000 #define MM_ALLOCATION_GRANULARITY_SHIFT 16L diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index 9fe6023a334..ed3c4d35a96 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -2846,6 +2846,10 @@ typedef struct _CONTEXT { } CONTEXT; #elif defined(ARM) +#ifndef PAGE_SIZE +#define PAGE_SIZE 0x1000 // FIXME: This should probably go elsewhere +#endif + /* The following flags control the contents of the CONTEXT structure. */ #define CONTEXT_ARM 0x0000040 From f00eeb070750b825a709a079e3b01fd2f856b4f9 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:36:20 +0000 Subject: [PATCH 327/577] WINNT.H already defines CONTEXT so avoid a double-definition if ARMDDK is included svn path=/trunk/; revision=41876 --- reactos/include/reactos/arm/armddk.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/include/reactos/arm/armddk.h b/reactos/include/reactos/arm/armddk.h index 385426791d0..31a6cca720b 100644 --- a/reactos/include/reactos/arm/armddk.h +++ b/reactos/include/reactos/arm/armddk.h @@ -58,6 +58,7 @@ typedef struct _KFLOATING_SAVE ULONG Reserved; } KFLOATING_SAVE, *PKFLOATING_SAVE; +#ifndef _WINNT_H /* The following flags control the contents of the CONTEXT structure. */ #define CONTEXT_ARM 0x0000040 #define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L) @@ -104,6 +105,7 @@ typedef struct _CONTEXT { ULONG Pc; ULONG Psr; } CONTEXT; +#endif // // Processor Control Region From 0e36ca655cc1671b00cdebd27a05d37467ed29eb Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 12:57:41 +0000 Subject: [PATCH 328/577] GAS should also receive the -march flag, not just the compiler... otherwise, gcc won't let you use things like "cmov" on x86, or anything beyond the armv4 instruction set on ARM svn path=/trunk/; revision=41877 --- reactos/tools/rbuild/backend/mingw/mingw.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index a53c79a740c..c5f78d7b978 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -456,6 +456,7 @@ MingwBackend::GenerateGlobalVariables () const if ( ProjectNode.configuration.Compiler == GnuGcc ) { fprintf ( fMakefile, "ifneq ($(OARCH),)\n" ); + fprintf ( fMakefile, "PROJECT_ASFLAGS += -march=$(OARCH)\n" ); fprintf ( fMakefile, "PROJECT_CFLAGS += -march=$(OARCH)\n" ); fprintf ( fMakefile, "PROJECT_CXXFLAGS += -march=$(OARCH)\n" ); fprintf ( fMakefile, "endif\n" ); From 0c7489b058a261399ad872b24555fba3310b87f3 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 13:00:09 +0000 Subject: [PATCH 329/577] Also define PAGE_SIZE in armddk.h if it isn't already defined (allows cmlib to compile, amongst others) svn path=/trunk/; revision=41878 --- reactos/include/reactos/arm/armddk.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reactos/include/reactos/arm/armddk.h b/reactos/include/reactos/arm/armddk.h index 31a6cca720b..70aa86caae1 100644 --- a/reactos/include/reactos/arm/armddk.h +++ b/reactos/include/reactos/arm/armddk.h @@ -16,6 +16,13 @@ #define POWER_LEVEL 30 #define HIGH_LEVEL 31 +// +// Page size +// +#ifndef PAGE_SIZE +#define PAGE_SIZE 0x1000 +#endif + // // FIXME: mmtypes.h? // From a9f8283eba5d4b63932df781278c1b148cd9d5a9 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 13:02:22 +0000 Subject: [PATCH 330/577] Fix PSEH2 ARM neutering svn path=/trunk/; revision=41879 --- reactos/include/reactos/libs/pseh/pseh2.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/include/reactos/libs/pseh/pseh2.h b/reactos/include/reactos/libs/pseh/pseh2.h index 3f5a6b78c1a..cd22371d216 100644 --- a/reactos/include/reactos/libs/pseh/pseh2.h +++ b/reactos/include/reactos/libs/pseh/pseh2.h @@ -421,8 +421,6 @@ __SEH_END_SCOPE_CHAIN; #endif -#endif - #else #define _SEH2_TRY { @@ -435,7 +433,9 @@ __SEH_END_SCOPE_CHAIN; #define _SEH2_AbnormalTermination() #define _SEH2_YIELD(STMT_) STMT_ -#define _SEH2_LEAVE +#define _SEH2_LEAVE + +#endif #endif From 3622a2263a552a4762f2e3ee1cf8d93136c18136 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 11 Jul 2009 13:04:46 +0000 Subject: [PATCH 331/577] *** WE WILL NOW BE FOCUSING AND BUILDING FOR ARM CORTEX-A8 (ARMv7) *** *** SUPPORT FOR ARMv6 WILL ALSO BE ENFORCED, BUT NOTHING LOWER *** *** THE TARGET PLATFORM IS TI OMAP3-35xx and OMAP3-34xx *** svn path=/trunk/; revision=41880 --- reactos/config-arm.template.rbuild | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/config-arm.template.rbuild b/reactos/config-arm.template.rbuild index 72364322377..38b8d9ffd2e 100644 --- a/reactos/config-arm.template.rbuild +++ b/reactos/config-arm.template.rbuild @@ -15,19 +15,19 @@ - + - + From 3b72642a0a7a98f48864ee88ae67a024df46edd4 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sat, 25 Jul 2009 09:28:18 +0000 Subject: [PATCH 543/577] - Add avicap32 (stubs only) - Add mfc42u.dll, msvbvm50.dll, msvbvm60.dll, msvcirt.dll optional entries to reactos.dff svn path=/trunk/; revision=42197 --- reactos/baseaddress.rbuild | 1 + reactos/boot/bootdata/packages/reactos.dff | 5 ++ reactos/dll/win32/avicap32/avicap32.c | 98 ++++++++++++++++++++++ reactos/dll/win32/avicap32/avicap32.rbuild | 16 ++++ reactos/dll/win32/avicap32/avicap32.rc | 7 ++ reactos/dll/win32/avicap32/avicap32.spec | 6 ++ reactos/dll/win32/win32.rbuild | 3 + 7 files changed, 136 insertions(+) create mode 100644 reactos/dll/win32/avicap32/avicap32.c create mode 100644 reactos/dll/win32/avicap32/avicap32.rbuild create mode 100644 reactos/dll/win32/avicap32/avicap32.rc create mode 100644 reactos/dll/win32/avicap32/avicap32.spec diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild index 4c3190bdffa..b68e4a567c4 100644 --- a/reactos/baseaddress.rbuild +++ b/reactos/baseaddress.rbuild @@ -143,6 +143,7 @@ + diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 00cd0b75176..ab137d945de 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -256,6 +256,7 @@ dll\win32\advpack\advpack.dll 1 dll\win32\actxprxy\actxprxy.dll 1 dll\win32\atl\atl.dll 1 dll\win32\authz\authz.dll 1 +dll\win32\avicap32\avicap32.dll 1 dll\win32\avifil32\avifil32.dll 1 dll\win32\beepmidi\beepmidi.dll 1 dll\win32\browseui\browseui.dll 1 @@ -659,6 +660,10 @@ subsystems\win32\win32k\win32k.sys 1 modules\optional\kvmnet.inf 6 optional modules\optional\kvmnet.sys 2 optional modules\optional\mfc42.dll 1 optional +modules\optional\mfc42u.dll 1 optional +modules\optional\msvbvm50.dll 1 optional +modules\optional\msvbvm60.dll 1 optional +modules\optional\msvcirt.dll 1 optional modules\optional\Systema.ttf 3 optional modules\optional\vmx_fb.dll 1 optional modules\optional\vmx_mode.dll 1 optional diff --git a/reactos/dll/win32/avicap32/avicap32.c b/reactos/dll/win32/avicap32/avicap32.c new file mode 100644 index 00000000000..7b212e87151 --- /dev/null +++ b/reactos/dll/win32/avicap32/avicap32.c @@ -0,0 +1,98 @@ +/* + * PROJECT: avicap32 + * FILE: dll\win32\avicap32\avicap32.c + * PURPOSE: Main file + * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org) + */ + +#include +#include + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(avicap32); + +/* + * unimplemented + */ +HWND +VFWAPI +capCreateCaptureWindowA(LPCSTR lpszWindowName, + DWORD dwStyle, + INT x, + INT y, + INT nWidth, + INT nHeight, + HWND hWnd, + INT nID) +{ + UNIMPLEMENTED; + return NULL; +} + + +/* + * unimplemented + */ +HWND +VFWAPI +capCreateCaptureWindowW(LPCWSTR lpszWindowName, + DWORD dwStyle, + INT x, + INT y, + INT nWidth, + INT nHeight, + HWND hWnd, + INT nID) +{ + UNIMPLEMENTED; + return NULL; +} + + +/* + * unimplemented + */ +BOOL +VFWAPI +capGetDriverDescriptionA(WORD wDriverIndex, + LPSTR lpszName, + INT cbName, + LPSTR lpszVer, + INT cbVer) +{ + UNIMPLEMENTED; + return FALSE; +} + + +/* + * unimplemented + */ +BOOL +VFWAPI +capGetDriverDescriptionW(WORD wDriverIndex, + LPWSTR lpszName, + INT cbName, + LPWSTR lpszVer, + INT cbVer) +{ + UNIMPLEMENTED; + return FALSE; +} + + +BOOL +WINAPI +DllMain(IN HINSTANCE hinstDLL, + IN DWORD dwReason, + IN LPVOID lpvReserved) +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + break; + } + + return TRUE; +} diff --git a/reactos/dll/win32/avicap32/avicap32.rbuild b/reactos/dll/win32/avicap32/avicap32.rbuild new file mode 100644 index 00000000000..7bb0624bbbd --- /dev/null +++ b/reactos/dll/win32/avicap32/avicap32.rbuild @@ -0,0 +1,16 @@ + + + + + . + advapi32 + kernel32 + msvfw32 + user32 + gdi32 + wine + winmm + version + avicap32.c + avicap32.rc + diff --git a/reactos/dll/win32/avicap32/avicap32.rc b/reactos/dll/win32/avicap32/avicap32.rc new file mode 100644 index 00000000000..64627cd4750 --- /dev/null +++ b/reactos/dll/win32/avicap32/avicap32.rc @@ -0,0 +1,7 @@ +#include + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "LAN Manager\0" +#define REACTOS_STR_INTERNAL_NAME "ntlanman\0" +#define REACTOS_STR_ORIGINAL_FILENAME "ntlanman.dll\0" +#include diff --git a/reactos/dll/win32/avicap32/avicap32.spec b/reactos/dll/win32/avicap32/avicap32.spec new file mode 100644 index 00000000000..6be95250024 --- /dev/null +++ b/reactos/dll/win32/avicap32/avicap32.spec @@ -0,0 +1,6 @@ +@ stub AppCleanup +@ stdcall capCreateCaptureWindowA(str long long long long long long long) +@ stdcall capCreateCaptureWindowW(wstr long long long long long long long) +@ stdcall capGetDriverDescriptionA(long ptr long ptr long) +@ stdcall capGetDriverDescriptionW(long ptr long ptr long) +@ stub videoThunk32 diff --git a/reactos/dll/win32/win32.rbuild b/reactos/dll/win32/win32.rbuild index 7d572536740..425e1640a4c 100644 --- a/reactos/dll/win32/win32.rbuild +++ b/reactos/dll/win32/win32.rbuild @@ -25,6 +25,9 @@ + + + From d86c7f9de690f2ca7abcf5c75b6d07b1a428a213 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sat, 25 Jul 2009 09:41:17 +0000 Subject: [PATCH 544/577] - Implement capCreateCaptureWindowA and capGetDriverDescriptionA (based on Wine code) svn path=/trunk/; revision=42198 --- reactos/dll/win32/avicap32/avicap32.c | 84 ++++++++++++++++++--------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/reactos/dll/win32/avicap32/avicap32.c b/reactos/dll/win32/avicap32/avicap32.c index 7b212e87151..816a46d2e27 100644 --- a/reactos/dll/win32/avicap32/avicap32.c +++ b/reactos/dll/win32/avicap32/avicap32.c @@ -6,29 +6,14 @@ */ #include +#include #include #include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(avicap32); +#define CAP_DESC_MAX 32 -/* - * unimplemented - */ -HWND -VFWAPI -capCreateCaptureWindowA(LPCSTR lpszWindowName, - DWORD dwStyle, - INT x, - INT y, - INT nWidth, - INT nHeight, - HWND hWnd, - INT nID) -{ - UNIMPLEMENTED; - return NULL; -} +WINE_DEFAULT_DEBUG_CHANNEL(avicap32); /* @@ -49,20 +34,38 @@ capCreateCaptureWindowW(LPCWSTR lpszWindowName, return NULL; } - /* - * unimplemented + * implemented */ -BOOL +HWND VFWAPI -capGetDriverDescriptionA(WORD wDriverIndex, - LPSTR lpszName, - INT cbName, - LPSTR lpszVer, - INT cbVer) +capCreateCaptureWindowA(LPCSTR lpszWindowName, + DWORD dwStyle, + INT x, + INT y, + INT nWidth, + INT nHeight, + HWND hWnd, + INT nID) { - UNIMPLEMENTED; - return FALSE; + UNICODE_STRING Name; + HWND Wnd; + + if (lpszWindowName) + RtlCreateUnicodeStringFromAsciiz(&Name, lpszWindowName); + else + Name.Buffer = NULL; + + Wnd = capCreateCaptureWindowW(Name.Buffer, + dwStyle, + x, y, + nWidth, + nHeight, + hWnd, + nID); + + RtlFreeUnicodeString(&Name); + return Wnd; } @@ -82,6 +85,31 @@ capGetDriverDescriptionW(WORD wDriverIndex, } +/* + * implemented + */ +BOOL +VFWAPI +capGetDriverDescriptionA(WORD wDriverIndex, + LPSTR lpszName, + INT cbName, + LPSTR lpszVer, + INT cbVer) +{ + WCHAR DevName[CAP_DESC_MAX], DevVer[CAP_DESC_MAX]; + BOOL Result; + + Result = capGetDriverDescriptionW(wDriverIndex, DevName, CAP_DESC_MAX, DevVer, CAP_DESC_MAX); + if (Result) + { + WideCharToMultiByte(CP_ACP, 0, DevName, -1, lpszName, cbName, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, DevVer, -1, lpszVer, cbVer, NULL, NULL); + } + + return Result; +} + + BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, From 21777b7cab17e883a046c197fe055b7fa95aff50 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sat, 25 Jul 2009 10:24:41 +0000 Subject: [PATCH 545/577] - Create a solid black brush for background color of a ConsoleWindowClass. svn path=/trunk/; revision=42202 --- reactos/subsystems/win32/csrss/win32csr/guiconsole.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/csrss/win32csr/guiconsole.c b/reactos/subsystems/win32/csrss/win32csr/guiconsole.c index ff5cbf3f34d..86c0e092c87 100644 --- a/reactos/subsystems/win32/csrss/win32csr/guiconsole.c +++ b/reactos/subsystems/win32/csrss/win32csr/guiconsole.c @@ -1998,7 +1998,7 @@ GuiInit(VOID) wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL); wc.hIcon = LoadIconW(GetModuleHandleW(L"win32csr"), MAKEINTRESOURCEW(1)); wc.hCursor = LoadCursorW(NULL, (LPCWSTR) IDC_ARROW); - wc.hbrBackground = NULL; + wc.hbrBackground = CreateSolidBrush(RGB(0,0,0)); wc.lpszMenuName = NULL; wc.cbClsExtra = 0; wc.cbWndExtra = 0; From 23abd61d3e4986f4ff602378aeff37ed83d5eadf Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 11:43:48 +0000 Subject: [PATCH 546/577] - Fix some kernel MSC compilation issues: - ShutdownThreadMain: Define SMP-only variables compatibly - MmArmInitSystem: Define MiNonPagedPoolStart and MiNonPagedPoolLength externs compatibly - KdbpCallMainLoop: Add VOID to parameter list svn path=/trunk/; revision=42204 --- reactos/ntoskrnl/ex/shutdown.c | 7 ++++--- reactos/ntoskrnl/kdbg/kdb.c | 2 +- reactos/ntoskrnl/mm/ARM3/i386/init.c | 8 ++++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/ex/shutdown.c b/reactos/ntoskrnl/ex/shutdown.c index 431922ba312..b83ca0edcdb 100644 --- a/reactos/ntoskrnl/ex/shutdown.c +++ b/reactos/ntoskrnl/ex/shutdown.c @@ -133,6 +133,10 @@ ShutdownThreadMain(PVOID Context) "\n" }; LARGE_INTEGER Now; +#ifdef CONFIG_SMP + LONG i; + KIRQL OldIrql; +#endif /* Run the thread on the boot processor */ KeSetSystemAffinityThread(1); @@ -172,9 +176,6 @@ ShutdownThreadMain(PVOID Context) HalReturnToFirmware (FIRMWARE_OFF); #else #ifdef CONFIG_SMP - LONG i; - KIRQL OldIrql; - OldIrql = KeRaiseIrqlToDpcLevel(); /* Halt all other processors */ for (i = 0; i < KeNumberProcessors; i++) diff --git a/reactos/ntoskrnl/kdbg/kdb.c b/reactos/ntoskrnl/kdbg/kdb.c index 17bfc0ffd2c..00fb9d5f12b 100644 --- a/reactos/ntoskrnl/kdbg/kdb.c +++ b/reactos/ntoskrnl/kdbg/kdb.c @@ -1175,7 +1175,7 @@ KdbpAttachToProcess( /*!\brief Calls the main loop ... */ static VOID -KdbpCallMainLoop() +KdbpCallMainLoop(VOID) { KdbpCliMainLoop(KdbEnteredOnSingleStep); } diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 08033734422..a3e886bae75 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -95,6 +95,12 @@ PVOID MmNonPagedPoolStart; PVOID MmNonPagedPoolExpansionStart; PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; +// +// Old ReactOS Mm nonpaged pool +// +extern PVOID MiNonPagedPoolStart; +extern ULONG MiNonPagedPoolLength; + // // This is where paged pool starts by default // @@ -1211,8 +1217,6 @@ MmArmInitSystem(IN ULONG Phase, // // Print the memory layout // - extern PVOID MiNonPagedPoolStart; - extern ULONG MiNonPagedPoolLength; DPRINT1(" 0x%p - 0x%p\t%s\n", MmSystemRangeStart, (ULONG_PTR)MmSystemRangeStart + MmBootImageSize, From 87b36d171a4aaf6b2010bc0c1f97e27276ac8e2f Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 11:44:27 +0000 Subject: [PATCH 547/577] - Make mp HAL MSC compatible svn path=/trunk/; revision=42205 --- reactos/hal/halx86/mp/apic.c | 4 ++-- reactos/hal/halx86/mp/mpsirql.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/hal/halx86/mp/apic.c b/reactos/hal/halx86/mp/apic.c index 75c0e2275be..c74661fe16d 100644 --- a/reactos/hal/halx86/mp/apic.c +++ b/reactos/hal/halx86/mp/apic.c @@ -351,7 +351,7 @@ VOID APICDump(VOID) BOOLEAN VerifyLocalAPIC(VOID) { SIZE_T reg0, reg1; - ULONG l, h; + ULONG l = 0, h = 0; /* The version register is read-only in a real APIC */ reg0 = APICRead(APIC_VER); DPRINT1("Getting VERSION: %x\n", reg0); @@ -416,7 +416,7 @@ BOOLEAN VerifyLocalAPIC(VOID) #ifdef CONFIG_SMP VOID APICSendIPI(ULONG Target, ULONG Mode) { - ULONG tmp, i, flags; + ULONG tmp, i, flags = 0; /* save flags and disable interrupts */ Ke386SaveFlags(flags); diff --git a/reactos/hal/halx86/mp/mpsirql.c b/reactos/hal/halx86/mp/mpsirql.c index 6ff83c14417..a3480180401 100644 --- a/reactos/hal/halx86/mp/mpsirql.c +++ b/reactos/hal/halx86/mp/mpsirql.c @@ -28,7 +28,7 @@ KIRQL NTAPI KeGetCurrentIrql (VOID) */ { KIRQL irql; - ULONG Flags; + ULONG Flags = 0; Ke386SaveFlags(Flags); _disable(); @@ -53,7 +53,7 @@ VOID KeSetCurrentIrql (KIRQL NewIrql) * PURPOSE: Sets the current irq level without taking any action */ { - ULONG Flags; + ULONG Flags = 0; if (NewIrql > HIGH_LEVEL) { DPRINT1 ("NewIrql %x\n", NewIrql); @@ -71,7 +71,7 @@ VOID KeSetCurrentIrql (KIRQL NewIrql) VOID HalpLowerIrql(KIRQL NewIrql, BOOLEAN FromHalEndSystemInterrupt) { - ULONG Flags; + ULONG Flags = 0; UCHAR DpcRequested; if (NewIrql >= DISPATCH_LEVEL) { @@ -188,7 +188,7 @@ KIRQL FASTCALL KfRaiseIrql (KIRQL NewIrql) { KIRQL OldIrql; - ULONG Flags; + ULONG Flags = 0; Ke386SaveFlags(Flags); _disable(); @@ -295,7 +295,7 @@ HalBeginSystemInterrupt (KIRQL Irql, ULONG Vector, PKIRQL OldIrql) { - ULONG Flags; + ULONG Flags = 0; DPRINT("Vector (0x%X) Irql (0x%X)\n", Vector, Irql); if (KeGetCurrentIrql () >= Irql) @@ -324,7 +324,7 @@ HalEndSystemInterrupt (KIRQL Irql, * FUNCTION: Finish a system interrupt and restore the specified irq level. */ { - ULONG Flags; + ULONG Flags = 0; Ke386SaveFlags(Flags); if (Flags & EFLAGS_INTERRUPT_MASK) From ac4633793f08463f5f493bfe6b123ce255260de8 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 13:15:22 +0000 Subject: [PATCH 548/577] - Make most of the the video stack compile with msvc svn path=/trunk/; revision=42206 --- .../drivers/video/displays/framebuf/pointer.c | 2 +- reactos/drivers/video/font/bmfd/bmfd.h | 10 +++++--- reactos/drivers/video/font/ftfd/ftfd.h | 10 +++++--- reactos/drivers/video/videoprt/agp.c | 3 ++- reactos/include/ddk/miniport.h | 4 ++-- reactos/include/ddk/video.h | 24 +++++++++---------- reactos/include/dxsdk/ddraw.h | 6 ++--- 7 files changed, 34 insertions(+), 25 deletions(-) diff --git a/reactos/drivers/video/displays/framebuf/pointer.c b/reactos/drivers/video/displays/framebuf/pointer.c index 9b1b1136829..cd41ff07f20 100644 --- a/reactos/drivers/video/displays/framebuf/pointer.c +++ b/reactos/drivers/video/displays/framebuf/pointer.c @@ -65,7 +65,7 @@ DrvMovePointer( IN LONG y, IN RECTL *prcl) { - return EngMovePointer(pso, x, y, prcl); + EngMovePointer(pso, x, y, prcl); } #else diff --git a/reactos/drivers/video/font/bmfd/bmfd.h b/reactos/drivers/video/font/bmfd/bmfd.h index 9163253e9d7..d9b5fb599ee 100644 --- a/reactos/drivers/video/font/bmfd/bmfd.h +++ b/reactos/drivers/video/font/bmfd/bmfd.h @@ -263,11 +263,15 @@ typedef struct ULONG DbgPrint(IN PCHAR Format, IN ...); -static __inline__ -void -DbgBreakPoint(void) +FORCEINLINE +VOID +DbgBreakPoint(VOID) { +#ifdef __GNUC__ asm volatile ("int $3"); +#else + __asm int 3; +#endif } DHPDEV diff --git a/reactos/drivers/video/font/ftfd/ftfd.h b/reactos/drivers/video/font/ftfd/ftfd.h index d043ee933ea..9806a17e317 100644 --- a/reactos/drivers/video/font/ftfd/ftfd.h +++ b/reactos/drivers/video/font/ftfd/ftfd.h @@ -52,11 +52,15 @@ typedef struct ULONG DbgPrint(IN PCHAR Format, IN ...); -static __inline__ -void -DbgBreakPoint(void) +FORCEINLINE +VOID +DbgBreakPoint(VOID) { +#ifdef __GNUC__ asm volatile ("int $3"); +#else + __asm int 3; +#endif } DHPDEV diff --git a/reactos/drivers/video/videoprt/agp.c b/reactos/drivers/video/videoprt/agp.c index 3b1f81d1970..f4852d51282 100644 --- a/reactos/drivers/video/videoprt/agp.c +++ b/reactos/drivers/video/videoprt/agp.c @@ -253,6 +253,7 @@ IntAgpCommitVirtual( { PVIDEO_PORT_AGP_VIRTUAL_MAPPING VirtualMapping; PVOID BaseAddress = NULL; + PHYSICAL_ADDRESS PhysicalAddress; NTSTATUS Status; TRACE_(VIDEOPRT, "AgpCommitVirtual - VirtualContext: 0x%x Pages: %d, Offset: 0x%x\n", @@ -279,7 +280,7 @@ IntAgpCommitVirtual( ULONG OffsetInBytes = Offset * PAGE_SIZE; BaseAddress = (PVOID)((ULONG_PTR)VirtualMapping->MappedAddress + OffsetInBytes); - PHYSICAL_ADDRESS PhysicalAddress = VirtualMapping->AgpMapping->PhysicalAddress; + PhysicalAddress = VirtualMapping->AgpMapping->PhysicalAddress; PhysicalAddress.QuadPart += OffsetInBytes; Status = ZwFreeVirtualMemory(VirtualMapping->ProcessHandle, diff --git a/reactos/include/ddk/miniport.h b/reactos/include/ddk/miniport.h index 98a3364ef68..b147c25a62b 100644 --- a/reactos/include/ddk/miniport.h +++ b/reactos/include/ddk/miniport.h @@ -58,8 +58,8 @@ typedef struct _VIDEO_ACCESS_RANGE { } VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE; #endif -typedef VOID DDKAPI -(*PBANKED_SECTION_ROUTINE)( +typedef VOID +(DDKAPI *PBANKED_SECTION_ROUTINE)( IN ULONG ReadBank, IN ULONG WriteBank, IN PVOID Context); diff --git a/reactos/include/ddk/video.h b/reactos/include/ddk/video.h index ae2d3051ec8..71a8f9c45c3 100644 --- a/reactos/include/ddk/video.h +++ b/reactos/include/ddk/video.h @@ -143,15 +143,15 @@ typedef struct _VP_SCATTER_GATHER_LIST { VP_SCATTER_GATHER_ELEMENT Elements[0]; } VP_SCATTER_GATHER_LIST, *PVP_SCATTER_GATHER_LIST; -typedef VOID DDKAPI -(*PEXECUTE_DMA)( +typedef VOID +(DDKAPI *PEXECUTE_DMA)( IN PVOID HwDeviceExtension, IN PVP_DMA_ADAPTER VpDmaAdapter, IN PVP_SCATTER_GATHER_LIST SGList, IN PVOID Context); -typedef PVOID DDKAPI -(*PVIDEO_PORT_GET_PROC_ADDRESS)( +typedef PVOID +(DDKAPI *PVIDEO_PORT_GET_PROC_ADDRESS)( IN PVOID HwDeviceExtension, IN PUCHAR FunctionName); @@ -187,16 +187,16 @@ typedef struct _VIDEO_PORT_CONFIG_INFO { ULONGLONG SystemMemorySize; } VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO; -typedef VP_STATUS DDKAPI -(*PVIDEO_HW_FIND_ADAPTER)( +typedef VP_STATUS +(DDKAPI *PVIDEO_HW_FIND_ADAPTER)( IN PVOID HwDeviceExtension, IN PVOID HwContext, IN PWSTR ArgumentString, IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, OUT PUCHAR Again); -typedef VP_STATUS DDKAPI -(*PVIDEO_HW_POWER_GET)( +typedef VP_STATUS +(DDKAPI *PVIDEO_HW_POWER_GET)( IN PVOID HwDeviceExtension, IN ULONG HwId, IN OUT PVIDEO_POWER_MANAGEMENT VideoPowerControl); @@ -256,15 +256,15 @@ typedef struct _VIDEO_ACCESS_RANGE { } VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE; #endif -typedef VOID DDKAPI -(*PVIDEO_HW_LEGACYRESOURCES)( +typedef VOID +(DDKAPI *PVIDEO_HW_LEGACYRESOURCES)( IN ULONG VendorId, IN ULONG DeviceId, IN OUT PVIDEO_ACCESS_RANGE *LegacyResourceList, IN OUT PULONG LegacyResourceCount); -typedef VP_STATUS DDKAPI -(*PMINIPORT_QUERY_DEVICE_ROUTINE)( +typedef VP_STATUS +(DDKAPI *PMINIPORT_QUERY_DEVICE_ROUTINE)( IN PVOID HwDeviceExtension, IN PVOID Context, IN VIDEO_DEVICE_DATA_TYPE DeviceDataType, diff --git a/reactos/include/dxsdk/ddraw.h b/reactos/include/dxsdk/ddraw.h index 699819d60a6..685f0ad7531 100644 --- a/reactos/include/dxsdk/ddraw.h +++ b/reactos/include/dxsdk/ddraw.h @@ -8,8 +8,8 @@ #include #else #define IUnknown void -#if !defined(NT_BUILD_ENVIRONMENT) && !defined(WINNT) - #define CO_E_NOTINITIALIZED 0x800401F0 +#if !defined(NT_BUILD_ENVIRONMENT) && !defined(_WINNT_H) + #define CO_E_NOTINITIALIZED 0x800401F0L #endif #endif @@ -37,7 +37,7 @@ #endif #endif -#if defined(WINNT) || !defined(WIN32) +#if defined(_WINNT_H) || !defined(WIN32) #ifndef _HRESULT_DEFINED #define _HRESULT_DEFINED typedef long HRESULT; From d8d66829d7b0a931a77f22bd779090fed8faea8a Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 14:06:06 +0000 Subject: [PATCH 549/577] - Make ks and portcls compile under msvc svn path=/trunk/; revision=42208 --- reactos/drivers/ksfilter/ks/irp.c | 6 +- .../wdm/audio/backpln/portcls/interrupt.c | 2 +- .../wdm/audio/backpln/portcls/private.h | 5 - reactos/include/ddk/portcls.h | 10 +- reactos/include/ddk/stdunk.h | 6 +- reactos/include/psdk/ks.h | 126 ++++++++---------- 6 files changed, 67 insertions(+), 88 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index df6b3b26ad7..2603701b9b1 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -1206,8 +1206,8 @@ FindMatchingCreateItem( return STATUS_NOT_FOUND; } -NTAPI NTSTATUS +NTAPI KspCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) @@ -1390,8 +1390,8 @@ RosDeviceInterfaceReferenceStringHack( } -NTAPI NTSTATUS +NTAPI KspDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) @@ -1425,8 +1425,8 @@ KspDeviceControl( return ObjectHeader->DispatchTable.DeviceIoControl(DeviceObject, Irp); } -NTAPI NTSTATUS +NTAPI KspDispatchIrp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c b/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c index 9fbafccc693..cb3ea1b2755 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c @@ -154,8 +154,8 @@ IInterruptSync_fnCallSynchronizedRoutine( return STATUS_UNSUCCESSFUL; } -NTAPI PKINTERRUPT +NTAPI IInterruptSync_fnGetKInterrupt( IN IInterruptSync * iface) { diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h index 8d626452d0b..0b3df66032a 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h @@ -26,11 +26,6 @@ #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24)) #define TAG_PORTCLASS TAG('P', 'C', 'L', 'S') -#ifdef _MSC_VER - #define STDCALL - #define DDKAPI -#endif - #define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x)) NTSTATUS diff --git a/reactos/include/ddk/portcls.h b/reactos/include/ddk/portcls.h index 2496223cf42..9481dcf4532 100644 --- a/reactos/include/ddk/portcls.h +++ b/reactos/include/ddk/portcls.h @@ -239,7 +239,7 @@ struct _PCPROPERTY_REQUEST; typedef struct _PCPROPERTY_REQUEST PCPROPERTY_REQUEST, *PPCPROPERTY_REQUEST; -typedef NTSTATUS NTAPI(*PCPFNPROPERTY_HANDLER)( +typedef NTSTATUS (NTAPI *PCPFNPROPERTY_HANDLER)( IN PPCPROPERTY_REQUEST PropertyRequest); typedef struct @@ -281,7 +281,7 @@ struct _PCPROPERTY_REQUEST struct _PCEVENT_REQUEST; -typedef NTSTATUS NTAPI(*PCPFNEVENT_HANDLER)( +typedef NTSTATUS (NTAPI *PCPFNEVENT_HANDLER)( IN struct _PCEVENT_REQUEST* EventRequest); typedef struct _PCEVENT_ITEM @@ -307,7 +307,7 @@ typedef struct _PCEVENT_REQUEST struct _PCMETHOD_REQUEST; -typedef NTSTATUS NTAPI(*PCPFNMETHOD_HANDLER)( +typedef NTSTATUS (NTAPI *PCPFNMETHOD_HANDLER)( IN struct _PCMETHOD_REQUEST* MethodRequest); typedef struct _PCMETHOD_ITEM @@ -834,7 +834,7 @@ typedef enum struct IInterruptSync; -typedef NTSTATUS NTAPI(*PINTERRUPTSYNCROUTINE)( +typedef NTSTATUS (NTAPI *PINTERRUPTSYNCROUTINE)( IN struct IInterruptSync* InterruptSync, IN PVOID DynamicContext); @@ -2048,7 +2048,7 @@ typedef IPortClsVersion *PPORTCLSVERSION; PortCls API Functions */ -typedef NTSTATUS NTAPI(*PCPFNSTARTDEVICE)( +typedef NTSTATUS (NTAPI *PCPFNSTARTDEVICE)( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PRESOURCELIST ResourceList); diff --git a/reactos/include/ddk/stdunk.h b/reactos/include/ddk/stdunk.h index 11d48875367..b01ebb4f522 100644 --- a/reactos/include/ddk/stdunk.h +++ b/reactos/include/ddk/stdunk.h @@ -94,20 +94,20 @@ class CUnknown : public INonDelegatingUnknown #else /* Not C++ - this is probably very buggy... */ -STDMETHODCALLTYPE NTSTATUS +STDMETHODCALLTYPE Unknown_QueryInterface( IUnknown* this, IN REFIID refiid, OUT PVOID* output); -STDMETHODCALLTYPE ULONG +STDMETHODCALLTYPE Unknown_AddRef( IUnknown* unknown_this); -STDMETHODCALLTYPE ULONG +STDMETHODCALLTYPE Unknown_Release( IUnknown* unknown_this); diff --git a/reactos/include/psdk/ks.h b/reactos/include/psdk/ks.h index 4fbc31edc38..ee61049ae6d 100644 --- a/reactos/include/psdk/ks.h +++ b/reactos/include/psdk/ks.h @@ -1104,7 +1104,7 @@ typedef enum #if defined(_NTDDK_) /* MOVE ME */ -typedef NTSTATUS NTAPI NTAPI (*PFNKSCONTEXT_DISPATCH)( +typedef NTSTATUS (NTAPI *PFNKSCONTEXT_DISPATCH)( IN PVOID Context, IN PIRP Irp); #endif @@ -1260,21 +1260,19 @@ typedef struct typedef VOID -NTAPI -(*PFNREFERENCEDEVICEOBJECT)( +(NTAPI *PFNREFERENCEDEVICEOBJECT)( IN PVOID Context ); typedef VOID -NTAPI -(*PFNDEREFERENCEDEVICEOBJECT)( +(NTAPI *PFNDEREFERENCEDEVICEOBJECT)( IN PVOID Context ); typedef NTSTATUS -(*PFNQUERYREFERENCESTRING)( +(NTAPI *PFNQUERYREFERENCESTRING)( IN PVOID Context, IN OUT PWCHAR *String ); @@ -1438,7 +1436,7 @@ typedef struct { } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES; #if defined(_NTDDK_) -typedef NTSTATUS NTAPI(*PFNKSHANDLER)( +typedef NTSTATUS (NTAPI *PFNKSHANDLER)( IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); @@ -1467,8 +1465,7 @@ typedef struct typedef BOOLEAN -NTAPI -(*PFNKSFASTHANDLER)( +(NTAPI *PFNKSFASTHANDLER)( IN PFILE_OBJECT FileObject, IN PKSIDENTIFIER Request, IN ULONG RequestLength, @@ -1870,15 +1867,14 @@ typedef struct LONGLONG Interval; } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL; -typedef NTSTATUS NTAPI (*PFNKSADDEVENT)( +typedef NTSTATUS (NTAPI *PFNKSADDEVENT)( IN PIRP Irp, IN PKSEVENTDATA EventData, IN struct _KSEVENT_ENTRY* EventEntry); typedef VOID -NTAPI -(*PFNKSREMOVEEVENT)( +(NTAPI *PFNKSREMOVEEVENT)( IN PFILE_OBJECT FileObject, IN struct _KSEVENT_ENTRY* EventEntry ); @@ -1941,8 +1937,7 @@ typedef struct { typedef NTSTATUS -NTAPI -(*PFNKSPINHANDSHAKE)( +(NTAPI *PFNKSPINHANDSHAKE)( IN PKSPIN Pin, IN PKSHANDSHAKE In, IN PKSHANDSHAKE Out @@ -1950,16 +1945,14 @@ NTAPI typedef void -NTAPI -(*PFNKSPINPOWER)( +(NTAPI *PFNKSPINPOWER)( IN PKSPIN Pin, IN DEVICE_POWER_STATE State ); typedef void -NTAPI -(*PFNKSPINFRAMERETURN)( +(NTAPI *PFNKSPINFRAMERETURN)( IN PKSPIN Pin, IN PVOID Data OPTIONAL, IN ULONG Size OPTIONAL, @@ -1970,38 +1963,33 @@ NTAPI typedef void -NTAPI -(*PFNKSPINIRPCOMPLETION)( +(NTAPI *PFNKSPINIRPCOMPLETION)( IN PKSPIN Pin, IN PIRP Irp ); typedef NTSTATUS -NTAPI -(*PFNKSPINIRP)( +(NTAPI *PFNKSPINIRP)( IN PKSPIN Pin, IN PIRP Irp ); typedef NTSTATUS -NTAPI -(*PFNKSPIN)( +(NTAPI *PFNKSPIN)( IN PKSPIN Pin ); typedef void -NTAPI -(*PFNKSPINVOID)( +(NTAPI *PFNKSPINVOID)( IN PKSPIN Pin ); typedef void -NTAPI -(*PFNKSSTREAMPOINTER)( +(NTAPI *PFNKSSTREAMPOINTER)( IN PKSSTREAM_POINTER StreamPointer ); @@ -2012,8 +2000,7 @@ typedef struct { typedef NTSTATUS -NTAPI -(*PFNKSPINSETDATAFORMAT)( +(NTAPI *PFNKSPINSETDATAFORMAT)( IN PKSPIN Pin, IN PKSDATAFORMAT OldFormat OPTIONAL, IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL, @@ -2023,8 +2010,7 @@ NTAPI typedef NTSTATUS -NTAPI -(*PFNKSPINSETDEVICESTATE)( +(NTAPI *PFNKSPINSETDEVICESTATE)( IN PKSPIN Pin, IN KSSTATE ToState, IN KSSTATE FromState @@ -2049,7 +2035,7 @@ typedef struct typedef BOOLEAN -NTAPI (*PFNKSPINSETTIMER)( +(NTAPI *PFNKSPINSETTIMER)( IN PKSPIN Pin, IN PKTIMER Timer, IN LARGE_INTEGER DueTime, @@ -2058,7 +2044,7 @@ NTAPI (*PFNKSPINSETTIMER)( typedef BOOLEAN -NTAPI (*PFNKSPINCANCELTIMER)( +(NTAPI *PFNKSPINCANCELTIMER)( IN PKSPIN Pin, IN PKTIMER Timer ); @@ -2072,7 +2058,7 @@ LONGLONG typedef void -NTAPI (*PFNKSPINRESOLUTION)( +(NTAPI *PFNKSPINRESOLUTION)( IN PKSPIN Pin, OUT PKSRESOLUTION Resolution ); @@ -2086,19 +2072,19 @@ struct _KSCLOCK_DISPATCH { typedef NTSTATUS -NTAPI (*PFNKSPININITIALIZEALLOCATOR)( +(NTAPI *PFNKSPININITIALIZEALLOCATOR)( IN PKSPIN Pin, IN PKSALLOCATOR_FRAMING AllocatorFraming, OUT PVOID* Context ); -typedef PVOID NTAPI (*PFNKSDELETEALLOCATOR)( +typedef PVOID (NTAPI *PFNKSDELETEALLOCATOR)( IN PVOID Context); -typedef PVOID NTAPI (*PFNKSDEFAULTALLOCATE)( +typedef PVOID (NTAPI *PFNKSDEFAULTALLOCATE)( IN PVOID Context); -typedef PVOID NTAPI (*PFNKSDEFAULTFREE)( +typedef PVOID (NTAPI *PFNKSDEFAULTFREE)( IN PVOID Context, IN PVOID Buffer); @@ -2150,7 +2136,7 @@ typedef struct typedef NTSTATUS -NTAPI (*PFNKSINTERSECTHANDLER)( +(NTAPI *PFNKSINTERSECTHANDLER)( IN PIRP Irp, IN PKSP_PIN Pin, IN PKSDATARANGE DataRange, @@ -2159,7 +2145,7 @@ NTAPI (*PFNKSINTERSECTHANDLER)( typedef NTSTATUS -NTAPI (*PFNKSINTERSECTHANDLEREX)( +(NTAPI *PFNKSINTERSECTHANDLEREX)( IN PVOID Context, IN PIRP Irp, IN PKSP_PIN Pin, @@ -2380,7 +2366,7 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\ typedef void -NTAPI (*PFNKSFREE)( +(NTAPI *PFNKSFREE)( IN PVOID Data ); @@ -2472,18 +2458,18 @@ DEFINE_KSPROPERTY_TABLE(TopologySet) {\ /* TODO */ typedef void* UNKNOWN; -typedef PVOID NTAPI(*PFNKSINITIALIZEALLOCATOR)( +typedef PVOID (NTAPI *PFNKSINITIALIZEALLOCATOR)( IN PVOID InitialContext, IN PKSALLOCATOR_FRAMING AllocatorFraming, OUT PVOID* Context); #if defined(_NTDDK_) -typedef NTSTATUS NTAPI (*PFNKSALLOCATOR)( +typedef NTSTATUS (NTAPI *PFNKSALLOCATOR)( IN PIRP Irp, IN ULONG BufferSize, IN BOOLEAN InputOperation); -typedef NTSTATUS NTAPI (*PFNKINTERSECTHANDLEREX)( +typedef NTSTATUS (NTAPI *PFNKINTERSECTHANDLEREX)( IN PVOID Context, IN PIRP Irp, IN PKSP_PIN Pin, @@ -2496,16 +2482,14 @@ typedef NTSTATUS NTAPI (*PFNKINTERSECTHANDLEREX)( typedef NTSTATUS -NTAPI -NTAPI (*PFNALLOCATOR_ALLOCATEFRAME)( +(NTAPI *PFNALLOCATOR_ALLOCATEFRAME)( IN PFILE_OBJECT FileObject, PVOID *Frame ); typedef VOID -NTAPI -NTAPI (*PFNALLOCATOR_FREEFRAME)( +(NTAPI *PFNALLOCATOR_FREEFRAME)( IN PFILE_OBJECT FileObject, IN PVOID Frame ); @@ -2632,32 +2616,32 @@ typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR; typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR; typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR; -typedef NTSTATUS NTAPI (*PFNKSDEVICECREATE)( +typedef NTSTATUS (NTAPI *PFNKSDEVICECREATE)( IN PKSDEVICE Device); -typedef NTSTATUS NTAPI (*PFNKSDEVICEPNPSTART)( +typedef NTSTATUS (NTAPI *PFNKSDEVICEPNPSTART)( IN PKSDEVICE Device, IN PIRP Irp, IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL, IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL); -typedef NTSTATUS NTAPI (*PFNKSDEVICE)( +typedef NTSTATUS (NTAPI *PFNKSDEVICE)( IN PKSDEVICE Device); -typedef NTSTATUS NTAPI (*PFNKSDEVICEIRP)( +typedef NTSTATUS (NTAPI *PFNKSDEVICEIRP)( IN PKSDEVICE Device, IN PIRP Irp); -typedef VOID NTAPI (*PFNKSDEVICEIRPVOID)( +typedef VOID (NTAPI *PFNKSDEVICEIRPVOID)( IN PKSDEVICE Device, IN PIRP Irp); -typedef NTSTATUS NTAPI (*PFNKSDEVICEQUERYCAPABILITIES)( +typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYCAPABILITIES)( IN PKSDEVICE Device, IN PIRP Irp, IN OUT PDEVICE_CAPABILITIES Capabilities); -typedef NTSTATUS NTAPI (*PFNKSDEVICEQUERYPOWER)( +typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYPOWER)( IN PKSDEVICE Device, IN PIRP Irp, IN DEVICE_POWER_STATE DeviceTo, @@ -2666,7 +2650,7 @@ typedef NTSTATUS NTAPI (*PFNKSDEVICEQUERYPOWER)( IN SYSTEM_POWER_STATE SystemFrom, IN POWER_ACTION Action); -typedef VOID NTAPI (*PFNKSDEVICESETPOWER)( +typedef VOID (NTAPI *PFNKSDEVICESETPOWER)( IN PKSDEVICE Device, IN PIRP Irp, IN DEVICE_POWER_STATE To, @@ -2721,20 +2705,20 @@ struct _KSFILTER typedef void -NTAPI (*PFNKSFILTERPOWER)( +(NTAPI *PFNKSFILTERPOWER)( IN PKSFILTER Filter, IN DEVICE_POWER_STATE State ); -typedef NTSTATUS NTAPI (*PFNKSFILTERIRP)( +typedef NTSTATUS (NTAPI *PFNKSFILTERIRP)( IN PKSFILTER Filter, IN PIRP Irp); -typedef NTSTATUS NTAPI (*PFNKSFILTERPROCESS)( +typedef NTSTATUS (NTAPI *PFNKSFILTERPROCESS)( IN PKSFILTER Filter, IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex); -typedef NTSTATUS NTAPI (*PFNKSFILTERVOID)( +typedef NTSTATUS (NTAPI *PFNKSFILTERVOID)( IN PKSFILTER Filter); struct _KSFILTER_DISPATCH @@ -2792,12 +2776,12 @@ struct _KSFILTERFACTORY { Minidriver Callbacks */ #if defined(_NTDDK_) -typedef NTSTATUS NTAPI (*KStrMethodHandler)( +typedef NTSTATUS (NTAPI *KStrMethodHandler)( IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -typedef NTSTATUS NTAPI (*KStrSupportHandler)( +typedef NTSTATUS (NTAPI *KStrSupportHandler)( IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); @@ -2842,13 +2826,13 @@ KsValidateAllocatorFramingEx( Clock Functions */ #if defined(_NTDDK_) -typedef BOOLEAN NTAPI (*PFNKSSETTIMER)( +typedef BOOLEAN (NTAPI *PFNKSSETTIMER)( IN PVOID Context, IN PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc); -typedef BOOLEAN NTAPI (*PFNKSCANCELTIMER)( +typedef BOOLEAN (NTAPI *PFNKSCANCELTIMER)( IN PVOID Context, IN PKTIMER Timer); @@ -3014,7 +2998,7 @@ KsFastPropertyHandler( typedef BOOLEAN -NTAPI (*PFNKSGENERATEEVENTCALLBACK)( +(NTAPI *PFNKSGENERATEEVENTCALLBACK)( IN PVOID Context, IN PKSEVENT_ENTRY EventEntry ); @@ -3165,7 +3149,7 @@ KsHandleSizedListQuery( IRP Helper Functions */ -typedef NTSTATUS NTAPI (*PFNKSIRPLISTCALLBACK)( +typedef NTSTATUS (NTAPI *PFNKSIRPLISTCALLBACK)( IN PIRP Irp, IN PVOID Context); @@ -3598,7 +3582,7 @@ KsInitializeDevice ( IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL); -typedef void NTAPI (*PFNKSFILTERFACTORYPOWER)( +typedef void (NTAPI *PFNKSFILTERFACTORYPOWER)( IN PKSFILTERFACTORY FilterFactory, IN DEVICE_POWER_STATE State); @@ -3886,7 +3870,7 @@ NTAPI KsFilterAddTopologyConnections( IN PKSFILTER Filter, IN ULONG NewConnectionsCount, - IN const KSTOPOLOGY_CONNECTION* NewTopologyConnections); + IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections); KSDDKAPI VOID @@ -3900,7 +3884,7 @@ NTSTATUS NTAPI KsFilterCreateNode( IN PKSFILTER Filter, - IN const KSNODE_DESCRIPTOR* NodeDescriptor, + IN const KSNODE_DESCRIPTOR *const NodeDescriptor, OUT PULONG NodeID); KSDDKAPI @@ -3908,7 +3892,7 @@ NTSTATUS NTAPI KsFilterCreatePinFactory( IN PKSFILTER Filter, - IN const KSPIN_DESCRIPTOR_EX* PinDescriptor, + IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor, OUT PULONG PinID); KSDDKAPI From ee9bf7482b7405f8e6bc12f185f249766c3c4c29 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 14:32:06 +0000 Subject: [PATCH 550/577] - Revert 42206 change to ddraw.h as it breaks dxapi svn path=/trunk/; revision=42209 --- reactos/include/dxsdk/ddraw.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/include/dxsdk/ddraw.h b/reactos/include/dxsdk/ddraw.h index 685f0ad7531..699819d60a6 100644 --- a/reactos/include/dxsdk/ddraw.h +++ b/reactos/include/dxsdk/ddraw.h @@ -8,8 +8,8 @@ #include #else #define IUnknown void -#if !defined(NT_BUILD_ENVIRONMENT) && !defined(_WINNT_H) - #define CO_E_NOTINITIALIZED 0x800401F0L +#if !defined(NT_BUILD_ENVIRONMENT) && !defined(WINNT) + #define CO_E_NOTINITIALIZED 0x800401F0 #endif #endif @@ -37,7 +37,7 @@ #endif #endif -#if defined(_WINNT_H) || !defined(WIN32) +#if defined(WINNT) || !defined(WIN32) #ifndef _HRESULT_DEFINED #define _HRESULT_DEFINED typedef long HRESULT; From bb2feeb63e925e2023dfaba5c587b8d36116f754 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 14:51:56 +0000 Subject: [PATCH 551/577] - Fix most of the network stack for msvc (except tcpip and oskittcp) - Fix calling convention definitions for ntdd8042.h - Fix msfs' calling convention svn path=/trunk/; revision=42210 --- reactos/drivers/filesystems/msfs/msfs.h | 16 +- reactos/drivers/network/afd/afd/lock.c | 3 +- reactos/drivers/network/ndis/ndis/misc.c | 2 +- reactos/include/ddk/ndis.h | 438 +++++++++++------------ reactos/include/ddk/ntdd8042.h | 28 +- reactos/include/ddk/tdikrnl.h | 80 ++--- 6 files changed, 277 insertions(+), 290 deletions(-) diff --git a/reactos/drivers/filesystems/msfs/msfs.h b/reactos/drivers/filesystems/msfs/msfs.h index ad11bd56b30..9b0b3fa1b82 100644 --- a/reactos/drivers/filesystems/msfs/msfs.h +++ b/reactos/drivers/filesystems/msfs/msfs.h @@ -12,21 +12,7 @@ #include #include -/* - * FIXME: GCC doesn't have a working option for defaulting to a calling - * convention. It will always default to cdecl. The MS DDK was designed - * for compilers which support this option, and thus some of their headers - * do not specify STDCALL or NTAPI everywhere. As such, callbacks will be - * interpreted as cdecl on gcc, while they should be stdcall. Defining - * NTAPI manually won't work either, since msvc will realize that the - * two definitions are different. So we have to use something to close - * the compatibility gap, until someone fixes gcc. - */ -#ifdef _MSC_VER -#define DEFAULTAPI -#else -#define DEFAULTAPI __stdcall -#endif +#define DEFAULTAPI NTAPI typedef struct _MSFS_DEVICE_EXTENSION { diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index 7be8cea2cd9..18e1084d177 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -73,13 +73,14 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count, UINT Size = sizeof(AFD_WSABUF) * (Count + Lock); PAFD_WSABUF NewBuf = ExAllocatePool( PagedPool, Size * 2 ); BOOLEAN LockFailed = FALSE; + PAFD_MAPBUF MapBuf; AFD_DbgPrint(MID_TRACE,("Called(%08x)\n", NewBuf)); if( NewBuf ) { RtlZeroMemory(NewBuf, Size * 2); - PAFD_MAPBUF MapBuf = (PAFD_MAPBUF)(NewBuf + Count + Lock); + MapBuf = (PAFD_MAPBUF)(NewBuf + Count + Lock); _SEH2_TRY { RtlCopyMemory( NewBuf, Buf, sizeof(AFD_WSABUF) * Count ); diff --git a/reactos/drivers/network/ndis/ndis/misc.c b/reactos/drivers/network/ndis/ndis/misc.c index fed88273cd8..418f6ed0f1c 100644 --- a/reactos/drivers/network/ndis/ndis/misc.c +++ b/reactos/drivers/network/ndis/ndis/misc.c @@ -462,8 +462,8 @@ ndisProcWorkItemHandler(PVOID pContext) pNdisItem->Routine(pNdisItem, pNdisItem->Context); } -EXPORT NDIS_STATUS +EXPORT NdisScheduleWorkItem( IN PNDIS_WORK_ITEM pWorkItem) { diff --git a/reactos/include/ddk/ndis.h b/reactos/include/ddk/ndis.h index 226e3b94d1c..ee74dc71711 100644 --- a/reactos/include/ddk/ndis.h +++ b/reactos/include/ddk/ndis.h @@ -258,8 +258,8 @@ typedef struct _LOCK_STATE { /* Timer */ -typedef VOID DDKAPI -(*PNDIS_TIMER_FUNCTION)( +typedef VOID +(DDKAPI *PNDIS_TIMER_FUNCTION)( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, @@ -635,17 +635,17 @@ typedef struct _NDIS_WAN_LINE_UP { } NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP; -typedef VOID DDKAPI -(*ADAPTER_SHUTDOWN_HANDLER)( +typedef VOID +(DDKAPI *ADAPTER_SHUTDOWN_HANDLER)( IN PVOID ShutdownContext); -typedef NTSTATUS DDKAPI -(*TDI_REGISTER_CALLBACK)( +typedef NTSTATUS +(DDKAPI *TDI_REGISTER_CALLBACK)( IN PUNICODE_STRING DeviceName, OUT HANDLE* TdiHandle); -typedef NTSTATUS DDKAPI -(*TDI_PNP_HANDLER)( +typedef NTSTATUS +(DDKAPI *TDI_PNP_HANDLER)( IN PUNICODE_STRING UpperComponent, IN PUNICODE_STRING LowerComponent, IN PUNICODE_STRING BindList, @@ -1072,97 +1072,97 @@ typedef struct _WAN_CO_LINKPARAMS { /* Call Manager */ -typedef VOID DDKAPI -(*CM_ACTIVATE_VC_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CM_ACTIVATE_VC_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE CallMgrVcContext, IN PCO_CALL_PARAMETERS CallParameters); -typedef NDIS_STATUS DDKAPI -(*CM_ADD_PARTY_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_ADD_PARTY_HANDLER)( IN NDIS_HANDLE CallMgrVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters, IN NDIS_HANDLE NdisPartyHandle, OUT PNDIS_HANDLE CallMgrPartyContext); -typedef NDIS_STATUS DDKAPI -(*CM_CLOSE_AF_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_CLOSE_AF_HANDLER)( IN NDIS_HANDLE CallMgrAfContext); -typedef NDIS_STATUS DDKAPI -(*CM_CLOSE_CALL_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_CLOSE_CALL_HANDLER)( IN NDIS_HANDLE CallMgrVcContext, IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL); -typedef NDIS_STATUS DDKAPI -(*CM_DEREG_SAP_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_DEREG_SAP_HANDLER)( IN NDIS_HANDLE CallMgrSapContext); -typedef VOID DDKAPI -(*CM_DEACTIVATE_VC_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CM_DEACTIVATE_VC_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE CallMgrVcContext); -typedef NDIS_STATUS DDKAPI -(*CM_DROP_PARTY_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_DROP_PARTY_HANDLER)( IN NDIS_HANDLE CallMgrPartyContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL); -typedef VOID DDKAPI -(*CM_INCOMING_CALL_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CM_INCOMING_CALL_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE CallMgrVcContext, IN PCO_CALL_PARAMETERS CallParameters); -typedef NDIS_STATUS DDKAPI -(*CM_MAKE_CALL_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_MAKE_CALL_HANDLER)( IN NDIS_HANDLE CallMgrVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters, IN NDIS_HANDLE NdisPartyHandle OPTIONAL, OUT PNDIS_HANDLE CallMgrPartyContext OPTIONAL); -typedef NDIS_STATUS DDKAPI -(*CM_MODIFY_CALL_QOS_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_MODIFY_CALL_QOS_HANDLER)( IN NDIS_HANDLE CallMgrVcContext, IN PCO_CALL_PARAMETERS CallParameters); -typedef NDIS_STATUS DDKAPI -(*CM_OPEN_AF_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_OPEN_AF_HANDLER)( IN NDIS_HANDLE CallMgrBindingContext, IN PCO_ADDRESS_FAMILY AddressFamily, IN NDIS_HANDLE NdisAfHandle, OUT PNDIS_HANDLE CallMgrAfContext); -typedef NDIS_STATUS DDKAPI -(*CM_REG_SAP_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CM_REG_SAP_HANDLER)( IN NDIS_HANDLE CallMgrAfContext, IN PCO_SAP Sap, IN NDIS_HANDLE NdisSapHandle, OUT PNDIS_HANDLE CallMgrSapContext); -typedef NDIS_STATUS DDKAPI -(*CO_CREATE_VC_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CO_CREATE_VC_HANDLER)( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE NdisVcHandle, OUT PNDIS_HANDLE ProtocolVcContext); -typedef NDIS_STATUS DDKAPI -(*CO_DELETE_VC_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CO_DELETE_VC_HANDLER)( IN NDIS_HANDLE ProtocolVcContext); -typedef VOID DDKAPI -(*CO_REQUEST_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CO_REQUEST_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext OPTIONAL, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, IN PNDIS_REQUEST NdisRequest); -typedef NDIS_STATUS DDKAPI -(*CO_REQUEST_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CO_REQUEST_HANDLER)( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, @@ -1200,81 +1200,81 @@ typedef VOID (*CL_OPEN_AF_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolAfContext, IN NDIS_HANDLE NdisAfHandle); -typedef VOID DDKAPI -(*CL_CLOSE_AF_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CL_CLOSE_AF_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolAfContext); -typedef VOID DDKAPI -(*CL_REG_SAP_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CL_REG_SAP_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolSapContext, IN PCO_SAP Sap, IN NDIS_HANDLE NdisSapHandle); -typedef VOID DDKAPI -(*CL_DEREG_SAP_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CL_DEREG_SAP_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolSapContext); -typedef VOID DDKAPI -(*CL_MAKE_CALL_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CL_MAKE_CALL_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN NDIS_HANDLE NdisPartyHandle OPTIONAL, IN PCO_CALL_PARAMETERS CallParameters); -typedef VOID DDKAPI -(*CL_MODIFY_CALL_QOS_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CL_MODIFY_CALL_QOS_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN PCO_CALL_PARAMETERS CallParameters); -typedef VOID DDKAPI -(*CL_CLOSE_CALL_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CL_CLOSE_CALL_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN NDIS_HANDLE ProtocolPartyContext OPTIONAL); -typedef VOID DDKAPI -(*CL_ADD_PARTY_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CL_ADD_PARTY_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolPartyContext, IN NDIS_HANDLE NdisPartyHandle, IN PCO_CALL_PARAMETERS CallParameters); -typedef VOID DDKAPI -(*CL_DROP_PARTY_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CL_DROP_PARTY_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolPartyContext); -typedef NDIS_STATUS DDKAPI -(*CL_INCOMING_CALL_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *CL_INCOMING_CALL_HANDLER)( IN NDIS_HANDLE ProtocolSapContext, IN NDIS_HANDLE ProtocolVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters); -typedef VOID DDKAPI -(*CL_INCOMING_CALL_QOS_CHANGE_HANDLER)( +typedef VOID +(DDKAPI *CL_INCOMING_CALL_QOS_CHANGE_HANDLER)( IN NDIS_HANDLE ProtocolVcContext, IN PCO_CALL_PARAMETERS CallParameters); -typedef VOID DDKAPI -(*CL_INCOMING_CLOSE_CALL_HANDLER)( +typedef VOID +(DDKAPI *CL_INCOMING_CLOSE_CALL_HANDLER)( IN NDIS_STATUS CloseStatus, IN NDIS_HANDLE ProtocolVcContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL); -typedef VOID DDKAPI -(*CL_INCOMING_DROP_PARTY_HANDLER)( +typedef VOID +(DDKAPI *CL_INCOMING_DROP_PARTY_HANDLER)( IN NDIS_STATUS DropStatus, IN NDIS_HANDLE ProtocolPartyContext, IN PVOID CloseData OPTIONAL, IN UINT Size OPTIONAL); -typedef VOID DDKAPI -(*CL_CALL_CONNECTED_HANDLER)( +typedef VOID +(DDKAPI *CL_CALL_CONNECTED_HANDLER)( IN NDIS_HANDLE ProtocolVcContext); @@ -1308,65 +1308,65 @@ typedef struct _NDIS_CLIENT_CHARACTERISTICS { /* Prototypes for NDIS 3.0 protocol characteristics */ -typedef VOID DDKAPI -(*OPEN_ADAPTER_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *OPEN_ADAPTER_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenErrorStatus); -typedef VOID DDKAPI -(*CLOSE_ADAPTER_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CLOSE_ADAPTER_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status); -typedef VOID DDKAPI -(*RESET_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *RESET_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status); -typedef VOID DDKAPI -(*REQUEST_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *REQUEST_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_REQUEST NdisRequest, IN NDIS_STATUS Status); -typedef VOID DDKAPI -(*STATUS_HANDLER)( +typedef VOID +(DDKAPI *STATUS_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize); -typedef VOID DDKAPI -(*STATUS_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *STATUS_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext); -typedef VOID DDKAPI -(*SEND_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *SEND_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status); -typedef VOID DDKAPI -(*WAN_SEND_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *WAN_SEND_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_WAN_PACKET Packet, IN NDIS_STATUS Status); -typedef VOID DDKAPI -(*TRANSFER_DATA_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *TRANSFER_DATA_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred); -typedef VOID DDKAPI -(*WAN_TRANSFER_DATA_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *WAN_TRANSFER_DATA_COMPLETE_HANDLER)( VOID); -typedef NDIS_STATUS DDKAPI -(*RECEIVE_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *RECEIVE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, @@ -1375,14 +1375,14 @@ typedef NDIS_STATUS DDKAPI IN UINT LookaheadBufferSize, IN UINT PacketSize); -typedef NDIS_STATUS DDKAPI -(*WAN_RECEIVE_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *WAN_RECEIVE_HANDLER)( IN NDIS_HANDLE NdisLinkHandle, IN PUCHAR Packet, IN ULONG PacketSize); -typedef VOID DDKAPI -(*RECEIVE_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *RECEIVE_COMPLETE_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext); @@ -1424,32 +1424,32 @@ typedef struct _NDIS30_PROTOCOL_CHARACTERISTICS { /* Prototypes for NDIS 4.0 protocol characteristics */ -typedef INT DDKAPI -(*RECEIVE_PACKET_HANDLER)( +typedef INT +(DDKAPI *RECEIVE_PACKET_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet); -typedef VOID DDKAPI -(*BIND_HANDLER)( +typedef VOID +(DDKAPI *BIND_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2); -typedef VOID DDKAPI -(*UNBIND_HANDLER)( +typedef VOID +(DDKAPI *UNBIND_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE UnbindContext); -typedef NDIS_STATUS DDKAPI -(*PNP_EVENT_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *PNP_EVENT_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT NetPnPEvent); -typedef VOID DDKAPI -(*UNLOAD_PROTOCOL_HANDLER)( +typedef VOID +(DDKAPI *UNLOAD_PROTOCOL_HANDLER)( VOID); @@ -1483,28 +1483,28 @@ typedef struct _NDIS40_PROTOCOL_CHARACTERISTICS { /* Prototypes for NDIS 5.0 protocol characteristics */ -typedef VOID DDKAPI -(*CO_SEND_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *CO_SEND_COMPLETE_HANDLER)( IN NDIS_STATUS Status, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET Packet); -typedef VOID DDKAPI -(*CO_STATUS_HANDLER)( +typedef VOID +(DDKAPI *CO_STATUS_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext OPTIONAL, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize); -typedef UINT DDKAPI -(*CO_RECEIVE_PACKET_HANDLER)( +typedef UINT +(DDKAPI *CO_RECEIVE_PACKET_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE ProtocolVcContext, IN PNDIS_PACKET Packet); -typedef VOID DDKAPI -(*CO_AF_REGISTER_NOTIFY_HANDLER)( +typedef VOID +(DDKAPI *CO_AF_REGISTER_NOTIFY_HANDLER)( IN NDIS_HANDLE ProtocolBindingContext, IN PCO_ADDRESS_FAMILY AddressFamily); @@ -1536,7 +1536,7 @@ typedef struct _NDIS50_PROTOCOL_CHARACTERISTICS { #if defined(NDIS50) || defined(NDIS51) typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { - NDIS50_PROTOCOL_CHARACTERISTICS_S; + NDIS50_PROTOCOL_CHARACTERISTICS_S } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; #elif defined(NDIS40) typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { @@ -2452,8 +2452,8 @@ NdisUpdateSharedMemory( #define NdisZeroMemory(Destination, Length) \ RtlZeroMemory(Destination, Length) -typedef VOID DDKAPI -(*NDIS_BLOCK_INITIALIZER) ( +typedef VOID +(DDKAPI *NDIS_BLOCK_INITIALIZER) ( IN PUCHAR Block, IN SIZE_T NumberOfBytes ); @@ -3646,28 +3646,28 @@ NdisQueryBufferSafe( /* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */ -typedef BOOLEAN DDKAPI -(*W_CHECK_FOR_HANG_HANDLER)( +typedef BOOLEAN +(DDKAPI *W_CHECK_FOR_HANG_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef VOID DDKAPI -(*W_DISABLE_INTERRUPT_HANDLER)( +typedef VOID +(DDKAPI *W_DISABLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef VOID DDKAPI -(*W_ENABLE_INTERRUPT_HANDLER)( +typedef VOID +(DDKAPI *W_ENABLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef VOID DDKAPI -(*W_HALT_HANDLER)( +typedef VOID +(DDKAPI *W_HALT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef VOID DDKAPI -(*W_HANDLE_INTERRUPT_HANDLER)( +typedef VOID +(DDKAPI *W_HANDLE_INTERRUPT_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext); -typedef NDIS_STATUS DDKAPI -(*W_INITIALIZE_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_INITIALIZE_HANDLER)( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediumIndex, IN PNDIS_MEDIUM MediumArray, @@ -3675,14 +3675,14 @@ typedef NDIS_STATUS DDKAPI IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE WrapperConfigurationContext); -typedef VOID DDKAPI -(*W_ISR_HANDLER)( +typedef VOID +(DDKAPI *W_ISR_HANDLER)( OUT PBOOLEAN InterruptRecognized, OUT PBOOLEAN QueueMiniportHandleInterrupt, IN NDIS_HANDLE MiniportAdapterContext); -typedef NDIS_STATUS DDKAPI -(*W_QUERY_INFORMATION_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_QUERY_INFORMATION_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, @@ -3690,31 +3690,31 @@ typedef NDIS_STATUS DDKAPI OUT PULONG BytesWritten, OUT PULONG BytesNeeded); -typedef NDIS_STATUS DDKAPI -(*W_RECONFIGURE_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_RECONFIGURE_HANDLER)( OUT PNDIS_STATUS OpenErrorStatus, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE WrapperConfigurationContext); -typedef NDIS_STATUS DDKAPI -(*W_RESET_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_RESET_HANDLER)( OUT PBOOLEAN AddressingReset, IN NDIS_HANDLE MiniportAdapterContext); -typedef NDIS_STATUS DDKAPI -(*W_SEND_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_SEND_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags); -typedef NDIS_STATUS DDKAPI -(*WM_SEND_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *WM_SEND_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE NdisLinkHandle, IN PNDIS_WAN_PACKET Packet); -typedef NDIS_STATUS DDKAPI -(*W_SET_INFORMATION_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_SET_INFORMATION_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, @@ -3722,8 +3722,8 @@ typedef NDIS_STATUS DDKAPI OUT PULONG BytesRead, OUT PULONG BytesNeeded); -typedef NDIS_STATUS DDKAPI -(*W_TRANSFER_DATA_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_TRANSFER_DATA_HANDLER)( OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred, IN NDIS_HANDLE MiniportAdapterContext, @@ -3731,8 +3731,8 @@ typedef NDIS_STATUS DDKAPI IN UINT ByteOffset, IN UINT BytesToTransfer); -typedef NDIS_STATUS DDKAPI -(*WM_TRANSFER_DATA_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *WM_TRANSFER_DATA_HANDLER)( VOID); @@ -3763,19 +3763,19 @@ typedef struct _NDIS30_MINIPORT_CHARACTERISTICS { /* Extensions for NDIS 4.0 miniports */ -typedef VOID DDKAPI -(*W_SEND_PACKETS_HANDLER)( +typedef VOID +(DDKAPI *W_SEND_PACKETS_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets); -typedef VOID DDKAPI -(*W_RETURN_PACKET_HANDLER)( +typedef VOID +(DDKAPI *W_RETURN_PACKET_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet); -typedef VOID DDKAPI -(*W_ALLOCATE_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *W_ALLOCATE_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PVOID VirtualAddress, IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress, @@ -3807,33 +3807,33 @@ typedef struct _NDIS40_MINIPORT_CHARACTERISTICS { /* Extensions for NDIS 5.0 miniports */ -typedef NDIS_STATUS DDKAPI -(*W_CO_CREATE_VC_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_CO_CREATE_VC_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE NdisVcHandle, OUT PNDIS_HANDLE MiniportVcContext); -typedef NDIS_STATUS DDKAPI -(*W_CO_DELETE_VC_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_CO_DELETE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext); -typedef NDIS_STATUS DDKAPI -(*W_CO_ACTIVATE_VC_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_CO_ACTIVATE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext, IN OUT PCO_CALL_PARAMETERS CallParameters); -typedef NDIS_STATUS DDKAPI -(*W_CO_DEACTIVATE_VC_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_CO_DEACTIVATE_VC_HANDLER)( IN NDIS_HANDLE MiniportVcContext); -typedef VOID DDKAPI -(*W_CO_SEND_PACKETS_HANDLER)( +typedef VOID +(DDKAPI *W_CO_SEND_PACKETS_HANDLER)( IN NDIS_HANDLE MiniportVcContext, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets); -typedef NDIS_STATUS DDKAPI -(*W_CO_REQUEST_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *W_CO_REQUEST_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE MiniportVcContext OPTIONAL, IN OUT PNDIS_REQUEST NdisRequest); @@ -3869,20 +3869,20 @@ typedef struct _NDIS50_MINIPORT_CHARACTERISTICS { /* Extensions for NDIS 5.1 miniports */ -typedef VOID DDKAPI -(*W_CANCEL_SEND_PACKETS_HANDLER)( +typedef VOID +(DDKAPI *W_CANCEL_SEND_PACKETS_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN PVOID CancelId); -typedef VOID DDKAPI -(*W_PNP_EVENT_NOTIFY_HANDLER)( +typedef VOID +(DDKAPI *W_PNP_EVENT_NOTIFY_HANDLER)( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_DEVICE_PNP_EVENT PnPEvent, IN PVOID InformationBuffer, IN ULONG InformationBufferLength); -typedef VOID DDKAPI -(*W_MINIPORT_SHUTDOWN_HANDLER)( +typedef VOID +(DDKAPI *W_MINIPORT_SHUTDOWN_HANDLER)( IN PVOID ShutdownContext); #ifdef __cplusplus @@ -3926,13 +3926,13 @@ typedef struct _NDIS_MINIPORT_CHARACTERISTICS { #endif -typedef NDIS_STATUS DDKAPI -(*SEND_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *SEND_HANDLER)( IN NDIS_HANDLE MacBindingHandle, IN PNDIS_PACKET Packet); -typedef NDIS_STATUS DDKAPI -(*TRANSFER_DATA_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *TRANSFER_DATA_HANDLER)( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE MacReceiveContext, IN UINT ByteOffset, @@ -3940,12 +3940,12 @@ typedef NDIS_STATUS DDKAPI OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred); -typedef NDIS_STATUS DDKAPI -(*RESET_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *RESET_HANDLER)( IN NDIS_HANDLE MacBindingHandle); -typedef NDIS_STATUS DDKAPI -(*REQUEST_HANDLER)( +typedef NDIS_STATUS +(DDKAPI *REQUEST_HANDLER)( IN NDIS_HANDLE MacBindingHandle, IN PNDIS_REQUEST NdisRequest); @@ -3953,12 +3953,12 @@ typedef NDIS_STATUS DDKAPI /* Structures available only to full MAC drivers */ -typedef BOOLEAN DDKAPI -(*PNDIS_INTERRUPT_SERVICE)( +typedef BOOLEAN +(DDKAPI *PNDIS_INTERRUPT_SERVICE)( IN PVOID InterruptContext); -typedef VOID DDKAPI -(*PNDIS_DEFERRED_PROCESSING)( +typedef VOID +(DDKAPI *PNDIS_DEFERRED_PROCESSING)( IN PVOID SystemSpecific1, IN PVOID InterruptContext, IN PVOID SystemSpecific2, @@ -4051,12 +4051,12 @@ typedef struct _NDIS_BIND_PATHS { } NDIS_BIND_PATHS, *PNDIS_BIND_PATHS; -typedef VOID DDKAPI -(*ETH_RCV_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *ETH_RCV_COMPLETE_HANDLER)( IN PETH_FILTER Filter); -typedef VOID DDKAPI -(*ETH_RCV_INDICATE_HANDLER)( +typedef VOID +(DDKAPI *ETH_RCV_INDICATE_HANDLER)( IN PETH_FILTER Filter, IN NDIS_HANDLE MacReceiveContext, IN PCHAR Address, @@ -4066,12 +4066,12 @@ typedef VOID DDKAPI IN UINT LookaheadBufferSize, IN UINT PacketSize); -typedef VOID DDKAPI -(*FDDI_RCV_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *FDDI_RCV_COMPLETE_HANDLER)( IN PFDDI_FILTER Filter); -typedef VOID DDKAPI -(*FDDI_RCV_INDICATE_HANDLER)( +typedef VOID +(DDKAPI *FDDI_RCV_INDICATE_HANDLER)( IN PFDDI_FILTER Filter, IN NDIS_HANDLE MacReceiveContext, IN PCHAR Address, @@ -4082,18 +4082,18 @@ typedef VOID DDKAPI IN UINT LookaheadBufferSize, IN UINT PacketSize); -typedef VOID DDKAPI -(*FILTER_PACKET_INDICATION_HANDLER)( +typedef VOID +(DDKAPI *FILTER_PACKET_INDICATION_HANDLER)( IN NDIS_HANDLE Miniport, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets); -typedef VOID DDKAPI -(*TR_RCV_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *TR_RCV_COMPLETE_HANDLER)( IN PTR_FILTER Filter); -typedef VOID DDKAPI -(*TR_RCV_INDICATE_HANDLER)( +typedef VOID +(DDKAPI *TR_RCV_INDICATE_HANDLER)( IN PTR_FILTER Filter, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, @@ -4102,75 +4102,75 @@ typedef VOID DDKAPI IN UINT LookaheadBufferSize, IN UINT PacketSize); -typedef VOID DDKAPI -(*WAN_RCV_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *WAN_RCV_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE NdisLinkContext); -typedef VOID DDKAPI -(*WAN_RCV_HANDLER)( +typedef VOID +(DDKAPI *WAN_RCV_HANDLER)( OUT PNDIS_STATUS Status, IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE NdisLinkContext, IN PUCHAR Packet, IN ULONG PacketSize); -typedef VOID FASTCALL -(*NDIS_M_DEQUEUE_WORK_ITEM)( +typedef VOID +(FASTCALL *NDIS_M_DEQUEUE_WORK_ITEM)( IN PNDIS_MINIPORT_BLOCK Miniport, IN NDIS_WORK_ITEM_TYPE WorkItemType, OUT PVOID *WorkItemContext); -typedef NDIS_STATUS FASTCALL -(*NDIS_M_QUEUE_NEW_WORK_ITEM)( +typedef NDIS_STATUS +(FASTCALL *NDIS_M_QUEUE_NEW_WORK_ITEM)( IN PNDIS_MINIPORT_BLOCK Miniport, IN NDIS_WORK_ITEM_TYPE WorkItemType, IN PVOID WorkItemContext); -typedef NDIS_STATUS FASTCALL -(*NDIS_M_QUEUE_WORK_ITEM)( +typedef NDIS_STATUS +(FASTCALL *NDIS_M_QUEUE_WORK_ITEM)( IN PNDIS_MINIPORT_BLOCK Miniport, IN NDIS_WORK_ITEM_TYPE WorkItemType, IN PVOID WorkItemContext); -typedef VOID DDKAPI -(*NDIS_M_REQ_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *NDIS_M_REQ_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status); -typedef VOID DDKAPI -(*NDIS_M_RESET_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *NDIS_M_RESET_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_STATUS Status, IN BOOLEAN AddressingReset); -typedef VOID DDKAPI -(*NDIS_M_SEND_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *NDIS_M_SEND_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status); -typedef VOID DDKAPI -(*NDIS_M_SEND_RESOURCES_HANDLER)( +typedef VOID +(DDKAPI *NDIS_M_SEND_RESOURCES_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle); -typedef BOOLEAN FASTCALL -(*NDIS_M_START_SENDS)( +typedef BOOLEAN +(FASTCALL *NDIS_M_START_SENDS)( IN PNDIS_MINIPORT_BLOCK Miniport); -typedef VOID DDKAPI -(*NDIS_M_STATUS_HANDLER)( +typedef VOID +(DDKAPI *NDIS_M_STATUS_HANDLER)( IN NDIS_HANDLE MiniportHandle, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize); -typedef VOID DDKAPI -(*NDIS_M_STS_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *NDIS_M_STS_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle); -typedef VOID DDKAPI -(*NDIS_M_TD_COMPLETE_HANDLER)( +typedef VOID +(DDKAPI *NDIS_M_TD_COMPLETE_HANDLER)( IN NDIS_HANDLE MiniportAdapterHandle, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, diff --git a/reactos/include/ddk/ntdd8042.h b/reactos/include/ddk/ntdd8042.h index 916d32254b7..0527ef42462 100644 --- a/reactos/include/ddk/ntdd8042.h +++ b/reactos/include/ddk/ntdd8042.h @@ -133,38 +133,38 @@ typedef struct _INTERNAL_I8042_START_INFORMATION { ULONG Reserved[8]; } INTERNAL_I8042_START_INFORMATION, *PINTERNAL_I8042_START_INFORMATION; -typedef VOID DDKAPI -(*PI8042_ISR_WRITE_PORT)( +typedef VOID +(DDKAPI *PI8042_ISR_WRITE_PORT)( IN PVOID Context, IN UCHAR Value); -typedef VOID DDKAPI -(*PI8042_QUEUE_PACKET)( +typedef VOID +(DDKAPI *PI8042_QUEUE_PACKET)( IN PVOID Context); -typedef NTSTATUS DDKAPI -(*PI8042_SYNCH_READ_PORT) ( +typedef NTSTATUS +(DDKAPI *PI8042_SYNCH_READ_PORT) ( IN PVOID Context, OUT PUCHAR Value, IN BOOLEAN WaitForACK); -typedef NTSTATUS DDKAPI -(*PI8042_SYNCH_WRITE_PORT)( +typedef NTSTATUS +(DDKAPI *PI8042_SYNCH_WRITE_PORT)( IN PVOID Context, IN UCHAR Value, IN BOOLEAN WaitForACK); -typedef NTSTATUS DDKAPI -(*PI8042_KEYBOARD_INITIALIZATION_ROUTINE)( +typedef NTSTATUS +(DDKAPI *PI8042_KEYBOARD_INITIALIZATION_ROUTINE)( IN PVOID InitializationContext, IN PVOID SynchFuncContext, IN PI8042_SYNCH_READ_PORT ReadPort, IN PI8042_SYNCH_WRITE_PORT WritePort, OUT PBOOLEAN TurnTranslationOn); -typedef BOOLEAN DDKAPI -(*PI8042_KEYBOARD_ISR)( +typedef BOOLEAN +(DDKAPI *PI8042_KEYBOARD_ISR)( PVOID IsrContext, PKEYBOARD_INPUT_DATA CurrentInput, POUTPUT_PACKET CurrentOutput, @@ -182,8 +182,8 @@ typedef struct _INTERNAL_I8042_HOOK_KEYBOARD { IN PVOID CallContext; } INTERNAL_I8042_HOOK_KEYBOARD, *PINTERNAL_I8042_HOOK_KEYBOARD; -typedef BOOLEAN DDKAPI -(*PI8042_MOUSE_ISR)( +typedef BOOLEAN +(DDKAPI *PI8042_MOUSE_ISR)( PVOID IsrContext, PMOUSE_INPUT_DATA CurrentInput, POUTPUT_PACKET CurrentOutput, diff --git a/reactos/include/ddk/tdikrnl.h b/reactos/include/ddk/tdikrnl.h index 2c366f6d2d7..6d7128da18a 100644 --- a/reactos/include/ddk/tdikrnl.h +++ b/reactos/include/ddk/tdikrnl.h @@ -156,8 +156,8 @@ typedef struct _TDI_REQUEST_KERNEL_SET_INFO { #define TDI_EVENT_CHAINED_RECEIVE_EXPEDITED 9 #define TDI_EVENT_ERROR_EX 10 -typedef NTSTATUS DDKAPI -(*PTDI_IND_CONNECT)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_CONNECT)( IN PVOID TdiEventContext, IN LONG RemoteAddressLength, IN PVOID RemoteAddress, @@ -182,8 +182,8 @@ TdiDefaultConnectHandler( OUT CONNECTION_CONTEXT *ConnectionContext, OUT PIRP *AcceptIrp); -typedef NTSTATUS DDKAPI -(*PTDI_IND_DISCONNECT)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_DISCONNECT)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN LONG DisconnectDataLength, @@ -204,13 +204,13 @@ TdiDefaultDisconnectHandler( IN PVOID DisconnectInformation, IN ULONG DisconnectFlags); -typedef NTSTATUS DDKAPI -(*PTDI_IND_ERROR)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_ERROR)( IN PVOID TdiEventContext, IN NTSTATUS Status); -typedef NTSTATUS DDKAPI -(*PTDI_IND_ERROR_EX)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_ERROR_EX)( IN PVOID TdiEventContext, IN NTSTATUS Status, IN PVOID Buffer); @@ -222,8 +222,8 @@ TdiDefaultErrorHandler( IN PVOID TdiEventContext, IN NTSTATUS Status); -typedef NTSTATUS DDKAPI -(*PTDI_IND_RECEIVE)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_RECEIVE)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, @@ -246,8 +246,8 @@ TdiDefaultReceiveHandler( IN PVOID Tsdu, OUT PIRP *IoRequestPacket); -typedef NTSTATUS DDKAPI -(*PTDI_IND_RECEIVE_DATAGRAM)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_RECEIVE_DATAGRAM)( IN PVOID TdiEventContext, IN LONG SourceAddressLength, IN PVOID SourceAddress, @@ -275,8 +275,8 @@ TdiDefaultRcvDatagramHandler( IN PVOID Tsdu, OUT PIRP *IoRequestPacket); -typedef NTSTATUS DDKAPI -(*PTDI_IND_RECEIVE_EXPEDITED)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_RECEIVE_EXPEDITED)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, @@ -299,8 +299,8 @@ TdiDefaultRcvExpeditedHandler( IN PVOID Tsdu, OUT PIRP *IoRequestPacket); -typedef NTSTATUS DDKAPI -(*PTDI_IND_CHAINED_RECEIVE)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_CHAINED_RECEIVE)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, @@ -321,8 +321,8 @@ TdiDefaultChainedReceiveHandler( IN PMDL Tsdu, IN PVOID TsduDescriptor); -typedef NTSTATUS DDKAPI -(*PTDI_IND_CHAINED_RECEIVE_DATAGRAM)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_CHAINED_RECEIVE_DATAGRAM)( IN PVOID TdiEventContext, IN LONG SourceAddressLength, IN PVOID SourceAddress, @@ -349,8 +349,8 @@ TdiDefaultChainedRcvDatagramHandler( IN PMDL Tsdu, IN PVOID TsduDescriptor); -typedef NTSTATUS DDKAPI -(*PTDI_IND_CHAINED_RECEIVE_EXPEDITED)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_CHAINED_RECEIVE_EXPEDITED)( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, @@ -371,8 +371,8 @@ TdiDefaultChainedRcvExpeditedHandler( IN PMDL Tsdu, IN PVOID TsduDescriptor); -typedef NTSTATUS DDKAPI -(*PTDI_IND_SEND_POSSIBLE)( +typedef NTSTATUS +(DDKAPI *PTDI_IND_SEND_POSSIBLE)( IN PVOID TdiEventContext, IN PVOID ConnectionContext, IN ULONG BytesAvailable); @@ -866,49 +866,49 @@ typedef struct _TDI_PNP_CONTEXT { UCHAR ContextData[1]; } TDI_PNP_CONTEXT, *PTDI_PNP_CONTEXT; -typedef VOID DDKAPI -(*TDI_ADD_ADDRESS_HANDLER)( +typedef VOID +(DDKAPI *TDI_ADD_ADDRESS_HANDLER)( IN PTA_ADDRESS Address); -typedef VOID DDKAPI -(*TDI_ADD_ADDRESS_HANDLER_V2)( +typedef VOID +(DDKAPI *TDI_ADD_ADDRESS_HANDLER_V2)( IN PTA_ADDRESS Address, IN PUNICODE_STRING DeviceName, IN PTDI_PNP_CONTEXT Context); -typedef VOID DDKAPI -(*TDI_BINDING_HANDLER)( +typedef VOID +(DDKAPI *TDI_BINDING_HANDLER)( IN TDI_PNP_OPCODE PnPOpcode, IN PUNICODE_STRING DeviceName, IN PWSTR MultiSZBindList); -typedef VOID DDKAPI -(*TDI_BIND_HANDLER)( +typedef VOID +(DDKAPI *TDI_BIND_HANDLER)( IN PUNICODE_STRING DeviceName); -typedef VOID DDKAPI -(*TDI_DEL_ADDRESS_HANDLER)( +typedef VOID +(DDKAPI *TDI_DEL_ADDRESS_HANDLER)( IN PTA_ADDRESS Address); -typedef VOID DDKAPI -(*TDI_DEL_ADDRESS_HANDLER_V2)( +typedef VOID +(DDKAPI *TDI_DEL_ADDRESS_HANDLER_V2)( IN PTA_ADDRESS Address, IN PUNICODE_STRING DeviceName, IN PTDI_PNP_CONTEXT Context); -typedef NTSTATUS DDKAPI -(*TDI_PNP_POWER_HANDLER)( +typedef NTSTATUS +(DDKAPI *TDI_PNP_POWER_HANDLER)( IN PUNICODE_STRING DeviceName, IN PNET_PNP_EVENT PowerEvent, IN PTDI_PNP_CONTEXT Context1, IN PTDI_PNP_CONTEXT Context2); -typedef VOID DDKAPI -(*TDI_UNBIND_HANDLER)( +typedef VOID +(DDKAPI *TDI_UNBIND_HANDLER)( IN PUNICODE_STRING DeviceName); -typedef VOID DDKAPI -(*ProviderPnPPowerComplete)( +typedef VOID +(DDKAPI *ProviderPnPPowerComplete)( IN PNET_PNP_EVENT NetEvent, IN NTSTATUS ProviderStatus); From 709b93538f69e8c0383504ac1a39fedebf9654a7 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 14:54:31 +0000 Subject: [PATCH 552/577] - Leftover from previous commit svn path=/trunk/; revision=42211 --- reactos/include/ddk/ndis.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ddk/ndis.h b/reactos/include/ddk/ndis.h index ee74dc71711..4925d76a5ea 100644 --- a/reactos/include/ddk/ndis.h +++ b/reactos/include/ddk/ndis.h @@ -1540,7 +1540,7 @@ typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; #elif defined(NDIS40) typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { - NDIS40_PROTOCOL_CHARACTERISTICS_S; + NDIS40_PROTOCOL_CHARACTERISTICS_S } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; #else /* NDIS30 */ typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { From dd27bbdbb7fbbc4da11992ea1317b64ba7a48f64 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 14:55:52 +0000 Subject: [PATCH 553/577] - Leftover 2 from 42210 svn path=/trunk/; revision=42212 --- reactos/lib/drivers/ip/transport/tcp/if.c | 6 ++++-- reactos/lib/drivers/ip/transport/udp/udp.c | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/lib/drivers/ip/transport/tcp/if.c b/reactos/lib/drivers/ip/transport/tcp/if.c index afaeb91f7de..d9598aff798 100644 --- a/reactos/lib/drivers/ip/transport/tcp/if.c +++ b/reactos/lib/drivers/ip/transport/tcp/if.c @@ -33,14 +33,16 @@ struct ifnet *ifnet; POSK_IFADDR TCPGetInterfaceData( PIP_INTERFACE IF ) { NTSTATUS Status; POSK_IFADDR ifaddr = IF->TCPContext; + struct sockaddr_in *addr_in; + struct sockaddr_in *dstaddr_in; ASSERT(ifaddr); ASSERT_LOCKED(&TCPLock); RtlZeroMemory(ifaddr, sizeof(OSK_IFADDR) + 2 * sizeof( struct sockaddr_in )); - struct sockaddr_in *addr_in = (struct sockaddr_in *)&ifaddr[1]; - struct sockaddr_in *dstaddr_in = (struct sockaddr_in *)&addr_in[1]; + addr_in = (struct sockaddr_in *)&ifaddr[1]; + dstaddr_in = (struct sockaddr_in *)&addr_in[1]; TI_DbgPrint(DEBUG_TCPIF,("Called\n")); diff --git a/reactos/lib/drivers/ip/transport/udp/udp.c b/reactos/lib/drivers/ip/transport/udp/udp.c index 0b586b98a98..a723eeaf1dc 100644 --- a/reactos/lib/drivers/ip/transport/udp/udp.c +++ b/reactos/lib/drivers/ip/transport/udp/udp.c @@ -312,12 +312,12 @@ NTSTATUS UDPStartup( * Status of operation */ { + NTSTATUS Status; + #ifdef __NTDRIVER__ RtlZeroMemory(&UDPStats, sizeof(UDP_STATISTICS)); #endif - NTSTATUS Status; - Status = PortsStartup( &UDPPorts, 1, UDP_STARTING_PORT + UDP_DYNAMIC_PORTS ); if( !NT_SUCCESS(Status) ) return Status; From 50eda0f7b9db722600722ddf5aa052af0faae516 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 15:31:57 +0000 Subject: [PATCH 554/577] - Fix incorrect definition of ZwCreateDebugObject after revision 41969 -- spotted by BugBoy svn path=/trunk/; revision=42213 --- reactos/include/ndk/dbgkfuncs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ndk/dbgkfuncs.h b/reactos/include/ndk/dbgkfuncs.h index 1e2b1bb964a..6301eaabd66 100644 --- a/reactos/include/ndk/dbgkfuncs.h +++ b/reactos/include/ndk/dbgkfuncs.h @@ -99,7 +99,7 @@ ZwCreateDebugObject( OUT PHANDLE DebugHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN KillProcessOnExit + IN ULONG Flags ); NTSYSAPI From 0f8b51f5ac87d3955a25324ef9097ac85f2954d0 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sat, 25 Jul 2009 15:57:18 +0000 Subject: [PATCH 555/577] - Add stubs for AppCleanup and videoThunk32 - Partially implement capCreateCaptureWindowW and capGetDriverDescriptionW svn path=/trunk/; revision=42214 --- reactos/dll/win32/avicap32/avicap32.c | 197 ++++++++++++++++++++++- reactos/dll/win32/avicap32/avicap32.spec | 6 +- 2 files changed, 195 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/avicap32/avicap32.c b/reactos/dll/win32/avicap32/avicap32.c index 816a46d2e27..7220f7a2e6d 100644 --- a/reactos/dll/win32/avicap32/avicap32.c +++ b/reactos/dll/win32/avicap32/avicap32.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "wine/debug.h" @@ -16,8 +17,35 @@ WINE_DEFAULT_DEBUG_CHANNEL(avicap32); +HINSTANCE hInstance; + + +/* INTRENAL FUNCTIONS **************************************************/ + +LRESULT +CALLBACK +CaptureWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + switch (Msg) + { + case WM_CREATE: + break; + + case WM_PAINT: + break; + + case WM_DESTROY: + break; + } + + return DefWindowProc(hwnd, Msg, wParam, lParam); +} + + +/* FUNCTIONS ***********************************************************/ + /* - * unimplemented + * implemented */ HWND VFWAPI @@ -30,8 +58,37 @@ capCreateCaptureWindowW(LPCWSTR lpszWindowName, HWND hWnd, INT nID) { - UNIMPLEMENTED; - return NULL; + WCHAR szWindowClass[] = L"ClsCapWin"; + WNDCLASSEXW WndClass = {0}; + DWORD dwExStyle = 0; + + FIXME("capCreateCaptureWindowW() not fully implemented!\n"); + + WndClass.cbSize = sizeof(WNDCLASSEXW); + WndClass.lpszClassName = szWindowClass; + WndClass.lpfnWndProc = CaptureWindowProc; /* TODO: Implement CaptureWindowProc */ + WndClass.hInstance = hInstance; + WndClass.style = CS_HREDRAW | CS_VREDRAW; + WndClass.hCursor = LoadCursorW(0, IDC_ARROW); + WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + + if (RegisterClassExW(&WndClass) == (ATOM)0) + { + if (GetLastError() != ERROR_ALREADY_EXISTS) + return NULL; + } + + return CreateWindowExW(dwExStyle, + szWindowClass, + lpszWindowName, + dwStyle, + x, y, + nWidth, + nHeight, + hWnd, + (HMENU)nID, + hInstance, + NULL); } /* @@ -70,7 +127,7 @@ capCreateCaptureWindowA(LPCSTR lpszWindowName, /* - * unimplemented + * implemented */ BOOL VFWAPI @@ -80,7 +137,112 @@ capGetDriverDescriptionW(WORD wDriverIndex, LPWSTR lpszVer, INT cbVer) { - UNIMPLEMENTED; + DWORD dwSize, dwIndex = 0; + WCHAR szDriver[MAX_PATH]; + WCHAR szDriverName[MAX_PATH]; + WCHAR szFileName[MAX_PATH]; + WCHAR szVersion[MAX_PATH]; + HKEY hKey, hSubKey; + + /* TODO: Add support of data acquisition from system.ini */ + FIXME("capGetDriverDescriptionW() not fully implemented!\n"); + + if (lpszName && cbName) + lpszName[0] = L'\0'; + + if (lpszVer && cbVer) + lpszVer[0] = L'\0'; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"SYSTEM\\CurrentControlSet\\Control\\MediaResources\\msvideo", + 0, + KEY_READ, + &hKey) != ERROR_SUCCESS) + { + return FALSE; + } + + dwSize = sizeof(szDriver) / sizeof(WCHAR); + + while (RegEnumKeyExW(hKey, dwIndex, + szDriver, &dwSize, + NULL, NULL, + NULL, NULL) == ERROR_SUCCESS) + { + if (RegOpenKeyW(hKey, szDriver, &hSubKey) == ERROR_SUCCESS) + { + dwSize = sizeof(szFileName) / sizeof(WCHAR); + + if (RegQueryValueExW(hSubKey, + L"Driver", + NULL, + NULL, + (LPBYTE)&szFileName, + &dwSize) == ERROR_SUCCESS) + { + dwSize = sizeof(szDriverName) / sizeof(WCHAR); + + if (RegQueryValueExW(hSubKey, + L"FriendlyName", + NULL, + NULL, + (LPBYTE)&szDriverName, + &dwSize) != ERROR_SUCCESS) + { + wcscpy(szDriverName, L"Unknown Driver Name"); + } + + if (dwIndex == (DWORD)wDriverIndex) + { + if (lpszName && cbName) + { + lstrcpynW(lpszName, szDriverName, cbName); + } + + if (lpszVer && cbVer) + { + LPVOID Version, Ms; + DWORD dwInfoSize; + VS_FIXEDFILEINFO FileInfo; + UINT Ls; + + dwInfoSize = GetFileVersionInfoSize(szFileName, NULL); + if (dwInfoSize) + { + Version = HeapAlloc(GetProcessHeap(), 0, dwInfoSize); + + GetFileVersionInfo(szFileName, 0, dwInfoSize, Version); + + if (VerQueryValueW(Version, L"\\", &Ms, &Ls)) + { + memmove(&FileInfo, Ms, Ls); + swprintf(szVersion, L"Version: %d.%d.%d.%d", + HIWORD(FileInfo.dwFileVersionMS), + LOWORD(FileInfo.dwFileVersionMS), + HIWORD(FileInfo.dwFileVersionLS), + LOWORD(FileInfo.dwFileVersionLS)); + + lstrcpynW(lpszVer, szVersion, cbVer); + } + HeapFree(GetProcessHeap(), 0, Version); + } + } + + RegCloseKey(hSubKey); + RegCloseKey(hKey); + return TRUE; + } + } + + RegCloseKey(hSubKey); + } + + dwSize = sizeof(szDriver) / sizeof(WCHAR); + dwIndex++; + } + + RegCloseKey(hKey); + return FALSE; } @@ -110,6 +272,29 @@ capGetDriverDescriptionA(WORD wDriverIndex, } +/* + * unimplemented + */ +VOID +VFWAPI +AppCleanup(HINSTANCE hInst) +{ + UNIMPLEMENTED; +} + + +/* + * unimplemented + */ +DWORD +VFWAPI +videoThunk32(DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4, DWORD dwUnknown5) +{ + UNIMPLEMENTED; + return 0; +} + + BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, @@ -119,6 +304,8 @@ DllMain(IN HINSTANCE hinstDLL, switch (dwReason) { case DLL_PROCESS_ATTACH: + TRACE("avicap32 attached!\n"); + hInstance = hinstDLL; break; } diff --git a/reactos/dll/win32/avicap32/avicap32.spec b/reactos/dll/win32/avicap32/avicap32.spec index 6be95250024..348f5241ad9 100644 --- a/reactos/dll/win32/avicap32/avicap32.spec +++ b/reactos/dll/win32/avicap32/avicap32.spec @@ -1,6 +1,6 @@ -@ stub AppCleanup -@ stdcall capCreateCaptureWindowA(str long long long long long long long) +@ stdcall AppCleanup(ptr) +@ stdcall capCreateCaptureWindowA(str long long long long long long long) @ stdcall capCreateCaptureWindowW(wstr long long long long long long long) @ stdcall capGetDriverDescriptionA(long ptr long ptr long) @ stdcall capGetDriverDescriptionW(long ptr long ptr long) -@ stub videoThunk32 +@ stdcall videoThunk32(long long long long long) From 64f43cb6a59766dbe1d725d1d6cd15a7398a73b8 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 16:53:25 +0000 Subject: [PATCH 556/577] - Fix a critical bug in ExAllocatePoolWithQuota spotted by msvc. Because of the current POOL_TAGGING mess in wdm.h, ExAllocatePoolWithQuotaTag is defined to ExAllocatePoolWithQuota, so when ExAllocatePoolWithQuota called the with-tag version, it ended up calling _itself_. Fix this by undefining the broken macro. svn path=/trunk/; revision=42215 --- reactos/ntoskrnl/mm/pool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c index ba39774a5cc..dc09263a881 100644 --- a/reactos/ntoskrnl/mm/pool.c +++ b/reactos/ntoskrnl/mm/pool.c @@ -164,6 +164,7 @@ ExAllocatePoolWithTag (POOL_TYPE PoolType, ULONG NumberOfBytes, ULONG Tag) * @implemented */ #undef ExAllocatePoolWithQuota +#undef ExAllocatePoolWithQuotaTag PVOID NTAPI ExAllocatePoolWithQuota (POOL_TYPE PoolType, ULONG NumberOfBytes) { @@ -201,7 +202,6 @@ ExAllocatePoolWithTagPriority( /* * @implemented */ -#undef ExAllocatePoolWithQuotaTag PVOID NTAPI ExAllocatePoolWithQuotaTag (IN POOL_TYPE PoolType, From f9f57c59fc6c617c6493500501bea9bbe53e21e4 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 19:38:52 +0000 Subject: [PATCH 557/577] - FIELD_OFFSET returns LONG, not LONG_PTR or size_t. - Define TYPE_ALIGNMENT for msvc. - Define DbgPrintEx the same way in NDK and DDK - C_ASSERT is a typedef, so don't put it inside functions as msvc doesn't allow this. - Kernel now *compiles* with RosBE + msvc _and_ our DDK. Linker errors from the ninth circle of hell remains. svn path=/trunk/; revision=42216 --- reactos/include/ddk/ntdef.h | 10 ++-- reactos/include/ddk/winddk.h | 1 + reactos/include/host/typedefs.h | 4 +- reactos/include/psdk/winnt.h | 6 +- reactos/ntoskrnl/ke/wait.c | 6 +- reactos/ntoskrnl/mm/pe.c | 99 ++++++++++++++++++++++++++------- 6 files changed, 92 insertions(+), 34 deletions(-) diff --git a/reactos/include/ddk/ntdef.h b/reactos/include/ddk/ntdef.h index 747997b7b69..24082bd10cf 100644 --- a/reactos/include/ddk/ntdef.h +++ b/reactos/include/ddk/ntdef.h @@ -155,20 +155,20 @@ typedef unsigned long POINTER_64; // FIXME! HACK!!! // // Returns the byte offset of the specified structure's member // -#ifndef FIELD_OFFSET #ifndef __GNUC__ -#define FIELD_OFFSET(Type, Field) \ - ((LONG)(LONG_PTR) (&(((Type *) 0)->Field))) +#define FIELD_OFFSET(Type, Field) ((LONG)(LONG_PTR)&(((Type*) 0)->Field)) #else #define FIELD_OFFSET(Type, Field) __builtin_offsetof(Type, Field) #endif -#endif // // Returns the type's alignment // +#if defined(_MSC_VER) && (_MSC_VER >= 1300) +#define TYPE_ALIGNMENT(t) __alignof(t) +#else #define TYPE_ALIGNMENT(t) FIELD_OFFSET( struct { char x; t test; }, test ) - +#endif // // Calling Conventions diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h index 0ecca592a40..7518597e8ba 100644 --- a/reactos/include/ddk/winddk.h +++ b/reactos/include/ddk/winddk.h @@ -10277,6 +10277,7 @@ DbgPrint( IN PCCH Format, IN ...); +NTSYSAPI ULONG DDKCDECLAPI DbgPrintEx( diff --git a/reactos/include/host/typedefs.h b/reactos/include/host/typedefs.h index 193ec7a3dd6..a1feea86362 100644 --- a/reactos/include/host/typedefs.h +++ b/reactos/include/host/typedefs.h @@ -219,9 +219,9 @@ typedef const UNICODE_STRING *PCUNICODE_STRING; #define NT_SUCCESS(x) ((x)>=0) #if !defined(__GNUC__) -#define FIELD_OFFSET(t,f) ((LONG_PTR)&(((t*)0)->f)) +#define FIELD_OFFSET(t,f) ((LONG)(LONG_PTR)&(((t*) 0)->f)) #else -#define FIELD_OFFSET(t,f) __builtin_offsetof(t,f) +#define FIELD_OFFSET(t,f) ((LONG)__builtin_offsetof(t,f)) #endif #define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s } #define CONTAINING_RECORD(address, type, field) ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field)))) diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index ea32ffdbb17..610f6afad77 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -1311,10 +1311,10 @@ typedef enum { #define RTL_CRITSECT_TYPE 0 #define RTL_RESOURCE_TYPE 1 /* Also in winddk.h */ -#ifndef __GNUC__ -#define FIELD_OFFSET(t,f) ((LONG_PTR)&(((t*)0)->f)) +#if !defined(__GNUC__) +#define FIELD_OFFSET(t,f) ((LONG)(LONG_PTR)&(((t*) 0)->f)) #else -#define FIELD_OFFSET(t,f) __builtin_offsetof(t,f) +#define FIELD_OFFSET(t,f) ((LONG)__builtin_offsetof(t,f)) #endif #ifndef CONTAINING_RECORD #define CONTAINING_RECORD(address, type, field) \ diff --git a/reactos/ntoskrnl/ke/wait.c b/reactos/ntoskrnl/ke/wait.c index 86bdbc11e1e..ac1ae640d51 100644 --- a/reactos/ntoskrnl/ke/wait.c +++ b/reactos/ntoskrnl/ke/wait.c @@ -117,6 +117,9 @@ KiAcquireFastMutex(IN PFAST_MUTEX FastMutex) NULL); } +/* KiAcquireGuardedMutex depends on these bits being right */ +C_ASSERT((GM_LOCK_WAITER_WOKEN * 2) == GM_LOCK_WAITER_INC); + VOID FASTCALL KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex) @@ -181,9 +184,6 @@ KiAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex) /* Ok, the wait is done, so set the new bits */ BitsToRemove = GM_LOCK_BIT | GM_LOCK_WAITER_WOKEN; BitsToAdd = GM_LOCK_WAITER_WOKEN; - - /* We depend on these bits being just right */ - C_ASSERT((GM_LOCK_WAITER_WOKEN * 2) == GM_LOCK_WAITER_INC); } } diff --git a/reactos/ntoskrnl/mm/pe.c b/reactos/ntoskrnl/mm/pe.c index 2b94a321f94..49b5b191df4 100644 --- a/reactos/ntoskrnl/mm/pe.c +++ b/reactos/ntoskrnl/mm/pe.c @@ -136,6 +136,84 @@ static __inline BOOLEAN AlignUp(OUT PULONG AlignedAddress, IN ULONG Address, IN (RTL_FIELD_SIZE(TYPE1_, FIELD_) == RTL_FIELD_SIZE(TYPE2_, FIELD_)) \ ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// +// FIXME: All this whitespace is "padding" so the C_ASSERTs aren't on the same lines as asserts in other headers. +// This is necessary because of the way we define C_ASSERT in a gcc compatible way. +// This can be removed once we upgrade to gcc 4.3.x or later (which implements __COUNTER__). +// + + + + + + + + + + + + + + + + + + + + + + + + +// +// PeFmtCreateSection depends on the following: +// +C_ASSERT(EXEFMT_LOAD_HEADER_SIZE >= sizeof(IMAGE_DOS_HEADER)); +C_ASSERT(sizeof(IMAGE_NT_HEADERS32) <= sizeof(IMAGE_NT_HEADERS64)); + +C_ASSERT(TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) == TYPE_ALIGNMENT(IMAGE_NT_HEADERS64)); +C_ASSERT(RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS32, FileHeader) == RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS64, FileHeader)); +C_ASSERT(FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader) == FIELD_OFFSET(IMAGE_NT_HEADERS64, OptionalHeader)); + +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Magic)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SectionAlignment)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, FileAlignment)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Subsystem)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SizeOfCode)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SizeOfHeaders)); + /* References: [1] Microsoft Corporation, "Microsoft Portable Executable and Common Object @@ -178,7 +256,6 @@ NTSTATUS NTAPI PeFmtCreateSection(IN CONST VOID * FileHeader, ASSERT(Intsafe_CanOffsetPointer(FileHeader, FileHeaderSize)); - C_ASSERT(EXEFMT_LOAD_HEADER_SIZE >= sizeof(IMAGE_DOS_HEADER)); ASSERT(((UINT_PTR)FileHeader % TYPE_ALIGNMENT(IMAGE_DOS_HEADER)) == 0); #define DIE(ARGS_) { DPRINT ARGS_; goto l_Return; } @@ -219,11 +296,6 @@ NTSTATUS NTAPI PeFmtCreateSection(IN CONST VOID * FileHeader, pinhNtHeader = (PVOID)((UINT_PTR)FileHeader + pidhDosHeader->e_lfanew); } - C_ASSERT(sizeof(IMAGE_NT_HEADERS32) <= sizeof(IMAGE_NT_HEADERS64)); - C_ASSERT(TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) == TYPE_ALIGNMENT(IMAGE_NT_HEADERS64)); - C_ASSERT(RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS32, FileHeader) == RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS64, FileHeader)); - C_ASSERT(FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader) == FIELD_OFFSET(IMAGE_NT_HEADERS64, OptionalHeader)); - /* * the buffer doesn't contain the NT file header, or the alignment is wrong: we * need to read the header from the file @@ -307,8 +379,6 @@ l_ReadHeaderFromFile: nStatus = STATUS_INVALID_IMAGE_FORMAT; - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Magic)); - if(!RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, Magic)) DIE(("The optional header doesn't contain the Magic field, SizeOfOptionalHeader is %X\n", cbOptHeaderSize)); @@ -324,9 +394,6 @@ l_ReadHeaderFromFile: DIE(("Unrecognized optional header, Magic is %X\n", piohOptHeader->Magic)); } - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SectionAlignment)); - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, FileAlignment)); - if (RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SectionAlignment) && RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, FileAlignment)) { @@ -421,10 +488,6 @@ l_ReadHeaderFromFile: if((ULONG_PTR)ImageSectionObject->ImageBase % 0x10000) DIE(("ImageBase is not aligned on a 64KB boundary")); - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Subsystem)); - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion)); - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion)); - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, Subsystem)) { ImageSectionObject->Subsystem = piohOptHeader->Subsystem; @@ -437,16 +500,12 @@ l_ReadHeaderFromFile: } } - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint)); - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, AddressOfEntryPoint)) { ImageSectionObject->EntryPoint = piohOptHeader->ImageBase + piohOptHeader->AddressOfEntryPoint; } - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SizeOfCode)); - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfCode)) ImageSectionObject->Executable = piohOptHeader->SizeOfCode != 0; else @@ -483,8 +542,6 @@ l_ReadHeaderFromFile: if(!Intsafe_AddULong32(&cbSectionHeadersOffsetSize, cbSectionHeadersOffset, cbSectionHeadersSize)) DIE(("Section headers too large\n")); - C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SizeOfHeaders)); - /* size of the executable's headers */ if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfHeaders)) { From 849236d3ac69d148cbf5784a2ce9c047e1168371 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 25 Jul 2009 19:51:54 +0000 Subject: [PATCH 558/577] - Make ipconfig /renew work even if we haven't got an address yet - Fix several potential crashes - Fix an infinite loop caused by us sending a discover packet without adding a protocol first (this is exposed by releasing then renewing) - Fixes bug 4630 svn path=/trunk/; revision=42217 --- reactos/base/services/dhcp/api.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/reactos/base/services/dhcp/api.c b/reactos/base/services/dhcp/api.c index c1ec11e11db..268466980b6 100644 --- a/reactos/base/services/dhcp/api.c +++ b/reactos/base/services/dhcp/api.c @@ -78,6 +78,7 @@ DWORD DSQueryHWInfo( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { DWORD DSReleaseIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { COMM_DHCP_REPLY Reply; PDHCP_ADAPTER Adapter; + struct protocol* proto; ApiLock(); @@ -86,8 +87,12 @@ DWORD DSReleaseIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { Reply.Reply = Adapter ? 1 : 0; if( Adapter ) { - DeleteIPAddress( Adapter->NteContext ); - remove_protocol( find_protocol_by_adapter( &Adapter->DhclientInfo ) ); + if (Adapter->NteContext) + DeleteIPAddress( Adapter->NteContext ); + + proto = find_protocol_by_adapter( &Adapter->DhclientInfo ); + if (proto) + remove_protocol(proto); } ApiUnlock(); @@ -103,7 +108,7 @@ DWORD DSRenewIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { Adapter = AdapterFindIndex( Req->AdapterIndex ); - if( !Adapter || Adapter->DhclientState.state != S_BOUND ) { + if( !Adapter || Adapter->DhclientState.state == S_STATIC ) { Reply.Reply = 0; ApiUnlock(); return Send( &Reply ); @@ -111,8 +116,11 @@ DWORD DSRenewIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { Reply.Reply = 1; - send_discover( &Adapter->DhclientInfo ); - state_bound( &Adapter->DhclientInfo ); + add_protocol( Adapter->DhclientInfo.name, + Adapter->DhclientInfo.rfdesc, got_one, + &Adapter->DhclientInfo ); + Adapter->DhclientInfo.client->state = S_INIT; + state_reboot(&Adapter->DhclientInfo); ApiUnlock(); @@ -123,6 +131,7 @@ DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { NTSTATUS Status; COMM_DHCP_REPLY Reply; PDHCP_ADAPTER Adapter; + struct protocol* proto; ApiLock(); @@ -131,9 +140,12 @@ DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { Reply.Reply = Adapter ? 1 : 0; if( Adapter ) { - DeleteIPAddress( Adapter->NteContext ); + if (Adapter->NteContext) + DeleteIPAddress( Adapter->NteContext ); Adapter->DhclientState.state = S_STATIC; - remove_protocol( find_protocol_by_adapter( &Adapter->DhclientInfo ) ); + proto = find_protocol_by_adapter( &Adapter->DhclientInfo ); + if (proto) + remove_protocol(proto); Status = AddIPAddress( Req->Body.StaticRefreshParams.IPAddress, Req->Body.StaticRefreshParams.Netmask, Req->AdapterIndex, From 45934cfbe5717228145d22bf8a7cc0e95a8ee07b Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 20:17:23 +0000 Subject: [PATCH 559/577] - Fix most freeldr compilation issues, most notably: - Define structure packing correctly for msvc. - Define Ke386EraseFlags for msvc too. - Don't return a function returning void in a function returning void. - VideoFadeIn: Don't rely on some fishy gcc extension for allocating memory from the stack -- just use the heap instead. - Winldr remains svn path=/trunk/; revision=42218 --- reactos/boot/freeldr/freeldr/arch/i386/i386vid.c | 10 +++------- reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c | 10 +++------- reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c | 10 +++------- .../freeldr/freeldr/include/arch/i386/machpc.h | 4 ++-- .../freeldr/freeldr/include/arch/i386/machxbox.h | 4 ++-- reactos/boot/freeldr/freeldr/include/freeldr.h | 14 ++++++++++++-- reactos/boot/freeldr/freeldr/machine.c | 8 ++++---- reactos/boot/freeldr/freeldr/reactos/binhive.c | 2 +- reactos/boot/freeldr/freeldr/reactos/setupldr.c | 10 +++++----- reactos/boot/freeldr/freeldr/rtl/libsupp.c | 2 +- reactos/boot/freeldr/freeldr/ui/tui.c | 2 +- reactos/boot/freeldr/freeldr/video/fade.c | 5 ++++- 12 files changed, 41 insertions(+), 40 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c b/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c index 15ef3e6b450..a5a61cb7709 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386vid.c @@ -22,12 +22,7 @@ #define NDEBUG #include -/* non-standard specifier from windef.h -- please deprecate */ -#undef PACKED -#ifdef __GNUC__ -#define PACKED __attribute__((packed)) -#endif - +#include typedef struct { UCHAR Signature[4]; // (ret) signature ("VESA") @@ -55,7 +50,8 @@ typedef struct // accelerated video modes (list of words terminated with FFFFh) UCHAR Reserved[216]; // reserved for VBE implementation UCHAR ScratchPad[256]; // OEM scratchpad (for OEM strings, etc.) -} PACKED VESA_SVGA_INFO, *PVESA_SVGA_INFO; +} VESA_SVGA_INFO, *PVESA_SVGA_INFO; +#include // Bitfields for VESA capabilities: // diff --git a/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c b/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c index 1a2d5b9cd0a..23167831577 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/pcdisk.c @@ -22,12 +22,7 @@ #define NDEBUG #include -/* non-standard specifier from windef.h -- please deprecate */ -#undef PACKED -#ifdef __GNUC__ -#define PACKED __attribute__((packed)) -#endif - +#include typedef struct { UCHAR PacketSize; // 00h - Size of packet (10h or 18h) @@ -40,7 +35,8 @@ typedef struct // used if DWORD at 04h is FFFFh:FFFFh // Commented since some earlier BIOSes refuse to work with // such extended structure -} PACKED I386_DISK_ADDRESS_PACKET, *PI386_DISK_ADDRESS_PACKET; +} I386_DISK_ADDRESS_PACKET, *PI386_DISK_ADDRESS_PACKET; +#include ///////////////////////////////////////////////////////////////////////////////////////////// // FUNCTIONS diff --git a/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c b/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c index b17d6ee98c9..6e04ea62261 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c @@ -22,12 +22,6 @@ #define NDEBUG #include -/* non-standard specifier from windef.h -- please deprecate */ -#undef PACKED -#ifdef __GNUC__ -#define PACKED __attribute__((packed)) -#endif - #define VIDEOPORT_PALETTE_READ 0x03C7 #define VIDEOPORT_PALETTE_WRITE 0x03C8 #define VIDEOPORT_PALETTE_DATA 0x03C9 @@ -57,6 +51,7 @@ #define VERTRES_350_SCANLINES 0x01 #define VERTRES_400_SCANLINES 0x02 +#include typedef struct { USHORT ModeAttributes; /* mode attributes (see #00080) */ @@ -110,7 +105,8 @@ typedef struct UCHAR LinearReservedMaskPosition; /* linear modes:Bit position of reserved mask LSB */ ULONG MaximumPixelClock; /* maximum pixel clock for graphics video mode, in Hz */ UCHAR Reserved2[190]; /* 190 BYTEs reserved (0) */ -} PACKED SVGA_MODE_INFORMATION, *PSVGA_MODE_INFORMATION; +} SVGA_MODE_INFORMATION, *PSVGA_MODE_INFORMATION; +#include static ULONG BiosVideoMode; /* Current video mode as known by BIOS */ static ULONG ScreenWidth = 80; /* Screen Width in characters */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h b/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h index 94b42f6870d..ff96277d6b0 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h @@ -29,8 +29,8 @@ VOID PcMachInit(const char *CmdLine); VOID PcConsPutChar(int Ch); -BOOLEAN PcConsKbHit(); -int PcConsGetCh(); +BOOLEAN PcConsKbHit(VOID); +int PcConsGetCh(VOID); VOID PcVideoClearScreen(UCHAR Attr); VIDEODISPLAYMODE PcVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init); diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h b/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h index a1bc397ff7e..6a565878423 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h @@ -29,8 +29,8 @@ UCHAR XboxFont8x16[256 * 16]; VOID XboxMachInit(const char *CmdLine); VOID XboxConsPutChar(int Ch); -BOOLEAN XboxConsKbHit(); -int XboxConsGetCh(); +BOOLEAN XboxConsKbHit(VOID); +int XboxConsGetCh(VOID); VOID XboxVideoInit(VOID); VOID XboxVideoClearScreen(UCHAR Attr); diff --git a/reactos/boot/freeldr/freeldr/include/freeldr.h b/reactos/boot/freeldr/freeldr/include/freeldr.h index a001b9b1e44..e8e7af4a482 100644 --- a/reactos/boot/freeldr/freeldr/include/freeldr.h +++ b/reactos/boot/freeldr/freeldr/include/freeldr.h @@ -110,12 +110,22 @@ #include /* arch defines */ +#ifdef __GNUC__ #ifdef _X86_ -#define Ke386EraseFlags(x) __asm__ __volatile__("pushl $0 ; popfl\n") +#define Ke386EraseFlags() __asm__ __volatile__("pushl $0 ; popfl\n") #endif #ifdef _M_AMD64 -#define KeAmd64EraseFlags(x) __asm__ __volatile__("pushq $0 ; popfq\n") +#define KeAmd64EraseFlags() __asm__ __volatile__("pushq $0 ; popfq\n") +#endif +#else +#ifdef _X86_ +#define Ke386EraseFlags() __asm push 0; __asm popf; +#endif + +#ifdef _M_AMD64 +#error FIXME +#endif #endif VOID BootMain(LPSTR CmdLine); diff --git a/reactos/boot/freeldr/freeldr/machine.c b/reactos/boot/freeldr/freeldr/machine.c index 5d0eb25bfeb..2bdc6051de7 100644 --- a/reactos/boot/freeldr/freeldr/machine.c +++ b/reactos/boot/freeldr/freeldr/machine.c @@ -83,7 +83,7 @@ MachVideoSetDisplayMode(char *DisplayMode, BOOLEAN Init) VOID MachVideoGetDisplaySize(PULONG Width, PULONG Height, PULONG Depth) { - return MachVtbl.VideoGetDisplaySize(Width, Height, Depth); + MachVtbl.VideoGetDisplaySize(Width, Height, Depth); } ULONG @@ -95,7 +95,7 @@ MachVideoGetBufferSize(VOID) VOID MachVideoSetTextCursorPosition(ULONG X, ULONG Y) { - return MachVtbl.VideoSetTextCursorPosition(X, Y); + MachVtbl.VideoSetTextCursorPosition(X, Y); } VOID @@ -125,13 +125,13 @@ MachVideoIsPaletteFixed(VOID) VOID MachVideoSetPaletteColor(UCHAR Color, UCHAR Red, UCHAR Green, UCHAR Blue) { - return MachVtbl.VideoSetPaletteColor(Color, Red, Green, Blue); + MachVtbl.VideoSetPaletteColor(Color, Red, Green, Blue); } VOID MachVideoGetPaletteColor(UCHAR Color, UCHAR *Red, UCHAR *Green, UCHAR *Blue) { - return MachVtbl.VideoGetPaletteColor(Color, Red, Green, Blue); + MachVtbl.VideoGetPaletteColor(Color, Red, Green, Blue); } VOID diff --git a/reactos/boot/freeldr/freeldr/reactos/binhive.c b/reactos/boot/freeldr/freeldr/reactos/binhive.c index 3270bd3b93a..40c9277e325 100644 --- a/reactos/boot/freeldr/freeldr/reactos/binhive.c +++ b/reactos/boot/freeldr/freeldr/reactos/binhive.c @@ -40,7 +40,7 @@ static VOID NTAPI CmpFree (PVOID Ptr, IN ULONG Quota) { - return MmHeapFree(Ptr); + MmHeapFree(Ptr); } static BOOLEAN diff --git a/reactos/boot/freeldr/freeldr/reactos/setupldr.c b/reactos/boot/freeldr/freeldr/reactos/setupldr.c index 5f6cd33588c..2cea745ca3c 100644 --- a/reactos/boot/freeldr/freeldr/reactos/setupldr.c +++ b/reactos/boot/freeldr/freeldr/reactos/setupldr.c @@ -60,11 +60,12 @@ VOID LoadReactOSSetup(VOID) NULL }; CHAR FileName[256]; - HINF InfHandle; - ULONG ErrorLine; - INFCONTEXT InfContext; + HINF InfHandle; + ULONG ErrorLine; + INFCONTEXT InfContext; PIMAGE_NT_HEADERS NtHeader; PVOID LoadBase; + extern BOOLEAN FrLdrBootType; /* Setup multiboot information structure */ LoaderBlock.CommandLine = reactos_kernel_cmdline; @@ -108,8 +109,7 @@ VOID LoadReactOSSetup(VOID) #endif UiDrawStatusText(""); - extern BOOLEAN FrLdrBootType; - FrLdrBootType = TRUE; + FrLdrBootType = TRUE; /* Detect hardware */ UiDrawStatusText("Detecting hardware..."); diff --git a/reactos/boot/freeldr/freeldr/rtl/libsupp.c b/reactos/boot/freeldr/freeldr/rtl/libsupp.c index fafba51fef9..84acfdc99b0 100644 --- a/reactos/boot/freeldr/freeldr/rtl/libsupp.c +++ b/reactos/boot/freeldr/freeldr/rtl/libsupp.c @@ -42,5 +42,5 @@ NTAPI RtlpFreeMemory(PVOID Mem, ULONG Tag) { - return MmHeapFree(Mem); + MmHeapFree(Mem); } diff --git a/reactos/boot/freeldr/freeldr/ui/tui.c b/reactos/boot/freeldr/freeldr/ui/tui.c index cf69a5d2c16..38081d59d09 100644 --- a/reactos/boot/freeldr/freeldr/ui/tui.c +++ b/reactos/boot/freeldr/freeldr/ui/tui.c @@ -27,9 +27,9 @@ PVOID TextVideoBuffer = NULL; */ int TuiPrintf(const char *format, ... ) { + char c, *ptr, str[16]; va_list ap; va_start(ap,format); - char c, *ptr, str[16]; while ((c = *(format++))) { diff --git a/reactos/boot/freeldr/freeldr/video/fade.c b/reactos/boot/freeldr/freeldr/video/fade.c index 14cedf980e1..3f4bbe048ab 100644 --- a/reactos/boot/freeldr/freeldr/video/fade.c +++ b/reactos/boot/freeldr/freeldr/video/fade.c @@ -38,7 +38,10 @@ VOID VideoFadeIn(PPALETTE_ENTRY Palette, ULONG ColorCount) { ULONG Index; ULONG Color; - PALETTE_ENTRY PaletteColors[ColorCount]; + PPALETTE_ENTRY PaletteColors; + + PaletteColors = MmHeapAlloc(sizeof(PALETTE_ENTRY) * ColorCount); + if (!PaletteColors) return; for (Index=0; Index Date: Sat, 25 Jul 2009 20:24:50 +0000 Subject: [PATCH 560/577] - RamdiskWorkerThread: Don't return IoCompleteRequest as we return void (IoCompleteRequest returns void though), msvc doesn't like this. - Fix calling convention declaration for scsi function prototypes svn path=/trunk/; revision=42219 --- .../drivers/storage/class/ramdisk/ramdisk.c | 6 ++-- reactos/include/ddk/scsiwmi.h | 24 ++++++------- reactos/include/ddk/srb.h | 36 +++++++++---------- 3 files changed, 34 insertions(+), 32 deletions(-) diff --git a/reactos/drivers/storage/class/ramdisk/ramdisk.c b/reactos/drivers/storage/class/ramdisk/ramdisk.c index 9d28c4c39a2..9cf36bd2500 100644 --- a/reactos/drivers/storage/class/ramdisk/ramdisk.c +++ b/reactos/drivers/storage/class/ramdisk/ramdisk.c @@ -1012,7 +1012,8 @@ RamdiskWorkerThread(IN PDEVICE_OBJECT DeviceObject, IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp); Irp->IoStatus.Status = Status; Irp->IoStatus.Information = 0; - return IoCompleteRequest(Irp, IO_DISK_INCREMENT); + IoCompleteRequest(Irp, IO_DISK_INCREMENT); + return; } // @@ -1020,7 +1021,8 @@ RamdiskWorkerThread(IN PDEVICE_OBJECT DeviceObject, // Irp->IoStatus.Status = Status; Irp->IoStatus.Information = 0; - return IoCompleteRequest(Irp, IO_NO_INCREMENT); + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; } NTSTATUS diff --git a/reactos/include/ddk/scsiwmi.h b/reactos/include/ddk/scsiwmi.h index feff7251bbc..c599f48c01b 100644 --- a/reactos/include/ddk/scsiwmi.h +++ b/reactos/include/ddk/scsiwmi.h @@ -60,14 +60,14 @@ typedef struct _SCSIWMIGUIDREGINFO { ULONG Flags; } SCSIWMIGUIDREGINFO, *PSCSIWMIGUIDREGINFO; -typedef UCHAR DDKAPI -(*PSCSIWMI_QUERY_REGINFO)( +typedef UCHAR +(DDKAPI *PSCSIWMI_QUERY_REGINFO)( IN PVOID DeviceContext, IN PSCSIWMI_REQUEST_CONTEXT RequestContext, OUT PWCHAR *MofResourceName); -typedef BOOLEAN DDKAPI -(*PSCSIWMI_QUERY_DATABLOCK)( +typedef BOOLEAN +(DDKAPI *PSCSIWMI_QUERY_DATABLOCK)( IN PVOID Context, IN PSCSIWMI_REQUEST_CONTEXT DispatchContext, IN ULONG GuidIndex, @@ -77,8 +77,8 @@ typedef BOOLEAN DDKAPI IN ULONG BufferAvail, OUT PUCHAR Buffer); -typedef BOOLEAN DDKAPI -(*PSCSIWMI_SET_DATABLOCK)( +typedef BOOLEAN +(DDKAPI *PSCSIWMI_SET_DATABLOCK)( IN PVOID DeviceContext, IN PSCSIWMI_REQUEST_CONTEXT RequestContext, IN ULONG GuidIndex, @@ -86,8 +86,8 @@ typedef BOOLEAN DDKAPI IN ULONG BufferSize, IN PUCHAR Buffer); -typedef BOOLEAN DDKAPI -(*PSCSIWMI_SET_DATAITEM)( +typedef BOOLEAN +(DDKAPI *PSCSIWMI_SET_DATAITEM)( IN PVOID DeviceContext, IN PSCSIWMI_REQUEST_CONTEXT RequestContext, IN ULONG GuidIndex, @@ -96,8 +96,8 @@ typedef BOOLEAN DDKAPI IN ULONG BufferSize, IN PUCHAR Buffer); -typedef BOOLEAN DDKAPI -(*PSCSIWMI_EXECUTE_METHOD)( +typedef BOOLEAN +(DDKAPI *PSCSIWMI_EXECUTE_METHOD)( IN PVOID DeviceContext, IN PSCSIWMI_REQUEST_CONTEXT RequestContext, IN ULONG GuidIndex, @@ -112,8 +112,8 @@ typedef enum _SCSIWMI_ENABLE_DISABLE_CONTROL { ScsiWmiDataBlockControl } SCSIWMI_ENABLE_DISABLE_CONTROL; -typedef BOOLEAN DDKAPI -(*PSCSIWMI_FUNCTION_CONTROL)( +typedef BOOLEAN +(DDKAPI *PSCSIWMI_FUNCTION_CONTROL)( IN PVOID DeviceContext, IN PSCSIWMI_REQUEST_CONTEXT RequestContext, IN ULONG GuidIndex, diff --git a/reactos/include/ddk/srb.h b/reactos/include/ddk/srb.h index 468cbb27cee..5ec20932100 100644 --- a/reactos/include/ddk/srb.h +++ b/reactos/include/ddk/srb.h @@ -300,14 +300,14 @@ typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST { BOOLEAN SupportedTypeList[0]; } SCSI_SUPPORTED_CONTROL_TYPE_LIST, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST; -typedef SCSI_ADAPTER_CONTROL_STATUS DDKAPI -(*PHW_ADAPTER_CONTROL)( +typedef SCSI_ADAPTER_CONTROL_STATUS +(DDKAPI *PHW_ADAPTER_CONTROL)( IN PVOID DeviceExtension, IN SCSI_ADAPTER_CONTROL_TYPE ControlType, IN PVOID Parameters); -typedef BOOLEAN DDKAPI -(*PHW_ADAPTER_STATE)( +typedef BOOLEAN +(DDKAPI *PHW_ADAPTER_STATE)( IN PVOID DeviceExtension, IN PVOID Context, IN BOOLEAN SaveState); @@ -317,8 +317,8 @@ typedef BOOLEAN DDKAPI #define SP_RETURN_ERROR 2 #define SP_RETURN_BAD_CONFIG 3 -typedef ULONG DDKAPI -(*PHW_FIND_ADAPTER)( +typedef ULONG +(DDKAPI *PHW_FIND_ADAPTER)( IN PVOID DeviceExtension, IN PVOID HwContext, IN PVOID BusInformation, @@ -326,30 +326,30 @@ typedef ULONG DDKAPI IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, OUT PBOOLEAN Again); -typedef BOOLEAN DDKAPI -(*PHW_INITIALIZE)( +typedef BOOLEAN +(DDKAPI *PHW_INITIALIZE)( IN PVOID DeviceExtension); -typedef BOOLEAN DDKAPI -(*PHW_INTERRUPT)( +typedef BOOLEAN +(DDKAPI *PHW_INTERRUPT)( IN PVOID DeviceExtension); -typedef BOOLEAN DDKAPI -(*PHW_RESET_BUS)( +typedef BOOLEAN +(DDKAPI *PHW_RESET_BUS)( IN PVOID DeviceExtension, IN ULONG PathId); -typedef VOID DDKAPI -(*PHW_DMA_STARTED)( +typedef VOID +(DDKAPI *PHW_DMA_STARTED)( IN PVOID DeviceExtension); -typedef BOOLEAN DDKAPI -(*PHW_STARTIO)( +typedef BOOLEAN +(DDKAPI *PHW_STARTIO)( IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb); -typedef VOID DDKAPI -(*PHW_TIMER)( +typedef VOID +(DDKAPI *PHW_TIMER)( IN PVOID DeviceExtension); typedef struct _HW_INITIALIZATION_DATA { From 1093de04f2e448a92ff8803e849628f5cd41a1eb Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sat, 25 Jul 2009 21:35:31 +0000 Subject: [PATCH 561/577] - This is a HIGH RISK patch. It has been tested on multiple emulators and configurations but requires broader input. - Implement several changes to PFN database management: - The PTEs for the PFN Database are now created by ARM3. Unlike the old code which create PTE for every page on the machine, ARM3 only creates PTEs to account for pages that should be in the PFN database. - A second related change is what "pages should be in the PFN database". Previously, reserved or otherwise non-existing (ie: holes) memory regions would get a PFN entry created and marked as "BIOS". This is wasteful and not compatible with Windows: there should not be PFN entries created at all. - So we removed BIOS PFN entries, and now only create PTEs for valid pages as listed in the physical memory ranges. - This allows machines with "holes" in their physical address space not to waste dozens of MBs of nonpaged pool - Also saves memory on regular machines too, since 1-4MB worth of memory will now not be in the DB anymore - To keep track of pages that are invalid/unknown/ignored, there is now a "PFN Bitmap". This bitmap has one bit set for each valid PFN in the database. - And so, MiGetPfnEntry now also validates that, if there is a PFN Bitmap, the requested PFN is actually present in the database. - This introduces a major functional change: device pages, reserved pages, and other BIOS pages cannot be referenced, shared, or managed in any meaningful way. - We have attempted to fix parts of the OS that depended on this, but there may still be bugs. - A known issue may be an assertion during reboot and/or shutdown in the hyperspace mapping function. It is currently safe to simply "cont" in the debugger a couple of times. - We are working on a fix. svn path=/trunk/; revision=42220 --- reactos/ntoskrnl/include/internal/mm.h | 4 + reactos/ntoskrnl/mm/ARM3/i386/init.c | 193 ++++++++++++++++++++++++- reactos/ntoskrnl/mm/ARM3/miarm.h | 1 + reactos/ntoskrnl/mm/freelist.c | 115 +++++---------- 4 files changed, 234 insertions(+), 79 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 8de04f4ef2c..c67ebd852b1 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1045,9 +1045,13 @@ PMMPFN MiGetPfnEntry(IN PFN_TYPE Pfn) { PMMPFN Page; + extern RTL_BITMAP MiPfnBitMap; /* Make sure the PFN number is valid */ if (Pfn > MmHighestPhysicalPage) return NULL; + + /* Make sure this page actually has a PFN entry */ + if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, Pfn))) return NULL; /* Get the entry */ Page = &MmPfnDatabase[Pfn]; diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index a3e886bae75..abf4aafe7a3 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -170,6 +170,20 @@ ULONG MmNumberOfSystemPtes; // ULONG MxPfnAllocation; +// +// Unlike the old ReactOS Memory Manager, ARM³ (and Windows) does not keep track +// of pages that are not actually valid physical memory, such as ACPI reserved +// regions, BIOS address ranges, or holes in physical memory address space which +// could indicate device-mapped I/O memory. +// +// In fact, the lack of a PFN entry for a page usually indicates that this is +// I/O space instead. +// +// A bitmap, called the PFN bitmap, keeps track of all page frames by assigning +// a bit to each. If the bit is set, then the page is valid physical RAM. +// +RTL_BITMAP MiPfnBitMap; + // // This structure describes the different pieces of RAM-backed address space // @@ -596,6 +610,9 @@ MmArmInitSystem(IN ULONG Phase, ULONG OldCount; BOOLEAN IncludeType[LoaderMaximum]; ULONG i; + PVOID Bitmap; + PPHYSICAL_MEMORY_RUN Run; + PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount; BoundaryAddressMultiple.QuadPart = 0; if (Phase == 0) @@ -1108,9 +1125,138 @@ MmArmInitSystem(IN ULONG Phase, // Now go ahead and initialize the ARM³ nonpaged pool // MiInitializeArmPool(); + + // + // Get current page data, since we won't be using MxGetNextPage as it + // would corrupt our state + // + FreePage = MxFreeDescriptor->BasePage; + FreePageCount = MxFreeDescriptor->PageCount; + PagesLeft = 0; + + // + // Loop the memory descriptors + // + NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &KeLoaderBlock->MemoryDescriptorListHead) + { + // + // Get the descriptor + // + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || + (MdBlock->MemoryType == LoaderBBTMemory) || + (MdBlock->MemoryType == LoaderSpecialMemory)) + { + // + // These pages are not part of the PFN database + // + NextEntry = MdBlock->ListEntry.Flink; + continue; + } + + // + // Next, check if this is our special free descriptor we've found + // + if (MdBlock == MxFreeDescriptor) + { + // + // Use the real numbers instead + // + BasePage = MxOldFreeDescriptor.BasePage; + PageCount = MxOldFreeDescriptor.PageCount; + } + else + { + // + // Use the descriptor's numbers + // + BasePage = MdBlock->BasePage; + PageCount = MdBlock->PageCount; + } + + // + // Get the PTEs for this range + // + PointerPte = MiAddressToPte(&MmPfnDatabase[BasePage]); + LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[BasePage + PageCount]) - 1); + DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); + + // + // Loop them + // + while (PointerPte <= LastPte) + { + // + // We'll only touch PTEs that aren't already valid + // + if (PointerPte->u.Hard.Valid == 0) + { + // + // Use the next free page + // + TempPte.u.Hard.PageFrameNumber = FreePage; + ASSERT(FreePageCount != 0); + + // + // Consume free pages + // + FreePage++; + FreePageCount--; + if (!FreePageCount) + { + // + // Out of memory + // + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + FreePageCount, + MxOldFreeDescriptor.PageCount, + 1); + } + + // + // Write out this PTE + // + PagesLeft++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + // + // Zero this page + // + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + // + // Next! + // + PointerPte++; + } + + // + // Do the next address range + // + NextEntry = MdBlock->ListEntry.Flink; + } + + // + // Now update the free descriptors to consume the pages we used up during + // the PFN allocation loop + // + MxFreeDescriptor->BasePage = FreePage; + MxFreeDescriptor->PageCount = FreePageCount; } else if (Phase == 1) // IN BETWEEN, THE PFN DATABASE IS NOW CREATED - { + { + // + // Reset the descriptor back so we can create the correct memory blocks + // + *MxFreeDescriptor = MxOldFreeDescriptor; + // // Initialize the nonpaged pool // @@ -1197,16 +1343,57 @@ MmArmInitSystem(IN ULONG Phase, // MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock, IncludeType); + + // + // Allocate enough buffer for the PFN bitmap + // Align it up to a 32-bit boundary + // + Bitmap = ExAllocatePoolWithTag(NonPagedPool, + (((MmHighestPhysicalPage + 1) + 31) / 32) * 4, + ' mM'); + if (!Bitmap) + { + // + // This is critical + // + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + MmLowestPhysicalPage, + MmHighestPhysicalPage, + 0x101); + } + + // + // Initialize it and clear all the bits to begin with + // + RtlInitializeBitMap(&MiPfnBitMap, + Bitmap, + MmHighestPhysicalPage + 1); + RtlClearAllBits(&MiPfnBitMap); + + // + // Loop physical memory runs + // for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++) { // - // Dump it for debugging + // Get the run // - PPHYSICAL_MEMORY_RUN Run; Run = &MmPhysicalMemoryBlock->Run[i]; DPRINT("PHYSICAL RAM [0x%08p to 0x%08p]\n", Run->BasePage << PAGE_SHIFT, (Run->BasePage + Run->PageCount) << PAGE_SHIFT); + + // + // Make sure it has pages inside it + // + if (Run->PageCount) + { + // + // Set the bits in the PFN bitmap + // + RtlSetBits(&MiPfnBitMap, Run->BasePage, Run->PageCount); + } } // diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 4bb93fdb2d1..a9506daa88a 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -133,6 +133,7 @@ extern PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; extern MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; extern ULONG MxPfnAllocation; extern MM_PAGED_POOL_INFO MmPagedPoolInfo; +extern RTL_BITMAP MiPfnBitMap; VOID NTAPI diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index dc518b98aad..b3d4605886e 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -25,7 +25,6 @@ #define MM_PHYSICAL_PAGE_FREE (0x1) #define MM_PHYSICAL_PAGE_USED (0x2) -#define MM_PHYSICAL_PAGE_BIOS (0x3) /* GLOBALS ****************************************************************/ @@ -98,6 +97,7 @@ MmInsertLRULastUserPage(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); + ASSERT(Page); ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED); ASSERT(Page->Flags.Consumer == MC_USER); InsertTailList(&UserPageListHead, &Page->ListEntry); @@ -115,6 +115,7 @@ MmGetLRUNextUserPage(PFN_TYPE PreviousPfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(PreviousPfn); + ASSERT(Page); ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED); ASSERT(Page->Flags.Consumer == MC_USER); NextListEntry = (PLIST_ENTRY)Page->ListEntry.Flink; @@ -495,6 +496,7 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // Get the PFN entry for this page // Pfn1 = MiGetPfnEntry(Page); + ASSERT(Pfn1); // // Make sure it's free and if this is our first pass, zeroed @@ -591,6 +593,7 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // Get the PFN entry for the page and check if we should zero it out // Pfn1 = MiGetPfnEntry(Page); + ASSERT(Pfn1); if (Pfn1->Flags.Zero == 0) MiZeroPage(Page); } @@ -610,7 +613,7 @@ MmDumpPfnDatabase(VOID) PPHYSICAL_PAGE Pfn1; PCHAR State = "????", Consumer = "Unknown"; KIRQL OldIrql; - ULONG Totals[5] = {0}, BiosPages = 0, FreePages = 0; + ULONG Totals[5] = {0}, FreePages = 0; KeRaiseIrql(HIGH_LEVEL, &OldIrql); @@ -620,6 +623,7 @@ MmDumpPfnDatabase(VOID) for (i = 0; i <= MmHighestPhysicalPage; i++) { Pfn1 = MiGetPfnEntry(i); + if (!Pfn1) continue; // // Get the consumer @@ -669,13 +673,6 @@ MmDumpPfnDatabase(VOID) Consumer = "Free"; FreePages++; break; - - case MM_PHYSICAL_PAGE_BIOS: - - State = "BIOS"; - Consumer = "System Reserved"; - BiosPages++; - break; } // @@ -696,64 +693,25 @@ MmDumpPfnDatabase(VOID) DbgPrint("File System Cache: %d pages\t[%d KB]\n", Totals[MC_CACHE], (Totals[MC_CACHE] << PAGE_SHIFT) / 1024); DbgPrint("Process Working Set: %d pages\t[%d KB]\n", Totals[MC_USER], (Totals[MC_USER] << PAGE_SHIFT) / 1024); DbgPrint("System: %d pages\t[%d KB]\n", Totals[MC_SYSTEM], (Totals[MC_SYSTEM] << PAGE_SHIFT) / 1024); - DbgPrint("BIOS: %d pages\t[%d KB]\n", BiosPages, (BiosPages << PAGE_SHIFT) / 1024); DbgPrint("Free: %d pages\t[%d KB]\n", FreePages, (FreePages << PAGE_SHIFT) / 1024); KeLowerIrql(OldIrql); } -PFN_NUMBER -NTAPI -MxGetNextPage(IN PFN_NUMBER PageCount); - VOID NTAPI MmInitializePageList(VOID) { ULONG i; - NTSTATUS Status; - PFN_TYPE Pfn = 0; PHYSICAL_PAGE UsedPage; - PLIST_ENTRY NextEntry; PMEMORY_ALLOCATION_DESCRIPTOR Md; + PLIST_ENTRY NextEntry; /* Initialize the page lists */ InitializeListHead(&UserPageListHead); InitializeListHead(&FreeUnzeroedPageListHead); InitializeListHead(&FreeZeroedPageListHead); - /* Loop every page required to hold the PFN database */ - for (i = 0; i < MxPfnAllocation; i++) - { - PVOID Address = (char*)MmPfnDatabase + (i * PAGE_SIZE); - - /* Check if FreeLDR has already allocated it for us */ - if (!MmIsPagePresent(NULL, Address)) - { - /* Use one of our highest usable pages */ - Pfn = MxGetNextPage(1); - - /* Set the PFN */ - Status = MmCreateVirtualMappingForKernel(Address, - PAGE_READWRITE, - &Pfn, - 1); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Unable to create virtual mapping\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - } - else - { - /* Setting the page protection is necessary to set the global bit */ - MmSetPageProtect(NULL, Address, PAGE_READWRITE); - } - } - - /* Clear the PFN database */ - RtlZeroMemory(MmPfnDatabase, (MmHighestPhysicalPage + 1) * sizeof(PHYSICAL_PAGE)); - /* This is what a used page looks like */ RtlZeroMemory(&UsedPage, sizeof(UsedPage)); UsedPage.Flags.Type = MM_PHYSICAL_PAGE_USED; @@ -779,17 +737,10 @@ MmInitializePageList(VOID) (Md->MemoryType == LoaderSpecialMemory) || (Md->MemoryType == LoaderBad)) { - /* Loop every page part of the block but valid in the database */ - for (i = 0; i < Md->PageCount; i++) - { - /* Skip memory we ignore completely */ - if ((Md->BasePage + i) > MmHighestPhysicalPage) break; - - /* These are pages reserved by the BIOS/ROMs */ - MmPfnDatabase[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_BIOS; - MmPfnDatabase[Md->BasePage + i].Flags.Consumer = MC_NPPOOL; - MmStats.NrSystemPages++; - } + // + // We do not build PFN entries for this + // + continue; } else if ((Md->MemoryType == LoaderFree) || (Md->MemoryType == LoaderLoadedProgram) || @@ -872,13 +823,16 @@ MmMarkPageMapped(PFN_TYPE Pfn) { oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); - if (Page->Flags.Type == MM_PHYSICAL_PAGE_FREE) + if (Page) { - DPRINT1("Mapping non-used page\n"); - KeBugCheck(MEMORY_MANAGEMENT); + if (Page->Flags.Type == MM_PHYSICAL_PAGE_FREE) + { + DPRINT1("Mapping non-used page\n"); + KeBugCheck(MEMORY_MANAGEMENT); + } + Page->MapCount++; + Page->ReferenceCount++; } - Page->MapCount++; - Page->ReferenceCount++; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); } } @@ -894,18 +848,21 @@ MmMarkPageUnmapped(PFN_TYPE Pfn) { oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); - if (Page->Flags.Type == MM_PHYSICAL_PAGE_FREE) + if (Page) { - DPRINT1("Unmapping non-used page\n"); - KeBugCheck(MEMORY_MANAGEMENT); + if (Page->Flags.Type == MM_PHYSICAL_PAGE_FREE) + { + DPRINT1("Unmapping non-used page\n"); + KeBugCheck(MEMORY_MANAGEMENT); + } + if (Page->MapCount == 0) + { + DPRINT1("Unmapping not mapped page\n"); + KeBugCheck(MEMORY_MANAGEMENT); + } + Page->MapCount--; + Page->ReferenceCount--; } - if (Page->MapCount == 0) - { - DPRINT1("Unmapping not mapped page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - Page->MapCount--; - Page->ReferenceCount--; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); } } @@ -952,6 +909,7 @@ MmReferencePageUnsafe(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); + ASSERT(Page); if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) { DPRINT1("Referencing non-used page\n"); @@ -983,6 +941,7 @@ MmGetReferenceCountPage(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); + ASSERT(Page); if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) { DPRINT1("Getting reference count for free page\n"); @@ -1017,6 +976,7 @@ MmDereferencePage(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); + ASSERT(Page); if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) { @@ -1088,6 +1048,7 @@ MmGetLockCountPage(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); + ASSERT(Page); if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) { DPRINT1("Getting lock count for free page\n"); @@ -1112,6 +1073,7 @@ MmLockPageUnsafe(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); + ASSERT(Page); if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) { DPRINT1("Locking free page\n"); @@ -1143,6 +1105,7 @@ MmUnlockPage(PFN_TYPE Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); + ASSERT(Page); if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) { DPRINT1("Unlocking free page\n"); @@ -1173,7 +1136,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) /* Check if this allocation is for the PFN DB itself */ if (MmStats.NrTotalPages == 0) { - MxGetNextPage(1); + ASSERT(FALSE); } DPRINT1("MmAllocPage(): Out of memory\n"); From 31015fdb853d0073def4d3dda8cf3dfe898a96e4 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sat, 25 Jul 2009 22:19:45 +0000 Subject: [PATCH 562/577] - Fix memory leak from r42218 ;0) svn path=/trunk/; revision=42221 --- reactos/boot/freeldr/freeldr/video/fade.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/boot/freeldr/freeldr/video/fade.c b/reactos/boot/freeldr/freeldr/video/fade.c index 3f4bbe048ab..b653ce6b739 100644 --- a/reactos/boot/freeldr/freeldr/video/fade.c +++ b/reactos/boot/freeldr/freeldr/video/fade.c @@ -90,6 +90,8 @@ VOID VideoFadeIn(PPALETTE_ENTRY Palette, ULONG ColorCount) MachVideoSetPaletteColor(Color, PaletteColors[Color].Red, PaletteColors[Color].Green, PaletteColors[Color].Blue); } } + + MmHeapFree(PaletteColors); } VOID VideoFadeOut(ULONG ColorCount) From c70b54758fa509ca79eb5f6891d7bb3c73034871 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 26 Jul 2009 00:22:57 +0000 Subject: [PATCH 563/577] Add hack for gnu ld like in mingw lib, as it uses _image_base__ insetad of __ImageBase svn path=/trunk/; revision=42222 --- reactos/include/psdk/delayimp.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/include/psdk/delayimp.h b/reactos/include/psdk/delayimp.h index 4fddee37157..986ff444fb8 100644 --- a/reactos/include/psdk/delayimp.h +++ b/reactos/include/psdk/delayimp.h @@ -1,6 +1,11 @@ #ifndef _delayimp_h #define _delayimp_h +#ifdef __GNUC__ +/* Hack, for bug in ld. Will be removed soon. */ +#define __ImageBase _image_base__ +#endif + #define DELAYLOAD_VERSION 0x200 typedef DWORD RVA; From 2c0294638dcfb34baf73ce7fb5b6e467bfc68d7f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 26 Jul 2009 01:59:08 +0000 Subject: [PATCH 564/577] - [Win32k] Moving forward and replace some of the old header types with the new ones. This will continue and start the win32k object manager rewrite. Finding more bugs and this is still a work in progress. Run across the C_ASSERT bug. I see someone else noticed it. - Finished the user32 system class proc start-up. - Tested wine, Firefox 1.15.xx and AbiWord 2.6.8. svn path=/trunk/; revision=42223 --- reactos/dll/win32/user32/controls/button.c | 12 +- reactos/dll/win32/user32/controls/combo.c | 12 +- reactos/dll/win32/user32/controls/edit.c | 2 +- reactos/dll/win32/user32/controls/icontitle.c | 2 +- reactos/dll/win32/user32/controls/listbox.c | 12 +- .../dll/win32/user32/controls/regcontrol.c | 89 +++--- reactos/dll/win32/user32/controls/scrollbar.c | 10 +- reactos/dll/win32/user32/controls/static.c | 10 +- reactos/dll/win32/user32/include/controls.h | 19 ++ reactos/dll/win32/user32/include/menu.h | 3 + reactos/dll/win32/user32/include/scroll.h | 4 +- reactos/dll/win32/user32/misc/misc.c | 4 +- reactos/dll/win32/user32/windows/mdi.c | 12 +- reactos/dll/win32/user32/windows/menu.c | 8 +- reactos/dll/win32/user32/windows/message.c | 8 +- reactos/dll/win32/user32/windows/window.c | 2 +- reactos/include/reactos/win32k/ntgdityp.h | 4 +- reactos/include/reactos/win32k/ntuser.h | 274 +++++++++--------- .../subsystems/win32/win32k/include/hook.h | 15 +- .../subsystems/win32/win32k/include/window.h | 2 +- .../subsystems/win32/win32k/ntuser/callproc.c | 4 +- .../subsystems/win32/win32k/ntuser/desktop.c | 4 +- .../subsystems/win32/win32k/ntuser/event.c | 68 +++-- reactos/subsystems/win32/win32k/ntuser/hook.c | 10 +- .../subsystems/win32/win32k/ntuser/object.c | 2 +- .../subsystems/win32/win32k/ntuser/windc.c | 2 +- .../subsystems/win32/win32k/ntuser/window.c | 35 ++- 27 files changed, 347 insertions(+), 282 deletions(-) diff --git a/reactos/dll/win32/user32/controls/button.c b/reactos/dll/win32/user32/controls/button.c index 5dd03c0aeda..4eb8bc66547 100644 --- a/reactos/dll/win32/user32/controls/button.c +++ b/reactos/dll/win32/user32/controls/button.c @@ -102,8 +102,8 @@ static void GB_Paint( HWND hwnd, HDC hDC, UINT action ); static void UB_Paint( HWND hwnd, HDC hDC, UINT action ); static void OB_Paint( HWND hwnd, HDC hDC, UINT action ); static void BUTTON_CheckAutoRadioButton( HWND hwnd ); -static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); -static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); #define MAX_BTN_TYPE 12 @@ -249,8 +249,8 @@ static BOOL button_update_uistate(HWND hwnd, BOOL unicode) /*********************************************************************** * ButtonWndProc_common */ -static LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg, - WPARAM wParam, LPARAM lParam, BOOL unicode ) +LRESULT WINAPI ButtonWndProc_common(HWND hWnd, UINT uMsg, + WPARAM wParam, LPARAM lParam, BOOL unicode ) { RECT rect; POINT pt; @@ -591,7 +591,7 @@ static LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg, * the passed HWND and calls the real window procedure (with a WND* * pointer pointing to the locked windowstructure). */ -static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if (!IsWindow( hWnd )) return 0; return ButtonWndProc_common( hWnd, uMsg, wParam, lParam, TRUE ); @@ -601,7 +601,7 @@ static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARA /*********************************************************************** * ButtonWndProcA */ -static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if (!IsWindow( hWnd )) return 0; return ButtonWndProc_common( hWnd, uMsg, wParam, lParam, FALSE ); diff --git a/reactos/dll/win32/user32/controls/combo.c b/reactos/dll/win32/user32/controls/combo.c index 5594858c183..8d3ef3350d1 100644 --- a/reactos/dll/win32/user32/controls/combo.c +++ b/reactos/dll/win32/user32/controls/combo.c @@ -74,8 +74,8 @@ static UINT CBitHeight, CBitWidth; #define COMBO_EDITBUTTONSPACE() 0 #define EDIT_CONTROL_PADDING() 1 -static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); -static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); /********************************************************************* * combo class descriptor @@ -1836,8 +1836,8 @@ static char *strdupA(LPCSTR str) /*********************************************************************** * ComboWndProc_common */ -static LRESULT ComboWndProc_common( HWND hwnd, UINT message, - WPARAM wParam, LPARAM lParam, BOOL unicode ) +LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam, BOOL unicode ) { LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW( hwnd, 0 ); @@ -2361,7 +2361,7 @@ static LRESULT ComboWndProc_common( HWND hwnd, UINT message, * This is just a wrapper for the real ComboWndProc which locks/unlocks * window structs. */ -static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { if (!IsWindow(hwnd)) return 0; return ComboWndProc_common( hwnd, message, wParam, lParam, FALSE ); @@ -2370,7 +2370,7 @@ static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPA /*********************************************************************** * ComboWndProcW */ -static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { if (!IsWindow(hwnd)) return 0; return ComboWndProc_common( hwnd, message, wParam, lParam, TRUE ); diff --git a/reactos/dll/win32/user32/controls/edit.c b/reactos/dll/win32/user32/controls/edit.c index bfc07c1f6da..9f0d9c1d47b 100644 --- a/reactos/dll/win32/user32/controls/edit.c +++ b/reactos/dll/win32/user32/controls/edit.c @@ -4816,7 +4816,7 @@ static inline LRESULT DefWindowProcT(HWND hwnd, UINT msg, WPARAM wParam, LPARAM * names). * */ -static LRESULT EditWndProc_common( HWND hwnd, UINT msg, +LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode ) { EDITSTATE *es = (EDITSTATE *)GetWindowLongPtrW( hwnd, 0 ); diff --git a/reactos/dll/win32/user32/controls/icontitle.c b/reactos/dll/win32/user32/controls/icontitle.c index 617f3bae91b..01231cdd03c 100644 --- a/reactos/dll/win32/user32/controls/icontitle.c +++ b/reactos/dll/win32/user32/controls/icontitle.c @@ -30,7 +30,7 @@ static BOOL bMultiLineTitle; static HFONT hIconTitleFont; -static LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); /********************************************************************* * icon title class descriptor diff --git a/reactos/dll/win32/user32/controls/listbox.c b/reactos/dll/win32/user32/controls/listbox.c index f332f40fa21..d46c1bb81ba 100644 --- a/reactos/dll/win32/user32/controls/listbox.c +++ b/reactos/dll/win32/user32/controls/listbox.c @@ -138,8 +138,8 @@ typedef enum static TIMER_DIRECTION LISTBOX_Timer = LB_TIMER_NONE; -static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); -static LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam,LPARAM lParam ); +//static LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); static LRESULT LISTBOX_GetItemRect( const LB_DESCR *descr, INT index, RECT *rect ); @@ -2659,8 +2659,8 @@ static BOOL LISTBOX_Destroy( LB_DESCR *descr ) /*********************************************************************** * ListBoxWndProc_common */ -static LRESULT ListBoxWndProc_common( HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam, BOOL unicode ) +LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam, BOOL unicode ) { LB_DESCR *descr = (LB_DESCR *)GetWindowLongPtrW( hwnd, 0 ); LPHEADCOMBO lphc = 0; @@ -3446,7 +3446,7 @@ static LRESULT ListBoxWndProc_common( HWND hwnd, UINT msg, /*********************************************************************** * ListBoxWndProcA */ -static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { return ListBoxWndProc_common( hwnd, msg, wParam, lParam, FALSE ); } @@ -3454,7 +3454,7 @@ static LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARA /*********************************************************************** * ListBoxWndProcW */ -static LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { return ListBoxWndProc_common( hwnd, msg, wParam, lParam, TRUE ); } diff --git a/reactos/dll/win32/user32/controls/regcontrol.c b/reactos/dll/win32/user32/controls/regcontrol.c index fa355d3decb..0cc49e7a2ed 100644 --- a/reactos/dll/win32/user32/controls/regcontrol.c +++ b/reactos/dll/win32/user32/controls/regcontrol.c @@ -13,6 +13,10 @@ #include +static PFNCLIENT pfnClientA; +static PFNCLIENT pfnClientW; +static PFNCLIENTWORKER pfnClientWorker; + static const struct { const struct builtin_class_descr *desc; @@ -61,46 +65,57 @@ BOOL WINAPI RegisterSystemControls(VOID) return NtUserRegisterSystemClasses(sizeof(cls) / sizeof(cls[0]), cls); } +LRESULT +WINAPI +MsgWindowProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +{ + if (message == WM_NCCREATE) return TRUE; + return 0; +} - -static PFNCLIENT pfnClientA; -static PFNCLIENT pfnClientW; -static PFNCLIENTWORKER pfnClientWorker; +LRESULT +WINAPI +DialogWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode) +{ + if (unicode) + return DefDlgProcW( hwnd, uMsg, wParam, lParam); + return DefDlgProcA( hwnd, uMsg, wParam, lParam); +} BOOL WINAPI RegisterClientPFN(VOID) { NTSTATUS Status; -// pfnClientA.pfnScrollBarWndProc = ScrollBarWndProcA; -// pfnClientW.pfnScrollBarWndProc = ScrollBarWndProcW; -// pfnClientA.pfnTitleWndProc = IconTitleWndProc; -// pfnClientW.pfnTitleWndProc = IconTitleWndProc; -// pfnClientA.pfnMenuWndProc = PopupMenuWndProcA; -// pfnClientW.pfnMenuWndProc = PopupMenuWndProcW; - pfnClientA.pfnDesktopWndProc = DesktopWndProc; // Fixme! + pfnClientA.pfnScrollBarWndProc = ScrollBarWndProcA; + pfnClientW.pfnScrollBarWndProc = ScrollBarWndProcW; + pfnClientA.pfnTitleWndProc = IconTitleWndProc; + pfnClientW.pfnTitleWndProc = IconTitleWndProc; + pfnClientA.pfnMenuWndProc = PopupMenuWndProcA; + pfnClientW.pfnMenuWndProc = PopupMenuWndProcW; + pfnClientA.pfnDesktopWndProc = DesktopWndProc; pfnClientW.pfnDesktopWndProc = DesktopWndProc; pfnClientA.pfnDefWindowProc = DefWindowProcA; pfnClientW.pfnDefWindowProc = DefWindowProcW; - pfnClientA.pfnMessageWindowProc = DefWindowProcA; - pfnClientW.pfnMessageWindowProc = DefWindowProcW; + pfnClientA.pfnMessageWindowProc = MsgWindowProc; + pfnClientW.pfnMessageWindowProc = MsgWindowProc; pfnClientA.pfnSwitchWindowProc = DefWindowProcA; pfnClientW.pfnSwitchWindowProc = DefWindowProcW; -// pfnClientA.pfnButtonWndProc = ButtonWndProcA; -// pfnClientW.pfnButtonWndProc = ButtonWndProcW -// pfnClientA.pfnComboBoxWndProc = ComboWndProcA; -// pfnClientW.pfnComboBoxWndProc = ComboWndProcW; -// pfnClientA.pfnComboListBoxProc = ListBoxWndProcA; -// pfnClientW.pfnComboListBoxProc = ListBoxWndProcW; -// pfnClientA.pfnDialogWndProc = DefDlgProcA; -// pfnClientW.pfnDialogWndProc = DefDlgProcW; -// pfnClientA.pfnEditWndProc = EditWndProcA; -// pfnClientW.pfnEditWndProc = EditWndProcW; -// pfnClientA.pfnListBoxWndProc = ListBoxWndProcA; -// pfnClientW.pfnListBoxWndProc = ListBoxWndProcW; -// pfnClientA.pfnMDIClientWndProc = MDIClientWndProcA; -// pfnClientW.pfnMDIClientWndProc = MDIClientWndProcW; -// pfnClientA.pfnStaticWndProc = StaticWndProcA; -// pfnClientW.pfnStaticWndProc = StaticWndProcW; + pfnClientA.pfnButtonWndProc = ButtonWndProcA; + pfnClientW.pfnButtonWndProc = ButtonWndProcW; + pfnClientA.pfnComboBoxWndProc = ComboWndProcA; + pfnClientW.pfnComboBoxWndProc = ComboWndProcW; + pfnClientA.pfnComboListBoxProc = ListBoxWndProcA; + pfnClientW.pfnComboListBoxProc = ListBoxWndProcW; + pfnClientA.pfnDialogWndProc = DefDlgProcA; + pfnClientW.pfnDialogWndProc = DefDlgProcW; + pfnClientA.pfnEditWndProc = EditWndProcA; + pfnClientW.pfnEditWndProc = EditWndProcW; + pfnClientA.pfnListBoxWndProc = ListBoxWndProcA; + pfnClientW.pfnListBoxWndProc = ListBoxWndProcW; + pfnClientA.pfnMDIClientWndProc = MDIClientWndProcA; + pfnClientW.pfnMDIClientWndProc = MDIClientWndProcW; + pfnClientA.pfnStaticWndProc = StaticWndProcA; + pfnClientW.pfnStaticWndProc = StaticWndProcW; pfnClientA.pfnImeWndProc = DefWindowProcA; pfnClientW.pfnImeWndProc = DefWindowProcW; pfnClientA.pfnGhostWndProc = DefWindowProcA; @@ -118,14 +133,14 @@ BOOL WINAPI RegisterClientPFN(VOID) pfnClientA.pfnMDIActivateDlgProc = DefWindowProcA; pfnClientW.pfnMDIActivateDlgProc = DefWindowProcW; -// pfnClientWorker.pfnButtonWndProc = ButtonWndProc_common; -// pfnClientWorker.pfnComboBoxWndProc = ComboWndProc_common; -// pfnClientWorker.pfnComboListBoxProc = ListBoxWndProc_common; -//// pfnClientWorker.pfnDialogWndProc = DefDlgProc_common; -// pfnClientWorker.pfnEditWndProc = EditWndProc_common; -// pfnClientWorker.pfnListBoxWndProc = ListBoxWndProc_common; -// pfnClientWorker.pfnMDIClientWndProc = MDIClientWndProc_common; -// pfnClientWorker.pfnStaticWndProc = StaticWndProc_common; + pfnClientWorker.pfnButtonWndProc = ButtonWndProc_common; + pfnClientWorker.pfnComboBoxWndProc = ComboWndProc_common; + pfnClientWorker.pfnComboListBoxProc = ListBoxWndProc_common; + pfnClientWorker.pfnDialogWndProc = DialogWndProc_common; + pfnClientWorker.pfnEditWndProc = EditWndProc_common; + pfnClientWorker.pfnListBoxWndProc = ListBoxWndProc_common; + pfnClientWorker.pfnMDIClientWndProc = MDIClientWndProc_common; + pfnClientWorker.pfnStaticWndProc = StaticWndProc_common; pfnClientWorker.pfnImeWndProc = User32DefWindowProc; pfnClientWorker.pfnGhostWndProc = User32DefWindowProc; pfnClientWorker.pfnCtfHookProc = User32DefWindowProc; diff --git a/reactos/dll/win32/user32/controls/scrollbar.c b/reactos/dll/win32/user32/controls/scrollbar.c index 0bafefe0573..671e638c932 100644 --- a/reactos/dll/win32/user32/controls/scrollbar.c +++ b/reactos/dll/win32/user32/controls/scrollbar.c @@ -69,8 +69,8 @@ static BOOL ScrollTrackVertical; HBRUSH DefWndControlColor(HDC hDC, UINT ctlType); -static LRESULT WINAPI ScrollBarWndProcW( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); -static LRESULT WINAPI ScrollBarWndProcA( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI ScrollBarWndProcW( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI ScrollBarWndProcA( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); UINT WINAPI SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC); BOOL WINAPI KillSystemTimer(HWND,UINT_PTR); @@ -1248,7 +1248,7 @@ ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt) /*********************************************************************** * ScrollBarWndProc */ -static LRESULT WINAPI +LRESULT WINAPI ScrollBarWndProc(WNDPROC DefWindowProc, HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { if (! IsWindow(Wnd)) @@ -1457,13 +1457,13 @@ ScrollBarWndProc(WNDPROC DefWindowProc, HWND Wnd, UINT Msg, WPARAM wParam, LPARA return 0; } -static LRESULT WINAPI +LRESULT WINAPI ScrollBarWndProcW(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return ScrollBarWndProc(DefWindowProcW, Wnd, Msg, wParam, lParam); } -static LRESULT WINAPI +LRESULT WINAPI ScrollBarWndProcA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return ScrollBarWndProc(DefWindowProcA, Wnd, Msg, wParam, lParam); diff --git a/reactos/dll/win32/user32/controls/static.c b/reactos/dll/win32/user32/controls/static.c index 75d19a0f61a..bd36a423627 100644 --- a/reactos/dll/win32/user32/controls/static.c +++ b/reactos/dll/win32/user32/controls/static.c @@ -55,8 +55,8 @@ static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style ); static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc, DWORD style ); //static void STATIC_PaintEnhMetafn( HWND hwnd, HDC hdc, DWORD style ); static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style ); -static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); -static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); static COLORREF color_3dshadow, color_3ddkshadow, color_3dhighlight; @@ -436,7 +436,7 @@ static BOOL hasTextStyle( DWORD style ) /*********************************************************************** * StaticWndProc_common */ -static LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, +LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode ) { LRESULT lResult = 0; @@ -663,7 +663,7 @@ static LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, /*********************************************************************** * StaticWndProcA */ -static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if (!IsWindow( hWnd )) return 0; return StaticWndProc_common(hWnd, uMsg, wParam, lParam, FALSE); @@ -672,7 +672,7 @@ static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARA /*********************************************************************** * StaticWndProcW */ -static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if (!IsWindow( hWnd )) return 0; return StaticWndProc_common(hWnd, uMsg, wParam, lParam, TRUE); diff --git a/reactos/dll/win32/user32/include/controls.h b/reactos/dll/win32/user32/include/controls.h index 5de02831e44..71528c3a6dc 100644 --- a/reactos/dll/win32/user32/include/controls.h +++ b/reactos/dll/win32/user32/include/controls.h @@ -110,5 +110,24 @@ extern BOOL COMBO_FlipListbox( LPHEADCOMBO, BOOL, BOOL ); LRESULT WINAPI DesktopWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); LRESULT WINAPI User32DefWindowProc(HWND,UINT,WPARAM,LPARAM,BOOL); BOOL WINAPI RegisterClientPFN(VOID); +LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI ButtonWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode); +LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode); +LRESULT WINAPI EditWndProcA(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +LRESULT WINAPI EditWndProcW(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode); +LRESULT WINAPI ListBoxWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI ListBoxWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg,WPARAM wParam, LPARAM lParam, BOOL unicode); +LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI MDIClientWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI MDIClientWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode); +LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode); #endif /* _ROS_CONTROLS_H */ diff --git a/reactos/dll/win32/user32/include/menu.h b/reactos/dll/win32/user32/include/menu.h index 223c12655da..bc039184e09 100644 --- a/reactos/dll/win32/user32/include/menu.h +++ b/reactos/dll/win32/user32/include/menu.h @@ -19,4 +19,7 @@ MenuTrackMouseMenuBar(HWND hWnd, ULONG Ht, POINT Pt); VOID MenuTrackKbdMenuBar(HWND hWnd, UINT wParam, WCHAR wChar); +LRESULT WINAPI PopupMenuWndProcA(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); +LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + #endif /* __LIB_USER32_INCLUDE_MENU_H */ diff --git a/reactos/dll/win32/user32/include/scroll.h b/reactos/dll/win32/user32/include/scroll.h index 2f35a21e7ae..e543f518409 100644 --- a/reactos/dll/win32/user32/include/scroll.h +++ b/reactos/dll/win32/user32/include/scroll.h @@ -9,6 +9,8 @@ #ifndef USER32_SCROLL_H_INCLUDED #define USER32_SCROLL_H_INCLUDED -extern VOID FASTCALL ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt); +LRESULT WINAPI ScrollBarWndProcW( HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam ); +LRESULT WINAPI ScrollBarWndProcA( HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam ); +VOID FASTCALL ScrollTrackScrollBar(HWND Wnd, INT SBType, POINT Pt); #endif diff --git a/reactos/dll/win32/user32/misc/misc.c b/reactos/dll/win32/user32/misc/misc.c index 97a86e0acbf..9f5938637f5 100644 --- a/reactos/dll/win32/user32/misc/misc.c +++ b/reactos/dll/win32/user32/misc/misc.c @@ -270,10 +270,10 @@ BOOL FASTCALL TestWindowProcess(PWND Wnd) { - if (Wnd->pti == (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo) + if (Wnd->head.pti == (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo) return TRUE; else - return (NtUserQueryWindow(Wnd->hdr.Handle, QUERY_WINDOW_UNIQUE_PROCESS_ID) == + return (NtUserQueryWindow(Wnd->head.h, QUERY_WINDOW_UNIQUE_PROCESS_ID) == (DWORD)NtCurrentTeb()->ClientId.UniqueProcess ); } diff --git a/reactos/dll/win32/user32/windows/mdi.c b/reactos/dll/win32/user32/windows/mdi.c index 0f2eec77987..6372255fba6 100644 --- a/reactos/dll/win32/user32/windows/mdi.c +++ b/reactos/dll/win32/user32/windows/mdi.c @@ -123,8 +123,8 @@ static LONG MDI_ChildActivate( HWND, HWND ); static LRESULT MDI_RefreshMenu(MDICLIENTINFO *); static HWND MDI_MoreWindowsDialog(HWND); -static LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); -static LRESULT WINAPI MDIClientWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); +//static LRESULT WINAPI MDIClientWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); HWND* WIN_ListChildren (HWND hWndparent) { @@ -1057,8 +1057,8 @@ static void MDI_UpdateFrameText( HWND frame, HWND hClient, LPCWSTR lpTitle ) /********************************************************************** * MDIClientWndProc_common */ -static LRESULT MDIClientWndProc_common( HWND hwnd, UINT message, - WPARAM wParam, LPARAM lParam, BOOL unicode ) +LRESULT WINAPI MDIClientWndProc_common( HWND hwnd, UINT message, + WPARAM wParam, LPARAM lParam, BOOL unicode ) { MDICLIENTINFO *ci = NULL; @@ -1319,7 +1319,7 @@ static LRESULT MDIClientWndProc_common( HWND hwnd, UINT message, /*********************************************************************** * MDIClientWndProcA */ -static LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { if (!IsWindow(hwnd)) return 0; return MDIClientWndProc_common( hwnd, message, wParam, lParam, FALSE ); @@ -1328,7 +1328,7 @@ static LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, /*********************************************************************** * MDIClientWndProcW */ -static LRESULT WINAPI MDIClientWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +LRESULT WINAPI MDIClientWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { if (!IsWindow(hwnd)) return 0; return MDIClientWndProc_common( hwnd, message, wParam, lParam, TRUE ); diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index 37d62035d5e..101c55bf702 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -72,8 +72,8 @@ typedef struct POINT Pt; } MTRACKER; -static LRESULT WINAPI PopupMenuWndProcA(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); -static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); +//static LRESULT WINAPI PopupMenuWndProcA(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); +//static LRESULT WINAPI PopupMenuWndProcW(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); /********************************************************************* * PopupMenu class descriptor @@ -972,7 +972,7 @@ MenuDrawPopupMenu(HWND Wnd, HDC Dc, HMENU Menu) } } -static LRESULT WINAPI +LRESULT WINAPI PopupMenuWndProcA(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam) { TRACE("YES! hwnd=%x msg=0x%04x wp=0x%04lx lp=0x%08lx\n", Wnd, Message, wParam, lParam); @@ -1036,7 +1036,7 @@ PopupMenuWndProcA(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam) return 0; } -static LRESULT WINAPI +LRESULT WINAPI PopupMenuWndProcW(HWND Wnd, UINT Message, WPARAM wParam, LPARAM lParam) { TRACE("hwnd=%x msg=0x%04x wp=0x%04lx lp=0x%08lx\n", Wnd, Message, wParam, lParam); diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index 9132245e1da..c1dc1f7cd6b 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -1340,7 +1340,7 @@ DispatchMessageA(CONST MSG *lpmsg) if (lpmsg->hwnd != NULL) { Wnd = ValidateHwnd(lpmsg->hwnd); - if (!Wnd || SharedPtrToUser(Wnd->pti) != GetW32ThreadInfo()) + if (!Wnd || SharedPtrToUser(Wnd->head.pti) != GetW32ThreadInfo()) return 0; } else @@ -1401,7 +1401,7 @@ DispatchMessageW(CONST MSG *lpmsg) if (lpmsg->hwnd != NULL) { Wnd = ValidateHwnd(lpmsg->hwnd); - if (!Wnd || SharedPtrToUser(Wnd->pti) != GetW32ThreadInfo()) + if (!Wnd || SharedPtrToUser(Wnd->head.pti) != GetW32ThreadInfo()) return 0; } else @@ -1801,7 +1801,7 @@ SendMessageW(HWND Wnd, PW32THREADINFO ti = GetW32ThreadInfo(); Window = ValidateHwnd(Wnd); - if (Window != NULL && SharedPtrToUser(Window->pti) == ti && !IsThreadHooked(GetWin32ClientInfo())) + if (Window != NULL && SharedPtrToUser(Window->head.pti) == ti && !IsThreadHooked(GetWin32ClientInfo())) { /* NOTE: We can directly send messages to the window procedure if *all* the following conditions are met: @@ -1865,7 +1865,7 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) PW32THREADINFO ti = GetW32ThreadInfo(); Window = ValidateHwnd(Wnd); - if (Window != NULL && SharedPtrToUser(Window->pti) == ti && !IsThreadHooked(GetWin32ClientInfo())) + if (Window != NULL && SharedPtrToUser(Window->head.pti) == ti && !IsThreadHooked(GetWin32ClientInfo())) { /* NOTE: We can directly send messages to the window procedure if *all* the following conditions are met: diff --git a/reactos/dll/win32/user32/windows/window.c b/reactos/dll/win32/user32/windows/window.c index ed464dea7fd..4bd9a19c3f0 100644 --- a/reactos/dll/win32/user32/windows/window.c +++ b/reactos/dll/win32/user32/windows/window.c @@ -1268,7 +1268,7 @@ GetWindowThreadProcessId(HWND hWnd, if (!pWnd) return Ret; - ti = SharedPtrToUser(pWnd->pti); + ti = SharedPtrToUser(pWnd->head.pti); if (ti) { diff --git a/reactos/include/reactos/win32k/ntgdityp.h b/reactos/include/reactos/win32k/ntgdityp.h index 79e5fc36307..42bd035c059 100644 --- a/reactos/include/reactos/win32k/ntgdityp.h +++ b/reactos/include/reactos/win32k/ntgdityp.h @@ -451,7 +451,8 @@ typedef struct _PATRECT RECT r; HBRUSH hBrush; } PATRECT, * PPATRECT; - +#endif +#ifndef __WIN32K_NTUSER_H typedef struct _W32CLIENTINFO { ULONG CI_flags; @@ -462,7 +463,6 @@ typedef struct _W32CLIENTINFO ULONG W32ClientInfo[57]; } W32CLIENTINFO, *PW32CLIENTINFO; #endif - typedef struct _GDIBSPPATBLT { GDIBATCHHDR gbHdr; diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 4c9526971e1..89c9edc2bdb 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -2,7 +2,6 @@ #define __WIN32K_NTUSER_H typedef struct _PROCESSINFO *PPROCESSINFO; -struct _W32THREADINFO; struct _DESKTOP; struct _WND; @@ -36,36 +35,6 @@ VOID NTAPI RtlInitLargeAnsiString(IN OUT PLARGE_ANSI_STRING,IN PCSZ,IN INT); VOID NTAPI RtlInitLargeUnicodeString(IN OUT PLARGE_UNICODE_STRING,IN PCWSTR,IN INT); BOOL NTAPI RtlLargeStringToUnicodeString( PUNICODE_STRING, PLARGE_STRING); -/* FIXME: UserHMGetHandle needs to be updated once the new handle manager is implemented */ -#define UserHMGetHandle(obj) ((obj)->hdr.Handle) - -typedef struct _REGISTER_SYSCLASS -{ - /* This is a reactos specific class used to initialize the - system window classes during user32 initialization */ - UNICODE_STRING ClassName; - UINT Style; - WNDPROC ProcW; - WNDPROC ProcA; - UINT ExtraBytes; - HICON hCursor; - HBRUSH hBrush; - UINT ClassId; -} REGISTER_SYSCLASS, *PREGISTER_SYSCLASS; - -typedef struct _CLSMENUNAME -{ - LPSTR pszClientAnsiMenuName; - LPWSTR pwszClientUnicodeMenuName; - PUNICODE_STRING pusMenuName; -} CLSMENUNAME, *PCLSMENUNAME; - -typedef struct _USER_OBJHDR -{ - /* This is the common header for all user handle objects */ - HANDLE Handle; -} USER_OBJHDR, PUSER_OBJHDR; - typedef struct _DESKTOPINFO { PVOID pvDesktopBase; @@ -90,6 +59,132 @@ typedef struct _DESKTOPINFO WCHAR szDesktopName[1]; } DESKTOPINFO, *PDESKTOPINFO; +#define CTI_INSENDMESSAGE 0x0002 + +typedef struct _CLIENTTHREADINFO +{ + DWORD CTI_flags; + WORD fsChangeBits; + WORD fsWakeBits; + WORD fsWakeBitsJournal; + WORD fsWakeMask; + ULONG tickLastMsgChecked; + DWORD dwcPumpHook; +} CLIENTTHREADINFO, *PCLIENTTHREADINFO; + +typedef struct _W32THREADINFO +{ + PPROCESSINFO ppi; /* [KERNEL] */ + PDESKTOPINFO pDeskInfo; + ULONG fsHooks; +} W32THREADINFO, *PW32THREADINFO; + +typedef struct _HEAD +{ + HANDLE h; + DWORD cLockObj; +} HEAD, *PHEAD; + +typedef struct _THRDESKHEAD +{ + HANDLE h; + DWORD cLockObj; + PW32THREADINFO pti; + struct _DESKTOP *rpdesk; + PVOID pSelf; +} THRDESKHEAD, *PTHRDESKHEAD; + +typedef struct _PROCDESKHEAD +{ + HANDLE h; + DWORD cLockObj; + DWORD hTaskWow; + struct _DESKTOP *rpdesk; + PVOID pSelf; +} PROCDESKHEAD, *PPROCDESKHEAD; + +#define UserHMGetHandle(obj) ((obj)->head.h) + +/* Window Client Information structure */ +struct _ETHREAD; + +typedef struct tagHOOK +{ + THRDESKHEAD head; + LIST_ENTRY Chain; /* Hook chain entry */ + struct _ETHREAD* Thread; /* Thread owning the hook */ + int HookId; /* Hook table index */ + HOOKPROC Proc; /* Hook function */ + BOOLEAN Ansi; /* Is it an Ansi hook? */ + ULONG Flags; /* Some internal flags */ + UNICODE_STRING ModuleName; /* Module name for global hooks */ +} HOOK, *PHOOK; + +typedef struct _CALLBACKWND +{ + HWND hWnd; + PVOID pvWnd; +} CALLBACKWND, *PCALLBACKWND; + +#define CI_CURTHPRHOOK 0x00000010 + +typedef struct _CLIENTINFO +{ + ULONG CI_flags; + ULONG cSpins; + DWORD dwExpWinVer; + DWORD dwCompatFlags; + DWORD dwCompatFlags2; + DWORD dwTIFlags; + PDESKTOPINFO pDeskInfo; + ULONG_PTR ulClientDelta; + PHOOK phkCurrent; + ULONG fsHooks; + CALLBACKWND CallbackWnd; + DWORD dwHookCurrent; + INT cInDDEMLCallback; + PCLIENTTHREADINFO pClientThreadInfo; + ULONG_PTR dwHookData; + DWORD dwKeyCache; + DWORD afKeyState[2]; + DWORD dwAsyncKeyCache; + DWORD afAsyncKeyState[2]; + DWORD afAsyncKeyStateRecentDow[2]; + HKL hKL; + USHORT CodePage; + USHORT achDbcsCF; + MSG msgDbcsCB; + ULONG Win32ClientInfo3[28]; +/* It's just a pointer reference not to be used w the structure in user space. */ + PPROCESSINFO ppi; +} CLIENTINFO, *PCLIENTINFO; + +/* Make sure it fits exactly into the TEB */ +C_ASSERT(sizeof(CLIENTINFO) == FIELD_OFFSET(TEB, glDispatchTable) - FIELD_OFFSET(TEB, Win32ClientInfo)); + +#define GetWin32ClientInfo() ((PCLIENTINFO)(NtCurrentTeb()->Win32ClientInfo)) + +typedef struct _REGISTER_SYSCLASS +{ + /* This is a reactos specific class used to initialize the + system window classes during user32 initialization */ + UNICODE_STRING ClassName; + UINT Style; + WNDPROC ProcW; + WNDPROC ProcA; + UINT ExtraBytes; + HICON hCursor; + HBRUSH hBrush; + UINT ClassId; +} REGISTER_SYSCLASS, *PREGISTER_SYSCLASS; + +typedef struct _CLSMENUNAME +{ + LPSTR pszClientAnsiMenuName; + LPWSTR pwszClientUnicodeMenuName; + PUNICODE_STRING pusMenuName; +} CLSMENUNAME, *PCLSMENUNAME; + typedef enum _GETCPD { UserGetCPDU2A = 0x01, @@ -102,9 +197,7 @@ typedef enum _GETCPD typedef struct _CALLPROCDATA { -// PROCDESKHEAD head; // Use this once new handle manager is implemented!!! - USER_OBJHDR hdr; /* FIXME: Move out of the structure once new handle manager is implemented */ -// + PROCDESKHEAD head; struct _CALLPROCDATA *spcpdNext; WNDPROC pfnClientPrevious; union @@ -257,15 +350,7 @@ typedef struct _CLS typedef struct _WND { - //THRDESKHEAD head; // head.h == handle - USER_OBJHDR hdr; /* FIXME: Move out of the structure once new handle manager is implemented */ - /* NOTE: This structure is located in the desktop heap and will - eventually replace WINDOW_OBJECT. Right now WINDOW_OBJECT - keeps a reference to this structure until all the information - is moved to this structure */ - struct _W32THREADINFO *pti; // head.pti - struct _DESKTOP *rpdesk; // head.rpdesk - + THRDESKHEAD head; DWORD state; DWORD state2; /* Extended style. */ @@ -388,6 +473,7 @@ typedef LONG_PTR (NTAPI *PFN_FNID)(PWND, UINT, WPARAM, LPARAM, ULONG_PTR); #define FNID_MENU 0x029C #define FNID_DESKTOP 0x029D #define FNID_DEFWINDOWPROC 0x029E +#define FNID_MESSAGEWND 0x029F #define FNID_SWITCH 0x02A0 #define FNID_BUTTON 0x02A1 #define FNID_COMBOBOX 0x02A2 @@ -398,17 +484,20 @@ typedef LONG_PTR (NTAPI *PFN_FNID)(PWND, UINT, WPARAM, LPARAM, ULONG_PTR); #define FNID_MDICLIENT 0x02A7 #define FNID_STATIC 0x02A8 #define FNID_IME 0x02A9 -#define FNID_CALLWNDPROC 0x02AA -#define FNID_CALLWNDPROCRET 0x02AB -#define FNID_HKINLPCWPEXSTRUCT 0x02AC -#define FNID_HKINLPCWPRETEXSTRUCT 0x02AD -#define FNID_SENDMESSAGE 0x02B0 +#define FNID_GHOST 0x02AA +#define FNID_CALLWNDPROC 0x02AB +#define FNID_CALLWNDPROCRET 0x02AC +#define FNID_HKINLPCWPEXSTRUCT 0x02AD +#define FNID_HKINLPCWPRETEXSTRUCT 0x02AE +#define FNID_MB_DLGPROC 0x02AF +#define FNID_MDIACTIVATEDLGPROC 0x02B0 +#define FNID_SENDMESSAGE 0x02B1 +#define FNID_SENDMESSAGEFF 0x02B2 // Kernel has option to use TimeOut or normal msg send, based on type of msg. -#define FNID_SENDMESSAGEWTOOPTION 0x02B1 -#define FNID_SENDMESSAGETIMEOUT 0x02B2 -#define FNID_BROADCASTSYSTEMMESSAGE 0x02B4 -#define FNID_TOOLTIPS 0x02B5 -#define FNID_UNKNOWN 0x02B6 +#define FNID_SENDMESSAGEWTOOPTION 0x02B3 +#define FNID_SENDMESSAGETIMEOUT 0x02B4 +#define FNID_BROADCASTSYSTEMMESSAGE 0x02B5 +#define FNID_TOOLTIPS 0x02B6 #define FNID_SENDNOTIFYMESSAGE 0x02B7 #define FNID_SENDMESSAGECALLBACK 0x02B8 #define FNID_LAST 0x02B9 @@ -551,85 +640,6 @@ typedef struct tagSERVERINFO PERUSERSERVERINFO; } SERVERINFO, *PSERVERINFO; -#define CTI_INSENDMESSAGE 0x0002 - -typedef struct _CLIENTTHREADINFO -{ - DWORD CTI_flags; - WORD fsChangeBits; - WORD fsWakeBits; - WORD fsWakeBitsJournal; - WORD fsWakeMask; - ULONG tickLastMsgChecked; - DWORD dwcPumpHook; -} CLIENTTHREADINFO, *PCLIENTTHREADINFO; - -typedef struct _W32THREADINFO -{ - PPROCESSINFO ppi; /* [KERNEL] */ - PDESKTOPINFO pDeskInfo; - ULONG fsHooks; -} W32THREADINFO, *PW32THREADINFO; - -/* Window Client Information structure */ -struct _ETHREAD; - - -typedef struct tagHOOK -{ - LIST_ENTRY Chain; /* Hook chain entry */ - HHOOK Self; /* user handle for this hook */ - struct _ETHREAD* Thread; /* Thread owning the hook */ - int HookId; /* Hook table index */ - HOOKPROC Proc; /* Hook function */ - BOOLEAN Ansi; /* Is it an Ansi hook? */ - ULONG Flags; /* Some internal flags */ - UNICODE_STRING ModuleName; /* Module name for global hooks */ -} HOOK, *PHOOK; - -typedef struct _CALLBACKWND -{ - HWND hWnd; - PVOID pvWnd; -} CALLBACKWND, *PCALLBACKWND; - -#define CI_CURTHPRHOOK 0x00000010 - -typedef struct _CLIENTINFO -{ - ULONG CI_flags; - ULONG cSpins; - DWORD dwExpWinVer; - DWORD dwCompatFlags; - DWORD dwCompatFlags2; - DWORD dwTIFlags; - PDESKTOPINFO pDeskInfo; - ULONG_PTR ulClientDelta; - PHOOK phkCurrent; - ULONG fsHooks; - CALLBACKWND CallbackWnd; - DWORD dwHookCurrent; - INT cInDDEMLCallback; - PCLIENTTHREADINFO pClientThreadInfo; - ULONG_PTR dwHookData; - DWORD dwKeyCache; - DWORD afKeyState[2]; - DWORD dwAsyncKeyCache; - DWORD afAsyncKeyState[2]; - DWORD afAsyncKeyStateRecentDow[2]; - HKL hKL; - USHORT CodePage; - USHORT achDbcsCF; - MSG msgDbcsCB; - ULONG Win32ClientInfo3[28]; -/* It's just a pointer reference not to be used w the structure in user space. */ - PPROCESSINFO ppi; -} CLIENTINFO, *PCLIENTINFO; - -/* Make sure it fits exactly into the TEB */ -C_ASSERT(sizeof(CLIENTINFO) == FIELD_OFFSET(TEB, glDispatchTable) - FIELD_OFFSET(TEB, Win32ClientInfo)); - -#define GetWin32ClientInfo() ((PCLIENTINFO)(NtCurrentTeb()->Win32ClientInfo)) // Server event activity bits. #define SRV_EVENT_MENU 0x0001 diff --git a/reactos/subsystems/win32/win32k/include/hook.h b/reactos/subsystems/win32/win32k/include/hook.h index 9f71f25505d..2042b1f7e41 100644 --- a/reactos/subsystems/win32/win32k/include/hook.h +++ b/reactos/subsystems/win32/win32k/include/hook.h @@ -2,19 +2,6 @@ #define _WIN32K_HOOK_H #define HOOK_THREAD_REFERENCED (0x1) -#if 0 -typedef struct tagHOOK -{ - LIST_ENTRY Chain; /* Hook chain entry */ - HHOOK Self; /* user handle for this hook */ - PETHREAD Thread; /* Thread owning the hook */ - int HookId; /* Hook table index */ - HOOKPROC Proc; /* Hook function */ - BOOLEAN Ansi; /* Is it an Ansi hook? */ - ULONG Flags; /* Some internal flags */ - UNICODE_STRING ModuleName; /* Module name for global hooks */ -} HOOK, *PHOOK; -#endif #define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1) #define HOOKID_TO_INDEX(HookId) (HookId - WH_MINHOOK) #define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1)) @@ -29,7 +16,6 @@ typedef struct tagHOOKTABLE typedef struct tagEVENTHOOK { LIST_ENTRY Chain; /* Event chain entry */ - HWINEVENTHOOK Self; /* user handle for this event */ PETHREAD Thread; /* Thread owning the event */ UINT eventMin; UINT eventMax; @@ -39,6 +25,7 @@ typedef struct tagEVENTHOOK ULONG Flags; /* Some internal flags */ ULONG_PTR offPfn; INT ihmod; + THRDESKHEAD head; // FIXME When on top it creates problems UNICODE_STRING ModuleName; /* Module name for global events */ } EVENTHOOK, *PEVENTHOOK; diff --git a/reactos/subsystems/win32/win32k/include/window.h b/reactos/subsystems/win32/win32k/include/window.h index 239103714ac..16537c1448b 100644 --- a/reactos/subsystems/win32/win32k/include/window.h +++ b/reactos/subsystems/win32/win32k/include/window.h @@ -169,7 +169,7 @@ IntShowOwnedPopups( PWINDOW_OBJECT owner, BOOL fShow ); LRESULT FASTCALL IntDefWindowProc( PWINDOW_OBJECT Window, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi); -VOID FASTCALL IntNotifyWinEvent(DWORD, HWND, LONG, LONG); +VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG); PWND APIENTRY co_IntCreateWindowEx(DWORD,PUNICODE_STRING,PUNICODE_STRING,DWORD,LONG,LONG,LONG,LONG,HWND,HMENU,HINSTANCE,LPVOID,DWORD,BOOL); #endif /* _WIN32K_WINDOW_H */ diff --git a/reactos/subsystems/win32/win32k/ntuser/callproc.c b/reactos/subsystems/win32/win32k/ntuser/callproc.c index 42ce855eea6..e7f3c2ca900 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callproc.c +++ b/reactos/subsystems/win32/win32k/ntuser/callproc.c @@ -48,7 +48,7 @@ CloneCallProc(IN PDESKTOPINFO Desktop, sizeof(CALLPROCDATA)); if (NewCallProc != NULL) { - NewCallProc->hdr.Handle = Handle; /* FIXME: Remove hack */ + NewCallProc->head.h = Handle; NewCallProc->pfnClientPrevious = CallProc->pfnClientPrevious; NewCallProc->Unicode = CallProc->Unicode; NewCallProc->spcpdNext = NULL; @@ -73,7 +73,7 @@ CreateCallProc(IN PDESKTOPINFO Desktop, sizeof(CALLPROCDATA)); if (NewCallProc != NULL) { - NewCallProc->hdr.Handle = Handle; /* FIXME: Remove hack */ + NewCallProc->head.h = Handle; NewCallProc->pfnClientPrevious = WndProc; NewCallProc->Unicode = Unicode; NewCallProc->spcpdNext = NULL; diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index e6ae2fee7fe..d7010f99031 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -566,7 +566,7 @@ HWND FASTCALL IntGetMessageWindow(VOID) DPRINT("No active desktop\n"); return NULL; } - return pdo->spwndMessage->hdr.Handle; + return pdo->spwndMessage->head.h; } HWND FASTCALL IntGetCurrentThreadDesktopWindow(VOID) @@ -1119,7 +1119,7 @@ NtUserCreateDesktop( wc.cbSize = sizeof(wc); wc.style = 0; - wc.lpfnWndProc = gpsi->apfnClientW.pfnDesktopWndProc; // Use pfnMessageWindowProc + wc.lpfnWndProc = gpsi->apfnClientW.pfnMessageWindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hModClient; diff --git a/reactos/subsystems/win32/win32k/ntuser/event.c b/reactos/subsystems/win32/win32k/ntuser/event.c index 0b85dded343..c84037ca610 100644 --- a/reactos/subsystems/win32/win32k/ntuser/event.c +++ b/reactos/subsystems/win32/win32k/ntuser/event.c @@ -4,6 +4,9 @@ #define NDEBUG #include +#define WINEVENT_INIT 0x40000000 +#define WINEVENT_DESTROYED 0x80000000 + typedef struct _EVENTPACK { PEVENTHOOK pEH; @@ -126,10 +129,13 @@ IntRemoveEvent(PEVENTHOOK pEH) { if (pEH) { + DPRINT("IntRemoveEvent pEH 0x%x\n",pEH); + KeEnterCriticalRegion(); RemoveEntryList(&pEH->Chain); GlobalEvents->Counts--; if (!GlobalEvents->Counts) gpsi->dwInstalledEventHooks = 0; - UserDeleteObject(pEH->Self, otEvent); + UserDeleteObject(pEH->head.h, otEvent); + KeLeaveCriticalRegion(); return TRUE; } return FALSE; @@ -150,14 +156,14 @@ co_EVENT_CallEvents( DWORD event, pEH = pEP->pEH; - Result = co_IntCallEventProc( pEH->Self, - event, - hwnd, - pEP->idObject, - pEP->idChild, + Result = co_IntCallEventProc( pEH->head.h, + event, + hwnd, + pEP->idObject, + pEP->idChild, (DWORD)(NtCurrentTeb()->ClientId).UniqueThread, - (DWORD)EngGetTickCount(), - pEH->Proc); + (DWORD)EngGetTickCount(), + pEH->Proc); return Result; } @@ -165,19 +171,32 @@ VOID FASTCALL IntNotifyWinEvent( DWORD Event, - HWND hWnd, + PWND pWnd, LONG idObject, LONG idChild) { PEVENTHOOK pEH; LRESULT Result; + DPRINT("IntNotifyWinEvent GlobalEvents = 0x%x pWnd 0x%x\n",GlobalEvents, pWnd); + + if (!pWnd) return; + + if (pWnd && pWnd->state & WNDS_DESTROYED) return; + if (!GlobalEvents || !GlobalEvents->Counts) return; - pEH = (PEVENTHOOK)GlobalEvents->Events.Flink; + if (!UserIsEntered()) return; + pEH = (PEVENTHOOK)GlobalEvents->Events.Flink; + DPRINT("IntNotifyWinEvent pEH 0x%x\n",pEH); do { + if (pEH->Flags & WINEVENT_INIT) + { + DPRINT("IntNotifyWinEvent is still in INIT MODE!! pEH 0x%x\n",pEH); + } + UserReferenceObject(pEH); // Must be inside the event window. if ( (pEH->eventMin <= Event) && (pEH->eventMax >= Event)) @@ -187,7 +206,7 @@ IntNotifyWinEvent( if (!(pEH->idProcess) || !(pEH->idThread) || (NtCurrentTeb()->ClientId.UniqueProcess == (PVOID)pEH->idProcess)) { - Result = IntCallLowLevelEvent(pEH, Event, hWnd, idObject, idChild); + Result = IntCallLowLevelEvent(pEH, Event, UserHMGetHandle(pWnd), idObject, idChild); } }// if ^skip own thread && ((Pid && CPid == Pid && ^skip own process) || all process) else if ( !(pEH->Flags & WINEVENT_SKIPOWNTHREAD) && @@ -196,14 +215,16 @@ IntNotifyWinEvent( !(pEH->Flags & WINEVENT_SKIPOWNPROCESS)) || !pEH->idProcess ) ) { - Result = co_IntCallEventProc( pEH->Self, - Event, - hWnd, - idObject, - idChild, + + Result = co_IntCallEventProc( pEH->head.h, + Event, + UserHMGetHandle(pWnd), + idObject, + idChild, PtrToUint(NtCurrentTeb()->ClientId.UniqueThread), - (DWORD)EngGetTickCount(), - pEH->Proc); + (DWORD)EngGetTickCount(), + pEH->Proc); + } } UserDereferenceObject(pEH); @@ -234,7 +255,7 @@ NtUserNotifyWinEvent( if (gpsi->dwInstalledEventHooks & GetMaskFromEvent(Event)) { UserRefObjectCo(Window, &Ref); - IntNotifyWinEvent( Event, Window->hSelf, idObject, idChild); + IntNotifyWinEvent( Event, Window->Wnd, idObject, idChild); UserDerefObjectCo(Window); } UserLeave(); @@ -309,7 +330,10 @@ NtUserSetWinEventHook( InsertTailList(&GlobalEvents->Events, &pEH->Chain); GlobalEvents->Counts++; - pEH->Self = Handle; + pEH->Flags = dwflags|WINEVENT_INIT; + pEH->head.h = Handle; +// pEH->head.pti =? +// pEH->head.rpdesk if (Thread) pEH->Thread = Thread; else @@ -318,8 +342,6 @@ NtUserSetWinEventHook( pEH->eventMax = eventMax; pEH->idProcess = idProcess; pEH->idThread = idThread; - pEH->Flags = dwflags; - if (NULL != hmodWinEventProc) { @@ -371,6 +393,8 @@ NtUserSetWinEventHook( else pEH->Proc = lpfnWinEventProc; + pEH->Flags &= ~WINEVENT_INIT; + UserDereferenceObject(pEH); Ret = Handle; diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 4263352e742..6c476489ae5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -104,7 +104,9 @@ IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinSt return NULL; } - Hook->Self = Handle; +// Hook->head.pti =? +// Hook->head.rpdesk + Hook->head.h = Handle; Hook->Thread = Thread; Hook->HookId = HookId; @@ -218,7 +220,7 @@ IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj) } /* Close handle */ - UserDeleteObject(Hook->Self, otHook); + UserDeleteObject(Hook->head.h, otHook); } /* remove a hook, freeing it if the chain is not in use */ @@ -1282,7 +1284,7 @@ NtUserSetWindowsHookEx(HINSTANCE Mod, Hook->Proc = HookProc; Hook->Ansi = Ansi; - Handle = Hook->Self; + Handle = Hook->head.h; /* Clear the client threads next hook. */ ClientInfo->phkCurrent = 0; @@ -1333,7 +1335,7 @@ NtUserUnhookWindowsHookEx(HHOOK Hook) RETURN( FALSE); } - ASSERT(Hook == HookObj->Self); + ASSERT(Hook == HookObj->head.h); IntRemoveHook(HookObj, WinStaObj, FALSE); diff --git a/reactos/subsystems/win32/win32k/ntuser/object.c b/reactos/subsystems/win32/win32k/ntuser/object.c index a05b86db21d..0221c57ce50 100644 --- a/reactos/subsystems/win32/win32k/ntuser/object.c +++ b/reactos/subsystems/win32/win32k/ntuser/object.c @@ -382,7 +382,7 @@ BOOL FASTCALL UserDereferenceObject(PVOID obj) if (!hdr->destroyed && hdr->RefCount == 0) { hdr->RefCount++; // BOUNCE!!!!! - DPRINT1("warning! Dereference to zero without deleting!\n"); + DPRINT1("warning! Dereference to zero without deleting! Obj -> 0x%x\n", obj); } if (hdr->RefCount == 0 && hdr->destroyed) diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index c94544e5aa2..fffe387d368 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -418,7 +418,7 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) // Window nz, check to see if we still own this or it is just cheap wine tonight. if (!(Flags & DCX_CACHE)) { - if ( Wnd->pti != GetW32ThreadInfo()) + if ( Wnd->head.pti != GetW32ThreadInfo()) Flags |= DCX_CACHE; // Ah~ Not Powned! Forced to be cheap~ } diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 43b513a8e2d..386d0a888e7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -329,12 +329,12 @@ UserFreeWindowInfo(PW32THREADINFO ti, PWINDOW_OBJECT WindowObject) { Wnd->strName.Length = 0; Wnd->strName.MaximumLength = 0; - DesktopHeapFree(Wnd->rpdesk, + DesktopHeapFree(Wnd->head.rpdesk, Wnd->strName.Buffer); Wnd->strName.Buffer = NULL; } - DesktopHeapFree(Wnd->rpdesk, Wnd); + DesktopHeapFree(Wnd->head.rpdesk, Wnd); WindowObject->Wnd = NULL; } @@ -370,6 +370,9 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, } Window->Status |= WINDOWSTATUS_DESTROYING; Wnd->style &= ~WS_VISIBLE; + + IntNotifyWinEvent(EVENT_OBJECT_DESTROY, Wnd, OBJID_WINDOW, 0); + /* remove the window already at this point from the thread window list so we don't get into trouble when destroying the thread windows while we're still in IntDestroyWindow() */ @@ -379,8 +382,6 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, IntDeRegisterShellHookWindow(Window->hSelf); - IntNotifyWinEvent(EVENT_OBJECT_DESTROY, Window->hSelf, OBJID_WINDOW, 0); - if(SendMessages) { /* Send destroy messages */ @@ -428,6 +429,8 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, /* from now on no messages can be sent to this window anymore */ Window->Status |= WINDOWSTATUS_DESTROYED; + Wnd->state |= WNDS_DESTROYED; + /* don't remove the WINDOWSTATUS_DESTROYING bit */ /* reset shell window handles */ @@ -569,10 +572,10 @@ IntGetWindowProc(IN PWINDOW_OBJECT Window, Wnd->Unicode); if (NewCallProc == NULL) { - NewCallProc = CreateCallProc(Wnd->pti->pDeskInfo, + NewCallProc = CreateCallProc(Wnd->head.pti->pDeskInfo, Wnd->lpfnWndProc, Wnd->Unicode, - Wnd->pti->ppi); + Wnd->head.pti->ppi); if (NewCallProc == NULL) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); @@ -1669,11 +1672,11 @@ co_IntCreateWindowEx(DWORD dwExStyle, goto AllocErr; RtlZeroMemory(Window->Wnd, sizeof(WND) + Class->cbwndExtra); - Window->Wnd->hdr.Handle = hWnd; /* FIXME: Remove hack , are you sure?*/ + Window->Wnd->head.h = hWnd; Wnd = Window->Wnd; - Wnd->pti = ti; - Wnd->rpdesk = pti->Desktop; + Wnd->head.pti = ti; + Wnd->head.rpdesk = pti->Desktop; Wnd->hWndLastActive = hWnd; } @@ -1769,7 +1772,7 @@ AllocErr: if ( NULL != WindowName->Buffer && WindowName->Length > 0 ) { - Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->rpdesk, + Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->head.rpdesk, WindowName->Length + sizeof(UNICODE_NULL)); if (Wnd->strName.Buffer == NULL) { @@ -2122,7 +2125,7 @@ AllocErr: RETURN((PWND)0); } - IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->hSelf, OBJID_WINDOW, 0); + IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->Wnd, OBJID_WINDOW, 0); /* Send move and size messages. */ if (!(Window->Flags & WINDOWOBJECT_NEED_SIZE)) @@ -2240,7 +2243,7 @@ AllocErr: { PCALLPROCDATA CallProc; //CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, bUnicodeWindow, Wnd->ti->ppi); - CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode , Wnd->pti->ppi); + CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode , Wnd->head.pti->ppi); if (!CallProc) { @@ -2363,7 +2366,7 @@ NtUserCreateWindowEx(DWORD dwExStyle, dwShowMode, bUnicodeWindow); - if (pNewWindow) NewWindow = pNewWindow->hdr.Handle; + if (pNewWindow) NewWindow = UserHMGetHandle(pNewWindow); if (WindowName.Buffer) { @@ -3729,7 +3732,7 @@ IntSetWindowProc(PWINDOW_OBJECT Window, CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode, - Wnd->pti->ppi); + Wnd->head.pti->ppi); if (CallProc == NULL) { SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); @@ -4819,10 +4822,10 @@ NtUserDefSetText(HWND hWnd, PLARGE_STRING WindowText) Wnd->strName.Buffer = NULL; if (buf != NULL) { - DesktopHeapFree(Wnd->rpdesk, buf); + DesktopHeapFree(Wnd->head.rpdesk, buf); } - Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->rpdesk, + Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->head.rpdesk, UnicodeString.Length + sizeof(UNICODE_NULL)); if (Wnd->strName.Buffer != NULL) { From a619244941838aa5ea847c6c62d7f3c84029e5fd Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 26 Jul 2009 05:51:30 +0000 Subject: [PATCH 565/577] - Remove our old ws2help in preparation for the transition to ws2help_new - This will not build - Part 1 of 2 svn path=/trunk/; revision=42224 --- reactos/dll/win32/ws2help/debug.h | 65 ----- reactos/dll/win32/ws2help/ws2help.c | 328 ----------------------- reactos/dll/win32/ws2help/ws2help.def | 30 --- reactos/dll/win32/ws2help/ws2help.h | 21 -- reactos/dll/win32/ws2help/ws2help.rbuild | 9 - reactos/dll/win32/ws2help/ws2help.rc | 7 - 6 files changed, 460 deletions(-) delete mode 100644 reactos/dll/win32/ws2help/debug.h delete mode 100644 reactos/dll/win32/ws2help/ws2help.c delete mode 100644 reactos/dll/win32/ws2help/ws2help.def delete mode 100644 reactos/dll/win32/ws2help/ws2help.h delete mode 100644 reactos/dll/win32/ws2help/ws2help.rbuild delete mode 100644 reactos/dll/win32/ws2help/ws2help.rc diff --git a/reactos/dll/win32/ws2help/debug.h b/reactos/dll/win32/ws2help/debug.h deleted file mode 100644 index b25f7cc96d4..00000000000 --- a/reactos/dll/win32/ws2help/debug.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS WinSock 2 Helper DLL for TCP/IP - * FILE: include/debug.h - * PURPOSE: Debugging support macros - * DEFINES: DBG - Enable debug output - * NASSERT - Disable assertions - */ -#ifndef __DEBUG_H -#define __DEBUG_H - -#define NORMAL_MASK 0x000000FF -#define SPECIAL_MASK 0xFFFFFF00 -#define MIN_TRACE 0x00000001 -#define MID_TRACE 0x00000002 -#define MAX_TRACE 0x00000003 - -#define DEBUG_ULTRA 0xFFFFFFFF - -#ifdef ASSERT -#undef ASSERT -#endif - -#if DBG - -extern DWORD DebugTraceLevel; - -#define WSH_DbgPrint(_t_, _x_) \ - if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \ - ((DebugTraceLevel & _t_) > NORMAL_MASK)) { \ - DbgPrint("(%hS:%d)(%hS) ", __FILE__, __LINE__, __FUNCTION__); \ - DbgPrint _x_; \ - } - -#ifdef NASSERT -#define ASSERT(x) -#else /* NASSERT */ -#define ASSERT(x) if (!(x)) { WSH_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); ExitProcess(0); } -#endif /* NASSERT */ - -#else /* DBG */ - -#define WSH_DbgPrint(_t_, _x_) - -#define ASSERT(x) - -#endif /* DBG */ - -#undef assert -#define assert(x) ASSERT(x) -#define assert_irql(x) ASSERT_IRQL(x) - - -#define UNIMPLEMENTED \ - WSH_DbgPrint(MIN_TRACE, ("(%s:%d)(%s) is unimplemented, \ - please try again later.\n", __FILE__, __LINE__, __FUNCTION__)); - -#define CHECKPOINT \ - WSH_DbgPrint(MIN_TRACE, ("\n")); - -#define CP CHECKPOINT - -#endif /* __DEBUG_H */ - -/* EOF */ diff --git a/reactos/dll/win32/ws2help/ws2help.c b/reactos/dll/win32/ws2help/ws2help.c deleted file mode 100644 index d2fd024b464..00000000000 --- a/reactos/dll/win32/ws2help/ws2help.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS WinSock 2 Helper DLL for TCP/IP - * FILE: ws2help.c - * PURPOSE: DLL entry - * PROGRAMMERS: Robert D. Dickenson (robertdickenson@users.sourceforge.net) - * REVISIONS: - * RDD 18/06-2002 Created - */ -#include "ws2help.h" - -#include -#if DBG - -/* See debug.h for debug/trace constants */ -DWORD DebugTraceLevel = MAX_TRACE; - -#endif /* DBG */ - -/* To make the linker happy */ -VOID WINAPI KeBugCheck (ULONG BugCheckCode) {} - - -BOOL -EXPORT -DllMain(HANDLE hInstDll, - ULONG dwReason, - PVOID Reserved) -{ - WSH_DbgPrint(MIN_TRACE, ("DllMain of ws2help.dll\n")); - - switch (dwReason) { - case DLL_PROCESS_ATTACH: - /* Don't need thread attach notifications - so disable them to improve performance */ - DisableThreadLibraryCalls(hInstDll); - break; - - case DLL_THREAD_ATTACH: - break; - - case DLL_THREAD_DETACH: - break; - - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - - -INT -EXPORT -WahCloseApcHelper( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahCloseHandleHelper( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahCloseNotificationHandleHelper( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahCloseSocketHandle( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahCloseThread( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahCompleteRequest( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahCreateHandleContextTable( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahCreateNotificationHandle( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahCreateSocketHandle( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahDestroyHandleContextTable( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahDisableNonIFSHandleSupport( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahEnableNonIFSHandleSupport( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahEnumerateHandleContexts( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahInsertHandleContext( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahNotifyAllProcesses( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahOpenApcHelper( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahOpenCurrentThread( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahOpenHandleHelper( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahOpenNotificationHandleHelper( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahQueueUserApc( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahReferenceContextByHandle( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahRemoveHandleContext( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -INT -EXPORT -WahWaitForNotification( - IN PVOID HelperDllSocketContext, - IN SOCKET SocketHandle - ) -{ - UNIMPLEMENTED - - return 0; -} - -/* EOF */ diff --git a/reactos/dll/win32/ws2help/ws2help.def b/reactos/dll/win32/ws2help/ws2help.def deleted file mode 100644 index fbffcc8046c..00000000000 --- a/reactos/dll/win32/ws2help/ws2help.def +++ /dev/null @@ -1,30 +0,0 @@ -; WS2HELP.DLL - Windows Sockets 2 Helper DLL for TCP/IP - -LIBRARY ws2help.dll - -EXPORTS -WahCloseApcHelper@8 -WahCloseHandleHelper@8 -WahCloseNotificationHandleHelper@8 -WahCloseSocketHandle@8 -WahCloseThread@8 -WahCompleteRequest@8 -WahCreateHandleContextTable@8 -WahCreateNotificationHandle@8 -WahCreateSocketHandle@8 -WahDestroyHandleContextTable@8 -WahDisableNonIFSHandleSupport@8 -WahEnableNonIFSHandleSupport@8 -WahEnumerateHandleContexts@8 -WahInsertHandleContext@8 -WahNotifyAllProcesses@8 -WahOpenApcHelper@8 -WahOpenCurrentThread@8 -WahOpenHandleHelper@8 -WahOpenNotificationHandleHelper@8 -WahQueueUserApc@8 -WahReferenceContextByHandle@8 -WahRemoveHandleContext@8 -WahWaitForNotification@8 - -; EOF diff --git a/reactos/dll/win32/ws2help/ws2help.h b/reactos/dll/win32/ws2help/ws2help.h deleted file mode 100644 index ee7f1b5a078..00000000000 --- a/reactos/dll/win32/ws2help/ws2help.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS WinSock 2 Helper DLL for TCP/IP - * FILE: include/ws2help.h - * PURPOSE: WinSock 2 Helper DLL for TCP/IP header - */ -#ifndef __WS2HELP_H -#define __WS2HELP_H - -#define WIN32_NO_STATUS -#include -#define NTOS_MODE_USER -#include - -#include - -#define EXPORT WINAPI - -#endif /* __WS2HELP_H */ - -/* EOF */ diff --git a/reactos/dll/win32/ws2help/ws2help.rbuild b/reactos/dll/win32/ws2help/ws2help.rbuild deleted file mode 100644 index 79378b09522..00000000000 --- a/reactos/dll/win32/ws2help/ws2help.rbuild +++ /dev/null @@ -1,9 +0,0 @@ - - - . - ntdll - kernel32 - ws2_32 - ws2help.c - ws2help.rc - diff --git a/reactos/dll/win32/ws2help/ws2help.rc b/reactos/dll/win32/ws2help/ws2help.rc deleted file mode 100644 index 83527bf486b..00000000000 --- a/reactos/dll/win32/ws2help/ws2help.rc +++ /dev/null @@ -1,7 +0,0 @@ -/* $Id$ */ - -#define REACTOS_VERSION_DLL -#define REACTOS_STR_FILE_DESCRIPTION "Windows Sockets 2 Helper API\0" -#define REACTOS_STR_INTERNAL_NAME "ws2help\0" -#define REACTOS_STR_ORIGINAL_FILENAME "ws2help.dll\0" -#include From 698ff57ea62e09a660df23e5c2b1b5541472882c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 26 Jul 2009 06:00:32 +0000 Subject: [PATCH 566/577] - Begin using ws2help_new - I have tested this with various applications in ROS - Part 2 of 2 svn path=/trunk/; revision=42225 --- reactos/dll/win32/{ws2help_new => ws2help}/apc.c | 0 reactos/dll/win32/{ws2help_new => ws2help}/context.c | 0 reactos/dll/win32/{ws2help_new => ws2help}/dllmain.c | 0 reactos/dll/win32/{ws2help_new => ws2help}/handle.c | 0 reactos/dll/win32/{ws2help_new => ws2help}/notify.c | 0 reactos/dll/win32/{ws2help_new => ws2help}/precomp.h | 0 reactos/dll/win32/{ws2help_new => ws2help}/ws2help.h | 0 reactos/dll/win32/{ws2help_new => ws2help}/ws2help.rbuild | 0 reactos/dll/win32/{ws2help_new => ws2help}/ws2help.rc | 0 reactos/dll/win32/{ws2help_new => ws2help}/ws2help.spec | 0 reactos/dll/win32/{ws2help_new => ws2help}/wshdrv.h | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename reactos/dll/win32/{ws2help_new => ws2help}/apc.c (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/context.c (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/dllmain.c (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/handle.c (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/notify.c (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/precomp.h (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/ws2help.h (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/ws2help.rbuild (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/ws2help.rc (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/ws2help.spec (100%) rename reactos/dll/win32/{ws2help_new => ws2help}/wshdrv.h (100%) diff --git a/reactos/dll/win32/ws2help_new/apc.c b/reactos/dll/win32/ws2help/apc.c similarity index 100% rename from reactos/dll/win32/ws2help_new/apc.c rename to reactos/dll/win32/ws2help/apc.c diff --git a/reactos/dll/win32/ws2help_new/context.c b/reactos/dll/win32/ws2help/context.c similarity index 100% rename from reactos/dll/win32/ws2help_new/context.c rename to reactos/dll/win32/ws2help/context.c diff --git a/reactos/dll/win32/ws2help_new/dllmain.c b/reactos/dll/win32/ws2help/dllmain.c similarity index 100% rename from reactos/dll/win32/ws2help_new/dllmain.c rename to reactos/dll/win32/ws2help/dllmain.c diff --git a/reactos/dll/win32/ws2help_new/handle.c b/reactos/dll/win32/ws2help/handle.c similarity index 100% rename from reactos/dll/win32/ws2help_new/handle.c rename to reactos/dll/win32/ws2help/handle.c diff --git a/reactos/dll/win32/ws2help_new/notify.c b/reactos/dll/win32/ws2help/notify.c similarity index 100% rename from reactos/dll/win32/ws2help_new/notify.c rename to reactos/dll/win32/ws2help/notify.c diff --git a/reactos/dll/win32/ws2help_new/precomp.h b/reactos/dll/win32/ws2help/precomp.h similarity index 100% rename from reactos/dll/win32/ws2help_new/precomp.h rename to reactos/dll/win32/ws2help/precomp.h diff --git a/reactos/dll/win32/ws2help_new/ws2help.h b/reactos/dll/win32/ws2help/ws2help.h similarity index 100% rename from reactos/dll/win32/ws2help_new/ws2help.h rename to reactos/dll/win32/ws2help/ws2help.h diff --git a/reactos/dll/win32/ws2help_new/ws2help.rbuild b/reactos/dll/win32/ws2help/ws2help.rbuild similarity index 100% rename from reactos/dll/win32/ws2help_new/ws2help.rbuild rename to reactos/dll/win32/ws2help/ws2help.rbuild diff --git a/reactos/dll/win32/ws2help_new/ws2help.rc b/reactos/dll/win32/ws2help/ws2help.rc similarity index 100% rename from reactos/dll/win32/ws2help_new/ws2help.rc rename to reactos/dll/win32/ws2help/ws2help.rc diff --git a/reactos/dll/win32/ws2help_new/ws2help.spec b/reactos/dll/win32/ws2help/ws2help.spec similarity index 100% rename from reactos/dll/win32/ws2help_new/ws2help.spec rename to reactos/dll/win32/ws2help/ws2help.spec diff --git a/reactos/dll/win32/ws2help_new/wshdrv.h b/reactos/dll/win32/ws2help/wshdrv.h similarity index 100% rename from reactos/dll/win32/ws2help_new/wshdrv.h rename to reactos/dll/win32/ws2help/wshdrv.h From c417ef7e62e896888d4411af6157150296622c96 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 26 Jul 2009 08:20:29 +0000 Subject: [PATCH 567/577] - Get rid of the concept and tracking of "mapped pages". The MapCount was never checked anywhere in terms of page accounting -- only the reference count is. - Fix the issue with the system attempting to map page 0 into hyperspace. svn path=/trunk/; revision=42226 --- reactos/ntoskrnl/ke/procobj.c | 6 +- reactos/ntoskrnl/mm/ARM3/hypermap.c | 3 +- reactos/ntoskrnl/mm/freelist.c | 91 +---------------------------- reactos/ntoskrnl/mm/i386/page.c | 22 +++---- 4 files changed, 20 insertions(+), 102 deletions(-) diff --git a/reactos/ntoskrnl/ke/procobj.c b/reactos/ntoskrnl/ke/procobj.c index 26a78741ee9..f187ec1dd71 100644 --- a/reactos/ntoskrnl/ke/procobj.c +++ b/reactos/ntoskrnl/ke/procobj.c @@ -96,6 +96,9 @@ KiAttachProcess(IN PKTHREAD Thread, /* Release lock */ KiReleaseApcLockFromDpcLevel(ApcLock); + + /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ + MiSyncForProcessAttach(Thread, (PEPROCESS)Process); /* Swap Processes */ KiSwapProcess(Process, SavedApcState->Process); @@ -573,9 +576,6 @@ KeStackAttachProcess(IN PKPROCESS Process, ASSERT_PROCESS(Process); ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); - /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncForProcessAttach(Thread, (PEPROCESS)Process); - /* Crash system if DPC is being executed! */ if (KeIsExecutingDpc()) { diff --git a/reactos/ntoskrnl/mm/ARM3/hypermap.c b/reactos/ntoskrnl/mm/ARM3/hypermap.c index 2dc9dc04ae6..29d44893e5d 100644 --- a/reactos/ntoskrnl/mm/ARM3/hypermap.c +++ b/reactos/ntoskrnl/mm/ARM3/hypermap.c @@ -37,9 +37,10 @@ MiMapPageInHyperSpace(IN PEPROCESS Process, PFN_NUMBER Offset; // - // Never accept page 0 + // Never accept page 0 or non-physical pages // ASSERT(Page != 0); + ASSERT(MiGetPfnEntry(Page) != NULL); // // Build the PTE diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index b3d4605886e..5febd3a6f0a 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -38,7 +38,6 @@ #define Type CacheAttribute #define Zero PrototypePte #define LockCount u3.e1.PageColor -#define MapCount u2.ShareCount #define RmapListHead AweReferenceCount #define SavedSwapEntry u4.EntireFrame #define Flags u3.e1 @@ -264,7 +263,6 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, Pfn1->Flags.Consumer = MC_NPPOOL; Pfn1->ReferenceCount = 1; Pfn1->LockCount = 0; - Pfn1->MapCount = 0; Pfn1->SavedSwapEntry = 0; // @@ -452,7 +450,6 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // Make sure it's really free // ASSERT(Pfn1->Flags.Type == MM_PHYSICAL_PAGE_FREE); - ASSERT(Pfn1->MapCount == 0); ASSERT(Pfn1->ReferenceCount == 0); // @@ -464,7 +461,6 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, Pfn1->Flags.EndOfAllocation = 1; Pfn1->ReferenceCount = 1; Pfn1->LockCount = 0; - Pfn1->MapCount = 0; Pfn1->SavedSwapEntry = 0; // @@ -507,7 +503,6 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // // Sanity checks // - ASSERT(Pfn1->MapCount == 0); ASSERT(Pfn1->ReferenceCount == 0); // @@ -519,7 +514,6 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, Pfn1->Flags.StartOfAllocation = 1; Pfn1->Flags.EndOfAllocation = 1; Pfn1->LockCount = 0; - Pfn1->MapCount = 0; Pfn1->SavedSwapEntry = 0; // @@ -678,12 +672,11 @@ MmDumpPfnDatabase(VOID) // // Pretty-print the page // - DbgPrint("0x%08p:\t%04s\t%20s\t(%02d.%02d.%02d) [%08p])\n", + DbgPrint("0x%08p:\t%04s\t%20s\t(%02d.%02d) [%08p])\n", i << PAGE_SHIFT, State, Consumer, Pfn1->ReferenceCount, - Pfn1->MapCount, Pfn1->LockCount, Pfn1->RmapListHead); } @@ -716,8 +709,7 @@ MmInitializePageList(VOID) RtlZeroMemory(&UsedPage, sizeof(UsedPage)); UsedPage.Flags.Type = MM_PHYSICAL_PAGE_USED; UsedPage.Flags.Consumer = MC_NPPOOL; - UsedPage.ReferenceCount = 2; - UsedPage.MapCount = 1; + UsedPage.ReferenceCount = 1; /* Loop the memory descriptors */ for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; @@ -812,61 +804,6 @@ MmGetRmapListHeadPage(PFN_TYPE Pfn) return(ListHead); } -VOID -NTAPI -MmMarkPageMapped(PFN_TYPE Pfn) -{ - KIRQL oldIrql; - PPHYSICAL_PAGE Page; - - if (Pfn <= MmHighestPhysicalPage) - { - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - Page = MiGetPfnEntry(Pfn); - if (Page) - { - if (Page->Flags.Type == MM_PHYSICAL_PAGE_FREE) - { - DPRINT1("Mapping non-used page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - Page->MapCount++; - Page->ReferenceCount++; - } - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - } -} - -VOID -NTAPI -MmMarkPageUnmapped(PFN_TYPE Pfn) -{ - KIRQL oldIrql; - PPHYSICAL_PAGE Page; - - if (Pfn <= MmHighestPhysicalPage) - { - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - Page = MiGetPfnEntry(Pfn); - if (Page) - { - if (Page->Flags.Type == MM_PHYSICAL_PAGE_FREE) - { - DPRINT1("Unmapping non-used page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->MapCount == 0) - { - DPRINT1("Unmapping not mapped page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - Page->MapCount--; - Page->ReferenceCount--; - } - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - } -} - VOID NTAPI MmSetSavedSwapEntryPage(PFN_TYPE Pfn, SWAPENTRY SwapEntry) @@ -1000,12 +937,6 @@ MmDereferencePage(PFN_TYPE Pfn) DPRINT1("Freeing page with rmap entries.\n"); KeBugCheck(MEMORY_MANAGEMENT); } - if (Page->MapCount != 0) - { - DPRINT1("Freeing mapped page (0x%x count %d)\n", - Pfn << PAGE_SHIFT, Page->MapCount); - KeBugCheck(MEMORY_MANAGEMENT); - } if (Page->LockCount > 0) { DPRINT1("Freeing locked page\n"); @@ -1162,11 +1093,6 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) DPRINT1("Got non-free page from freelist\n"); KeBugCheck(MEMORY_MANAGEMENT); } - if (PageDescriptor->MapCount != 0) - { - DPRINT1("Got mapped page from freelist\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } if (PageDescriptor->ReferenceCount != 0) { DPRINT1("%d\n", PageDescriptor->ReferenceCount); @@ -1176,7 +1102,6 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) PageDescriptor->Flags.Consumer = Consumer; PageDescriptor->ReferenceCount = 1; PageDescriptor->LockCount = 0; - PageDescriptor->MapCount = 0; PageDescriptor->SavedSwapEntry = SwapEntry; MmStats.NrSystemPages++; @@ -1189,11 +1114,6 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) { MiZeroPage(PfnOffset); } - if (PageDescriptor->MapCount != 0) - { - DPRINT1("Returning mapped page.\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } return PfnOffset; } @@ -1247,12 +1167,7 @@ MmZeroPageThreadMain(PVOID Ignored) Status = MiZeroPage(Pfn); oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - if (PageDescriptor->MapCount != 0) - { - DPRINT1("Mapped page on freelist.\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - PageDescriptor->Flags.Zero = 1; + PageDescriptor->Flags.Zero = 1; PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE; if (NT_SUCCESS(Status)) { diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index ff76dd2965f..f60781111dd 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -465,7 +465,6 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN FreePage, if (WasValid) { Pfn = PTE_TO_PFN(Pte); - MmMarkPageUnmapped(Pfn); } else { @@ -768,10 +767,6 @@ MmCreatePageFileMapping(PEPROCESS Process, KeBugCheck(MEMORY_MANAGEMENT); } Pte = *Pt; - if (PAGE_MASK((Pte)) != 0) - { - MmMarkPageUnmapped(PTE_TO_PFN((Pte))); - } InterlockedExchangePte(Pt, SwapEntry << 1); if (Pte != 0) { @@ -882,16 +877,11 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process, oldPdeOffset = PdeOffset; Pte = *Pt; - MmMarkPageMapped(Pages[i]); if (PAGE_MASK(Pte) != 0 && !(Pte & PA_PRESENT) && (Pte & 0x800)) { DPRINT1("Bad PTE %lx\n", Pte); KeBugCheck(MEMORY_MANAGEMENT); } - if (PAGE_MASK(Pte) != 0) - { - MmMarkPageUnmapped(PTE_TO_PFN(Pte)); - } InterlockedExchangePte(Pt, PFN_TO_PTE(Pages[i]) | Attributes); if (Pte != 0) { @@ -1049,6 +1039,18 @@ MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size) { ULONG StartOffset, EndOffset, Offset; PULONG Pde; + + // + // Check if the process isn't there anymore + // This is probably a bad sign, since it means the caller is setting cr3 to + // 0 or something... + // + if ((PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]) == 0) && (Process != PsGetCurrentProcess())) + { + DPRINT1("Process: %16s is dead: %p\n", Process->ImageFileName, Process->Pcb.DirectoryTableBase[0]); + ASSERT(FALSE); + return; + } if (Address < MmSystemRangeStart) { From 79b4bf14f7ddf72ee1faa5cb52bb6909a306ea7f Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 26 Jul 2009 09:52:00 +0000 Subject: [PATCH 568/577] Silence a warning. svn path=/trunk/; revision=42227 --- reactos/drivers/input/i8042prt/mouse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/input/i8042prt/mouse.c b/reactos/drivers/input/i8042prt/mouse.c index b0effe8051a..11838134667 100644 --- a/reactos/drivers/input/i8042prt/mouse.c +++ b/reactos/drivers/input/i8042prt/mouse.c @@ -638,7 +638,7 @@ i8042MouResetIsr( DeviceExtension->MouseTimeoutState = TimeoutStart; PortDeviceExtension = DeviceExtension->Common.PortDeviceExtension; - switch (DeviceExtension->MouseResetState) + switch ((ULONG)DeviceExtension->MouseResetState) { case 1100: /* the first ack, drop it. */ DeviceExtension->MouseResetState = ExpectingReset; From 015656ff6dfd4255338d603b7ed4280d5b2bc9e4 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 26 Jul 2009 09:52:27 +0000 Subject: [PATCH 569/577] Silence a warning. svn path=/trunk/; revision=42228 --- reactos/dll/win32/advapi32/sec/ac.c | 40 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/reactos/dll/win32/advapi32/sec/ac.c b/reactos/dll/win32/advapi32/sec/ac.c index 2d12d6ec0f9..f9e64658419 100644 --- a/reactos/dll/win32/advapi32/sec/ac.c +++ b/reactos/dll/win32/advapi32/sec/ac.c @@ -729,15 +729,7 @@ InternalTrusteeAToW(IN PTRUSTEE_A pTrusteeA, StrBuf, BufferSize) == 0) { -ConvertErr: - ErrorCode = GetLastError(); - - /* cleanup */ - RtlFreeHeap(RtlGetProcessHeap(), - 0, - *pTrusteeW); - - return ErrorCode; + goto ConvertErr; } oan->ptstrName = StrBuf; } @@ -759,6 +751,16 @@ NothingToConvert: } return ErrorCode; + +ConvertErr: + ErrorCode = GetLastError(); + + /* cleanup */ + RtlFreeHeap(RtlGetProcessHeap(), + 0, + *pTrusteeW); + + return ErrorCode; } @@ -930,15 +932,7 @@ InternalExplicitAccessAToW(IN ULONG cCountOfExplicitEntries, StrBuf, BufferSize) == 0) { -ConvertErr: - ErrorCode = GetLastError(); - - /* cleanup */ - RtlFreeHeap(RtlGetProcessHeap(), - 0, - peaw); - - return ErrorCode; + goto ConvertErr; } oan->ptstrName = StrBuf; @@ -973,6 +967,16 @@ RawTrusteeCopy: } return ErrorCode; + +ConvertErr: + ErrorCode = GetLastError(); + + /* cleanup */ + RtlFreeHeap(RtlGetProcessHeap(), + 0, + peaw); + + return ErrorCode; } From 1632e8b1dbed11c0ccfa57c04dc6fbaffd56c7d0 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 26 Jul 2009 09:55:46 +0000 Subject: [PATCH 570/577] Silence a warning. svn path=/trunk/; revision=42229 --- reactos/drivers/storage/ide/atapi/atapi.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/storage/ide/atapi/atapi.c b/reactos/drivers/storage/ide/atapi/atapi.c index 3d83074172d..ddcd417eae8 100644 --- a/reactos/drivers/storage/ide/atapi/atapi.c +++ b/reactos/drivers/storage/ide/atapi/atapi.c @@ -5424,13 +5424,20 @@ Return Value: // Fill in vendor identification fields. // - for (i = 0; i < 20; i += 2) { + for (i = 0; i < 8; i += 2) { inquiryData->VendorId[i] = ((PUCHAR)identifyData->ModelNumber)[i + 1]; inquiryData->VendorId[i+1] = ((PUCHAR)identifyData->ModelNumber)[i]; } + for (i = 0; i < 12; i += 2) { + inquiryData->ProductId[i] = + ((PUCHAR)identifyData->ModelNumber)[i + 8 + 1]; + inquiryData->ProductId[i+1] = + ((PUCHAR)identifyData->ModelNumber)[i + 8]; + } + // // Initialize unused portion of product id. // From b163f7f34a7c6bdcdc1add9b588a9daa284a0d5a Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 26 Jul 2009 12:27:15 +0000 Subject: [PATCH 571/577] - Fixed event code. Remove junk too. svn path=/trunk/; revision=42230 --- reactos/include/reactos/win32k/ntuser.h | 31 ++++++- .../subsystems/win32/win32k/include/hook.h | 3 +- .../subsystems/win32/win32k/ntuser/event.c | 91 ++++--------------- 3 files changed, 48 insertions(+), 77 deletions(-) diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 89c9edc2bdb..6110d03d0ce 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -185,6 +185,21 @@ typedef struct _CLSMENUNAME PUNICODE_STRING pusMenuName; } CLSMENUNAME, *PCLSMENUNAME; +typedef struct tagSBDATA +{ + INT posMin; + INT posMax; + INT page; + INT pos; +} SBDATA, *PSBDATA; + +typedef struct tagSBINFO +{ + INT WSBflags; + SBDATA Horz; + SBDATA Vert; +} SBINFO, *PSBINFO; + typedef enum _GETCPD { UserGetCPDU2A = 0x01, @@ -221,7 +236,7 @@ typedef struct _CLS struct _CLS *pclsNext; RTL_ATOM atomClassName; ATOM atomNVClassName; - DWORD fnid; // New ClassId + DWORD fnid; struct _DESKTOP *rpdeskParent; PVOID pdce; DWORD CSF_flags; @@ -242,14 +257,17 @@ typedef struct _CLS INT cbwndExtra; HINSTANCE hModule; HANDLE hIcon; /* FIXME - Use pointer! */ + //PCURSOR spicn; HANDLE hCursor; /* FIXME - Use pointer! */ + //PCURSOR spcur; HBRUSH hbrBackground; PWSTR lpszMenuName; // kernel use PSTR lpszAnsiClassName; // " HANDLE hIconSm; /* FIXME - Use pointer! */ + //PCURSOR spicnSm; UINT Destroying : 1; // CSF_WOWDEFERDESTROY - UINT Unicode : 1; + UINT Unicode : 1; // !CSF_ANSIPROC UINT System : 1; // CSF_SYSTEMCLASS UINT Global : 1; // CS_GLOBALCLASS UINT MenuNameIsString : 1; @@ -382,11 +400,16 @@ typedef struct _WND /* Property list head.*/ LIST_ENTRY PropListHead; ULONG PropListItems; + /* Scrollbar info */ + PSBINFO pSBInfo; + /* system menu handle. */ + HMENU SystemMenu; + //PMENU spmenuSys; /* Window menu handle or window id */ UINT IDMenu; // Use spmenu - //PMENU spmenuSys; //PMENU spmenu; - HRGN hrgnClip; + HRGN hrgnClip; + HRGN hrgnNewFrame; /* Window name. */ UNICODE_STRING strName; /* Size of the extra data associated with the window. */ diff --git a/reactos/subsystems/win32/win32k/include/hook.h b/reactos/subsystems/win32/win32k/include/hook.h index 2042b1f7e41..98d28db1e85 100644 --- a/reactos/subsystems/win32/win32k/include/hook.h +++ b/reactos/subsystems/win32/win32k/include/hook.h @@ -15,6 +15,7 @@ typedef struct tagHOOKTABLE typedef struct tagEVENTHOOK { + THRDESKHEAD head; LIST_ENTRY Chain; /* Event chain entry */ PETHREAD Thread; /* Thread owning the event */ UINT eventMin; @@ -25,8 +26,6 @@ typedef struct tagEVENTHOOK ULONG Flags; /* Some internal flags */ ULONG_PTR offPfn; INT ihmod; - THRDESKHEAD head; // FIXME When on top it creates problems - UNICODE_STRING ModuleName; /* Module name for global events */ } EVENTHOOK, *PEVENTHOOK; typedef struct tagEVENTTABLE diff --git a/reactos/subsystems/win32/win32k/ntuser/event.c b/reactos/subsystems/win32/win32k/ntuser/event.c index c84037ca610..22f8f7e9a7c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/event.c +++ b/reactos/subsystems/win32/win32k/ntuser/event.c @@ -4,9 +4,6 @@ #define NDEBUG #include -#define WINEVENT_INIT 0x40000000 -#define WINEVENT_DESTROYED 0x80000000 - typedef struct _EVENTPACK { PEVENTHOOK pEH; @@ -176,6 +173,7 @@ IntNotifyWinEvent( LONG idChild) { PEVENTHOOK pEH; + PLIST_ENTRY pLE; LRESULT Result; DPRINT("IntNotifyWinEvent GlobalEvents = 0x%x pWnd 0x%x\n",GlobalEvents, pWnd); @@ -186,17 +184,10 @@ IntNotifyWinEvent( if (!GlobalEvents || !GlobalEvents->Counts) return; - if (!UserIsEntered()) return; - - pEH = (PEVENTHOOK)GlobalEvents->Events.Flink; - DPRINT("IntNotifyWinEvent pEH 0x%x\n",pEH); + pLE = GlobalEvents->Events.Flink; + pEH = CONTAINING_RECORD(pLE, EVENTHOOK, Chain); do { - if (pEH->Flags & WINEVENT_INIT) - { - DPRINT("IntNotifyWinEvent is still in INIT MODE!! pEH 0x%x\n",pEH); - } - UserReferenceObject(pEH); // Must be inside the event window. if ( (pEH->eventMin <= Event) && (pEH->eventMax >= Event)) @@ -206,7 +197,11 @@ IntNotifyWinEvent( if (!(pEH->idProcess) || !(pEH->idThread) || (NtCurrentTeb()->ClientId.UniqueProcess == (PVOID)pEH->idProcess)) { - Result = IntCallLowLevelEvent(pEH, Event, UserHMGetHandle(pWnd), idObject, idChild); + Result = IntCallLowLevelEvent( pEH, + Event, + UserHMGetHandle(pWnd), + idObject, + idChild); } }// if ^skip own thread && ((Pid && CPid == Pid && ^skip own process) || all process) else if ( !(pEH->Flags & WINEVENT_SKIPOWNTHREAD) && @@ -215,22 +210,20 @@ IntNotifyWinEvent( !(pEH->Flags & WINEVENT_SKIPOWNPROCESS)) || !pEH->idProcess ) ) { - - Result = co_IntCallEventProc( pEH->head.h, - Event, - UserHMGetHandle(pWnd), - idObject, - idChild, + Result = co_IntCallEventProc( UserHMGetHandle(pEH), + Event, + UserHMGetHandle(pWnd), + idObject, + idChild, PtrToUint(NtCurrentTeb()->ClientId.UniqueThread), - (DWORD)EngGetTickCount(), - pEH->Proc); - + (DWORD)EngGetTickCount(), + pEH->Proc); } } UserDereferenceObject(pEH); - - pEH = (PEVENTHOOK)pEH->Chain.Flink; - } while (pEH != (PEVENTHOOK)&GlobalEvents->Events.Flink); + pLE = pEH->Chain.Flink; + pEH = CONTAINING_RECORD(pLE, EVENTHOOK, Chain); + } while (pLE != &GlobalEvents->Events); } VOID @@ -275,7 +268,6 @@ NtUserSetWinEventHook( { PEVENTHOOK pEH; HWINEVENTHOOK Ret = NULL; - UNICODE_STRING ModuleName; NTSTATUS Status; HANDLE Handle; PETHREAD Thread = NULL; @@ -330,8 +322,7 @@ NtUserSetWinEventHook( InsertTailList(&GlobalEvents->Events, &pEH->Chain); GlobalEvents->Counts++; - pEH->Flags = dwflags|WINEVENT_INIT; - pEH->head.h = Handle; + UserHMGetHandle(pEH) = Handle; // pEH->head.pti =? // pEH->head.rpdesk if (Thread) @@ -342,50 +333,10 @@ NtUserSetWinEventHook( pEH->eventMax = eventMax; pEH->idProcess = idProcess; pEH->idThread = idThread; + pEH->Flags = dwflags; if (NULL != hmodWinEventProc) { - Status = MmCopyFromCaller(&ModuleName, - puString, - sizeof(UNICODE_STRING)); - - if (! NT_SUCCESS(Status)) - { - UserDereferenceObject(pEH); - IntRemoveEvent(pEH); - SetLastNtError(Status); - goto SetEventExit; - } - - pEH->ModuleName.Buffer = ExAllocatePoolWithTag(PagedPool, - ModuleName.MaximumLength, - TAG_HOOK); - - if (NULL == pEH->ModuleName.Buffer) - { - UserDereferenceObject(pEH); - IntRemoveEvent(pEH); - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - goto SetEventExit; - } - - pEH->ModuleName.MaximumLength = ModuleName.MaximumLength; - - Status = MmCopyFromCaller(pEH->ModuleName.Buffer, - ModuleName.Buffer, - ModuleName.MaximumLength); - - if (! NT_SUCCESS(Status)) - { - ExFreePoolWithTag(pEH->ModuleName.Buffer, TAG_HOOK); - UserDereferenceObject(pEH); - IntRemoveEvent(pEH); - SetLastNtError(Status); - goto SetEventExit; - } - - pEH->ModuleName.Length = ModuleName.Length; - pEH->offPfn = (ULONG_PTR)((char *)lpfnWinEventProc - (char *)hmodWinEventProc); pEH->ihmod = (INT)hmodWinEventProc; pEH->Proc = lpfnWinEventProc; @@ -393,8 +344,6 @@ NtUserSetWinEventHook( else pEH->Proc = lpfnWinEventProc; - pEH->Flags &= ~WINEVENT_INIT; - UserDereferenceObject(pEH); Ret = Handle; From 92a18fff942e8d460734b6a937be6999d70c6849 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Sun, 26 Jul 2009 13:16:19 +0000 Subject: [PATCH 572/577] - Use documented structure instead array - Add some defines svn path=/trunk/; revision=42232 --- reactos/drivers/filesystems/fs_rec/fs_rec.h | 2 ++ reactos/drivers/filesystems/fs_rec/udfs.c | 40 ++++++++++----------- reactos/drivers/filesystems/fs_rec/udfs.h | 29 +++++++++++++++ 3 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 reactos/drivers/filesystems/fs_rec/udfs.h diff --git a/reactos/drivers/filesystems/fs_rec/fs_rec.h b/reactos/drivers/filesystems/fs_rec/fs_rec.h index 643aca538be..b2ef6b7e12c 100644 --- a/reactos/drivers/filesystems/fs_rec/fs_rec.h +++ b/reactos/drivers/filesystems/fs_rec/fs_rec.h @@ -14,6 +14,8 @@ #include #include +#include "udfs.h" + // // Tag for memory allocations // diff --git a/reactos/drivers/filesystems/fs_rec/udfs.c b/reactos/drivers/filesystems/fs_rec/udfs.c index 8eee25a1891..dc9ddc9fb53 100644 --- a/reactos/drivers/filesystems/fs_rec/udfs.c +++ b/reactos/drivers/filesystems/fs_rec/udfs.c @@ -20,9 +20,10 @@ NTAPI FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize) { - PUCHAR Buffer = NULL; + PVOLSTRUCTDESC VolumeStructDesc = NULL; LARGE_INTEGER Offset; ULONG State = 0; + PAGED_CODE(); Offset.QuadPart = UDFS_VRS_START_OFFSET; while (TRUE) @@ -31,7 +32,7 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject, &Offset, SectorSize, SectorSize, - (PVOID)&Buffer, + (PVOID)&VolumeStructDesc, NULL)) { break; @@ -41,28 +42,27 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject, { case 0: - if ((Buffer[1] == 'B') && - (Buffer[2] == 'E') && - (Buffer[3] == 'A') && - (Buffer[4] == '0') && - (Buffer[5] == '1')) + if (!strncmp((const char*)VolumeStructDesc->Ident, + VSD_STD_ID_BEA01, + VSD_STD_ID_LEN)) { State = 1; } else { - ExFreePool(Buffer); + ExFreePool(VolumeStructDesc); return FALSE; } break; case 1: - if ((Buffer[1] == 'N') && - (Buffer[2] == 'S') && - (Buffer[3] == 'R') && - (Buffer[4] == '0') && - ((Buffer[5] == '2') || (Buffer[5] == '3'))) + if (!strncmp((const char*)VolumeStructDesc->Ident, + VSD_STD_ID_NSR03, + VSD_STD_ID_LEN) || + !strncmp((const char*)VolumeStructDesc->Ident, + VSD_STD_ID_NSR02, + VSD_STD_ID_LEN)) { State = 2; } @@ -70,13 +70,11 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject, case 2: - if ((Buffer[1] == 'T') && - (Buffer[2] == 'E') && - (Buffer[3] == 'A') && - (Buffer[4] == '0') && - (Buffer[5] == '1')) + if (!strncmp((const char*)VolumeStructDesc->Ident, + VSD_STD_ID_TEA01, + VSD_STD_ID_LEN)) { - ExFreePool(Buffer); + ExFreePool(VolumeStructDesc); return TRUE; } break; @@ -85,12 +83,12 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject, Offset.QuadPart += SectorSize; if (Offset.QuadPart == UDFS_AVDP_SECTOR) { - ExFreePool(Buffer); + ExFreePool(VolumeStructDesc); return FALSE; } } - ExFreePool(Buffer); + ExFreePool(VolumeStructDesc); return TRUE; } diff --git a/reactos/drivers/filesystems/fs_rec/udfs.h b/reactos/drivers/filesystems/fs_rec/udfs.h new file mode 100644 index 00000000000..3eb30971d37 --- /dev/null +++ b/reactos/drivers/filesystems/fs_rec/udfs.h @@ -0,0 +1,29 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS File System Recognizer + * FILE: drivers/filesystems/fs_rec/udfs.h + * PURPOSE: UDFS Header File + * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org) + */ + +/* Standard Identifier (EMCA 167r2 2/9.1.2) */ +#define VSD_STD_ID_NSR02 "NSR02" /* (3/9.1) */ + +/* Standard Identifier (ECMA 167r3 2/9.1.2) */ +#define VSD_STD_ID_BEA01 "BEA01" /* (2/9.2) */ +#define VSD_STD_ID_BOOT2 "BOOT2" /* (2/9.4) */ +#define VSD_STD_ID_CD001 "CD001" /* (ECMA-119) */ +#define VSD_STD_ID_CDW02 "CDW02" /* (ECMA-168) */ +#define VSD_STD_ID_NSR03 "NSR03" /* (3/9.1) */ +#define VSD_STD_ID_TEA01 "TEA01" /* (2/9.3) */ + +/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */ +#define VSD_STD_ID_LEN 5 +typedef struct _VOLSTRUCTDESC +{ + UCHAR Type; + UCHAR Ident[VSD_STD_ID_LEN]; + UCHAR Version; + UCHAR Data[2041]; +} VOLSTRUCTDESC, *PVOLSTRUCTDESC; + From c43cc84996f24ee0a9bc29e19e02ded634a7f327 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sun, 26 Jul 2009 15:36:35 +0000 Subject: [PATCH 573/577] - Misc fixes for msvc: - C89 compliance for "dbgprint" - Fix more calling convention declarations in the DDK and gdi32 - Define noreturn attribute for crt's abort compatibly - Fix some of the mess in psdk's intrinsics -- this needs some major clean up. - Define DbgPrintEx the same way in debug.h as in NDK and DDK - UUID doesn't need Wine-specific types -- include standard PSDK headers. svn path=/trunk/; revision=42233 --- .../applications/cmdutils/dbgprint/dbgprint.c | 3 +- reactos/dll/win32/gdi32/include/gdi32p.h | 48 ++++++------ reactos/include/crt/process.h | 2 +- reactos/include/ddk/ddkmapi.h | 4 +- reactos/include/ddk/hidclass.h | 4 +- reactos/include/psdk/winbase.h | 74 +++++++++---------- reactos/include/psdk/winnt.h | 2 +- reactos/include/reactos/debug.h | 1 + reactos/lib/sdk/uuid/uuid.rbuild | 1 - 9 files changed, 70 insertions(+), 69 deletions(-) diff --git a/reactos/base/applications/cmdutils/dbgprint/dbgprint.c b/reactos/base/applications/cmdutils/dbgprint/dbgprint.c index 87ab64f1a1c..372e84780fa 100644 --- a/reactos/base/applications/cmdutils/dbgprint/dbgprint.c +++ b/reactos/base/applications/cmdutils/dbgprint/dbgprint.c @@ -35,6 +35,7 @@ int _tmain(int argc, TCHAR ** argv) { char psBuffer[128]; char psBuffer2[128]; + char *nlptr2; char cmd[255]; char test[300]; FILE *pPipe; @@ -60,7 +61,7 @@ int _tmain(int argc, TCHAR ** argv) { while(fgets(psBuffer2, 128, pPipe2)) { - char *nlptr2 = strchr(psBuffer2, '\n'); + nlptr2 = strchr(psBuffer2, '\n'); if (nlptr2) *nlptr2 = '\0'; puts(psBuffer2); diff --git a/reactos/dll/win32/gdi32/include/gdi32p.h b/reactos/dll/win32/gdi32/include/gdi32p.h index 31147d6e7df..9b14a355cc4 100644 --- a/reactos/dll/win32/gdi32/include/gdi32p.h +++ b/reactos/dll/win32/gdi32/include/gdi32p.h @@ -115,36 +115,36 @@ typedef struct _LOCALFONT } LOCALFONT, *PLOCALFONT; // sdk/winspool.h -typedef BOOL WINAPI (*ABORTPRINTER) (HANDLE); -typedef BOOL WINAPI (*CLOSEPRINTER) (HANDLE); -typedef BOOL WINAPI (*CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8 -typedef HANDLE WINAPI (*COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8 -typedef LONG WINAPI (*DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD); -typedef BOOL WINAPI (*ENDDOCPRINTER) (HANDLE); -typedef BOOL WINAPI (*ENDPAGEPRINTER) (HANDLE); -typedef BOOL WINAPI (*GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); -typedef BOOL WINAPI (*GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD); -typedef HANDLE WINAPI (*GETSPOOLFILEHANDLE) (HANDLE); // W2k8 -typedef BOOL WINAPI (*ISVALIDDEVMODEW) (PDEVMODEW,size_t); -typedef BOOL WINAPI (*OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW); -typedef BOOL WINAPI (*READPRINTER) (HANDLE,PVOID,DWORD,PDWORD); -typedef BOOL WINAPI (*RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW); -typedef LPWSTR WINAPI (*STARTDOCDLGW) (HANDLE,DOCINFOW *); -typedef DWORD WINAPI (*STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE); -typedef BOOL WINAPI (*STARTPAGEPRINTER) (HANDLE); +typedef BOOL (WINAPI *ABORTPRINTER) (HANDLE); +typedef BOOL (WINAPI *CLOSEPRINTER) (HANDLE); +typedef BOOL (WINAPI *CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8 +typedef HANDLE (WINAPI *COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8 +typedef LONG (WINAPI *DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD); +typedef BOOL (WINAPI *ENDDOCPRINTER) (HANDLE); +typedef BOOL (WINAPI *ENDPAGEPRINTER) (HANDLE); +typedef BOOL (WINAPI *GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); +typedef BOOL (WINAPI *GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD); +typedef HANDLE (WINAPI *GETSPOOLFILEHANDLE) (HANDLE); // W2k8 +typedef BOOL (WINAPI *ISVALIDDEVMODEW) (PDEVMODEW,size_t); +typedef BOOL (WINAPI *OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW); +typedef BOOL (WINAPI *READPRINTER) (HANDLE,PVOID,DWORD,PDWORD); +typedef BOOL (WINAPI *RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW); +typedef LPWSTR (WINAPI *STARTDOCDLGW) (HANDLE,DOCINFOW *); +typedef DWORD (WINAPI *STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE); +typedef BOOL (WINAPI *STARTPAGEPRINTER) (HANDLE); // ddk/winsplp.h -typedef BOOL WINAPI (*SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL); -typedef BOOL WINAPI (*SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD); +typedef BOOL (WINAPI *SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL); +typedef BOOL (WINAPI *SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD); // Same as ddk/winsplp.h DriverUnloadComplete? -typedef BOOL WINAPI (*SPLDRIVERUNLOADCOMPLETE) (LPWSTR); +typedef BOOL (WINAPI *SPLDRIVERUNLOADCOMPLETE) (LPWSTR); // Driver support: // DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW -typedef INT WINAPI (*DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID); +typedef INT (WINAPI *DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID); // DrvQueryColorProfile -typedef BOOL WINAPI (*QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG); +typedef BOOL (WINAPI *QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG); // Unknown: -typedef DWORD WINAPI (*QUERYSPOOLMODE) (HANDLE,DWORD,DWORD); -typedef DWORD WINAPI (*QUERYREMOTEFONTS) (DWORD,DWORD,DWORD); +typedef DWORD (WINAPI *QUERYSPOOLMODE) (HANDLE,DWORD,DWORD); +typedef DWORD (WINAPI *QUERYREMOTEFONTS) (DWORD,DWORD,DWORD); extern CLOSEPRINTER fpClosePrinter; diff --git a/reactos/include/crt/process.h b/reactos/include/crt/process.h index a1c001d9ad9..35555e59168 100644 --- a/reactos/include/crt/process.h +++ b/reactos/include/crt/process.h @@ -40,7 +40,7 @@ extern "C" { #pragma push_macro("abort") #undef abort #endif - void __cdecl __declspec(noreturn) abort(void); + __declspec(noreturn) void __cdecl abort(void); #if __MINGW_GNUC_PREREQ(4,4) #pragma pop_macro("abort") #undef abort diff --git a/reactos/include/ddk/ddkmapi.h b/reactos/include/ddk/ddkmapi.h index 4500cc6f58f..cd7f6227165 100644 --- a/reactos/include/ddk/ddkmapi.h +++ b/reactos/include/ddk/ddkmapi.h @@ -95,8 +95,8 @@ #define DDNOTIFY_CLOSEVIDEOPORT 0x0200 #define DDNOTIFY_CLOSECAPTURE 0x0400 -typedef DWORD (*LPDXAPI)(DWORD dwFunctionNum, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer); -typedef ULONG (*LPDD_NOTIFYCALLBACK) (DWORD dwFlags, PVOID pContext, DWORD dwParam1, DWORD dwParam2); +typedef DWORD (PASCAL *LPDXAPI)(DWORD dwFunctionNum, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer); +typedef ULONG (PASCAL *LPDD_NOTIFYCALLBACK) (DWORD dwFlags, PVOID pContext, DWORD dwParam1, DWORD dwParam2); typedef struct _DDCAPBUFFINFO { diff --git a/reactos/include/ddk/hidclass.h b/reactos/include/ddk/hidclass.h index 9dd219412ee..f269c03f4a2 100644 --- a/reactos/include/ddk/hidclass.h +++ b/reactos/include/ddk/hidclass.h @@ -98,11 +98,11 @@ enum DeviceObjectState { DeviceObjectRemoved }; -typedef VOID DDKAPI (*PHID_STATUS_CHANGE)( +typedef VOID (DDKAPI *PHID_STATUS_CHANGE)( PVOID Context, enum DeviceObjectState State); -typedef NTSTATUS DDKAPI (*PHIDP_GETCAPS)( +typedef NTSTATUS (DDKAPI *PHIDP_GETCAPS)( IN PHIDP_PREPARSED_DATA PreparsedData, OUT PHIDP_CAPS Capabilities); diff --git a/reactos/include/psdk/winbase.h b/reactos/include/psdk/winbase.h index cf889169d5c..a6431ccc0d9 100644 --- a/reactos/include/psdk/winbase.h +++ b/reactos/include/psdk/winbase.h @@ -1835,43 +1835,6 @@ VOID WINAPI InitializeSRWLock(PSRWLOCK); #define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64 #define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64 -#else // !(defined (_M_AMD64) || defined (_M_IA64)) - -LONG WINAPI InterlockedOr(IN OUT LONG volatile *,LONG); -LONG WINAPI InterlockedAnd(IN OUT LONG volatile *,LONG); -LONG WINAPI InterlockedCompareExchange(IN OUT LONG volatile *,LONG,LONG); -LONG WINAPI InterlockedDecrement(IN OUT LONG volatile *); -LONG WINAPI InterlockedExchange(IN OUT LONG volatile *,LONG); -#if defined(_WIN64) - /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ - #define InterlockedExchangePointer(t,v) \ - (PVOID)_InterlockedExchange64((LONGLONG*)(t),(LONGLONG)(v)) - /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ - #define InterlockedCompareExchangePointer(d,e,c) \ - (PVOID)_InterlockedCompareExchange64((LONGLONG*)(d),(LONGLONG)(e),(LONGLONG)(c)) -#else - /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ - #define InterlockedExchangePointer(t,v) \ - (PVOID)InterlockedExchange((LPLONG)(t),(LONG)(v)) - /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ - #define InterlockedCompareExchangePointer(d,e,c) \ - (PVOID)InterlockedCompareExchange((LPLONG)(d),(LONG)(e),(LONG)(c)) -#endif -LONG WINAPI InterlockedExchangeAdd(IN OUT LONG volatile *,LONG); -#if (_WIN32_WINNT >= 0x0501) -PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER); -#endif -LONG WINAPI InterlockedIncrement(IN OUT LONG volatile *); -#if (_WIN32_WINNT >= 0x0501) -PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER); -PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY); -#endif - -#endif // !(defined (_M_AMD64) || defined (_M_IA64)) - -VOID WINAPI InitializeSListHead(PSLIST_HEADER); -USHORT WINAPI QueryDepthSList(PSLIST_HEADER); - #if !defined(InterlockedAnd) #define InterlockedAnd InterlockedAnd_Inline FORCEINLINE @@ -1918,6 +1881,43 @@ InterlockedOr_Inline(IN OUT volatile LONG *Target, } #endif +#else // !(defined (_M_AMD64) || defined (_M_IA64)) + +LONG WINAPI InterlockedOr(IN OUT LONG volatile *,LONG); +LONG WINAPI InterlockedAnd(IN OUT LONG volatile *,LONG); +LONG WINAPI InterlockedCompareExchange(IN OUT LONG volatile *,LONG,LONG); +LONG WINAPI InterlockedDecrement(IN OUT LONG volatile *); +LONG WINAPI InterlockedExchange(IN OUT LONG volatile *,LONG); +#if defined(_WIN64) + /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ + #define InterlockedExchangePointer(t,v) \ + (PVOID)_InterlockedExchange64((LONGLONG*)(t),(LONGLONG)(v)) + /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ + #define InterlockedCompareExchangePointer(d,e,c) \ + (PVOID)_InterlockedCompareExchange64((LONGLONG*)(d),(LONGLONG)(e),(LONGLONG)(c)) +#else + /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ + #define InterlockedExchangePointer(t,v) \ + (PVOID)InterlockedExchange((LPLONG)(t),(LONG)(v)) + /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ + #define InterlockedCompareExchangePointer(d,e,c) \ + (PVOID)InterlockedCompareExchange((LPLONG)(d),(LONG)(e),(LONG)(c)) +#endif +LONG WINAPI InterlockedExchangeAdd(IN OUT LONG volatile *,LONG); +#if (_WIN32_WINNT >= 0x0501) +PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER); +#endif +LONG WINAPI InterlockedIncrement(IN OUT LONG volatile *); +#if (_WIN32_WINNT >= 0x0501) +PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER); +PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY); +#endif + +#endif // !(defined (_M_AMD64) || defined (_M_IA64)) + +VOID WINAPI InitializeSListHead(PSLIST_HEADER); +USHORT WINAPI QueryDepthSList(PSLIST_HEADER); + #endif /* __INTERLOCKED_DECLARED */ BOOL WINAPI IsBadCodePtr(FARPROC); diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index 610f6afad77..0eed9bc9429 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -4901,7 +4901,7 @@ extern struct _TEB * NtCurrentTeb(void); #if (_MSC_FULL_VER >= 13012035) -DWORD __readfsdword(DWORD); +unsigned long __readfsdword(const unsigned long Offset); #pragma intrinsic(__readfsdword) __inline PVOID GetCurrentFiber(void) { return (PVOID)(ULONG_PTR)__readfsdword(0x10); } diff --git a/reactos/include/reactos/debug.h b/reactos/include/reactos/debug.h index 413a036b1ce..35755859b60 100644 --- a/reactos/include/reactos/debug.h +++ b/reactos/include/reactos/debug.h @@ -31,6 +31,7 @@ DbgPrint( IN ... ); +NTSYSAPI ULONG __cdecl DbgPrintEx( diff --git a/reactos/lib/sdk/uuid/uuid.rbuild b/reactos/lib/sdk/uuid/uuid.rbuild index 6c687483973..b699d2f7f70 100644 --- a/reactos/lib/sdk/uuid/uuid.rbuild +++ b/reactos/lib/sdk/uuid/uuid.rbuild @@ -1,6 +1,5 @@ - include/reactos/wine uuid.c From e0b7b058c387b2de6baf93010308420056085006 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 26 Jul 2009 16:17:50 +0000 Subject: [PATCH 574/577] - [Win32k] More Class work. Moved to use thread and process information structures. - Tested wine, Firefox 1.15.xx and AbiWord 2.6.8. svn path=/trunk/; revision=42234 --- .../subsystems/win32/win32k/eng/semaphor.c | 4 +- .../subsystems/win32/win32k/include/class.h | 4 +- .../win32/win32k/include/clipboard.h | 4 +- .../win32/win32k/include/cursoricon.h | 4 +- .../subsystems/win32/win32k/include/desktop.h | 4 +- .../subsystems/win32/win32k/include/gdiobj.h | 2 +- .../subsystems/win32/win32k/include/menu.h | 2 +- .../subsystems/win32/win32k/include/win32.h | 24 +++++----- .../subsystems/win32/win32k/include/winsta.h | 2 +- .../subsystems/win32/win32k/main/dllmain.c | 2 +- .../subsystems/win32/win32k/misc/usrheap.c | 2 +- .../subsystems/win32/win32k/ntuser/class.c | 46 ++++++++++--------- .../win32/win32k/ntuser/cursoricon.c | 6 +-- .../subsystems/win32/win32k/ntuser/desktop.c | 5 +- .../subsystems/win32/win32k/ntuser/guicheck.c | 8 ++-- reactos/subsystems/win32/win32k/ntuser/menu.c | 6 +-- .../subsystems/win32/win32k/ntuser/message.c | 4 +- reactos/subsystems/win32/win32k/ntuser/misc.c | 4 +- .../subsystems/win32/win32k/ntuser/msgqueue.c | 2 +- .../subsystems/win32/win32k/ntuser/ntstubs.c | 2 +- .../win32/win32k/ntuser/simplecall.c | 8 ++-- .../subsystems/win32/win32k/ntuser/window.c | 2 +- .../win32/win32k/objects/freetype.c | 8 ++-- .../subsystems/win32/win32k/objects/gdiobj.c | 46 +++++++++---------- reactos/subsystems/win32/win32k/pch.h | 2 +- 25 files changed, 104 insertions(+), 99 deletions(-) diff --git a/reactos/subsystems/win32/win32k/eng/semaphor.c b/reactos/subsystems/win32/win32k/eng/semaphor.c index 13f376cfdf7..5ef403d8670 100644 --- a/reactos/subsystems/win32/win32k/eng/semaphor.c +++ b/reactos/subsystems/win32/win32k/eng/semaphor.c @@ -38,7 +38,7 @@ APIENTRY EngAcquireSemaphore ( IN HSEMAPHORE hsem ) { // www.osr.com/ddk/graphics/gdifncs_14br.htm - PW32THREAD W32Thread; + PTHREADINFO W32Thread; ASSERT(hsem); IntGdiAcquireSemaphore ( hsem ); W32Thread = PsGetThreadWin32Thread(PsGetCurrentThread()); @@ -62,7 +62,7 @@ APIENTRY EngReleaseSemaphore ( IN HSEMAPHORE hsem ) { // www.osr.com/ddk/graphics/gdifncs_5u3r.htm - PW32THREAD W32Thread; + PTHREADINFO W32Thread; ASSERT(hsem); W32Thread = PsGetThreadWin32Thread(PsGetCurrentThread()); if (W32Thread) --W32Thread->dwEngAcquireCount; diff --git a/reactos/subsystems/win32/win32k/include/class.h b/reactos/subsystems/win32/win32k/include/class.h index 93770a5d1ba..4859337e83a 100644 --- a/reactos/subsystems/win32/win32k/include/class.h +++ b/reactos/subsystems/win32/win32k/include/class.h @@ -42,7 +42,7 @@ UserGetCallProcInfo(IN HANDLE hCallProc, OUT PWNDPROC_INFO wpInfo); void FASTCALL -DestroyProcessClasses(PW32PROCESS Process ); +DestroyProcessClasses(PPROCESSINFO Process ); PCLS IntReferenceClass(IN OUT PCLS BaseClass, @@ -59,6 +59,7 @@ UserRegisterClass(IN CONST WNDCLASSEXW* lpwcx, IN PUNICODE_STRING ClassName, IN PUNICODE_STRING MenuName, IN WNDPROC wpExtra, + IN DWORD fnID, IN DWORD dwFlags); BOOL @@ -83,6 +84,7 @@ IntCreateClass(IN CONST WNDCLASSEXW* lpwcx, IN PUNICODE_STRING ClassName, IN PUNICODE_STRING MenuName, IN WNDPROC wpExtra, + IN DWORD fnID, IN DWORD dwFlags, IN PDESKTOP Desktop, IN PPROCESSINFO pi); diff --git a/reactos/subsystems/win32/win32k/include/clipboard.h b/reactos/subsystems/win32/win32k/include/clipboard.h index 32c6ed1a44a..95e961b6d9b 100644 --- a/reactos/subsystems/win32/win32k/include/clipboard.h +++ b/reactos/subsystems/win32/win32k/include/clipboard.h @@ -22,8 +22,8 @@ typedef struct _ClipboardElement typedef struct _CLIPBOARDSYSTEM { - PW32THREAD ClipboardThread; - PW32THREAD ClipboardOwnerThread; + PTHREADINFO ClipboardThread; + PTHREADINFO ClipboardOwnerThread; PWINDOW_OBJECT ClipboardWindow; PWINDOW_OBJECT ClipboardViewerWindow; PWINDOW_OBJECT ClipboardOwnerWindow; diff --git a/reactos/subsystems/win32/win32k/include/cursoricon.h b/reactos/subsystems/win32/win32k/include/cursoricon.h index 1e9bd2346e5..a3464ba887f 100644 --- a/reactos/subsystems/win32/win32k/include/cursoricon.h +++ b/reactos/subsystems/win32/win32k/include/cursoricon.h @@ -6,7 +6,7 @@ typedef struct tagCURICON_PROCESS { LIST_ENTRY ListEntry; - PW32PROCESS Process; + PPROCESSINFO Process; } CURICON_PROCESS, *PCURICON_PROCESS; typedef struct _CURICON_OBJECT @@ -69,7 +69,7 @@ typedef struct _SYSTEM_CURSORINFO HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor, BOOL ForceChange); BOOL FASTCALL IntSetupCurIconHandles(PWINSTATION_OBJECT WinStaObject); PCURICON_OBJECT FASTCALL IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject); -VOID FASTCALL IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process); +VOID FASTCALL IntCleanupCurIcons(struct _EPROCESS *Process, PPROCESSINFO Win32Process); BOOL FASTCALL IntGetCursorLocation(PWINSTATION_OBJECT WinStaObject, POINT *loc); diff --git a/reactos/subsystems/win32/win32k/include/desktop.h b/reactos/subsystems/win32/win32k/include/desktop.h index 6eb6ba78ea0..8493b9a3c9e 100644 --- a/reactos/subsystems/win32/win32k/include/desktop.h +++ b/reactos/subsystems/win32/win32k/include/desktop.h @@ -198,7 +198,7 @@ DesktopHeapGetUserDelta(VOID) { PW32HEAP_USER_MAPPING Mapping; PTHREADINFO pti; - PW32PROCESS W32Process; + PPROCESSINFO W32Process; PWIN32HEAP pheapDesktop; ULONG_PTR Delta = 0; @@ -228,7 +228,7 @@ static __inline PVOID DesktopHeapAddressToUser(PVOID lpMem) { PW32HEAP_USER_MAPPING Mapping; - PW32PROCESS W32Process; + PPROCESSINFO W32Process; W32Process = PsGetCurrentProcessWin32Process(); Mapping = W32Process->HeapMappings.Next; diff --git a/reactos/subsystems/win32/win32k/include/gdiobj.h b/reactos/subsystems/win32/win32k/include/gdiobj.h index af1e21f12a1..f54e87aa445 100644 --- a/reactos/subsystems/win32/win32k/include/gdiobj.h +++ b/reactos/subsystems/win32/win32k/include/gdiobj.h @@ -44,7 +44,7 @@ typedef struct _BASEOBJECT ULONG ulShareCount; USHORT cExclusiveLock; USHORT BaseFlags; - PW32THREAD Tid; + PTHREADINFO Tid; } BASEOBJECT, *POBJ; typedef struct _CLIENTOBJ diff --git a/reactos/subsystems/win32/win32k/include/menu.h b/reactos/subsystems/win32/win32k/include/menu.h index 3d3cbe5efbd..92482c395ba 100644 --- a/reactos/subsystems/win32/win32k/include/menu.h +++ b/reactos/subsystems/win32/win32k/include/menu.h @@ -97,7 +97,7 @@ IntSetMenuItemRect(PMENU_OBJECT MenuObject, UINT Item, BOOL fByPos, RECTL *rcRec DWORD APIENTRY UserInsertMenuItem(HMENU hMenu, UINT uItem, BOOL fByPosition, LPCMENUITEMINFOW lpmii); BOOL FASTCALL -IntCleanupMenus(struct _EPROCESS *Process, PW32PROCESS Win32Process); +IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process); BOOL FASTCALL IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition, diff --git a/reactos/subsystems/win32/win32k/include/win32.h b/reactos/subsystems/win32/win32k/include/win32.h index 12553398fb8..09f5d330ddd 100644 --- a/reactos/subsystems/win32/win32k/include/win32.h +++ b/reactos/subsystems/win32/win32k/include/win32.h @@ -34,7 +34,7 @@ typedef struct _W32THREAD typedef struct _THREADINFO { - W32THREAD W32Thread; + W32THREAD; PTL ptl; PVOID ppi; // FIXME: use PPROCESSINFO struct _USER_MESSAGE_QUEUE* MessageQueue; @@ -53,7 +53,7 @@ typedef struct _THREADINFO LIST_ENTRY PtiLink; CLIENTTHREADINFO cti; // Used only when no Desktop or pcti NULL. - + /* ReactOS */ LIST_ENTRY WindowListHead; LIST_ENTRY W32CallbackListHead; BOOLEAN IsExiting; @@ -89,7 +89,15 @@ typedef struct _W32PROCESS RTL_AVL_TABLE GDIEngUserMemAllocTable; /* Process AVL Table. */ LIST_ENTRY GDIDcAttrFreeList; LIST_ENTRY GDIBrushAttrFreeList; -/* ReactOS, will move to PROCESSINFO */ +} W32PROCESS, *PW32PROCESS; + +typedef struct _PROCESSINFO +{ + W32PROCESS; + + PCLS pclsPrivateList; + PCLS pclsPublicList; + /* ReactOS */ LIST_ENTRY ClassList; LIST_ENTRY MenuListHead; FAST_MUTEX PrivateFontListLock; @@ -98,16 +106,6 @@ typedef struct _W32PROCESS LIST_ENTRY DriverObjListHead; struct _KBL* KeyboardLayout; W32HEAP_USER_MAPPING HeapMappings; -} W32PROCESS, *PW32PROCESS; - -typedef struct _PROCESSINFO -{ - W32PROCESS XzyxW32Process; /* Place holder. */ - - PCLS pclsPrivateList; - PCLS pclsPublicList; - /* ReactOS */ - } PROCESSINFO; #endif /* __INCLUDE_NAPI_WIN32_H */ diff --git a/reactos/subsystems/win32/win32k/include/winsta.h b/reactos/subsystems/win32/win32k/include/winsta.h index c2933c47d83..4dda92a28aa 100644 --- a/reactos/subsystems/win32/win32k/include/winsta.h +++ b/reactos/subsystems/win32/win32k/include/winsta.h @@ -62,7 +62,7 @@ typedef struct _WINSTATION_OBJECT } WINSTATION_OBJECT, *PWINSTATION_OBJECT; extern WINSTATION_OBJECT *InputWindowStation; -extern PW32PROCESS LogonProcess; +extern PPROCESSINFO LogonProcess; NTSTATUS FASTCALL InitWindowStationImpl(VOID); diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index bd45e34bb94..a5436a076ee 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -55,7 +55,7 @@ APIENTRY Win32kProcessCallback(struct _EPROCESS *Process, BOOLEAN Create) { - PW32PROCESS Win32Process; + PPROCESSINFO Win32Process; DECLARE_RETURN(NTSTATUS); DPRINT("Enter Win32kProcessCallback\n"); diff --git a/reactos/subsystems/win32/win32k/misc/usrheap.c b/reactos/subsystems/win32/win32k/misc/usrheap.c index 5c3ef2d7619..17896e4c2d1 100644 --- a/reactos/subsystems/win32/win32k/misc/usrheap.c +++ b/reactos/subsystems/win32/win32k/misc/usrheap.c @@ -28,7 +28,7 @@ IntUserHeapCommitRoutine(IN PVOID Base, IN OUT PVOID *CommitAddress, IN OUT PSIZE_T CommitSize) { - PW32PROCESS W32Process; + PPROCESSINFO W32Process; PW32HEAP_USER_MAPPING Mapping; PVOID UserBase = NULL; NTSTATUS Status; diff --git a/reactos/subsystems/win32/win32k/ntuser/class.c b/reactos/subsystems/win32/win32k/ntuser/class.c index 6461ffe1e93..76b1e6959ef 100644 --- a/reactos/subsystems/win32/win32k/ntuser/class.c +++ b/reactos/subsystems/win32/win32k/ntuser/class.c @@ -26,17 +26,17 @@ static struct int ClsId; } FnidToiCls[] = { - { FNID_BUTTON, ICLS_BUTTON}, - { FNID_EDIT, ICLS_EDIT}, - { FNID_STATIC, ICLS_STATIC}, - { FNID_LISTBOX, ICLS_LISTBOX}, - { FNID_SCROLLBAR, ICLS_SCROLLBAR}, - { FNID_COMBOBOX, ICLS_COMBOBOX}, - { FNID_MDICLIENT, ICLS_MDICLIENT}, - { FNID_COMBOLBOX, ICLS_COMBOLBOX}, - { FNID_DIALOG, ICLS_DIALOG}, - { FNID_MENU, ICLS_MENU}, - { FNID_ICONTITLE, ICLS_ICONTITLE} + { FNID_BUTTON, ICLS_BUTTON}, + { FNID_EDIT, ICLS_EDIT}, + { FNID_STATIC, ICLS_STATIC}, + { FNID_LISTBOX, ICLS_LISTBOX}, + { FNID_SCROLLBAR, ICLS_SCROLLBAR}, + { FNID_COMBOBOX, ICLS_COMBOBOX}, + { FNID_MDICLIENT, ICLS_MDICLIENT}, + { FNID_COMBOLBOX, ICLS_COMBOLBOX}, + { FNID_DIALOG, ICLS_DIALOG}, + { FNID_MENU, ICLS_MENU}, + { FNID_ICONTITLE, ICLS_ICONTITLE} }; static @@ -118,7 +118,7 @@ IntDestroyClass(IN OUT PCLS Class) /* clean all process classes. all process windows must cleaned first!! */ -void FASTCALL DestroyProcessClasses(PW32PROCESS Process ) +void FASTCALL DestroyProcessClasses(PPROCESSINFO Process ) { PCLS Class; PPROCESSINFO pi = (PPROCESSINFO)Process; @@ -815,6 +815,7 @@ IntCreateClass(IN CONST WNDCLASSEXW* lpwcx, IN PUNICODE_STRING ClassName, IN PUNICODE_STRING MenuName, IN WNDPROC wpExtra, + IN DWORD fnID, IN DWORD dwFlags, IN PDESKTOP Desktop, IN PPROCESSINFO pi) @@ -865,14 +866,21 @@ IntCreateClass(IN CONST WNDCLASSEXW* lpwcx, Class->rpdeskParent = Desktop; Class->pclsBase = Class; Class->atomClassName = Atom; - + Class->fnid = fnID; Class->CSF_flags = dwFlags; if (dwFlags & CSF_SYSTEMCLASS) { + int iCls; + dwFlags &= ~CSF_ANSIPROC; Class->WndProcExtra = wpExtra; Class->System = TRUE; + /* Now set the Atom table, notice only non ntuser.c atoms can go in.*/ + if (LockupFnIdToiCls(Class->fnid, &iCls)) + { + gpsi->atomSysClass[iCls] = Class->atomClassName; + } } _SEH2_TRY @@ -1159,6 +1167,7 @@ UserRegisterClass(IN CONST WNDCLASSEXW* lpwcx, IN PUNICODE_STRING ClassName, IN PUNICODE_STRING MenuName, IN WNDPROC wpExtra, + IN DWORD fnID, IN DWORD dwFlags) { PTHREADINFO pti; @@ -1211,6 +1220,7 @@ UserRegisterClass(IN CONST WNDCLASSEXW* lpwcx, ClassName, MenuName, wpExtra, + fnID, dwFlags, pti->Desktop, pi); @@ -1894,19 +1904,12 @@ UserRegisterSystemClasses(IN ULONG Count, &ClassName, &MenuName, SystemClasses[i].ProcA, + SystemClasses[i].ClassId, CSF_SYSTEMCLASS, NULL, pi); if (Class != NULL) { - int iCls; - - Class->fnid = SystemClasses[i].ClassId; - if (LockupFnIdToiCls(Class->fnid, &iCls)) - { - gpsi->atomSysClass[iCls] = Class->atomClassName; - } - ASSERT(Class->System); Class->pclsNext = SystemClassList; (void)InterlockedExchangePointer((PVOID*)&SystemClassList, @@ -2028,6 +2031,7 @@ InvalidParameter: &CapturedName, &CapturedMenuName, wpExtra, + fnID, Flags); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 155dfe4c7e5..3c1b4dc31a0 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -290,7 +290,7 @@ IntSetupCurIconHandles(PWINSTATION_OBJECT WinSta) static BOOLEAN FASTCALL ReferenceCurIconByProcess(PCURICON_OBJECT CurIcon) { - PW32PROCESS Win32Process; + PPROCESSINFO Win32Process; PCURICON_PROCESS Current; Win32Process = PsGetCurrentProcessWin32Process(); @@ -387,7 +387,7 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT CurIcon, BOOL HBITMAP bmpMask, bmpColor; BOOLEAN Ret; PCURICON_PROCESS Current = NULL; - PW32PROCESS W32Process = PsGetCurrentProcessWin32Process(); + PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process(); /* Private objects can only be destroyed by their own process */ if (NULL == CurIcon->hModule) @@ -464,7 +464,7 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT CurIcon, BOOL } VOID FASTCALL -IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process) +IntCleanupCurIcons(struct _EPROCESS *Process, PPROCESSINFO Win32Process) { PWINSTATION_OBJECT WinSta; PCURICON_OBJECT CurIcon, tmp; diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index d7010f99031..2bcfdcd4c1d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -1134,6 +1134,7 @@ NtUserCreateDesktop( &ClassName, &MenuName, NULL, + FNID_MESSAGEWND, CSF_SYSTEMCLASS, NULL, pi); @@ -1846,7 +1847,7 @@ static NTSTATUS IntUnmapDesktopView(IN PDESKTOP DesktopObject) { PW32THREADINFO ti; - PW32PROCESS CurrentWin32Process; + PPROCESSINFO CurrentWin32Process; PW32HEAP_USER_MAPPING HeapMapping, *PrevLink; NTSTATUS Status = STATUS_SUCCESS; @@ -1897,7 +1898,7 @@ static NTSTATUS IntMapDesktopView(IN PDESKTOP DesktopObject) { PW32THREADINFO ti; - PW32PROCESS CurrentWin32Process; + PPROCESSINFO CurrentWin32Process; PW32HEAP_USER_MAPPING HeapMapping, *PrevLink; PVOID UserBase = NULL; SIZE_T ViewSize = 0; diff --git a/reactos/subsystems/win32/win32k/ntuser/guicheck.c b/reactos/subsystems/win32/win32k/ntuser/guicheck.c index a895567680e..8fdb0995aa9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/guicheck.c +++ b/reactos/subsystems/win32/win32k/ntuser/guicheck.c @@ -45,7 +45,7 @@ static LONG NrGuiAppsRunning = 0; /* FUNCTIONS *****************************************************************/ static BOOL FASTCALL -co_AddGuiApp(PW32PROCESS W32Data) +co_AddGuiApp(PPROCESSINFO W32Data) { W32Data->W32PF_flags |= W32PF_CREATEDWINORDC; if (InterlockedIncrement(&NrGuiAppsRunning) == 1) @@ -65,7 +65,7 @@ co_AddGuiApp(PW32PROCESS W32Data) } static void FASTCALL -RemoveGuiApp(PW32PROCESS W32Data) +RemoveGuiApp(PPROCESSINFO W32Data) { W32Data->W32PF_flags &= ~W32PF_CREATEDWINORDC; if (InterlockedDecrement(&NrGuiAppsRunning) == 0) @@ -77,7 +77,7 @@ RemoveGuiApp(PW32PROCESS W32Data) BOOL FASTCALL co_IntGraphicsCheck(BOOL Create) { - PW32PROCESS W32Data; + PPROCESSINFO W32Data; W32Data = PsGetCurrentProcessWin32Process(); if (Create) @@ -102,7 +102,7 @@ VOID FASTCALL IntUserManualGuiCheck(LONG Check) { - PW32PROCESS W32Data; + PPROCESSINFO W32Data; DPRINT("Enter IntUserManualGuiCheck\n"); diff --git a/reactos/subsystems/win32/win32k/ntuser/menu.c b/reactos/subsystems/win32/win32k/ntuser/menu.c index 07b32da0b16..66614e9892b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/menu.c +++ b/reactos/subsystems/win32/win32k/ntuser/menu.c @@ -313,7 +313,7 @@ PMENU_OBJECT FASTCALL IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar) { PMENU_OBJECT Menu; - PW32PROCESS CurrentWin32Process; + PPROCESSINFO CurrentWin32Process; Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable, Handle, @@ -418,7 +418,7 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source) PMENU_OBJECT FASTCALL IntCloneMenu(PMENU_OBJECT Source) { - PW32PROCESS CurrentWin32Process; + PPROCESSINFO CurrentWin32Process; HANDLE hMenu; PMENU_OBJECT Menu; @@ -1284,7 +1284,7 @@ IntSetMenuItemRect(PMENU_OBJECT Menu, UINT Item, BOOL fByPos, RECTL *rcRect) * Internal function. Called when the process is destroyed to free the remaining menu handles. */ BOOL FASTCALL -IntCleanupMenus(struct _EPROCESS *Process, PW32PROCESS Win32Process) +IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process) { PEPROCESS CurrentProcess; PLIST_ENTRY LastHead = NULL; diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index f3e0df87253..6cba6ae58e6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -2224,7 +2224,7 @@ NtUserWaitForInputIdle( IN BOOL Unknown2) { PEPROCESS Process; - PW32PROCESS W32Process; + PPROCESSINFO W32Process; NTSTATUS Status; HANDLE Handles[2]; LARGE_INTEGER Timeout; @@ -2246,7 +2246,7 @@ NtUserWaitForInputIdle( return WAIT_FAILED; } - W32Process = (PW32PROCESS)Process->Win32Process; + W32Process = (PPROCESSINFO)Process->Win32Process; if (!W32Process) { ObDereferenceObject(Process); diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index 8dfee1a98bf..4a4020fe5f7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -260,7 +260,7 @@ NtUserGetGuiResources( DWORD uiFlags) { PEPROCESS Process; - PW32PROCESS W32Process; + PPROCESSINFO W32Process; NTSTATUS Status; DWORD Ret = 0; DECLARE_RETURN(DWORD); @@ -281,7 +281,7 @@ NtUserGetGuiResources( RETURN( 0); } - W32Process = (PW32PROCESS)Process->Win32Process; + W32Process = (PPROCESSINFO)Process->Win32Process; if(!W32Process) { ObDereferenceObject(Process); diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 828671afabc..4ab1ca4d5cf 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -71,7 +71,7 @@ IdlePing(VOID) { HWND hWnd; PWINDOW_OBJECT Window; - PW32PROCESS W32d = PsGetCurrentProcessWin32Process(); + PPROCESSINFO W32d = PsGetCurrentProcessWin32Process(); hWnd = UserGetForegroundWindow(); diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index 2c795f65d31..80fd3c3aea2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -874,7 +874,7 @@ NtUserProcessConnect( { UserEnterShared(); GetW32ThreadInfo(); - PW32PROCESS W32Process = PsGetCurrentProcessWin32Process(); + PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process(); _SEH2_TRY { pUserConnect->siClient.psi = gpsi; diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index 862cce3965d..6f56e9fe895 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -15,7 +15,7 @@ /* registered Logon process */ -PW32PROCESS LogonProcess = NULL; +PPROCESSINFO LogonProcess = NULL; BOOL FASTCALL co_IntRegisterLogonProcess(HANDLE ProcessId, BOOL Register) @@ -41,12 +41,12 @@ co_IntRegisterLogonProcess(HANDLE ProcessId, BOOL Register) return FALSE; } - LogonProcess = (PW32PROCESS)Process->Win32Process; + LogonProcess = (PPROCESSINFO)Process->Win32Process; } else { /* Deregister the logon process */ - if (LogonProcess != (PW32PROCESS)Process->Win32Process) + if (LogonProcess != (PPROCESSINFO)Process->Win32Process) { ObDereferenceObject(Process); return FALSE; @@ -314,7 +314,7 @@ NtUserCallOneParam( case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING: { BOOL Enable; - PW32PROCESS Process = PsGetCurrentProcessWin32Process(); + PPROCESSINFO Process = PsGetCurrentProcessWin32Process(); if(Process != NULL) { diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 386d0a888e7..eab6b94e938 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -348,7 +348,7 @@ UserFreeWindowInfo(PW32THREADINFO ti, PWINDOW_OBJECT WindowObject) */ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, - PW32PROCESS ProcessData, + PPROCESSINFO ProcessData, PTHREADINFO ThreadData, BOOLEAN SendMessages) { diff --git a/reactos/subsystems/win32/win32k/objects/freetype.c b/reactos/subsystems/win32/win32k/objects/freetype.c index 63ea4ee3363..b53731c40a6 100644 --- a/reactos/subsystems/win32/win32k/objects/freetype.c +++ b/reactos/subsystems/win32/win32k/objects/freetype.c @@ -421,7 +421,7 @@ IntGdiAddFontResource(PUNICODE_STRING FileName, DWORD Characteristics) if (Characteristics & FR_PRIVATE) { - PW32PROCESS Win32Process = PsGetCurrentProcessWin32Process(); + PPROCESSINFO Win32Process = PsGetCurrentProcessWin32Process(); IntLockProcessPrivateFonts(Win32Process); InsertTailList(&Win32Process->PrivateFontListHead, &Entry->ListEntry); IntUnLockProcessPrivateFonts(Win32Process); @@ -940,7 +940,7 @@ FindFaceNameInList(PUNICODE_STRING FaceName, PLIST_ENTRY Head) static PFONTGDI FASTCALL FindFaceNameInLists(PUNICODE_STRING FaceName) { - PW32PROCESS Win32Process; + PPROCESSINFO Win32Process; PFONTGDI Font; /* Search the process local list */ @@ -2690,7 +2690,7 @@ TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj) NTSTATUS Status = STATUS_SUCCESS; PTEXTOBJ TextObj; UNICODE_STRING FaceName; - PW32PROCESS Win32Process; + PPROCESSINFO Win32Process; UINT MatchScore; if (!pTextObj) @@ -3003,7 +3003,7 @@ NtGdiGetFontFamilyInfo(HDC Dc, LOGFONTW LogFont; PFONTFAMILYINFO Info; DWORD Count; - PW32PROCESS Win32Process; + PPROCESSINFO Win32Process; /* Make a safe copy */ Status = MmCopyFromCaller(&LogFont, UnsafeLogFont, sizeof(LOGFONTW)); diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 86a8bb8232f..e197aaead98 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -345,7 +345,7 @@ GDIOBJ_AllocObj(UCHAR BaseType) POBJ INTERNAL_CALL GDIOBJ_AllocObjWithHandle(ULONG ObjectType) { - PW32PROCESS W32Process; + PPROCESSINFO W32Process; POBJ newObject = NULL; HANDLE CurrentProcessId, LockedProcessId; UCHAR TypeIndex; @@ -398,7 +398,7 @@ LockHandle: PrevProcId = InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, 0); if (PrevProcId == NULL) { - PW32THREAD Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread(); + PTHREADINFO Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); HGDIOBJ Handle; Entry->KernelData = newObject; @@ -540,11 +540,11 @@ LockHandle: Object = Entry->KernelData; if ((Object->cExclusiveLock == 0 || - Object->Tid == (PW32THREAD)PsGetCurrentThreadWin32Thread()) && + Object->Tid == (PTHREADINFO)PsGetCurrentThreadWin32Thread()) && Object->ulShareCount == 0) { BOOL Ret; - PW32PROCESS W32Process = PsGetCurrentProcessWin32Process(); + PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process(); /* Clear the basetype field so when unlocking the handle it gets finally deleted and increment reuse counter */ Entry->Type = (Entry->Type + GDI_ENTRY_REUSE_INC) & ~GDI_ENTRY_BASETYPE_MASK; @@ -684,9 +684,9 @@ IntDeleteHandlesForProcess(struct _EPROCESS *Process, ULONG ObjectType) PGDI_TABLE_ENTRY Entry, End; ULONG Index = RESERVE_ENTRIES_COUNT; HANDLE ProcId; - PW32PROCESS W32Process; + PPROCESSINFO W32Process; - W32Process = (PW32PROCESS)Process->Win32Process; + W32Process = (PPROCESSINFO)Process->Win32Process; ASSERT(W32Process); if (W32Process->GDIHandleCount > 0) @@ -740,7 +740,7 @@ BOOL INTERNAL_CALL GDI_CleanupForProcess(struct _EPROCESS *Process) { PEPROCESS CurrentProcess; - PW32PROCESS W32Process; + PPROCESSINFO W32Process; DPRINT("Starting CleanupForProcess prochandle %x Pid %d\n", Process, Process->UniqueProcessId); CurrentProcess = PsGetCurrentProcess(); @@ -749,7 +749,7 @@ GDI_CleanupForProcess(struct _EPROCESS *Process) KeAttachProcess(&Process->Pcb); } - W32Process = (PW32PROCESS)CurrentProcess->Win32Process; + W32Process = (PPROCESSINFO)CurrentProcess->Win32Process; /* Delete objects. Begin with types that are not referenced by other types */ IntDeleteHandlesForProcess(Process, GDILoObjType_LO_DC_TYPE); @@ -862,7 +862,7 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ExpectedType) if ( (Entry->KernelData != NULL) && ((Entry->Type << GDI_ENTRY_UPPER_SHIFT) == HandleUpper) ) { - PW32THREAD Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread(); + PTHREADINFO Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); Object = Entry->KernelData; if (Object->cExclusiveLock == 0) @@ -1071,7 +1071,7 @@ GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj) */ PGDI_TABLE_ENTRY Entry; HANDLE ProcessId, LockedProcessId, PrevProcId; - PW32THREAD Thread; + PTHREADINFO Thread; HGDIOBJ hObj; GDIDBG_INITLOOPTRACE(); @@ -1081,7 +1081,7 @@ GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj) DPRINT("GDIOBJ_ConvertToStockObj: hObj: 0x%08x\n", hObj); - Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread(); + Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); if (!GDI_HANDLE_IS_STOCKOBJ(hObj)) { @@ -1115,7 +1115,7 @@ LockHandle: PrevType = InterlockedCompareExchange(&Entry->Type, NewType, OldType); if (PrevType == OldType && Entry->KernelData != NULL) { - PW32THREAD PrevThread; + PTHREADINFO PrevThread; POBJ Object; /* We successfully set the stock object flag. @@ -1131,14 +1131,14 @@ LockHandle: if (PrevProcId != GDI_GLOBAL_PROCESS) { PEPROCESS OldProcess; - PW32PROCESS W32Process; + PPROCESSINFO W32Process; NTSTATUS Status; /* FIXME */ Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); if (NT_SUCCESS(Status)) { - W32Process = (PW32PROCESS)OldProcess->Win32Process; + W32Process = (PPROCESSINFO)OldProcess->Win32Process; if (W32Process != NULL) { InterlockedDecrement(&W32Process->GDIHandleCount); @@ -1200,14 +1200,14 @@ GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS NewOwner) { PGDI_TABLE_ENTRY Entry; HANDLE ProcessId, LockedProcessId, PrevProcId; - PW32THREAD Thread; + PTHREADINFO Thread; BOOL Ret = TRUE; GDIDBG_INITLOOPTRACE(); DPRINT("GDIOBJ_SetOwnership: hObj: 0x%x, NewProcess: 0x%x\n", ObjectHandle, (NewOwner ? PsGetProcessId(NewOwner) : 0)); - Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread(); + Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); if (!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle)) { @@ -1221,7 +1221,7 @@ LockHandle: PrevProcId = InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, ProcessId, LockedProcessId); if (PrevProcId == ProcessId) { - PW32THREAD PrevThread; + PTHREADINFO PrevThread; if ((Entry->Type & GDI_ENTRY_BASETYPE_MASK) != 0) { @@ -1231,7 +1231,7 @@ LockHandle: if (Object->cExclusiveLock == 0 || PrevThread == Thread) { PEPROCESS OldProcess; - PW32PROCESS W32Process; + PPROCESSINFO W32Process; NTSTATUS Status; /* dereference the process' object counter */ @@ -1241,7 +1241,7 @@ LockHandle: Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); if (NT_SUCCESS(Status)) { - W32Process = (PW32PROCESS)OldProcess->Win32Process; + W32Process = (PPROCESSINFO)OldProcess->Win32Process; if (W32Process != NULL) { InterlockedDecrement(&W32Process->GDIHandleCount); @@ -1255,7 +1255,7 @@ LockHandle: ProcessId = PsGetProcessId(NewOwner); /* Increase the new process' object counter */ - W32Process = (PW32PROCESS)NewOwner->Win32Process; + W32Process = (PPROCESSINFO)NewOwner->Win32Process; if (W32Process != NULL) { InterlockedIncrement(&W32Process->GDIHandleCount); @@ -1328,7 +1328,7 @@ BOOL INTERNAL_CALL GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo) { PGDI_TABLE_ENTRY FromEntry; - PW32THREAD Thread; + PTHREADINFO Thread; HANDLE FromProcessId, FromLockedProcessId, FromPrevProcId; BOOL Ret = TRUE; @@ -1336,7 +1336,7 @@ GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo) DPRINT("GDIOBJ_CopyOwnership: from: 0x%x, to: 0x%x\n", CopyFrom, CopyTo); - Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread(); + Thread = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); if (!GDI_HANDLE_IS_STOCKOBJ(CopyFrom) && !GDI_HANDLE_IS_STOCKOBJ(CopyTo)) { @@ -1350,7 +1350,7 @@ LockHandleFrom: FromPrevProcId = InterlockedCompareExchangePointer((PVOID*)&FromEntry->ProcessId, FromProcessId, FromLockedProcessId); if (FromPrevProcId == FromProcessId) { - PW32THREAD PrevThread; + PTHREADINFO PrevThread; POBJ Object; if ((FromEntry->Type & GDI_ENTRY_BASETYPE_MASK) != 0) diff --git a/reactos/subsystems/win32/win32k/pch.h b/reactos/subsystems/win32/win32k/pch.h index 3dbb5437ac2..b53d861341f 100644 --- a/reactos/subsystems/win32/win32k/pch.h +++ b/reactos/subsystems/win32/win32k/pch.h @@ -138,7 +138,7 @@ UserHeapReAlloc(PVOID lpMem, static __inline PVOID UserHeapAddressToUser(PVOID lpMem) { - PW32PROCESS W32Process = PsGetCurrentProcessWin32Process(); + PPROCESSINFO W32Process = PsGetCurrentProcessWin32Process(); return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)GlobalUserHeap) + (ULONG_PTR)W32Process->HeapMappings.UserMapping); } From 25aa6b6a419fa4c59fa8dba4fe7c2fed09b693a8 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Sun, 26 Jul 2009 16:18:56 +0000 Subject: [PATCH 575/577] - Revert winbase.h interlocked intrinsic change for now *sigh* svn path=/trunk/; revision=42235 --- reactos/include/psdk/winbase.h | 74 +++++++++++++++++----------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/reactos/include/psdk/winbase.h b/reactos/include/psdk/winbase.h index a6431ccc0d9..cf889169d5c 100644 --- a/reactos/include/psdk/winbase.h +++ b/reactos/include/psdk/winbase.h @@ -1835,6 +1835,43 @@ VOID WINAPI InitializeSRWLock(PSRWLOCK); #define InterlockedCompareExchangeAcquire64 InterlockedCompareExchange64 #define InterlockedCompareExchangeRelease64 InterlockedCompareExchange64 +#else // !(defined (_M_AMD64) || defined (_M_IA64)) + +LONG WINAPI InterlockedOr(IN OUT LONG volatile *,LONG); +LONG WINAPI InterlockedAnd(IN OUT LONG volatile *,LONG); +LONG WINAPI InterlockedCompareExchange(IN OUT LONG volatile *,LONG,LONG); +LONG WINAPI InterlockedDecrement(IN OUT LONG volatile *); +LONG WINAPI InterlockedExchange(IN OUT LONG volatile *,LONG); +#if defined(_WIN64) + /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ + #define InterlockedExchangePointer(t,v) \ + (PVOID)_InterlockedExchange64((LONGLONG*)(t),(LONGLONG)(v)) + /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ + #define InterlockedCompareExchangePointer(d,e,c) \ + (PVOID)_InterlockedCompareExchange64((LONGLONG*)(d),(LONGLONG)(e),(LONGLONG)(c)) +#else + /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ + #define InterlockedExchangePointer(t,v) \ + (PVOID)InterlockedExchange((LPLONG)(t),(LONG)(v)) + /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ + #define InterlockedCompareExchangePointer(d,e,c) \ + (PVOID)InterlockedCompareExchange((LPLONG)(d),(LONG)(e),(LONG)(c)) +#endif +LONG WINAPI InterlockedExchangeAdd(IN OUT LONG volatile *,LONG); +#if (_WIN32_WINNT >= 0x0501) +PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER); +#endif +LONG WINAPI InterlockedIncrement(IN OUT LONG volatile *); +#if (_WIN32_WINNT >= 0x0501) +PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER); +PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY); +#endif + +#endif // !(defined (_M_AMD64) || defined (_M_IA64)) + +VOID WINAPI InitializeSListHead(PSLIST_HEADER); +USHORT WINAPI QueryDepthSList(PSLIST_HEADER); + #if !defined(InterlockedAnd) #define InterlockedAnd InterlockedAnd_Inline FORCEINLINE @@ -1881,43 +1918,6 @@ InterlockedOr_Inline(IN OUT volatile LONG *Target, } #endif -#else // !(defined (_M_AMD64) || defined (_M_IA64)) - -LONG WINAPI InterlockedOr(IN OUT LONG volatile *,LONG); -LONG WINAPI InterlockedAnd(IN OUT LONG volatile *,LONG); -LONG WINAPI InterlockedCompareExchange(IN OUT LONG volatile *,LONG,LONG); -LONG WINAPI InterlockedDecrement(IN OUT LONG volatile *); -LONG WINAPI InterlockedExchange(IN OUT LONG volatile *,LONG); -#if defined(_WIN64) - /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ - #define InterlockedExchangePointer(t,v) \ - (PVOID)_InterlockedExchange64((LONGLONG*)(t),(LONGLONG)(v)) - /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ - #define InterlockedCompareExchangePointer(d,e,c) \ - (PVOID)_InterlockedCompareExchange64((LONGLONG*)(d),(LONGLONG)(e),(LONGLONG)(c)) -#else - /* PVOID WINAPI InterlockedExchangePointer(PVOID*,PVOID); */ - #define InterlockedExchangePointer(t,v) \ - (PVOID)InterlockedExchange((LPLONG)(t),(LONG)(v)) - /* PVOID WINAPI InterlockedCompareExchangePointer(PVOID*,PVOID,PVOID); */ - #define InterlockedCompareExchangePointer(d,e,c) \ - (PVOID)InterlockedCompareExchange((LPLONG)(d),(LONG)(e),(LONG)(c)) -#endif -LONG WINAPI InterlockedExchangeAdd(IN OUT LONG volatile *,LONG); -#if (_WIN32_WINNT >= 0x0501) -PSLIST_ENTRY WINAPI InterlockedFlushSList(PSLIST_HEADER); -#endif -LONG WINAPI InterlockedIncrement(IN OUT LONG volatile *); -#if (_WIN32_WINNT >= 0x0501) -PSLIST_ENTRY WINAPI InterlockedPopEntrySList(PSLIST_HEADER); -PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY); -#endif - -#endif // !(defined (_M_AMD64) || defined (_M_IA64)) - -VOID WINAPI InitializeSListHead(PSLIST_HEADER); -USHORT WINAPI QueryDepthSList(PSLIST_HEADER); - #endif /* __INTERLOCKED_DECLARED */ BOOL WINAPI IsBadCodePtr(FARPROC); From c8b2a78d5b5aebff91036b2bf6b10856a1f69e19 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 26 Jul 2009 16:57:34 +0000 Subject: [PATCH 576/577] - At a minimum set the desktop to global class. svn path=/trunk/; revision=42236 --- reactos/subsystems/win32/csrss/win32csr/desktopbg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/csrss/win32csr/desktopbg.c b/reactos/subsystems/win32/csrss/win32csr/desktopbg.c index 65e89ed65ad..ed17c226b6c 100644 --- a/reactos/subsystems/win32/csrss/win32csr/desktopbg.c +++ b/reactos/subsystems/win32/csrss/win32csr/desktopbg.c @@ -126,7 +126,7 @@ DtbgInit() * Create the desktop window class */ Class.cbSize = sizeof(WNDCLASSEXW); - Class.style = 0; + Class.style = CS_GLOBALCLASS; Class.lpfnWndProc = DtbgWindowProc; Class.cbClsExtra = 0; Class.cbWndExtra = 0; From 6182f013fe13ca650470cb9c2922037dff65ad50 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 26 Jul 2009 19:44:27 +0000 Subject: [PATCH 577/577] - Initialize MmLowestPhysicalPage to -1, otherwise setting this value will never work properly since we'll never find a page lower than 0 (the default laoder-initialized value). - Fixed by Stef. svn path=/trunk/; revision=42237 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index abf4aafe7a3..e053754ff7a 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -203,7 +203,7 @@ MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; // // This is where we keep track of the most basic physical layout markers // -ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage; +ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1; // // The total number of pages mapped by the boot loader, which include the kernel