Получение хэндла на директорию через native api

Тема в разделе "WASM.WIN32", создана пользователем gs6800_victim, 12 фев 2008.

  1. gs6800_victim

    gs6800_victim New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2008
    Сообщения:
    2
    привет ;)

    работаю над удалением каталога , аналог функции RemoveDirectoryW
    код на делфи, просьба не пинать

    Код (Text):
    1. var
    2.   buf1: array[0..519] of WCHAR;
    3.   str1: UNICODE_STRING;
    4.   attr: OBJECT_ATTRIBUTES;
    5.   iost: IO_STATUS_BLOCK;
    6.   fh: THANDLE;
    7.   fdi: FILE_DISPOSITION_INFORMATION;
    8.   ns: NTSTATUS;
    9. begin
    10. //---убрано
    11. //здесь идет формировании строки в buf1 следующего вида \??\c:\test
    12.  
    13.   if RtlDosPathNameToNtPathName_U(buf1, @str1, nil, nil) then
    14.   begin  
    15.      InitializeObjectAttributes(@attr, @str1, OBJ_CASE_INSENSITIVE, 0, nil);
    16.      ns := NtOpenFile(@fh, _DELETE, @attr, @iost, FILE_SHARE_READ or FILE_SHARE_WRITE or    FILE_SHARE_DELETE, FILE_DIRECTORY_FILE or FILE_OPEN_FOR_BACKUP_INTENT);
    17.      if (ns = STATUS_SUCCESS) then
    18.      begin
    19.        fdi.DeleteFile := true;
    20.        NtSetInformationFile(fh, @iost, @fdi, sizeof(fdi), FileDispositionInformation);
    21.        NtClose(fh);
    22.      end;
    23.    HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, str1.PStr);
    24.    end;
    25. end;
    NtOpenFile все время возвращает ошибку , либо DATATYPE_MISALIGNMENT либо INVALID_PARAMETER. В чем может быть проблема? Смотрел в kernel32.dll, ничего принциально различного до открытия директории не увидел.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    DATATYPE_MISALIGNMENT возвращается если имя не выровнено в памяти на 16 байт.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Упс, описался - на 8; привычка - я выравниваю на 16.
    Многие структуры должны быть выравнены в памяти, к таким относится OBJECT_ATTRIBUTES, это всегда надо учитывать используя native api. Возможно ошибка из-за того, что перед вызовом твоей функции не выровнен стек.
    Вообще использовать в функциях параметры типов BYTE и WORD запрещено, также и размер локальных переменных должен быть выровнен. Код dec esp/invoke CreateFile(..) возвратит ошибку, хоть и параметры корректны.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    выаравнивание обычно должно быть на грницу в sizeof(struct). для UNICODE_STRING это 8 байт. для UNICODE_STRING.Buffer это 2 байта, итд.
     
  5. gs6800_victim

    gs6800_victim New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2008
    Сообщения:
    2
    Clerk
    Мда, все верно. Теперь все работает, спасибо.