214 lines
5.2 KiB
C
214 lines
5.2 KiB
C
/*
|
|
* Task functions
|
|
*
|
|
* Copyright 1995 Alexandre Julliard
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "wine/port.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif
|
|
|
|
#include "winbase.h"
|
|
#include "wingdi.h"
|
|
#include "winnt.h"
|
|
#include "winuser.h"
|
|
|
|
#include "wine/winbase16.h"
|
|
#include "drive.h"
|
|
#include "file.h"
|
|
#include "global.h"
|
|
#include "instance.h"
|
|
#include "module.h"
|
|
#include "winternl.h"
|
|
#include "selectors.h"
|
|
#include "wine/server.h"
|
|
#include "stackframe.h"
|
|
#include "task.h"
|
|
#include "thread.h"
|
|
#include "toolhelp.h"
|
|
|
|
#include "wine/debug.h"
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(task);
|
|
|
|
/* Min. number of thunks allocated when creating a new segment */
|
|
#define MIN_THUNKS 32
|
|
|
|
|
|
static THHOOK DefaultThhook;
|
|
THHOOK *pThhook = &DefaultThhook;
|
|
|
|
#define hFirstTask (pThhook->HeadTDB)
|
|
|
|
/***********************************************************************
|
|
* TASK_GetPtr
|
|
*/
|
|
static TDB *TASK_GetPtr( HTASK16 hTask )
|
|
{
|
|
return GlobalLock16( hTask );
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* TASK_GetCurrent
|
|
*/
|
|
TDB *TASK_GetCurrent(void)
|
|
{
|
|
return TASK_GetPtr( GetCurrentTask() );
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* PostEvent (KERNEL.31)
|
|
*/
|
|
void WINAPI PostEvent16( HTASK16 hTask )
|
|
{
|
|
TDB *pTask;
|
|
|
|
if (!hTask) hTask = GetCurrentTask();
|
|
if (!(pTask = TASK_GetPtr( hTask ))) return;
|
|
|
|
if (pTask->flags & TDBF_WIN32)
|
|
{
|
|
FIXME("called for Win32 thread (%04x)!\n", pTask->teb->teb_sel );
|
|
return;
|
|
}
|
|
|
|
pTask->nEvents++;
|
|
|
|
if (pTask->nEvents == 1) NtSetEvent( pTask->hEvent, NULL );
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* OldYield (KERNEL.117)
|
|
*/
|
|
void WINAPI OldYield16(void)
|
|
{
|
|
DWORD count;
|
|
|
|
ReleaseThunkLock(&count);
|
|
RestoreThunkLock(count);
|
|
}
|
|
|
|
/***********************************************************************
|
|
* DirectedYield (KERNEL.150)
|
|
*/
|
|
void WINAPI DirectedYield16( HTASK16 hTask )
|
|
{
|
|
OldYield16();
|
|
}
|
|
|
|
/***********************************************************************
|
|
* GetCurrentTask (KERNEL32.@)
|
|
*/
|
|
HTASK16 WINAPI GetCurrentTask(void)
|
|
{
|
|
return NtCurrentTeb()->htask16;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* GetCurrentPDB (KERNEL.37)
|
|
*
|
|
* UNDOC: returns PSP of KERNEL in high word
|
|
*/
|
|
DWORD WINAPI GetCurrentPDB16(void)
|
|
{
|
|
TDB *pTask;
|
|
|
|
if (!(pTask = TASK_GetCurrent())) return 0;
|
|
return MAKELONG(pTask->hPDB, 0); /* FIXME */
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* GetExePtrHelper
|
|
*/
|
|
static inline HMODULE16 GetExePtrHelper( HANDLE16 handle, HTASK16 *hTask )
|
|
{
|
|
char *ptr;
|
|
HANDLE16 owner;
|
|
|
|
/* Check for module handle */
|
|
|
|
if (!(ptr = GlobalLock16( handle ))) return 0;
|
|
if (((NE_MODULE *)ptr)->magic == IMAGE_OS2_SIGNATURE) return handle;
|
|
|
|
/* Search for this handle inside all tasks */
|
|
|
|
*hTask = hFirstTask;
|
|
while (*hTask)
|
|
{
|
|
TDB *pTask = TASK_GetPtr( *hTask );
|
|
if ((*hTask == handle) ||
|
|
(pTask->hInstance == handle) ||
|
|
(pTask->hQueue == handle) ||
|
|
(pTask->hPDB == handle)) return pTask->hModule;
|
|
*hTask = pTask->hNext;
|
|
}
|
|
|
|
/* Check the owner for module handle */
|
|
|
|
owner = FarGetOwner16( handle );
|
|
if (!(ptr = GlobalLock16( owner ))) return 0;
|
|
if (((NE_MODULE *)ptr)->magic == IMAGE_OS2_SIGNATURE) return owner;
|
|
|
|
/* Search for the owner inside all tasks */
|
|
|
|
*hTask = hFirstTask;
|
|
while (*hTask)
|
|
{
|
|
TDB *pTask = TASK_GetPtr( *hTask );
|
|
if ((*hTask == owner) ||
|
|
(pTask->hInstance == owner) ||
|
|
(pTask->hQueue == owner) ||
|
|
(pTask->hPDB == owner)) return pTask->hModule;
|
|
*hTask = pTask->hNext;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* GetExePtr (KERNEL.133)
|
|
*/
|
|
HMODULE16 WINAPI WIN16_GetExePtr( HANDLE16 handle )
|
|
{
|
|
HTASK16 hTask = 0;
|
|
HMODULE16 hModule = GetExePtrHelper( handle, &hTask );
|
|
STACK16FRAME *frame = CURRENT_STACK16;
|
|
frame->ecx = hModule;
|
|
if (hTask) frame->es = hTask;
|
|
return hModule;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* K228 (KERNEL.228)
|
|
*/
|
|
HMODULE16 WINAPI GetExePtr( HANDLE16 handle )
|
|
{
|
|
HTASK16 hTask = 0;
|
|
return GetExePtrHelper( handle, &hTask );
|
|
}
|