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;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- ERR("Failed to copy result from user mode!\n");
+ ERR("Failed to copy result from user mode Message %d!\n", Message);
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
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;
return Status;
}
+HANDLE FASTCALL
+co_IntCopyImage(HANDLE hnd, UINT type, INT desiredx, INT desiredy, UINT flags)
+{
+ HANDLE Handle;
+ NTSTATUS Status;
+ ULONG ArgumentLength, ResultLength;
+ PVOID Argument, ResultPointer;
+ PCOPYIMAGE_CALLBACK_ARGUMENTS Common;
+
+ ArgumentLength = ResultLength = 0;
+ Argument = ResultPointer = NULL;
+
+ ArgumentLength = sizeof(COPYIMAGE_CALLBACK_ARGUMENTS);
+
+ Argument = IntCbAllocateMemory(ArgumentLength);
+ if (NULL == Argument)
+ {
+ ERR("CopyImage callback failed: out of memory\n");
+ return 0;
+ }
+ Common = (PCOPYIMAGE_CALLBACK_ARGUMENTS) Argument;
+
+ Common->hImage = hnd;
+ Common->uType = type;
+ Common->cxDesired = desiredx;
+ Common->cyDesired = desiredy;
+ Common->fuFlags = flags;
+
+ UserLeaveCo();
+
+ Status = KeUserModeCallback(USER32_CALLBACK_COPYIMAGE,
+ Argument,
+ ArgumentLength,
+ &ResultPointer,
+ &ResultLength);
+
+
+ UserEnterCo();
+
+ Handle = *(HANDLE*)ResultPointer;
+
+ IntCbFreeMemory(Argument);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("CopyImage callback failed!\n");
+ return 0;
+ }
+
+ return Handle;
+}
+
BOOL
APIENTRY
co_IntGetCharsetInfo(LCID Locale, PCHARSETINFO pCs)
return TRUE;
}
+BOOL FASTCALL
+co_IntSetWndIcons(VOID)
+{
+ NTSTATUS Status;
+ ULONG ArgumentLength, ResultLength;
+ PVOID Argument, ResultPointer;
+ PSETWNDICONS_CALLBACK_ARGUMENTS Common;
+
+ ArgumentLength = ResultLength = 0;
+ Argument = ResultPointer = NULL;
+
+ ArgumentLength = sizeof(SETWNDICONS_CALLBACK_ARGUMENTS);
+
+ Argument = IntCbAllocateMemory(ArgumentLength);
+ if (NULL == Argument)
+ {
+ ERR("Set Window Icons callback failed: out of memory\n");
+ return FALSE;
+ }
+ Common = (PSETWNDICONS_CALLBACK_ARGUMENTS) Argument;
+
+ UserLeaveCo();
+
+ Status = KeUserModeCallback(USER32_CALLBACK_SETWNDICONS,
+ Argument,
+ ArgumentLength,
+ &ResultPointer,
+ &ResultLength);
+
+
+ UserEnterCo();
+
+ /* FIXME: Need to setup Registry System Cursor & Icons via Callbacks at init time! */
+ gpsi->hIconSmWindows = Common->hIconSmWindows;
+ gpsi->hIconWindows = Common->hIconWindows;
+
+ ERR("hIconSmWindows %p hIconWindows %p \n",gpsi->hIconSmWindows,gpsi->hIconWindows);
+
+ IntCbFreeMemory(Argument);
+
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("Set Window Icons callback failed!\n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/* EOF */