Конференция "WinAPI" » OPEN_IF для секции
 
  • guav © (29.05.08 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 © (29.05.08 22:54) [41]
    Перевод API взят из Jedi Windows API, накопирован по минимуму, чтобы не было внешних ссылок.
    Выводит
    New section handle 00000FBC
    Reopen
    Reopen section handle 00000FB8

  • LightRipple © (30.05.08 02:02) [42]
    > [39] Игорь Шевченко ©   (29.05.08 11:37)
    > [41] guav ©   (29.05.08 22:54)

    Побитовое сравнение кода выявило "совсем маленькую" опечатку:
    В моем проекте так определена константа: OBJ_OPENIF = 00000080;  

    Я уж и не помню откуда я ее брала, копипастила или набивала вручную.

    Как здорово, что мы не плюнули на это дело и довели его до конца !
    И подумать страшно, на какие грабли бы я еще наступала
    и какие бы делала выводы о работе, совсем ни в чем не виноватых, Nt-функций и системы :)

    Спасибо мальчики ! Уря !
  • Игорь Шевченко © (30.05.08 10:39) [43]
    LightRipple ©   (30.05.08 02:02) [42]

    Спасибо тебе огромное!!!
    Это ж и у меня так...
  • guav © (30.05.08 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] ?
  • Игорь Шевченко © (30.05.08 13:10) [45]
    guav ©   (30.05.08 12:34) [44]

    Можно подумать, ты святее Аллаха и ни разу не ошибаешься :)
    Можно подумать, что перевод Jedi гарантировано свободен от ошибок :)
  • guav © (30.05.08 13:13) [46]
    > [45] Игорь Шевченко ©   (30.05.08 13:10)
    > Можно подумать, ты святее Аллаха и ни разу не ошибаешься
    > :)

    Куда уж нам до Аллаха :)


    > [45] Игорь Шевченко ©   (30.05.08 13:10)
    > Можно подумать, что перевод Jedi гарантировано свободен
    > от ошибок :)

    Нет. Но у него больше пользователей и ошибок скорее меньше чем больше.
  • Игорь Шевченко © (30.05.08 13:37) [47]
    guav ©   (30.05.08 13:13) [46]


    > Нет. Но у него больше пользователей и ошибок скорее меньше
    > чем больше.


    Охотно верю. Но у меня как бы тоже пользователей есть, а ошибка грубая. Однако ж никто, кроме Александры, не натолкнулся.
  • LightRipple © (30.05.08 16:56) [48]
    > [43] Игорь Шевченко ©   (30.05.08 10:39)
    > Спасибо тебе огромное!!!

    Очень рада, что и от меня может быть польза :)

    > [44] guav ©   (30.05.08 12:34)
    > Кстати, с правильным OBJ_OPENIF не откроется ли оно кодом [0] ?

    Проверила: все работает на ура.
    (имеется ввиду использование имени с префиксом '\BaseNamedObjects' и нулевым парентом)
    Т.е. нет необходимости в использовании NtOpenDirectoryObject :)
 
Конференция "WinAPI" » OPEN_IF для секции
Есть новые Нет новых   [134433   +22][b:0][p:0.003]