Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перечисление системных объектных типов [Win2k]


Страницы:   1 2 3

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]
>
> файл чужой просто? (это так, бредовое предположение)


Свой.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо