Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

Разница в атрибутах при уничтожении объекта.   Найти похожие ветки 

 
Riply ©   (2007-11-10 01:40) [0]

Здравствуйте !
Реализация функций DeleteFile и RemoveDirectory очень похожи.
В обоих случаях используется NtCreateFile.
Но кроме логичных отличий в параметрах, есть разница в "SHARE" параметре.
Для DeleteFile ShareAccess устанавливается
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
а для RemoveDirectory - ноль.
Поясните, пожалуйста, чем это обусловлено.


 
guav ©   (2007-11-11 13:57) [1]

> а для RemoveDirectory - ноль.

На основании чего был сделан такой вывод ?
Я считаю что успешное выполнение нижеследующего кода опровергает этот вывод.
program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils, Windows;

function OemSysErrorMessage(Error: Integer): string;
var S: string;
begin
 S := SysErrorMessage(Error);
 SetLength(Result, Length(S));
 AnsiToOem(PChar(S), PChar(Result));
end;

var   hFile, hFile1: THandle;
const sTestDir = "D:\test1";

begin
 // Create an empty folder.
 if not CreateDirectory(sTestDir, nil) then
 begin
   WriteLn("Unable to create test dir, error ", GetLastError());
   WriteLn(OemSysErrorMessage(GetLastError()));
   ReadLn;
   Exit;
 end;
 // Open the folder with read and write access.
 hFile := CreateFile(
   sTestDir,
   GENERIC_READ or GENERIC_WRITE,
   FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
   nil,
   OPEN_ALWAYS,
   FILE_FLAG_BACKUP_SEMANTICS,
   0);
 if INVALID_HANDLE_VALUE = hFile then
 begin
   WriteLn("Cannot open directory, error ", GetLastError());
   WriteLn(OemSysErrorMessage(GetLastError()));
   ReadLn;
   Exit;
 end;
 // Open the folder again with exclusive share mode.
 // As it is already open with read and write access,
 // this should fail.
 hFile1 := CreateFile(
   sTestDir,
   GENERIC_READ,
   0,
   nil,
   OPEN_ALWAYS,
   FILE_FLAG_BACKUP_SEMANTICS,
   0);
 if INVALID_HANDLE_VALUE = hFile1 then
 begin
   WriteLn("Cannot open directory, error ", GetLastError());
   WriteLn(OemSysErrorMessage(GetLastError()));
 end;
 try
   // Mark the folder for deletion.
   // As this succeedes, at least FILE_SHARE_READ and FILE_SHARE_WRITE
   // flags are specified inside the RemoveDirectory function.
   if not RemoveDirectory(sTestDir) then
   begin
     WriteLn("Cannot remove directory, error ", GetLastError());
     WriteLn(OemSysErrorMessage(GetLastError()));
     ReadLn;
     Exit;
   end;
   WriteLn("The directory still exists");
   WriteLn("Press any key...");
   ReadLn;

 finally
   CloseHandle(hFile);
 end;
 WriteLn("Now it does not");
 WriteLn("Press any key...");
 ReadLn;
end.


 
Riply ©   (2007-11-11 14:28) [2]

> [1] guav ©   (11.11.07 13:57)
> На основании чего был сделан такой вывод ?

На основании следующего исходника:

BOOL WINAPI RemoveDirectoryW  (  LPCWSTR    )
00520 {
00521         FILE_DISPOSITION_INFORMATION FileDispInfo;
00522         OBJECT_ATTRIBUTES ObjectAttributes;
00523         IO_STATUS_BLOCK IoStatusBlock;
00524         UNICODE_STRING NtPathU;
00525         HANDLE DirectoryHandle;
00526         NTSTATUS Status;
00527
00528         DPRINT("lpPathName %S\n", lpPathName);
00529
00530         if (!RtlDosPathNameToNtPathName_U (lpPathName,
00531                                            &NtPathU,
00532                                            NULL,
00533                                            NULL))
00534                 return FALSE;
00535
00536         InitializeObjectAttributes(&ObjectAttributes,
00537                                    &NtPathU,
00538                                    OBJ_CASE_INSENSITIVE,
00539                                    NULL,
00540                                    NULL);
00541
00542         DPRINT("NtPathU "%S"\n", NtPathU.Buffer);
00543
00544         Status = NtCreateFile (&DirectoryHandle,
00545                                DELETE,
00546                                &ObjectAttributes,
00547                                &IoStatusBlock,
00548                                NULL,
00549                                FILE_ATTRIBUTE_DIRECTORY, /* 0x7 */
00550                                0,
00551                                FILE_OPEN,
00552                                FILE_DIRECTORY_FILE,      /* 0x204021 */
00553                                NULL,
00554                                0);
00555
00556         RtlFreeHeap (RtlGetProcessHeap (),
00557                      0,
00558                      NtPathU.Buffer);
00559
00560         if (!NT_SUCCESS(Status))
00561         {
00562                 CHECKPOINT;
00563                 SetLastErrorByStatus (Status);
00564                 return FALSE;
00565         }
00566
00567         FileDispInfo.DeleteFile = TRUE;
00568
00569         Status = NtSetInformationFile (DirectoryHandle,
00570                                        &IoStatusBlock,
00571                                        &FileDispInfo,
00572                                        sizeof(FILE_DISPOSITION_INFORMATION),
00573                                        FileDispositionInformation);
00574         NtClose(DirectoryHandle);
00575
00576         if (!NT_SUCCESS(Status))
00577         {
00578                 SetLastErrorByStatus (Status);
00579                 return FALSE;
00580         }
00581
00582         return TRUE;
00583 }


