Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

196 lines
3.8 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
RestoreSystemCursors.cpp
Abstract:
Due to a bug in NT, cursors are not correctly restored with the following
code sequence:
1. hNewCursor = LoadCursor(0, "cursor.cur");
2. SetSystemCursor(hNewCursor, OCR_NORMAL)
3. hOldCursor = LoadCursor(0,MAKEINTRESOURCE(OCR_NORMAL));
4. SetSystemCursor(hOldCursor, OCR_NORMAL)
The last call (4) does nothing on NT, but works correctly on Win9x.
To fix this we use the known USER workaround, namely CopyCursor. Note that
this will probably be fixed in Whistler by the time it ships.
Notes:
This is a general purpose shim.
History:
02/13/2000 linstev Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(RestoreSystemCursors)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(GetCommandLineA)
APIHOOK_ENUM_ENTRY(GetCommandLineW)
APIHOOK_ENUM_END
#define OCR_NORMAL 32512UL
#define OCR_IBEAM 32513UL
#define OCR_WAIT 32514UL
#define OCR_CROSS 32515UL
#define OCR_UP 32516UL
#define OCR_SIZE 32640UL
#define OCR_ICON 32641UL
#define OCR_SIZENWSE 32642UL
#define OCR_SIZENESW 32643UL
#define OCR_SIZEWE 32644UL
#define OCR_SIZENS 32645UL
#define OCR_SIZEALL 32646UL
#define OCR_ICOCUR 32647UL
#define OCR_NO 32648UL
#define OCR_HAND 32649UL
#define OCR_APPSTARTING 32650UL
struct CURSOR
{
DWORD id;
HCURSOR hCursor;
};
CURSOR g_arrCursors[] =
{
{OCR_NORMAL, 0},
{OCR_IBEAM, 0},
{OCR_WAIT, 0},
{OCR_CROSS, 0},
{OCR_UP, 0},
{OCR_SIZE, 0},
{OCR_ICON, 0},
{OCR_SIZENWSE, 0},
{OCR_SIZENESW, 0},
{OCR_SIZEWE, 0},
{OCR_SIZENS, 0},
{OCR_SIZEALL, 0},
{OCR_ICOCUR, 0},
{OCR_NO, 0},
{OCR_HAND, 0},
{OCR_APPSTARTING, 0}
};
BOOL g_bInit = FALSE;
/*++
Backup cursors.
--*/
VOID
BackupCursors()
{
if (!g_bInit)
{
g_bInit = TRUE;
// Backup all the cursors
for (int i=0; i<sizeof(g_arrCursors)/sizeof(CURSOR);i++)
{
HCURSOR hCursorT = LoadCursor(0,MAKEINTRESOURCE(g_arrCursors[i].id));
if (hCursorT)
{
g_arrCursors[i].hCursor = CopyCursor(hCursorT);
DestroyCursor(hCursorT);
}
else
{
g_arrCursors[i].hCursor = 0;
}
}
}
}
/*++
Restore cursors.
--*/
VOID
RestoreCursors()
{
if (g_bInit)
{
// Restore all the cursors
for (int i=0; i<sizeof(g_arrCursors)/sizeof(CURSOR);i++)
{
if (g_arrCursors[i].hCursor)
{
SetSystemCursor(g_arrCursors[i].hCursor, g_arrCursors[i].id);
DestroyCursor(g_arrCursors[i].hCursor);
}
}
}
}
/*++
Backup cursors.
--*/
LPSTR
APIHOOK(GetCommandLineA)()
{
BackupCursors();
return ORIGINAL_API(GetCommandLineA)();
}
/*++
Backup cursors.
--*/
LPWSTR
APIHOOK(GetCommandLineW)()
{
BackupCursors();
return ORIGINAL_API(GetCommandLineW)();
}
/*++
Register hooked functions
--*/
BOOL
NOTIFY_FUNCTION(
DWORD fdwReason
)
{
if (fdwReason == DLL_PROCESS_DETACH) {
RestoreCursors();
}
return TRUE;
}
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineA)
APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineW)
HOOK_END
IMPLEMENT_SHIM_END