mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 20:25:39 +00:00
[user32]
- Merge from the themes branch svn path=/trunk/; revision=53747
This commit is contained in:
parent
080da6ec72
commit
2b6c22f611
5 changed files with 147 additions and 11 deletions
|
@ -23,11 +23,14 @@ extern HINSTANCE User32Instance;
|
||||||
extern PPROCESSINFO g_ppi;
|
extern PPROCESSINFO g_ppi;
|
||||||
extern ULONG_PTR g_ulSharedDelta;
|
extern ULONG_PTR g_ulSharedDelta;
|
||||||
extern PSERVERINFO gpsi;
|
extern PSERVERINFO gpsi;
|
||||||
extern BOOL gfServerProcess;
|
extern BOOLEAN gfServerProcess;
|
||||||
extern PUSER_HANDLE_TABLE gHandleTable;
|
extern PUSER_HANDLE_TABLE gHandleTable;
|
||||||
extern PUSER_HANDLE_ENTRY gHandleEntries;
|
extern PUSER_HANDLE_ENTRY gHandleEntries;
|
||||||
extern CRITICAL_SECTION U32AccelCacheLock;
|
extern CRITICAL_SECTION U32AccelCacheLock;
|
||||||
extern HINSTANCE hImmInstance;
|
extern HINSTANCE hImmInstance;
|
||||||
|
extern RTL_CRITICAL_SECTION gcsUserApiHook;
|
||||||
|
extern USERAPIHOOK guah;
|
||||||
|
extern HINSTANCE ghmodUserApiHook;
|
||||||
|
|
||||||
#define IS_ATOM(x) \
|
#define IS_ATOM(x) \
|
||||||
(((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000))
|
(((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000))
|
||||||
|
@ -51,13 +54,13 @@ extern void SPY_ExitMessage(INT iFlag, HWND hwnd, UINT msg, LRESULT lReturn, WPA
|
||||||
extern int SPY_Init(void);
|
extern int SPY_Init(void);
|
||||||
|
|
||||||
/* definitions for usrapihk.c */
|
/* definitions for usrapihk.c */
|
||||||
extern RTL_CRITICAL_SECTION gcsUserApiHook;
|
|
||||||
extern USERAPIHOOK guah;
|
|
||||||
BOOL FASTCALL BeginIfHookedUserApiHook(VOID);
|
BOOL FASTCALL BeginIfHookedUserApiHook(VOID);
|
||||||
BOOL FASTCALL EndUserApiHook(VOID);
|
BOOL FASTCALL EndUserApiHook(VOID);
|
||||||
BOOL FASTCALL IsInsideUserApiHook(VOID);
|
BOOL FASTCALL IsInsideUserApiHook(VOID);
|
||||||
VOID FASTCALL ResetUserApiHook(PUSERAPIHOOK);
|
VOID FASTCALL ResetUserApiHook(PUSERAPIHOOK);
|
||||||
BOOL FASTCALL IsMsgOverride(UINT,PUAHOWP);
|
BOOL FASTCALL IsMsgOverride(UINT,PUAHOWP);
|
||||||
|
BOOL WINAPI InitUserApiHook(HINSTANCE hInstance, USERAPIHOOKPROC pfn);
|
||||||
|
BOOL WINAPI ClearUserApiHook(HINSTANCE hInstance);
|
||||||
|
|
||||||
/* definitions for message.c */
|
/* definitions for message.c */
|
||||||
BOOL FASTCALL MessageInit(VOID);
|
BOOL FASTCALL MessageInit(VOID);
|
||||||
|
|
|
@ -13,7 +13,7 @@ PUSER_HANDLE_TABLE gHandleTable = NULL;
|
||||||
PUSER_HANDLE_ENTRY gHandleEntries = NULL;
|
PUSER_HANDLE_ENTRY gHandleEntries = NULL;
|
||||||
PSERVERINFO gpsi = NULL;
|
PSERVERINFO gpsi = NULL;
|
||||||
ULONG_PTR g_ulSharedDelta;
|
ULONG_PTR g_ulSharedDelta;
|
||||||
BOOL gfServerProcess = FALSE;
|
BOOLEAN gfServerProcess = FALSE;
|
||||||
|
|
||||||
WCHAR szAppInit[KEY_LENGTH];
|
WCHAR szAppInit[KEY_LENGTH];
|
||||||
|
|
||||||
|
@ -217,6 +217,8 @@ Init(VOID)
|
||||||
(PVOID)User32CallLoadMenuFromKernel;
|
(PVOID)User32CallLoadMenuFromKernel;
|
||||||
KernelCallbackTable[USER32_CALLBACK_CLIENTTHREADSTARTUP] =
|
KernelCallbackTable[USER32_CALLBACK_CLIENTTHREADSTARTUP] =
|
||||||
(PVOID)User32CallClientThreadSetupFromKernel;
|
(PVOID)User32CallClientThreadSetupFromKernel;
|
||||||
|
KernelCallbackTable[USER32_CALLBACK_CLIENTLOADLIBRARY] =
|
||||||
|
(PVOID)User32CallClientLoadLibraryFromKernel;
|
||||||
|
|
||||||
NtUserProcessConnect( NtCurrentProcess(),
|
NtUserProcessConnect( NtCurrentProcess(),
|
||||||
&UserCon,
|
&UserCon,
|
||||||
|
@ -229,8 +231,9 @@ Init(VOID)
|
||||||
gHandleEntries = SharedPtrToUser(gHandleTable->handles);
|
gHandleEntries = SharedPtrToUser(gHandleTable->handles);
|
||||||
|
|
||||||
RtlInitializeCriticalSection(&gcsUserApiHook);
|
RtlInitializeCriticalSection(&gcsUserApiHook);
|
||||||
gfServerProcess = TRUE; // FIXME HAX! Used in CsrClientConnectToServer(,,,,&gfServerProcess);
|
gfServerProcess = FALSE; // FIXME HAX! Used in CsrClientConnectToServer(,,,,&gfServerProcess);
|
||||||
|
|
||||||
|
//CsrClientConnectToServer(L"\\Windows", 0, NULL, 0, &gfServerProcess);
|
||||||
//ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta);
|
//ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta);
|
||||||
|
|
||||||
/* Allocate an index for user32 thread local data. */
|
/* Allocate an index for user32 thread local data. */
|
||||||
|
|
|
@ -200,7 +200,7 @@ ClearUserApiHook(HINSTANCE hInstance)
|
||||||
if ( ghmodUserApiHook == hInstance )
|
if ( ghmodUserApiHook == hInstance )
|
||||||
{
|
{
|
||||||
pfn1 = gpfnInitUserApi;
|
pfn1 = gpfnInitUserApi;
|
||||||
if ( --gcLoadUserApiHook == 1 )
|
if ( --gcLoadUserApiHook == 0 )
|
||||||
{
|
{
|
||||||
gfUserApiHook = 0;
|
gfUserApiHook = 0;
|
||||||
ResetUserApiHook(&guah);
|
ResetUserApiHook(&guah);
|
||||||
|
@ -228,7 +228,7 @@ ClearUserApiHook(HINSTANCE hInstance)
|
||||||
RtlEnterCriticalSection(&gcsUserApiHook);
|
RtlEnterCriticalSection(&gcsUserApiHook);
|
||||||
pfn1 = gpfnInitUserApi;
|
pfn1 = gpfnInitUserApi;
|
||||||
|
|
||||||
if ( --gcLoadUserApiHook == 1 )
|
if ( --gcLoadUserApiHook == 0 )
|
||||||
{
|
{
|
||||||
if ( gcCallUserApiHook )
|
if ( gcCallUserApiHook )
|
||||||
{
|
{
|
||||||
|
@ -392,7 +392,5 @@ BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO puah)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI UnregisterUserApiHook(VOID)
|
BOOL WINAPI UnregisterUserApiHook(VOID)
|
||||||
{
|
{
|
||||||
// Direct call to Win32k! Here only as a prototype.....
|
return NtUserUnregisterUserApiHook();
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2200,7 +2200,13 @@ DefWindowProcA(HWND hWnd,
|
||||||
|
|
||||||
Hook = BeginIfHookedUserApiHook();
|
Hook = BeginIfHookedUserApiHook();
|
||||||
if (Hook)
|
if (Hook)
|
||||||
|
{
|
||||||
msgOverride = IsMsgOverride(Msg, &guah.DefWndProcArray);
|
msgOverride = IsMsgOverride(Msg, &guah.DefWndProcArray);
|
||||||
|
if(msgOverride == FALSE)
|
||||||
|
{
|
||||||
|
EndUserApiHook();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Bypass SEH and go direct. */
|
/* Bypass SEH and go direct. */
|
||||||
if (!Hook || !msgOverride)
|
if (!Hook || !msgOverride)
|
||||||
|
@ -2233,7 +2239,13 @@ DefWindowProcW(HWND hWnd,
|
||||||
|
|
||||||
Hook = BeginIfHookedUserApiHook();
|
Hook = BeginIfHookedUserApiHook();
|
||||||
if (Hook)
|
if (Hook)
|
||||||
|
{
|
||||||
msgOverride = IsMsgOverride(Msg, &guah.DefWndProcArray);
|
msgOverride = IsMsgOverride(Msg, &guah.DefWndProcArray);
|
||||||
|
if(msgOverride == FALSE)
|
||||||
|
{
|
||||||
|
EndUserApiHook();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Bypass SEH and go direct. */
|
/* Bypass SEH and go direct. */
|
||||||
if (!Hook || !msgOverride)
|
if (!Hook || !msgOverride)
|
||||||
|
|
|
@ -427,6 +427,126 @@ SetWindowsHookExW(
|
||||||
return IntSetWindowsHook(idHook, lpfn, hMod, dwThreadId, FALSE);
|
return IntSetWindowsHook(idHook, lpfn, hMod, dwThreadId, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HINSTANCE ClientLoadLibrary(PUNICODE_STRING pstrLibName,
|
||||||
|
PUNICODE_STRING pstrInitFunc,
|
||||||
|
BOOL Unload,
|
||||||
|
BOOL ApiHook)
|
||||||
|
{
|
||||||
|
HINSTANCE hLibrary;
|
||||||
|
PVOID pInitFunction;
|
||||||
|
NTSTATUS Status;
|
||||||
|
ANSI_STRING InitFuncName;
|
||||||
|
BOOL Result = FALSE;
|
||||||
|
|
||||||
|
TRACE("ClientLoadLibrary: pid: %d, strLibraryName: %S, "
|
||||||
|
"strInitFuncName: %S, Unload: %d, ApiHook:%d\n",
|
||||||
|
GetCurrentProcessId(),
|
||||||
|
pstrLibName->Buffer,
|
||||||
|
pstrInitFunc->Buffer,
|
||||||
|
Unload,
|
||||||
|
ApiHook);
|
||||||
|
|
||||||
|
/* Check if we have to load the module */
|
||||||
|
if(Unload == FALSE)
|
||||||
|
{
|
||||||
|
ASSERT(pstrLibName->Buffer != NULL);
|
||||||
|
|
||||||
|
/* Load it */
|
||||||
|
hLibrary = LoadLibrary(pstrLibName->Buffer);
|
||||||
|
if(hLibrary == 0)
|
||||||
|
{
|
||||||
|
return hLibrary;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ApiHook == FALSE)
|
||||||
|
{
|
||||||
|
/* There is nothing more to do for a global hook*/
|
||||||
|
return hLibrary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize the user api hook */
|
||||||
|
ASSERT(pstrInitFunc->Buffer);
|
||||||
|
|
||||||
|
Status = RtlUnicodeStringToAnsiString(&InitFuncName,
|
||||||
|
pstrInitFunc,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
/* Get the address of the initialization routine */
|
||||||
|
pInitFunction = GetProcAddress(hLibrary, InitFuncName.Buffer);
|
||||||
|
if(pInitFunction)
|
||||||
|
{
|
||||||
|
/* Call the initialization routine */
|
||||||
|
Result = InitUserApiHook(hLibrary, (USERAPIHOOKPROC)pInitFunction);
|
||||||
|
}
|
||||||
|
RtlFreeAnsiString(&InitFuncName);
|
||||||
|
|
||||||
|
/* In case of error unload the library */
|
||||||
|
if(Result == FALSE)
|
||||||
|
{
|
||||||
|
FreeLibrary(hLibrary);
|
||||||
|
hLibrary = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Cleanup user api hook before unloading */
|
||||||
|
if(ApiHook == TRUE)
|
||||||
|
{
|
||||||
|
hLibrary = ghmodUserApiHook;
|
||||||
|
Result = ClearUserApiHook(ghmodUserApiHook);
|
||||||
|
/* Check if we can we unload it now */
|
||||||
|
if(Result == FALSE)
|
||||||
|
{
|
||||||
|
/* Return success because we are going to free
|
||||||
|
the library in EndUserApiHook*/
|
||||||
|
return hLibrary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hLibrary = GetModuleHandle(pstrLibName->Buffer);
|
||||||
|
Result = (hLibrary != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Result == TRUE)
|
||||||
|
{
|
||||||
|
Result = FreeLibrary(hLibrary);
|
||||||
|
if(Result == FALSE)
|
||||||
|
{
|
||||||
|
hLibrary = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hLibrary;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS WINAPI
|
||||||
|
User32CallClientLoadLibraryFromKernel(PVOID Arguments, ULONG ArgumentLength)
|
||||||
|
{
|
||||||
|
HINSTANCE Result;
|
||||||
|
PCLIENT_LOAD_LIBRARY_ARGUMENTS Argument;
|
||||||
|
|
||||||
|
/* Retireve the callback parameters */
|
||||||
|
Argument = (PCLIENT_LOAD_LIBRARY_ARGUMENTS)Arguments;
|
||||||
|
if(Argument->strLibraryName.Buffer != NULL)
|
||||||
|
{
|
||||||
|
Argument->strLibraryName.Buffer = (PWCHAR)((ULONG_PTR)Argument->strLibraryName.Buffer + (ULONG_PTR)Argument);
|
||||||
|
}
|
||||||
|
if(Argument->strInitFuncName.Buffer != NULL)
|
||||||
|
{
|
||||||
|
Argument->strInitFuncName.Buffer = (PWCHAR)((ULONG_PTR)Argument->strInitFuncName.Buffer + (ULONG_PTR)Argument);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call the implementation of the callback */
|
||||||
|
Result = ClientLoadLibrary(&Argument->strLibraryName,
|
||||||
|
&Argument->strInitFuncName,
|
||||||
|
Argument->Unload,
|
||||||
|
Argument->ApiHook);
|
||||||
|
|
||||||
|
return ZwCallbackReturn(&Result, sizeof(HINSTANCE), STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS WINAPI
|
NTSTATUS WINAPI
|
||||||
User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
|
User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue