Конференция "WinAPI" » OPEN_IF для секции
 
  • Игорь Шевченко © (26.05.08 17:16) [20]
    Сдается мне, что они каталог BaseNamedObjects открывают с иными правами, нежели я или код в посте [14]
  • LightRipple © (26.05.08 17:49) [21]
    > [20] Игорь Шевченко ©   (26.05.08 17:16)
    > Сдается мне, что они каталог BaseNamedObjects открывают с иными правами, нежели я или код в посте [14]

    Я пробовала "методом научного тыка" менять права - у меня не получилось :(
  • LightRipple © (26.05.08 17:53) [22]
    Может нужна какая-то хитрая подготовка для SecurityDescriptor - а ?
  • Игорь Шевченко © (26.05.08 17:58) [23]
    LightRipple ©   (26.05.08 17:49) [21]

    А там прав на каталог больше чем $0002000F все равно нету.


    > Может нужна какая-то хитрая подготовка для SecurityDescriptor
    > - а ?


    в [3] написано, что их нету, дескрипторов.

    Если хочется помучиться, то достаточно Delphi'йским отладчиком пройтись по CreateFileMappingW, я бы плюнул и вызывал NtOpenSection (соответственно, убрав OBJ_OPENIF из ObjectAttributes при CreateSection)
  • guav © (26.05.08 18:07) [24]
    > [23] Игорь Шевченко ©   (26.05.08 17:58)
    > Если хочется помучиться, то достаточно Delphi'йским отладчиком
    > пройтись по CreateFileMappingW

    Лучше студийным, он больше имён расшифрует.
    Формирование OBJECT_ATTRIBUTES происходит в BaseFormatObjectAttributes, где для хендла папки папки вызывается BaseGetNamedObjectDirectory, где он берётся из глобальной переменной BaseNamedObjectDirectory.
  • LightRipple © (26.05.08 18:09) [25]
    > [23] Игорь Шевченко ©   (26.05.08 17:58)
    > в [3] написано, что их нету, дескрипторов.

    Там написано, что нет секьюрити для открываемой нами секции,
    а я имела ввиду при открытии рутового объекта (BaseNamedObjects).

    > я бы плюнул и вызывал NtOpenSection (соответственно, убрав OBJ_OPENIF из ObjectAttributes при CreateSection)

    Плюнуть, конечно можно. Но это означает, что я чего-то (вполне возможно очень важного)
    не понимаю. И где гарантия, что в другом месте, при работе с другими функциями,
    я не столкнусь с этой же проблеммой.
    Например, при работе с NtCreateMutant ?
  • LightRipple © (26.05.08 18:17) [26]
    > [24] guav ©   (26.05.08 18:07)
    > Лучше студийным, он больше имён расшифрует.
    > Формирование OBJECT_ATTRIBUTES происходит в BaseFormatObjectAttributes,
    > где для хендла папки папки вызывается BaseGetNamedObjectDirectory,
    > где он берётся из глобальной переменной BaseNamedObjectDirectory.

    А где прописана эта глобальная переменная BaseNamedObjectDirectory ?
  • guav © (26.05.08 18:38) [27]
    в ntdll.dll.
    Я не думаю что есть лёгкие пути достать её, кроме как через .pdb или закодировав смещение относително чего-то ещё в ntdll.
  • Игорь Шевченко © (26.05.08 20:41) [28]
    guav ©   (26.05.08 18:07) [24]


    > Лучше студийным, он больше имён расшифрует.


    Это у тебя символы установлены или ссылка в отладчике есть, откуда их тянуть.


    > где для хендла папки папки вызывается BaseGetNamedObjectDirectory,
    >  где он берётся из глобальной переменной BaseNamedObjectDirectory.
    >


    Которая заполняется при первом вызове BaseFormatObjectAttributes или раньше, которая берет имя из того, что kernel32.dll получает из разделяемых данных csrss, которые формируются при инициализации CSRSRV.DLL, которую загружает csrss.exe при каждом вызове из smss.exe в доме, который построил Джек.


    > А где прописана эта глобальная переменная BaseNamedObjectDirectory
    > ?


    В kernel32.dll - это его глобальная переменная.

    Я что хочу сказать - я попытался воспроизвести все вызовы, которые выполняет CreateFileMappingW, включая открытие каталога BaseNamedObjects, но все равно, при NtCreateSection (от ZwCreateSection отличается только первыми двумя буквами) я получаю при указании OBJ_OPENIF тот самый статус ($C0000061) - не хватает прав.

    То ли я где-то что-то пропускаю, то ли не в тот момент вызываю, но факт.
  • LightRipple © (26.05.08 23:05) [29]
    Я тоже чуть-чуть повозилась с этим делом.

    При помощи NtQuerySystemInformation и NtQueryObject, мне удалось выцарапать хэндл BaseNamedObjectDirectory,
    (заодно и ссылку на объект его содержащий. мало -ли понадобиться :)
    Далее я попыталась использовать этот Handle как рутовый (не дупликатя, он же из моего процесса).
    Все тоже самое: успешно создаем, успешно открываем, но спотыкаемся на OPEN_IF :(
    Заодно (а чем черт не шутит) попробовала заменить Nt на Zw.
    Как и ожидалось - чуда не произошло.

    P.S.
    Как еще можно попробовать извратиться ?
    Или откладывать эту задачку с пометкой "нерешенная" ?
  • guav © (27.05.08 00:17) [30]
    У меня код [15] работает. В смысле, NtCreateSection реально возращает STATUS_OBJECT_NAME_EXISTS и жирное убрано.
  • LightRipple © (27.05.08 02:00) [31]
    > [30] guav ©   (27.05.08 00:17)
    > У меня код [15] работает. В смысле, NtCreateSection реально возращает STATUS_OBJECT_NAME_EXISTS и жирное убрано.

    Так это все так и работало с самого начала и с таким же результатом :)
    Или у тебя еще и Handle уже существующего объекта возвращает ?
    Вопрос то сводится к тому, что можно ли одним вызовом NtCreateSection
    либо создать объект либо открыть уже существующий.
    Иными словами: заставить NtCreateSection работать в режиме "OPEN_IF".
    Видимо нельзя, или какой-то хитрый момент что-то ускользает от нас.
  • guav © (27.05.08 02:02) [32]
    > [31] LightRipple ©   (27.05.08 02:00)
    > Так это все так и работало с самого начала и с таким же
    > результатом :)
    > Или у тебя еще и Handle уже существующего объекта возвращает
    > ?

    STATUS_OBJECT_NAME_EXISTS != STATUS_OBJECT_NAME_COLLISION.
    STATUS_OBJECT_NAME_EXISTS не ошибка.
    Хендл возвращает.
  • LightRipple © (27.05.08 02:11) [33]
    >  [32] guav ©   (27.05.08 02:02)
    > Хендл возвращает.

    Так....
    Перед тем как запостить я скопировала код и проверила у себя.
    При попытке открыть уже существующий объект, его Handle у меня не возвращался. (Жирное убрано)
    Пойду перепроверять, что я там напартачила :)
  • LightRipple © (27.05.08 02:19) [34]
    Проверила еще раз.

    Код [15] Игорь Шевченко ©  с "убранным жирным"
    при попытке второй раз открыть объект возвращает STATUS_OBJECT_NAME_COLLISION
    и даже не думает возвращать Handle.

    Что за мистика ? Ты случайно не в VS работаешь ? :)
  • Игорь Шевченко © (27.05.08 09:42) [35]
    LightRipple ©   (27.05.08 02:19) [34]

    У меня OBJ_OPENIF закомментирован. Именно этот флаг заставляет возвращать STATUS_OBJECT_NAME_EXISTS вместо STATUS_OBJECT_NAME_COLLISION в ObInsertObject
  • guav © (27.05.08 09:46) [36]
    > [34] LightRipple ©   (27.05.08 02:19)

    Нет. Код просто скопирован. работаю под локальным пользователем с правами администратора. первый запуск возвращает 0, далее STATUS_OBJECT_NAME_EXISTS, хендлы разные.
  • LightRipple © (29.05.08 03:07) [37]
    > [35] Игорь Шевченко ©   (27.05.08 09:42)
    > [36] guav ©   (27.05.08 09:46)

    "Нда... - сказали мы с Петром Иванычем" (с) (Почти не измененная :)

    Саш, у меня просьба:
    не мог бы ты выложить здесь или выслать мне полный код, который "просто скопирован" (с убранным жирным)
    и который выдает такие изумительные результаты ? :)

    Интересует все: включая экспорт функций, объявления структур и
    используемые "стандартные" ф-ии типа InitializeObjectAttributes.
    Ну NT_SUCCESS, наверное, можно и не расписывать, хотя уже не знаю :)
  • LightRipple © (29.05.08 03:12) [38]
    > [37] LightRipple ©   (29.05.08 03:07)

    P.S.
    А ntdll - ки могут быть разными ?
  • Игорь Шевченко © (29.05.08 11:37) [39]

    > P.S.
    > А ntdll - ки могут быть разными ?


    Нет. Если ты посмотришь реализацию Nt(Zw)CreateSection, то увидишь, что разницы никакой
 
Конференция "WinAPI" » OPEN_IF для секции
Есть новые Нет новых   [134433   +22][b:0][p:0.001]