Буфер обмена. Где находится буфер обмена в Windows?
Данная статья будет разделена на две части:
- для новичков, которые только начали изучать компьютер и хотят узнать, где находится буфер обмена и что это такое;
- для более опытных пользователей, которые любят поковыряться в файлах операционной системы windows и ответить на некоторые вопросы, которые не дают им покоя;
Но, конечно же, рекомендую прочитать всю статью целиком, независимо от вашего уровня подготовленности.
Предлагаем сразу же видео на эту тему
О буфере обмена простыми словами — для новичков
Когда мы наводим на какой-то файл или папку курсор, нажимаем правой кнопкой мыши и выбираем «Копировать» (или сочетание клавиш Ctrl+C), в этом момент информация помещается в буфер обмена.
Туда мы можем копировать все что угодно: текст, папку, картинки, видео-файлы, аудиозаписи и прочие файлы. Компьютер выделит нужное место в оперативной памяти для хранения в буфере нужного объема информации.
Можно представить что это оперативная память компьютера, или своеобразная невидимая область, куда помещается информация на время, а затем удаляется.
То есть, когда мы перейдем в нужное место на нашем компьютере и опять же нажмем правой кнопкой мыши, но выберем уже «Вставить» (или сочетание клавиш Ctrl+V), то та папка, или файл, или кусок текста, который вы скопировали, возьмется из буфера обмена и вставится в нужное вам место.
А это значит, что начинающему пользователю не стоит беспокоиться о том, где именно это информация храниться. Главное, что мы можем вставить ее в нужное нам место.
Следует также понимать, что когда вы опять нажимаете «Копировать», то старая информация в буфере заменяется на новую и при вставке, естественно, вставляется новая.
Тоже самое происходит, если вы что-то «вырезаете».
Вы также можете вставлять информацию из буфера любое количество раз, т.е. при вставке информация от-туда не удаляется, она как-бы копируется.
И если вы скопировали папку, то вы можете вставить ее и на диск С, и на диск Е и в любое другое место на компьютере.
Также обратите внимание на то, что если вы скопировали в буфер обмена какой-то кусок текста из документа, допустим программы Microsoft Word, или веб-страницы, то вам нужно в документ или текстовое поле его и вставлять. Просто в папку вставить не получится.
И наоборот, скопированную папку в документ тоже вы не вставите.
Также будьте осторожны с важной информацией, которую вы скопировали в буфер: если компьютер неожиданно выключится, перезагрузится, или вы случайно забудете и выключите его, то информация из буфера обмена удалится.
Поэтому сразу же когда что-то поместили в него, вставьте в нужное вам место и сохраните, если это какой-то документ.
Чистить буфер не обязательно, ведь копируя какой-то файл, или текст, он заменяет предыдущий и поэтому память вашего компьютера засорятся не будет.
Комбинации клавиш, которые необходимы для работы
Ctrl+A | Выделить всё. Это могут быть все папки, весь текст, или все файлы в папке |
Ctrl+C | Копировать выделенный документ или документы, файлы в папке |
Ctrl+X | Вырезать выделенное. Аналогично предыдущему пункту, только вырезаем |
Ctrl+V | Вставить все скопированные или вырезанное, что находится в буфере обмена |
Ответ о нахождении буфера обмена для более продвинутых
Возможно среди читателей есть и те, кому хочется узнать, где находится та секретная папка, или то невидимое пространство, называемое буфером обмена.
Находим буфер обмена в Windows XP
В операционной системе Windows XP вы можете зайти на диск C, или на тот диск, на котором она находится, затем в папку «Documents and Settings», а дальше в «System 32», то есть путь такой: «C:/Documents and Settings/System 32».
Там есть файл (специальная программа) clipbrd.exe, запустив которую, вы можете увидеть что там находиться именно то, что вы скопировали.
Быстрее найти этот файл и запустить вы можете даже не заходя в папку «System 32», а просто войти в меню «Пуск» > «Выполнить», ввести clipbrd.exe и нажать клавишу ввода.
Сейчас приведу пример работы этой программы. Я выделю фрагмент текста и нажму «копировать».
А затем запущу файл clipbrd.exe. Мы увидим что этот текст находится именно там:
А это значит, что это есть то секретное место, где хранится информация, скопированная в буфер — в стандартной программе clipbrd.exe для windows XP. Если вы только что включили компьютер, то там будет пусто, так как туда еще ничего не копировалось.
Если там уже есть какая-то информация (в моем случае там уже есть текст), то вы при желании можете ее удалить через вкладку «Правка — Удалить» или нажать на крестик, который можно найти на панели инструментов программы clipbrd. exe под вкладками.
Ситуация с буфером в Windows 7 и Vista
В более поздних версия ОС Windows, таких как Windows 7 и Vista стандартная программа clipbrd.exe отсуствует.
На замену ей есть файл clip.exe, который отвечает за хранение информации для буфера обмена, но запустить его вам не удастся и посмотреть что там находиться тоже.
Но если навести курсор на это файл, то нам будет показана информация, что файл действительно предназначен для этих целей.
Удобные программы для работы с буфером обмена
Привожу несколько удобных программ, которые себя зарекомендовали.
Программа CLCL 1.1.2 для Windows
Для Windows Xp и Windows 7 и некоторых других версий, есть очень хорошая бесплатная программа CLCL 1.1.2. Она не требует установки, легко запускается и не занимает много места.
Скачать ее можно по этой ссылке: CLCL 1.1.2.zip (142 Кб)
Распаковав архив в увидите всего 4 файла, запускаем «CLCL»
После запуска она сворачивается в трей
Кликнув по значку она открывается и вы видите, что там находятся те документы или тексты которые вы копировали.
Для удобства, на скриншоте показан список основных преимуществ и возможностей программы CLCL 1.1.2.
Comfort Clipboard — удобный менеджер
Для Windows 7 есть удобная утилита по названием Comfort Clipboard. Вы можете поискать её через Google.com или Yandex.ru, скачать и установить.
- Ее возможности:
- Когда вы Что-то копируете, то программа не просто копирует и сохраняет нужные вам фрагменты, но у вас появляется возможность выбирать предыдущие скопированные в буфер обмена фрагменты текстов, папки и другие файлы. Она не заменяет, а сохраняет себе в память отдельно;
- При выключении компьютера, информация помещенная в программу не удаляется. Вы можете удалить ее тогда, когда она будет вам не нужна;
- Настройка горячих клавиш, изменение оформления, понятного интерфейса делает программу очень удобной в работе с буфером обмена;
Как работает буфер обмена в Windows / Хабр
Недавно у меня появилась возможность выполнить отладку буфера обмена в Windows, и я решил, что хорошо бы поделиться информацией, которую удалось узнать.
Начнём с обсуждения форматов буфера обмена. Такие форматы используются для описания, какие типы данные можно поместить в буфер. Там есть некоторое количество предопределённых стандартных форматов, которые может использовать приложение, вроде битового массива, текста ANSI, текста в Юникоде и TIFF. Windows также позволяет приложению установить собственный формат. Например, текстовый процессор может зарегистрировать формат, включающий в себя текст, форматирование и картинки.
Выход — разрешить одновременное хранение данных в буфере обмена в нескольких форматах. Когда я раньше думал о буфере обмена, то представлял, что там хранится единственный объект («мой текст» или «моя картинка»), но на самом деле мои данные хранятся в буфере в разных формах. Программа, которая берёт информацию из буфера, получает её в том формате, который она может использовать.
Как же данные появляются в буфере обмена? Очень просто, приложение сначала объявляет о праве собственности на буфер обмена через функцию OpenClipboard. После этого программа может очистить буфер обмена командой EmptyClipboard и, наконец, поместить туда свои данные командой SetClipboardData. SetClipboardData принимает два параметра. Первый — это идентификатор одного из форматов буфера обмена, которые мы упоминали выше.
Когда пользователь нажимает кнопку «Вставить», целевое приложение вызывает OpenClipboard и одну из следующих функций для определения доступных форматов данных: IsClipboardFormatAvailable, GetPriorityClipboardFormat или EnumClipboardFormats. Если оно находит подходящий формат, то тогда вызывает GetClipboardData с идентификатором нужного формата в качестве параметра, чтобы получить данные. В конце приложение использует команду CloseClipboard для закрытия буфера.
Теперь взглянем, как с помощью отладчика определить, какие данные записаны в буфер обмена. (Заметьте, что все мои записи сделаны в системе Win7/2008 R2 — так что на других версиях ОС они могут выглядеть несколько иначе). Поскольку буфер является частью Win32k.sys, вам понадобится отладчик ядра. Я люблю использовать в качестве контрольной точки
win32k!InternalSetClipboardData+0xe4
kd> u win32k!InternalSetClipboardData+0xe4-c L5 win32k!InternalSetClipboardData+0xd8: fffff960`0011e278 894360 mov dword ptr [rbx+60h],eax fffff960`0011e27b 8937 mov dword ptr [rdi],esi fffff960`0011e27d 4c896708 mov qword ptr [rdi+8],r12 fffff960`0011e281 896f10 mov dword ptr [rdi+10h],ebp fffff960`0011e284 ff15667e1900 call qword ptr[win32k!_imp_PsGetCurrentProcessWin32Process (fffff960`002b60f0)]
kd> dt win32k!tagCLIP +0x000 fmt : Uint4B +0x008 hData : Ptr64 Void +0x010fGlobalHandle : Int4B
Вот как выглядит вызов к SetClipboardData от «Блокнота»:
kd> k Child-SP RetAddr Call Site fffff880`0513a940 fffff960`0011e14f win32k!InternalSetClipboardData+0xe4 fffff880`0513ab90 fffff960`000e9312 win32k!SetClipboardData+0x57 fffff880`0513abd0 fffff800`01482ed3 win32k!NtUserSetClipboardData+0x9e fffff880`0513ac20 00000000`7792e30ant!KiSystemServiceCopyEnd+0x13 00000000`001dfad8 00000000`7792e494 USER32!ZwUserSetClipboardData+0xa 00000000`001dfae0 000007fe`fc5b892b USER32!SetClipboardData+0xdf 00000000`001dfb20 000007fe`fc5ba625 COMCTL32!Edit_Copy+0xdf 00000000`001dfb60 00000000`77929bd1 COMCTL32!Edit_WndProc+0xec9 00000000`001dfc00 00000000`779298da USER32!UserCallWinProcCheckWow+0x1ad 00000000`001dfcc0 00000000`ff5110bc USER32!DispatchMessageWorker+0x3b5 00000000`001dfd40 00000000`ff51133c notepad!WinMain+0x16f 00000000`001dfdc0 00000000`77a2652d notepad!DisplayNonGenuineDlgWorker+0x2da 00000000`001dfe80 00000000`77b5c521 kernel32!BaseThreadInitThunk+0xd 00000000`001dfeb0 00000000`00000000ntdll!RtlUserThreadStart+0x1d
Итак, теперь мы можем просмотреть содержимое RDI как tagCLIP и увидеть, что записано в буфер:
kd> dt win32k!tagCLIP @rdi +0x000 fmt : 0xd +0x008 hData : 0x00000000`00270235 Void +0x010fGlobalHandle : 0n1
Fmt — это формат для буфера обмена. 0Xd — это число 13, что соответствует тексту в формате Юникода. Однако мы не можем просто запустить
du
по значению hData
, потому что это дескриптор, а не прямой указатель на данные. Так что нужно поискать его в глобальной структуре win32k — gSharedInfo:
kd> ?win32k!gSharedInfo Evaluate expression: -7284261440224 = fffff960`002f3520 kd> dt win32k!tagSHAREDINFO fffff960`002f3520 +0x000 psi : 0xfffff900`c0980a70 tagSERVERINFO +0x008 aheList : 0xfffff900`c0800000 _HANDLEENTRY +0x010 HeEntrySize : 0x18 +0x018 pDispInfo : 0xfffff900`c0981e50 tagDISPLAYINFO +0x020ulSharedDelta : 0 +0x028 awmControl : [31] _WNDMSG +0x218DefWindowMsgs : _WNDMSG +0x228DefWindowSpecMsgs : _WNDMSG
aheList в gSharedInfo содержит массив с дескрипторами, и последние два байта hData, умноженные на размер записи дескриптора, показывают адрес записи нашего дескриптора:
kd> ?0x00000000`00270235 & FFFF Evaluate expression: 565 = 00000000`00000235 kd> ??sizeof(win32k!_HANDLEENTRY) unsigned int64 0x18 kd> ? 0xfffff900`c0800000 + (0x235*0x18) Evaluate expression: -7693351766792 = fffff900`c08034f8 kd> dt win32k!_HANDLEENTRY fffff900`c08034f8 +0x000 phead : 0xfffff900`c0de0fb0 _HEAD +0x008 pOwner : (null) +0x010 bType : 0x6 '' +0x011 bFlags : 0 '' +0x012 wUniq : 0x27
Если посмотреть phead со смещением 14, то мы получим наши данные (это смещение может отличаться на разных платформах):
kd> du fffff900`c0de0fb0 + 0x14 fffff900`c0de0fc4 "Hi NTDebugging readers!"
Представим другой сценарий. Я скопировал какой-то текст из Wordpad, и команда SetClipboardData отработала определённое количество раз, чтобы разместить данные в разных форматах. Запись в формате Юникода выглядит так::
Breakpoint 0 hit win32k!InternalSetClipboardData+0xe4: fffff960`0011e284 ff15667e1900 call qword ptr[win32k!_imp_PsGetCurrentProcessWin32Process (fffff960`002b60f0)] kd> dt win32k!tagCLIP @rdi +0x000 fmt : 0xd +0x008 hData : (null) +0x010fGlobalHandle : 0n0
hData равен нулю! Почему так? Оказывается, буфер обмена позволяет приложению передавать нуль в качестве параметра SetClipboardData для определённого формата. Это означает, что приложение способно предоставить данные в данном формате, но сделает это позже, в случае необходимости. Если я захочу вставить текст в «Блокнот», для чего в буфере должен быть текст в Юникоде, Windows отправит сообщение WM_RENDERFORMAT в окно WordPad, и тогда WordPad предоставит данные в новом формате.
Теперь посмотрим, как приложение может отслеживать буфер обмена на предмет изменений. Это важно знать, потому что в этом месте Windows позволяет сторонним приложениям подключаться к системе. Если у вас наблюдаются непонятные глюки с копированием и вставкой, причиной может быть некорректное поведение какой-то из таких программ. Начнём с того, что рассмотрим механизмы подключения к буферу обмена. Затем рассмотрим, можно ли с помощью отладчика идентифицировать приложения, которые используют такие хуки.
Есть три способа отслеживать буфер обмена на предмет изменений: просмотр буфера, прослушивание форматов буфера и запрос порядкового номера буфера. Мы сосредоточимся на первых двух способах, потому что они предусматривают получение уведомлений, когда содержимое буфера обновилось. В третьем методе приложение должно само проверять каждый раз, изменился ли буфер, и этот метод нельзя использовать в цикле опросов.
Функциональность Clipboard Viewer появилась ещё в версии Windows 2000, если не раньше. Принцип работы довольно простой: приложение, которое заинтересовано в получении уведомлений об изменении в буфере, вызывает SetClipboardViewer и передаёт дескриптор своего окна. Windows хранит этот дескриптор в структуре win32k, и каждый раз при изменении буфера обмена Windows отправляет сообщение WM_DRAWCLIPBOARD в зарегистрированное окно.
Конечно, зарегистрироваться для просмотра буфера могут несколько окон — как Windows справится с этим? Ну, если приложение вызывает SetClipboardViewer, а другое окно раньше уже зарегистрировалось для просмотра буфера обмена, то Windows возвращает новому окну значение дескриптора предыдущего окна. И теперь новое окно, следящее за буфером, обязано вызвать SendMessage каждый раз, когда получает WM_DRAWCLIPBOARD, и уведомить об изменении буфера следующее окно в цепочке тех, кто следит за буфером. Каждое из окон, следящих за буфером, также должно обрабатывать сообщения WM_CHANGECBCHAIN. Такие сообщения уведомляют все остальные окна об удалении одного звена в цепочке и сообщают, какое звено становится следующим в очереди. Это позволяет сохранить цепочку.
Очевидная проблема подобной архитектуры состоит в следующем: она рассчитывает, что каждое приложение, следящее за буфером, будет вести себя корректно, не завершать неожиданно работу и в целом будет хорошим гражданином в системе. Если какое-то из приложений начнёт вести себя недружественно, то оно не отправит уведомление об изменении буфера обмена следующему приложению в цепочке, в результате чего вся цепочка останется без уведомлений.
Чтобы справиться с такими проблемами, в Windows Vista добавили механизм прослушивания формата буфера обмена — Clipboard Format Listener. Он работает во многом так же, как просмотр буфера обмена, за исключением того, что Windows сама ведёт список приложений, которые прослушивают буфер, а не полагается на добропорядочность приложений, которые должны сохранять цепочку.
Если приложение хочет прослушивать буфер, оно вызывает функцию AddClipboardFormatListener и передаёт дескриптор своего окна. После этого обработчик сообщений окна будет получать сообщения WM_CLIPBOARDUPDATE. Когда приложение собирается завершить работу или больше не хочет получать уведомления, оно вызывает RemoveClipboardFormatListener.
Мы рассмотрели, как зарегистрировать просмотр/прослушивание буфера обмена. Теперь посмотрим, как с помощью отладчика определить, какие программы участвуют в этих процессах. Сначала нужно идентифицировать процесс в сессии, где мы хотим проверить мониторинг буфера обмена. Это может быть любой процесс win32 в этой сессии — он нужен нам просто для того, чтобы найти указатель на Window Station. В этом случае я бы использовал окно «Блокнота», как и раньше:
kd> !process 0 0 notepad.exe PROCESS fffff980366ecb30 SessionId: 1 Cid: 0374 Peb: 7fffffd8000 ParentCid: 0814 DirBase: 1867e000 ObjectTable: fffff9803d28ef90 HandleCount: 52.Image: notepad.exe
Если вы делаете это в процессе отладки ядра, то понадобится интерактивно сменить контекст (используя .process /I<address>
, затем нажать g
и подождать, пока отладчик прорвётся назад). Теперь запускаем DT
на адрес процесса как _EPROCESS
, и смотрим на поле Win32Process:
kd> dt _EPROCESS fffff980366ecb30 Win32Process nt!_EPROCESS +0x258 Win32Process : 0xfffff900`c18c0ce0 Void
Далее посмотрим адрес Win32Process как win32k!tagPROCESSINFO и узнаем значение rpwinsta:
kd> dt win32k!tagPROCESSINFO 0xfffff900`c18c0ce0 rpwinsta +0x258 rpwinsta : 0xfffff980`0be2af60 tagWINDOWSTATION
Это наша Window Station. Сливаем содержимое через dt:
kd> dt 0xfffff980`0be2af60 tagWINDOWSTATION win32k!tagWINDOWSTATION +0x000 dwSessionId : 1 +0x008 rpwinstaNext : (null) +0x010 rpdeskList : 0xfffff980`0c5e2f20 tagDESKTOP +0x018 pTerm : 0xfffff960`002f5560 tagTERMINAL +0x020 dwWSF_Flags : 0 +0x028 spklList : 0xfffff900`c192cf80 tagKL +0x030 ptiClipLock : (null) +0x038 ptiDrawingClipboard: (null) +0x040 spwndClipOpen : (null) +0x048 spwndClipViewer : 0xfffff900`c1a4ca70 tagWND +0x050 spwndClipOwner : 0xfffff900`c1a3ef70 tagWND +0x058 pClipBase : 0xfffff900`c5512fa0 tagCLIP +0x060 cNumClipFormats : 4 +0x064 iClipSerialNumber : 0x16 +0x068 iClipSequenceNumber : 0xc1 +0x070 spwndClipboardListener : 0xfffff900`c1a53440 tagWND +0x078 pGlobalAtomTable: 0xfffff980`0bd56c70 Void +0x080 luidEndSession : _LUID +0x088 luidUser : _LUID +0x090 psidUser : 0xfffff900`c402afe0 Void
Обратите внимание на поля spwndClipViewer, spwndClipboardListener и spwndClipOwnerfields. Здесь spwndClipViewer — это последнее зарегистрированное окно в цепочке тех, кто просматривает буфер обмена. Также spwndClipboardListener — последнее зарегистрированное окно прослушивания буфера в списке Clipboard Format Listener. Окно spwndClipOwner — это то окно, которое разместило данные в буфере обмена.
Ели мы знаем окно, то осталось несколько шагов, чтобы узнать, к какому процессу оно относится. Нас интересуют forspwndClipViewer, spwndClipboardListener и spwndClipOwner. Сначала запускаем dt, чтобы узнать значение tagWND. Для этой демонстрации мы используем spwndClipViewer:
kd> dt 0xfffff900`c1a4ca70 tagWND win32k!tagWND +0x000 head : _THRDESKHEAD +0x028 state : 0x40020008 +0x028 bHasMeun : 0y0 +0x028 bHasVerticalScrollbar : 0y0 …
Нас интересует только значение head — так что если смещение 0, делаем dt для того же адреса на _THRDESKHEAD:
kd> dt 0xfffff900`c1a4ca70 _THRDESKHEAD win32k!_THRDESKHEAD +0x000 h : 0x00000000`000102ae Void +0x008 cLockObj : 6 +0x010 pti : 0xfffff900`c4f26c20tagTHREADINFO +0x018 rpdesk : 0xfffff980`0c5e2f20 tagDESKTOP +0x020 pSelf : 0xfffff900`c1a4ca70 "???"
Теперь запускаем dt для адреса, указанного в поле pti как tagTHREADINFO:
kd> dt 0xfffff900`c4f26c20 tagTHREADINFO win32k!tagTHREADINFO +0x000 pEThread : 0xfffff980`0ef6cb10 _ETHREAD +0x008 RefCount : 1 +0x010 ptlW32 : (null) +0x018 pgdiDcattr : 0x00000000`000f0d00 Void
Теперь нам интересно только значение поля pEThread, которое мы можем передать в !thread:
kd> !thread 0xfffff980`0ef6cb10 e THREAD fffff9800ef6cb10 Cid 087c.07ec Teb: 000007fffffde000 Win32Thread: fffff900c4f26c20 WAIT: (WrUserRequest) UserModeNon-Alertable fffff9801c01efe0 SynchronizationEvent Not impersonating DeviceMap fffff980278a0fc0 Owning Process fffff98032e18b30 Image: viewer02.exe Attached Process N/A Image: N/A Wait Start TickCount 5435847 Ticks: 33 (0:00:00:00.515) Context Switch Count 809 IdealProcessor: 0 LargeStack UserTime 00:00:00.000 KernelTime 00:00:00.062 Win32 Start Address 0x000000013f203044 Stack Init fffff880050acdb0 Current fffff880050ac6f0 Base fffff880050ad000 Limit fffff880050a3000 Call 0 Priority 11 BasePriority 8 UnusualBoost 0 ForegroundBoost 2IoPriority 2 PagePriority 5 Child-SP RetAddr Call Site fffff880`050ac730 fffff800`01488f32 nt!KiSwapContext+0x7a fffff880`050ac870 fffff800`0148b74f nt!KiCommitThreadWait+0x1d2 fffff880`050ac900 fffff960`000dc8e7 nt!KeWaitForSingleObject+0x19f fffff880`050ac9a0 fffff960`000dc989 win32k!xxxRealSleepThread+0x257 fffff880`050aca40 fffff960`000dafc0 win32k!xxxSleepThread+0x59 fffff880`050aca70 fffff960`000db0c5 win32k!xxxRealInternalGetMessage+0x7dc fffff880`050acb50 fffff960`000dcab5 win32k!xxxInternalGetMessage+0x35 fffff880`050acb90 fffff800`01482ed3 win32k!NtUserGetMessage+0x75 fffff880`050acc20 00000000`77929e6a nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffff880`050acc20) 00000000`002ffb18 00000000`00000000 0x77929e6a
Как видим, просмотр буфера обмена зарегистрировн от имени процесса viewer02. exe. Поскольку просмотр идёт по цепочке, определить следующий процесс в цепочке будет непросто. Но мы можем сделать это для тех, кто прослушивает буфер. Снова взглянем на нашу Window Station:
kd> dt 0xfffff980`0be2af60 tagWINDOWSTATION win32k!tagWINDOWSTATION +0x000 dwSessionId : 1 +0x008 rpwinstaNext : (null) +0x010 rpdeskList : 0xfffff980`0c5e2f20 tagDESKTOP +0x018 pTerm : 0xfffff960`002f5560 tagTERMINAL +0x020 dwWSF_Flags : 0 +0x028 spklList : 0xfffff900`c192cf80 tagKL +0x030 ptiClipLock : (null) +0x038 ptiDrawingClipboard : (null) +0x040 spwndClipOpen : (null) +0x048 spwndClipViewer : 0xfffff900`c1a4ca70tagWND +0x050 spwndClipOwner : 0xfffff900`c1a3ef70tagWND +0x058 pClipBase : 0xfffff900`c5512fa0 tagCLIP +0x060 cNumClipFormats : 4 +0x064 iClipSerialNumber : 0x16 +0x068 iClipSequenceNumber : 0xc1 +0x070 spwndClipboardListener: 0xfffff900`c1a53440 tagWND +0x078 pGlobalAtomTable: 0xfffff980`0bd56c70 Void +0x080 luidEndSession : _LUID +0x088 luidUser : _LUID +0x090 psidUser : 0xfffff900`c402afe0 Void
Если запустить dt на spwndClipboardListener, то увидим поле spwndClipboardListenerNext с указанием следующего прослушивающего процесса:
kd> dt 0xfffff900`c1a53440 tagWND spwndClipboardListenerNext win32k!tagWND +0x118 spwndClipboardListenerNext : 0xfffff900`c1a50080 tagWND
При достижении последнего процесса в списке прослушивающих буфер tagWND, значение его поля spwndClipboardListenerNext будет нулевым:
kd> dt 0xfffff900`c1a50080 tagWND spwndClipboardListenerNext win32k!tagWND +0x118 spwndClipboardListenerNext : (null)
Используя адрес окна, мы можем тем же методом добраться до названия процесса. Как упоминалось ранее, поскольку tagWND — это структура ядра, ОС сама хранит указатели spwndClipboardListener/spwndClipboardListenerNext, так что они не могут привести к таким проблемам с отслеживанием буфера, как цепочки просмотра.
На этом заканчивается наш обзор буфера обмена Windows. Надеюсь, для вас он стал информативным. Хотите узнать больше о мониторинге буфера обмена? Вот хорошая статья MSDN об этом.
Встроенная ОС, поддержка и услуги | ОСРВ, гипервизор
Запускайте критически важные встраиваемые системы быстрее с помощью нашей коммерческой ОСРВ, гипервизора, средств разработки и услуг.
БЕСПЛАТНАЯ 30-ДНЕВНАЯ ПРОБНАЯ ВЕРСИЯ ПОГОВОРИ С НАМИ
Встроенные системы, которым доверяют везде
Наша операционная система реального времени (RTOS), гипервизор и промежуточное ПО обеспечивают производительность и безопасность, а также упрощают сертификацию безопасности. Мы являемся предпочтительной встроенной ОС для транспортных средств, вентиляторов, систем управления поездами, систем автоматизации производства, медицинских роботов и многого другого.
Нам доверяют OEM-производители и компании первого уровня по всему миру, и сейчас мы работаем с более чем 215 миллионами автомобилей.
Мы создаем надежное и безопасное встроенное системное программное обеспечение с 1980 года.
ПОСМОТРЕТЬ ПОРТФОЛИО НАШЕЙ ПРОДУКЦИИ
Все, что вам нужно для создания лучших встраиваемых систем
Если вы хотите повысить безопасность или безопасность или хотите оптимизировать процесс кроссплатформенной разработки, мы можем помочь. Мы можем воплотить ваши планы в жизнь с помощью гипервизора RTOS и , специально созданного для встраиваемых систем, включая предварительно сертифицированные варианты продукта. Наша модульная микроядерная архитектура обеспечивает безопасность и надежность и позволяет избежать дублирования усилий по разработке ОС для нескольких продуктов. Мы предоставляем поддерживает на каждом этапе жизненного цикла продукта и предлагает профессиональные услуги и обучение , чтобы предоставить вам дополнительные знания, которые вам нужны, когда они вам нужны.
- Программное обеспечение
- Поддерживать
- Профессиональные услуги
Программное обеспечение
Встроенные системы являются более программно управляемыми и сложными, чем когда-либо. Позвольте нам предоставить программную основу и строительные блоки, чтобы помочь вам сосредоточиться на предоставлении дополнительных функций и программного обеспечения, а не на обслуживании ОС.
Мы предлагаем:
- Продукты Foundation , включая QNX ® Neutrino ® RTOS, QNX ® ® платформу разработки программного обеспечения (SDP) Гипервизор
- Сертифицированы по безопасности Варианты нашей продукции, ускоряющие процесс сертификации
- Решения для обеспечения безопасности , включая безопасные беспроводные обновления и BlackBerry® Jarvis®, наше уникальное решение для анализа двоичных файлов
- Промежуточное ПО для ускорения разработки и ускорения выхода на рынок
Узнать больше
Поддержка
Для успеха вам нужно больше, чем программное обеспечение. Вам нужен партнер, который знает, что работа не сделана, пока вы не приступите к работе.
Мы предлагаем:
- Различные пакеты поддержки и технические консультации от разработчиков, инженеров и архитекторов
- Лучший в своем классе продукт Документация, дополненная нашей базой знаний
- Пакеты поддержки плат для широкого спектра процессоров ARM и x86
Варианты поддержки
Профессиональные услуги
Если вам нужно расширить свою команду, запустить проект или сертифицировать свои продукты, вы можете положиться на наших экспертов по встраиваемым системам и ОС, которые предоставят необходимые вам знания и опыт.
Мы предлагаем:
- Услуги по обеспечению безопасности и решения для анализа двоичного кода
- Индивидуальная разработка
- Услуги по обеспечению безопасности , которые помогут вам получить сертификаты IEC 61508, ISO 26262, IEC 62304 и EN 5012X
- Учебные курсы , разработанные и проводимые экспертами в области функциональной безопасности и разработки встроенного программного обеспечения
Узнать больше
Программное обеспечение
Программное обеспечение
Встроенные системы являются более программно управляемыми и сложными, чем когда-либо.
Позвольте нам предоставить программную основу и строительные блоки, чтобы помочь вам сосредоточиться на предоставлении дополнительных функций и программного обеспечения, а не на обслуживании ОС.
Мы предлагаем:
- Продукты Foundation , включая QNX ® Neutrino ® RTOS, QNX ® платформу разработки программного обеспечения (SDP) и платформу разработки программного обеспечения (SDP) с поддержкой POSIX0054 ® Гипервизор
- Сертифицированы по безопасности Варианты нашей продукции, ускоряющие процесс сертификации
- Решения для обеспечения безопасности , включая безопасные беспроводные обновления и BlackBerry® Jarvis®, наше уникальное решение для анализа двоичных файлов
- Промежуточное ПО для ускорения разработки и ускорения выхода на рынок
Узнать больше
Поддержка
Поддержка
Для успеха вам нужно больше, чем программное обеспечение.
Вам нужен партнер, который знает, что работа не сделана, пока вы не приступите к работе.
Мы предлагаем:
- Различные пакеты поддержки и технические консультации от разработчиков, инженеров и архитекторов
- Лучший в своем классе продукт Документация, дополненная нашей базой знаний
- Пакеты поддержки плат для широкого спектра процессоров ARM и x86
Варианты поддержки
Профессиональные услуги
Профессиональные услуги
Если вам нужно расширить свою команду, запустить проект или сертифицировать свои продукты, вы можете положиться на наших экспертов по встраиваемым системам и ОС, которые предоставят вам необходимые знания и опыт.
Мы предлагаем:
- Услуги по обеспечению безопасности и решения для анализа двоичного кода
- Индивидуальная разработка
- Услуги по обеспечению безопасности , которые помогут вам получить сертификаты IEC 61508, ISO 26262, IEC 62304 и EN 5012X
- Учебные курсы , разработанные и проводимые экспертами в области функциональной безопасности и разработки встроенного программного обеспечения
Узнать больше
Почему стоит выбрать BlackBerry QNX Services
Безопасность
Ускорьте вывод на рынок программного обеспечения, предварительно сертифицированного по IEC 61508, ISO 26262 и IEC 62304, обучения QNX® по функциональной безопасности и услуг по обеспечению безопасности.
Безопасность
Благодаря микроядерной архитектуре наша ОСРВ и гипервизор защищены по своей конструкции. Положитесь на наших проверенных экспертов по кибербезопасности, которые помогут защитить ваши системы.
Масштабируемость
Наша полностью управляемая ОСРВ с микроядром может использоваться во всех линейках продуктов, поэтому ваши разработчики могут сосредоточиться на дополнительных функциях, а не на обслуживании ОС.
Надежность
Архитектура микроядра QNX защищает ОС и систему от сбоев компонентов и обеспечивает исключительную производительность.
Где мы помогаем
У нас есть опыт в области программного обеспечения и решения, которые отвечают уникальным потребностям OEM-производителей и производителей в этих отраслях.
Подключенные и автономные транспортные средства
Оптимизируйте разработку безопасных и защищенных автомобильных систем с помощью нашего программного обеспечения, промежуточного программного обеспечения и услуг, включая нашу ОС, предварительно сертифицированную по стандарту ISO 26262.
Узнать больше
Робототехника и автоматизация
Ускорьте сертификацию безопасности, обеспечьте надежность и сократите время разработки с помощью нашего специально разработанного встроенного программного обеспечения, промежуточного программного обеспечения и услуг.
Узнать больше
Операционная система для медицинских устройств
Убедитесь, что ваши медицинские устройства безопасны, защищены и надежны на протяжении всего жизненного цикла продукта.
Узнать больше
Операционная система реального времени для железнодорожных систем
Соответствие сложным нормативным требованиям, повышение надежности и сокращение времени разработки ваших критически важных для безопасности железнодорожных систем.
Узнать больше
Операционная система для тяжелого машиностроения
Упростите сертификацию безопасности и ускорьте внедрение новых продуктов для вашего тяжелого машиностроения.
Узнать больше
Операционная система реального времени для промышленных систем управления
Решите уникальные проблемы безопасности, защиты и производительности, которые могут возникнуть при разработке систем промышленного Интернета вещей (IIoT).
Узнать больше
Встроенная ОС для аэрокосмической и оборонной промышленности
Упростите разработку и обеспечьте надежность ваших безопасных, функционально безопасных встроенных аэрокосмических и оборонных систем.
Узнать больше
Программное обеспечение для коммерческого транспорта
Упростите сертификацию безопасности по ISO 26262, обеспечьте доступность и укрепите безопасность с помощью программных решений, поддерживающих адаптивную платформу AUTOSAR.
Узнать больше
Узнать больше
Ресурсы
Доступ к последним официальным документам, вебинарам, примерам из практики и руководствам по отраслевым решениям.
Посетите ресурсный центр
Сертификаты
См. список предварительно сертифицированных продуктов и продуктов, подлежащих сертификации безопасности.
Узнать больше
Служба поддержки
Получите помощь через наш онлайн-портал, личные линии помощи, портал сообщества, базу знаний и многое другое.
Посетите службу поддержки
BSP
Поиск в нашей библиотеке пакетов поддержки плат (BSP) по поставщику микросхем, названию платы или имени BSP.
Найдите свой BSP
Предстоящие События- Предстоящие события
- Embedded World в Нюрнберге — 14–16 марта
- India TECHFORUM в Бангалоре — 29 марта
- Зарегистрируйтесь на мероприятие или зарегистрируйтесь и присоединяйтесь к нам на вебинаре.
|
БЮЛЛЕТЕНЬ НОВОСТЕЙ
Мероприятие, встроенные системыEmbedded World в Нюрнберге — 14–16 марта
Зарегистрироваться
Мероприятие, встроенные системыИндия TECHFORUM в Бангалоре — 29 марта
Зарегистрироваться
Мероприятия и вебинары BlackBerry QNX Зарегистрируйтесь для участия в мероприятии или зарегистрируйтесь и присоединяйтесь к нам для участия в вебинаре.
См. Расписание
Вычислить изображения буферной зоны
Изображения буферной зоныИспользовать изображение буферной зоны для создания изображения буферной зоны из классифицированного изображения. В изображении буферной зоны каждый пиксель имеет значение с плавающей запятой или целое число, которое определяется как расстояние от этого пикселя до ближайшего пикселя выбранного класса или классов в единицах пикселей. Вы назначаете максимальное значение расстояния, и в результате для любых пикселей с расстоянием, превышающим это значение, будет установлено значение максимального расстояния.
Вы также можете написать сценарий для создания изображений буферной зоны с помощью задачи BufferZone.
- На панели инструментов выберите Classification > Post Classification > Изображение буферной зоны . Появится диалоговое окно «Входной файл классификации».
- Выберите входной файл классификации и любое дополнительное пространственное подмножество, затем нажмите OK . Появится диалоговое окно буферной зоны.
- Из списка Имена классов выберите классы, до которых нужно измерить расстояние. Если выбрано более одного класса, расстояние будет от пикселя до ближайшего класса.
- В раскрывающемся списке Output Data Type выберите Integer или Float .
- Нажмите кнопки увеличения/уменьшения Максимальное расстояние , чтобы задать максимальное измеряемое расстояние, или введите значение (в пикселях) в соответствующее поле. Любые пиксели с расстоянием, превышающим это значение, будут установлены на максимальное значение расстояния.
- Выберите имя выходного файла и папку в Поле выходного растра .
- Установите флажок Предварительный просмотр , чтобы увидеть предварительный просмотр настроек, прежде чем нажать OK для обработки данных.
Предварительный просмотр рассчитывается только для области в представлении и использует уровень разрешения, с которым вы просматриваете изображение. Подробную информацию о результатах см. в разделе Предварительный просмотр. Для предварительного просмотра другой области изображения выполните панорамирование и масштабирование интересующей области и повторно включите параметр Preview .
Установите флажок Показать результат , чтобы отобразить выходные данные в представлении после завершения обработки. В противном случае, если флажок снят, результат можно загрузить из диспетчера данных.
Чтобы повторно использовать эти параметры задачи в будущих сеансах ENVI, сохраните их в файл. Щелкните стрелку вниз и выберите Сохранить значения параметров , затем укажите расположение и имя файла для сохранения. Обратите внимание, что некоторые типы параметров, такие как растры, векторы и области интереса, не будут сохранены вместе с файлом.
Фото буфер: 599 847 рез. по запросу «Буфер обмена» — изображения, стоковые фотографии и векторная графика | Shutterstock