[pywin32-checkins] /hgroot/pywin32/pywin32: Add EvtOpenSession, EvtOpenChannelConfi...
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: <pyw...@li...> - 2013-12-14 15:26:12
|
changeset 594108a1bc03 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=594108a1bc03 summary: Add EvtOpenSession, EvtOpenChannelConfig, and EvtGetChannelConfigProperty; Release thread lock while calling other Evt* functions diffstat: win32/src/win32evtlog.i | 356 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 345 insertions(+), 11 deletions(-) diffs (truncated from 508 to 300 lines): diff -r c36870fc25f0 -r 594108a1bc03 win32/src/win32evtlog.i --- a/win32/src/win32evtlog.i Sun Dec 08 13:47:19 2013 -0500 +++ b/win32/src/win32evtlog.i Sat Dec 14 10:23:02 2013 -0500 @@ -489,7 +489,9 @@ PyWinObject_AsHANDLE, &session, // @pyparm <o PyEVT_HANDLE>|Session|None|Handle to a remote session (see <om win32evtlog.EvtOpenSession>), or None for local machine. &flags)) // @pyparm int|Flags|0|Reserved, use only 0 return NULL; + Py_BEGIN_ALLOW_THREADS enum_handle=EvtOpenChannelEnum(session, flags); + Py_END_ALLOW_THREADS if (enum_handle==NULL) return PyWin_SetAPIError("EvtOpenChannelEnum"); return PyWinObject_FromEVT_HANDLE(enum_handle); @@ -509,6 +511,7 @@ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&:EvtNextChannelPath", keywords, PyWinObject_AsHANDLE, &enum_handle)) // @pyparm <o PyEVT_HANDLE>|ChannelEnum||Handle to an enumeration as returned by <om win32evtlog.EvtOpenChannelEnum> return NULL; + BOOL bsuccess; while (true){ if (buf) free(buf); @@ -516,7 +519,11 @@ WCHAR *buf=(WCHAR *)malloc(allocated_size * sizeof(WCHAR)); if (!buf) return NULL; - if (EvtNextChannelPath(enum_handle, allocated_size, buf, &returned_size)){ + + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtNextChannelPath(enum_handle, allocated_size, buf, &returned_size); + Py_END_ALLOW_THREADS + if (bsuccess){ ret=PyWinObject_FromWCHAR(buf); break; } @@ -555,7 +562,9 @@ return NULL; if (!PyWinObject_AsWCHAR(obpath, &path, FALSE)) return NULL; + Py_BEGIN_ALLOW_THREADS log_handle=EvtOpenLog(session, path, flags); + Py_END_ALLOW_THREADS PyWinObject_FreeWCHAR(path); if (log_handle==NULL) return PyWin_SetAPIError("EvtOpenLog"); @@ -582,7 +591,11 @@ return NULL; if (!PyWinObject_AsWCHAR(obexport_path, &export_path, TRUE)) return NULL; - if (EvtClearLog(session, path, export_path, flags)){ + BOOL bsuccess; + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtClearLog(session, path, export_path, flags); + Py_END_ALLOW_THREADS + if (bsuccess){ Py_INCREF(Py_None); return Py_None; } @@ -612,7 +625,11 @@ return NULL; if (!PyWinObject_AsWCHAR(obquery, &query, TRUE)) return NULL; - if (EvtExportLog(session, path, query, export_path, flags)){ + BOOL bsuccess; + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtExportLog(session, path, query, export_path, flags); + Py_END_ALLOW_THREADS + if (bsuccess){ Py_INCREF(Py_None); return Py_None; } @@ -638,7 +655,12 @@ return NULL; if (!PyWinObject_AsWCHAR(obpath, &path, FALSE)) return NULL; - if (EvtArchiveExportedLog(session, path, lcid, flags)){ + + BOOL bsuccess; + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtArchiveExportedLog(session, path, lcid, flags); + Py_END_ALLOW_THREADS + if (bsuccess){ Py_INCREF(Py_None); return Py_None; } @@ -654,6 +676,8 @@ PyObject *ret=NULL; if (!PyArg_ParseTuple(args, ":EvtGetExtendedStatus")) return NULL; + + BOOL bsuccess; while (1){ if (msg) free(msg); @@ -663,7 +687,10 @@ PyErr_NoMemory(); return NULL; } - if (EvtGetExtendedStatus(buflen, msg, &bufneeded)){ + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtGetExtendedStatus(buflen, msg, &bufneeded); + Py_END_ALLOW_THREADS + if (bsuccess){ ret=PyWinObject_FromWCHAR(msg, bufneeded); break; } @@ -696,8 +723,9 @@ return NULL; if (!PyWinObject_AsWCHAR(obquery, &query, TRUE)) return NULL; - + Py_BEGIN_ALLOW_THREADS ret = EvtQuery(session, path, query, flags); + Py_END_ALLOW_THREADS if (ret == NULL) return PyWin_SetAPIError("EvtQuery"); return PyWinObject_FromEVT_HANDLE(ret); @@ -726,8 +754,11 @@ PyErr_NoMemory(); return NULL; } - - if (!EvtNext(query, nbr_requested, events, timeout, flags, &nbr_returned)){ + BOOL bsuccess; + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtNext(query, nbr_requested, events, timeout, flags, &nbr_returned); + Py_END_ALLOW_THREADS + if (!bsuccess){ free(events); DWORD err=GetLastError(); if (err == ERROR_NO_MORE_ITEMS) @@ -769,7 +800,11 @@ PyWinObject_AsHANDLE, &bookmark, // @pyparm <o PyEVT_HANDLE>|Bookmark|None|Used as seek origin only if Flags contains EvtSeekRelativeToBookmark &timeout)) // @pyparm int|Timeout|0|Reserved, use only 0 return NULL; - if (!EvtSeek(query, position, bookmark, timeout, flags)) + BOOL bsuccess; + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtSeek(query, position, bookmark, timeout, flags); + Py_END_ALLOW_THREADS + if (!bsuccess) return PyWin_SetAPIError("EvtSeek"); Py_INCREF(Py_None); return Py_None;; @@ -796,6 +831,7 @@ PyErr_Format(PyExc_NotImplementedError,"Rendering values is not yet supported"); return NULL; } + BOOL bsuccess; while(1){ if (buf) free(buf); @@ -804,7 +840,11 @@ PyErr_NoMemory(); return NULL; } - if (EvtRender(NULL, event, flags, bufsize, buf, &bufneeded, &propcount)){ + + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtRender(NULL, event, flags, bufsize, buf, &bufneeded, &propcount); + Py_END_ALLOW_THREADS + if (bsuccess){ ret=PyWinObject_FromWCHAR((WCHAR *)buf); break; } @@ -902,8 +942,10 @@ if (obuserdata==NULL) return NULL; } + Py_BEGIN_ALLOW_THREADS ret = EvtSubscribe(session, signalevent, path, query, bookmark, (void *)obuserdata, pfncallback, flags); + Py_END_ALLOW_THREADS if (ret==NULL) return PyWin_SetAPIError("EvtSubscribe"); return PyWinObject_FromEVT_HANDLE(ret, obuserdata); @@ -924,7 +966,9 @@ return NULL; if (!PyWinObject_AsWCHAR(obxml, &xml, TRUE)) return NULL; + Py_BEGIN_ALLOW_THREADS ret = EvtCreateBookmark(xml); + Py_END_ALLOW_THREADS if (ret == NULL) return PyWin_SetAPIError("EvtCreateBookmark"); return PyWinObject_FromEVT_HANDLE(ret); @@ -942,13 +986,237 @@ PyWinObject_AsHANDLE, &evt)) // @pyparm <o PyEVT_HANDLE>|Event||Handle to an event return NULL; - if (!EvtUpdateBookmark(bookmark, evt)) + BOOL bsuccess; + Py_BEGIN_ALLOW_THREADS + bsuccess = EvtUpdateBookmark(bookmark, evt); + Py_END_ALLOW_THREADS + if (!bsuccess) return PyWin_SetAPIError("EvtUpdateBookmark"); Py_INCREF(Py_None); return Py_None; } PyCFunction pfnPyEvtUpdateBookmark = (PyCFunction) PyEvtUpdateBookmark; +PyObject *PyWinObject_FromEVT_VARIANT(PEVT_VARIANT val) +{ + if (val->Type & EVT_VARIANT_TYPE_ARRAY){ + PyErr_SetString(PyExc_NotImplementedError, "EVT_VARIANT arrays not supported yet"); + return NULL; + } + DWORD val_type = val->Type & EVT_VARIANT_TYPE_MASK; + PyObject *obval = NULL; + switch (val_type){ + case EvtVarTypeNull: + Py_INCREF(Py_None); + obval = Py_None; + break; + case EvtVarTypeString: + obval = PyWinObject_FromWCHAR(val->StringVal); + break; + case EvtVarTypeAnsiString: + obval = PyWinCoreString_FromString(val->AnsiStringVal); + break; + case EvtVarTypeSByte: + obval = PyLong_FromLong(val->SByteVal); + break; + case EvtVarTypeByte: + obval = PyLong_FromUnsignedLong(val->ByteVal); + break; + case EvtVarTypeInt16: + obval = PyLong_FromLong(val->Int16Val); + break; + case EvtVarTypeUInt16: + obval = PyLong_FromUnsignedLong(val->UInt16Val); + break; + case EvtVarTypeInt32: + obval = PyLong_FromLong(val->Int32Val); + break; + case EvtVarTypeUInt32: + obval = PyLong_FromUnsignedLong(val->UInt32Val); + break; + case EvtVarTypeInt64: + obval = PyLong_FromLongLong(val->Int64Val); + break; + case EvtVarTypeUInt64: + obval = PyLong_FromUnsignedLongLong(val->UInt64Val); + break; + case EvtVarTypeSingle: + obval = PyFloat_FromDouble(val->SingleVal); + break; + case EvtVarTypeDouble: + obval = PyFloat_FromDouble(val->DoubleVal); + break; + case EvtVarTypeBoolean: + obval = PyBool_FromLong(val->BooleanVal); + break; + case EvtVarTypeBinary: + obval = PyString_FromStringAndSize((char *)val->BinaryVal, val->Count); + break; + case EvtVarTypeGuid: + obval = PyWinObject_FromIID(*val->GuidVal); + break; + case EvtVarTypeSizeT: + obval = PyInt_FromSsize_t(val->SizeTVal); + break; + case EvtVarTypeFileTime: + { + // FileTimeVal is defined as ULONGLONG for unknown reasons + LARGE_INTEGER timestamp; + timestamp.QuadPart = val->FileTimeVal; + obval = PyWinObject_FromTimeStamp(timestamp); + break; + } + case EvtVarTypeSysTime: + obval = PyWinObject_FromSYSTEMTIME(*val->SysTimeVal); + break; + case EvtVarTypeSid: + obval = PyWinObject_FromSID(val->SidVal); + break; + // case EvtVarTypeHexInt32: + // case EvtVarTypeHexInt64: + case EvtVarTypeEvtHandle: + obval = PyWinObject_FromEVT_HANDLE(val->EvtHandleVal); + break; + case EvtVarTypeEvtXml: + obval = PyWinObject_FromWCHAR(val->XmlVal); + break; + default: + PyErr_Format(PyExc_NotImplementedError, "EVT_VARIANT_TYPE %d not supported yet", val_type); + } + if (obval == NULL) + return NULL; + return Py_BuildValue("Nk", obval, val->Type); +} + +// @pyswig (object, int)|EvtGetChannelConfigProperty|Retreives channel configuration information +// @comm Accepts keyword args +// @comm Returns the value and type of value (EvtVarType*) +static PyObject *PyEvtGetChannelConfigProperty(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *keywords[]={"ChannelConfig", "PropertyId", "Flags", NULL}; + EVT_HANDLE config_handle; + EVT_CHANNEL_CONFIG_PROPERTY_ID prop_id; |