Exemplo n.º 1
0
/***********************************************************************
 *           GetDummyModuleHandleDS   (KERNEL.602)
 */
WORD WINAPI GetDummyModuleHandleDS16(void)
{
    TDB *pTask;
    WORD selector;

    if (!(pTask = TASK_GetCurrent())) return 0;
    if (!(pTask->flags & TDBF_WIN32)) return 0;
    selector = GlobalHandleToSel16( pTask->hModule );
    CURRENT_DS = selector;
    return selector;
}
Exemplo n.º 2
0
//********************************************************************
BOOL WINAPI TBASE_ReAllocValue(TBASE_VALUE** a_ppValue, DWORD a_dwType, TBASE_VALUE_DATA *a_pData, DWORD a_cbSize)
{
    TBASE_VALUE* pValue = NULL;
    DWORD        cbSize = 0;
    TTaskInfo*   pTaskInfo = TASK_GetCurrent();
    TPtrIter     iter;     
    
    if (pTaskInfo==NULL)
        return NULL;

    //-----------------------------------------------------------
    if (IsBadWritePtr(a_ppValue, sizeof(TBASE_VALUE*)))
    {
        TASK_SetErrorInfo(TRERR_INVALID_PARAMETER, NULL, NULL);
        return FALSE;
    }
    pValue = *a_ppValue;
    //----------------------------------------------------------
    iter = pTaskInfo->m_setPointers.find(pValue);
    if (iter==pTaskInfo->m_setPointers.end())
    {
        TASK_SetErrorInfo(TRERR_INVALID_PARAMETER, NULL, NULL);
        return FALSE;
    }
    //----------------------------------------------------------
    if (!_ValidateData(a_dwType, a_pData, a_cbSize))
    {
        TASK_SetErrorInfo(TRERR_INVALID_DATA, NULL, NULL);
        return NULL;
    };
    //-----------------------------------------------------------

    cbSize = _GetDataSize(a_dwType, a_pData, a_cbSize);
    //-----------------------------------------------------------
    if (cbSize==0)
    {
        TASK_SetErrorInfo(TRERR_INVALID_TYPE, NULL, NULL);
        return FALSE;
    }
    //-----------------------------------------------------------
    pValue = (TBASE_VALUE*)realloc(pValue, cbSize);
    pValue->dwType = a_dwType;
    pValue->cbSize = cbSize;

    // wype³nij...
    memcpy(&pValue->data, a_pData, cbSize-offsetof(TBASE_VALUE, data));

    *a_ppValue = pValue;
    *iter      = pValue;

    return TRUE;
}
Exemplo n.º 3
0
Arquivo: task.c Projeto: Barrell/wine
/***********************************************************************
 *           TASK_CallTaskSignalProc
 */
static void TASK_CallTaskSignalProc( UINT16 uCode, HANDLE16 hTaskOrModule )
{
    WORD args[5];
    TDB *pTask = TASK_GetCurrent();

    if ( !pTask || !pTask->userhandler ) return;

    args[4] = hTaskOrModule;
    args[3] = uCode;
    args[2] = 0;
    args[1] = pTask->hInstance;
    args[0] = pTask->hQueue;
    WOWCallback16Ex( (DWORD)pTask->userhandler, WCB16_PASCAL, sizeof(args), args, NULL );
}
Exemplo n.º 4
0
Arquivo: task.c Projeto: Barrell/wine
/***********************************************************************
 *           TASK_ExitTask
 */
void TASK_ExitTask(void)
{
    WIN16_SUBSYSTEM_TIB *tib;
    TDB *pTask;
    DWORD lockCount;

    /* Enter the Win16Lock to protect global data structures */
    _EnterWin16Lock();

    pTask = TASK_GetCurrent();
    if ( !pTask )
    {
        _LeaveWin16Lock();
        return;
    }

    TRACE("Killing task %04x\n", pTask->hSelf );

    /* Perform USER cleanup */

    TASK_CallTaskSignalProc( USIG16_TERMINATION, pTask->hSelf );

    /* Remove the task from the list to be sure we never switch back to it */
    TASK_UnlinkTask( pTask->hSelf );

    if (!nTaskCount || (nTaskCount == 1 && hFirstTask == initial_task))
    {
        TRACE("this is the last task, exiting\n" );
        ExitKernel16();
    }

    pTask->nEvents = 0;

    if ( hLockedTask == pTask->hSelf )
        hLockedTask = 0;

    TASK_DeleteTask( pTask->hSelf );

    if ((tib = NtCurrentTeb()->Tib.SubSystemTib))
    {
        free_win16_tib( tib );
        NtCurrentTeb()->Tib.SubSystemTib = NULL;
    }

    /* ... and completely release the Win16Lock, just in case. */
    ReleaseThunkLock( &lockCount );
}
Exemplo n.º 5
0
/***********************************************************************
 *           Yield  (KERNEL.29)
 */
