Какие дескрипторы пользовательского режима Win32 могут совместно использоваться процессами?


person MikeF    schedule 26.10.2017    source источник


Ответы (1)


HMODULE и HINSTANCE — это одно и то же в 32- и 64-битной Windows. Это базовый адрес модуля, и он не может быть разделен между процессами (за исключением адресов ntdll и kernel32, если другой процесс имеет ту же разрядность).

ATOM бывают в форме для каждого процесса и в глобальной форме, а глобальная форма может совместно использоваться процессами на одном и том же windowstation.

Дескрипторы рисования GDI не могут использоваться совместно (за исключением, может быть, GetStockObject?).

В Windows NT объекты GDI хранятся в клиентской части модуля GDI подсистемы Win32. Это означает, что любой объект GDI действителен только в контексте создавшего его приложения. .

Дескрипторы USER32 (HWND, HMENU, HICON, HCURSOR) могут использоваться совместно.

DuplicateHandle принимает дескрипторы рабочего стола и оконной станции...

person Anders    schedule 26.10.2017
comment
Windows 95/98/ME может быть другой, я уже не помню подробностей. Части ядра 16-битные, и безопасность отсутствует, поэтому вы можете играть в игры. HMODLUE для kernel32, user32, gdi32 и других могут использоваться совместно, поскольку они загружаются по специальному старшему адресу. Это может не относиться к ntdll, потому что это не базовая dll в этих системах. - person Anders; 26.10.2017
comment
Спасибо за информацию. Два быстрых продолжения. 1) Каким должен быть API, использующий global форму ATOM дескриптора? и 2) Под общим я имел в виду получение числового значения дескриптора из одного процесса и использование его в другом, как HWND. Если да, то могут ли HMENU, HICON, HCURSOR быть общими? PS. Извините, не могу проголосовать. Недостаточно сока. - person MikeF; 26.10.2017
comment
@MikeF, дескрипторы объектов USER являются общедоступными в сеансе и могут использоваться, если у вас есть доступ для чтения и записи для открытия связанного рабочего стола. Обычно глобальная таблица атомов находится в WindowStation, например, в единственном интерактивном WindowStation. в сеансе WinSta0. Обратите внимание, что процесс может быть ограничен только объектами USER и атомами процессов в одном и том же задании, если он имеет JOBOBJECT_BASIC_UI_RESTRICTIONS. - person Eryk Sun; 29.10.2017
comment
@eryksun: Спасибо за информацию. Я читал об этих ATOM, и это звучит как что-то очень старое. Что-то, что вышло из Windows 1.x. Я все еще пытаюсь понять, зачем им понадобилась такая запутанная конструкция. (Это риторический вопрос.) Что касается дескрипторов других объектов USER, я не знал, что вы можете просто скопировать значение дескриптора и использовать его в другом процессе, если у вас есть права доступа. Хорошая информация! - person MikeF; 30.10.2017
comment
Глобальные ATOM используются DDE для передачи строк от одного процесса к другому. - person Anders; 30.10.2017
comment
@MikeF, вы увидите атомы, связанные с DDE/OLE, закрепленные в начале глобальной таблицы атомов, начиная с 0xC001 (StdExit). В ядре есть несколько системных вызовов, связанных с этой таблицей -- NtQueryInformationAtom (информация об атоме и таблице), NtAddAtom, NtDeleteAtom, NtFindAtom. Эти вызовы сначала получают глобальную таблицу атомов из WindowStation (или задания) текущего потока и вызывают соответствующие функции библиотеки времени выполнения RtlQueryAtomInAtomTable, RtlQueryAtomsInAtomTable (информация о таблице, только ядро), RtlAddAtomToAtomTable, RtlDeleteAtomFromAtomTable и RtlLookupAtomInAtomTable. - person Eryk Sun; 31.10.2017
comment
@MikeF, USER также широко использует атомы, но у него есть собственная таблица, отдельная от таблицы WindowStation. Вы можете проверить эту таблицу с помощью отладчика ядра. Его адрес хранится в win32kbase!UserAtomTableHandle, или просто в win32k в старых версиях. Первая строковая запись 0xC001 — USER. - person Eryk Sun; 31.10.2017
comment
@eryksun: Привет, хорошая идея, спасибо за информацию. Я попробую старый добрый WinDbg. Я предполагаю, что тогда это был способ реализовать IPC. Очень плохо, что строки таблицы ATOM не могут быть длиннее 255 wchar_t (или, может быть, даже 255 байт, если в документации нет ошибки). Вы даже не можете надежно указать путь к файлу. - person MikeF; 31.10.2017