![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OPEN_IF для секции
LightRipple © (2008-05-25 11:21:00)Здравствуйте !
Пытаюсь создавать секцию следующим образом:
InitializeObjectAttributes(@ObjectAttr, @ObjName, OBJ_CASE_INSENSITIVE, 0, nil);
Result := NtCreateSection(@hSection, SECTION_ALL_ACCESS, @ObjectAttr,
@SectionSize, PAGE_READWRITE, SEC_COMMIT, 0);
Все хорошо, кроме того, что если она (секция с таким же именем) уже
существует, то NtCreateSection возвращает STATUS_OBJECT_NAME_COLLISION (Object Name already exists),
что и не удивительно :), но при этом не возвращает Handle существующего объекта.
Как бы так исхитриться и заставить ее возвращать этот Handle ?
Вызывать NtOpenSection, при этой ошибке, считаю некузявым решением.
Ведь CreateFileMapping, в этом случае работает как надо.
В жизни не поверю, что она это делает через повторную попытку открытия объекта :)
Игорь Шевченко (2008-05-25 16:15:00) [41]LightRipple © (25.05.08 16:00) [7]
> Так и я там-же :). Только я указываю полный путь к объекту
> и родителя 0.
> Это что-ж получается ? Надо заводить глобальную переменную
> hBaseNamedObjects
> и во всех вызовах Nt ф-ий для секций использовать "Pareneted"
> объект ?
> Я правильно поняла ?
Да, именно так. Разборщик имени не занимается сложными выкладками и пытается создать объект с именем 'BaseNamedObjects\Foo' в корневом каталоге.
LightRipple (2008-05-25 16:00:00) [42]> [6] Игорь Шевченко © (25.05.08 15:55)
> A CreateFileMapping создает объекты в подкаталоге BaseNamedObjects ;)
Так и я там-же :). Только я указываю полный путь к объекту и родителя 0.
Это что-ж получается ? Надо заводить глобальную переменную hBaseNamedObjects
и во всех вызовах Nt ф-ий для секций использовать "Pareneted" объект ?
Я правильно поняла ?
Игорь Шевченко (2008-05-25 15:55:00) [43]
> А откуда там взялся "хендл RootDirectory" ?
A CreateFileMapping создает объекты в подкаталоге BaseNamedObjects ;)
LightRipple (2008-05-25 15:42:00) [44]Стоп.
А откуда там взялся "хендл RootDirectory" ?
Мы же вызываем с нулевым hRoot.
LightRipple (2008-05-25 15:39:00) [45]> [3] guav © (25.05.08 15:32)
> Как показывает отладчик VS2005, вот такой успешный вызов
Спасибо. Пойду изучать.
guav (2008-05-25 15:32:00) [46]Как показывает отладчик VS2005, вот такой успешный вызов
CreateFileMapping(INVALID_HANDLE_VALUE,
0,
PAGE_READWRITE,
0,
4096,
_T("Hello"));
Сводится к успешному (результат STATUS_OBJECT_NAME_EXISTS вызову ZwCreateSection с такими вот параметрами:
0x000f0007 - DesiredAccess
ObjectAttributes - содержит имя Hello и хендл RootDirectory, флаг OBJ_OPENIF, секьюрити нет.
0x00000004 - SectionPageProtection
0x08000000 - AllocationAttributes
0x00000000 - FileHandle
LightRipple (2008-05-25 15:08:00) [47]> [1] guav © (25.05.08 13:36)
> InitializeObjectAttributes(@ObjectAttr, @ObjName, OBJ_OPENIF, 0, nil);
Саш, я так пробовала.
В этом случае, она начинает ругаться совсем нецензурно:
STATUS_PRIVILEGE_NOT_HELD (A required privilege is not held by the client)
Может, надо создавать объект не с "ниловым" дескриптором безопасности ?
Но, CreateFileMapping - у, плевать на этот дескриптор. Я тоже хочу на него плевать :)
guav (2008-05-25 13:36:00) [48]
> InitializeObjectAttributes(@ObjectAttr, @ObjName, OBJ_CASE_INSENSITIVE, 0, nil);
InitializeObjectAttributes(@ObjectAttr, @ObjName, OBJ_OPENIF, 0, nil);