/*********************************************************************** * 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; }
//******************************************************************** 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; }
/*********************************************************************** * 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 ); }
/*********************************************************************** * 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 ); }
/*********************************************************************** * 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(); }
//******************************************************************** 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; }
/*********************************************************************** * 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; }
/*********************************************************************** * 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(); }
/*********************************************************************** * 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; }
/************************************************************************** * 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); }
static inline NE_MODULE *get_module( HMODULE16 mod ) { if (!mod) mod = TASK_GetCurrent()->hModule; return NE_GetPtr( mod ); }