1 | #!python
|
2 | #
|
3 | # Run with native CPython. Needs pywin32 extensions.
|
4 |
|
5 | # Copyright (c) 2011-2012 Ryan Prichard
|
6 | #
|
7 | # Permission is hereby granted, free of charge, to any person obtaining a copy
|
8 | # of this software and associated documentation files (the "Software"), to
|
9 | # deal in the Software without restriction, including without limitation the
|
10 | # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
11 | # sell copies of the Software, and to permit persons to whom the Software is
|
12 | # furnished to do so, subject to the following conditions:
|
13 | #
|
14 | # The above copyright notice and this permission notice shall be included in
|
15 | # all copies or substantial portions of the Software.
|
16 | #
|
17 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
22 | # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
23 | # IN THE SOFTWARE.
|
24 |
|
25 | import win32pipe
|
26 | import win32api
|
27 | import win32file
|
28 | import time
|
29 | import threading
|
30 | import sys
|
31 |
|
32 | # A message may not be larger than this size.
|
33 | MSG_SIZE=4096
|
34 |
|
35 | serverPipe = win32pipe.CreateNamedPipe(
|
36 | "\\\\.\\pipe\\DebugServer",
|
37 | win32pipe.PIPE_ACCESS_DUPLEX,
|
38 | win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_READMODE_MESSAGE,
|
39 | win32pipe.PIPE_UNLIMITED_INSTANCES,
|
40 | MSG_SIZE,
|
41 | MSG_SIZE,
|
42 | 10 * 1000,
|
43 | None)
|
44 | while True:
|
45 | win32pipe.ConnectNamedPipe(serverPipe, None)
|
46 | (ret, data) = win32file.ReadFile(serverPipe, MSG_SIZE)
|
47 | print(data.decode())
|
48 | sys.stdout.flush()
|
49 |
|
50 | # The client uses CallNamedPipe to send its message. CallNamedPipe waits
|
51 | # for a reply message. If I send a reply, however, using WriteFile, then
|
52 | # sometimes WriteFile fails with:
|
53 | # pywintypes.error: (232, 'WriteFile', 'The pipe is being closed.')
|
54 | # I can't figure out how to write a strictly correct pipe server, but if
|
55 | # I comment out the WriteFile line, then everything seems to work. I
|
56 | # think the DisconnectNamedPipe call aborts the client's CallNamedPipe
|
57 | # call normally.
|
58 |
|
59 | try:
|
60 | win32file.WriteFile(serverPipe, b'OK')
|
61 | except:
|
62 | pass
|
63 | win32pipe.DisconnectNamedPipe(serverPipe)
|