We don't do *any* paging ;-) Best regards, Alex Ionescu
On Wed, Jun 18, 2014 at 1:02 AM, Hermès BÉLUSCA - MAÏTO < hermes.belu...@sfr.fr> wrote: > Aha, thanks for your tip, so that means we don’t do it atm? > > > > Hermès. > > > > *De :* Ros-dev [mailto:ros-dev-boun...@reactos.org] *De la part de* Alex > Ionescu > *Envoyé :* mardi 17 juin 2014 23:14 > *À :* ReactOS Development List > *Cc :* Linda Wang > *Objet :* Re: [ros-dev] [ros-diffs] [hbelusca] 63610: [WIN32K] There is a > bug in win32k (who would have thought that?) that consists in holding a > winstation spinlock while running PAGED_CODE MmCopyToCaller function, when > building the... > > > > Win32k.sys is supposed to use MmPageEntireDriver, as such, it should run > 100% at passive only. > > > Best regards, > Alex Ionescu > > > > On Tue, Jun 17, 2014 at 10:01 PM, <hbelu...@svn.reactos.org> wrote: > > Author: hbelusca > Date: Tue Jun 17 20:01:23 2014 > New Revision: 63610 > > URL: http://svn.reactos.org/svn/reactos?rev=63610&view=rev > Log: > [WIN32K] > There is a bug in win32k (who would have thought that?) that consists in > holding a winstation spinlock while running PAGED_CODE MmCopyToCaller > function, when building the list of desktops of a given window station (the > bug is easily triggerable when calling EnumDesktopsW). Since this lock is > never used in anyplace but in this function, which, by the way, is just a > reader function that fills user buffer, I consider that it is safe to > remove this lock. However I want approval from win32k specialists. Hence I > just disable the code with a define USE_WINSTA_LOCK. If this lock is really > needed, please rewrite the BuildDesktopNameList function !! Otherwise > remove this lock and the associated code !! > This is a blocker for the shutdown code. > > Modified: > trunk/reactos/win32ss/user/ntuser/winsta.c > trunk/reactos/win32ss/user/ntuser/winsta.h > > Modified: trunk/reactos/win32ss/user/ntuser/winsta.c > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/winsta.c?rev=63610&r1=63609&r2=63610&view=diff > > ============================================================================== > --- trunk/reactos/win32ss/user/ntuser/winsta.c [iso-8859-1] (original) > +++ trunk/reactos/win32ss/user/ntuser/winsta.c [iso-8859-1] Tue Jun 17 > 20:01:23 2014 > @@ -451,7 +451,9 @@ > /* Initialize the window station */ > RtlZeroMemory(WindowStationObject, sizeof(WINSTATION_OBJECT)); > > +#ifdef USE_WINSTA_LOCK > KeInitializeSpinLock(&WindowStationObject->Lock); > +#endif > InitializeListHead(&WindowStationObject->DesktopListHead); > Status = RtlCreateAtomTable(37, &WindowStationObject->AtomTable); > WindowStationObject->Name = WindowStationName; > @@ -1203,7 +1205,9 @@ > { > NTSTATUS Status; > PWINSTATION_OBJECT WindowStation; > +#ifdef USE_WINSTA_LOCK > KIRQL OldLevel; > +#endif > PLIST_ENTRY DesktopEntry; > PDESKTOP DesktopObject; > DWORD EntryCount; > @@ -1220,7 +1224,9 @@ > return Status; > } > > +#ifdef USE_WINSTA_LOCK > KeAcquireSpinLock(&WindowStation->Lock, &OldLevel); > +#endif > > /* > * Count the required size of buffer. > @@ -1242,7 +1248,9 @@ > Status = MmCopyToCaller(pRequiredSize, &ReturnLength, > sizeof(ULONG)); > if (! NT_SUCCESS(Status)) > { > +#ifdef USE_WINSTA_LOCK > KeReleaseSpinLock(&WindowStation->Lock, OldLevel); > +#endif > ObDereferenceObject(WindowStation); > return STATUS_BUFFER_TOO_SMALL; > } > @@ -1253,7 +1261,9 @@ > */ > if (dwSize < ReturnLength) > { > +#ifdef USE_WINSTA_LOCK > KeReleaseSpinLock(&WindowStation->Lock, OldLevel); > +#endif > ObDereferenceObject(WindowStation); > return STATUS_BUFFER_TOO_SMALL; > } > @@ -1264,7 +1274,9 @@ > Status = MmCopyToCaller(lpBuffer, &EntryCount, sizeof(DWORD)); > if (! NT_SUCCESS(Status)) > { > +#ifdef USE_WINSTA_LOCK > KeReleaseSpinLock(&WindowStation->Lock, OldLevel); > +#endif > ObDereferenceObject(WindowStation); > return Status; > } > @@ -1280,7 +1292,9 @@ > Status = MmCopyToCaller(lpBuffer, DesktopName.Buffer, > DesktopName.Length); > if (! NT_SUCCESS(Status)) > { > +#ifdef USE_WINSTA_LOCK > KeReleaseSpinLock(&WindowStation->Lock, OldLevel); > +#endif > ObDereferenceObject(WindowStation); > return Status; > } > @@ -1288,7 +1302,9 @@ > Status = MmCopyToCaller(lpBuffer, &NullWchar, sizeof(WCHAR)); > if (! NT_SUCCESS(Status)) > { > +#ifdef USE_WINSTA_LOCK > KeReleaseSpinLock(&WindowStation->Lock, OldLevel); > +#endif > ObDereferenceObject(WindowStation); > return Status; > } > @@ -1298,7 +1314,9 @@ > /* > * Clean up > */ > +#ifdef USE_WINSTA_LOCK > KeReleaseSpinLock(&WindowStation->Lock, OldLevel); > +#endif > ObDereferenceObject(WindowStation); > > return STATUS_SUCCESS; > > Modified: trunk/reactos/win32ss/user/ntuser/winsta.h > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/winsta.h?rev=63610&r1=63609&r2=63610&view=diff > > ============================================================================== > --- trunk/reactos/win32ss/user/ntuser/winsta.h [iso-8859-1] (original) > +++ trunk/reactos/win32ss/user/ntuser/winsta.h [iso-8859-1] Tue Jun 17 > 20:01:23 2014 > @@ -7,11 +7,16 @@ > #define WSS_LOCKED (1) > #define WSS_NOINTERACTIVE (2) > > +// Uncomment for using WinSta spinlock > +// #define USE_WINSTA_LOCK > + > typedef struct _WINSTATION_OBJECT > { > DWORD dwSessionId; > > +#ifdef USE_WINSTA_LOCK > KSPIN_LOCK Lock; > +#endif > UNICODE_STRING Name; > LIST_ENTRY DesktopListHead; > PRTL_ATOM_TABLE AtomTable; > > > > _______________________________________________ > Ros-dev mailing list > Ros-dev@reactos.org > http://www.reactos.org/mailman/listinfo/ros-dev > >
_______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://www.reactos.org/mailman/listinfo/ros-dev