void WINAPI Yield16(void)
{
    TDB *pCurTask = TASK_GetCurrent();

    if (pCurTask && pCurTask->hQueue)
    {
        HMODULE mod = GetModuleHandleA( "user32.dll" );
        if (mod)
        {
            FARPROC proc = GetProcAddress( mod, "UserYield16" );
            if (proc)
            {
                proc();
                return;
            }
        }
    }
    OldYield16();
}
Exemplo n.º 6
0
//********************************************************************
BOOL WINAPI TBASE_AddValueRef(TBASE_VALUE* a_pValue)
{
    TTaskInfo*   pTaskInfo = TASK_GetCurrent();
    TPtrIter     iter;     

    if (pTaskInfo==NULL)
    {
        return FALSE;
    }
    //----------------------------------------------------------
    iter = pTaskInfo->m_setPointers.find(a_pValue);
    if (iter==pTaskInfo->m_setPointers.end())
    {
        TASK_SetErrorInfo(TRERR_INVALID_PARAMETER, NULL, NULL);
        return FALSE;
    }
    a_pValue->dwRefCount++;
    return TRUE;
}
Exemplo n.º 7
0
Arquivo: task.c Projeto: Barrell/wine
/***********************************************************************
 *           SetSigHandler   (KERNEL.140)
 */
WORD WINAPI SetSigHandler16( FARPROC16 newhandler, FARPROC16* oldhandler,
                           UINT16 *oldmode, UINT16 newmode, UINT16 flag )
{
    FIXME("(%p,%p,%p,%d,%d), unimplemented.\n",
	  newhandler,oldhandler,oldmode,newmode,flag );

    if (flag != 1) return 0;
    if (!newmode) newhandler = NULL;  /* Default handler */
    if (newmode != 4)
    {
        TDB *pTask;

        if (!(pTask = TASK_GetCurrent())) return 0;
        if (oldmode) *oldmode = pTask->signal_flags;
        pTask->signal_flags = newmode;
        if (oldhandler) *oldhandler = pTask->sighandler;
        pTask->sighandler = newhandler;
    }
    return 0;
}
Exemplo n.º 8
0
Arquivo: task.c Projeto: Barrell/wine
/***********************************************************************
 *           Yield  (KERNEL.29)
 */
void WINAPI Yield16(void)
{
    TDB *pCurTask = TASK_GetCurrent();

    if (pCurTask && pCurTask->hQueue)
    {
        HMODULE mod = GetModuleHandleA( "user32.dll" );
        if (mod)
        {
            BOOL (WINAPI *pPeekMessageW)( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags );
            pPeekMessageW = (void *)GetProcAddress( mod, "PeekMessageW" );
            if (pPeekMessageW)
            {
                MSG msg;
                pPeekMessageW( &msg, 0, 0, 0, PM_REMOVE | PM_QS_SENDMESSAGE );
                return;
            }
        }
    }
    OldYield16();
}
Exemplo n.º 9
0
Arquivo: task.c Projeto: Barrell/wine
/***********************************************************************
 *           TASK_FreeThunk
 *
 * Free a MakeProcInstance() thunk.
 */
static BOOL TASK_FreeThunk( SEGPTR thunk )
{
    TDB *pTask;
    THUNKS *pThunk;
    WORD sel, base;

    if (!(pTask = TASK_GetCurrent())) return 0;
    sel = pTask->hCSAlias;
    pThunk = (THUNKS *)pTask->thunks;
    base = (char *)pThunk - (char *)pTask;
    while (sel && (sel != HIWORD(thunk)))
    {
        sel = pThunk->next;
        pThunk = GlobalLock16( sel );
        base = 0;
    }
    if (!sel) return FALSE;
    *(WORD *)((BYTE *)pThunk + LOWORD(thunk) - base) = pThunk->free;
    pThunk->free = LOWORD(thunk) - base;
    return TRUE;
}
Exemplo n.º 10
0
Arquivo: task.c Projeto: Barrell/wine
/**************************************************************************
 *           FatalAppExit   (KERNEL.137)
 */
void WINAPI FatalAppExit16( UINT16 action, LPCSTR str )
{
    TDB *pTask = TASK_GetCurrent();

    if (!pTask || !(pTask->error_mode & SEM_NOGPFAULTERRORBOX))
    {
        HMODULE mod = GetModuleHandleA( "user32.dll" );
        if (mod)
        {
            MessageBoxA_funcptr pMessageBoxA = (MessageBoxA_funcptr)GetProcAddress( mod, "MessageBoxA" );
            if (pMessageBoxA)
            {
                pMessageBoxA( 0, str, NULL, MB_SYSTEMMODAL | MB_OK );
                goto done;
            }
        }
        ERR( "%s\n", debugstr_a(str) );
    }
 done:
    ExitThread(0xff);
}
Exemplo n.º 11
0
static inline NE_MODULE *get_module( HMODULE16 mod )
{
    if (!mod) mod = TASK_GetCurrent()->hModule;
    return NE_GetPtr( mod );
}