Win32 Spooler API
Win32 Spooler API — это набор программных интерфейсов (Application Programming Interface) операционной системы Microsoft Windows, предназначенный для управления печатью и связанными с ней задачами. API обеспечивает взаимодействие приложений с диспетчером печати (спулером), который отвечает за буферизацию, постановку в очередь, отправку заданий на принтеры и управление самими принтерами. Win32 Spooler API является частью подсистемы печати Windows и предоставляет функции как для локальной, так и для сетевой печати.
История
Подсистема печати Windows прошла длительный путь развития. В ранних версиях Windows (например, Windows 3.x) управление печатью было относительно простым и осуществлялось через принтерные драйверы и простой спулер. С выходом Windows 95 и Windows NT 4.0 была введена более сложная архитектура, включающая Win32 Spooler API. Этот API был разработан для унификации доступа к функциям печати из 32-битных приложений, работающих в среде Win32.
В последующих версиях Windows (2000, XP, Vista, 7, 8, 10, 11) API расширялся и совершенствовался. Были добавлены новые функции для поддержки новых типов принтеров (например, сетевых, USB, Bluetooth), улучшена безопасность, введена поддержка цветного управления (ICM — Image Color Management), XPS-документов и облачной печати. Несмотря на появление более современных технологий, таких как Windows Print Driver и Universal Print, Win32 Spooler API остаётся основным низкоуровневым интерфейсом для программного управления печатью.
Архитектура подсистемы печати Windows
Подсистема печати Windows включает несколько ключевых компонентов:
- Спулер печати (Print Spooler Service) — системная служба (spoolsv.exe), которая принимает задания на печать от приложений, сохраняет их в виде файлов-спулов (обычно с расширением .SPL), управляет очередями и отправляет их на принтер.
- Драйверы принтеров — программные модули, преобразующие данные из формата приложения (например, GDI-команды) в команды, понятные конкретной модели принтера (PCL, PostScript, ESC/P и т.д.).
- Win32 Spooler API — интерфейс, через который приложения взаимодействуют со спулером. Он включает функции для добавления, удаления, приостановки, возобновления и мониторинга заданий, а также для управления принтерами и портами.
- Провайдеры печати (Print Providers) — компоненты, которые обеспечивают взаимодействие спулера с различными типами принтеров (локальными, сетевыми, через Интернет).
Основные функции Win32 Spooler API
API предоставляет широкий набор функций, которые можно условно разделить на несколько категорий:
Управление принтерами
- AddPrinter — добавляет новый принтер в систему (локальный или сетевой).
- DeletePrinter — удаляет принтер из системы.
- GetPrinter — получает информацию о принтере (имя, порт, драйвер, статус, настройки).
- SetPrinter — изменяет параметры принтера (например, имя, порт, настройки по умолчанию).
- EnumPrinters — перечисляет все принтеры, доступные в системе (локальные, сетевые, виртуальные).
- OpenPrinter — открывает дескриптор принтера для последующих операций.
- ClosePrinter — закрывает дескриптор принтера.
Управление заданиями на печать
- AddJob — создаёт новое задание на печать и возвращает имя файла-спула для записи данных.
- StartDocPrinter — начинает новое задание на печать (документ).
- EndDocPrinter — завершает задание на печать.
- StartPagePrinter — начинает новую страницу в задании.
- EndPagePrinter — завершает текущую страницу.
- WritePrinter — записывает данные (например, команды PCL или PostScript) в задание на печать.
- ScheduleJob — помещает задание в очередь печати.
- GetJob — получает информацию о задании (статус, размер, владелец, приоритет).
- SetJob — изменяет параметры задания (например, приостановить, возобновить, отменить, изменить приоритет).
- EnumJobs — перечисляет все задания в очереди печати для конкретного принтера.
Управление драйверами и портами
- AddPrinterDriver — устанавливает драйвер принтера.
- DeletePrinterDriver — удаляет драйвер принтера.
- EnumPrinterDrivers — перечисляет установленные драйверы.
- AddPort — добавляет новый порт (например, LPT1, COM1, TCP/IP).
- DeletePort — удаляет порт.
- EnumPorts — перечисляет доступные порты.
Управление форматами и принтер-серверами
- AddForm — добавляет новый формат бумаги (например, A4, Letter, Custom).
- DeleteForm — удаляет формат.
- EnumForms — перечисляет доступные форматы.
- GetPrinterData — получает пользовательские данные, связанные с принтером.
- SetPrinterData — устанавливает пользовательские данные.
Типы данных и структуры
Для работы с API используются специальные структуры данных, определённые в заголовочных файлах Windows (например, wingdi.h, winspool.h). Основные структуры:
- PRINTER_INFO_1 — базовая информация о принтере (имя, описание, комментарий).
- PRINTER_INFO_2 — подробная информация о принтере (имя, порт, драйвер, сервер, настройки по умолчанию, статус).
- PRINTER_INFO_3 — информация о безопасности принтера.
- PRINTER_INFO_4 — информация для сетевых принтеров.
- JOB_INFO_1 — базовая информация о задании (идентификатор, имя документа, владелец, статус, размер).
- JOB_INFO_2 — подробная информация о задании (включая время создания, приоритет, количество страниц).
- DRIVER_INFO_1 — информация о драйвере принтера.
- PORT_INFO_1 — информация о порте (имя, тип).
Применение
Win32 Spooler API используется в самых разных сценариях:
- Разработка приложений для печати — текстовые редакторы, графические редакторы, офисные пакеты (Microsoft Office, LibreOffice) используют этот API для отправки документов на печать.
- Системы управления печатью — корпоративные решения для мониторинга, учёта и управления принтерами (например, PaperCut, PrintManager) используют API для перечисления принтеров, заданий и управления ими.
- Серверы печати — Windows Server с ролью Print Server использует API для управления сетевыми принтерами и очередями.
- Автоматизация и скриптинг — администраторы могут писать скрипты на PowerShell или C++ для автоматизации задач: добавление принтеров, очистка очередей, мониторинг статуса.
- Виртуальные принтеры — драйверы, которые вместо отправки на физический принтер сохраняют вывод в файл (например, PDF, XPS), также используют Win32 Spooler API.
- Диагностика и устранение неполадок — утилиты для диагностики печати (например, Print Management Console) используют API для получения информации о состоянии системы.
Безопасность и ограничения
Работа с Win32 Spooler API требует определённых привилегий. Для выполнения операций, изменяющих конфигурацию системы (добавление/удаление принтеров, драйверов, портов), необходимы права администратора. Обычные пользователи могут только отправлять задания на печать и просматривать свои собственные задания. Служба спулера работает в контексте системной учётной записи (LocalSystem), что обеспечивает ей высокий уровень доступа.
В истории Windows были обнаружены уязвимости, связанные с Win32 Spooler API. Например, уязвимость PrintNightmare (CVE-2021-34527) позволяла злоумышленникам удалённо выполнять код с правами системы через спулер печати. В ответ на это Microsoft выпустила обновления безопасности, изменившие поведение API: по умолчанию для удалённой установки драйверов теперь требуются права администратора, а также были введены дополнительные проверки.
Пример использования (псевдокод)
Ниже приведён упрощённый пример на C++ с использованием Win32 Spooler API для отправки простого текста на принтер:
```cpp
include <windows.h>
include <winspool.h>
void PrintText(const char printerName, const char text) { HANDLE hPrinter; DOC_INFO_1 docInfo; DWORD bytesWritten;
// Открываем принтер if (!OpenPrinter((LPSTR)printerName, &hPrinter, NULL)) { // Обработка ошибки return; }
// Начинаем документ docInfo.pDocName = "Test Document"; docInfo.pOutputFile = NULL; docInfo.pDatatype = "RAW";
if (StartDocPrinter(hPrinter, 1, (LPBYTE)&docInfo) == 0) { ClosePrinter(hPrinter); return; }
// Начинаем страницу StartPagePrinter(hPrinter);
// Отправляем данные WritePrinter(hPrinter, (LPVOID)text, strlen(text), &bytesWritten);
// Завершаем страницу EndPagePrinter(hPrinter);
// Завершаем документ EndDocPrinter(hPrinter);
// Закрываем принтер ClosePrinter(hPrinter); } ```
Сравнение с другими технологиями печати
Win32 Spooler API является низкоуровневым интерфейсом. В современных приложениях часто используются более высокоуровневые абстракции:
- GDI (Graphics Device Interface) — классический интерфейс для рисования на экране и печати. Приложения используют GDI-функции для вывода графики, а GDI-драйвер принтера преобразует их в команды для API.
- Windows Print Driver (V4) — современная модель драйвера, которая использует XPS (XML Paper Specification) в качестве формата данных. V4-драйверы могут работать как с классическим GDI, так и с XPS.
- Universal Print — облачный сервис Microsoft, предоставляющий API на основе REST. Он не требует Win32 Spooler API на стороне клиента, но может использовать его для взаимодействия с локальными принтерами.
- CUPS (Common Unix Printing System) — система печати, используемая в Linux и macOS. Она имеет собственную архитектуру и API, несовместимые с Win32 Spooler API.
Несмотря на появление облачных решений, Win32 Spooler API остаётся критически важным для локальной и корпоративной печати в экосистеме Windows.
Источники
- Microsoft Docs: "Print Spooler API" (Windows App Development).
- Microsoft Docs: "Win32 Spooler Functions" (Windows App Development).
- Microsoft Docs: "Print Spooler Service" (Windows IT Pro Center).
- Microsoft Security Response Center: "PrintNightmare Vulnerability CVE-2021-34527".
- Charles Petzold, "Programming Windows", 5th Edition (главы, посвящённые печати).
- Документация Microsoft по структурам PRINTER_INFO_, JOB_INFO_, DRIVER_INFO_*.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →