В последнем обновлении Windows 10, известном как "Anniversary Update" (версия 1607), была изменена константа bObjectType, используемая для идентификации объектов файлов в системной информации. В предыдущих версиях Windows значение этой константы для объектов типа "file" было в диапазоне от 25 до 31. Однако в версии 1607 Build 14393.105 это значение изменилось на 34. В Creators Update (версия 1703) значение увеличилось до 35.
Это изменение привело к тому, что ранее рабочий код, используемый для получения списка файлов, открытых процессом, перестал функционировать. Ниже представлен пример кода на Object Pascal (Delphi), который исправляет эту ошибку.
function GetHandlesByProcessID(const ProcessID: Integer; Results: TStringList; TranslatePaths: Boolean): Boolean;
var
hProcess: THandle;
hFile: THandle;
ReturnLength: DWORD;
SystemInformationLength: DWORD;
Index: Integer;
pHandleInfo: PSYSTEM_HANDLE_INFORMATION;
hQuery: NTSTATUS;
FileName: string;
begin
// Инициализация и получение списка дескрипторов
// ...
// Исправленная часть кода для фильтрации объектов файлов
if (pHandleInfo^.Handles[Index].ObjectType < 34) or
(pHandleInfo^.Handles[Index].ObjectType > 35) then
Continue;
// Остальная часть кода для получения и обработки файлов
// ...
end;
В данном коде необходимо изменить условие фильтрации объектов файлов, чтобы оно соответствовало новым значениям bObjectType. Теперь условие проверяет, что ObjectType находится в диапазоне от 34 до 35 для Windows 10 версии 1607, и от 35 до 36 для Creators Update.
Также стоит отметить, что вместо использования жестко заданных значений, лучше получить информацию о типах объектов из самой системы. Это можно сделать, вызвав функцию ZwQueryObject с параметром ObjectTypesInformation, чтобы получить массив структур OBJECT_TYPE_INFORMATION, содержащих информацию о типах объектов, включая TypeIndex, который соответствует ObjectTypeIndex из SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX.
Используя этот подход, код будет работать корректно на всех версиях Windows, начиная с Windows 8.1, и не потребует ручного обновления значений констант при изменении версий операционной системы.
Исправление ошибки `bObjectType` в Windows 10 версии 1607 при получении списка файлов процесса, связанная с изменением значения константы, используемой для идентификации файлов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS