Перехват очереди печати

Тема в разделе "WASM.WIN32", создана пользователем Marik, 6 ноя 2008.

  1. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Доброго времени суток!
    Есть задача ведения лога всего что распечатывается с компутера (лучше конечно с сохраненением копий) я так понимаю здесь потребуется перехватывать процесс spoolsv.exe (диспетчер очереди печати) Только вот с какой стороны подойти к нему пока не могу решить :)) спецификации или пример подобного к сожалению гугл не подкинул. может кто подскажет по теме с чего начать?
     
  2. MiraclE

    MiraclE New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2005
    Сообщения:
    38
    Адрес:
    Kazakhstan
    В свое время решил проблему перехватом функций ScheduleJob и StartDocPrinter экспортируемых winspool.drv для каждого процесса в который он проецируется.
    Способ не дзенский но внятного интерфейса для хука печати я так и не нашел.
     
  3. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Последовательность действий такая:

    OpenPrinter
    FindFirstPrinterChangeNotification
    WaitForSingleObject
    .if eax == 0
    FindNextPrinterChangeNotification
    .if eax != 0
    EnumJobs
    .if eax == ERROR_INSUFFICIENT_BUFFER
    Здесь читаешь данные из структуры JOB_INFO_2
    .endif
    .endif
    .endif
    FindClosePrinterChangeNotification
    CloseHandle
    ClosePrinter

    А дальше MSDN тебе в руки.
     
  4. SlyBit

    SlyBit New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2008
    Сообщения:
    43
    Marik

    Можно перехватывать CreateDCW и TextOutW.
    Если 2-ой параметр (device name) CreateDCW указывает на "winspool", то запоминаем возвращаемый этой функцией хэдл DC.
    Затем, как только он встречается в TextOutW, то 4-ый параметр будет указывать на распечатываемый текст, 5-ый - на его длину.
    Тестировал только на notepad.exe.

    Посмотрите в MSDN'e код "Printing a Document".
     
  5. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Всем спасибо за подсказки! буду пробовать :)