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

@ -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)
@ -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,
@ -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)
@ -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;
@ -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];
} }