![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перечисление системных объектных типов [Win2k]
BiN © (2006-10-18 16:20:00)Как по вашему, возможна ли ситуация, когда NtQueryObject(0, ObjectAllTypesInformation... возвращает не полный список типов
Собственно, кусок действующего кода
procedure TSystemTypeList.Refresh;
var
Data: POBJECT_ALL_TYPES_INFO;
TypeInfo: POBJECT_TYPE_INFO;
dwToRead: DWORD;
dwRead: DWORD;
ntRes: NTSTATUS;
i: Integer;
begin
Clear;
Data:=nil;
try
dwToRead:=0;
ntRes:=NtQueryObject(0, ObjectAllTypesInformation, Data, dwToRead, @dwRead);
while ntRes=STATUS_INFO_LENGTH_MISMATCH do
begin
dwToRead:=dwRead;
ReallocMem(Data, dwToRead);
ntRes:=NtQueryObject(0, ObjectAllTypesInformation, Data, dwToRead, @dwRead);
end;
if not NT_SUCCESS(ntRes) then
RaiseNtStatusError(ntRes);
ReallocMem(Data, dwRead);
TypeInfo:=@(Data^.ObjectsTypeInfo);
for i:=0 to Data^.NumberOfObjectTypes-1 do
begin
Add(TypeInfo);
TypeInfo:=POBJECT_TYPE_INFO((DWORD(TypeInfo.Name.Buffer)+TypeInfo.Name.Length) and not 3+4);
end;
finally
ReallocMem(Data, 0);
end;
end;
В результате, в список по пока невыясненным причинам не попадает, например, тип "File". Но при этом вызов NtQueryObject(hTempHandle, ObjectTypeInformation... с хэндлом файла в качестве параметра отрабатывает вполне корректно.
BiN (2006-11-04 18:12:00) [21]
> BiN © (20.10.06 11:20) [16]
> QSI или NtQueryObject(0, ObjectAllTypesInformation.
>
> .... только они дают соответствие индекса типа и его имени.
>
Ошибка. NtQueryObject(0, ObjectAllTypesInformation нене годится для определения соответствия между индексом типа и его именем.
Т.е при сброшенном флаге FLG_MAINTAIN_OBJECT_TYPELIST остается использовать только NtQueryObject( Handle, ObjectTypeInformation.
Всем спасибо.
n0name (2006-10-21 16:40:00) [22]
> function RtlGetNtGlobalFlags: DWORD; stdcall; external 'ntdll.
> dll' name 'RtlGetNtGlobalFlags';
Зачем? Если загрузчик сам копирует это значение в PEB.
BiN (2006-10-21 14:14:00) [23]
> Riply © (21.10.06 11:48) [17]
>
> >Игорь Шевченко
> А как узнать установлен ли флаг FLG_MAINTAIN_OBJECT_TYPELIST
> ?
function RtlGetNtGlobalFlags: DWORD; stdcall; external 'ntdll.dll' name 'RtlGetNtGlobalFlags';
> >BiN
> Нашлось ли решение ?
> У меня перечислялись все типы и считала, что так и должно
> быть :)
Да, там перечисляются все типы, но их порядок в директории \ObjectTypes не соответсвует индексам ObjectTypeIndex из структуры _SYSTEM_HANDLE_INFORMATION. Для решения, как я уже говорил, использую комбинацию NtQueryObject(0, ObjectAllTypesInformation и NtQueryObject(Handle, ObjectTypeInformation.
n0name (2006-10-21 12:49:00) [24]
> А как узнать установлен ли флаг FLG_MAINTAIN_OBJECT_TYPELIST
> ?
PEB.NtGlobalFlag and FLG_MAINTAIN_OBJECT_TYPELIST > 0
Riply (2006-10-21 11:48:00) [25]>Игорь Шевченко
А как узнать установлен ли флаг FLG_MAINTAIN_OBJECT_TYPELIST ?
>BiN
Нашлось ли решение ?
У меня перечислялись все типы и считала, что так и должно быть :)
BiN (2006-10-20 11:20:00) [26]
> n0name (20.10.06 11:12) [15]
Данный метод в контексте моей задачи все же не подходит.
Только QSI илиNtQueryObject(0, ObjectAllTypesInformation.
Т.к. только они дают соответствие индекса типа и его имени.
n0name (2006-10-20 11:12:00) [27]
> Что и делает NtQuerySystemInformation
FLG_MAINTAIN_OBJECT_TYPELIST по умолчанию не установлен AFAIR
n0name (2006-10-20 11:07:00) [28]
var
ns: Integer;
hDir: DWORD;
oaDirName: OBJECT_ATTRIBUTES;
usDirName: UNICODE_STRING;
pvBuffer: Pointer;
pObj: POBJDIR_INFORMATION;
rl, cont: DWORD;
begin
RtlInitUnicodeString(@usDirName, '\ObjectTypes');
ZeroMemory(@oaDirName, sizeof(oaDirName));
oaDirName.Len := sizeof(oaDirName);
oaDirName.ObjectName := @usDirName;
ns := ZwOpenDirectoryObject(@hDir, DIRECTORY_QUERY, @oaDirName);
if (ns = 0) then
begin
rl := 0;
cont := 0;
pvBuffer := GetMemory($1000);
ns := ZwQueryDirectoryObject(hDir, pvBuffer, $1000, 0, 1, @cont, @rl);
pObj := pvBuffer;
if (ns = 0) then
while (pObj.ObjectName.Length <> 0) do
begin
ListBoxAddString(GetDlgItem(hDlg, 1000), pObj.ObjectName.Buffer);
pObj := Pointer(DWORD(pObj) + 16);
end;
FreeMemory(pvBuffer);
end;
RtlFreeUnicodeString(@usDirName);
end;
Игорь Шевченко (2006-10-20 11:07:00) [29]n0name (20.10.06 10:21) [11]
Что и делает NtQuerySystemInformation
BiN (2006-10-20 10:35:00) [30]
> n0name (20.10.06 10:21) [11]
>
> Надежнее по \ObjectTypes пройтись.
Тоже вариант.
n0name (2006-10-20 10:21:00) [31]Надежнее по \ObjectTypes пройтись.
Rouse_ (2006-10-19 10:55:00) [32]Об этом баге уже давно изветсно :) Тянется еще с четверки: http://www.anticracking.sk/EliCZ/bugs/WinBugs.htm
BiN (2006-10-18 21:31:00) [33]
> Игорь Шевченко © (18.10.06 17:56) [7]
>
> Обманул я тебя. В разные места. NtQueryObject (...AllTypes.
> ..) не должна видеть типов, объявленных динамически по ObCreateObjectType
Ну что ж, видно придется через другое место реализовывать... -)
Спасибо.
> han_malign © (18.10.06 18:07) [8]
>
> offtop:
> (TypeInfo.Name.Length == TypeInfo.Name.MaximumLength)?
> (... and not 3 + 4) - смело(например для смещения 8) ==>
> ((... +3) and not 3)
Увы, замечание непонятно. Разъясни, пожалуйста.
han_malign (2006-10-18 18:07:00) [34]offtop:
(TypeInfo.Name.Length == TypeInfo.Name.MaximumLength)?
(... and not 3 + 4) - смело(например для смещения 8) ==> ((... +3) and not 3)
Игорь Шевченко (2006-10-18 17:56:00) [35]
> А без разницы. NtQueryObject (AllTypes) лезет в ту же дырку,
> что и QSI
Обманул я тебя. В разные места. NtQueryObject (...AllTypes...) не должна видеть типов, объявленных динамически по ObCreateObjectType
Игорь Шевченко (2006-10-18 17:49:00) [36]BiN © (18.10.06 17:11) [5]
> Игорь, я не использую QSI.
А без разницы. NtQueryObject (AllTypes) лезет в ту же дырку, что и QSI
Ты ради интереса этот флаг через gflags установи и сравни результат.
BiN (2006-10-18 17:11:00) [37]
> Игорь Шевченко © (18.10.06 16:59) [4]
Игорь, я не использую QSI.
Вот список, который возвращается (число элементов совпадает с NumberOfObjectTypes = 23)
Type
Directory
SymbolicLink
Token
Process
Thread
Job
Event
EventPair
Mutant
Callback
Semaphore
Timer
Profile
WindowStation
Desktop
Section
Key
Port
WaitablePort
Adapter
Controller
Device
Тип "File" по идее должен идти 26-м
Игорь Шевченко (2006-10-18 16:59:00) [38]"This information class is only available if FLG_MAINTAIN_OBJECT_TYPELIST was set in
NtGlobalFlags at boot time.
The format of the data returned to the SystemInformation buffer is a sequence of
SYSTEM_OBJECT_TYPE_INFORMATION structures, chained together via the NextEntryOffset
member. Immediately following the name of the object type is a sequence of
SYSTEM_OBJECT_INFORMATION structures, which are chained together via the
NextEntryOffset member.The ends of both the object type chain and the object chain
are marked by a NextEntryOffset value of zero."
(с) Gary Nebbett
Ketmar (2006-10-18 16:54:00) [39]тады не знаю. ИШ спроси. %-)
BiN (2006-10-18 16:53:00) [40]
> Ketmar © (18.10.06 16:47) [1]
>
> файл чужой просто? (это так, бредовое предположение)
Свой.