Author: gadamopoulos
Date: Sun Feb 24 21:30:30 2013
New Revision: 58367
URL: http://svn.reactos.org/svn/reactos?rev=58367&view=rev
Log:
[msgina]
- Fix a bug in StartupWindowThread that had as a result to close the desktop handle we get from winlogon. The problem is the wrong usage of SetThreadDesktop as it closes the previous desktop, so keeping OldDesk is totally useless and when the thread exits it will close the handle to the current thread desktop which is Session->WinlogonDesktop from winlogon. To solve this issue we have to duplicate the handle we get from winlogon and let it get closed by win32k when the thread exits
Modified:
trunk/reactos/dll/win32/msgina/gui.c
Modified: trunk/reactos/dll/win32/msgina/gui.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msgina/gui.c?rev…
==============================================================================
--- trunk/reactos/dll/win32/msgina/gui.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msgina/gui.c [iso-8859-1] Sun Feb 24 21:30:30 2013
@@ -59,23 +59,35 @@
static DWORD WINAPI
StartupWindowThread(LPVOID lpParam)
{
- HDESK OldDesk;
+ HDESK hDesk;
PDISPLAYSTATUSMSG msg = (PDISPLAYSTATUSMSG)lpParam;
- OldDesk = GetThreadDesktop(GetCurrentThreadId());
-
- if(!SetThreadDesktop(msg->hDesktop))
+ /* When SetThreadDesktop is called the system closes the desktop handle when needed
+ so we have to create a new handle because this handle may still be in use by winlogon */
+ if (!DuplicateHandle ( GetCurrentProcess(),
+ msg->hDesktop,
+ GetCurrentProcess(),
+ &hDesk,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS))
{
HeapFree(GetProcessHeap(), 0, lpParam);
return FALSE;
}
+
+ if(!SetThreadDesktop(hDesk))
+ {
+ HeapFree(GetProcessHeap(), 0, lpParam);
+ return FALSE;
+ }
+
DialogBoxParam(
hDllInstance,
MAKEINTRESOURCE(IDD_STATUSWINDOW_DLG),
GetDesktopWindow(),
StatusMessageWindowProc,
(LPARAM)lpParam);
- SetThreadDesktop(OldDesk);
HeapFree(GetProcessHeap(), 0, lpParam);
return TRUE;
Author: gadamopoulos
Date: Sun Feb 24 20:03:48 2013
New Revision: 58364
URL: http://svn.reactos.org/svn/reactos?rev=58364&view=rev
Log:
[win32k]
- Fix a nasty bug in IntTrackMouseMove that prevented us from stopping the ID_EVENT_SYSTIMER_MOUSEHOVER timer.
- IntKillTimer requires a PWND as first argument but we were passing an HWND and as a result the timer was never stopped
- Fixes the remaining failed tests for TrackMouseEvent (besides queue state tests)
Modified:
trunk/reactos/win32ss/user/ntuser/msgqueue.c
Modified: trunk/reactos/win32ss/user/ntuser/msgqueue.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/msgque…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/msgqueue.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/msgqueue.c [iso-8859-1] Sun Feb 24 20:03:48 2013
@@ -1352,7 +1352,7 @@
0, 0);
if ( pDesk->dwDTFlags & DF_TME_HOVER )
- IntKillTimer(UserHMGetHandle(pDesk->spwndTrack), ID_EVENT_SYSTIMER_MOUSEHOVER, TRUE);
+ IntKillTimer(pDesk->spwndTrack, ID_EVENT_SYSTIMER_MOUSEHOVER, TRUE);
/* Clear the flags to sign a change. */
pDesk->dwDTFlags &= ~(DF_TME_LEAVE|DF_TME_HOVER);
Author: tkreuzer
Date: Sun Feb 24 14:40:21 2013
New Revision: 58361
URL: http://svn.reactos.org/svn/reactos?rev=58361&view=rev
Log:
[FREELDR]
When processing forwarders and the target image was not yet loaded, try to load it (using .dll extension if no extension is given)
Modified:
trunk/reactos/boot/freeldr/freeldr/windows/peloader.c
Modified: trunk/reactos/boot/freeldr/freeldr/windows/peloader.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windo…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/peloader.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/peloader.c [iso-8859-1] Sun Feb 24 14:40:21 2013
@@ -30,7 +30,8 @@
IN PIMAGE_THUNK_DATA ThunkData,
IN PIMAGE_EXPORT_DIRECTORY ExportDirectory,
IN ULONG ExportSize,
- IN BOOLEAN ProcessForwards);
+ IN BOOLEAN ProcessForwards,
+ IN PCSTR DirectoryPath);
static BOOLEAN
WinLdrpLoadAndScanReferencedDll(PLIST_ENTRY ModuleListHead,
@@ -42,7 +43,8 @@
WinLdrpScanImportAddressTable(IN OUT PLIST_ENTRY ModuleListHead,
IN PVOID DllBase,
IN PVOID ImageBase,
- IN PIMAGE_THUNK_DATA ThunkData);
+ IN PIMAGE_THUNK_DATA ThunkData,
+ IN PCSTR DirectoryPath);
@@ -57,8 +59,7 @@
PLDR_DATA_TABLE_ENTRY DataTableEntry;
LIST_ENTRY *ModuleEntry;
- TRACE("WinLdrCheckForLoadedDll: DllName %s, LoadedEntry: %X\n",
- DllName, LoadedEntry);
+ TRACE("WinLdrCheckForLoadedDll: DllName %s\n", DllName);
/* Just go through each entry in the LoadOrderList and compare loaded module's
name with a given name */
@@ -70,9 +71,9 @@
LDR_DATA_TABLE_ENTRY,
InLoadOrderLinks);
- TRACE("WinLdrCheckForLoadedDll: DTE %p, EP %p, base %p name '%ws'\n",
+ TRACE("WinLdrCheckForLoadedDll: DTE %p, EP %p, base %p name '%.*ws'\n",
DataTableEntry, DataTableEntry->EntryPoint, DataTableEntry->DllBase,
- VaToPa(DataTableEntry->BaseDllName.Buffer));
+ DataTableEntry->BaseDllName.Length / 2, VaToPa(DataTableEntry->BaseDllName.Buffer));
/* Compare names */
if (WinLdrpCompareDllName(DllName, &DataTableEntry->BaseDllName))
@@ -152,7 +153,8 @@
ModuleListHead,
DataTableEntry->DllBase,
ScanDTE->DllBase,
- (PIMAGE_THUNK_DATA)RVA(ScanDTE->DllBase, ImportTable->FirstThunk));
+ (PIMAGE_THUNK_DATA)RVA(ScanDTE->DllBase, ImportTable->FirstThunk),
+ DirectoryPath);
if (!Status)
{
@@ -241,8 +243,10 @@
/* Insert this DTE to a list in the LPB */
InsertTailList(ModuleListHead, &DataTableEntry->InLoadOrderLinks);
- TRACE("Inserting DTE %p, name='%S' DllBase=%p \n", DataTableEntry,
- DataTableEntry->BaseDllName.Buffer, DataTableEntry->DllBase);
+ TRACE("Inserting DTE %p, name='%.*S' DllBase=%p \n", DataTableEntry,
+ DataTableEntry->BaseDllName.Length / 2,
+ VaToPa(DataTableEntry->BaseDllName.Buffer),
+ DataTableEntry->DllBase);
/* Save pointer to a newly allocated and initialized entry */
*NewEntry = DataTableEntry;
@@ -293,7 +297,6 @@
/* Now read the MZ header to get the offset to the PE Header */
NtHeaders = RtlImageNtHeader(HeadersBuffer);
-
if (!NtHeaders)
{
//Print(L"Error - no NT header found in %s\n", FileName);
@@ -501,7 +504,8 @@
IN PIMAGE_THUNK_DATA ThunkData,
IN PIMAGE_EXPORT_DIRECTORY ExportDirectory,
IN ULONG ExportSize,
- IN BOOLEAN ProcessForwards)
+ IN BOOLEAN ProcessForwards,
+ IN PCSTR DirectoryPath)
{
ULONG Ordinal;
PULONG NameTable, FunctionTable;
@@ -509,7 +513,7 @@
LONG High, Low, Middle, Result;
ULONG Hint;
PIMAGE_IMPORT_BY_NAME ImportData;
- PCHAR ExportName;
+ PCHAR ExportName, ForwarderName;
//TRACE("WinLdrpBindImportName(): DllBase 0x%X, ImageBase 0x%X, ThunkData 0x%X, ExportDirectory 0x%X, ExportSize %d, ProcessForwards 0x%X\n",
// DllBase, ImageBase, ThunkData, ExportDirectory, ExportSize, ProcessForwards);
@@ -646,28 +650,44 @@
/* Save a pointer to the function */
ThunkData->u1.Function = (ULONG_PTR)RVA(DllBase, FunctionTable[Ordinal]);
- /* Is it a forwarder? (function pointer isn't within the export directory) */
- if (((ULONG_PTR)VaToPa((PVOID)ThunkData->u1.Function) > (ULONG_PTR)ExportDirectory) &&
- ((ULONG_PTR)VaToPa((PVOID)ThunkData->u1.Function) < ((ULONG_PTR)ExportDirectory + ExportSize)))
+ /* Is it a forwarder? (function pointer is within the export directory) */
+ ForwarderName = (PCHAR)VaToPa((PVOID)ThunkData->u1.Function);
+ if (((ULONG_PTR)ForwarderName > (ULONG_PTR)ExportDirectory) &&
+ ((ULONG_PTR)ForwarderName < ((ULONG_PTR)ExportDirectory + ExportSize)))
{
PLDR_DATA_TABLE_ENTRY DataTableEntry;
CHAR ForwardDllName[255];
PIMAGE_EXPORT_DIRECTORY RefExportDirectory;
ULONG RefExportSize;
+ NTSTATUS Status;
+ TRACE("WinLdrpBindImportName(): ForwarderName %s\n", ForwarderName);
/* Save the name of the forward dll */
- RtlCopyMemory(ForwardDllName, (PCHAR)VaToPa((PVOID)ThunkData->u1.Function), sizeof(ForwardDllName));
-
- /* Strip out its extension */
- *strchr(ForwardDllName,'.') = '\0';
-
- TRACE("WinLdrpBindImportName(): ForwardDllName %s\n", ForwardDllName);
+ RtlCopyMemory(ForwardDllName, ForwarderName, sizeof(ForwardDllName));
+
+ /* Strip out the symbol name */
+ *strrchr(ForwardDllName,'.') = '\0';
+
+ /* Check if the target image is already loaded */
if (!WinLdrCheckForLoadedDll(ModuleListHead, ForwardDllName, &DataTableEntry))
{
- /* We can't continue if DLL couldn't be loaded, so bomb out with an error */
- //Print(L"Error loading DLL!\n");
- ERR("Error loading DLL!\n");
- return FALSE;
+ /* Check if the forward dll name has an extension */
+ if (strchr(ForwardDllName, '.') == NULL)
+ {
+ /* Name does not have an extension, append '.dll' */
+ strcat(ForwardDllName, ".dll");
+ }
+
+ /* Now let's try to load it! */
+ Status = WinLdrpLoadAndScanReferencedDll(ModuleListHead,
+ DirectoryPath,
+ ForwardDllName,
+ &DataTableEntry);
+ if (!Status)
+ {
+ ERR("WinLdrpLoadAndScanReferencedDll() failed to load forwarder dll.\n");
+ return Status;
+ }
}
/* Get pointer to the export directory of loaded DLL */
@@ -687,7 +707,7 @@
BOOLEAN Status;
/* Get pointer to the import name */
- ImportName = strchr((PCHAR)VaToPa((PVOID)ThunkData->u1.Function), '.') + 1;
+ ImportName = strrchr(ForwarderName, '.') + 1;
/* Create a IMAGE_IMPORT_BY_NAME structure, pointing to the local Buffer */
ImportByName = (PIMAGE_IMPORT_BY_NAME)Buffer;
@@ -709,7 +729,8 @@
&RefThunkData,
RefExportDirectory,
RefExportSize,
- TRUE);
+ TRUE,
+ DirectoryPath);
/* Fill out the ThunkData with data from RefThunkData */
ThunkData->u1 = RefThunkData.u1;
@@ -747,7 +768,6 @@
/* Load the image */
Status = WinLdrLoadImage(FullDllName, LoaderBootDriver, &BasePA);
-
if (!Status)
{
ERR("WinLdrLoadImage() failed\n");
@@ -760,7 +780,6 @@
FullDllName,
BasePA,
DataTableEntry);
-
if (!Status)
{
ERR("WinLdrAllocateDataTableEntry() failed with Status=0x%X\n", Status);
@@ -771,7 +790,6 @@
TRACE("WinLdrScanImportDescriptorTable() calling ourselves for %S\n",
VaToPa((*DataTableEntry)->BaseDllName.Buffer));
Status = WinLdrScanImportDescriptorTable(ModuleListHead, DirectoryPath, *DataTableEntry);
-
if (!Status)
{
ERR("WinLdrScanImportDescriptorTable() failed with Status=0x%X\n", Status);
@@ -785,7 +803,8 @@
WinLdrpScanImportAddressTable(IN OUT PLIST_ENTRY ModuleListHead,
IN PVOID DllBase,
IN PVOID ImageBase,
- IN PIMAGE_THUNK_DATA ThunkData)
+ IN PIMAGE_THUNK_DATA ThunkData,
+ IN PCSTR DirectoryPath)
{
PIMAGE_EXPORT_DIRECTORY ExportDirectory = NULL;
BOOLEAN Status;
@@ -829,7 +848,8 @@
ThunkData,
ExportDirectory,
ExportSize,
- FALSE);
+ FALSE,
+ DirectoryPath);
/* Move to the next entry */
ThunkData++;
Author: ekohl
Date: Sat Feb 23 18:52:13 2013
New Revision: 58358
URL: http://svn.reactos.org/svn/reactos?rev=58358&view=rev
Log:
[DESK]
Remove calls to SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE,... as it does not make sense to activate and deactivate screen savers when activating or deactivating the screen saver page. The screen saver should be activated when the user chooses a screen saver and it should be deactivated when the user chooses the "None" option.
CORE-6963#resolve
Modified:
trunk/reactos/dll/cpl/desk/screensaver.c
Modified: trunk/reactos/dll/cpl/desk/screensaver.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/screensaver.c…
==============================================================================
--- trunk/reactos/dll/cpl/desk/screensaver.c [iso-8859-1] (original)
+++ trunk/reactos/dll/cpl/desk/screensaver.c [iso-8859-1] Sat Feb 23 18:52:13 2013
@@ -758,16 +758,14 @@
case PSN_SETACTIVE:
{
- /* Activate screen saver support */
- SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, TRUE, 0, SPIF_SENDCHANGE);
+ /* Enable screensaver preview support */
SetScreenSaverPreviewBox(hwndDlg, pData);
break;
}
case PSN_KILLACTIVE:
{
- /* Disable screensaver support */
- SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, FALSE, 0, SPIF_SENDCHANGE);
+ /* Kill running preview screensaver */
if (pData->PrevWindowPi.hProcess)
{
TerminateProcess(pData->PrevWindowPi.hProcess, 0);