Не слишком хорошо известно, что два младших бита любого описателя ядра (также: дескриптора или HANDLE) всегда равны нулю; другими словами, их численное представление всегда кратно четырём. Заметьте, что это применимо только к описателям объектов ядра; это не так для псевдо-описателей (типа GetCurrentProcess) или описателей других типов (описатели USER или GDI, мультимедийные дескрипторы...). Описателями ядра являются те вещи, которые вы можете передать в функцию CloseHandle.
Доступность младших двух битов кроется в заголовочном файле ntdef.h:
//То, что как минимум один младший бита всегда равен нулю, также неявно указывается функцией GetQueuedCompletionStatus, описание которой говорит, что вы можете установить младший бит описателя события для подавления уведомления порта. Чтобы это работало, необходимо, чтобы младший бит произвольного описателя изначально всегда был равен нулю.
// Low order two bits of a handle are ignored by the system and available
// for use by application code as tag bits. The remaining bits are opaque
// and used to store a serial number and table index.
//
#define OBJ_HANDLE_TAGBITS 0x00000003L
Эта информация бесполезна для большинства программистов, которые должны трактовать описатели как непрозрачные значения. Но эта информация может заинтересовать людей, которые реализуют низкоуровневые библиотеки классов и оборачивают объекты ядра для использования в такой библиотеке.
Похожая запись: Недопустимые ID потоков и процессов.
ОтветитьУдалить