static NTSTATUS
IntMapDesktopView(IN PDESKTOP DesktopObject)
{
- PTHREADINFO ti;
PPROCESSINFO CurrentWin32Process;
PW32HEAP_USER_MAPPING HeapMapping, *PrevLink;
PVOID UserBase = NULL;
ObReferenceObject(DesktopObject);
- /* create a W32THREADINFO structure if not already done, or update it */
- ti = GetW32ThreadInfo();
- GetWin32ClientInfo()->ulClientDelta = DesktopHeapGetUserDelta();
- if (ti != NULL)
- {
- if (GetWin32ClientInfo()->pDeskInfo == NULL)
- {
- GetWin32ClientInfo()->pDeskInfo =
- (PVOID)((ULONG_PTR)DesktopObject->pDeskInfo -
- GetWin32ClientInfo()->ulClientDelta);
- }
- }
-
return STATUS_SUCCESS;
}
PTHREADINFO W32Thread;
NTSTATUS Status;
BOOL MapHeap;
+ CLIENTTHREADINFO ctiSave;
DPRINT("IntSetThreadDesktop() DO=%p, FOF=%d\n", DesktopObject, FreeOnFailure);
MapHeap = (PsGetCurrentProcess() != PsInitialSystemProcess);
SetLastNtError(Status);
return FALSE;
}
+ W32Thread->pDeskInfo = DesktopObject->pDeskInfo;
+ }
+
+ RtlZeroMemory(&ctiSave, sizeof(CLIENTTHREADINFO));
+
+ if (W32Thread->pcti && OldDesktop)
+ {
+ RtlCopyMemory(&ctiSave, W32Thread->pcti, sizeof(CLIENTTHREADINFO));
+ DPRINT("Free ClientThreadInfo\n");
+ DesktopHeapFree(OldDesktop, W32Thread->pcti);
+ W32Thread->pcti = NULL;
+ }
+
+ if (!W32Thread->pcti && DesktopObject)
+ {
+ DPRINT("Allocate ClientThreadInfo\n");
+ W32Thread->pcti = DesktopHeapAlloc( DesktopObject,
+ sizeof(CLIENTTHREADINFO));
+ RtlCopyMemory(W32Thread->pcti, &ctiSave, sizeof(CLIENTTHREADINFO));
}
- /* Hack for system threads */
if (NtCurrentTeb())
{
PCLIENTINFO pci = GetWin32ClientInfo();
if (DesktopObject)
{
pci->pDeskInfo = (PVOID)((ULONG_PTR)DesktopObject->pDeskInfo - pci->ulClientDelta);
+ if (W32Thread->pcti) pci->pClientThreadInfo = (PVOID)((ULONG_PTR)W32Thread->pcti - pci->ulClientDelta);
}
}