ListEntry);
/* Free memory */
- ExFreePool(Mem);
+ ExFreePoolWithTag(Mem, USERTAG_CALLBACK);
}
}
/* FUNCTIONS *****************************************************************/
/* Calls ClientLoadLibrary in user32 */
-HMODULE
+BOOL
+NTAPI
co_IntClientLoadLibrary(PUNICODE_STRING pstrLibName,
PUNICODE_STRING pstrInitFunc,
BOOL Unload,
ULONG ArgumentLength;
PCLIENT_LOAD_LIBRARY_ARGUMENTS pArguments;
NTSTATUS Status;
- HMODULE Result;
+ BOOL bResult;
ULONG_PTR pLibNameBuffer = 0, pInitFuncBuffer = 0;
+ /* Do not allow the desktop thread to do callback to user mode */
+ ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
TRACE("co_IntClientLoadLibrary: %S, %S, %d, %d\n", pstrLibName->Buffer, pstrLibName->Buffer, Unload, ApiHook);
/* Calculate the size of the argument */
_SEH2_TRY
{
+ /* Probe and copy the usermode result data */
ProbeForRead(ResultPointer, sizeof(HMODULE), 1);
- /* Simulate old behaviour: copy into our local buffer */
- Result = *(HMODULE*)ResultPointer;
+ bResult = *(BOOL*)ResultPointer;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Result = 0;
+ bResult = FALSE;
}
_SEH2_END;
- return Result;
+ return bResult;
}
VOID APIENTRY
ULONG ResultLength;
NTSTATUS Status;
+ /* Do not allow the desktop thread to do callback to user mode */
+ ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
Arguments.Callback = CompletionCallback;
Arguments.Wnd = hWnd;
Arguments.Msg = Msg;
ULONG ArgumentLength;
LRESULT Result;
+ /* Do not allow the desktop thread to do callback to user mode */
+ ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
if (0 < lParamBufferSize)
{
ArgumentLength = sizeof(WINDOWPROC_CALLBACK_ARGUMENTS) + lParamBufferSize;
PVOID ResultPointer;
ULONG ResultLength;
+ /* Do not allow the desktop thread to do callback to user mode */
+ ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
ResultPointer = NULL;
ResultLength = sizeof(LRESULT);
UserLeaveCo();
Status = KeUserModeCallback(USER32_CALLBACK_LOADSYSMENUTEMPLATE,
- NULL,
+ &ResultPointer,
0,
&ResultPointer,
&ResultLength);
return (HMENU)Result;
}
+extern HCURSOR gDesktopCursor;
+
BOOL APIENTRY
co_IntLoadDefaultCursors(VOID)
{
ULONG ResultLength;
BOOL DefaultCursor = TRUE;
+ /* Do not allow the desktop thread to do callback to user mode */
+ ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
ResultPointer = NULL;
- ResultLength = sizeof(LRESULT);
+ ResultLength = sizeof(HCURSOR);
UserLeaveCo();
UserEnterCo();
+ /* HACK: The desktop class doen't have a proper cursor yet, so set it here */
+ gDesktopCursor = *((HCURSOR*)ResultPointer);
+
if (!NT_SUCCESS(Status))
{
return FALSE;
WPARAM wParam,
LPARAM lParam,
HOOKPROC Proc,
+ INT Mod,
+ ULONG_PTR offPfn,
BOOLEAN Ansi,
PUNICODE_STRING ModuleName)
{
UINT lParamSize = 0;
ASSERT(Proc);
+ /* Do not allow the desktop thread to do callback to user mode */
+ ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
pti = PsGetCurrentThreadWin32Thread();
if (pti->TIF_flags & TIF_INCLEANUP)
Common->wParam = wParam;
Common->lParam = lParam;
Common->Proc = Proc;
+ Common->Mod = Mod;
+ Common->offPfn = offPfn;
Common->Ansi = Ansi;
+ RtlZeroMemory(&Common->ModuleName, sizeof(Common->ModuleName));
+ RtlCopyMemory(&Common->ModuleName, ModuleName->Buffer, ModuleName->Length);
Extra = (PCHAR) Common + sizeof(HOOKPROC_CALLBACK_ARGUMENTS);
switch(HookId)
ULONG ArgumentLength, ResultLength;
PVOID Argument, ResultPointer;
+ /* Do not allow the desktop thread to do callback to user mode */
+ ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
ArgumentLength = ResultLength = 0;
Argument = ResultPointer = NULL;