Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2012 14:48:04

3ka5_cat
Зарегистрирован: 2012-08-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Named pipe access violation

Доброго времени суток!
Создал named pipe между двумя программами на питоне. Спустя некоторое время своей работы, одна программа должна отправить сообщение в пайп второй. Все это время, вторая программа в цикле читает из пайпа.
При запуске второй программы, во время ReadFile() возникает эксепшн:

WindowsError: exception: access violation writing 0x1D1A9FD8

Создание пайпа в первой проге:
DBwrFuz = CreateNamedPipe("\\\\.\\pipe\\DBwr-Fuz-pipe", # pipe name
        PIPE_ACCESS_DUPLEX,       # read/write access
        PIPE_TYPE_MESSAGE |       # message type pipe
        PIPE_READMODE_MESSAGE |   # message-read mode
        PIPE_WAIT,                # blocking mode
        PIPE_UNLIMITED_INSTANCES, # max. instances
        BUFSIZE,                  # output buffer size
        BUFSIZE,                  # input buffer size
        0,                        # client time-out
        None)                     # default security attribute
if DBwrFuz == -1:
        print "Error! Create DBwr-Fuz pipe " + str(GetLastError())
        return -1

Открытие пайпа и чтение во второй:
hDBwrFuz = CreateFile("\\\\.\\pipe\\DBwr-Fuz-pipe",
        GENERIC_WRITE | GENERIC_READ,
	FILE_SHARE_READ | FILE_SHARE_WRITE,
	None, OPEN_EXISTING,
	FILE_ATTRIBUTE_NORMAL, None)
if hDBwrFuz == -1:
	print "Error! Open DBwr-Fuz pipe " + str(GetLastError())
	return -1
while True:
        try:
            msg_size, msg = ReadFile(hDBwrFuz, 512)
        except pywintypes.error, exc:
            if exc[0] not in [winerror.ERROR_BROKEN_PIPE,]:
                raise
#      except Exception as e:
           #Fuzzer terminated!
#          print(e)
#          break

Где я неправ?

Отредактировано 3ka5_cat (Авг. 29, 2012 14:50:43)

Офлайн

#2 Авг. 29, 2012 15:01:50

3ka5_cat
Зарегистрирован: 2012-08-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Named pipe access violation

Поправил с помощью PeekNamedPipe():

while True:
    try:
        (nRead, nAvail, nMessage) = PeekNamedPipe(hDBwrFuz, 0)
        if nAvail:
            (msg_size, msg ) = ReadFile(hDBwrFuz, nAvail)

Офлайн

#3 Авг. 29, 2012 15:33:46

3ka5_cat
Зарегистрирован: 2012-08-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Named pipe access violation

Кстати, не поправил. Все еще актуально. Когда приходит сообщение и проходит проверку через PeekNamedPipe, nAvail равно длине сообщения, но все равно та же самая ошибка выскакивает. Да и PeekNamedPipe какое-то странное решение…

Офлайн

#4 Авг. 29, 2012 16:41:37

3ka5_cat
Зарегистрирован: 2012-08-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Named pipe access violation

Ошибка глупейшая:
пытался использовать windll.kernel32.ReadFile с аргументами для win32file.ReadFile вместо win32file.ReadFile

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version