Открыть сервис

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.

Источники

  1. Microsoft Docs: "Print Spooler API" (Windows App Development).
  2. Microsoft Docs: "Win32 Spooler Functions" (Windows App Development).
  3. Microsoft Docs: "Print Spooler Service" (Windows IT Pro Center).
  4. Microsoft Security Response Center: "PrintNightmare Vulnerability CVE-2021-34527".
  5. Charles Petzold, "Programming Windows", 5th Edition (главы, посвящённые печати).
  6. Документация Microsoft по структурам PRINTER_INFO_, JOB_INFO_, DRIVER_INFO_*.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →