Discussion:
Capturing OutputDebugString information in python
danbrotherston
2007-10-16 20:34:49 UTC
Permalink
Hello,

I am trying to get the output from the win32 platform command
OutputDebugString. I have used the following C++ code as a
guideline:

http://groups.google.com/group/microsoft.public.vc.utilities/browse_frm/thread/1434418cb968d053/1a3c957675242c7e?lnk=st&q=DBWIN_BUFFER&rnum=3#1a3c957675242c7e

And I have been able to translate most things into python, but I have
been unable to get it to work. I use the pywin extensions to call
CreateEvent and create the required events. But when I wait on the
event using the WaitOnSingleEvent call, it hangs indefinitely even
when I make calls to OutputDebugString in other processes, (both
python processes using win32api and actual C++ win32 programs). I
also used mmap to map a file (using fileno -1) to the "DBWIN_BUFFER"
but that buffer appears to be empty all the time no matter the calls
to OutputDebugString.

I have limited experience with this part of windows, but if anyone had
any ideas I'd appreciate it greatly.

Thanks,

Daniel
danbrotherston
2007-10-18 13:43:45 UTC
Permalink
<snip>

Wow, more of a response than I expected, thanks very much for the
research. While not related to the mutex, the problem did appear to
be permission related. For the record, on windows XP

import sys
import mmap
import win32event

buffer_ready = win32event.CreateEvent (None, 0, 0,
"DBWIN_BUFFER_READY")
data_ready = win32event.CreateEvent (None, 0, 0, "DBWIN_DATA_READY")
buffer = mmap.mmap (0, 4096, "DBWIN_BUFFER", mmap.ACCESS_WRITE)


win32event.SetEvent (buffer_ready)


while win32event.WaitForSingleObject (data_ready, 1000) ==
win32event.WAIT_TIMEOUT:
print "Timed out"

print "Was signaled"

appears to work. Write access appears to be required for the buffer
(which I can read and get useful data from:

print buffer.read(4)
print buffer.read(4092)

and no security object. I wasn't the one who figured this out, so I'm
really not sure why it works...but it seems to.
Tim Golden
2007-10-18 13:50:20 UTC
Permalink
Post by danbrotherston
<snip>
Wow, more of a response than I expected, thanks very much for the
research. While not related to the mutex, the problem did appear to
be permission related. For the record, on windows XP
import sys
import mmap
import win32event
buffer_ready = win32event.CreateEvent (None, 0, 0,
"DBWIN_BUFFER_READY")
data_ready = win32event.CreateEvent (None, 0, 0, "DBWIN_DATA_READY")
buffer = mmap.mmap (0, 4096, "DBWIN_BUFFER", mmap.ACCESS_WRITE)
win32event.SetEvent (buffer_ready)
while win32event.WaitForSingleObject (data_ready, 1000) ==
print "Timed out"
print "Was signaled"
appears to work. Write access appears to be required for the buffer
print buffer.read(4)
print buffer.read(4092)
and no security object. I wasn't the one who figured this out, so I'm
really not sure why it works...but it seems to.
Excellent! Do you mind if I add a solution based on this as a
How-Do-I? to my site [1] (suitably accredited, of course)?

TJG

[1] http://timgolden.me.uk/python/win32_how_do_i.html
Tim Golden
2007-10-17 09:06:51 UTC
Permalink
Post by danbrotherston
I am trying to get the output from the win32 platform command
OutputDebugString. I have used the following C++ code as a
http://groups.google.com/group/microsoft.public.vc.utilities/browse_frm/thread/1434418cb968d053/1a3c957675242c7e?lnk=st&q=DBWIN_BUFFER&rnum=3#1a3c957675242c7e
And I have been able to translate most things into python, but I have
been unable to get it to work. I use the pywin extensions to call
CreateEvent and create the required events. But when I wait on the
event using the WaitOnSingleEvent call, it hangs indefinitely.
Well, unhelpfully, I can't get it to work, either! I used the code below,
so you might compare with yours to see if we're doing the same thing,
but I can't see any obvious problems. This page which you may have seen:

http://www.unixwiz.net/techtips/outputdebugstring.html

is useful, but the security problem they identify with the mutex
doesn't seem to apply when I'm a local admin and my two processes
are run on my desktop.

I did have a dig inside the mmapmodule.c code (for the second time
in a month!) and a few differences do emerge from the posted code:

- The python code uses a NULL security attribute, which should mean:
full access to everyone.
- The python code assumes an access of write means: create the file
mapping for PAGE_READWRITE and map it for WRITE, while the posted
code maps for READ only.

Neither of these seems terribly significant, but who knows? The
problem of course is that the OutputDebugString function is designed
to fail silently, so you've no idea which part of your debugger is
causing it to fail -- or something else altogether.

I've scanned (very quickly) the MS groups on Google and I can't see
anything helpful. Hopefully someone else on this or on the win32
list has more experience & expertise than I do here. (Which wouldn't
be hard!)

TJG

<code>
import sys
import mmap

import win32security
import win32event

def main (args):
sd = win32security.SECURITY_DESCRIPTOR ()
dacl = win32security.ACL ()
sd.SetSecurityDescriptorDacl (1, dacl, 0)
sa = win32security.SECURITY_ATTRIBUTES ()
sa.SECURITY_DESCRIPTOR = sd

buffer_ready = win32event.CreateEvent (sa, 0, 0, "DBWIN_BUFFER_READY")
data_ready = win32event.CreateEvent (sa, 0, 0, "DBWIN_DATA_READY")
buffer = mmap.mmap (0, 4096, "DBWIN_BUFFER", mmap.ACCESS_READ)

win32event.SetEvent (buffer_ready)

while win32event.WaitForSingleObject (data_ready, 1000) == win32event.WAIT_TIMEOUT:
pass

if __name__ == '__main__':
main (sys.argv[1:])

</code>

Loading...