/* * Win32 kernel functions * * Copyright 1995 Martin von Loewis */ #include #include #include #include "windows.h" #include "winerror.h" #include "heap.h" #include "thread.h" #include "process.h" #include "pe_image.h" #include "file.h" #include "task.h" #include "toolhelp.h" #include "debug.h" /********************************************************************** * GetProcessAffinityMask */ BOOL32 WINAPI GetProcessAffinityMask(HANDLE32 hProcess, LPDWORD lpProcessAffinityMask, LPDWORD lpSystemAffinityMask) { TRACE(task,"(%x,%lx,%lx)\n", hProcess,(lpProcessAffinityMask?*lpProcessAffinityMask:0), (lpSystemAffinityMask?*lpSystemAffinityMask:0)); /* It is definitely important for a process to know on what processor it is running :-) */ if(lpProcessAffinityMask) *lpProcessAffinityMask=1; if(lpSystemAffinityMask) *lpSystemAffinityMask=1; return TRUE; } /********************************************************************** * SetThreadAffinityMask * Works now like the Windows95 (no MP support) version */ BOOL32 WINAPI SetThreadAffinityMask(HANDLE32 hThread, DWORD dwThreadAffinityMask) { THDB *thdb = THREAD_GetPtr( hThread, THREAD_SET_INFORMATION, NULL ); if (!thdb) return FALSE; if (dwThreadAffinityMask!=1) { WARN(thread,"(%d,%ld): only 1 processor supported.\n", (int)hThread,dwThreadAffinityMask); K32OBJ_DecCount((K32OBJ*)thdb); return FALSE; } K32OBJ_DecCount((K32OBJ*)thdb); return TRUE; } /********************************************************************** * ContinueDebugEvent [KERNEL32.146] */ BOOL32 WINAPI ContinueDebugEvent(DWORD pid,DWORD tid,DWORD contstatus) { FIXME(win32,"(0x%lx,%ld,%ld): stub\n",pid,tid,contstatus); return TRUE; } /********************************************************************* * Process_ClockTimeToFileTime * (olorin@fandra.org, 20-Sep-1998) * Converts clock_t into FILETIME. * Used by GetProcessTime. * Differences to UnixTimeToFileTime: * 1) Divided by CLK_TCK * 2) Time is relative. There is no 'starting date', so there is * no need in offset correction, like in UnixTimeToFileTime * FIXME: This function should be moved to a more appropriate .c file * FIXME: On floating point operations, it is assumed that * floating values are truncated on convertion to integer. */ void Process_ClockTimeToFileTime( clock_t unix_time, LPFILETIME filetime ) { double td = (unix_time*10000000.0)/CLK_TCK; /* Yes, double, because long int might overflow here. */ #if (SIZEOF_LONG_LONG >= 8) unsigned long long t = td; filetime->dwLowDateTime = (UINT32) t; filetime->dwHighDateTime = (UINT32) (t >> 32); #else double divider = 1. * (1 << 16) * (1 << 16); filetime->dwHighDateTime = (UINT32) (td / divider); filetime->dwLowDateTime = (UINT32) (td - filetime->dwHighDateTime*divider); /* using floor() produces wierd results, better leave this as it is * ( with (UINT32) convertion ) */ #endif } /********************************************************************* * GetProcessTimes [KERNEL32.262] * * FIXME: lpCreationTime, lpExitTime are NOT INITIALIZED. * olorin@fandra.org: Would be nice to substract the cpu time, * used by Wine at startup. * Also, there is a need to separate times * used by different applications. */ BOOL32 WINAPI GetProcessTimes( HANDLE32 hprocess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime ) { struct tms tms; times(&tms); Process_ClockTimeToFileTime(tms.tms_utime,lpUserTime); Process_ClockTimeToFileTime(tms.tms_stime,lpKernelTime); return TRUE; }