[NTOSKRNL/WIN32K/NDK]

- OkToClose procedure (OB_OKAYTOCLOSE_METHOD) returns BOOLEAN, not NTSTATUS
- Check ppi for NULL before dereferencing it in IntWinstaOkToClose (it is NULL, if we do our job of cleaning up the win32 process properly)
- Set the win32 process info to NULL on process cleanup
- Free THREADINFO and PROCESSINFO instead of leaking them
- Set NULL cursor, when the last thread is cleaned up in win32k, so we don't call UserSetCursor() in the process cleanup, when we don't have a THREADINFO anymore. This should hopefully fix a crash of MSVC builds.
- Remove unused UserGetNextHandle function
- Fix some warnings

svn path=/trunk/; revision=53211
This commit is contained in:
Timo Kreuzer 2011-08-13 20:10:40 +00:00
parent 6e9b31dafd
commit 62f7fcc714
7 changed files with 33 additions and 42 deletions

View file

@ -236,7 +236,7 @@ typedef NTSTATUS
IN KPROCESSOR_MODE AccessMode IN KPROCESSOR_MODE AccessMode
); );
typedef NTSTATUS typedef BOOLEAN
(NTAPI *OB_OKAYTOCLOSE_METHOD)( (NTAPI *OB_OKAYTOCLOSE_METHOD)(
IN PEPROCESS Process OPTIONAL, IN PEPROCESS Process OPTIONAL,
IN PVOID Object, IN PVOID Object,

View file

@ -43,7 +43,7 @@ PKWIN32_DELETEMETHOD_CALLOUT ExpDesktopObjectDelete = NULL;
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
NTSTATUS BOOLEAN
NTAPI NTAPI
ExpDesktopOkToClose( IN PEPROCESS Process OPTIONAL, ExpDesktopOkToClose( IN PEPROCESS Process OPTIONAL,
IN PVOID Object, IN PVOID Object,
@ -57,10 +57,10 @@ ExpDesktopOkToClose( IN PEPROCESS Process OPTIONAL,
Parameters.Handle = Handle; Parameters.Handle = Handle;
Parameters.PreviousMode = AccessMode; Parameters.PreviousMode = AccessMode;
return ExpDesktopObjectOkToClose(&Parameters); return NT_SUCCESS(ExpDesktopObjectOkToClose(&Parameters));
} }
NTSTATUS BOOLEAN
NTAPI NTAPI
ExpWindowStationOkToClose( IN PEPROCESS Process OPTIONAL, ExpWindowStationOkToClose( IN PEPROCESS Process OPTIONAL,
IN PVOID Object, IN PVOID Object,
@ -74,7 +74,7 @@ ExpWindowStationOkToClose( IN PEPROCESS Process OPTIONAL,
Parameters.Handle = Handle; Parameters.Handle = Handle;
Parameters.PreviousMode = AccessMode; Parameters.PreviousMode = AccessMode;
return ExpWindowStationObjectOkToClose(&Parameters); return NT_SUCCESS(ExpWindowStationObjectOkToClose(&Parameters));
} }
VOID VOID

View file

@ -35,8 +35,8 @@ typedef struct _ROSSYM_KM_OWN_CONTEXT {
static BOOLEAN LoadSymbols; static BOOLEAN LoadSymbols;
static LIST_ENTRY SymbolFileListHead; static LIST_ENTRY SymbolFileListHead;
static KSPIN_LOCK SymbolFileListLock; static KSPIN_LOCK SymbolFileListLock;
static PROSSYM_INFO KdbpRosSymInfo; //static PROSSYM_INFO KdbpRosSymInfo;
static ULONG_PTR KdbpImageBase; //static ULONG_PTR KdbpImageBase;
BOOLEAN KdbpSymbolsInitialized = FALSE; BOOLEAN KdbpSymbolsInitialized = FALSE;
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
@ -178,7 +178,9 @@ KdbSymPrintAddress(
PMEMORY_AREA MemoryArea = NULL; PMEMORY_AREA MemoryArea = NULL;
PROS_SECTION_OBJECT SectionObject; PROS_SECTION_OBJECT SectionObject;
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
#if 0
PROSSYM_KM_OWN_CONTEXT FileContext; PROSSYM_KM_OWN_CONTEXT FileContext;
#endif
ULONG_PTR RelativeAddress; ULONG_PTR RelativeAddress;
NTSTATUS Status; NTSTATUS Status;
ROSSYM_LINEINFO LineInfo = {0}; ROSSYM_LINEINFO LineInfo = {0};

View file

@ -203,6 +203,10 @@ Win32kProcessCallback(struct _EPROCESS *Process,
GdiPoolDestroy(Win32Process->pPoolDcAttr); GdiPoolDestroy(Win32Process->pPoolDcAttr);
GdiPoolDestroy(Win32Process->pPoolBrushAttr); GdiPoolDestroy(Win32Process->pPoolBrushAttr);
GdiPoolDestroy(Win32Process->pPoolRgnAttr); GdiPoolDestroy(Win32Process->pPoolRgnAttr);
/* Ftee the PROCESSINFO */
PsSetProcessWin32Process(Process, NULL);
ExFreePoolWithTag(Win32Process, USERTAG_PROCESSINFO);
} }
RETURN( STATUS_SUCCESS); RETURN( STATUS_SUCCESS);
@ -418,10 +422,18 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
IntSetThreadDesktop(NULL, TRUE); IntSetThreadDesktop(NULL, TRUE);
/* Decrement thread count */ /* Decrement thread count and check if its 0 */
ppiCurrent->cThreads--; ppiCurrent->cThreads--;
if (ppiCurrent->cThreads == 0)
{
/* UGLY: Prevent this function from being called later
when we don't have a THREADINFO anymore. */
UserSetCursor(NULL, TRUE);
}
/* Free the THREADINFO */
PsSetThreadWin32Thread(Thread, NULL); PsSetThreadWin32Thread(Thread, NULL);
ExFreePoolWithTag(ptiCurrent, USERTAG_THREADINFO);
} }
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;

View file

@ -182,10 +182,10 @@ IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters)
if( Parameters->Handle == pti->ppi->hdeskStartup || if( Parameters->Handle == pti->ppi->hdeskStartup ||
Parameters->Handle == pti->hdesk) Parameters->Handle == pti->hdesk)
{ {
return FALSE; return STATUS_ACCESS_DENIED;
} }
return TRUE; return STATUS_SUCCESS;
} }
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/