> Я считаю что успешное выполнение нижеследующего кода опровергает этот вывод.
Код то выполняется успешно.
А вот выводы надо обдумать. "Что-то здесь не так" (с)


 
guav ©   (2007-11-11 14:36) [3]

> [2] Riply ©   (11.11.07 14:28)

Это исходник Windows ?


 
Riply ©   (2007-11-11 14:44) [4]

> [3] guav ©   (11.11.07 14:36)

> Это исходник Windows ?

Я еще (пока) не заслужила, что бы Microsoft давала мне исходники
по первому моему требованию, поэтому вынуждена обходиться ReactOS` овскими :)


 
guav ©   (2007-11-11 14:53) [5]

> [4] Riply ©   (11.11.07 14:44)


Встречаются двое.
Один другому говорит:
- Не понимаю почему все так восхищаются этим Карузо? Слуха у него нет, голоса нет, картавит, шепелявит, пришептывает.
- Ооо! А вы слышали Карузо?
- Да нет. Мне Рабинович его вчера напел.


Я считаю, что без подтверждения того что в настоящей Windows поведение аналогично не стоит искать глубокий смысл в сабже.

Если эту самую ReactOS можно запустить, можно проверить мой код там.

Ты наверное на таком же основании считаешь, что исходники драйвера NTFS у MS и линуксоидов одинаковые ? :-)


 
Zeqfreed ©   (2007-11-11 15:00) [6]

Если выложите скомпилированный экзешник на файлопомойку какую-нибудь, то могу в виртуальной машине запустить его в ReactOS :)


 
Riply ©   (2007-11-11 15:05) [7]

> [5] guav ©   (11.11.07 14:53)

:)

> Ты наверное на таком же основании считаешь,
> что исходники драйвера NTFS у MS и линуксоидов одинаковые ? :-)

Нет. Не считаю. :)
Но что они должны совпадать в ключевых идеологических моментах - мне кажется логичным.
А то как открывать на удаление - это важно. :)


 
guav ©   (2007-11-11 15:08) [8]


> [6] Zeqfreed ©   (11.11.07 15:00)

Это хорошо. Предоставляю это Riply ©, может она захочет изменить код.

<off>

> [4] Riply ©   (11.11.07 14:44)

Есть прогресс со сложными случаями в MFT ?
</off>


 
Riply ©   (2007-11-11 15:15) [9]

> [8] guav ©   (11.11.07 15:08)

> Это хорошо. Предоставляю это Riply ©, может она захочет изменить код.

Наверное менять не буду. Куда лучше выложить ?

<off>
> [4] Riply ©   (11.11.07 14:44)
> Есть прогресс со сложными случаями в MFT ?
Продвигается, но медленно.
Трудно добиться стабильности возникновения "нестандартного случая",
что бы заявить: "после таких-то и таких-то действий, имеем то-то и то-то" :)

</off>


 
Zeqfreed ©   (2007-11-11 15:17) [10]

> Riply ©   (11.11.07 15:15) [9]

Да хоть куда :) filesurf.ru, например.
Можно и на почту послать. zeqfreed@gmail.com


 
guav ©   (2007-11-11 15:20) [11]

> Но что они должны совпадать в ключевых идеологических моментах
> - мне кажется логичным.

В подобных "идеологических" мометах исходники Майкрософт не всегда совпадают с мнением, изложенным в MSDN.
Что уж говорить об исходниках, не от Майкрософт.

Попробуй "поотлаживать" саму ntdll, если сабж действительно интересует.


> Трудно добиться стабильности возникновения "нестандартного
> случая",
> что бы заявить: "после таких-то и таких-то действий, имеем
> то-то и то-то" :)

Тогда образ на почту, Windows поддерживает NTFS с 8 МБ, а если форматировать нестандартными утилитами, то ещё меньше. Детали обсудить можно тоже по почте. Кстати, если дело касаестя разреженных или сжатых, опиши заранее, бо может это я уже видел.


 
Riply ©   (2007-11-11 15:20) [12]

>  [10] Zeqfreed ©   (11.11.07 15:17)

http://slil.ru/25087818


 
Riply ©   (2007-11-11 15:27) [13]

> [11] guav ©   (11.11.07 15:20)

>Попробуй "поотлаживать" саму ntdll, если сабж действительно интересует.

САБЖ интересует, ибо прежде чем самой соваться в MFT, как "слону в посудную лавку",
иногда бывает не вредно посмотреть, как это делают другие :)

> Тогда образ на почту, Windows поддерживает NTFS с 8 МБ,
> а если форматировать нестандартными утилитами, то ещё меньше.
Хорошо. Подготавливаю и высылаю.


 
Zeqfreed ©   (2007-11-11 15:45) [14]

Что-то не получается у меня :(
Буду еще пытаться. Если получится сообщу :)


 
guav ©   (2007-11-11 15:46) [15]

Там хоть в бинарнике hardcoded "D:\test1" именено на ReadLn ?


 
Riply ©   (2007-11-11 15:47) [16]

>  [15] guav ©   (11.11.07 15:46)
> "С:\test1"


 
guav ©   (2007-11-11 15:50) [17]

> [14] Zeqfreed ©   (11.11.07 15:45)

До запуска дошло ? Если да, то что выдаёт ?


 
Zeqfreed ©   (2007-11-11 16:06) [18]

Фуф. Получилось наконец закинуть файл на виртуальную машину :)

После запуска выдает:

Cannot open directory, error 32
ERROR SHARING VIOLATION - The process cannot access the file because it is being used by another process
Cannot remove directory, error 32
ERROR SHARING VIOLATION - The process cannot access the file because it is being used by another process


 
guav ©   (2007-11-11 16:25) [19]

> [18] Zeqfreed ©   (11.11.07 16:06)

Спасибо.
3начит сабж есть специфика ReactOS и не имеет отношения к поведению Windows XP.


 
Zeqfreed ©   (2007-11-11 18:45) [20]

> guav ©   (11.11.07 16:25) [19]

Да, видимо так. Можно даже, наверное, сообщить об этом команде разработчиков — возможно, это не было их сознательным решением.


 
Riply ©   (2007-11-11 21:33) [21]

> [19] guav ©   (11.11.07 16:25)
> 3начит сабж есть специфика ReactOS и не имеет отношения к поведению Windows XP.

> [20] Zeqfreed ©   (11.11.07 18:45)
> Да, видимо так. Можно даже, наверное, сообщить об этом команде
> разработчиков — возможно, это не было их сознательным решением.

Ребят, спасибо огромное за помощь и
"сампожертванное написание и тестирование кода" :)

Я не успокоилась и чутка "поперехватывала"  Nt - ф-ии.
Со своей стороны добавлю, что под Windows RemoveDirectoryW
NtCreateFile вовсе и не вызывает :)
Она обходится NtOpenFile` ом, передавая ему в качестве ShareAccess
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE.
Так что прав был guav, заподозрив липу в сабжевом вопросе :)

P.S.
Очень полезная ветка.
Из нее я выяснила, что не стоит делать заключения о Карузо,
базируясь только на знании Рабиновича :)
А это ценное знание для программиста :)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.039 c
4-1179934533
BFG9k
2007-05-23 19:35
2007.12.09
Как определить, активна ли задача ?


15-1194602578
Z@ichik
2007-11-09 13:02
2007.12.09
Преобразование Аксельмана


2-1195097407
sidorov
2007-11-15 06:30
2007.12.09
Почему вы удаляете мои сообщения?


11-1180370896
Rusya
2007-05-28 20:48
2007.12.09
Help: Обработчик OnDrawCell


11-1179751681
Don
2007-05-21 16:48
2007.12.09
LikeSpeedButton





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский