sync with trunk r49322

svn path=/branches/cmake-bringup/; revision=49323
This commit is contained in:
Jérôme Gardou 2010-10-27 23:45:28 +00:00
commit ed8cab27c4
13 changed files with 2668 additions and 2683 deletions

View file

@ -1,61 +0,0 @@
NAME CLASSPNP.SYS
EXPORTS
ClassInitialize@12
ClassInitializeEx@12
ClassGetDescriptor@12
ClassReadDriveCapacity@4
ClassReleaseQueue@4
ClassAsynchronousCompletion@12
ClassSplitRequest@12
ClassDeviceControl@8
ClassIoComplete@12
ClassIoCompleteAssociated@12
ClassInterpretSenseInfo@28
ClassSendDeviceIoControlSynchronous@28
ClassSendIrpSynchronous@8
ClassForwardIrpSynchronous@8
ClassSendSrbSynchronous@20
ClassSendSrbAsynchronous@24
ClassBuildRequest@8
ClassModeSense@16
ClassFindModePage@16
ClassClaimDevice@8
ClassInternalIoControl@8
ClassCreateDeviceObject@20
ClassRemoveDevice@8
ClassInitializeSrbLookasideList@8
ClassDeleteSrbLookasideList@4
ClassQueryTimeOutRegistryValue@4
ClassInvalidateBusRelations@4
ClassMarkChildrenMissing@4
ClassMarkChildMissing@8
ClassDebugPrint
ClassGetDriverExtension@4
ClassCompleteRequest@12
ClassReleaseRemoveLock@8
ClassAcquireRemoveLockEx@16
ClassUpdateInformationInRegistry@20
ClassWmiCompleteRequest@20
ClassWmiFireEvent@20
ClassGetVpb@4
ClassSetFailurePredictionPoll@12
ClassNotifyFailurePredicted@32
ClassInitializeTestUnitPolling@8
ClassSignalCompletion@12
ClassSendStartUnit@4
ClassSetMediaChangeState@12
ClassResetMediaChangeTimer@4
ClassCheckMediaState@4
ClassInitializeMediaChangeDetection@8
ClassCleanupMediaChangeDetection@4
ClassEnableMediaChangeDetection@4
ClassDisableMediaChangeDetection@4
ClassSpinDownPowerHandler@8
ClassStopUnitPowerHandler@8
ClassAcquireChildLock@4
ClassReleaseChildLock@4
ClassScanForSpecial@12
ClassSetDeviceParameter@16
ClassGetDeviceParameter@16

View file

@ -0,0 +1,59 @@
@ stdcall ClassInitialize(ptr ptr ptr)
@ stdcall ClassInitializeEx(ptr ptr ptr)
@ stdcall ClassGetDescriptor(ptr ptr ptr)
@ stdcall ClassReadDriveCapacity(ptr)
@ stdcall ClassReleaseQueue(ptr)
@ stdcall ClassAsynchronousCompletion(ptr ptr ptr)
@ stdcall ClassSplitRequest(ptr ptr long)
@ stdcall ClassDeviceControl(ptr ptr)
@ stdcall ClassIoComplete(ptr ptr ptr)
@ stdcall ClassIoCompleteAssociated(ptr ptr ptr)
@ stdcall ClassInterpretSenseInfo(ptr ptr long long long ptr ptr)
@ stdcall ClassSendDeviceIoControlSynchronous(long ptr ptr long long long ptr)
@ stdcall ClassSendIrpSynchronous(ptr ptr)
@ stdcall ClassForwardIrpSynchronous(ptr ptr)
@ stdcall ClassSendSrbSynchronous(ptr ptr ptr long long)
@ stdcall ClassSendSrbAsynchronous(ptr ptr ptr ptr long long)
@ stdcall ClassBuildRequest(ptr ptr)
@ stdcall ClassModeSense(ptr ptr long long)
@ stdcall ClassFindModePage(ptr long long long)
@ stdcall ClassClaimDevice(ptr long)
@ stdcall ClassInternalIoControl(ptr ptr)
@ stdcall ClassCreateDeviceObject(ptr ptr ptr long ptr)
@ stdcall ClassRemoveDevice(ptr long)
@ stdcall ClassInitializeSrbLookasideList(ptr long)
@ stdcall ClassDeleteSrbLookasideList(ptr)
@ stdcall ClassQueryTimeOutRegistryValue(ptr)
@ stdcall ClassInvalidateBusRelations(ptr)
@ stdcall ClassMarkChildrenMissing(ptr)
@ stdcall ClassMarkChildMissing(ptr long)
@ varargs ClassDebugPrint(long long)
@ stdcall ClassGetDriverExtension(ptr)
@ stdcall ClassCompleteRequest(ptr ptr long)
@ stdcall ClassReleaseRemoveLock(ptr ptr)
@ stdcall ClassAcquireRemoveLockEx(ptr ptr ptr long)
@ stdcall ClassUpdateInformationInRegistry(ptr ptr long ptr long)
@ stdcall ClassWmiCompleteRequest(ptr ptr long long long)
@ stdcall ClassWmiFireEvent(ptr ptr long long ptr)
@ stdcall ClassGetVpb(ptr)
@ stdcall ClassSetFailurePredictionPoll(ptr long long)
@ stdcall ClassNotifyFailurePredicted(ptr ptr long long long long long long)
@ stdcall ClassInitializeTestUnitPolling(ptr long)
@ stdcall ClassSignalCompletion(ptr ptr ptr)
@ stdcall ClassSendStartUnit(ptr)
@ stdcall ClassSetMediaChangeState(ptr long long)
@ stdcall ClassResetMediaChangeTimer(ptr)
@ stdcall ClassCheckMediaState(ptr)
@ stdcall ClassInitializeMediaChangeDetection(ptr ptr)
@ stdcall ClassCleanupMediaChangeDetection(ptr)
@ stdcall ClassEnableMediaChangeDetection(ptr)
@ stdcall ClassDisableMediaChangeDetection(ptr)
@ stdcall ClassSpinDownPowerHandler(ptr ptr)
@ stdcall ClassStopUnitPowerHandler(ptr ptr)
@ stdcall ClassAcquireChildLock(ptr)
@ stdcall ClassReleaseChildLock(ptr)
@ stdcall ClassScanForSpecial(ptr ptr ptr)
@ stdcall ClassSetDeviceParameter(ptr ptr ptr long)
@ stdcall ClassGetDeviceParameter(ptr ptr ptr ptr)

