BOOL FASTCALL
IntGetCursorLocation(PWINSTATION_OBJECT WinStaObject, POINT *loc)
{
- HDC hDC;
- PDC dc;
- GDIDEVICE *GDIDevice;
+ HDC hDC;
+ PDC dc;
+ GDIDEVICE *GDIDevice;
#if 1
- /* FIXME - get the screen dc from the window station or desktop */
- if (!(hDC = IntGetScreenDC()))
- return FALSE;
+ /* FIXME - get the screen dc from the window station or desktop */
+ if (!(hDC = IntGetScreenDC()))
+ return FALSE;
#endif
- if (!(dc = DC_LockDc(hDC)))
- return FALSE;
- GDIDevice = (GDIDEVICE *)dc->GDIDevice;
- DC_UnlockDc(dc);
+ if (!(dc = DC_LockDc(hDC)))
+ return FALSE;
+ GDIDevice = (GDIDEVICE *)dc->GDIDevice;
+ DC_UnlockDc(dc);
- loc->x = GDIDevice->Pointer.Pos.x;
- loc->y = GDIDevice->Pointer.Pos.y;
+ loc->x = GDIDevice->Pointer.Pos.x;
+ loc->y = GDIDevice->Pointer.Pos.y;
- return TRUE;
+ return TRUE;
}
SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
return NULL;
}
-
+
ASSERT(USER_BODY_TO_HEADER(Window)->RefCount >= 0);
return Window;
}
if (ci)
{
ASSERT(USER_BODY_TO_HEADER(ci)->RefCount >= 0);
-
+
USER_BODY_TO_HEADER(ci)->RefCount++;
}
return ci;
#define COLORCURSORS_ALLOWED FALSE
HCURSOR FASTCALL
IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor,
- BOOL ForceChange)
+ BOOL ForceChange)
{
BITMAPOBJ *BitmapObj;
SURFOBJ *SurfObj;
{
if(!(Screen = IntGetScreenDC()))
{
- return (HCURSOR)0;
+ return (HCURSOR)0;
}
/* FIXME use the desktop's HDC instead of using ScreenDeviceContext */
PDC dc = DC_LockDc(Screen);
BitmapObj = BITMAPOBJ_LockBitmap(dcbmp);
if ( !BitmapObj )
- return (HCURSOR)0;
+ return (HCURSOR)0;
SurfObj = &BitmapObj->SurfObj;
ASSERT(SurfObj);
}
}
if ((DevInfo->flGraphicsCaps2 & GCAPS2_ALPHACURSOR) &&
- SurfObj->iBitmapFormat >= BMF_16BPP &&
- SurfObj->iBitmapFormat <= BMF_32BPP &&
- NewCursor->Shadow && COLORCURSORS_ALLOWED)
+ SurfObj->iBitmapFormat >= BMF_16BPP &&
+ SurfObj->iBitmapFormat <= BMF_32BPP &&
+ NewCursor->Shadow && COLORCURSORS_ALLOWED)
{
- /* FIXME - Create a color pointer, only 32bit bitmap, set alpha bits!
- Do not pass a mask bitmap to DrvSetPointerShape()!
- Create a XLATEOBJ that describes the colors of the bitmap. */
- DPRINT1("SetCursor: (Colored) alpha cursors are not supported!\n");
+ /* FIXME - Create a color pointer, only 32bit bitmap, set alpha bits!
+ Do not pass a mask bitmap to DrvSetPointerShape()!
+ Create a XLATEOBJ that describes the colors of the bitmap. */
+ DPRINT1("SetCursor: (Colored) alpha cursors are not supported!\n");
}
else
{
- if(NewCursor->IconInfo.hbmColor
- && COLORCURSORS_ALLOWED)
- {
- /* FIXME - Create a color pointer, create only one 32bit bitmap!
- Do not pass a mask bitmap to DrvSetPointerShape()!
- Create a XLATEOBJ that describes the colors of the bitmap.
- (16bit bitmaps are propably allowed) */
- DPRINT1("SetCursor: Cursors with colors are not supported!\n");
- }
- else
- {
- MaskBmpObj = BITMAPOBJ_LockBitmap(NewCursor->IconInfo.hbmMask);
- if(MaskBmpObj)
- {
- RECTL DestRect = {0, 0, MaskBmpObj->SurfObj.sizlBitmap.cx, MaskBmpObj->SurfObj.sizlBitmap.cy};
- POINTL SourcePoint = {0, 0};
-
- /*
- * NOTE: For now we create the cursor in top-down bitmap,
- * because VMware driver rejects it otherwise. This should
- * be fixed later.
- */
- hMask = EngCreateBitmap(
- MaskBmpObj->SurfObj.sizlBitmap, abs(MaskBmpObj->SurfObj.lDelta),
- MaskBmpObj->SurfObj.iBitmapFormat, BMF_TOPDOWN,
- NULL);
- if ( !hMask )
+ if(NewCursor->IconInfo.hbmColor
+ && COLORCURSORS_ALLOWED)
+ {
+ /* FIXME - Create a color pointer, create only one 32bit bitmap!
+ Do not pass a mask bitmap to DrvSetPointerShape()!
+ Create a XLATEOBJ that describes the colors of the bitmap.
+ (16bit bitmaps are propably allowed) */
+ DPRINT1("SetCursor: Cursors with colors are not supported!\n");
+ }
+ else
+ {
+ MaskBmpObj = BITMAPOBJ_LockBitmap(NewCursor->IconInfo.hbmMask);
+ if(MaskBmpObj)
{
- BITMAPOBJ_UnlockBitmap(MaskBmpObj);
- BITMAPOBJ_UnlockBitmap(BitmapObj);
- return (HCURSOR)0;
+ RECTL DestRect = {0, 0, MaskBmpObj->SurfObj.sizlBitmap.cx, MaskBmpObj->SurfObj.sizlBitmap.cy};
+ POINTL SourcePoint = {0, 0};
+
+ /*
+ * NOTE: For now we create the cursor in top-down bitmap,
+ * because VMware driver rejects it otherwise. This should
+ * be fixed later.
+ */
+ hMask = EngCreateBitmap(
+ MaskBmpObj->SurfObj.sizlBitmap, abs(MaskBmpObj->SurfObj.lDelta),
+ MaskBmpObj->SurfObj.iBitmapFormat, BMF_TOPDOWN,
+ NULL);
+ if ( !hMask )
+ {
+ BITMAPOBJ_UnlockBitmap(MaskBmpObj);
+ BITMAPOBJ_UnlockBitmap(BitmapObj);
+ return (HCURSOR)0;
+ }
+ soMask = EngLockSurface((HSURF)hMask);
+ EngCopyBits(soMask, &MaskBmpObj->SurfObj, NULL, NULL,
+ &DestRect, &SourcePoint);
+ BITMAPOBJ_UnlockBitmap(MaskBmpObj);
}
- soMask = EngLockSurface((HSURF)hMask);
- EngCopyBits(soMask, &MaskBmpObj->SurfObj, NULL, NULL,
- &DestRect, &SourcePoint);
- BITMAPOBJ_UnlockBitmap(MaskBmpObj);
- }
- }
+ }
}
CurInfo->ShowingCursor = CURSOR_SHOWING;
CurInfo->CurrentCursorObject = NewCursor;
- }
- else
- {
+ }
+ else
+ {
CurInfo->ShowingCursor = 0;
CurInfo->CurrentCursorObject = NULL;
- }
+ }
- if (GDIDEVFUNCS(SurfObj).SetPointerShape)
- {
+ if (GDIDEVFUNCS(SurfObj).SetPointerShape)
+ {
GDIDEV(SurfObj)->Pointer.Status =
GDIDEVFUNCS(SurfObj).SetPointerShape(
- SurfObj, soMask, soColor, XlateObj,
- NewCursor->IconInfo.xHotspot,
- NewCursor->IconInfo.yHotspot,
- GDIDEV(SurfObj)->Pointer.Pos.x,
- GDIDEV(SurfObj)->Pointer.Pos.y,
- &(GDIDEV(SurfObj)->Pointer.Exclude),
- SPS_CHANGE);
+ SurfObj, soMask, soColor, XlateObj,
+ NewCursor->IconInfo.xHotspot,
+ NewCursor->IconInfo.yHotspot,
+ GDIDEV(SurfObj)->Pointer.Pos.x,
+ GDIDEV(SurfObj)->Pointer.Pos.y,
+ &(GDIDEV(SurfObj)->Pointer.Exclude),
+ SPS_CHANGE);
DPRINT("SetCursor: DrvSetPointerShape() returned %x\n",
- GDIDEV(SurfObj)->Pointer.Status);
- }
- else
- {
+ GDIDEV(SurfObj)->Pointer.Status);
+ }
+ else
+ {
GDIDEV(SurfObj)->Pointer.Status = SPS_DECLINE;
- }
+ }
- if(GDIDEV(SurfObj)->Pointer.Status == SPS_DECLINE)
- {
+ if(GDIDEV(SurfObj)->Pointer.Status == SPS_DECLINE)
+ {
GDIDEV(SurfObj)->Pointer.Status = EngSetPointerShape(
- SurfObj, soMask, soColor, XlateObj,
- NewCursor->IconInfo.xHotspot,
- NewCursor->IconInfo.yHotspot,
- GDIDEV(SurfObj)->Pointer.Pos.x,
- GDIDEV(SurfObj)->Pointer.Pos.y,
- &(GDIDEV(SurfObj)->Pointer.Exclude),
- SPS_CHANGE);
+ SurfObj, soMask, soColor, XlateObj,
+ NewCursor->IconInfo.xHotspot,
+ NewCursor->IconInfo.yHotspot,
+ GDIDEV(SurfObj)->Pointer.Pos.x,
+ GDIDEV(SurfObj)->Pointer.Pos.y,
+ &(GDIDEV(SurfObj)->Pointer.Exclude),
+ SPS_CHANGE);
GDIDEV(SurfObj)->Pointer.MovePointer = NULL;
- }
- else
- {
+ }
+ else
+ {
GDIDEV(SurfObj)->Pointer.MovePointer = GDIDEVFUNCS(SurfObj).MovePointer;
- }
+ }
- BITMAPOBJ_UnlockBitmap(BitmapObj);
- if(hMask)
- {
+ BITMAPOBJ_UnlockBitmap(BitmapObj);
+ if(hMask)
+ {
EngUnlockSurface(soMask);
EngDeleteSurface((HSURF)hMask);
- }
- if(hColor)
- {
+ }
+ if(hColor)
+ {
EngDeleteSurface((HSURF)hColor);
- }
- if(XlateObj)
- {
+ }
+ if(XlateObj)
+ {
EngDeleteXlate(XlateObj);
- }
+ }
- if(GDIDEV(SurfObj)->Pointer.Status == SPS_ERROR)
+ if(GDIDEV(SurfObj)->Pointer.Status == SPS_ERROR)
DPRINT1("SetCursor: DrvSetPointerShape() returned SPS_ERROR\n");
- return Ret;
+ return Ret;
}
BOOL FASTCALL
IntSetupCurIconHandles(PWINSTATION_OBJECT WinStaObject)
{
- ExInitializePagedLookasideList(&ProcessLookasideList,
- NULL,
- NULL,
- 0,
- sizeof(CURICON_PROCESS),
- 0,
- 128);
- InitializeListHead(&CurIconList);
-
- return TRUE;
+ ExInitializePagedLookasideList(&ProcessLookasideList,
+ NULL,
+ NULL,
+ 0,
+ sizeof(CURICON_PROCESS),
+ 0,
+ 128);
+ InitializeListHead(&CurIconList);
+
+ return TRUE;
}
/*
static BOOLEAN FASTCALL
ReferenceCurIconByProcess(PCURICON_OBJECT Object)
{
- PW32PROCESS Win32Process;
- PLIST_ENTRY Search;
- PCURICON_PROCESS Current;
+ PW32PROCESS Win32Process;
+ PLIST_ENTRY Search;
+ PCURICON_PROCESS Current;
- Win32Process = PsGetWin32Process();
+ Win32Process = PsGetWin32Process();
- Search = Object->ProcessList.Flink;
- while (Search != &Object->ProcessList)
- {
+ Search = Object->ProcessList.Flink;
+ while (Search != &Object->ProcessList)
+ {
Current = CONTAINING_RECORD(Search, CURICON_PROCESS, ListEntry);
if (Current->Process == Win32Process)
- {
- /* Already registered for this process */
- return TRUE;
- }
+ {
+ /* Already registered for this process */
+ return TRUE;
+ }
Search = Search->Flink;
- }
+ }
- /* Not registered yet */
- Current = ExAllocateFromPagedLookasideList(&ProcessLookasideList);
- if (NULL == Current)
- {
+ /* Not registered yet */
+ Current = ExAllocateFromPagedLookasideList(&ProcessLookasideList);
+ if (NULL == Current)
+ {
return FALSE;
- }
- InsertHeadList(&Object->ProcessList, &Current->ListEntry);
- Current->Process = Win32Process;
+ }
+ InsertHeadList(&Object->ProcessList, &Current->ListEntry);
+ Current->Process = Win32Process;
- return TRUE;
+ return TRUE;
}
PCURICON_OBJECT FASTCALL
IntFindExistingCurIconObject(PWINSTATION_OBJECT WinStaObject, HMODULE hModule,
HRSRC hRsrc, LONG cx, LONG cy)
{
- PLIST_ENTRY CurrentEntry;
- PCURICON_OBJECT Object;
-
- CurrentEntry = CurIconList.Flink;
- while (CurrentEntry != &CurIconList)
- {
- Object = CONTAINING_RECORD(CurrentEntry, CURICON_OBJECT, ListEntry);
- CurrentEntry = CurrentEntry->Flink;
-
-// if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon))) //<- huh????
- ObmReferenceObject( Object);
- {
- if((Object->hModule == hModule) && (Object->hRsrc == hRsrc))
+ PLIST_ENTRY CurrentEntry;
+ PCURICON_OBJECT Object;
+
+ CurrentEntry = CurIconList.Flink;
+ while (CurrentEntry != &CurIconList)
+ {
+ Object = CONTAINING_RECORD(CurrentEntry, CURICON_OBJECT, ListEntry);
+ CurrentEntry = CurrentEntry->Flink;
+
+ // if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon))) //<- huh????
+ ObmReferenceObject( Object);
{
- if(cx && ((cx != Object->Size.cx) || (cy != Object->Size.cy)))
- {
- ObmDereferenceObject(Object);
- continue;
- }
- if (! ReferenceCurIconByProcess(Object))
- {
- return NULL;
- }
-
- return Object;
+ if((Object->hModule == hModule) && (Object->hRsrc == hRsrc))
+ {
+ if(cx && ((cx != Object->Size.cx) || (cy != Object->Size.cy)))
+ {
+ ObmDereferenceObject(Object);
+ continue;
+ }
+ if (! ReferenceCurIconByProcess(Object))
+ {
+ return NULL;
+ }
+
+ return Object;
+ }
}
- }
- ObmDereferenceObject(Object);
+ ObmDereferenceObject(Object);
- }
+ }
- return NULL;
+ return NULL;
}
PCURICON_OBJECT FASTCALL
IntCreateCurIconHandle(PWINSTATION_OBJECT WinStaObject)
{
- PCURICON_OBJECT Object;
- HANDLE Handle;
+ PCURICON_OBJECT Object;
+ HANDLE Handle;
- Object = ObmCreateObject(&gHandleTable, &Handle, otCursor, sizeof(CURICON_OBJECT));
+ Object = ObmCreateObject(&gHandleTable, &Handle, otCursor, sizeof(CURICON_OBJECT));
- if(!Object)
- {
- SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
+ if(!Object)
+ {
+ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
- Object->Self = Handle;
- InitializeListHead(&Object->ProcessList);
+ Object->Self = Handle;
+ InitializeListHead(&Object->ProcessList);
- if (! ReferenceCurIconByProcess(Object))
- {
- DPRINT1("Failed to add process\n");
- ObmDeleteObject(Handle, otCursor);
- ObmDereferenceObject(Object);
- return NULL;
- }
+ if (! ReferenceCurIconByProcess(Object))
+ {
+ DPRINT1("Failed to add process\n");
+ ObmDeleteObject(Handle, otCursor);
+ ObmDereferenceObject(Object);
+ return NULL;
+ }
- InsertHeadList(&CurIconList, &Object->ListEntry);
+ InsertHeadList(&CurIconList, &Object->ListEntry);
- ObmDereferenceObject(Object);
+ ObmDereferenceObject(Object);
- return Object;
+ return Object;
}
BOOLEAN FASTCALL
IntDestroyCurIconObject(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT Object, BOOL ProcessCleanup)
{
- PSYSTEM_CURSORINFO CurInfo;
- HBITMAP bmpMask, bmpColor;
- BOOLEAN Ret;
- PLIST_ENTRY Search;
- PCURICON_PROCESS Current = NULL;
- PW32PROCESS W32Process = PsGetWin32Process();
-
- /* Private objects can only be destroyed by their own process */
- if (NULL == Object->hModule)
- {
- ASSERT(Object->ProcessList.Flink->Flink == &Object->ProcessList);
- Current = CONTAINING_RECORD(Object->ProcessList.Flink, CURICON_PROCESS, ListEntry);
- if (Current->Process != W32Process)
+ PSYSTEM_CURSORINFO CurInfo;
+ HBITMAP bmpMask, bmpColor;
+ BOOLEAN Ret;
+ PLIST_ENTRY Search;
+ PCURICON_PROCESS Current = NULL;
+ PW32PROCESS W32Process = PsGetWin32Process();
+
+ /* Private objects can only be destroyed by their own process */
+ if (NULL == Object->hModule)
+ {
+ ASSERT(Object->ProcessList.Flink->Flink == &Object->ProcessList);
+ Current = CONTAINING_RECORD(Object->ProcessList.Flink, CURICON_PROCESS, ListEntry);
+ if (Current->Process != W32Process)
{
- DPRINT1("Trying to destroy private icon/cursor of another process\n");
- return FALSE;
+ DPRINT1("Trying to destroy private icon/cursor of another process\n");
+ return FALSE;
}
- }
- else if (! ProcessCleanup)
- {
+ }
+ else if (! ProcessCleanup)
+ {
DPRINT("Trying to destroy shared icon/cursor\n");
return FALSE;
- }
-
- /* Now find this process in the list of processes referencing this object and
- remove it from that list */
- Search = Object->ProcessList.Flink;
- while (Search != &Object->ProcessList)
- {
- Current = CONTAINING_RECORD(Search, CURICON_PROCESS, ListEntry);
- if (Current->Process == W32Process)
+ }
+
+ /* Now find this process in the list of processes referencing this object and
+ remove it from that list */
+ Search = Object->ProcessList.Flink;
+ while (Search != &Object->ProcessList)
+ {
+ Current = CONTAINING_RECORD(Search, CURICON_PROCESS, ListEntry);
+ if (Current->Process == W32Process)
{
- break;
+ break;
}
- Search = Search->Flink;
- }
- ASSERT(Search != &Object->ProcessList);
- RemoveEntryList(Search);
- ExFreeToPagedLookasideList(&ProcessLookasideList, Current);
-
- /* If there are still processes referencing this object we can't destroy it yet */
- if (! IsListEmpty(&Object->ProcessList))
- {
- return TRUE;
- }
-
-
- if (! ProcessCleanup)
- {
- RemoveEntryList(&Object->ListEntry);
- }
-
- CurInfo = IntGetSysCursorInfo(WinStaObject);
-
- if (CurInfo->CurrentCursorObject == Object)
- {
- /* Hide the cursor if we're destroying the current cursor */
- IntSetCursor(WinStaObject, NULL, TRUE);
- }
-
- bmpMask = Object->IconInfo.hbmMask;
- bmpColor = Object->IconInfo.hbmColor;
-
- Ret = ObmDeleteObject(Object->Self, otCursor);
-
- /* delete bitmaps */
- if(bmpMask)
- {
- GDIOBJ_SetOwnership(bmpMask, PsGetCurrentProcess());
- NtGdiDeleteObject(bmpMask);
- }
- if(bmpColor)
- {
- GDIOBJ_SetOwnership(bmpColor, PsGetCurrentProcess());
- NtGdiDeleteObject(bmpColor);
- }
-
- return Ret;
+ Search = Search->Flink;
+ }
+ ASSERT(Search != &Object->ProcessList);
+ RemoveEntryList(Search);
+ ExFreeToPagedLookasideList(&ProcessLookasideList, Current);
+
+ /* If there are still processes referencing this object we can't destroy it yet */
+ if (! IsListEmpty(&Object->ProcessList))
+ {
+ return TRUE;
+ }
+
+
+ if (! ProcessCleanup)
+ {
+ RemoveEntryList(&Object->ListEntry);
+ }
+
+ CurInfo = IntGetSysCursorInfo(WinStaObject);
+
+ if (CurInfo->CurrentCursorObject == Object)
+ {
+ /* Hide the cursor if we're destroying the current cursor */
+ IntSetCursor(WinStaObject, NULL, TRUE);
+ }
+
+ bmpMask = Object->IconInfo.hbmMask;
+ bmpColor = Object->IconInfo.hbmColor;
+
+ Ret = ObmDeleteObject(Object->Self, otCursor);
+
+ /* delete bitmaps */
+ if(bmpMask)
+ {
+ GDIOBJ_SetOwnership(bmpMask, PsGetCurrentProcess());
+ NtGdiDeleteObject(bmpMask);
+ }
+ if(bmpColor)
+ {
+ GDIOBJ_SetOwnership(bmpColor, PsGetCurrentProcess());
+ NtGdiDeleteObject(bmpColor);
+ }
+
+ return Ret;
}
VOID FASTCALL
IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process)
{
- PWINSTATION_OBJECT WinStaObject;
- PLIST_ENTRY CurrentEntry;
- PCURICON_OBJECT Object;
- PLIST_ENTRY ProcessEntry;
- PCURICON_PROCESS ProcessData;
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- return;
- }
+ PWINSTATION_OBJECT WinStaObject;
+ PLIST_ENTRY CurrentEntry;
+ PCURICON_OBJECT Object;
+ PLIST_ENTRY ProcessEntry;
+ PCURICON_PROCESS ProcessData;
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ return;
+ }
- CurrentEntry = CurIconList.Flink;
- while (CurrentEntry != &CurIconList)
- {
- Object = CONTAINING_RECORD(CurrentEntry, CURICON_OBJECT, ListEntry);
- CurrentEntry = CurrentEntry->Flink;
+ CurrentEntry = CurIconList.Flink;
+ while (CurrentEntry != &CurIconList)
+ {
+ Object = CONTAINING_RECORD(CurrentEntry, CURICON_OBJECT, ListEntry);
+ CurrentEntry = CurrentEntry->Flink;
ObmReferenceObject(Object);
-// if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon)))
+ // if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon)))
{
- ProcessEntry = Object->ProcessList.Flink;
- while (ProcessEntry != &Object->ProcessList)
- {
- ProcessData = CONTAINING_RECORD(ProcessEntry, CURICON_PROCESS, ListEntry);
- if (Win32Process == ProcessData->Process)
- {
- RemoveEntryList(&Object->ListEntry);
- IntDestroyCurIconObject(WinStaObject, Object, TRUE);
- break;
- }
- ProcessEntry = ProcessEntry->Flink;
- }
+ ProcessEntry = Object->ProcessList.Flink;
+ while (ProcessEntry != &Object->ProcessList)
+ {
+ ProcessData = CONTAINING_RECORD(ProcessEntry, CURICON_PROCESS, ListEntry);
+ if (Win32Process == ProcessData->Process)
+ {
+ RemoveEntryList(&Object->ListEntry);
+ IntDestroyCurIconObject(WinStaObject, Object, TRUE);
+ break;
+ }
+ ProcessEntry = ProcessEntry->Flink;
+ }
- ObmDereferenceObject(Object);
- }
+ ObmDereferenceObject(Object);
+ }
- }
+ }
- ObDereferenceObject(WinStaObject);
+ ObDereferenceObject(WinStaObject);
}
/*
STDCALL
NtUserCreateCursorIconHandle(PICONINFO IconInfo, BOOL Indirect)
{
- PCURICON_OBJECT CurIconObject;
- PWINSTATION_OBJECT WinStaObject;
- PBITMAPOBJ bmp;
- NTSTATUS Status;
- HANDLE Ret;
- DECLARE_RETURN(HANDLE);
-
- DPRINT("Enter NtUserCreateCursorIconHandle\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( (HANDLE)0);
- }
-
- CurIconObject = IntCreateCurIconHandle(WinStaObject);
- if(CurIconObject)
- {
- Ret = CurIconObject->Self;
-
- if(IconInfo)
- {
- Status = MmCopyFromCaller(&CurIconObject->IconInfo, IconInfo, sizeof(ICONINFO));
- if(NT_SUCCESS(Status))
- {
- if(Indirect)
- {
- CurIconObject->IconInfo.hbmMask = BITMAPOBJ_CopyBitmap(CurIconObject->IconInfo.hbmMask);
- CurIconObject->IconInfo.hbmColor = BITMAPOBJ_CopyBitmap(CurIconObject->IconInfo.hbmColor);
- }
- if(CurIconObject->IconInfo.hbmColor &&
- (bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor)))
- {
- CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx;
- CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy;
- BITMAPOBJ_UnlockBitmap(bmp);
- GDIOBJ_SetOwnership(CurIconObject->IconInfo.hbmColor, NULL);
- }
- if(CurIconObject->IconInfo.hbmMask &&
- (bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask)))
- {
- if (CurIconObject->IconInfo.hbmColor == NULL)
- {
- CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx;
- CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy / 2;
- }
- BITMAPOBJ_UnlockBitmap(bmp);
- GDIOBJ_SetOwnership(CurIconObject->IconInfo.hbmMask, NULL);
- }
- }
- else
+ PCURICON_OBJECT CurIconObject;
+ PWINSTATION_OBJECT WinStaObject;
+ PBITMAPOBJ bmp;
+ NTSTATUS Status;
+ HANDLE Ret;
+ DECLARE_RETURN(HANDLE);
+
+ DPRINT("Enter NtUserCreateCursorIconHandle\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( (HANDLE)0);
+ }
+
+ CurIconObject = IntCreateCurIconHandle(WinStaObject);
+ if(CurIconObject)
+ {
+ Ret = CurIconObject->Self;
+
+ if(IconInfo)
{
- SetLastNtError(Status);
- /* FIXME - Don't exit here */
+ Status = MmCopyFromCaller(&CurIconObject->IconInfo, IconInfo, sizeof(ICONINFO));
+ if(NT_SUCCESS(Status))
+ {
+ if(Indirect)
+ {
+ CurIconObject->IconInfo.hbmMask = BITMAPOBJ_CopyBitmap(CurIconObject->IconInfo.hbmMask);
+ CurIconObject->IconInfo.hbmColor = BITMAPOBJ_CopyBitmap(CurIconObject->IconInfo.hbmColor);
+ }
+ if(CurIconObject->IconInfo.hbmColor &&
+ (bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor)))
+ {
+ CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx;
+ CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy;
+ BITMAPOBJ_UnlockBitmap(bmp);
+ GDIOBJ_SetOwnership(CurIconObject->IconInfo.hbmColor, NULL);
+ }
+ if(CurIconObject->IconInfo.hbmMask &&
+ (bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask)))
+ {
+ if (CurIconObject->IconInfo.hbmColor == NULL)
+ {
+ CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx;
+ CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy / 2;
+ }
+ BITMAPOBJ_UnlockBitmap(bmp);
+ GDIOBJ_SetOwnership(CurIconObject->IconInfo.hbmMask, NULL);
+ }
+ }
+ else
+ {
+ SetLastNtError(Status);
+ /* FIXME - Don't exit here */
+ }
}
- }
- ObDereferenceObject(WinStaObject);
- RETURN( Ret);
- }
+ ObDereferenceObject(WinStaObject);
+ RETURN( Ret);
+ }
+
+ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
+ ObDereferenceObject(WinStaObject);
+ RETURN( (HANDLE)0);
- SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
- ObDereferenceObject(WinStaObject);
- RETURN( (HANDLE)0);
-
CLEANUP:
- DPRINT("Leave NtUserCreateCursorIconHandle, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserCreateCursorIconHandle, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
/*
BOOL
STDCALL
NtUserGetCursorIconInfo(
- HANDLE Handle,
- PICONINFO IconInfo)
+ HANDLE Handle,
+ PICONINFO IconInfo)
{
- ICONINFO ii;
- PCURICON_OBJECT CurIconObject;
- PWINSTATION_OBJECT WinStaObject;
- NTSTATUS Status;
- BOOL Ret = FALSE;
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserGetCursorIconInfo\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- CurIconObject = IntGetCurIconObject(Handle);
- if(CurIconObject)
- {
- if(IconInfo)
- {
- RtlCopyMemory(&ii, &CurIconObject->IconInfo, sizeof(ICONINFO));
-
- /* Copy bitmaps */
- ii.hbmMask = BITMAPOBJ_CopyBitmap(ii.hbmMask);
- ii.hbmColor = BITMAPOBJ_CopyBitmap(ii.hbmColor);
+ ICONINFO ii;
+ PCURICON_OBJECT CurIconObject;
+ PWINSTATION_OBJECT WinStaObject;
+ NTSTATUS Status;
+ BOOL Ret = FALSE;
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserGetCursorIconInfo\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
- /* Copy fields */
- Status = MmCopyToCaller(IconInfo, &ii, sizeof(ICONINFO));
- if(NT_SUCCESS(Status))
- Ret = TRUE;
+ CurIconObject = IntGetCurIconObject(Handle);
+ if(CurIconObject)
+ {
+ if(IconInfo)
+ {
+ RtlCopyMemory(&ii, &CurIconObject->IconInfo, sizeof(ICONINFO));
+
+ /* Copy bitmaps */
+ ii.hbmMask = BITMAPOBJ_CopyBitmap(ii.hbmMask);
+ ii.hbmColor = BITMAPOBJ_CopyBitmap(ii.hbmColor);
+
+ /* Copy fields */
+ Status = MmCopyToCaller(IconInfo, &ii, sizeof(ICONINFO));
+ if(NT_SUCCESS(Status))
+ Ret = TRUE;
+ else
+ SetLastNtError(Status);
+ }
else
- SetLastNtError(Status);
- }
- else
- {
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- }
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ }
- IntReleaseCurIconObject(CurIconObject);
- ObDereferenceObject(WinStaObject);
- RETURN( Ret);
- }
+ IntReleaseCurIconObject(CurIconObject);
+ ObDereferenceObject(WinStaObject);
+ RETURN( Ret);
+ }
+
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
+ ObDereferenceObject(WinStaObject);
+ RETURN( FALSE);
- SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
- ObDereferenceObject(WinStaObject);
- RETURN( FALSE);
-
CLEANUP:
- DPRINT("Leave NtUserGetCursorIconInfo, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserGetCursorIconInfo, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
BOOL
STDCALL
NtUserGetCursorIconSize(
- HANDLE Handle,
- BOOL *fIcon,
- SIZE *Size)
+ HANDLE Handle,
+ BOOL *fIcon,
+ SIZE *Size)
{
- PCURICON_OBJECT CurIconObject;
- PBITMAPOBJ bmp;
- PWINSTATION_OBJECT WinStaObject;
- NTSTATUS Status;
- BOOL Ret = FALSE;
- SIZE SafeSize;
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserGetCursorIconSize\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- CurIconObject = IntGetCurIconObject(Handle);
- if(CurIconObject)
- {
- /* Copy fields */
- Status = MmCopyToCaller(fIcon, &CurIconObject->IconInfo.fIcon, sizeof(BOOL));
- if(!NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- goto done;
- }
+ PCURICON_OBJECT CurIconObject;
+ PBITMAPOBJ bmp;
+ PWINSTATION_OBJECT WinStaObject;
+ NTSTATUS Status;
+ BOOL Ret = FALSE;
+ SIZE SafeSize;
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserGetCursorIconSize\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
+
+ CurIconObject = IntGetCurIconObject(Handle);
+ if(CurIconObject)
+ {
+ /* Copy fields */
+ Status = MmCopyToCaller(fIcon, &CurIconObject->IconInfo.fIcon, sizeof(BOOL));
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ goto done;
+ }
- bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor);
- if(!bmp)
- goto done;
+ bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor);
+ if(!bmp)
+ goto done;
- SafeSize.cx = bmp->SurfObj.sizlBitmap.cx;
- SafeSize.cy = bmp->SurfObj.sizlBitmap.cy;
- Status = MmCopyToCaller(Size, &SafeSize, sizeof(SIZE));
- if(NT_SUCCESS(Status))
- Ret = TRUE;
- else
- SetLastNtError(Status);
+ SafeSize.cx = bmp->SurfObj.sizlBitmap.cx;
+ SafeSize.cy = bmp->SurfObj.sizlBitmap.cy;
+ Status = MmCopyToCaller(Size, &SafeSize, sizeof(SIZE));
+ if(NT_SUCCESS(Status))
+ Ret = TRUE;
+ else
+ SetLastNtError(Status);
- BITMAPOBJ_UnlockBitmap(bmp);
+ BITMAPOBJ_UnlockBitmap(bmp);
+
+done:
+ IntReleaseCurIconObject(CurIconObject);
+ ObDereferenceObject(WinStaObject);
+ RETURN( Ret);
+ }
- done:
- IntReleaseCurIconObject(CurIconObject);
- ObDereferenceObject(WinStaObject);
- RETURN( Ret);
- }
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
+ ObDereferenceObject(WinStaObject);
+ RETURN( FALSE);
- SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
- ObDereferenceObject(WinStaObject);
- RETURN( FALSE);
-
CLEANUP:
- DPRINT("Leave NtUserGetCursorIconSize, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserGetCursorIconSize, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
DWORD
STDCALL
NtUserGetCursorFrameInfo(
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2,
- DWORD Unknown3)
+ DWORD Unknown0,
+ DWORD Unknown1,
+ DWORD Unknown2,
+ DWORD Unknown3)
{
- UNIMPLEMENTED
+ UNIMPLEMENTED
- return 0;
+ return 0;
}
BOOL
STDCALL
NtUserGetCursorInfo(
- PCURSORINFO pci)
+ PCURSORINFO pci)
{
- CURSORINFO SafeCi;
- PSYSTEM_CURSORINFO CurInfo;
- PWINSTATION_OBJECT WinStaObject;
- NTSTATUS Status;
- PCURICON_OBJECT CursorObject;
- DECLARE_RETURN(BOOL);
+ CURSORINFO SafeCi;
+ PSYSTEM_CURSORINFO CurInfo;
+ PWINSTATION_OBJECT WinStaObject;
+ NTSTATUS Status;
+ PCURICON_OBJECT CursorObject;
+ DECLARE_RETURN(BOOL);
- DPRINT("Enter NtUserGetCursorInfo\n");
- UserEnterExclusive();
+ DPRINT("Enter NtUserGetCursorInfo\n");
+ UserEnterExclusive();
#if 1
- HDC hDC;
- /* FIXME - get the screen dc from the window station or desktop */
- if (!(hDC = IntGetScreenDC()))
- {
- RETURN( FALSE);
- }
+ HDC hDC;
+
+ /* FIXME - get the screen dc from the window station or desktop */
+ if (!(hDC = IntGetScreenDC()))
+ {
+ RETURN( FALSE);
+ }
#endif
- Status = MmCopyFromCaller(&SafeCi.cbSize, pci, sizeof(DWORD));
- if(!NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- RETURN( FALSE);
- }
-
- if(SafeCi.cbSize != sizeof(CURSORINFO))
- {
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- RETURN( FALSE);
- }
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- CurInfo = IntGetSysCursorInfo(WinStaObject);
- CursorObject = (PCURICON_OBJECT)CurInfo->CurrentCursorObject;
-
- SafeCi.flags = ((CurInfo->ShowingCursor && CursorObject) ? CURSOR_SHOWING : 0);
- SafeCi.hCursor = (CursorObject ? (HCURSOR)CursorObject->Self : (HCURSOR)0);
-
- IntGetCursorLocation(WinStaObject, &SafeCi.ptScreenPos);
-
- Status = MmCopyToCaller(pci, &SafeCi, sizeof(CURSORINFO));
- if(!NT_SUCCESS(Status))
- {
- ObDereferenceObject(WinStaObject);
- SetLastNtError(Status);
- RETURN( FALSE);
- }
-
- ObDereferenceObject(WinStaObject);
- RETURN( TRUE);
-
+ Status = MmCopyFromCaller(&SafeCi.cbSize, pci, sizeof(DWORD));
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ RETURN( FALSE);
+ }
+
+ if(SafeCi.cbSize != sizeof(CURSORINFO))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ RETURN( FALSE);
+ }
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
+
+ CurInfo = IntGetSysCursorInfo(WinStaObject);
+ CursorObject = (PCURICON_OBJECT)CurInfo->CurrentCursorObject;
+
+ SafeCi.flags = ((CurInfo->ShowingCursor && CursorObject) ? CURSOR_SHOWING : 0);
+ SafeCi.hCursor = (CursorObject ? (HCURSOR)CursorObject->Self : (HCURSOR)0);
+
+ IntGetCursorLocation(WinStaObject, &SafeCi.ptScreenPos);
+
+ Status = MmCopyToCaller(pci, &SafeCi, sizeof(CURSORINFO));
+ if(!NT_SUCCESS(Status))
+ {
+ ObDereferenceObject(WinStaObject);
+ SetLastNtError(Status);
+ RETURN( FALSE);
+ }
+
+ ObDereferenceObject(WinStaObject);
+ RETURN( TRUE);
+
CLEANUP:
- DPRINT("Leave NtUserGetCursorInfo, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserGetCursorInfo, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
BOOL
STDCALL
NtUserClipCursor(
- RECT *UnsafeRect)
+ RECT *UnsafeRect)
{
- /* FIXME - check if process has WINSTA_WRITEATTRIBUTES */
-
- PWINSTATION_OBJECT WinStaObject;
- PSYSTEM_CURSORINFO CurInfo;
- RECT Rect;
- PWINDOW_OBJECT DesktopWindow = NULL;
- POINT MousePos;
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserClipCursor\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if (WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- if (NULL != UnsafeRect && ! NT_SUCCESS(MmCopyFromCaller(&Rect, UnsafeRect, sizeof(RECT))))
- {
- ObDereferenceObject(WinStaObject);
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- RETURN( FALSE);
- }
-
- CurInfo = IntGetSysCursorInfo(WinStaObject);
- IntGetCursorLocation(WinStaObject, &MousePos);
-
- if(WinStaObject->ActiveDesktop)
- DesktopWindow = IntGetWindowObject(WinStaObject->ActiveDesktop->DesktopWindow);
-
- if((Rect.right > Rect.left) && (Rect.bottom > Rect.top)
- && DesktopWindow && UnsafeRect != NULL)
- {
- MOUSEINPUT mi;
-
- CurInfo->CursorClipInfo.IsClipped = TRUE;
- CurInfo->CursorClipInfo.Left = max(Rect.left, DesktopWindow->WindowRect.left);
- CurInfo->CursorClipInfo.Top = max(Rect.top, DesktopWindow->WindowRect.top);
- CurInfo->CursorClipInfo.Right = min(Rect.right - 1, DesktopWindow->WindowRect.right - 1);
- CurInfo->CursorClipInfo.Bottom = min(Rect.bottom - 1, DesktopWindow->WindowRect.bottom - 1);
- IntReleaseWindowObject(DesktopWindow);
-
- mi.dx = MousePos.x;
- mi.dy = MousePos.y;
- mi.mouseData = 0;
- mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
- mi.time = 0;
- mi.dwExtraInfo = 0;
- IntMouseInput(&mi);
-
- RETURN( TRUE);
- }
-
- CurInfo->CursorClipInfo.IsClipped = FALSE;
- ObDereferenceObject(WinStaObject);
-
- RETURN( TRUE);
-
+ /* FIXME - check if process has WINSTA_WRITEATTRIBUTES */
+
+ PWINSTATION_OBJECT WinStaObject;
+ PSYSTEM_CURSORINFO CurInfo;
+ RECT Rect;
+ PWINDOW_OBJECT DesktopWindow = NULL;
+ POINT MousePos;
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserClipCursor\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if (WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
+
+ if (NULL != UnsafeRect && ! NT_SUCCESS(MmCopyFromCaller(&Rect, UnsafeRect, sizeof(RECT))))
+ {
+ ObDereferenceObject(WinStaObject);
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ RETURN( FALSE);
+ }
+
+ CurInfo = IntGetSysCursorInfo(WinStaObject);
+ IntGetCursorLocation(WinStaObject, &MousePos);
+
+ if(WinStaObject->ActiveDesktop)
+ DesktopWindow = IntGetWindowObject(WinStaObject->ActiveDesktop->DesktopWindow);
+
+ if((Rect.right > Rect.left) && (Rect.bottom > Rect.top)
+ && DesktopWindow && UnsafeRect != NULL)
+ {
+ MOUSEINPUT mi;
+
+ CurInfo->CursorClipInfo.IsClipped = TRUE;
+ CurInfo->CursorClipInfo.Left = max(Rect.left, DesktopWindow->WindowRect.left);
+ CurInfo->CursorClipInfo.Top = max(Rect.top, DesktopWindow->WindowRect.top);
+ CurInfo->CursorClipInfo.Right = min(Rect.right - 1, DesktopWindow->WindowRect.right - 1);
+ CurInfo->CursorClipInfo.Bottom = min(Rect.bottom - 1, DesktopWindow->WindowRect.bottom - 1);
+ IntReleaseWindowObject(DesktopWindow);
+
+ mi.dx = MousePos.x;
+ mi.dy = MousePos.y;
+ mi.mouseData = 0;
+ mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
+ mi.time = 0;
+ mi.dwExtraInfo = 0;
+ IntMouseInput(&mi);
+
+ RETURN( TRUE);
+ }
+
+ CurInfo->CursorClipInfo.IsClipped = FALSE;
+ ObDereferenceObject(WinStaObject);
+
+ RETURN( TRUE);
+
CLEANUP:
- DPRINT("Leave NtUserClipCursor, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserClipCursor, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
BOOL
STDCALL
NtUserDestroyCursorIcon(
- HANDLE Handle,
- DWORD Unknown)
+ HANDLE Handle,
+ DWORD Unknown)
{
- PWINSTATION_OBJECT WinStaObject;
- PCURICON_OBJECT Object;
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserDestroyCursorIcon\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- if (!(Object = IntGetCurIconObject(Handle)))
- {
- ObDereferenceObject(WinStaObject);
- RETURN(FALSE);
- }
-// Status = ObmReferenceObjectByHandle(gHandleTable, Handle, otCursorIcon, (PVOID*)&Object);
-// if(!NT_SUCCESS(Status))
-// {
-// ObDereferenceObject(WinStaObject);
-// SetLastNtError(Status);
-// RETURN( FALSE);
-// }
-
- if(IntDestroyCurIconObject(WinStaObject, Object, FALSE))
- {
- ObmDereferenceObject(Object);
- ObDereferenceObject(WinStaObject);
- RETURN( TRUE);
- }
-
- ObmDereferenceObject(Object);
- ObDereferenceObject(WinStaObject);
- SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
- RETURN( FALSE);
-
+ PWINSTATION_OBJECT WinStaObject;
+ PCURICON_OBJECT Object;
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserDestroyCursorIcon\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
+
+ if (!(Object = IntGetCurIconObject(Handle)))
+ {
+ ObDereferenceObject(WinStaObject);
+ RETURN(FALSE);
+ }
+ // Status = ObmReferenceObjectByHandle(gHandleTable, Handle, otCursorIcon, (PVOID*)&Object);
+ // if(!NT_SUCCESS(Status))
+ // {
+ // ObDereferenceObject(WinStaObject);
+ // SetLastNtError(Status);
+ // RETURN( FALSE);
+ // }
+
+ if(IntDestroyCurIconObject(WinStaObject, Object, FALSE))
+ {
+ ObmDereferenceObject(Object);
+ ObDereferenceObject(WinStaObject);
+ RETURN( TRUE);
+ }
+
+ ObmDereferenceObject(Object);
+ ObDereferenceObject(WinStaObject);
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
+ RETURN( FALSE);
+
CLEANUP:
- DPRINT("Leave NtUserDestroyCursorIcon, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserDestroyCursorIcon, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
HICON
STDCALL
NtUserFindExistingCursorIcon(
- HMODULE hModule,
- HRSRC hRsrc,
- LONG cx,
- LONG cy)
+ HMODULE hModule,
+ HRSRC hRsrc,
+ LONG cx,
+ LONG cy)
{
- PCURICON_OBJECT CurIconObject;
- PWINSTATION_OBJECT WinStaObject;
- HANDLE Ret = (HANDLE)0;
- DECLARE_RETURN(HICON);
-
- DPRINT("Enter NtUserFindExistingCursorIcon\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( Ret);
- }
-
- CurIconObject = IntFindExistingCurIconObject(WinStaObject, hModule, hRsrc, cx, cy);
- if(CurIconObject)
- {
- Ret = CurIconObject->Self;
-
- IntReleaseCurIconObject(CurIconObject);
- ObDereferenceObject(WinStaObject);
- RETURN( Ret);
- }
-
- SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
- ObDereferenceObject(WinStaObject);
- RETURN( (HANDLE)0);
-
+ PCURICON_OBJECT CurIconObject;
+ PWINSTATION_OBJECT WinStaObject;
+ HANDLE Ret = (HANDLE)0;
+ DECLARE_RETURN(HICON);
+
+ DPRINT("Enter NtUserFindExistingCursorIcon\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( Ret);
+ }
+
+ CurIconObject = IntFindExistingCurIconObject(WinStaObject, hModule, hRsrc, cx, cy);
+ if(CurIconObject)
+ {
+ Ret = CurIconObject->Self;
+
+ IntReleaseCurIconObject(CurIconObject);
+ ObDereferenceObject(WinStaObject);
+ RETURN( Ret);
+ }
+
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
+ ObDereferenceObject(WinStaObject);
+ RETURN( (HANDLE)0);
+
CLEANUP:
- DPRINT("Leave NtUserFindExistingCursorIcon, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserFindExistingCursorIcon, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
BOOL
STDCALL
NtUserGetClipCursor(
- RECT *lpRect)
+ RECT *lpRect)
{
- /* FIXME - check if process has WINSTA_READATTRIBUTES */
- PSYSTEM_CURSORINFO CurInfo;
- PWINSTATION_OBJECT WinStaObject;
- RECT Rect;
- NTSTATUS Status;
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserGetClipCursor\n");
- UserEnterExclusive();
-
- if(!lpRect)
- RETURN( FALSE);
-
- WinStaObject = IntGetWinStaObj();
- if (WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- CurInfo = IntGetSysCursorInfo(WinStaObject);
- if(CurInfo->CursorClipInfo.IsClipped)
- {
- Rect.left = CurInfo->CursorClipInfo.Left;
- Rect.top = CurInfo->CursorClipInfo.Top;
- Rect.right = CurInfo->CursorClipInfo.Right;
- Rect.bottom = CurInfo->CursorClipInfo.Bottom;
- }
- else
- {
- Rect.left = 0;
- Rect.top = 0;
- Rect.right = UserGetSystemMetrics(SM_CXSCREEN);
- Rect.bottom = UserGetSystemMetrics(SM_CYSCREEN);
- }
-
- Status = MmCopyToCaller((PRECT)lpRect, &Rect, sizeof(RECT));
- if(!NT_SUCCESS(Status))
- {
- ObDereferenceObject(WinStaObject);
- SetLastNtError(Status);
- RETURN( FALSE);
- }
-
- ObDereferenceObject(WinStaObject);
-
- RETURN( TRUE);
-
+ /* FIXME - check if process has WINSTA_READATTRIBUTES */
+ PSYSTEM_CURSORINFO CurInfo;
+ PWINSTATION_OBJECT WinStaObject;
+ RECT Rect;
+ NTSTATUS Status;
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserGetClipCursor\n");
+ UserEnterExclusive();
+
+ if(!lpRect)
+ RETURN( FALSE);
+
+ WinStaObject = IntGetWinStaObj();
+ if (WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
+
+ CurInfo = IntGetSysCursorInfo(WinStaObject);
+ if(CurInfo->CursorClipInfo.IsClipped)
+ {
+ Rect.left = CurInfo->CursorClipInfo.Left;
+ Rect.top = CurInfo->CursorClipInfo.Top;
+ Rect.right = CurInfo->CursorClipInfo.Right;
+ Rect.bottom = CurInfo->CursorClipInfo.Bottom;
+ }
+ else
+ {
+ Rect.left = 0;
+ Rect.top = 0;
+ Rect.right = UserGetSystemMetrics(SM_CXSCREEN);
+ Rect.bottom = UserGetSystemMetrics(SM_CYSCREEN);
+ }
+
+ Status = MmCopyToCaller((PRECT)lpRect, &Rect, sizeof(RECT));
+ if(!NT_SUCCESS(Status))
+ {
+ ObDereferenceObject(WinStaObject);
+ SetLastNtError(Status);
+ RETURN( FALSE);
+ }
+
+ ObDereferenceObject(WinStaObject);
+
+ RETURN( TRUE);
+
CLEANUP:
- DPRINT("Leave NtUserGetClipCursor, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserGetClipCursor, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
HCURSOR
STDCALL
NtUserSetCursor(
- HCURSOR hCursor)
+ HCURSOR hCursor)
{
- PCURICON_OBJECT CurIconObject;
- HICON OldCursor = (HCURSOR)0;
- PWINSTATION_OBJECT WinStaObject;
- DECLARE_RETURN(HCURSOR);
-
- DPRINT("Enter NtUserSetCursor\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( (HCURSOR)0);
- }
-
- CurIconObject = IntGetCurIconObject(hCursor);
- if(CurIconObject)
- {
- OldCursor = IntSetCursor(WinStaObject, CurIconObject, FALSE);
- IntReleaseCurIconObject(CurIconObject);
- }
- else
- SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
-
- ObDereferenceObject(WinStaObject);
- RETURN( OldCursor);
-
+ PCURICON_OBJECT CurIconObject;
+ HICON OldCursor = (HCURSOR)0;
+ PWINSTATION_OBJECT WinStaObject;
+ DECLARE_RETURN(HCURSOR);
+
+ DPRINT("Enter NtUserSetCursor\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( (HCURSOR)0);
+ }
+
+ CurIconObject = IntGetCurIconObject(hCursor);
+ if(CurIconObject)
+ {
+ OldCursor = IntSetCursor(WinStaObject, CurIconObject, FALSE);
+ IntReleaseCurIconObject(CurIconObject);
+ }
+ else
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
+
+ ObDereferenceObject(WinStaObject);
+ RETURN( OldCursor);
+
CLEANUP:
- DPRINT("Leave NtUserSetCursor, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserSetCursor, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
BOOL
STDCALL
NtUserSetCursorIconContents(
- HANDLE Handle,
- PICONINFO IconInfo)
+ HANDLE Handle,
+ PICONINFO IconInfo)
{
- PCURICON_OBJECT CurIconObject;
- PBITMAPOBJ bmp;
- PWINSTATION_OBJECT WinStaObject;
- NTSTATUS Status;
- BOOL Ret = FALSE;
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserSetCursorIconContents\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- CurIconObject = IntGetCurIconObject(Handle);
- if(CurIconObject)
- {
- /* Copy fields */
- Status = MmCopyFromCaller(&CurIconObject->IconInfo, IconInfo, sizeof(ICONINFO));
- if(!NT_SUCCESS(Status))
- {
- SetLastNtError(Status);
- goto done;
- }
-
- bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor);
- if(bmp)
- {
- CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx;
- CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy;
- BITMAPOBJ_UnlockBitmap(bmp);
- GDIOBJ_SetOwnership(CurIconObject->IconInfo.hbmColor, NULL);
- }
- else
- {
- bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask);
- if(!bmp)
- goto done;
+ PCURICON_OBJECT CurIconObject;
+ PBITMAPOBJ bmp;
+ PWINSTATION_OBJECT WinStaObject;
+ NTSTATUS Status;
+ BOOL Ret = FALSE;
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserSetCursorIconContents\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
- CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx;
- CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy / 2;
+ CurIconObject = IntGetCurIconObject(Handle);
+ if(CurIconObject)
+ {
+ /* Copy fields */
+ Status = MmCopyFromCaller(&CurIconObject->IconInfo, IconInfo, sizeof(ICONINFO));
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ goto done;
+ }
- BITMAPOBJ_UnlockBitmap(bmp);
- GDIOBJ_SetOwnership(CurIconObject->IconInfo.hbmMask, NULL);
- }
+ bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor);
+ if(bmp)
+ {
+ CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx;
+ CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy;
+ BITMAPOBJ_UnlockBitmap(bmp);
+ GDIOBJ_SetOwnership(CurIconObject->IconInfo.hbmColor, NULL);
+ }
+ else
+ {
+ bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask);
+ if(!bmp)
+ goto done;
- Ret = TRUE;
+ CurIconObject->Size.cx = bmp->SurfObj.sizlBitmap.cx;
+ CurIconObject->Size.cy = bmp->SurfObj.sizlBitmap.cy / 2;
- done:
- IntReleaseCurIconObject(CurIconObject);
- ObDereferenceObject(WinStaObject);
- RETURN( Ret);
- }
+ BITMAPOBJ_UnlockBitmap(bmp);
+ GDIOBJ_SetOwnership(CurIconObject->IconInfo.hbmMask, NULL);
+ }
+
+ Ret = TRUE;
+
+done:
+ IntReleaseCurIconObject(CurIconObject);
+ ObDereferenceObject(WinStaObject);
+ RETURN( Ret);
+ }
+
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
+ ObDereferenceObject(WinStaObject);
+ RETURN( FALSE);
- SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
- ObDereferenceObject(WinStaObject);
- RETURN( FALSE);
-
CLEANUP:
- DPRINT("Leave NtUserSetCursorIconContents, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserSetCursorIconContents, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
BOOL
STDCALL
NtUserSetCursorIconData(
- HANDLE Handle,
- PBOOL fIcon,
- POINT *Hotspot,
- HMODULE hModule,
- HRSRC hRsrc,
- HRSRC hGroupRsrc)
+ HANDLE Handle,
+ PBOOL fIcon,
+ POINT *Hotspot,
+ HMODULE hModule,
+ HRSRC hRsrc,
+ HRSRC hGroupRsrc)
{
- PCURICON_OBJECT CurIconObject;
- PWINSTATION_OBJECT WinStaObject;
- NTSTATUS Status;
- POINT SafeHotspot;
- BOOL Ret = FALSE;
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserSetCursorIconData\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- CurIconObject = IntGetCurIconObject(Handle);
- if(CurIconObject)
- {
- CurIconObject->hModule = hModule;
- CurIconObject->hRsrc = hRsrc;
- CurIconObject->hGroupRsrc = hGroupRsrc;
-
- /* Copy fields */
- if(fIcon)
- {
- Status = MmCopyFromCaller(&CurIconObject->IconInfo.fIcon, fIcon, sizeof(BOOL));
- if(!NT_SUCCESS(Status))
+ PCURICON_OBJECT CurIconObject;
+ PWINSTATION_OBJECT WinStaObject;
+ NTSTATUS Status;
+ POINT SafeHotspot;
+ BOOL Ret = FALSE;
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserSetCursorIconData\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
+
+ CurIconObject = IntGetCurIconObject(Handle);
+ if(CurIconObject)
+ {
+ CurIconObject->hModule = hModule;
+ CurIconObject->hRsrc = hRsrc;
+ CurIconObject->hGroupRsrc = hGroupRsrc;
+
+ /* Copy fields */
+ if(fIcon)
{
- SetLastNtError(Status);
- goto done;
+ Status = MmCopyFromCaller(&CurIconObject->IconInfo.fIcon, fIcon, sizeof(BOOL));
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ goto done;
+ }
}
- }
- else
- {
- if(!Hotspot)
- Ret = TRUE;
- }
-
- if(Hotspot)
- {
- Status = MmCopyFromCaller(&SafeHotspot, Hotspot, sizeof(POINT));
- if(NT_SUCCESS(Status))
+ else
{
- CurIconObject->IconInfo.xHotspot = SafeHotspot.x;
- CurIconObject->IconInfo.yHotspot = SafeHotspot.y;
+ if(!Hotspot)
+ Ret = TRUE;
+ }
- Ret = TRUE;
+ if(Hotspot)
+ {
+ Status = MmCopyFromCaller(&SafeHotspot, Hotspot, sizeof(POINT));
+ if(NT_SUCCESS(Status))
+ {
+ CurIconObject->IconInfo.xHotspot = SafeHotspot.x;
+ CurIconObject->IconInfo.yHotspot = SafeHotspot.y;
+
+ Ret = TRUE;
+ }
+ else
+ SetLastNtError(Status);
}
- else
- SetLastNtError(Status);
- }
- if(!fIcon && !Hotspot)
- {
- Ret = TRUE;
- }
-
- done:
- IntReleaseCurIconObject(CurIconObject);
- ObDereferenceObject(WinStaObject);
- RETURN( Ret);
- }
-
- SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
- ObDereferenceObject(WinStaObject);
- RETURN( FALSE);
-
+ if(!fIcon && !Hotspot)
+ {
+ Ret = TRUE;
+ }
+
+done:
+ IntReleaseCurIconObject(CurIconObject);
+ ObDereferenceObject(WinStaObject);
+ RETURN( Ret);
+ }
+
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
+ ObDereferenceObject(WinStaObject);
+ RETURN( FALSE);
+
CLEANUP:
- DPRINT("Leave NtUserSetCursorIconData, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserSetCursorIconData, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}
BOOL
STDCALL
NtUserSetSystemCursor(
- HCURSOR hcur,
- DWORD id)
+ HCURSOR hcur,
+ DWORD id)
{
- return FALSE;
+ return FALSE;
}
BOOL
STDCALL
NtUserDrawIconEx(
- HDC hdc,
- int xLeft,
- int yTop,
- HICON hIcon,
- int cxWidth,
- int cyWidth,
- UINT istepIfAniCur,
- HBRUSH hbrFlickerFreeDraw,
- UINT diFlags,
- DWORD Unknown0,
- DWORD Unknown1)
+ HDC hdc,
+ int xLeft,
+ int yTop,
+ HICON hIcon,
+ int cxWidth,
+ int cyWidth,
+ UINT istepIfAniCur,
+ HBRUSH hbrFlickerFreeDraw,
+ UINT diFlags,
+ DWORD Unknown0,
+ DWORD Unknown1)
{
- PCURICON_OBJECT CurIconObject;
- PWINSTATION_OBJECT WinStaObject;
- HBITMAP hbmMask, hbmColor;
- BITMAP bmpMask, bmpColor;
- BOOL DoFlickerFree;
- SIZE IconSize;
- COLORREF oldFg, oldBg;
- HDC hdcMem, hdcOff = (HDC)0;
- HBITMAP hbmOff = (HBITMAP)0;
- HGDIOBJ hOldOffBrush = 0, hOldOffBmp = 0, hOldMem;
- BOOL Ret = FALSE;
- #if CANSTRETCHBLT
- INT nStretchMode;
- #endif
- DECLARE_RETURN(BOOL);
-
- DPRINT("Enter NtUserDrawIconEx\n");
- UserEnterExclusive();
-
- WinStaObject = IntGetWinStaObj();
- if(WinStaObject == NULL)
- {
- RETURN( FALSE);
- }
-
- CurIconObject = IntGetCurIconObject(hIcon);
- if(CurIconObject)
- {
- hbmMask = CurIconObject->IconInfo.hbmMask;
- hbmColor = CurIconObject->IconInfo.hbmColor;
- IntReleaseCurIconObject(CurIconObject);
-
- if(istepIfAniCur)
- DPRINT1("NtUserDrawIconEx: istepIfAniCur is not supported!\n");
-
- if(!hbmMask || !IntGdiGetObject(hbmMask, sizeof(BITMAP), &bmpMask))
- goto done;
-
- if(hbmColor && !IntGdiGetObject(hbmColor, sizeof(BITMAP), &bmpColor))
- goto done;
-
- if(hbmColor)
- {
- IconSize.cx = bmpColor.bmWidth;
- IconSize.cy = bmpColor.bmHeight;
- }
- else
- {
- IconSize.cx = bmpMask.bmWidth;
- IconSize.cy = bmpMask.bmHeight / 2;
- }
-
- if(!diFlags)
- diFlags = DI_NORMAL;
-
- if(!cxWidth)
- cxWidth = ((diFlags & DI_DEFAULTSIZE) ? UserGetSystemMetrics(SM_CXICON) : IconSize.cx);
- if(!cyWidth)
- cyWidth = ((diFlags & DI_DEFAULTSIZE) ? UserGetSystemMetrics(SM_CYICON) : IconSize.cy);
-
- DoFlickerFree = (hbrFlickerFreeDraw && (NtGdiGetObjectType(hbrFlickerFreeDraw) == OBJ_BRUSH));
-
- if(DoFlickerFree)
- {
- RECT r;
- r.right = cxWidth;
- r.bottom = cyWidth;
-
- hdcOff = NtGdiCreateCompatableDC(hdc);
- if(!hdcOff)
- goto done;
-
- hbmOff = NtGdiCreateCompatibleBitmap(hdc, cxWidth, cyWidth);
- if(!hbmOff)
+ PCURICON_OBJECT CurIconObject;
+ PWINSTATION_OBJECT WinStaObject;
+ HBITMAP hbmMask, hbmColor;
+ BITMAP bmpMask, bmpColor;
+ BOOL DoFlickerFree;
+ SIZE IconSize;
+ COLORREF oldFg, oldBg;
+ HDC hdcMem, hdcOff = (HDC)0;
+ HBITMAP hbmOff = (HBITMAP)0;
+ HGDIOBJ hOldOffBrush = 0, hOldOffBmp = 0, hOldMem;
+ BOOL Ret = FALSE;
+#if CANSTRETCHBLT
+
+ INT nStretchMode;
+#endif
+
+ DECLARE_RETURN(BOOL);
+
+ DPRINT("Enter NtUserDrawIconEx\n");
+ UserEnterExclusive();
+
+ WinStaObject = IntGetWinStaObj();
+ if(WinStaObject == NULL)
+ {
+ RETURN( FALSE);
+ }
+
+ CurIconObject = IntGetCurIconObject(hIcon);
+ if(CurIconObject)
+ {
+ hbmMask = CurIconObject->IconInfo.hbmMask;
+ hbmColor = CurIconObject->IconInfo.hbmColor;
+ IntReleaseCurIconObject(CurIconObject);
+
+ if(istepIfAniCur)
+ DPRINT1("NtUserDrawIconEx: istepIfAniCur is not supported!\n");
+
+ if(!hbmMask || !IntGdiGetObject(hbmMask, sizeof(BITMAP), &bmpMask))
+ goto done;
+
+ if(hbmColor && !IntGdiGetObject(hbmColor, sizeof(BITMAP), &bmpColor))
+ goto done;
+
+ if(hbmColor)
+ {
+ IconSize.cx = bmpColor.bmWidth;
+ IconSize.cy = bmpColor.bmHeight;
+ }
+ else
+ {
+ IconSize.cx = bmpMask.bmWidth;
+ IconSize.cy = bmpMask.bmHeight / 2;
+ }
+
+ if(!diFlags)
+ diFlags = DI_NORMAL;
+
+ if(!cxWidth)
+ cxWidth = ((diFlags & DI_DEFAULTSIZE) ? UserGetSystemMetrics(SM_CXICON) : IconSize.cx);
+ if(!cyWidth)
+ cyWidth = ((diFlags & DI_DEFAULTSIZE) ? UserGetSystemMetrics(SM_CYICON) : IconSize.cy);
+
+ DoFlickerFree = (hbrFlickerFreeDraw && (NtGdiGetObjectType(hbrFlickerFreeDraw) == OBJ_BRUSH));
+
+ if(DoFlickerFree)
{
- NtGdiDeleteDC(hdcOff);
- goto done;
+ RECT r;
+ r.right = cxWidth;
+ r.bottom = cyWidth;
+
+ hdcOff = NtGdiCreateCompatableDC(hdc);
+ if(!hdcOff)
+ goto done;
+
+ hbmOff = NtGdiCreateCompatibleBitmap(hdc, cxWidth, cyWidth);
+ if(!hbmOff)
+ {
+ NtGdiDeleteDC(hdcOff);
+ goto done;
+ }
+ hOldOffBrush = NtGdiSelectObject(hdcOff, hbrFlickerFreeDraw);
+ hOldOffBmp = NtGdiSelectObject(hdcOff, hbmOff);
+ NtGdiPatBlt(hdcOff, 0, 0, r.right, r.bottom, PATCOPY);
+ NtGdiSelectObject(hdcOff, hbmOff);
}
- hOldOffBrush = NtGdiSelectObject(hdcOff, hbrFlickerFreeDraw);
- hOldOffBmp = NtGdiSelectObject(hdcOff, hbmOff);
- NtGdiPatBlt(hdcOff, 0, 0, r.right, r.bottom, PATCOPY);
- NtGdiSelectObject(hdcOff, hbmOff);
- }
-
- hdcMem = NtGdiCreateCompatableDC(hdc);
- if(!hdcMem)
- goto cleanup;
-
- if(!DoFlickerFree)
- hdcOff = hdc;
-
- #if CANSTRETCHBLT
- nStretchMode = NtGdiSetStretchBltMode(hdcOff, STRETCH_DELETESCANS);
- #endif
- oldFg = NtGdiSetTextColor(hdcOff, RGB(0, 0, 0));
- oldBg = NtGdiSetBkColor(hdcOff, RGB(255, 255, 255));
-
- if(diFlags & DI_MASK)
- {
- hOldMem = NtGdiSelectObject(hdcMem, hbmMask);
- #if CANSTRETCHBLT
- NtGdiStretchBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
- cxWidth, cyWidth, hdcMem, 0, 0, IconSize.cx, IconSize.cy,
- ((diFlags & DI_IMAGE) ? SRCAND : SRCCOPY));
- #else
- NtGdiBitBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
- cxWidth, cyWidth, hdcMem, 0, 0, ((diFlags & DI_IMAGE) ? SRCAND : SRCCOPY));
- #endif
- if(!hbmColor && (bmpMask.bmHeight == 2 * bmpMask.bmWidth) && (diFlags & DI_IMAGE))
+
+ hdcMem = NtGdiCreateCompatableDC(hdc);
+ if(!hdcMem)
+ goto cleanup;
+
+ if(!DoFlickerFree)
+ hdcOff = hdc;
+
+#if CANSTRETCHBLT
+
+ nStretchMode = NtGdiSetStretchBltMode(hdcOff, STRETCH_DELETESCANS);
+#endif
+
+ oldFg = NtGdiSetTextColor(hdcOff, RGB(0, 0, 0));
+ oldBg = NtGdiSetBkColor(hdcOff, RGB(255, 255, 255));
+
+ if(diFlags & DI_MASK)
{
- #if CANSTRETCHBLT
- NtGdiStretchBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
- cxWidth, cyWidth, hdcMem, 0, IconSize.cy, IconSize.cx, IconSize.cy, SRCINVERT);
- #else
- NtGdiBitBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
- cxWidth, cyWidth, hdcMem, 0, IconSize.cy, SRCINVERT);
- #endif
- diFlags &= ~DI_IMAGE;
+ hOldMem = NtGdiSelectObject(hdcMem, hbmMask);
+#if CANSTRETCHBLT
+
+ NtGdiStretchBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
+ cxWidth, cyWidth, hdcMem, 0, 0, IconSize.cx, IconSize.cy,
+ ((diFlags & DI_IMAGE) ? SRCAND : SRCCOPY));
+#else
+
+ NtGdiBitBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
+ cxWidth, cyWidth, hdcMem, 0, 0, ((diFlags & DI_IMAGE) ? SRCAND : SRCCOPY));
+#endif
+
+ if(!hbmColor && (bmpMask.bmHeight == 2 * bmpMask.bmWidth) && (diFlags & DI_IMAGE))
+ {
+#if CANSTRETCHBLT
+ NtGdiStretchBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
+ cxWidth, cyWidth, hdcMem, 0, IconSize.cy, IconSize.cx, IconSize.cy, SRCINVERT);
+#else
+
+ NtGdiBitBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
+ cxWidth, cyWidth, hdcMem, 0, IconSize.cy, SRCINVERT);
+#endif
+
+ diFlags &= ~DI_IMAGE;
+ }
+ NtGdiSelectObject(hdcMem, hOldMem);
}
- NtGdiSelectObject(hdcMem, hOldMem);
- }
-
- if(diFlags & DI_IMAGE)
- {
- hOldMem = NtGdiSelectObject(hdcMem, (hbmColor ? hbmColor : hbmMask));
- #if CANSTRETCHBLT
- NtGdiStretchBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
- cxWidth, cyWidth, hdcMem, 0, (hbmColor ? 0 : IconSize.cy),
- IconSize.cx, IconSize.cy, ((diFlags & DI_MASK) ? SRCINVERT : SRCCOPY));
- #else
- NtGdiBitBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
- cxWidth, cyWidth, hdcMem, 0, (hbmColor ? 0 : IconSize.cy),
- ((diFlags & DI_MASK) ? SRCINVERT : SRCCOPY));
- #endif
- NtGdiSelectObject(hdcMem, hOldMem);
- }
-
- if(DoFlickerFree)
- NtGdiBitBlt(hdc, xLeft, yTop, cxWidth, cyWidth, hdcOff, 0, 0, SRCCOPY);
-
- NtGdiSetTextColor(hdcOff, oldFg);
- NtGdiSetBkColor(hdcOff, oldBg);
- #if CANSTRETCHBLT
- SetStretchBltMode(hdcOff, nStretchMode);
- #endif
-
- Ret = TRUE;
-
- cleanup:
- if(DoFlickerFree)
- {
-
- NtGdiSelectObject(hdcOff, hOldOffBmp);
- NtGdiSelectObject(hdcOff, hOldOffBrush);
- NtGdiDeleteObject(hbmOff);
- NtGdiDeleteDC(hdcOff);
- }
- if(hdcMem)
- NtGdiDeleteDC(hdcMem);
-
- done:
- ObDereferenceObject(WinStaObject);
-
- RETURN( Ret);
- }
-
- SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
- ObDereferenceObject(WinStaObject);
- RETURN( FALSE);
-
+
+ if(diFlags & DI_IMAGE)
+ {
+ hOldMem = NtGdiSelectObject(hdcMem, (hbmColor ? hbmColor : hbmMask));
+#if CANSTRETCHBLT
+
+ NtGdiStretchBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
+ cxWidth, cyWidth, hdcMem, 0, (hbmColor ? 0 : IconSize.cy),
+ IconSize.cx, IconSize.cy, ((diFlags & DI_MASK) ? SRCINVERT : SRCCOPY));
+#else
+
+ NtGdiBitBlt(hdcOff, (DoFlickerFree ? 0 : xLeft), (DoFlickerFree ? 0 : yTop),
+ cxWidth, cyWidth, hdcMem, 0, (hbmColor ? 0 : IconSize.cy),
+ ((diFlags & DI_MASK) ? SRCINVERT : SRCCOPY));
+#endif
+
+ NtGdiSelectObject(hdcMem, hOldMem);
+ }
+
+ if(DoFlickerFree)
+ NtGdiBitBlt(hdc, xLeft, yTop, cxWidth, cyWidth, hdcOff, 0, 0, SRCCOPY);
+
+ NtGdiSetTextColor(hdcOff, oldFg);
+ NtGdiSetBkColor(hdcOff, oldBg);
+#if CANSTRETCHBLT
+
+ SetStretchBltMode(hdcOff, nStretchMode);
+#endif
+
+ Ret = TRUE;
+
+cleanup:
+ if(DoFlickerFree)
+ {
+
+ NtGdiSelectObject(hdcOff, hOldOffBmp);
+ NtGdiSelectObject(hdcOff, hOldOffBrush);
+ NtGdiDeleteObject(hbmOff);
+ NtGdiDeleteDC(hdcOff);
+ }
+ if(hdcMem)
+ NtGdiDeleteDC(hdcMem);
+
+done:
+ ObDereferenceObject(WinStaObject);
+
+ RETURN( Ret);
+ }
+
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
+ ObDereferenceObject(WinStaObject);
+ RETURN( FALSE);
+
CLEANUP:
- DPRINT("Leave NtUserDrawIconEx, ret=%i\n",_ret_);
- UserLeave();
- END_CLEANUP;
+ DPRINT("Leave NtUserDrawIconEx, ret=%i\n",_ret_);
+ UserLeave();
+ END_CLEANUP;
}