From: Roger U. <ru...@us...> - 2007-01-25 04:17:46
|
Update of /cvsroot/pywin32/pywin32/win32/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1254/win32/src Modified Files: win32process.i Log Message: Various changes for 64-bit compatibility (HANDLE's and SIZE_T's) _beginthreadex returns null on failure Standardize loading of function pointers Index: win32process.i =================================================================== RCS file: /cvsroot/pywin32/pywin32/win32/src/win32process.i,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** win32process.i 16 Jan 2007 19:04:21 -0000 1.23 --- win32process.i 25 Jan 2007 04:17:42 -0000 1.24 *************** *** 19,32 **** #define CHECK_PFN(fname)if (pfn##fname==NULL) return PyErr_Format(PyExc_NotImplementedError,"%s is not available on this platform", #fname); - static BOOL (WINAPI *fpEnumProcesses)(DWORD *, DWORD, DWORD *) = NULL; - static BOOL (WINAPI *fpEnumProcessModules)(HANDLE, HMODULE *, DWORD, LPDWORD) = NULL; - static DWORD (WINAPI *fpGetModuleFileNameEx)(HANDLE, HMODULE, WCHAR *, DWORD) = NULL; - #ifndef MS_WINCE - static BOOL (WINAPI *fpGetProcessMemoryInfo)(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD) = NULL; - static BOOL (WINAPI *fpGetProcessTimes)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME) = NULL; - static BOOL (WINAPI *fpGetProcessIoCounters)(HANDLE, PIO_COUNTERS) = NULL; - static BOOL (WINAPI *fpGetProcessShutdownParameters)(LPDWORD, LPDWORD) = NULL; - static BOOL (WINAPI *fpSetProcessShutdownParameters)(DWORD, DWORD) = NULL; typedef BOOL (WINAPI *GetProcessWorkingSetSizefunc)(HANDLE, PSIZE_T, PSIZE_T); static GetProcessWorkingSetSizefunc pfnGetProcessWorkingSetSize = NULL; --- 19,41 ---- #define CHECK_PFN(fname)if (pfn##fname==NULL) return PyErr_Format(PyExc_NotImplementedError,"%s is not available on this platform", #fname); + typedef BOOL (WINAPI *EnumProcessesfunc)(DWORD *, DWORD, DWORD *); + static EnumProcessesfunc pfnEnumProcesses = NULL; + typedef BOOL (WINAPI *EnumProcessModulesfunc)(HANDLE, HMODULE *, DWORD, LPDWORD); + static EnumProcessModulesfunc pfnEnumProcessModules = NULL; + typedef DWORD (WINAPI *GetModuleFileNameExfunc)(HANDLE, HMODULE, WCHAR *, DWORD); + static GetModuleFileNameExfunc pfnGetModuleFileNameEx = NULL; + + #ifndef MS_WINCE + typedef BOOL (WINAPI *GetProcessMemoryInfofunc)(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD); + static GetProcessMemoryInfofunc pfnGetProcessMemoryInfo=NULL; + typedef BOOL (WINAPI *GetProcessTimesfunc)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME); + static GetProcessTimesfunc pfnGetProcessTimes = NULL; + typedef BOOL (WINAPI *GetProcessIoCountersfunc)(HANDLE, PIO_COUNTERS); + static GetProcessIoCountersfunc pfnGetProcessIoCounters = NULL; + typedef BOOL (WINAPI *GetProcessShutdownParametersfunc)(LPDWORD, LPDWORD); + static GetProcessShutdownParametersfunc pfnGetProcessShutdownParameters = NULL; + typedef BOOL (WINAPI *SetProcessShutdownParametersfunc)(DWORD, DWORD); + static SetProcessShutdownParametersfunc pfnSetProcessShutdownParameters = NULL; typedef BOOL (WINAPI *GetProcessWorkingSetSizefunc)(HANDLE, PSIZE_T, PSIZE_T); static GetProcessWorkingSetSizefunc pfnGetProcessWorkingSetSize = NULL; *************** *** 50,53 **** --- 59,68 ---- typedef BOOL (WINAPI *GetThreadTimesfunc)(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME); static GetThreadTimesfunc pfnGetThreadTimes = NULL; + typedef HANDLE (WINAPI *CreateRemoteThreadfunc)(HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD); + static CreateRemoteThreadfunc pfnCreateRemoteThread=NULL; + typedef DWORD (WINAPI *SetThreadIdealProcessorfunc)(HANDLE, DWORD); + static SetThreadIdealProcessorfunc pfnSetThreadIdealProcessor = NULL; + typedef DWORD (WINAPI *SetProcessAffinityMaskfunc)(HANDLE, DWORD); + static SetProcessAffinityMaskfunc pfnSetProcessAffinityMask = NULL; #endif *************** *** 154,158 **** return obHandle; } ! return PyInt_FromLong((long)h); } --- 169,173 ---- return obHandle; } ! return PyWinLong_FromHANDLE(h); } *************** *** 186,208 **** int sethandle(PyObject **pobHandle, HANDLE *ph, PyObject *v) { ! int rc = 0; Py_XDECREF(*pobHandle); ! *pobHandle = NULL; ! *ph = NULL; ! if (v==Py_None) ! ; // Do nothing! ! else if (PyHANDLE_Check(v)) { *pobHandle = v; ! if (PyWinObject_AsHANDLE(v, ph)) ! Py_INCREF(v); ! else ! rc = -1; ! } else if (PyInt_Check(v)) { ! *ph = (HANDLE)PyInt_AsLong(v); ! } else { ! PyErr_SetString(PyExc_TypeError, "Invalid object type for HANDLE"); ! rc = -1; ! } ! return rc; } --- 201,216 ---- int sethandle(PyObject **pobHandle, HANDLE *ph, PyObject *v) { ! HANDLE htmp; ! if (!PyWinObject_AsHANDLE(v, &htmp, TRUE)) ! return -1; ! *ph=htmp; Py_XDECREF(*pobHandle); ! if (PyHANDLE_Check(v)){ *pobHandle = v; ! Py_INCREF(v); ! } ! else ! *pobHandle = NULL; ! return 0; } *************** *** 360,369 **** PyObject *obFunc, *obArgs, *obSA; unsigned stackSize, flags; ! if (!PyArg_ParseTuple(args, "OiOOi", &obSA, // @pyparm <o PySECURITY_ATTRIBUTES>|sa||The security attributes, or None &stackSize, // @pyparm int|stackSize||Stack size for the new thread, or zero for the default size. &obFunc, // @pyparm function|entryPoint||The thread function. &obArgs, // @pyparm tuple|args||Args passed to the function. ! &flags)) // @pyparm int|flags|| return NULL; if (!PyCallable_Check(obFunc)) { --- 368,377 ---- PyObject *obFunc, *obArgs, *obSA; unsigned stackSize, flags; ! if (!PyArg_ParseTuple(args, "OiOOi:beginthreadex", &obSA, // @pyparm <o PySECURITY_ATTRIBUTES>|sa||The security attributes, or None &stackSize, // @pyparm int|stackSize||Stack size for the new thread, or zero for the default size. &obFunc, // @pyparm function|entryPoint||The thread function. &obArgs, // @pyparm tuple|args||Args passed to the function. ! &flags)) // @pyparm int|flags||Can be CREATE_SUSPENDED so thread doesn't run immediately return NULL; if (!PyCallable_Check(obFunc)) { *************** *** 381,400 **** PyEval_InitThreads(); PythonThreadData *ptd = new PythonThreadData(obFunc, obArgs); ! unsigned long handle; unsigned tid; handle = _beginthreadex((void *)pSA, stackSize, ThreadEntryPoint, ptd, flags, &tid); ! if (handle==-1) { delete ptd; ! PyErr_SetFromErrno(PyExc_RuntimeError); ! } ! // @comm The result is a tuple of the thread handle and thread ID. ! PyObject *obHandle = PyWinObject_FromHANDLE((HANDLE)handle); ! PyObject *rc = Py_BuildValue("Oi", obHandle, tid); ! Py_DECREF(obHandle); ! return rc; } - %} - %native (beginthreadex) mybeginthreadex; --- 389,403 ---- PyEval_InitThreads(); PythonThreadData *ptd = new PythonThreadData(obFunc, obArgs); ! uintptr_t handle; unsigned tid; handle = _beginthreadex((void *)pSA, stackSize, ThreadEntryPoint, ptd, flags, &tid); ! if (handle==-1 || handle==NULL){ delete ptd; ! return PyErr_SetFromErrno(PyExc_RuntimeError); ! } ! // @rdesc The result is a tuple of the thread handle and thread ID. ! return Py_BuildValue("Ni", PyWinObject_FromHANDLE((HANDLE)handle), tid); } %} %native (beginthreadex) mybeginthreadex; *************** *** 404,457 **** static PyObject *myCreateRemoteThread(PyObject *self, PyObject *args) { ! PyObject *obFunc, *obArgs, *obSA; ! unsigned stackSize, flags; ! int hprocess; ! if (!PyArg_ParseTuple(args, "iOiOOi", ! &hprocess, // @pyparm int|hprocess||The handle to the remote process. &obSA, // @pyparm <o PySECURITY_ATTRIBUTES>|sa||The security attributes, or None &stackSize, // @pyparm int|stackSize||Stack size for the new thread, or zero for the default size. &obFunc, // @pyparm function|entryPoint||The thread function's address. ! &obArgs, // @pyparm tuple|args||Args passed to the function. &flags)) // @pyparm int|flags|| return NULL; ! if (!PyInt_Check(obFunc)) { ! PyErr_SetString(PyExc_TypeError, "function must be an address"); return NULL; ! } ! if (!PyInt_Check(obArgs)) { ! PyErr_SetString(PyExc_TypeError, "args must be an address"); return NULL; - } SECURITY_ATTRIBUTES *pSA; if (!PyWinObject_AsSECURITY_ATTRIBUTES( obSA, &pSA, TRUE )) return NULL; - HANDLE (WINAPI *pfnCreateRemoteThread)( HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD) = NULL; - HMODULE hmod = GetModuleHandle("kernel32.dll"); - if (hmod) - pfnCreateRemoteThread = (HANDLE (WINAPI *)( HANDLE, LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD)) - GetProcAddress(hmod, "CreateRemoteThread"); - if (pfnCreateRemoteThread==NULL) - return PyWin_SetAPIError("CreateRemoteThread", E_NOTIMPL); - PyEval_InitThreads(); HANDLE handle; DWORD tid; ! handle = (*pfnCreateRemoteThread)((HANDLE)hprocess, pSA, stackSize, ! (LPTHREAD_START_ROUTINE )PyLong_AsVoidPtr(obFunc), ! PyLong_AsVoidPtr(obArgs), flags, &tid); ! if (handle==(HANDLE)-1 || handle==(HANDLE)0) { return PyWin_SetAPIError("CreateRemoteThread"); } ! // @comm The result is a tuple of the thread handle and thread ID. ! PyObject *obHandle = PyWinObject_FromHANDLE((HANDLE)handle); ! PyObject *rc = Py_BuildValue("Oi", obHandle, tid); ! Py_DECREF(obHandle); ! return rc; } - %} - %native (CreateRemoteThread) myCreateRemoteThread; --- 407,456 ---- static PyObject *myCreateRemoteThread(PyObject *self, PyObject *args) { ! CHECK_PFN(CreateRemoteThread); ! #ifdef _WIN64 ! static char *fmt="OOLOOk:CreateRemoteThread"; ! #else ! static char *fmt="OOlOOk:CreateRemoteThread"; ! #endif ! ! PyObject *obhprocess, *obFunc, *obParameter, *obSA; ! SIZE_T stackSize; ! DWORD flags; ! HANDLE hprocess; ! LPTHREAD_START_ROUTINE Func; ! VOID *Parameter; ! if (!PyArg_ParseTuple(args, fmt, ! &obhprocess, // @pyparm <o PyHANDLE>|hprocess||The handle to the remote process. &obSA, // @pyparm <o PySECURITY_ATTRIBUTES>|sa||The security attributes, or None &stackSize, // @pyparm int|stackSize||Stack size for the new thread, or zero for the default size. &obFunc, // @pyparm function|entryPoint||The thread function's address. ! &obParameter, // @pyparm int|Parameter||Arg passed to the function in the form of a void pointer &flags)) // @pyparm int|flags|| return NULL; ! if (!PyWinObject_AsHANDLE(obhprocess, &hprocess, FALSE)) return NULL; ! Func=(LPTHREAD_START_ROUTINE)PyLong_AsVoidPtr(obFunc); ! if (Func==NULL && PyErr_Occurred()) ! return NULL; ! Parameter=PyLong_AsVoidPtr(obParameter); ! if (Parameter==NULL && PyErr_Occurred()) return NULL; SECURITY_ATTRIBUTES *pSA; if (!PyWinObject_AsSECURITY_ATTRIBUTES( obSA, &pSA, TRUE )) return NULL; PyEval_InitThreads(); HANDLE handle; DWORD tid; ! handle = (*pfnCreateRemoteThread)(hprocess, pSA, stackSize, ! Func, Parameter, flags, &tid); ! if (handle==INVALID_HANDLE_VALUE || handle==NULL) { return PyWin_SetAPIError("CreateRemoteThread"); } ! // @rdesc The result is a tuple of the thread handle and thread ID. ! return Py_BuildValue("Ni", PyWinObject_FromHANDLE(handle), tid); } %} %native (CreateRemoteThread) myCreateRemoteThread; *************** *** 756,769 **** - #ifndef MS_WINCE - // @pyswig int, int|GetProcessAffinityMask|Gets a processor affinity mask for a specified thread. - // @rdesc The result is a tuple of (process affinity mask, system affinity mask) - BOOLAPI GetProcessAffinityMask( - HANDLE hProcess, // @pyparm <o PyHANDLE>|hProcess||handle to the process of interest - DWORD *OUTPUT, // lpProcessAffinityMask - DWORD *OUTPUT // lpSystemAffinityMask - ); - #endif // MS_WINCE - // @pyswig int|GetProcessVersion|Obtains the major and minor version numbers of the system on which a specified process expects to run. DWORD GetProcessVersion( --- 755,758 ---- *************** *** 953,962 **** ); - // @pyswig int|SetThreadAffinityMask|Sets a processor affinity mask for a specified thread. - DWORD SetThreadAffinityMask ( - HANDLE hThread, // @pyparm <o PyHANDLE>|handle||handle to the thread of interest - DWORD dwThreadAffinityMask // @pyparm int|mask||a thread affinity mask - ); - // @pyswig |AttachThreadInput|Attaches or detaches the input of two threads BOOLAPI AttachThreadInput( --- 942,945 ---- *************** *** 970,983 **** static PyObject *MySetThreadIdealProcessor( HANDLE hThread, DWORD dwIdealProc ) { ! DWORD (WINAPI *pfnSetThreadIdealProcessor)( HANDLE hThread, DWORD dwIdealProc ) = NULL; ! HMODULE hmod = GetModuleHandle("kernel32.dll"); ! if (hmod) ! pfnSetThreadIdealProcessor = (DWORD (WINAPI *)( HANDLE hThread, DWORD dwIdealProc )) ! GetProcAddress(hmod, "SetThreadIdealProcessor"); ! if (pfnSetThreadIdealProcessor==NULL) ! return PyWin_SetAPIError("SetThreadIdealProcessor", E_NOTIMPL); DWORD rc = (*pfnSetThreadIdealProcessor)(hThread, dwIdealProc); if (rc==-1) ! return PyWin_SetAPIError("SetThreadIdealProcessor", E_NOTIMPL); return PyInt_FromLong(rc); } --- 953,960 ---- static PyObject *MySetThreadIdealProcessor( HANDLE hThread, DWORD dwIdealProc ) { ! CHECK_PFN(SetThreadIdealProcessor); DWORD rc = (*pfnSetThreadIdealProcessor)(hThread, dwIdealProc); if (rc==-1) ! return PyWin_SetAPIError("SetThreadIdealProcessor"); return PyInt_FromLong(rc); } *************** *** 992,1009 **** %{ // Appears to be some problem with the optimizer here, so I just leave it off! #pragma optimize ("", off) ! // This function does not exist on all platforms. ! static PyObject *MySetProcessAffinityMask( HANDLE hThread, DWORD dwMask ) { ! DWORD (WINAPI *pfnSetProcessAffinityMask)( HANDLE hThread, DWORD dwMask ) = NULL; ! HMODULE hmod = GetModuleHandle("kernel32.dll"); ! if (hmod) ! pfnSetProcessAffinityMask = (DWORD (WINAPI *)( HANDLE hThread, DWORD dwMask )) ! GetProcAddress(hmod, "SetProcessAffinityMask"); ! if (pfnSetProcessAffinityMask==NULL) ! return PyWin_SetAPIError("SetProcessAffinityMask", E_NOTIMPL); ! BOOL ok = (*pfnSetProcessAffinityMask)(hThread, dwMask); ! if (!ok) return PyWin_SetAPIError("SetProcessAffinityMask"); Py_INCREF(Py_None); --- 969,1014 ---- %{ + // @pyswig int, int|GetProcessAffinityMask|Gets a processor affinity mask for a specified process + // @rdesc The result is a tuple of (process affinity mask, system affinity mask) + static PyObject *MyGetProcessAffinityMask(PyObject *self, PyObject *args) + { + HANDLE hProcess; + PyObject *obhProcess; + DWORD_PTR processmask, systemmask; + if (!PyArg_ParseTuple(args, "O:GetProcessAffinityMask", + &obhProcess)) // @pyparm <o PyHANDLE>|hProcess||handle to the process of interest + return NULL; + if (!PyWinObject_AsHANDLE(obhProcess, &hProcess, FALSE)) + return NULL; + if (!GetProcessAffinityMask(hProcess, &processmask, &systemmask)) + return PyWin_SetAPIError("GetProcessAffinityMask"); + return Py_BuildValue("NN", + PyLong_FromUnsignedLongLong(processmask), + PyLong_FromUnsignedLongLong(systemmask)); + } + // Appears to be some problem with the optimizer here, so I just leave it off! #pragma optimize ("", off) ! // @pyswig |SetProcessAffinityMask|Sets a processor affinity mask for a specified process. ! // @comm This function does not exist on all platforms. ! static PyObject *MySetProcessAffinityMask(PyObject *self, PyObject *args) { ! CHECK_PFN(SetProcessAffinityMask); ! DWORD_PTR dwMask; ! HANDLE hProcess; ! PyObject *obhProcess; ! // Mask is 64 bits on win64 ! #ifdef _WIN64 ! static char *fmt="OK:SetProcessAffinityMask"; ! #else ! static char *fmt="Ok:SetProcessAffinityMask"; ! #endif ! if (!PyArg_ParseTuple(args, fmt, ! &obhProcess, // @pyparm <o PyHANDLE>|hProcess||handle to the process of interest ! &dwMask)) // @pyparm int|mask||a processor affinity mask ! return NULL; ! if (!PyWinObject_AsHANDLE(obhProcess, &hProcess, FALSE)) ! return NULL; ! if (!(*pfnSetProcessAffinityMask)(hProcess, dwMask)) return PyWin_SetAPIError("SetProcessAffinityMask"); Py_INCREF(Py_None); *************** *** 1011,1023 **** } #pragma optimize ("", on) - %} - - // @pyswig |SetProcessAffinityMask|Sets a processor affinity mask for a specified process. - %name(SetProcessAffinityMask) - PyObject *MySetProcessAffinityMask ( - HANDLE hThread, // @pyparm <o PyHANDLE>|handle||handle to the process of interest - DWORD dwThreadAffinityMask // @pyparm int|mask||a thread affinity mask - ); #endif // MS_WINCE --- 1016,1047 ---- } #pragma optimize ("", on) + // @pyswig int|SetThreadAffinityMask|Sets a processor affinity mask for a specified thread. + static PyObject *MySetThreadAffinityMask(PyObject *self, PyObject *args) + { + DWORD_PTR dwMask, prevMask; + HANDLE hThread; + PyObject *obhThread; + // Mask is 64 bits on win64 + #ifdef _WIN64 + static char *fmt="OK:SetThreadAffinityMask"; + #else + static char *fmt="Ok:SetThreadAffinityMask"; + #endif + if (!PyArg_ParseTuple(args, fmt, + &obhThread, // @pyparm <o PyHANDLE>|hThread||handle to the thread of interest + &dwMask)) // @pyparm int|ThreadAffinityMask||a processor affinity mask + return NULL; + if (!PyWinObject_AsHANDLE(obhThread, &hThread, FALSE)) + return NULL; + prevMask=SetThreadAffinityMask(hThread, dwMask); + if (prevMask==0) + return PyWin_SetAPIError("SetThreadAffinityMask"); + return PyLong_FromUnsignedLongLong(prevMask); + } + %} + %native(GetProcessAffinityMask) MyGetProcessAffinityMask; + %native(SetProcessAffinityMask) MySetProcessAffinityMask; + %native(SetThreadAffinityMask) MySetThreadAffinityMask; #endif // MS_WINCE *************** *** 1071,1079 **** PyObject *PyEnumProcesses(PyObject *self, PyObject *args) { ! if (fpEnumProcesses==NULL){ ! PyErr_SetString(PyExc_NotImplementedError,"EnumProcesses does not exist on this platform"); ! return NULL; ! } ! DWORD *pids=NULL, *pid=NULL; DWORD nbr_pids_allocated=100, nbr_pids_returned=0, tuple_ind=0; --- 1095,1099 ---- PyObject *PyEnumProcesses(PyObject *self, PyObject *args) { ! CHECK_PFN(EnumProcesses); DWORD *pids=NULL, *pid=NULL; DWORD nbr_pids_allocated=100, nbr_pids_returned=0, tuple_ind=0; *************** *** 1095,1099 **** return NULL; } ! if (!(*fpEnumProcesses)(pids, bytes_allocated, &bytes_returned)){ PyWin_SetAPIError("EnumProcesses",GetLastError()); goto done; --- 1115,1119 ---- return NULL; } ! if (!(*pfnEnumProcesses)(pids, bytes_allocated, &bytes_returned)){ PyWin_SetAPIError("EnumProcesses",GetLastError()); goto done; *************** *** 1131,1148 **** PyObject *PyEnumProcessModules(PyObject *self, PyObject *args) { ! if (fpEnumProcessModules==NULL){ ! PyErr_SetString(PyExc_NotImplementedError,"EnumProcessModules does not exist on this platform"); ! return NULL; ! } ! HMODULE *hmods=NULL, *hmod=NULL; HANDLE hprocess=NULL; DWORD nbr_hmods_allocated=100, nbr_hmods_returned=0, tuple_ind=0; DWORD bytes_allocated=0,bytes_needed=0; ! PyObject *ret=NULL, *obhmod=NULL; // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! if (!PyArg_ParseTuple(args, "l:EnumProcessModules", &hprocess)) return NULL; - bytes_allocated=nbr_hmods_allocated*sizeof(HMODULE); do{ --- 1151,1165 ---- PyObject *PyEnumProcessModules(PyObject *self, PyObject *args) { ! CHECK_PFN(EnumProcessModules); HMODULE *hmods=NULL, *hmod=NULL; HANDLE hprocess=NULL; DWORD nbr_hmods_allocated=100, nbr_hmods_returned=0, tuple_ind=0; DWORD bytes_allocated=0,bytes_needed=0; ! PyObject *ret=NULL, *obhmod=NULL, *obhprocess; // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! if (!PyArg_ParseTuple(args, "O:EnumProcessModules", &obhprocess)) ! return NULL; ! if (!PyWinObject_AsHANDLE(obhprocess, &hprocess, FALSE)) return NULL; bytes_allocated=nbr_hmods_allocated*sizeof(HMODULE); do{ *************** *** 1156,1160 **** return NULL; } ! if (!(*fpEnumProcessModules)(hprocess, hmods, bytes_allocated, &bytes_needed)){ PyWin_SetAPIError("EnumProcessModules",GetLastError()); goto done; --- 1173,1177 ---- return NULL; } ! if (!(*pfnEnumProcessModules)(hprocess, hmods, bytes_allocated, &bytes_needed)){ PyWin_SetAPIError("EnumProcessModules",GetLastError()); goto done; *************** *** 1171,1175 **** hmod=hmods; for (tuple_ind=0;tuple_ind<nbr_hmods_returned;tuple_ind++){ ! obhmod=Py_BuildValue("l",*hmod); if (obhmod==NULL){ Py_DECREF(ret); --- 1188,1192 ---- hmod=hmods; for (tuple_ind=0;tuple_ind<nbr_hmods_returned;tuple_ind++){ ! obhmod=PyWinLong_FromHANDLE(*hmod); if (obhmod==NULL){ Py_DECREF(ret); *************** *** 1177,1181 **** goto done; } ! PyTuple_SetItem(ret,tuple_ind,obhmod); hmod++; } --- 1194,1198 ---- goto done; } ! PyTuple_SET_ITEM(ret,tuple_ind,obhmod); hmod++; } *************** *** 1192,1199 **** PyObject *PyGetModuleFileNameEx(PyObject *self, PyObject *args) { ! if (fpGetModuleFileNameEx==NULL){ ! PyErr_SetString(PyExc_NotImplementedError,"GetModuleFileNameEx does not exist on this platform"); ! return NULL; ! } WCHAR *fname=NULL; DWORD chars_allocated=256, chars_returned=0; --- 1209,1213 ---- PyObject *PyGetModuleFileNameEx(PyObject *self, PyObject *args) { ! CHECK_PFN(GetModuleFileNameEx); WCHAR *fname=NULL; DWORD chars_allocated=256, chars_returned=0; *************** *** 1201,1208 **** HMODULE hmod; HANDLE hprocess; ! PyObject *ret=NULL; // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! // @pyparm int|hModule||Module handle ! if (!PyArg_ParseTuple(args, "ll:GetModuleFileNameEx", &hprocess, &hmod)) return NULL; --- 1215,1226 ---- HMODULE hmod; HANDLE hprocess; ! PyObject *ret=NULL, *obhprocess, *obhmod; // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! // @pyparm <o PyHANDLE>|hModule||Module handle ! if (!PyArg_ParseTuple(args, "OO:GetModuleFileNameEx", &obhprocess, &obhmod)) ! return NULL; ! if (!PyWinObject_AsHANDLE(obhprocess, &hprocess, FALSE)) ! return NULL; ! if (!PyWinObject_AsHANDLE(obhmod, (HANDLE *)&hmod, FALSE)) return NULL; *************** *** 1217,1221 **** return NULL; } ! chars_returned=(*fpGetModuleFileNameEx)(hprocess, hmod, fname, chars_allocated); if (!chars_returned){ PyWin_SetAPIError("GetModuleFileNameEx",GetLastError()); --- 1235,1239 ---- return NULL; } ! chars_returned=(*pfnGetModuleFileNameEx)(hprocess, hmod, fname, chars_allocated); if (!chars_returned){ PyWin_SetAPIError("GetModuleFileNameEx",GetLastError()); *************** *** 1239,1247 **** PyObject *PyGetProcessMemoryInfo(PyObject *self, PyObject *args) { ! if (fpGetProcessMemoryInfo==NULL){ ! PyErr_SetString(PyExc_NotImplementedError,"GetProcessMemoryInfo does not exist on this platform"); ! return NULL; ! } HANDLE hProcess; PROCESS_MEMORY_COUNTERS pmc; DWORD cb=sizeof(PROCESS_MEMORY_COUNTERS); --- 1257,1263 ---- PyObject *PyGetProcessMemoryInfo(PyObject *self, PyObject *args) { ! CHECK_PFN(GetProcessMemoryInfo); HANDLE hProcess; + PyObject *obhProcess; PROCESS_MEMORY_COUNTERS pmc; DWORD cb=sizeof(PROCESS_MEMORY_COUNTERS); *************** *** 1249,1268 **** // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! if (!PyArg_ParseTuple(args, "l:GetProcessMemoryInfo", &hProcess)) return NULL; ! if (!(*fpGetProcessMemoryInfo)(hProcess, &pmc, cb)){ PyWin_SetAPIError("GetProcessMemoryInfo",GetLastError()); return NULL; } ! return Py_BuildValue("{s:l,s:l,s:l,s:l,s:l,s:l,s:l,s:l,s:l}", ! "PageFaultCount",pmc.PageFaultCount, ! "PeakWorkingSetSize",pmc.PeakWorkingSetSize, ! "WorkingSetSize",pmc.WorkingSetSize, ! "QuotaPeakPagedPoolUsage",pmc.QuotaPeakPagedPoolUsage, ! "QuotaPagedPoolUsage",pmc.QuotaPagedPoolUsage, ! "QuotaPeakNonPagedPoolUsage",pmc.QuotaPeakNonPagedPoolUsage, ! "QuotaNonPagedPoolUsage",pmc.QuotaNonPagedPoolUsage, ! "PagefileUsage",pmc.PagefileUsage, ! "PeakPagefileUsage",pmc.PeakPagefileUsage); } %} --- 1265,1287 ---- // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! if (!PyArg_ParseTuple(args, "O:GetProcessMemoryInfo", &obhProcess)) return NULL; ! if (!PyWinObject_AsHANDLE(obhProcess, &hProcess, FALSE)) ! return NULL; ! ! if (!(*pfnGetProcessMemoryInfo)(hProcess, &pmc, cb)){ PyWin_SetAPIError("GetProcessMemoryInfo",GetLastError()); return NULL; } ! return Py_BuildValue("{s:k,s:N,s:N,s:N,s:N,s:N,s:N,s:N,s:N}", ! "PageFaultCount", pmc.PageFaultCount, ! "PeakWorkingSetSize", PyLong_FromUnsignedLongLong(pmc.PeakWorkingSetSize), ! "WorkingSetSize", PyLong_FromUnsignedLongLong(pmc.WorkingSetSize), ! "QuotaPeakPagedPoolUsage", PyLong_FromUnsignedLongLong(pmc.QuotaPeakPagedPoolUsage), ! "QuotaPagedPoolUsage", PyLong_FromUnsignedLongLong(pmc.QuotaPagedPoolUsage), ! "QuotaPeakNonPagedPoolUsage", PyLong_FromUnsignedLongLong(pmc.QuotaPeakNonPagedPoolUsage), ! "QuotaNonPagedPoolUsage", PyLong_FromUnsignedLongLong(pmc.QuotaNonPagedPoolUsage), ! "PagefileUsage", PyLong_FromUnsignedLongLong(pmc.PagefileUsage), ! "PeakPagefileUsage", PyLong_FromUnsignedLongLong(pmc.PeakPagefileUsage)); } %} *************** *** 1273,1287 **** PyObject *PyGetProcessTimes(PyObject *self, PyObject *args) { ! if (fpGetProcessTimes==NULL){ ! PyErr_SetString(PyExc_NotImplementedError,"GetProcessTimes does not exist on this platform"); ! return NULL; ! } HANDLE hProcess; FILETIME CreationTime, ExitTime, KernelTime, UserTime; ULARGE_INTEGER ulKernelTime, ulUserTime; // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! if (!PyArg_ParseTuple(args, "l:GetProcessTimes", &hProcess)) return NULL; ! if (!(*fpGetProcessTimes)(hProcess, &CreationTime, &ExitTime, &KernelTime, &UserTime)){ PyWin_SetAPIError("GetProcessTimes",GetLastError()); return NULL; --- 1292,1307 ---- PyObject *PyGetProcessTimes(PyObject *self, PyObject *args) { ! CHECK_PFN(GetProcessTimes); HANDLE hProcess; + PyObject *obhProcess; FILETIME CreationTime, ExitTime, KernelTime, UserTime; ULARGE_INTEGER ulKernelTime, ulUserTime; // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! if (!PyArg_ParseTuple(args, "O:GetProcessTimes", &obhProcess)) return NULL; ! if (!PyWinObject_AsHANDLE(obhProcess, &hProcess, FALSE)) ! return NULL; ! ! if (!(*pfnGetProcessTimes)(hProcess, &CreationTime, &ExitTime, &KernelTime, &UserTime)){ PyWin_SetAPIError("GetProcessTimes",GetLastError()); return NULL; *************** *** 1302,1315 **** PyObject *PyGetProcessIoCounters(PyObject *self, PyObject *args) { ! if (fpGetProcessIoCounters==NULL){ ! PyErr_SetString(PyExc_NotImplementedError,"GetProcessIoCounters does not exist on this platform"); ! return NULL; ! } HANDLE hProcess; IO_COUNTERS ioc; // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! if (!PyArg_ParseTuple(args, "l:GetProcessIoCounters", &hProcess)) return NULL; ! if (!(*fpGetProcessIoCounters)(hProcess, &ioc)){ PyWin_SetAPIError("GetProcessIoCounters",GetLastError()); return NULL; --- 1322,1335 ---- PyObject *PyGetProcessIoCounters(PyObject *self, PyObject *args) { ! CHECK_PFN(GetProcessIoCounters); HANDLE hProcess; + PyObject *obhProcess; IO_COUNTERS ioc; // @pyparm <o PyHANDLE>|hProcess||Process handle as returned by OpenProcess ! if (!PyArg_ParseTuple(args, "O:GetProcessIoCounters", &obhProcess)) return NULL; ! if (!PyWinObject_AsHANDLE(obhProcess, &hProcess, FALSE)) ! return NULL; ! if (!(*pfnGetProcessIoCounters)(hProcess, &ioc)){ PyWin_SetAPIError("GetProcessIoCounters",GetLastError()); return NULL; *************** *** 1393,1404 **** PyObject *PyGetProcessShutdownParameters(PyObject *self, PyObject *args) { DWORD Level=0, Flags=0; - if (fpGetProcessShutdownParameters==NULL){ - PyErr_SetString(PyExc_NotImplementedError,"GetProcessShutdownParameters does not exist on this platform"); - return NULL; - } if (!PyArg_ParseTuple(args, ":GetProcessShutdownParameters")) return NULL; ! if (!(*fpGetProcessShutdownParameters)(&Level, &Flags)){ PyWin_SetAPIError("GetProcessShutdownParameters",GetLastError()); return NULL; --- 1413,1421 ---- PyObject *PyGetProcessShutdownParameters(PyObject *self, PyObject *args) { + CHECK_PFN(GetProcessShutdownParameters); DWORD Level=0, Flags=0; if (!PyArg_ParseTuple(args, ":GetProcessShutdownParameters")) return NULL; ! if (!(*pfnGetProcessShutdownParameters)(&Level, &Flags)){ PyWin_SetAPIError("GetProcessShutdownParameters",GetLastError()); return NULL; *************** *** 1414,1427 **** PyObject *PySetProcessShutdownParameters(PyObject *self, PyObject *args) { DWORD Level=0, Flags=0; - if (fpSetProcessShutdownParameters==NULL){ - PyErr_SetString(PyExc_NotImplementedError,"SetProcessShutdownParameters does not exist on this platform"); - return NULL; - } // @pyparm int|Level||Priority, higher means earlier // @pyparm int|Flags||Currently only SHUTDOWN_NORETRY valid if (!PyArg_ParseTuple(args, "ll:SetProcessShutdownParameters", &Level, &Flags)) return NULL; ! if (!(*fpSetProcessShutdownParameters)(Level, Flags)){ PyWin_SetAPIError("SetProcessShutdownParameters",GetLastError()); return NULL; --- 1431,1441 ---- PyObject *PySetProcessShutdownParameters(PyObject *self, PyObject *args) { + CHECK_PFN(SetProcessShutdownParameters); DWORD Level=0, Flags=0; // @pyparm int|Level||Priority, higher means earlier // @pyparm int|Flags||Currently only SHUTDOWN_NORETRY valid if (!PyArg_ParseTuple(args, "ll:SetProcessShutdownParameters", &Level, &Flags)) return NULL; ! if (!(*pfnSetProcessShutdownParameters)(Level, Flags)){ PyWin_SetAPIError("SetProcessShutdownParameters",GetLastError()); return NULL; *************** *** 1465,1481 **** hmodule=LoadLibrary(_T("Psapi.dll")); if (hmodule!=NULL){ ! fp=GetProcAddress(hmodule, _T("EnumProcesses")); ! if (fp!=NULL) ! fpEnumProcesses=(BOOL (WINAPI *)(DWORD *, DWORD, DWORD *))(fp); ! fp=GetProcAddress(hmodule, _T("EnumProcessModules")); ! if (fp!=NULL) ! fpEnumProcessModules=(BOOL (WINAPI *)(HANDLE, HMODULE *, DWORD, LPDWORD))(fp); ! fp=GetProcAddress(hmodule, _T("GetModuleFileNameExW")); ! if (fp!=NULL) ! fpGetModuleFileNameEx=(DWORD (WINAPI *)(HANDLE, HMODULE, WCHAR *, DWORD))(fp); #ifndef MS_WINCE ! fp=GetProcAddress(hmodule,_T("GetProcessMemoryInfo")); ! if (fp!=NULL) ! fpGetProcessMemoryInfo=(BOOL (WINAPI *)(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD))(fp); #endif } --- 1479,1487 ---- hmodule=LoadLibrary(_T("Psapi.dll")); if (hmodule!=NULL){ ! pfnEnumProcesses = (EnumProcessesfunc)GetProcAddress(hmodule, _T("EnumProcesses")); ! pfnEnumProcessModules = (EnumProcessModulesfunc)GetProcAddress(hmodule, _T("EnumProcessModules")); ! pfnGetModuleFileNameEx = (GetModuleFileNameExfunc)GetProcAddress(hmodule, _T("GetModuleFileNameExW")); #ifndef MS_WINCE ! pfnGetProcessMemoryInfo = (GetProcessMemoryInfofunc)GetProcAddress(hmodule, _T("GetProcessMemoryInfo")); #endif } *************** *** 1486,1502 **** hmodule=LoadLibrary(_T("Kernel32.dll")); if (hmodule!=NULL){ ! fp=GetProcAddress(hmodule, "GetProcessTimes"); ! if (fp!=NULL) ! fpGetProcessTimes=(BOOL (WINAPI *)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME))(fp); ! fp=GetProcAddress(hmodule, "GetProcessIoCounters"); ! if (fp!=NULL) ! fpGetProcessIoCounters=(BOOL (WINAPI *)(HANDLE, PIO_COUNTERS))(fp); ! fp=GetProcAddress(hmodule, "GetProcessShutdownParameters"); ! if (fp!=NULL) ! fpGetProcessShutdownParameters=(BOOL (WINAPI *)(LPDWORD, LPDWORD))(fp); ! fp=GetProcAddress(hmodule, "SetProcessShutdownParameters"); ! if (fp!=NULL) ! fpSetProcessShutdownParameters=(BOOL (WINAPI *)(DWORD, DWORD))(fp); ! pfnGetProcessWorkingSetSize=(GetProcessWorkingSetSizefunc)GetProcAddress(hmodule,"GetProcessWorkingSetSize"); pfnSetProcessWorkingSetSize=(SetProcessWorkingSetSizefunc)GetProcAddress(hmodule,"SetProcessWorkingSetSize"); --- 1492,1499 ---- hmodule=LoadLibrary(_T("Kernel32.dll")); if (hmodule!=NULL){ ! pfnGetProcessTimes=(GetProcessTimesfunc)GetProcAddress(hmodule,"GetProcessTimes"); ! pfnGetProcessIoCounters=(GetProcessIoCountersfunc)GetProcAddress(hmodule,"GetProcessIoCounters"); ! pfnGetProcessShutdownParameters=(GetProcessShutdownParametersfunc)GetProcAddress(hmodule,"GetProcessShutdownParameters"); ! pfnSetProcessShutdownParameters=(SetProcessShutdownParametersfunc)GetProcAddress(hmodule,"SetProcessShutdownParameters"); pfnGetProcessWorkingSetSize=(GetProcessWorkingSetSizefunc)GetProcAddress(hmodule,"GetProcessWorkingSetSize"); pfnSetProcessWorkingSetSize=(SetProcessWorkingSetSizefunc)GetProcAddress(hmodule,"SetProcessWorkingSetSize"); *************** *** 1507,1510 **** --- 1504,1510 ---- pfnGetThreadIOPendingFlag=(GetThreadIOPendingFlagfunc)GetProcAddress(hmodule,"GetThreadIOPendingFlag"); pfnGetThreadTimes=(GetThreadTimesfunc)GetProcAddress(hmodule,"GetThreadTimes"); + pfnCreateRemoteThread=(CreateRemoteThreadfunc)GetProcAddress(hmodule,"CreateRemoteThread"); + pfnSetThreadIdealProcessor=(SetThreadIdealProcessorfunc)GetProcAddress(hmodule,"SetThreadIdealProcessor"); + pfnSetProcessAffinityMask=(SetProcessAffinityMaskfunc)GetProcAddress(hmodule,"SetProcessAffinityMask"); } |