View file

@ -261,31 +261,7 @@ void *get_user_object_handle(PUSER_HANDLE_TABLE ht, HANDLE* handle, USER_OBJECT
return entry->ptr; return entry->ptr;
} }
/* return the next user handle after 'handle' that is of a given type */
PVOID UserGetNextHandle(PUSER_HANDLE_TABLE ht, HANDLE* handle, USER_OBJECT_TYPE type )
{
PUSER_HANDLE_ENTRY entry;
if (!*handle)
entry = ht->handles;
else
{
int index = (((unsigned int)*handle & 0xffff) - FIRST_USER_HANDLE) >> 1;
if (index < 0 || index >= ht->nb_handles)
return NULL;
entry = ht->handles + index + 1; /* start from the next one */
}
while (entry < ht->handles + ht->nb_handles)
{
if (!type || entry->type == type)
{
*handle = entry_to_handle(ht, entry );
return entry->ptr;
}
entry++;
}
return NULL;
}
BOOL FASTCALL UserCreateHandleTable(VOID) BOOL FASTCALL UserCreateHandleTable(VOID)
{ {

View file

@ -187,19 +187,20 @@ IntWinStaObjectParse(PWIN32_PARSEMETHOD_PARAMETERS Parameters)
return STATUS_OBJECT_TYPE_MISMATCH; return STATUS_OBJECT_TYPE_MISMATCH;
} }
NTSTATUS NTAPI NTSTATUS
NTAPI
IntWinstaOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters) IntWinstaOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters)
{ {
PPROCESSINFO ppi; PPROCESSINFO ppi;
ppi = PsGetCurrentProcessWin32Process(); ppi = PsGetCurrentProcessWin32Process();
if(Parameters->Handle == ppi->hwinsta) if(ppi && (Parameters->Handle == ppi->hwinsta))
{ {
return FALSE; return STATUS_ACCESS_DENIED;
} }
return TRUE; return STATUS_SUCCESS;
} }
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/