View file

@ -64,6 +64,17 @@
typedef unsigned long POINTER_64_INT; typedef unsigned long POINTER_64_INT;
#endif #endif
#if 0 /* Not supported yet */
#define POINTER_SIGNED __sptr
#define POINTER_UNSIGNED __uptr
#else
#define POINTER_SIGNED
#define POINTER_UNSIGNED
#endif
#define SPOINTER_32 POINTER_SIGNED POINTER_32
#define UPOINTER_32 POINTER_UNSIGNED POINTER_32
#if defined(_WIN64) #if defined(_WIN64)
#define __int3264 __int64 #define __int3264 __int64
#define ADDRESS_TAG_BIT 0x40000000000UI64 #define ADDRESS_TAG_BIT 0x40000000000UI64

View file

@ -340,7 +340,6 @@ MMixerSetGetVolumeControlDetails(
if (Index >= VolumeData->ValuesCount) if (Index >= VolumeData->ValuesCount)
{ {
DPRINT1("Index %u out of bounds %u \n", Index, VolumeData->ValuesCount); DPRINT1("Index %u out of bounds %u \n", Index, VolumeData->ValuesCount);
DbgBreakPoint();
return MM_STATUS_INVALID_PARAMETER; return MM_STATUS_INVALID_PARAMETER;
} }

View file

@ -14,23 +14,23 @@ MMixerPrintTopology(
{ {
ULONG Index, SubIndex; ULONG Index, SubIndex;
DPRINT1("Num Pins %lu NumNodes %lu\n", Topology->TopologyPinsCount, Topology->TopologyNodesCount); DPRINT("Num Pins %lu NumNodes %lu\n", Topology->TopologyPinsCount, Topology->TopologyNodesCount);
for(Index = 0; Index < Topology->TopologyPinsCount; Index++) for(Index = 0; Index < Topology->TopologyPinsCount; Index++)
{ {
DPRINT1("PinId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu\n", Topology->TopologyPins[Index].PinId, DPRINT("PinId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu\n", Topology->TopologyPins[Index].PinId,
Topology->TopologyPins[Index].NodesConnectedFromCount, Topology->TopologyPins[Index].NodesConnectedToCount, Topology->TopologyPins[Index].Visited); Topology->TopologyPins[Index].NodesConnectedFromCount, Topology->TopologyPins[Index].NodesConnectedToCount, Topology->TopologyPins[Index].Visited);
for(SubIndex = 0; SubIndex < Topology->TopologyPins[Index].NodesConnectedFromCount; SubIndex++) for(SubIndex = 0; SubIndex < Topology->TopologyPins[Index].NodesConnectedFromCount; SubIndex++)
DPRINT1("NodesConnectedFrom Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedFrom[SubIndex]->NodeIndex); DPRINT("NodesConnectedFrom Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedFrom[SubIndex]->NodeIndex);
for(SubIndex = 0; SubIndex < Topology->TopologyPins[Index].NodesConnectedToCount; SubIndex++) for(SubIndex = 0; SubIndex < Topology->TopologyPins[Index].NodesConnectedToCount; SubIndex++)
DPRINT1("NodesConnectedTo Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedTo[SubIndex]->NodeIndex); DPRINT("NodesConnectedTo Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedTo[SubIndex]->NodeIndex);
} }
for(Index = 0; Index < Topology->TopologyNodesCount; Index++) for(Index = 0; Index < Topology->TopologyNodesCount; Index++)
{ {
DPRINT1("NodeId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu PinConnectedFromCount %lu PinConnectedToCount %lu\n", Topology->TopologyNodes[Index].NodeIndex, DPRINT("NodeId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu PinConnectedFromCount %lu PinConnectedToCount %lu\n", Topology->TopologyNodes[Index].NodeIndex,
Topology->TopologyNodes[Index].NodeConnectedFromCount, Topology->TopologyNodes[Index].NodeConnectedToCount, Topology->TopologyNodes[Index].Visited, Topology->TopologyNodes[Index].NodeConnectedFromCount, Topology->TopologyNodes[Index].NodeConnectedToCount, Topology->TopologyNodes[Index].Visited,
Topology->TopologyNodes[Index].PinConnectedFromCount, Topology->TopologyNodes[Index].PinConnectedToCount); Topology->TopologyNodes[Index].PinConnectedFromCount, Topology->TopologyNodes[Index].PinConnectedToCount);
} }

View file

@ -1731,4 +1731,15 @@ IoStartPacket(IN PDEVICE_OBJECT DeviceObject,
KeLowerIrql(OldIrql); KeLowerIrql(OldIrql);
} }
#if defined (_WIN64)
ULONG
NTAPI
IoWMIDeviceObjectToProviderId(
IN PDEVICE_OBJECT DeviceObject)
{
UNIMPLEMENTED;
return 0;
}
#endif
/* EOF */ /* EOF */

View file

@ -1816,3 +1816,14 @@ IoSetTopLevelIrp(IN PIRP Irp)
/* Set the IRP */ /* Set the IRP */
PsGetCurrentThread()->TopLevelIrp = (ULONG_PTR)Irp; PsGetCurrentThread()->TopLevelIrp = (ULONG_PTR)Irp;
} }
#if defined (_WIN64)
BOOLEAN
NTAPI
IoIs32bitProcess(
IN PIRP Irp OPTIONAL)
{
#pragma message IoIs32bitProcess is hardcoded to FALSE
return FALSE;
}
#endif

View file

@ -571,7 +571,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
if (KiI386PentiumLockErrataPresent) if (KiI386PentiumLockErrataPresent)
{ {
/* Mark the 1st IDT page as Write-Through to prevent a lockup /* Mark the 1st IDT page as Write-Through to prevent a lockup
on a FOOF instruction. on a F00F instruction.
See http://www.rcollins.org/Errata/Dec97/F00FBug.html */ See http://www.rcollins.org/Errata/Dec97/F00FBug.html */
PointerPte = MiAddressToPte(KeGetPcr()->IDT); PointerPte = MiAddressToPte(KeGetPcr()->IDT);
PointerPte->u.Hard.WriteThrough = 1; PointerPte->u.Hard.WriteThrough = 1;

View file

@ -77,6 +77,43 @@ MmProtectToPteMask[32] =
PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE, PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE,
}; };
const
ULONG MmProtectToValue[32] =
{
PAGE_NOACCESS,
PAGE_READONLY,
PAGE_EXECUTE,
PAGE_EXECUTE_READ,
PAGE_READWRITE,
PAGE_WRITECOPY,
PAGE_EXECUTE_READWRITE,
PAGE_EXECUTE_WRITECOPY,
PAGE_NOACCESS,
PAGE_NOCACHE | PAGE_READONLY,
PAGE_NOCACHE | PAGE_EXECUTE,
PAGE_NOCACHE | PAGE_EXECUTE_READ,
PAGE_NOCACHE | PAGE_READWRITE,
PAGE_NOCACHE | PAGE_WRITECOPY,
PAGE_NOCACHE | PAGE_EXECUTE_READWRITE,
PAGE_NOCACHE | PAGE_EXECUTE_WRITECOPY,
PAGE_NOACCESS,
PAGE_GUARD | PAGE_READONLY,
PAGE_GUARD | PAGE_EXECUTE,
PAGE_GUARD | PAGE_EXECUTE_READ,
PAGE_GUARD | PAGE_READWRITE,
PAGE_GUARD | PAGE_WRITECOPY,
PAGE_GUARD | PAGE_EXECUTE_READWRITE,
PAGE_GUARD | PAGE_EXECUTE_WRITECOPY,
PAGE_NOACCESS,
PAGE_WRITECOMBINE | PAGE_READONLY,
PAGE_WRITECOMBINE | PAGE_EXECUTE,
PAGE_WRITECOMBINE | PAGE_EXECUTE_READ,
PAGE_WRITECOMBINE | PAGE_READWRITE,
PAGE_WRITECOMBINE | PAGE_WRITECOPY,
PAGE_WRITECOMBINE | PAGE_EXECUTE_READWRITE,
PAGE_WRITECOMBINE | PAGE_EXECUTE_WRITECOPY
};
/* PRIVATE FUNCTIONS *******************************************************/ /* PRIVATE FUNCTIONS *******************************************************/
BOOLEAN BOOLEAN
@ -418,8 +455,8 @@ MmDeleteVirtualMapping(
{ {
Pfn = OldPte.u.Hard.PageFrameNumber; Pfn = OldPte.u.Hard.PageFrameNumber;
if (FreePage) //if (FreePage)
MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn); //MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn);
} }
else else
Pfn = 0; Pfn = 0;

View file

@ -454,6 +454,7 @@
@ stdcall IoInitializeTimer(ptr ptr ptr) @ stdcall IoInitializeTimer(ptr ptr ptr)
@ stdcall IoInvalidateDeviceRelations(ptr long) @ stdcall IoInvalidateDeviceRelations(ptr long)
@ stdcall IoInvalidateDeviceState(ptr) @ stdcall IoInvalidateDeviceState(ptr)
@ stdcall -arch=x86_64 IoIs32bitProcess(ptr)
@ stdcall IoIsFileOriginRemote(ptr) @ stdcall IoIsFileOriginRemote(ptr)
@ stdcall IoIsOperationSynchronous(ptr) @ stdcall IoIsOperationSynchronous(ptr)
@ stdcall IoIsSystemThread(ptr) @ stdcall IoIsSystemThread(ptr)
@ -533,6 +534,7 @@
@ stdcall IoVolumeDeviceToDosName(ptr ptr) @ stdcall IoVolumeDeviceToDosName(ptr ptr)
@ stdcall IoWMIAllocateInstanceIds(ptr long ptr) @ stdcall IoWMIAllocateInstanceIds(ptr long ptr)
@ stdcall IoWMIDeviceObjectToInstanceName(ptr ptr ptr) @ stdcall IoWMIDeviceObjectToInstanceName(ptr ptr ptr)
@ stdcall -arch=x86_64 IoWMIDeviceObjectToProviderId(ptr)
@ stdcall IoWMIExecuteMethod(ptr ptr long long ptr ptr) @ stdcall IoWMIExecuteMethod(ptr ptr long long ptr ptr)
@ stdcall IoWMIHandleToInstanceName(ptr ptr ptr) @ stdcall IoWMIHandleToInstanceName(ptr ptr ptr)
@ stdcall IoWMIOpenBlock(ptr long ptr) @ stdcall IoWMIOpenBlock(ptr long ptr)

View file

@ -941,6 +941,12 @@ W32kKeyProcessMessage(LPMSG Msg,
VscVkTable = KeyboardLayout->pVSCtoVK_E1; VscVkTable = KeyboardLayout->pVSCtoVK_E1;
} }
if (!VscVkTable)
{
DPRINT1("somethings wrong, Prefix=0x%x", Prefix);
return;
}
RawVk = 0xff; RawVk = 0xff;
while (VscVkTable->Vsc) while (VscVkTable->Vsc)
{ {

View file

@ -1,12 +1,12 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* PURPOSE: Messages * PURPOSE: Messages
* FILE: subsys/win32k/ntuser/message.c * FILE: subsys/win32k/ntuser/message.c
* PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
* REVISION HISTORY: * REVISION HISTORY:
* 06-06-2001 CSH Created * 06-06-2001 CSH Created
*/ */
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
@ -55,7 +55,7 @@ typedef struct tagMSGMEMORY
MSGMEMORY, *PMSGMEMORY; MSGMEMORY, *PMSGMEMORY;
static MSGMEMORY MsgMemory[] = static MSGMEMORY MsgMemory[] =
{ {
{ WM_CREATE, MMS_SIZE_SPECIAL, MMS_FLAG_READWRITE }, { WM_CREATE, MMS_SIZE_SPECIAL, MMS_FLAG_READWRITE },
{ WM_DDE_ACK, sizeof(KMDDELPARAM), MMS_FLAG_READ }, { WM_DDE_ACK, sizeof(KMDDELPARAM), MMS_FLAG_READ },
{ WM_DDE_EXECUTE, MMS_SIZE_WPARAM, MMS_FLAG_READ }, { WM_DDE_EXECUTE, MMS_SIZE_WPARAM, MMS_FLAG_READ },
@ -69,7 +69,7 @@ static MSGMEMORY MsgMemory[] =
{ WM_COPYDATA, MMS_SIZE_SPECIAL, MMS_FLAG_READ }, { WM_COPYDATA, MMS_SIZE_SPECIAL, MMS_FLAG_READ },
{ WM_WINDOWPOSCHANGED, sizeof(WINDOWPOS), MMS_FLAG_READ }, { WM_WINDOWPOSCHANGED, sizeof(WINDOWPOS), MMS_FLAG_READ },
{ WM_WINDOWPOSCHANGING, sizeof(WINDOWPOS), MMS_FLAG_READWRITE }, { WM_WINDOWPOSCHANGING, sizeof(WINDOWPOS), MMS_FLAG_READWRITE },
}; };
static PMSGMEMORY FASTCALL static PMSGMEMORY FASTCALL
FindMsgMemory(UINT Msg) FindMsgMemory(UINT Msg)
@ -323,11 +323,8 @@ UnpackParam(LPARAM lParamPacked, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL No
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
static static VOID FASTCALL
VOID IntCallWndProc( PWND Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
FASTCALL
IntCallWndProc
( PWND Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{ {
BOOL SameThread = FALSE; BOOL SameThread = FALSE;
CWPSTRUCT CWP; CWPSTRUCT CWP;
@ -342,11 +339,8 @@ IntCallWndProc
co_HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, SameThread, (LPARAM)&CWP ); co_HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, SameThread, (LPARAM)&CWP );
} }
static static VOID FASTCALL
VOID IntCallWndProcRet ( PWND Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *uResult)
FASTCALL
IntCallWndProcRet
( PWND Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *uResult)
{ {
BOOL SameThread = FALSE; BOOL SameThread = FALSE;
CWPRETSTRUCT CWPR; CWPRETSTRUCT CWPR;
@ -362,8 +356,7 @@ IntCallWndProcRet
co_HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, SameThread, (LPARAM)&CWPR ); co_HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, SameThread, (LPARAM)&CWPR );
} }
LRESULT LRESULT FASTCALL
FASTCALL
IntDispatchMessage(PMSG pMsg) IntDispatchMessage(PMSG pMsg)
{ {
LARGE_INTEGER TickCount; LARGE_INTEGER TickCount;
@ -517,8 +510,7 @@ co_IntSendHitTestMessages(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg)
} }
BOOL FASTCALL BOOL FASTCALL
co_IntActivateWindowMouse( co_IntActivateWindowMouse( PUSER_MESSAGE_QUEUE ThreadQueue,
PUSER_MESSAGE_QUEUE ThreadQueue,
LPMSG Msg, LPMSG Msg,
PWND MsgWindow, PWND MsgWindow,
USHORT *HitTest) USHORT *HitTest)
@ -562,8 +554,7 @@ co_IntActivateWindowMouse(
} }
BOOL FASTCALL BOOL FASTCALL
co_IntTranslateMouseMessage( co_IntTranslateMouseMessage( PUSER_MESSAGE_QUEUE ThreadQueue,
PUSER_MESSAGE_QUEUE ThreadQueue,
LPMSG Msg, LPMSG Msg,
USHORT *HitTest, USHORT *HitTest,
BOOL Remove) BOOL Remove)
@ -632,7 +623,7 @@ co_IntTranslateMouseMessage(
} }
if ( gspv.bMouseClickLock && if ( gspv.bMouseClickLock &&
( (Msg->message == WM_LBUTTONUP) || ((Msg->message == WM_LBUTTONUP) ||
(Msg->message == WM_LBUTTONDOWN) ) ) (Msg->message == WM_LBUTTONDOWN) ) )
{ {
if (MsqIsClkLck(Msg, Remove)) if (MsqIsClkLck(Msg, Remove))
@ -845,8 +836,8 @@ BOOL ProcessHardwareMessage(MSG* Msg, BOOLEAN RemoveMessages)
return TRUE; return TRUE;
} }
/* /*
* Internal version of PeekMessage() doing all the work * Internal version of PeekMessage() doing all the work
*/ */
BOOL FASTCALL BOOL FASTCALL
co_IntPeekMessage( PUSER_MESSAGE Msg, co_IntPeekMessage( PUSER_MESSAGE Msg,
PWND Window, PWND Window,
@ -871,8 +862,7 @@ co_IntPeekMessage( PUSER_MESSAGE Msg,
ThreadQueue->LastMsgRead = LargeTickCount.u.LowPart; ThreadQueue->LastMsgRead = LargeTickCount.u.LowPart;
/* Dispatch sent messages here. */ /* Dispatch sent messages here. */
while (co_MsqDispatchOneSentMessage(ThreadQueue)) while (co_MsqDispatchOneSentMessage(ThreadQueue)) ;
;
/* Now look for a quit message. */ /* Now look for a quit message. */
@ -1108,8 +1098,7 @@ co_IntGetPeekMessage( PMSG pMsg,
PWND Window; PWND Window;
USER_MESSAGE Msg; USER_MESSAGE Msg;
if ( hWnd == HWND_TOPMOST || if ( hWnd == HWND_TOPMOST || hWnd == HWND_BROADCAST )
hWnd == HWND_BROADCAST )
hWnd = HWND_BOTTOM; hWnd = HWND_BOTTOM;
/* Validate input */ /* Validate input */
@ -1241,11 +1230,12 @@ UserPostMessage( HWND Wnd,
} }
if (!Wnd) if (!Wnd)
{
return UserPostThreadMessage( PtrToInt(PsGetCurrentThreadId()), return UserPostThreadMessage( PtrToInt(PsGetCurrentThreadId()),
Msg, Msg,
wParam, wParam,
lParam); lParam);
}
if (Wnd == HWND_BROADCAST) if (Wnd == HWND_BROADCAST)
{ {
HWND *List; HWND *List;
@ -1259,7 +1249,9 @@ UserPostMessage( HWND Wnd,
{ {
UserPostMessage(DesktopWindow->head.h, Msg, wParam, lParam); UserPostMessage(DesktopWindow->head.h, Msg, wParam, lParam);
for (i = 0; List[i]; i++) for (i = 0; List[i]; i++)
{
UserPostMessage(List[i], Msg, wParam, lParam); UserPostMessage(List[i], Msg, wParam, lParam);
}
ExFreePool(List); ExFreePool(List);
} }
} }
@ -1321,8 +1313,7 @@ co_IntSendMessage( HWND hWnd,
return 0; return 0;
} }
static static LRESULT FASTCALL
LRESULT FASTCALL
co_IntSendMessageTimeoutSingle( HWND hWnd, co_IntSendMessageTimeoutSingle( HWND hWnd,
UINT Msg, UINT Msg,
WPARAM wParam, WPARAM wParam,
@ -1437,14 +1428,14 @@ co_IntSendMessageTimeoutSingle( HWND hWnd,
if (STATUS_TIMEOUT == Status) if (STATUS_TIMEOUT == Status)
{ {
/* /*
MSDN says: MSDN says:
Microsoft Windows 2000: If GetLastError returns zero, then the function Microsoft Windows 2000: If GetLastError returns zero, then the function
timed out. timed out.
XP+ : If the function fails or times out, the return value is zero. XP+ : If the function fails or times out, the return value is zero.
To get extended error information, call GetLastError. If GetLastError To get extended error information, call GetLastError. If GetLastError
returns ERROR_TIMEOUT, then the function timed out. returns ERROR_TIMEOUT, then the function timed out.
*/ */
SetLastWin32Error(ERROR_TIMEOUT); SetLastWin32Error(ERROR_TIMEOUT);
RETURN( FALSE); RETURN( FALSE);
} }
@ -1505,7 +1496,8 @@ co_IntSendMessageTimeout( HWND hWnd,
return (LRESULT) TRUE; return (LRESULT) TRUE;
} }
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, LRESULT FASTCALL
co_IntSendMessageNoWait(HWND hWnd,
UINT Msg, UINT Msg,
WPARAM wParam, WPARAM wParam,
LPARAM lParam) LPARAM lParam)
@ -1647,8 +1639,8 @@ CLEANUP:
} }
/* This function posts a message if the destination's message queue belongs to /* This function posts a message if the destination's message queue belongs to
another thread, otherwise it sends the message. It does not support broadcast another thread, otherwise it sends the message. It does not support broadcast
messages! */ messages! */
LRESULT FASTCALL LRESULT FASTCALL
co_IntPostOrSendMessage( HWND hWnd, co_IntPostOrSendMessage( HWND hWnd,
UINT Msg, UINT Msg,
@ -1739,8 +1731,7 @@ co_IntDoSendMessage( HWND hWnd,
/* Gather the information usermode needs to call the window proc directly */ /* Gather the information usermode needs to call the window proc directly */
Info.HandledByKernel = FALSE; Info.HandledByKernel = FALSE;
Status = MmCopyFromCaller(&(Info.Ansi), &(UnsafeInfo->Ansi), Status = MmCopyFromCaller(&(Info.Ansi), &(UnsafeInfo->Ansi), sizeof(BOOL));
sizeof(BOOL));
if (! NT_SUCCESS(Status)) if (! NT_SUCCESS(Status))
{ {
Info.Ansi = ! Window->Unicode; Info.Ansi = ! Window->Unicode;
@ -1752,10 +1743,10 @@ co_IntDoSendMessage( HWND hWnd,
else else
{ {
/* Must be handled by other thread */ /* Must be handled by other thread */
// if (HWND_BROADCAST != hWnd) // if (HWND_BROADCAST != hWnd)
// { // {
// UserDereferenceObject(Window); // UserDereferenceObject(Window);
// } // }
Info.HandledByKernel = TRUE; Info.HandledByKernel = TRUE;
UserModeMsg.hwnd = hWnd; UserModeMsg.hwnd = hWnd;
UserModeMsg.message = Msg; UserModeMsg.message = Msg;
@ -2059,15 +2050,15 @@ NtUserGetMessage( PNTUSERGETMESSAGEINFO UnsafeInfo,
UINT MsgFilterMin, UINT MsgFilterMin,
UINT MsgFilterMax ) UINT MsgFilterMax )
/* /*
* FUNCTION: Get a message from the calling thread's message queue. * FUNCTION: Get a message from the calling thread's message queue.
* ARGUMENTS: * ARGUMENTS:
* UnsafeMsg - Pointer to the structure which receives the returned message. * UnsafeMsg - Pointer to the structure which receives the returned message.
* Wnd - Window whose messages are to be retrieved. * Wnd - Window whose messages are to be retrieved.
* MsgFilterMin - Integer value of the lowest message value to be * MsgFilterMin - Integer value of the lowest message value to be
* retrieved. * retrieved.
* MsgFilterMax - Integer value of the highest message value to be * MsgFilterMax - Integer value of the highest message value to be
* retrieved. * retrieved.
*/ */
{ {
BOOL GotMessage; BOOL GotMessage;
NTUSERGETMESSAGEINFO Info; NTUSERGETMESSAGEINFO Info;
@ -2079,7 +2070,7 @@ NtUserGetMessage( PNTUSERGETMESSAGEINFO UnsafeInfo,
UINT Size; UINT Size;
USER_MESSAGE Msg; USER_MESSAGE Msg;
DECLARE_RETURN(BOOL); DECLARE_RETURN(BOOL);
// USER_REFERENCE_ENTRY Ref; // USER_REFERENCE_ENTRY Ref;
DPRINT("Enter NtUserGetMessage\n"); DPRINT("Enter NtUserGetMessage\n");
UserEnterExclusive(); UserEnterExclusive();
@ -2090,7 +2081,7 @@ NtUserGetMessage( PNTUSERGETMESSAGEINFO UnsafeInfo,
RETURN(-1); RETURN(-1);
} }
// if (Window) UserRefObjectCo(Window, &Ref); // if (Window) UserRefObjectCo(Window, &Ref);
if (MsgFilterMax < MsgFilterMin) if (MsgFilterMax < MsgFilterMin)
{ {
@ -2155,7 +2146,7 @@ NtUserGetMessage( PNTUSERGETMESSAGEINFO UnsafeInfo,
RETURN( WM_QUIT != Info.Msg.message); RETURN( WM_QUIT != Info.Msg.message);
CLEANUP: CLEANUP:
// if (Window) UserDerefObjectCo(Window); // if (Window) UserDerefObjectCo(Window);
DPRINT("Leave NtUserGetMessage\n"); DPRINT("Leave NtUserGetMessage\n");
UserLeave(); UserLeave();
@ -2163,10 +2154,8 @@ CLEANUP:
} }
BOOL BOOL APIENTRY
APIENTRY NtUserGetMessageX(PMSG pMsg,
NtUserGetMessageX(
PMSG pMsg,
HWND hWnd, HWND hWnd,
UINT MsgFilterMin, UINT MsgFilterMin,
UINT MsgFilterMax) UINT MsgFilterMax)
@ -2306,10 +2295,8 @@ CLEANUP:
END_CLEANUP; END_CLEANUP;
} }
BOOL BOOL APIENTRY
APIENTRY NtUserPeekMessageX( PMSG pMsg,
NtUserPeekMessageX(
PMSG pMsg,
HWND hWnd, HWND hWnd,
UINT MsgFilterMin, UINT MsgFilterMin,
UINT MsgFilterMax, UINT MsgFilterMax,
@ -2354,11 +2341,8 @@ CLEANUP:
END_CLEANUP; END_CLEANUP;
} }
BOOL BOOL APIENTRY
APIENTRY NtUserCallMsgFilter( LPMSG lpmsg, INT code)
NtUserCallMsgFilter(
LPMSG lpmsg,
INT code)
{ {
BOOL BadChk = FALSE, Ret = FALSE; BOOL BadChk = FALSE, Ret = FALSE;
MSG Msg; MSG Msg;
@ -2370,12 +2354,8 @@ NtUserCallMsgFilter(
{ {
_SEH2_TRY _SEH2_TRY
{ {
ProbeForRead((PVOID)lpmsg, ProbeForRead(lpmsg, sizeof(MSG), 1);
sizeof(MSG), RtlCopyMemory( &Msg, lpmsg, sizeof(MSG));
1);
RtlCopyMemory( &Msg,
(PVOID)lpmsg,
sizeof(MSG));
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -2399,12 +2379,8 @@ NtUserCallMsgFilter(
_SEH2_TRY _SEH2_TRY
{ {
ProbeForWrite((PVOID)lpmsg, ProbeForWrite(lpmsg, sizeof(MSG), 1);
sizeof(MSG), RtlCopyMemory(lpmsg, &Msg, sizeof(MSG));
1);
RtlCopyMemory((PVOID)lpmsg,
&Msg,
sizeof(MSG));
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -2448,8 +2424,7 @@ NtUserDispatchMessage(PMSG UnsafeMsgInfo)
BOOL APIENTRY BOOL APIENTRY
NtUserTranslateMessage(LPMSG lpMsg, NtUserTranslateMessage(LPMSG lpMsg, UINT flags)
UINT flags)
{ {
NTSTATUS Status; NTSTATUS Status;
MSG SafeMsg; MSG SafeMsg;
@ -2474,8 +2449,7 @@ CLEANUP:
} }
BOOL APIENTRY BOOL APIENTRY
NtUserMessageCall( NtUserMessageCall( HWND hWnd,
HWND hWnd,
UINT Msg, UINT Msg,
WPARAM wParam, WPARAM wParam,
LPARAM lParam, LPARAM lParam,
@ -2492,18 +2466,23 @@ NtUserMessageCall(
UserEnterExclusive(); UserEnterExclusive();
/* Validate input */ /* Validate input */
if (hWnd && (hWnd != INVALID_HANDLE_VALUE) && !(Window = UserGetWindowObject(hWnd))) if (hWnd && (hWnd != INVALID_HANDLE_VALUE))
{
Window = UserGetWindowObject(hWnd);
if (!Window)
{ {
UserLeave(); UserLeave();
return FALSE; return FALSE;
} }
}
switch(dwType) switch(dwType)
{ {
case FNID_DEFWINDOWPROC: case FNID_DEFWINDOWPROC:
UserRefObjectCo(Window, &Ref); if (Window) UserRefObjectCo(Window, &Ref);
lResult = IntDefWindowProc(Window, Msg, wParam, lParam, Ansi); lResult = IntDefWindowProc(Window, Msg, wParam, lParam, Ansi);
Ret = TRUE; Ret = TRUE;
UserDerefObjectCo(Window); if (Window) UserDerefObjectCo(Window);
break; break;
case FNID_SENDNOTIFYMESSAGE: case FNID_SENDNOTIFYMESSAGE:
Ret = UserSendNotifyMessage(hWnd, Msg, wParam, lParam); Ret = UserSendNotifyMessage(hWnd, Msg, wParam, lParam);
@ -2517,9 +2496,7 @@ NtUserMessageCall(
{ {
_SEH2_TRY _SEH2_TRY
{ {
ProbeForWrite((PVOID)ResultInfo, ProbeForWrite((PVOID)ResultInfo, sizeof(BROADCASTPARM), 1);
sizeof(BROADCASTPARM),
1);
RtlCopyMemory(&parm, (PVOID)ResultInfo, sizeof(BROADCASTPARM)); RtlCopyMemory(&parm, (PVOID)ResultInfo, sizeof(BROADCASTPARM));
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
@ -2699,8 +2676,7 @@ NtUserMessageCall(
DWORD DWORD
APIENTRY APIENTRY
NtUserWaitForInputIdle( NtUserWaitForInputIdle( IN HANDLE hProcess,
IN HANDLE hProcess,
IN DWORD dwMilliseconds, IN DWORD dwMilliseconds,
IN BOOL Unknown2) IN BOOL Unknown2)
{ {

View file

@ -1,21 +1,4 @@
/* /*
* ReactOS W32 Subsystem
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 ReactOS Team
*
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* PURPOSE: Monitor support * PURPOSE: Monitor support
@ -64,16 +47,6 @@ CleanupMonitorImpl()
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/
#ifndef MIN
# define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#ifndef MAX
# define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
#ifndef ABS
# define ABS(a) ((a) < (0) ? (-(a)) : (a))
#endif
/* IntCreateMonitorObject /* IntCreateMonitorObject
* *
* Creates a MONITOR * Creates a MONITOR
@ -130,7 +103,6 @@ UserGetMonitorObject(IN HMONITOR hMonitor)
return NULL; return NULL;
} }
Monitor = (PMONITOR)UserGetObject(gHandleTable, hMonitor, otMonitor); Monitor = (PMONITOR)UserGetObject(gHandleTable, hMonitor, otMonitor);
if (!Monitor) if (!Monitor)
{ {
@ -336,9 +308,9 @@ IntGetMonitorsFromRect(OPTIONAL IN LPCRECTL pRect,
{ {
PMONITOR Monitor, NearestMonitor = NULL, PrimaryMonitor = NULL; PMONITOR Monitor, NearestMonitor = NULL, PrimaryMonitor = NULL;
UINT iCount = 0; UINT iCount = 0;
LONG iNearestDistanceX = 0x7fffffff, iNearestDistanceY = 0x7fffffff; ULONG iNearestDistance = 0xffffffff;
/* find monitors which intersect the rectangle */ /* Find monitors which intersect the rectangle */
for (Monitor = gMonitorList; Monitor != NULL; Monitor = Monitor->Next) for (Monitor = gMonitorList; Monitor != NULL; Monitor = Monitor->Next)
{ {
RECTL MonitorRect, IntersectionRect; RECTL MonitorRect, IntersectionRect;
@ -355,49 +327,42 @@ IntGetMonitorsFromRect(OPTIONAL IN LPCRECTL pRect,
PrimaryMonitor = Monitor; PrimaryMonitor = Monitor;
} }
if (pRect != NULL) /* Check if a rect is given */
if (pRect == NULL)
{ {
BOOL intersects = TRUE; /* No rect given, so use the full monitor rect */
IntersectionRect = MonitorRect;
/* check if the rect intersects the monitor */
if ((pRect->right < MonitorRect.left) || (pRect->left > MonitorRect.right) ||
(pRect->bottom < MonitorRect.top) || (pRect->top > MonitorRect.bottom))
{
intersects = FALSE;
} }
if (flags == MONITOR_DEFAULTTONEAREST && !intersects) /* We have a rect, calculate intersection */
else if (!RECTL_bIntersectRect(&IntersectionRect, &MonitorRect, pRect))
{ {
INT distanceX, distanceY; /* Rects did not intersect */
if (flags == MONITOR_DEFAULTTONEAREST)
distanceX = MIN(ABS(MonitorRect.left - pRect->right),
ABS(pRect->left - MonitorRect.right));
distanceY = MIN(ABS(MonitorRect.top - pRect->bottom),
ABS(pRect->top - MonitorRect.bottom));
if (((distanceX < iNearestDistanceX) && (distanceY <= iNearestDistanceY)) ||
((distanceX <= iNearestDistanceX) && (distanceY < iNearestDistanceY)))
{ {
iNearestDistanceX = distanceX; ULONG cx, cy, iDistance;
iNearestDistanceY = distanceY;
/* Get x and y distance */
cx = min(abs(MonitorRect.left - pRect->right),
abs(pRect->left - MonitorRect.right));
cy = min(abs(MonitorRect.top - pRect->bottom),
abs(pRect->top - MonitorRect.bottom));
/* Calculate distance square */
iDistance = cx * cx + cy * cy;
/* Check if this is the new nearest monitor */
if (iDistance < iNearestDistance)
{
iNearestDistance = iDistance;
NearestMonitor = Monitor; NearestMonitor = Monitor;
} }
} }
if (!intersects)
continue; continue;
/* calculate intersection */
IntersectionRect.left = MAX(MonitorRect.left, pRect->left);
IntersectionRect.top = MAX(MonitorRect.top, pRect->top);
IntersectionRect.right = MIN(MonitorRect.right, pRect->right);
IntersectionRect.bottom = MIN(MonitorRect.bottom, pRect->bottom);
}
else
{
IntersectionRect = MonitorRect;
} }
/* Check if there's space in the buffer */
if (iCount < listSize) if (iCount < listSize)
{ {
if (hMonitorList != NULL) if (hMonitorList != NULL)
@ -405,27 +370,30 @@ IntGetMonitorsFromRect(OPTIONAL IN LPCRECTL pRect,
if (monitorRectList != NULL) if (monitorRectList != NULL)
monitorRectList[iCount] = IntersectionRect; monitorRectList[iCount] = IntersectionRect;
} }
/* Increase count of found monitors */
iCount++; iCount++;
} }
if (iCount == 0 && flags == MONITOR_DEFAULTTONEAREST) /* Found nothing intersecting? */
if (iCount == 0)
{ {
if (iCount < listSize) /* Check if we shall default to the nearest monitor */
if (flags == MONITOR_DEFAULTTONEAREST && NearestMonitor)
{ {
if (hMonitorList != NULL) if (hMonitorList && listSize > 0)
hMonitorList[iCount] = UserHMGetHandle(NearestMonitor); hMonitorList[iCount] = UserHMGetHandle(NearestMonitor);
}
iCount++; iCount++;
} }
else if (iCount == 0 && flags == MONITOR_DEFAULTTOPRIMARY) /* Check if we shall default to the primary monitor */
else if (flags == MONITOR_DEFAULTTOPRIMARY && PrimaryMonitor)
{ {
if (iCount < listSize) if (hMonitorList != NULL && listSize > 0)
{
if (hMonitorList != NULL)
hMonitorList[iCount] = UserHMGetHandle(PrimaryMonitor); hMonitorList[iCount] = UserHMGetHandle(PrimaryMonitor);
}
iCount++; iCount++;
} }
}
return iCount; return iCount;
} }
@ -513,7 +481,8 @@ NtUserEnumDisplayMonitors(
if (regionType == NULLREGION) if (regionType == NULLREGION)
return 0; return 0;
if (regionType == COMPLEXREGION) if (regionType == COMPLEXREGION)
{ /* TODO: warning */ {
/* TODO: warning */
} }
/* if hDC and pRect are given the area of interest is pRect with /* if hDC and pRect are given the area of interest is pRect with
@ -736,34 +705,19 @@ NtUserMonitorFromPoint(
RECTL InRect; RECTL InRect;
HMONITOR hMonitor = NULL; HMONITOR hMonitor = NULL;
/* fill inRect */ /* fill inRect (bottom-right exclusive) */
InRect.left = InRect.right = point.x; InRect.left = point.x;
InRect.top = InRect.bottom = point.y; InRect.right = point.x + 1;
InRect.top = point.y;
InRect.bottom = point.y + 1;
/* find intersecting monitor */ /* find intersecting monitor */
NumMonitors = IntGetMonitorsFromRect(&InRect, &hMonitor, NULL, 1, 0); NumMonitors = IntGetMonitorsFromRect(&InRect, &hMonitor, NULL, 1, dwFlags);
if (NumMonitors < 0) if (NumMonitors < 0)
{ {
return (HMONITOR)NULL; return (HMONITOR)NULL;
} }
if (hMonitor == NULL)
{
if (dwFlags == MONITOR_DEFAULTTOPRIMARY)
{
PMONITOR MonitorObj = IntGetPrimaryMonitor();
if (MonitorObj)
hMonitor = UserHMGetHandle(MonitorObj);
}
else if (dwFlags == MONITOR_DEFAULTTONEAREST)
{
NumMonitors = IntGetMonitorsFromRect(&InRect, &hMonitor, NULL,
1, MONITOR_DEFAULTTONEAREST);
/*ASSERT( (numMonitors > 0) && (hMonitor != NULL) );*/
}
/* else flag is DEFAULTTONULL */
}
return hMonitor; return hMonitor;
} }
@ -790,7 +744,7 @@ NtUserMonitorFromRect(
IN LPCRECTL pRect, IN LPCRECTL pRect,
IN DWORD dwFlags) IN DWORD dwFlags)
{ {
INT numMonitors, iLargestArea = -1, i; ULONG numMonitors, iLargestArea = 0, i;
PRECTL rectList; PRECTL rectList;
HMONITOR *hMonitorList; HMONITOR *hMonitorList;
HMONITOR hMonitor = NULL; HMONITOR hMonitor = NULL;
@ -806,44 +760,24 @@ NtUserMonitorFromRect(
} }
/* find intersecting monitors */ /* find intersecting monitors */
numMonitors = IntGetMonitorsFromRect(&rect, NULL, NULL, 0, 0); numMonitors = IntGetMonitorsFromRect(&rect, &hMonitor, NULL, 1, dwFlags);
if (numMonitors < 0) if (numMonitors <= 1)
{ {
return (HMONITOR)NULL;
}
if (numMonitors == 0)
{
if (dwFlags == MONITOR_DEFAULTTOPRIMARY)
{
PMONITOR monitorObj = IntGetPrimaryMonitor();
if (monitorObj)
return UserHMGetHandle(monitorObj);
}
else if (dwFlags == MONITOR_DEFAULTTONEAREST)
{
numMonitors = IntGetMonitorsFromRect(&rect, &hMonitor, NULL,
1, MONITOR_DEFAULTTONEAREST);
if (numMonitors <= 0)
{
/* error? */
return (HMONITOR)NULL;
}
if (numMonitors > 0)
return hMonitor; return hMonitor;
} }
/* else flag is DEFAULTTONULL */
return (HMONITOR)NULL;
}
hMonitorList = ExAllocatePoolWithTag(PagedPool, sizeof (HMONITOR) * numMonitors, USERTAG_MONITORRECTS); hMonitorList = ExAllocatePoolWithTag(PagedPool,
sizeof(HMONITOR) * numMonitors,
USERTAG_MONITORRECTS);
if (hMonitorList == NULL) if (hMonitorList == NULL)
{ {
/* FIXME: SetLastWin32Error? */ /* FIXME: SetLastWin32Error? */
return (HMONITOR)NULL; return (HMONITOR)NULL;
} }
rectList = ExAllocatePoolWithTag(PagedPool, sizeof (RECT) * numMonitors, USERTAG_MONITORRECTS);
rectList = ExAllocatePoolWithTag(PagedPool,
sizeof(RECT) * numMonitors,
USERTAG_MONITORRECTS);
if (rectList == NULL) if (rectList == NULL)
{ {
ExFreePoolWithTag(hMonitorList, USERTAG_MONITORRECTS); ExFreePoolWithTag(hMonitorList, USERTAG_MONITORRECTS);
@ -854,7 +788,7 @@ NtUserMonitorFromRect(
/* get intersecting monitors */ /* get intersecting monitors */
numMonitors = IntGetMonitorsFromRect(&rect, hMonitorList, rectList, numMonitors = IntGetMonitorsFromRect(&rect, hMonitorList, rectList,
numMonitors, 0); numMonitors, 0);
if (numMonitors <= 0) if (numMonitors == 0)
{ {
ExFreePoolWithTag(hMonitorList, USERTAG_MONITORRECTS); ExFreePoolWithTag(hMonitorList, USERTAG_MONITORRECTS);
ExFreePoolWithTag(rectList, USERTAG_MONITORRECTS); ExFreePoolWithTag(rectList, USERTAG_MONITORRECTS);
@ -864,9 +798,9 @@ NtUserMonitorFromRect(
/* find largest intersection */ /* find largest intersection */
for (i = 0; i < numMonitors; i++) for (i = 0; i < numMonitors; i++)
{ {
INT area = (rectList[i].right - rectList[i].left) * ULONG area = (rectList[i].right - rectList[i].left) *
(rectList[i].bottom - rectList[i].top); (rectList[i].bottom - rectList[i].top);
if (area > iLargestArea) if (area >= iLargestArea)
{ {
hMonitor = hMonitorList[i]; hMonitor = hMonitorList[i];
} }