Форум: "WinAPI";
Текущий архив: 2009.06.28;
Скачать: [xml.tar.bz2];
ВнизOPEN_IF для секции Найти похожие ветки
← →
guav © (2008-05-29 22:50) [40]Вот код. Могу для ясносит бинарник выслать.
program Project1;
{$APPTYPE CONSOLE}
uses
Windows , SysUtils;
type
PUNICODE_STRING = ^UNICODE_STRING;
UNICODE_STRING = record
Length: WORD;
MaximumLength: WORD;
Buffer: PWideChar;
end;
POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
{$EXTERNALSYM POBJECT_ATTRIBUTES}
OBJECT_ATTRIBUTES = record
Length: ULONG;
RootDirectory: THandle;
ObjectName: PUNICODE_STRING;
Attributes: ULONG;
SecurityDescriptor: Pointer;
SecurityQualityOfService: Pointer;
end;
NTSTATUS = Longint;
const
STATUS_OBJECT_NAME_EXISTS = $40000000;
OBJ_CASE_INSENSITIVE = $00000040;
OBJ_OPENIF = $00000080;
DIRECTORY_TRAVERSE = $0002;
DIRECTORY_CREATE_OBJECT = $0004;
function NT_SUCCESS(Status: NTSTATUS): Boolean;
begin
Result := Status >= 0;
end;
procedure RtlInitUnicodeString(
var DestinationString : UNICODE_STRING;
SourceString : PWideChar); stdcall; external "ntdll.dll";
function NtCreateSection(
SectionHandle : PHANDLE;
DesiredAccess : ACCESS_MASK;
ObjectAttributes : POBJECT_ATTRIBUTES;
SectionSize : PLARGEINTEGER;
Protect : ULONG;
Attributes : ULONG;
FileHandle : THandle
): NTSTATUS; stdcall; external "ntdll.dll";
function NtOpenDirectoryObject(
DirectoryHandle : PHANDLE;
DesiredAccess : ACCESS_MASK;
ObjectAttributes : POBJECT_ATTRIBUTES
): NTSTATUS; stdcall; stdcall; external "ntdll.dll";
procedure InitializeObjectAttributes(
p: POBJECT_ATTRIBUTES;
Name: PUNICODE_STRING;
Attr: ULONG;
Root: THandle;
SD: Pointer);
begin
p^.Length := SizeOf(OBJECT_ATTRIBUTES);
p^.RootDirectory := Root;
p^.Attributes := Attr;
p^.ObjectName := Name;
p^.SecurityDescriptor := SD;
p^.SecurityQualityOfService := nil;
end;
procedure RaiseNtError(status: NTSTATUS);
begin
raise EOSError.CreateFmt(
"Nt error %.8x , i""m, too lazy to format it properly",
[status]);
end;
function CreateorOpenSection(): THandle;
var
us, uss: UNICODE_STRING;
oa, oas: OBJECT_ATTRIBUTES;
status: NTSTATUS;
dir: THANDLE;
secsize: LARGE_INTEGER;
begin
RtlInitUnicodeString(us, "\BaseNamedObjects");
InitializeObjectAttributes(@oa, @us, OBJ_CASE_INSENSITIVE, 0, nil);
status := NtOpenDirectoryObject(@dir,
DIRECTORY_TRAVERSE or DIRECTORY_CREATE_OBJECT, @oa);
if not NT_SUCCESS(status) then
RaiseNtError(status);
try
RtlInitUnicodeString(uss, "AAASuperPuperSection");
InitializeObjectAttributes(@oas, @uss, OBJ_OPENIF,
dir, nil);
secsize.QuadPart := $20000;
status := NtCreateSection(@Result, SECTION_MAP_WRITE or SECTION_MAP_READ,
@oas, @secsize, PAGE_READWRITE, SEC_COMMIT, 0);
if not NT_SUCCESS(status) then
begin
RaiseNtError(status);
end;
if status = STATUS_OBJECT_NAME_EXISTS then
begin
WriteLn("Reopen");
end;
finally
CloseHandle(dir);
end;
end;
var H1, H2: THandle;
begin
try
H1 := CreateOrOpenSection();
try
WriteLn(Format("New section handle %.8x", [H1]));
H2 := CreateOrOpenSection();
try
WriteLn(Format("Reopen section handle %.8x", [H2]));
finally
CloseHandle(H2);
end;
finally
CloseHandle(H1);
end;
except
on E: Exception do
WriteLn("Error ", E.Message);
end;
ReadLn
end.
← →
guav © (2008-05-29 22:54) [41]Перевод API взят из Jedi Windows API, накопирован по минимуму, чтобы не было внешних ссылок.
ВыводитNew section handle 00000FBC
Reopen
Reopen section handle 00000FB8
← →
LightRipple © (2008-05-30 02:02) [42]> [39] Игорь Шевченко © (29.05.08 11:37)
> [41] guav © (29.05.08 22:54)
Побитовое сравнение кода выявило "совсем маленькую" опечатку:
В моем проекте так определена константа: OBJ_OPENIF = 00000080;
Я уж и не помню откуда я ее брала, копипастила или набивала вручную.
Как здорово, что мы не плюнули на это дело и довели его до конца !
И подумать страшно, на какие грабли бы я еще наступала
и какие бы делала выводы о работе, совсем ни в чем не виноватых, Nt-функций и системы :)
Спасибо мальчики ! Уря !
← →
Игорь Шевченко © (2008-05-30 10:39) [43]LightRipple © (30.05.08 02:02) [42]
Спасибо тебе огромное!!!
Это ж и у меня так...
← →
guav © (2008-05-30 12:34) [44]> [43] Игорь Шевченко © (30.05.08 10:39)
> [42] LightRipple © (30.05.08 02:02)
Используйте перевод, используемый не только вами http://jedi-apilib.sourceforge.net/ .
Или используйте С или С++ и копируйте из DDK напрямую.
Кстати, с правильным OBJ_OPENIF не откроется ли оно кодом [0] ?
← →
Игорь Шевченко © (2008-05-30 13:10) [45]guav © (30.05.08 12:34) [44]
Можно подумать, ты святее Аллаха и ни разу не ошибаешься :)
Можно подумать, что перевод Jedi гарантировано свободен от ошибок :)
← →
guav © (2008-05-30 13:13) [46]> [45] Игорь Шевченко © (30.05.08 13:10)
> Можно подумать, ты святее Аллаха и ни разу не ошибаешься
> :)
Куда уж нам до Аллаха :)
> [45] Игорь Шевченко © (30.05.08 13:10)
> Можно подумать, что перевод Jedi гарантировано свободен
> от ошибок :)
Нет. Но у него больше пользователей и ошибок скорее меньше чем больше.
← →
Игорь Шевченко © (2008-05-30 13:37) [47]guav © (30.05.08 13:13) [46]
> Нет. Но у него больше пользователей и ошибок скорее меньше
> чем больше.
Охотно верю. Но у меня как бы тоже пользователей есть, а ошибка грубая. Однако ж никто, кроме Александры, не натолкнулся.
← →
LightRipple © (2008-05-30 16:56) [48]> [43] Игорь Шевченко © (30.05.08 10:39)
> Спасибо тебе огромное!!!
Очень рада, что и от меня может быть польза :)
> [44] guav © (30.05.08 12:34)
> Кстати, с правильным OBJ_OPENIF не откроется ли оно кодом [0] ?
Проверила: все работает на ура.
(имеется ввиду использование имени с префиксом "\BaseNamedObjects" и нулевым парентом)
Т.е. нет необходимости в использовании NtOpenDirectoryObject :)
Страницы: 1 2 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.06.28;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.007 c