привет работаю над удалением каталога , аналог функции RemoveDirectoryW код на делфи, просьба не пинать Код (Text): var buf1: array[0..519] of WCHAR; str1: UNICODE_STRING; attr: OBJECT_ATTRIBUTES; iost: IO_STATUS_BLOCK; fh: THANDLE; fdi: FILE_DISPOSITION_INFORMATION; ns: NTSTATUS; begin //---убрано //здесь идет формировании строки в buf1 следующего вида \??\c:\test if RtlDosPathNameToNtPathName_U(buf1, @str1, nil, nil) then begin InitializeObjectAttributes(@attr, @str1, OBJ_CASE_INSENSITIVE, 0, nil); 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); if (ns = STATUS_SUCCESS) then begin fdi.DeleteFile := true; NtSetInformationFile(fh, @iost, @fdi, sizeof(fdi), FileDispositionInformation); NtClose(fh); end; HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, str1.PStr); end; end; NtOpenFile все время возвращает ошибку , либо DATATYPE_MISALIGNMENT либо INVALID_PARAMETER. В чем может быть проблема? Смотрел в kernel32.dll, ничего принциально различного до открытия директории не увидел.
Упс, описался - на 8; привычка - я выравниваю на 16. Многие структуры должны быть выравнены в памяти, к таким относится OBJECT_ATTRIBUTES, это всегда надо учитывать используя native api. Возможно ошибка из-за того, что перед вызовом твоей функции не выровнен стек. Вообще использовать в функциях параметры типов BYTE и WORD запрещено, также и размер локальных переменных должен быть выровнен. Код dec esp/invoke CreateFile(..) возвратит ошибку, хоть и параметры корректны.
выаравнивание обычно должно быть на грницу в sizeof(struct). для UNICODE_STRING это 8 байт. для UNICODE_STRING.Buffer это 2 байта, итд.