Операционная система Microsoft Windows 3.1 для программиста -том 3


Работа с локальной таблицей дескрипторов


Для полноты описания мы расскажем вам о функциях, позволяющих модифицировать локальную таблицу дескрипторов, создавая в ней новые дескрипторы или изменяя существующие (виртуальные драйвера могут выполнять аналогичные действия с глобальной таблицей дескрипторов, пользуясь специальным набором функций). Эти функции не рекомендуется использовать без крайней необходимости.

Функция AllocSelector позволяет создать в локальной таблице дескрипторов новый дескриптор или скопировать существующий:

UINT WINAPI AllocSelector(UINT uSelector);

Если параметр uSelector перед вызовом функции содержит селектор, для которого в таблице дескрипторов есть дескриптор, функция AllocSelector копирует этот дескриптор и возвращает селектор, соответствующий копии. Если же этот параметр равен нулю, в локальной таблице дескрипторов создается новый неинициализированный дескриптор, при этом функция возвращает значение селектора, соответствующее созданному дескриптору. При ошибке возвращается нулевое значение.

Если созданный дескриптор больше не нужен, его следует удалить при помощи функции FreeSelector :

UINT WINAPI FreeSelector(UINT uSelector);

Параметр функции должен содержать селектор, соответствующий удаляемому дескриптору. Если функция выполнилась без ошибок, она возвращает нулевое значение. В случае ошибки возвращается значение параметра uSelector.

Перед использованием нового дескриптора его следует проинициализировать - установить базовый адрес и предел.

Для установки базового адреса следует воспользоваться функцией SetSelectorBase , которая впервые появилась в составе программного интерфейса Windows версии 3.1:

UINT WINAPI SetSelectorBase(UINT uSelector, DWORD dwBase);

Для дескриптора, соответствующего селектору uSelector, устанавливается значение линейного адреса, равное dwBase.

Если функция выполнилась успешно, она возвращает значение параметра uSelector. В случае ошибки возвращается нулевое значение.

С помощью функции GetSelectorBase вы можете определить линейный адрес для любого существующего селектора:




Начало  Назад  Вперед